@firtoz/socka
Version:
Standard Schema–first WebSocket RPC for TypeScript — Bun, Hono, Node ws, Cloudflare Workers, Durable Objects
144 lines (142 loc) • 4.05 kB
JavaScript
import { dispatchSockaInboundMessage } from '../chunk-JR2GENNT.js';
import { SockaWebSocketSession, runSockaSessionOnAttached } from '../chunk-TTXY7O5P.js';
import { reportSockaError } from '../chunk-IFIGKR3W.js';
// src/bun/index.ts
function sockaBunInitFromWsData(ws) {
const d = ws.data;
if (d && "request" in d && d.request instanceof Request) {
return { request: d.request };
}
return void 0;
}
function sockaBunUpgrade(server, req, data) {
const extra = data ?? {};
return server.upgrade(req, { data: { ...extra, request: req } });
}
function bunHandlersFromResolveScope(resolveScope) {
const websocket = {
open(ws) {
const { sessionMap, config } = resolveScope(ws);
const domWs = ws;
const init = sockaBunInitFromWsData(ws);
const session = new SockaWebSocketSession(
domWs,
sessionMap,
config,
init
);
sessionMap.set(domWs, session);
runSockaSessionOnAttached(config, session);
},
async message(ws, message) {
const { sessionMap, config } = resolveScope(ws);
const domWs = ws;
const session = sessionMap.get(domWs);
if (!session) return;
const wireFormat = config.wireFormat ?? "json";
try {
await dispatchSockaInboundMessage(
session,
wireFormat,
message
);
} catch (error) {
reportSockaError(config.reportError, {
kind: "serverInboundMessage",
adapter: "bun",
error
});
}
},
async close(ws) {
const { sessionMap, config } = resolveScope(ws);
const domWs = ws;
const session = sessionMap.get(domWs);
try {
if (session) {
await session.invokeHandleClose();
}
} catch (error) {
reportSockaError(config.reportError, {
kind: "serverHandleClose",
error
});
} finally {
sessionMap.delete(domWs);
}
}
};
return {
sessionMap: /* @__PURE__ */ new Map(),
websocket,
wireFormat: "json"
};
}
function bunHandlersFromConfig(config, maybeOptions) {
const sessionMap = maybeOptions?.sessionMap ?? /* @__PURE__ */ new Map();
const wireFormat = config.wireFormat ?? "json";
const websocket = {
open(ws) {
const domWs = ws;
const init = sockaBunInitFromWsData(ws);
const session = new SockaWebSocketSession(
domWs,
sessionMap,
config,
init
);
sessionMap.set(domWs, session);
runSockaSessionOnAttached(config, session);
},
async message(ws, message) {
const domWs = ws;
const session = sessionMap.get(domWs);
if (!session) return;
try {
await dispatchSockaInboundMessage(
session,
wireFormat,
message
);
} catch (error) {
reportSockaError(config.reportError, {
kind: "serverInboundMessage",
adapter: "bun",
error
});
}
},
async close(ws) {
const domWs = ws;
const session = sessionMap.get(domWs);
try {
if (session) {
await session.invokeHandleClose();
}
} catch (error) {
reportSockaError(config.reportError, {
kind: "serverHandleClose",
error
});
} finally {
sessionMap.delete(domWs);
}
}
};
return { sessionMap, websocket, wireFormat };
}
function createSockaBunWebSocketHandlers(configOrOptions, maybeOptions) {
const isResolveScope = typeof configOrOptions === "object" && configOrOptions !== null && "resolveScope" in configOrOptions && typeof configOrOptions.resolveScope === "function";
if (isResolveScope) {
return bunHandlersFromResolveScope(
configOrOptions.resolveScope
);
}
return bunHandlersFromConfig(
configOrOptions,
maybeOptions
);
}
export { createSockaBunWebSocketHandlers, sockaBunInitFromWsData, sockaBunUpgrade };
//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map