             
             // prevent infinite loop
             guard lastEnd >= operation.start else {
-                operation.completion(.failure(Error.invalidResponse(response)))
-                return
+                throw Error.invalidResponse(response)
             }
             
             guard lastEnd < .max // End of database
-                else { operation.success(); return }
+                else { return }
             
             operation.start = lastEnd + 1
             

    private func discoverDescriptors(operation: DescriptorDiscoveryOperation) async throws {
        assert(operation.start <= operation.end, "Invalid range")
        let request = ATTFindInformationRequest(startHandle: operation.start, endHandle: operation.end)
        return try await withCheckedThrowingContinuation() { continuation in
            Task {
                do {
                    let response = try await send(request, response: ATTFindInformationResponse.self)
                    try await findInformationResponse(response, operation: operation)
                }
                catch {
                    assert(error as? ATTErrorResponse == nil)
                    continuation.resume(throwing: error)
                }
            }
        }
    }
    
    /// Read Characteristic Value

         */
        
        // read value and try to read blob if too big
        return try await readAttributeValue(descriptor.handle)
    }
    
    /**
