      
      ![Image](https://github.com/PureSwift/Bluetooth/raw/master/Assets/DiscoverAllCharacteristicDescriptors.png)
      */
-    public func discoverDescriptors(for characteristic: Characteristic,
-                                    service: (declaration: Service, characteristics: [Characteristic]),
-                                    completion: @escaping (GATTClientResponse<[Descriptor]>) -> ()) {
+    public func discoverDescriptors(
+        for characteristic: Characteristic,
+        service: (declaration: Service, characteristics: [Characteristic])
+    ) async throws -> [Descriptor] {
         
         /**
          The Attribute Protocol Find Information Request shall be used with the Starting Handle set
          to the handle of the specified characteristic value + 1 and the Ending Handle set to the
          ending handle of the specified characteristic.
          */
-        
         let start = characteristic.handle.value + 1
-        
         let end = endHandle(for: characteristic, service: service)
-        
         let operation = DescriptorDiscoveryOperation(start: start, end: end, completion: completion)
-        
-        discoverDescriptors(operation: operation)
+        try await discoverDescriptors(operation: operation)
     }
     
     /// Read Characteristic Descriptor

                // The Attribute Protocol Read By Type Request is used to perform the sub-procedure.
                // The Attribute Type is set to the known characteristic UUID and the Starting Handle and Ending Handle parameters
                // shall be set to the range over which this read is to be performed. This is typically the handle range for the service in which the characteristic belongs.
                let request = ATTReadByTypeRequest(
                    startHandle: handleRange.start,
                    endHandle: handleRange.end,
                    attributeType: uuid
                )
                let operation = ReadUsingUUIDOperation(uuid: uuid) { result in
                    continuation.resume(with: result)
                }
                let response = try await send(request, response: ATTReadByTypeResponse.self)
                readByTypeResponse(response, operation: operation)
            }
        }
    }

    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
