     
     public var database = GATTDatabase()
     
-    public var willRead: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data, _ offset: Int) -> ATTError?)?
-    
-    public var willWrite: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data, _ newValue: Data) -> ATTError?)?
-    
-    public var didWrite: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data) -> Void)?
+    internal let log: ((String) -> ())?
+    
+    internal let willRead: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data, _ offset: Int) -> ATTError?)?
+    
+    internal let willWrite: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data, _ newValue: Data) -> ATTError?)?
+    
+    internal let didWrite: ((_ uuid: BluetoothUUID, _ handle: UInt16, _ value: Data) -> Void)?
     
     // Don't modify
     internal let connection: ATTConnection
     
-    private var preparedWrites = [PreparedWrite]()
+    internal private(set) var preparedWrites = [PreparedWrite]()
     
     // MARK: - Initialization
     

        socket: L2CAPSocket,
        maximumTransmissionUnit: ATTMaximumTransmissionUnit = .default,
        maximumPreparedWrites: Int = 50,
        log: ((String) -> ())? = nil
    ) async {
        // set initial MTU and register handlers
        self.maximumPreparedWrites = maximumPreparedWrites
        self.preferredMaximumTransmissionUnit = maximumTransmissionUnit
        self.connection = await ATTConnection(socket: socket, log: log)
        // async register handlers
        await self.registerATTHandlers()
    }

public actor GATTServer {
    
    // MARK: - Properties
        
    public var maximumTransmissionUnit: ATTMaximumTransmissionUnit {
        get async {
            return await self.connection.maximumTransmissionUnit
