WebSocket API
WebSocket Proxy, allows your Edge Application to act as a full WebSocket server or client and proxy bidirectional traffic to backend services. This unlocks real-time use cases such as chat, multiplayer games, telemetry dashboards, and AI inference streams—all served directly from the edge for sub-second latency.
Server and Client Modes
- Use the
upgradeWebSocket()
function to handle server-side WebSocket upgrade requests. - For client-side, outbound connections, use the standard
WebSocket(url)
API.
Broadcast Helpers
- Easily broadcast messages to all connected clients using built-in helpers, enabling efficient fan-out with minimal code.
Metrics and Logs
These events are visible in Real-Time Metrics and LogStream, helping you monitor connection and message activities.
websocket.connection.accepted
message.sent
message.received
Edge Firewall Support
- Edge Firewall rules can inspect WebSocket traffic before the upgrade process is finalized.
- Ensure your firewall policies are configured to handle WebSocket connections as needed.
Example
export default { async fetch(request, env, ctx) { // Check if the request is a WebSocket upgrade if (request.headers.get("upgrade") === "websocket") { // Use the upgradeWebSocket function to handle the WebSocket upgrade const { response, socket } = upgradeWebSocket(request);
// Handle WebSocket events socket.addEventListener("open", () => { console.log("WebSocket connection established"); });
socket.addEventListener("message", (event) => { console.log(`Message received: ${event.data}`); socket.send("pong"); // Respond with "pong" });
socket.addEventListener("close", () => { console.log("WebSocket connection closed"); });
socket.addEventListener("error", (error) => { console.error("WebSocket error:", error); });
// Return the response to complete the WebSocket upgrade return response; }
// If the request is not a WebSocket upgrade, serve a simple HTML page const htmlContent = ` <!DOCTYPE html> <html> <head> <title>WebSocket Example</title> </head> <body> <h1>WebSocket Example</h1> <script> const socket = new WebSocket("wss://" + location.host); socket.onopen = () => console.log("WebSocket connected"); socket.onmessage = (event) => console.log("Message from server:", event.data); socket.onclose = () => console.log("WebSocket disconnected"); socket.onerror = (error) => console.error("WebSocket error:", error); </script> </body> </html> `;
return new Response(htmlContent, { status: 200, headers: { "Content-Type": "text/html" }, }); },};