// src/adapter/cloudflare-workers/websocket.ts var upgradeWebSocket = (createEvents) => async (c, next) => { const CFWebSocketPair = globalThis.WebSocketPair; const events = await createEvents(c); const upgradeHeader = c.req.header("Upgrade"); if (upgradeHeader !== "websocket") { return await next(); } const webSocketPair = new CFWebSocketPair(); const client = webSocketPair[0]; const server = webSocketPair[1]; const wsContext = { binaryType: "arraybuffer", close: (code, reason) => server.close(code, reason), get protocol() { return server.protocol; }, raw: server, get readyState() { return server.readyState; }, url: server.url ? new URL(server.url) : null, send: (source) => server.send(source) }; if (events.onOpen) { server.addEventListener( "open", (evt) => events.onOpen && events.onOpen(evt, wsContext) ); } if (events.onClose) { server.addEventListener( "close", (evt) => events.onClose && events.onClose(evt, wsContext) ); } if (events.onMessage) { server.addEventListener( "message", (evt) => events.onMessage && events.onMessage(evt, wsContext) ); } if (events.onError) { server.addEventListener( "error", (evt) => events.onError && events.onError(evt, wsContext) ); } server.accept(); return new Response(null, { status: 101, webSocket: client }); }; export { upgradeWebSocket };