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 }