1 | "use strict";
|
2 | var __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 | };
|
9 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
10 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
11 | };
|
12 | exports.__esModule = true;
|
13 | var v4_1 = __importDefault(require("uuid/v4"));
|
14 | var serialize_error_1 = require("serialize-error");
|
15 | require("object.entries/auto");
|
16 | var PromiseIpcBase = (function () {
|
17 | function PromiseIpcBase(opts, eventEmitter) {
|
18 | if (opts && opts.maxTimeoutMs) {
|
19 | this.maxTimeoutMs = opts.maxTimeoutMs;
|
20 | }
|
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;
|
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);
|
60 | if (prevListener === listener) {
|
61 | return this;
|
62 | }
|
63 | if (this.routeListenerMap.has(route)) {
|
64 | this.off(route, prevListener);
|
65 | }
|
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 |
|
72 |
|
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;
|
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 | }());
|
101 | exports["default"] = PromiseIpcBase;
|