     /// Write attribute request.
     private func writeAttributeValue(
         _ attribute: UInt16,
-        data: Data,
-        completion: @escaping (GATTClientResponse<()>) -> ()
+        data: Data
     ) async throws {
         let length = await Int(maximumTransmissionUnit.rawValue) - 3
         let data = Data(data.prefix(length))
         let request = ATTWriteRequest(handle: attribute, value: data)
         let response = try await send(request, response: ATTWriteResponse.self)
-        writeResponse(response, completion: completion)
+        writeResponse(response)
     }
     
     private func writeLongAttributeValue(
         _ attribute: UInt16,
         data: Data,
-        reliableWrites: Bool = false,
-        completion: @escaping (GATTClientResponse<()>) -> ()
+        reliableWrites: Bool = false
     ) async throws {
         
         // The Attribute Protocol Prepare Write Request and Execute Write Request are used to perform this sub-procedure.

    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

    /// the characteristic descriptor declaration’s Attribute handle.
    ///
    /// ![Image](https://github.com/PureSwift/Bluetooth/raw/master/Assets/ReadCharacteristicValue.png)
    public func readDescriptor(_ descriptor: Descriptor) async throws -> Data {
        
        /**
         The Attribute Protocol Read Request is used for this sub-procedure. The Read Request is used with the Attribute Handle parameter set to the characteristic descriptor handle. The Read Response returns the characteristic descriptor value in the Attribute Value parameter.
