const DEFAULT_TIMEOUT = 6e4; function createBirpc(functions, options) { const { post, on, eventNames = [], serialize = (i) => i, deserialize = (i) => i, timeout = DEFAULT_TIMEOUT } = options; const rpcPromiseMap = /* @__PURE__ */ new Map(); const rpc = new Proxy({}, { get(_, method) { const sendEvent = (...args) => { post(serialize({ m: method, a: args, t: "q" })); }; if (eventNames.includes(method)) { sendEvent.asEvent = sendEvent; return sendEvent; } const sendCall = (...args) => { return new Promise((resolve, reject) => { const id = nanoid(); rpcPromiseMap.set(id, { resolve, reject }); post(serialize({ m: method, a: args, i: id, t: "q" })); if (timeout >= 0) { setTimeout(() => { reject(new Error(`[birpc] timeout on calling "${method}"`)); rpcPromiseMap.delete(id); }, timeout); } }); }; sendCall.asEvent = sendEvent; return sendCall; } }); on(async (data, ...extra) => { const msg = deserialize(data); if (msg.t === "q") { const { m: method, a: args } = msg; let result, error; try { result = await functions[method].apply(rpc, args); } catch (e) { error = e; } if (msg.i) post(serialize({ t: "s", i: msg.i, r: result, e: error }), ...extra); } else { const { i: ack, r: result, e: error } = msg; const promise = rpcPromiseMap.get(ack); if (error) promise?.reject(error); else promise?.resolve(result); rpcPromiseMap.delete(ack); } }); return rpc; } const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; function nanoid(size = 21) { let id = ""; let i = size; while (i--) id += urlAlphabet[Math.random() * 64 | 0]; return id; } export { createBirpc as c };