RpcClient.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. "use strict";
  2. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  3. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  4. return new (P || (P = Promise))(function (resolve, reject) {
  5. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  6. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  7. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  8. step((generator = generator.apply(thisArg, _arguments || [])).next());
  9. });
  10. };
  11. Object.defineProperty(exports, "__esModule", { value: true });
  12. const RpcMessage_1 = require("./RpcMessage");
  13. const RpcRemoteError_1 = require("./error/RpcRemoteError");
  14. /* eslint-enable @typescript-eslint/no-explicit-any */
  15. function createRpcClient(port) {
  16. let callIndex = 0;
  17. const callbacks = new Map();
  18. let isListenerRegistered = false;
  19. const returnOrThrowListener = (message) => __awaiter(this, void 0, void 0, function* () {
  20. if (RpcMessage_1.isRpcReturnMessage(message)) {
  21. const key = RpcMessage_1.getRpcMessageKey(message);
  22. const callback = callbacks.get(key);
  23. if (callback) {
  24. callback.return(message.payload);
  25. callbacks.delete(key);
  26. }
  27. }
  28. if (RpcMessage_1.isRpcThrowMessage(message)) {
  29. const key = RpcMessage_1.getRpcMessageKey(message);
  30. const callback = callbacks.get(key);
  31. if (callback) {
  32. callback.throw(new RpcRemoteError_1.RpcRemoteError(message.payload.message, message.payload.stack));
  33. callbacks.delete(key);
  34. }
  35. }
  36. });
  37. const errorListener = (error) => __awaiter(this, void 0, void 0, function* () {
  38. callbacks.forEach((callback, key) => {
  39. callback.throw(error);
  40. callbacks.delete(key);
  41. });
  42. });
  43. return {
  44. isConnected: () => port.isOpen() && isListenerRegistered,
  45. connect: () => __awaiter(this, void 0, void 0, function* () {
  46. if (!port.isOpen()) {
  47. yield port.open();
  48. }
  49. if (!isListenerRegistered) {
  50. port.addMessageListener(returnOrThrowListener);
  51. port.addErrorListener(errorListener);
  52. isListenerRegistered = true;
  53. }
  54. }),
  55. disconnect: () => __awaiter(this, void 0, void 0, function* () {
  56. if (isListenerRegistered) {
  57. port.removeMessageListener(returnOrThrowListener);
  58. port.removeErrorListener(errorListener);
  59. isListenerRegistered = false;
  60. }
  61. if (port.isOpen()) {
  62. yield port.close();
  63. }
  64. }),
  65. dispatchCall: (procedure, payload) => __awaiter(this, void 0, void 0, function* () {
  66. return new Promise((resolve, reject) => {
  67. const call = RpcMessage_1.createRpcCall(procedure, callIndex++, payload);
  68. const key = RpcMessage_1.getRpcMessageKey(call);
  69. callbacks.set(key, { return: resolve, throw: reject });
  70. port.dispatchMessage(call).catch((error) => {
  71. callbacks.delete(key);
  72. reject(error);
  73. });
  74. });
  75. }),
  76. };
  77. }
  78. exports.createRpcClient = createRpcClient;