             let attribute = database[handle: handle]
             
             // validate application errors with read callback
-            if let error = willRead?(attribute.uuid, handle, attribute.value, 0) {
+            if let error = await willRead?(attribute.uuid, handle, attribute.value, 0) {
                 await errorResponse(opcode, error, handle)
                 return
             }

        } else {
            
            // writes from central should not notify clients (at least not this connected central)
            didWrite?(attribute.uuid, attribute.handle, attribute.value)
        }
    }
    

        maximumTransmissionUnit: ATTMaximumTransmissionUnit = .default,
        maximumPreparedWrites: Int = 50,
        log: ((String) -> ())? = nil,
        willRead: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data, _ offset: Int) async -> ATTError?)? = nil,
        willWrite: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data, _ newValue: Data) async -> ATTError?)? = nil,
        didWrite: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data) async -> Void)? = nil
    ) async {
        // set initial MTU and register handlers
        self.maximumPreparedWrites = maximumPreparedWrites
