     public func notify(
         for characteristic: Characteristic<Peripheral, AttributeID>
     ) -> AsyncThrowingStream<Data, Error> {
+        self.log("Peripheral \(characteristic.peripheral) will enable notifications for characteristic \(characteristic.uuid)")
         return AsyncThrowingStream(Data.self, bufferingPolicy: .bufferingNewest(100)) { [weak self] continuation in
             guard let self = self else { return }
             self.async {

        let semaphore = self.semaphore(for: service.peripheral)
        await semaphore.wait()
        defer { semaphore.signal() }
        let characteristicUUIDs = characteristics.isEmpty ? nil : characteristics.map { CBUUID($0) }
        return try await withCheckedThrowingContinuation { [weak self] continuation in
            guard let self = self else { return }

        let semaphore = self.semaphore(for: peripheral)
        await semaphore.wait()
        defer { semaphore.signal() }
        self.log("Will connect to \(peripheral)")
        try await withCheckedThrowingContinuation { [weak self] (continuation: CheckedContinuation<(), Error>) in
            guard let self = self else { return }
            self.async {
