PrismNetwork includes a WebSocket client built on Apple’s Network.framework (NWConnection). Define type-safe socket endpoints, connect with an async stream, and send structured commands.
Implement PrismNetworkSocketEndpoint to describe where to connect:
ChatSocketEndpoint.swift
import PrismNetworkimport Networkenum ChatSocketEndpoint: PrismNetworkSocketEndpoint { case production case staging var host: NWEndpoint.Host { switch self { case .production: return "ws.chat.example.com" case .staging: return "ws-staging.chat.example.com" } } var port: NWEndpoint.Port { get throws { switch self { case .production: return .https // 443 case .staging: return 8443 } } } var parameters: NWParameters { let tlsOptions = NWProtocolTLS.Options() let wsOptions = NWProtocolWebSocket.Options() let params = NWParameters(tls: tlsOptions) params.defaultProtocolStack.applicationProtocols.insert(wsOptions, at: 0) return params }}
Use NWParameters to configure TLS, WebSocket protocol options, and connection timeouts. For unencrypted connections, use NWParameters.tcp with WebSocket options.
Define typed commands by conforming to PrismNetworkSocketCommand:
Chat Commands
import PrismNetworkenum ChatCommand: PrismNetworkSocketCommand { case join(room: String, user: String) case message(room: String, text: String) case leave(room: String) case typing(room: String, isTyping: Bool) var message: String { switch self { case .join(let room, let user): return #"{"type":"join","room":"\#(room)","user":"\#(user)"}"# case .message(let room, let text): return #"{"type":"message","room":"\#(room)","text":"\#(text)"}"# case .leave(let room): return #"{"type":"leave","room":"\#(room)"}"# case .typing(let room, let isTyping): return #"{"type":"typing","room":"\#(room)","isTyping":\#(isTyping)}"# } }}
Send commands over the connection:
Sending Messages
// Join a roomtry await socket.send(command: ChatCommand.join(room: "general", user: "alice"))// Send a messagetry await socket.send(command: ChatCommand.message(room: "general", text: "Hello!"))// Signal typingtry await socket.send(command: ChatCommand.typing(room: "general", isTyping: true))
send(command:) throws PrismNetworkError.noConnectivity if no active connection exists. Always connect before sending commands.