51 lines
1.5 KiB
JavaScript
51 lines
1.5 KiB
JavaScript
import { createBirpc, createBirpcGroup } from "birpc";
|
|
//#region src/index.ts
|
|
const channelCache = /* @__PURE__ */ new WeakMap();
|
|
function createRPCServer(name, ws, functions, options = {}) {
|
|
const event = `${name}:rpc`;
|
|
const group = createBirpcGroup(functions, () => Array.from(ws?.clients || []).map((channel) => {
|
|
if (channel.socket.readyState === channel.socket.CLOSED) return void 0;
|
|
const cached = channelCache.get(channel);
|
|
if (cached) return cached;
|
|
const options = {
|
|
on: (fn) => {
|
|
function handler(data, source) {
|
|
if (!source.socket) throw new Error("source.socket is undefined");
|
|
if (channel.socket === source.socket) fn(data, source);
|
|
}
|
|
ws.on(event, handler);
|
|
channel.socket.on("close", () => {
|
|
ws.off(event, handler);
|
|
});
|
|
},
|
|
post: (data) => {
|
|
channel.send(event, data);
|
|
}
|
|
};
|
|
channelCache.set(channel, options);
|
|
return options;
|
|
}).filter((c) => !!c), options);
|
|
ws.on("connection", () => {
|
|
group.updateChannels();
|
|
});
|
|
return group.broadcast;
|
|
}
|
|
function createRPCClient(name, hot, functions = {}, options = {}) {
|
|
const event = `${name}:rpc`;
|
|
const promise = Promise.resolve(hot).then((r) => {
|
|
if (!r) console.warn("[vite-hot-client] Received undefined hot context, RPC calls are ignored");
|
|
return r;
|
|
});
|
|
return createBirpc(functions, {
|
|
...options,
|
|
on: async (fn) => {
|
|
(await promise)?.on(event, fn);
|
|
},
|
|
post: async (data) => {
|
|
(await promise)?.send(event, data);
|
|
}
|
|
});
|
|
}
|
|
//#endregion
|
|
export { createRPCClient, createRPCServer };
|