48 lines
1.3 KiB
Swift
48 lines
1.3 KiB
Swift
import Foundation
|
|
#if canImport(FoundationNetworking)
|
|
import FoundationNetworking
|
|
#endif
|
|
|
|
struct GatewayClient {
|
|
let gatewayURL: URL
|
|
let ws: URLSessionWebSocketTask
|
|
|
|
init(gatewayURL: URL) {
|
|
self.gatewayURL = gatewayURL
|
|
ws = URLSession.shared.webSocketTask(with: gatewayURL.appending(component: "?v=10&encoding=json"))
|
|
}
|
|
|
|
func openConnection() {
|
|
listen()
|
|
ws.resume()
|
|
RunLoop.current.run()
|
|
}
|
|
|
|
func listen() {
|
|
ws.receive { result in
|
|
defer { listen() }
|
|
do {
|
|
if case .failure(let err) = result { throw err }
|
|
guard case .success(let message) = result else { return }
|
|
guard case .string(let str) = message else { throw GatewayError.invalidMessage }
|
|
let json = JSONDecoder()
|
|
let gwMessage = try json.decode(GatewayMessage.self, from: Data(str.utf8))
|
|
switch gwMessage.d {
|
|
case .hello(let hello):
|
|
dump(hello)
|
|
case .none:
|
|
return
|
|
}
|
|
} catch {
|
|
print(error)
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public enum GatewayError: Error {
|
|
case invalidMessage
|
|
case invalidOpcode
|
|
}
|