diff --git a/ios/Sources/SocketsPlugin/Socket.swift b/ios/Sources/SocketsPlugin/Socket.swift index 9ecbf03..5bc0e6a 100644 --- a/ios/Sources/SocketsPlugin/Socket.swift +++ b/ios/Sources/SocketsPlugin/Socket.swift @@ -14,6 +14,8 @@ public class Socket: NSObject { weak var delegate: SocketDelegate? + var dataBuffer = Data() + public init(id: String) { self.id = id } @@ -35,7 +37,7 @@ public class Socket: NSObject { let connection = NWConnection(host: NWEndpoint.Host(host), port: NWEndpoint.Port(String(port))!, using: parameters) connection.stateUpdateHandler = self.stateDidChange(to:) self.receive(on: connection) - connection.start(queue: .main) + connection.start(queue: DispatchQueue(label: "Igloo")) self.connection = connection } @@ -46,53 +48,64 @@ public class Socket: NSObject { } public func disconnect() { - connection?.forceCancel() + connection?.cancel() } func stateDidChange(to state: NWConnection.State) { switch state { case .setup: print("connection setup") - break case .waiting(let error): print("connection waiting: \(error)") - break case .preparing: self.delegate?.didChangeState(socket: self.id, state: .connecting) - break case .ready: self.delegate?.didChangeState(socket: self.id, state: .connected) - break case .failed(let error): print("connection failed: \(error)") - break + self.delegate?.didChangeState(socket: self.id, state: .disconnected) + self.disconnect() case .cancelled: self.delegate?.didChangeState(socket: self.id, state: .disconnected) - break default: print("other") - break } } func receive(on connection: NWConnection) { connection.receive(minimumIncompleteLength: 1, maximumLength: 65536) { (data, contentContext, isComplete, error) in - if let data = data, !data.isEmpty { - if let message = String(data: data, encoding: .utf8) { - self.delegate?.didReceiveMessage(socket: self.id, message: message) - } + if let error = error { + print("Receive error: \(error)") + self.delegate?.didChangeState(socket: self.id, state: .disconnected) + return } - if (connection.state == .ready) { + if let data = data, !data.isEmpty { + self.dataBuffer.append(data) // Append the data to the buffer + + // Process buffer if enough data is available (protocol-specific logic) + if let message = String(data: self.dataBuffer, encoding: .utf8) { + self.delegate?.didReceiveMessage(socket: self.id, message: message) + self.dataBuffer.removeAll() // Clear buffer after processing + } + } + + if connection.state == .ready { self.receive(on: connection) } + + if isComplete { + print("Connection completed.") + self.delegate?.didChangeState(socket: self.id, state: .disconnected) + } } } + }