@firtoz/socka
Version:
Standard Schema–first WebSocket RPC for TypeScript — Bun, Hono, Node ws, Cloudflare Workers, Durable Objects
69 lines (67 loc) • 2.42 kB
JavaScript
import { sockaHonoStrictInitFromContext } from '../chunk-QGURL3DJ.js';
import { dispatchSockaInboundMessage } from '../chunk-JR2GENNT.js';
import { SockaWebSocketSession, runSockaSessionOnAttached } from '../chunk-TTXY7O5P.js';
import { reportSockaError } from '../chunk-IFIGKR3W.js';
// src/hono/cloudflare-workers.ts
function sockaHonoCloudflare(config, options) {
const staticSessions = options?.sessions ?? /* @__PURE__ */ new Map();
const staticConfig = config;
const resolveScope = options?.resolveScope;
return (c) => ({
onMessage(evt, wsCtx) {
const raw = wsCtx.raw;
if (!raw) return;
const domWs = raw;
const { sessions, config: scopeConfig } = resolveScope ? resolveScope(c) : { sessions: staticSessions, config: staticConfig };
let session = sessions.get(domWs);
const cfg = scopeConfig;
if (!session) {
const init = options?.sockaInit?.(c) ?? sockaHonoStrictInitFromContext(c);
session = new SockaWebSocketSession(domWs, sessions, cfg, init);
sessions.set(domWs, session);
runSockaSessionOnAttached(cfg, session);
}
const wireFormat = cfg.wireFormat ?? "json";
void dispatchSockaInboundMessage(session, wireFormat, evt.data).catch(
(error) => {
reportSockaError(cfg.reportError, {
kind: "serverInboundMessage",
adapter: "hono",
error
});
}
);
},
onClose(_evt, wsCtx) {
const raw = wsCtx.raw;
if (!raw) return;
const domWs = raw;
void (async () => {
const { sessions, config: scopeConfig } = resolveScope ? resolveScope(c) : { sessions: staticSessions, config: staticConfig };
const cfg = scopeConfig;
const session = sessions.get(domWs);
try {
if (session) {
await session.invokeHandleClose();
}
} catch (error) {
reportSockaError(cfg.reportError, {
kind: "serverHandleClose",
error
});
} finally {
sessions.delete(domWs);
}
})().catch((error) => {
reportSockaError(staticConfig.reportError, {
kind: "serverShutdown",
adapter: "hono",
error
});
});
}
});
}
export { sockaHonoCloudflare };
//# sourceMappingURL=cloudflare-workers.js.map
//# sourceMappingURL=cloudflare-workers.js.map