@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
JavaScript
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