版博士V2.0程序
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

72 righe
1.9 KiB

  1. const DEFAULT_TIMEOUT = 6e4;
  2. function createBirpc(functions, options) {
  3. const {
  4. post,
  5. on,
  6. eventNames = [],
  7. serialize = (i) => i,
  8. deserialize = (i) => i,
  9. timeout = DEFAULT_TIMEOUT
  10. } = options;
  11. const rpcPromiseMap = /* @__PURE__ */ new Map();
  12. const rpc = new Proxy({}, {
  13. get(_, method) {
  14. const sendEvent = (...args) => {
  15. post(serialize({ m: method, a: args, t: "q" }));
  16. };
  17. if (eventNames.includes(method)) {
  18. sendEvent.asEvent = sendEvent;
  19. return sendEvent;
  20. }
  21. const sendCall = (...args) => {
  22. return new Promise((resolve, reject) => {
  23. const id = nanoid();
  24. rpcPromiseMap.set(id, { resolve, reject });
  25. post(serialize({ m: method, a: args, i: id, t: "q" }));
  26. if (timeout >= 0) {
  27. setTimeout(() => {
  28. reject(new Error(`[birpc] timeout on calling "${method}"`));
  29. rpcPromiseMap.delete(id);
  30. }, timeout);
  31. }
  32. });
  33. };
  34. sendCall.asEvent = sendEvent;
  35. return sendCall;
  36. }
  37. });
  38. on(async (data, ...extra) => {
  39. const msg = deserialize(data);
  40. if (msg.t === "q") {
  41. const { m: method, a: args } = msg;
  42. let result, error;
  43. try {
  44. result = await functions[method].apply(rpc, args);
  45. } catch (e) {
  46. error = e;
  47. }
  48. if (msg.i)
  49. post(serialize({ t: "s", i: msg.i, r: result, e: error }), ...extra);
  50. } else {
  51. const { i: ack, r: result, e: error } = msg;
  52. const promise = rpcPromiseMap.get(ack);
  53. if (error)
  54. promise?.reject(error);
  55. else
  56. promise?.resolve(result);
  57. rpcPromiseMap.delete(ack);
  58. }
  59. });
  60. return rpc;
  61. }
  62. const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
  63. function nanoid(size = 21) {
  64. let id = "";
  65. let i = size;
  66. while (i--)
  67. id += urlAlphabet[Math.random() * 64 | 0];
  68. return id;
  69. }
  70. export { createBirpc as c };