From 3f4e2c33a4c2719388d9378def981688fcaed210 Mon Sep 17 00:00:00 2001 From: Dustin Mierau Date: Sat, 13 Jan 2024 19:12:12 -0800 Subject: Rewrite HotlineClient to use new simpler NetSocket stream based socket lib. Seems to be working well and has fixed some connection issues with certain servers. This does away with Apple's NWConnection for everything but file transfers which I still want to be processing on another thread so will keep NWConnection for now. --- Hotline/Shared/NetSocket.swift | 58 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 8 deletions(-) (limited to 'Hotline/Shared/NetSocket.swift') diff --git a/Hotline/Shared/NetSocket.swift b/Hotline/Shared/NetSocket.swift index e474f5a..5b33f61 100644 --- a/Hotline/Shared/NetSocket.swift +++ b/Hotline/Shared/NetSocket.swift @@ -41,6 +41,10 @@ final class NetSocket: NSObject, StreamDelegate { private var status: NetSocketStatus = .disconnected + @MainActor public func has(_ length: Int) -> Bool { + return (self.available >= length) + } + override init() {} @MainActor public func connect(host: String, port: Int) { @@ -59,14 +63,16 @@ final class NetSocket: NSObject, StreamDelegate { inputStream?.delegate = self outputStream?.delegate = self - inputStream?.schedule(in: .current, forMode: .common) - outputStream?.schedule(in: .current, forMode: .common) + inputStream?.schedule(in: .current, forMode: .default) + outputStream?.schedule(in: .current, forMode: .default) inputStream?.open() outputStream?.open() } @MainActor public func close(_ err: Error? = nil) { + print("NetSocket: Closed") + let disconnected = (self.status != .disconnected) self.status = .disconnected @@ -75,8 +81,8 @@ final class NetSocket: NSObject, StreamDelegate { self.output?.delegate = nil self.input?.close() self.output?.close() - self.input?.remove(from: .current, forMode: .common) - self.output?.remove(from: .current, forMode: .common) + self.input?.remove(from: .current, forMode: .default) + self.output?.remove(from: .current, forMode: .default) self.input = nil self.output = nil self.inputBuffer = [] @@ -85,8 +91,6 @@ final class NetSocket: NSObject, StreamDelegate { if disconnected { self.delegate?.netsocketDisconnected(socket: self, error: err) } - - print("NetSocket: Closed") } @MainActor public func write(_ data: Data) { @@ -166,6 +170,7 @@ final class NetSocket: NSObject, StreamDelegate { } let bytesWritten = output.write(self.outputBuffer, maxLength: self.outputBuffer.count) + print("NetSocket => \(bytesWritten) bytes") if bytesWritten > 0 { self.outputBuffer.removeFirst(bytesWritten) self.delegate?.netsocketSent(socket: self, count: bytesWritten) @@ -180,9 +185,10 @@ final class NetSocket: NSObject, StreamDelegate { return } - let bytesRead = input.read(&self.readBuffer, maxLength: self.readBuffer.capacity) + let bytesRead = input.read(&self.readBuffer, maxLength: 4 * 1024) + print("NetSocket <= \(bytesRead) bytes") if bytesRead > 0 { - self.inputBuffer.append(contentsOf: readBuffer[0..