64 lines
1.8 KiB
Swift
64 lines
1.8 KiB
Swift
import Foundation
|
|
import Network
|
|
import Libbox
|
|
|
|
public class NWSocket {
|
|
private let connection: NWConnection
|
|
|
|
public init(_ connection: NWConnection) {
|
|
self.connection = connection
|
|
}
|
|
|
|
public func read() throws -> Data {
|
|
let semaphore = DispatchSemaphore(value: 0)
|
|
var result: Result<Data, Error>!
|
|
connection.receive(minimumIncompleteLength: 2, maximumLength: 2) { content, _, _, error in
|
|
if let error {
|
|
result = .failure(error)
|
|
} else {
|
|
result = .success(content!)
|
|
}
|
|
semaphore.signal()
|
|
}
|
|
semaphore.wait()
|
|
let lengthChunk = try result.get()
|
|
let length = Int(LibboxDecodeLengthChunk(lengthChunk))
|
|
connection.receive(minimumIncompleteLength: length, maximumLength: length) { content, _, _, error in
|
|
if let error {
|
|
result = .failure(error)
|
|
} else {
|
|
result = .success(content!)
|
|
}
|
|
semaphore.signal()
|
|
}
|
|
semaphore.wait()
|
|
return try result.get()
|
|
}
|
|
|
|
public func write(_ data: Data?) throws {
|
|
guard let data else {
|
|
return
|
|
}
|
|
let semaphore = DispatchSemaphore(value: 0)
|
|
var result: Error?
|
|
connection.send(content: LibboxEncodeChunkedMessage(data), isComplete: false, completion: .contentProcessed { error in
|
|
result = error
|
|
semaphore.wait()
|
|
})
|
|
if let result {
|
|
throw result
|
|
}
|
|
}
|
|
|
|
public func send(_ data: Data?) {
|
|
guard let data else {
|
|
return
|
|
}
|
|
connection.send(content: LibboxEncodeChunkedMessage(data), completion: .idempotent)
|
|
}
|
|
|
|
public func cancel() {
|
|
connection.cancel()
|
|
}
|
|
}
|