UNPKG

@firtoz/socka

Version:

Standard Schema–first WebSocket RPC for TypeScript — Bun, Hono, Node ws, Cloudflare Workers, Durable Objects

83 lines (80 loc) • 2.55 kB
import { dispatchSockaInboundMessage } from '../chunk-JR2GENNT.js'; export { dispatchSockaInboundMessage } from '../chunk-JR2GENNT.js'; import { SockaWebSocketSession, runSockaSessionOnAttached } from '../chunk-TTXY7O5P.js'; export { SockaWebSocketSession, broadcastContractPushToAll, broadcastSockaEventToAll, broadcastSockaEventToPeers, runSockaSessionOnAttached } from '../chunk-TTXY7O5P.js'; import { reportSockaError } from '../chunk-IFIGKR3W.js'; // src/server/attachSockaWebSocket.ts function attachSockaWebSocket(websocket, sessions, config, init) { const session = new SockaWebSocketSession(websocket, sessions, config, init); sessions.set(websocket, session); runSockaSessionOnAttached(config, session); let shuttingDown = false; const finalize = () => { websocket.removeEventListener("message", onMessage); websocket.removeEventListener("close", onClose); sessions.delete(websocket); }; const shutdown = () => { if (shuttingDown) return; shuttingDown = true; void (async () => { try { await session.invokeHandleClose(); } catch (error) { reportSockaError(config.reportError, { kind: "serverHandleClose", error }); } finally { finalize(); } })().catch((error) => { reportSockaError(config.reportError, { kind: "serverShutdown", adapter: "attach", error }); finalize(); }); }; const onMessage = (ev) => { const wf = config.wireFormat ?? "json"; void dispatchSockaInboundMessage(session, wf, ev.data).catch( (error) => { reportSockaError(config.reportError, { kind: "serverInboundMessage", adapter: "attach", error }); } ); }; const onClose = () => { shutdown(); }; websocket.addEventListener("message", onMessage); websocket.addEventListener("close", onClose); return { session, dispose: shutdown }; } // src/server/room-registry.ts function createSockaRoomRegistry(makeConfig) { const rooms = /* @__PURE__ */ new Map(); return { get(roomId) { let r = rooms.get(roomId); if (!r) { const sessionMap = /* @__PURE__ */ new Map(); const config = makeConfig(roomId, sessionMap); r = { sessionMap, config }; rooms.set(roomId, r); } return r; }, get rooms() { return rooms; } }; } export { attachSockaWebSocket, createSockaRoomRegistry }; //# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map