UNPKG

4.88 kBJavaScriptView Raw
1"use strict";
2var __spreadArrays = (this && this.__spreadArrays) || function () {
3 for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
4 for (var r = Array(s), k = 0, i = 0; i < il; i++)
5 for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
6 r[k] = a[j];
7 return r;
8};
9var __importDefault = (this && this.__importDefault) || function (mod) {
10 return (mod && mod.__esModule) ? mod : { "default": mod };
11};
12exports.__esModule = true;
13var v4_1 = __importDefault(require("uuid/v4"));
14var serialize_error_1 = require("serialize-error");
15require("object.entries/auto"); // Shim Object.entries. Required to use serializeError.
16var PromiseIpcBase = /** @class */ (function () {
17 function PromiseIpcBase(opts, eventEmitter) {
18 if (opts && opts.maxTimeoutMs) {
19 this.maxTimeoutMs = opts.maxTimeoutMs;
20 } // either ipcRenderer or ipcMain
21 this.eventEmitter = eventEmitter;
22 this.routeListenerMap = new Map();
23 this.listenerMap = new Map();
24 }
25 PromiseIpcBase.prototype.send = function (route, sender) {
26 var _this = this;
27 var dataArgs = [];
28 for (var _i = 2; _i < arguments.length; _i++) {
29 dataArgs[_i - 2] = arguments[_i];
30 }
31 return new Promise(function (resolve, reject) {
32 var replyChannel = route + "#" + v4_1["default"]();
33 var timeout;
34 var didTimeOut = false; // ipcRenderer will send a message back to replyChannel when it finishes calculating
35 _this.eventEmitter.once(replyChannel, function (event, status, returnData) {
36 clearTimeout(timeout);
37 if (didTimeOut) {
38 return null;
39 }
40 switch (status) {
41 case 'success':
42 return resolve(returnData);
43 case 'failure':
44 return reject(returnData);
45 default:
46 return reject(new Error("Unexpected IPC call status \"" + status + "\" in " + route));
47 }
48 });
49 sender.send.apply(sender, __spreadArrays([route, replyChannel], dataArgs));
50 if (_this.maxTimeoutMs) {
51 timeout = setTimeout(function () {
52 didTimeOut = true;
53 reject(new Error(route + " timed out."));
54 }, _this.maxTimeoutMs);
55 }
56 });
57 };
58 PromiseIpcBase.prototype.on = function (route, listener) {
59 var prevListener = this.routeListenerMap.get(route); // If listener has already been added for this route, don't add it again.
60 if (prevListener === listener) {
61 return this;
62 } // Only one listener may be active for a given route. // If two are active promises it won't work correctly - that's a race condition.
63 if (this.routeListenerMap.has(route)) {
64 this.off(route, prevListener);
65 } // This function _wraps_ the listener argument. We maintain a map of // listener -> wrapped listener in order to implement #off().
66 var wrappedListener = function (event, replyChannel) {
67 var dataArgs = [];
68 for (var _i = 2; _i < arguments.length; _i++) {
69 dataArgs[_i - 2] = arguments[_i];
70 }
71 // Chaining off of Promise.resolve() means that listener can return a promise, or return
72 // synchronously -- it can even throw. The end result will still be handled promise-like.
73 Promise.resolve()
74 .then(function () { return listener.apply(void 0, __spreadArrays(dataArgs, [event])); })
75 .then(function (results) {
76 event.sender.send(replyChannel, 'success', results);
77 })["catch"](function (e) {
78 event.sender.send(replyChannel, 'failure', serialize_error_1.serializeError(e));
79 });
80 };
81 this.routeListenerMap.set(route, listener);
82 this.listenerMap.set(listener, wrappedListener);
83 this.eventEmitter.on(route, wrappedListener);
84 return this;
85 };
86 PromiseIpcBase.prototype.off = function (route, listener) {
87 var registeredListener = this.routeListenerMap.get(route);
88 if (listener && listener !== registeredListener) {
89 return; // trying to remove the wrong listener, so do nothing.
90 }
91 var wrappedListener = this.listenerMap.get(registeredListener);
92 this.eventEmitter.removeListener(route, wrappedListener);
93 this.listenerMap["delete"](registeredListener);
94 this.routeListenerMap["delete"](route);
95 };
96 PromiseIpcBase.prototype.removeListener = function (route, listener) {
97 this.off(route, listener);
98 };
99 return PromiseIpcBase;
100}());
101exports["default"] = PromiseIpcBase;