Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 15 additions & 14 deletions Sources/ActorCoreBluetooth/BluetoothCentral.swift
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ public final class BluetoothCentral {
public func retrieveConnectedPeripherals(
withServices services: [String],
timeout: TimeInterval? = nil,
filter: ((DiscoveredPeripheral) -> Bool)? = nil
filter: ((_ id: UUID, _ name: String?) -> Bool)? = nil
) async throws -> [ConnectedPeripheral] {
try await ensureCentralManagerInitialized()

Expand Down Expand Up @@ -471,23 +471,21 @@ public final class BluetoothCentral {
return []
}

var connectedPeripherals: [ConnectedPeripheral] = []
// Apply filter if provided: true means include, false means skip
let filteredPeripherals = filter.map { predicate in
cbPeripherals.filter { predicate($0.identifier, $0.name) }
} ?? cbPeripherals

for cbPeripheral in cbPeripherals {
if filter != nil && filter!(DiscoveredPeripheral(cbPeripheral: cbPeripheral, advertisementData: [:], rssi: 0)) == false {
logger?.centralDebug("Skipping retrieved peripheral not matching filter", context: [
"peripheralName": cbPeripheral.name ?? "Unknown",
"peripheralID": cbPeripheral.identifier.uuidString
])
continue
}
var connectedRetrievedPeripherals: [ConnectedPeripheral] = []

for cbPeripheral in filteredPeripherals {
do {
let connected = try await connectToRetrievedPeripheral(
cbPeripheral,
originalName: cbPeripheral.name,
timeout: timeout
)
connectedPeripherals.append(connected)
connectedRetrievedPeripherals.append(connected)
} catch {
logger?.connectionWarning("Failed to connect to system-connected peripheral", context: [
"peripheralName": cbPeripheral.name ?? "Unknown",
Expand All @@ -500,10 +498,10 @@ public final class BluetoothCentral {

logger?.centralNotice("Retrieved connected peripherals", context: [
"requested": cbPeripherals.count,
"successful": connectedPeripherals.count
"successful": connectedRetrievedPeripherals.count
])

return connectedPeripherals
return connectedRetrievedPeripherals
}

/// Get list of currently connected peripheral IDs
Expand Down Expand Up @@ -539,7 +537,10 @@ public final class BluetoothCentral {
])

// Apply filter if provided, otherwise use first device
guard let targetDevice = filter != nil ? discovered.first(where: filter!) : discovered.first else {
// filter returning true means include, false means skip
let targetDevice = filter.flatMap { discovered.first(where: $0) } ?? discovered.first

guard let targetDevice else {
logger?.errorWarning("No suitable peripheral found after scan")
throw BluetoothError.peripheralNotFound
}
Expand Down