Files
client/node_modules/vite-dev-rpc/dist/index.mjs
T

51 lines
1.5 KiB
JavaScript
Raw Normal View History

2026-10-07 18:56:27 +02:00
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 };