diff --git a/Sources/ActorCoreBluetooth/BluetoothCentral.swift b/Sources/ActorCoreBluetooth/BluetoothCentral.swift index 134f413..12fd569 100644 --- a/Sources/ActorCoreBluetooth/BluetoothCentral.swift +++ b/Sources/ActorCoreBluetooth/BluetoothCentral.swift @@ -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() @@ -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", @@ -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 @@ -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 }