@3fv/electron-utility-process-manager 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/.prettierrc.js +14 -0
  2. package/README.md +166 -0
  3. package/examples/lib-examples/complex/complex-main.d.ts +1 -0
  4. package/examples/lib-examples/complex/complex-main.js +108 -0
  5. package/examples/lib-examples/complex/complex-main.js.map +1 -0
  6. package/examples/lib-examples/complex/complex-node.d.ts +1 -0
  7. package/examples/lib-examples/complex/complex-node.js +17 -0
  8. package/examples/lib-examples/complex/complex-node.js.map +1 -0
  9. package/examples/lib-examples/complex/complex-renderer.d.ts +1 -0
  10. package/examples/lib-examples/complex/complex-renderer.js +18 -0
  11. package/examples/lib-examples/complex/complex-renderer.js.map +1 -0
  12. package/examples/lib-examples/complex/complex-types.d.ts +3 -0
  13. package/examples/lib-examples/complex/complex-types.js +3 -0
  14. package/examples/lib-examples/complex/complex-types.js.map +1 -0
  15. package/examples/lib-examples/simple/simple-main.d.ts +1 -0
  16. package/examples/lib-examples/simple/simple-main.js +106 -0
  17. package/examples/lib-examples/simple/simple-main.js.map +1 -0
  18. package/examples/lib-examples/simple/simple-node.d.ts +1 -0
  19. package/examples/lib-examples/simple/simple-node.js +17 -0
  20. package/examples/lib-examples/simple/simple-node.js.map +1 -0
  21. package/examples/lib-examples/simple/simple-renderer.d.ts +1 -0
  22. package/examples/lib-examples/simple/simple-renderer.js +17 -0
  23. package/examples/lib-examples/simple/simple-renderer.js.map +1 -0
  24. package/jest.config.js +20 -0
  25. package/lib/cjs/common/clients.d.ts +103 -0
  26. package/lib/cjs/common/clients.js +180 -0
  27. package/lib/cjs/common/clients.js.map +1 -0
  28. package/lib/cjs/common/guards.d.ts +4 -0
  29. package/lib/cjs/common/guards.js +12 -0
  30. package/lib/cjs/common/guards.js.map +1 -0
  31. package/lib/cjs/common/index.d.ts +3 -0
  32. package/lib/cjs/common/index.js +20 -0
  33. package/lib/cjs/common/index.js.map +1 -0
  34. package/lib/cjs/common/types.d.ts +49 -0
  35. package/lib/cjs/common/types.js +21 -0
  36. package/lib/cjs/common/types.js.map +1 -0
  37. package/lib/cjs/index.d.ts +4 -0
  38. package/lib/cjs/index.js +34 -0
  39. package/lib/cjs/index.js.map +1 -0
  40. package/lib/cjs/main/UPMMainService.d.ts +69 -0
  41. package/lib/cjs/main/UPMMainService.js +292 -0
  42. package/lib/cjs/main/UPMMainService.js.map +1 -0
  43. package/lib/cjs/main/UPMMainServiceManager.d.ts +58 -0
  44. package/lib/cjs/main/UPMMainServiceManager.js +168 -0
  45. package/lib/cjs/main/UPMMainServiceManager.js.map +1 -0
  46. package/lib/cjs/main/index.d.ts +2 -0
  47. package/lib/cjs/main/index.js +19 -0
  48. package/lib/cjs/main/index.js.map +1 -0
  49. package/lib/cjs/node/UPMNodeProcess.d.ts +25 -0
  50. package/lib/cjs/node/UPMNodeProcess.js +155 -0
  51. package/lib/cjs/node/UPMNodeProcess.js.map +1 -0
  52. package/lib/cjs/node/index.d.ts +3 -0
  53. package/lib/cjs/node/index.js +23 -0
  54. package/lib/cjs/node/index.js.map +1 -0
  55. package/lib/cjs/renderer/UPMRendererClientFactory.d.ts +5 -0
  56. package/lib/cjs/renderer/UPMRendererClientFactory.js +77 -0
  57. package/lib/cjs/renderer/UPMRendererClientFactory.js.map +1 -0
  58. package/lib/cjs/renderer/index.d.ts +3 -0
  59. package/lib/cjs/renderer/index.js +23 -0
  60. package/lib/cjs/renderer/index.js.map +1 -0
  61. package/lib/mjs/common/clients.d.ts +103 -0
  62. package/lib/mjs/common/clients.js +173 -0
  63. package/lib/mjs/common/clients.js.map +1 -0
  64. package/lib/mjs/common/guards.d.ts +4 -0
  65. package/lib/mjs/common/guards.js +8 -0
  66. package/lib/mjs/common/guards.js.map +1 -0
  67. package/lib/mjs/common/index.d.ts +3 -0
  68. package/lib/mjs/common/index.js +4 -0
  69. package/lib/mjs/common/index.js.map +1 -0
  70. package/lib/mjs/common/types.d.ts +49 -0
  71. package/lib/mjs/common/types.js +18 -0
  72. package/lib/mjs/common/types.js.map +1 -0
  73. package/lib/mjs/index.d.ts +4 -0
  74. package/lib/mjs/index.js +5 -0
  75. package/lib/mjs/index.js.map +1 -0
  76. package/lib/mjs/main/UPMMainService.d.ts +69 -0
  77. package/lib/mjs/main/UPMMainService.js +262 -0
  78. package/lib/mjs/main/UPMMainService.js.map +1 -0
  79. package/lib/mjs/main/UPMMainServiceManager.d.ts +58 -0
  80. package/lib/mjs/main/UPMMainServiceManager.js +138 -0
  81. package/lib/mjs/main/UPMMainServiceManager.js.map +1 -0
  82. package/lib/mjs/main/index.d.ts +2 -0
  83. package/lib/mjs/main/index.js +3 -0
  84. package/lib/mjs/main/index.js.map +1 -0
  85. package/lib/mjs/node/UPMNodeProcess.d.ts +25 -0
  86. package/lib/mjs/node/UPMNodeProcess.js +125 -0
  87. package/lib/mjs/node/UPMNodeProcess.js.map +1 -0
  88. package/lib/mjs/node/index.d.ts +3 -0
  89. package/lib/mjs/node/index.js +4 -0
  90. package/lib/mjs/node/index.js.map +1 -0
  91. package/lib/mjs/renderer/UPMRendererClientFactory.d.ts +5 -0
  92. package/lib/mjs/renderer/UPMRendererClientFactory.js +47 -0
  93. package/lib/mjs/renderer/UPMRendererClientFactory.js.map +1 -0
  94. package/lib/mjs/renderer/index.d.ts +3 -0
  95. package/lib/mjs/renderer/index.js +4 -0
  96. package/lib/mjs/renderer/index.js.map +1 -0
  97. package/package.json +104 -0
@@ -0,0 +1,49 @@
1
+ import type { UtilityProcess } from "electron";
2
+ import { Deferred } from "@3fv/deferred";
3
+ export declare const Defaults: {
4
+ RequestTimeout: number;
5
+ };
6
+ export declare enum MessageKind {
7
+ Event = "Event",
8
+ Request = "Request",
9
+ Response = "Response"
10
+ }
11
+ export declare enum IPCChannel {
12
+ UPMServiceMessage = "UPMServiceMessage",
13
+ UPMServiceNewClient = "UPMServiceNewClient"
14
+ }
15
+ export declare enum NodeMessageType {
16
+ UPMNodeEventMessage = "UPMNodeEventMessage",
17
+ UPMNodeRequestResponse = "UPMNodeRequestResponseMessage"
18
+ }
19
+ export type MessageRequestFnBase = (...args: any[]) => Promise<any>;
20
+ export type MessageRequestMap = {};
21
+ export type MessageRequestNames<ReqMap extends MessageRequestMap> = keyof ReqMap;
22
+ export type MessageRequestFn<ReqMap extends MessageRequestMap, Name extends MessageRequestNames<ReqMap>> = ReqMap[Name] extends MessageRequestFnBase ? ReqMap[Name] : never;
23
+ export type MessageRequestParams<ReqMap extends MessageRequestMap, Name extends MessageRequestNames<ReqMap>> = ReqMap[Name] extends MessageRequestFnBase ? Parameters<ReqMap[Name]> : never;
24
+ export type MessageRequestReturnType<ReqMap extends MessageRequestMap, Name extends MessageRequestNames<ReqMap>> = ReqMap[Name] extends MessageRequestFnBase ? ReturnType<ReqMap[Name]> : never;
25
+ export interface Message<ReqMap extends MessageRequestMap = any, Type extends MessageRequestNames<ReqMap> = MessageRequestNames<ReqMap>, Args extends MessageRequestParams<ReqMap, Type> = MessageRequestParams<ReqMap, Type>, R extends MessageRequestReturnType<ReqMap, Type> = MessageRequestReturnType<ReqMap, Type>> {
26
+ type: Type;
27
+ kind: MessageKind;
28
+ messageId: number;
29
+ eventData?: any;
30
+ args?: Args;
31
+ result?: R;
32
+ error?: string;
33
+ }
34
+ export interface NodeEnvelope<Payload extends {} = any> {
35
+ channel: IPCChannel;
36
+ payload: Payload;
37
+ }
38
+ export type RequestHandler<ReqMap extends MessageRequestMap = any, Type extends MessageRequestNames<ReqMap> = MessageRequestNames<ReqMap>, Args extends MessageRequestParams<ReqMap, Type> = MessageRequestParams<ReqMap, Type>, R extends MessageRequestReturnType<ReqMap, Type> = MessageRequestReturnType<ReqMap, Type>> = (type: Type, messageId: number, ...args: Args) => Promise<R>;
39
+ export type NodeMessage<ReqMap extends MessageRequestMap = any, Type extends MessageRequestNames<ReqMap> = MessageRequestNames<ReqMap>> = NodeEnvelope<Message<ReqMap, Type>>;
40
+ export interface PendingRequestMessage<ReqMap extends MessageRequestMap = any, Type extends MessageRequestNames<ReqMap> = MessageRequestNames<ReqMap>, R extends MessageRequestReturnType<ReqMap, Type> = MessageRequestReturnType<ReqMap, Type>> {
41
+ deferred: Deferred<R>;
42
+ timeoutId: ReturnType<typeof setTimeout>;
43
+ messageId: number;
44
+ }
45
+ /**
46
+ * @returns true if payload was handled, false if not
47
+ */
48
+ export type EventHandler = (clientId: string, port: Port, payload: any) => boolean;
49
+ export type Port = MessagePort | Electron.MessagePortMain | Electron.ParentPort | UtilityProcess;
@@ -0,0 +1,18 @@
1
+ export const Defaults = { RequestTimeout: 120000 };
2
+ export var MessageKind;
3
+ (function (MessageKind) {
4
+ MessageKind["Event"] = "Event";
5
+ MessageKind["Request"] = "Request";
6
+ MessageKind["Response"] = "Response";
7
+ })(MessageKind || (MessageKind = {}));
8
+ export var IPCChannel;
9
+ (function (IPCChannel) {
10
+ IPCChannel["UPMServiceMessage"] = "UPMServiceMessage";
11
+ IPCChannel["UPMServiceNewClient"] = "UPMServiceNewClient";
12
+ })(IPCChannel || (IPCChannel = {}));
13
+ export var NodeMessageType;
14
+ (function (NodeMessageType) {
15
+ NodeMessageType["UPMNodeEventMessage"] = "UPMNodeEventMessage";
16
+ NodeMessageType["UPMNodeRequestResponse"] = "UPMNodeRequestResponseMessage";
17
+ })(NodeMessageType || (NodeMessageType = {}));
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAAA;AAElD,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;AACvB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,qDAAuC,CAAA;IACvC,yDAA2C,CAAA;AAC7C,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB;AAED,MAAM,CAAN,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,8DAA2C,CAAA;IAC3C,2EAAwD,CAAA;AAC1D,CAAC,EAHW,eAAe,KAAf,eAAe,QAG1B"}
@@ -0,0 +1,4 @@
1
+ export * from "./common";
2
+ import * as UPM from "./common";
3
+ export { UPM };
4
+ export default UPM;
@@ -0,0 +1,5 @@
1
+ export * from "./common";
2
+ import * as UPM from "./common";
3
+ export { UPM };
4
+ export default UPM;
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAE/B,OAAO,EACL,GAAG,EACJ,CAAA;AAED,eAAe,GAAG,CAAA"}
@@ -0,0 +1,69 @@
1
+ import { MessagePortMain } from "electron";
2
+ import * as UPM from "../common";
3
+ import { IServiceClient } from "../common";
4
+ export interface UPMMainServiceConfig {
5
+ }
6
+ export type UPMMainServiceOptions = Partial<UPMMainServiceConfig>;
7
+ export declare class UPMMainService<ReqMap extends UPM.MessageRequestMap = any, MType extends UPM.MessageRequestNames<ReqMap> = UPM.MessageRequestNames<ReqMap>> implements UPM.IMessageClient<ReqMap, MType> {
8
+ readonly serviceName: string;
9
+ readonly entryFile: string;
10
+ private readonly config_;
11
+ private readyDeferred_;
12
+ private killDeferred_;
13
+ private lastMessageId_;
14
+ private childProcess_;
15
+ private pendingMessages_;
16
+ private messageChannels_;
17
+ private init;
18
+ private onMessage;
19
+ /**
20
+ * Resolves when ready
21
+ *
22
+ * @returns {any}
23
+ */
24
+ whenReady(): Promise<UPM.IMessageClient<ReqMap, MType>>;
25
+ /**
26
+ * Return a simple proxy facade wrapping
27
+ * `executeRequest` into individual methods
28
+ */
29
+ getServiceClient(): IServiceClient<ReqMap, MType>;
30
+ /**
31
+ * Returned client side port (for Renderer)
32
+ * @param clientId
33
+ */
34
+ createMessageChannel(clientId: string): MessagePortMain;
35
+ /**
36
+ * Create a port client for the main process
37
+ * (useful to avoid congestion on default child_process channel)
38
+ *
39
+ * @param {string} clientId
40
+ * @returns {UPM.MessagePortClient<MessageRequestMap, MessageType>}
41
+ */
42
+ createMainClient(clientId: string): UPM.MessagePortClient<ReqMap, MType>;
43
+ private onPortClose;
44
+ private closeMessageChannel;
45
+ close(): void;
46
+ /**
47
+ * Send an event as `fire-and-forget`
48
+ *
49
+ * @param data
50
+ * @param port
51
+ */
52
+ sendEvent(data: any, port?: UPM.Port): void;
53
+ /**
54
+ * Send request
55
+ *
56
+ * @param type
57
+ * @param args
58
+ */
59
+ executeRequest<Type extends MType, R extends UPM.MessageRequestReturnType<ReqMap, Type> = UPM.MessageRequestReturnType<ReqMap, Type>>(type: Type, ...args: UPM.MessageRequestParams<ReqMap, Type>): Promise<R>;
60
+ stop(): Promise<void>;
61
+ private kill;
62
+ private removeAllMessageChannels;
63
+ private cancelAllPendingMessages;
64
+ constructor(serviceName: string, entryFile: string, options?: UPMMainServiceOptions);
65
+ private removePendingMessage;
66
+ private generateMessageId;
67
+ [Symbol.asyncDispose](): Promise<void>;
68
+ }
69
+ export default UPMMainService;
@@ -0,0 +1,262 @@
1
+ import { app, MessageChannelMain, utilityProcess } from "electron";
2
+ import { assert, getValue, isString } from "@3fv/guard";
3
+ import Fsx from "fs-extra";
4
+ import { Deferred } from "@3fv/deferred";
5
+ import * as UPM from "../common";
6
+ import { isEmpty, negate } from "lodash";
7
+ import Tracer from "tracer";
8
+ const log = Tracer.colorConsole();
9
+ const isNotEmpty = negate(isEmpty);
10
+ export class UPMMainService {
11
+ async init() {
12
+ let deferred = this.readyDeferred_;
13
+ if (deferred) {
14
+ return deferred.promise;
15
+ }
16
+ deferred = this.readyDeferred_ = new Deferred();
17
+ try {
18
+ const exitListener = (code) => {
19
+ if (code !== 0) {
20
+ deferred.reject(new Error(`process exited with code ${code} upon starting`));
21
+ }
22
+ };
23
+ const spawnListener = async () => {
24
+ this.childProcess_.off("exit", exitListener);
25
+ this.childProcess_.on("message", this.onMessage.bind(this));
26
+ deferred.resolve(this);
27
+ };
28
+ this.childProcess_ = utilityProcess
29
+ .fork(this.entryFile, [], {
30
+ serviceName: this.serviceName,
31
+ env: Object.assign(Object.assign({}, process.env), { IN_CHILD_PROCESS: "true", APP_NAME: app.name })
32
+ })
33
+ .on("spawn", spawnListener)
34
+ .on("exit", exitListener);
35
+ await deferred.promise;
36
+ }
37
+ catch (err) {
38
+ deferred.reject(err);
39
+ }
40
+ return deferred.promise;
41
+ }
42
+ onMessage(payload) {
43
+ const { type, kind, messageId, result, error } = payload;
44
+ try {
45
+ const pending = this.pendingMessages_.get(messageId);
46
+ if (!pending) {
47
+ log.info(`Unable to find pending record ${messageId}`);
48
+ return;
49
+ }
50
+ if (pending.deferred.isSettled()) {
51
+ log.error(`Already settled record ${messageId}`);
52
+ return;
53
+ }
54
+ this.removePendingMessage(messageId);
55
+ if (!!error) {
56
+ log.error(error);
57
+ pending.deferred.reject(new Error(error));
58
+ return;
59
+ }
60
+ pending.deferred.resolve(result);
61
+ }
62
+ catch (err) {
63
+ log.error(`Failed to handle message`, err);
64
+ }
65
+ }
66
+ /**
67
+ * Resolves when ready
68
+ *
69
+ * @returns {any}
70
+ */
71
+ whenReady() {
72
+ return this.init();
73
+ }
74
+ /**
75
+ * Return a simple proxy facade wrapping
76
+ * `executeRequest` into individual methods
77
+ */
78
+ getServiceClient() {
79
+ return new Proxy({}, {
80
+ get: (_target, prop) => {
81
+ if (prop === "then") {
82
+ return undefined;
83
+ }
84
+ return (...args) => this.whenReady()
85
+ .then(client => client.executeRequest(prop, ...args));
86
+ }
87
+ });
88
+ }
89
+ /**
90
+ * Returned client side port (for Renderer)
91
+ * @param clientId
92
+ */
93
+ createMessageChannel(clientId) {
94
+ var _a, _b;
95
+ assert((_b = (_a = this.readyDeferred_) === null || _a === void 0 ? void 0 : _a.isFulfilled()) !== null && _b !== void 0 ? _b : false, `Service (${this.serviceName}) is not fulfilled or has an error (${this.readyDeferred_.status()})`);
96
+ const channel = new MessageChannelMain(), { port1, port2 } = channel;
97
+ this.messageChannels_.set(clientId, channel);
98
+ try {
99
+ this.childProcess_.postMessage({
100
+ message: {
101
+ channel: UPM.IPCChannel.UPMServiceNewClient,
102
+ payload: { clientId }
103
+ }
104
+ }, [port1]);
105
+ }
106
+ catch (err) {
107
+ log.error(`Unable to create channel id=${clientId}`, err);
108
+ this.closeMessageChannel(clientId, channel);
109
+ throw err;
110
+ }
111
+ return port2;
112
+ }
113
+ /**
114
+ * Create a port client for the main process
115
+ * (useful to avoid congestion on default child_process channel)
116
+ *
117
+ * @param {string} clientId
118
+ * @returns {UPM.MessagePortClient<MessageRequestMap, MessageType>}
119
+ */
120
+ createMainClient(clientId) {
121
+ return new UPM.MessagePortClient(clientId, this.createMessageChannel(clientId));
122
+ }
123
+ onPortClose(id, channel) {
124
+ log.info(`main side of message channel(id=${id}) closed`);
125
+ this.closeMessageChannel(id, channel);
126
+ }
127
+ closeMessageChannel(id, channel) {
128
+ if (this.messageChannels_.has(id)) {
129
+ this.messageChannels_.delete(id);
130
+ }
131
+ ;
132
+ [channel.port1, channel.port2].forEach(p => getValue(() => p.close()));
133
+ }
134
+ close() {
135
+ log.warn("Close has no effect when called via the main process");
136
+ }
137
+ /**
138
+ * Send an event as `fire-and-forget`
139
+ *
140
+ * @param data
141
+ * @param port
142
+ */
143
+ sendEvent(data, port = this.childProcess_) {
144
+ const messageId = this.generateMessageId();
145
+ const payload = {
146
+ channel: UPM.IPCChannel.UPMServiceMessage,
147
+ payload: { messageId, data, kind: UPM.MessageKind.Event }
148
+ };
149
+ port.postMessage(payload);
150
+ }
151
+ /**
152
+ * Send request
153
+ *
154
+ * @param type
155
+ * @param args
156
+ */
157
+ async executeRequest(type, ...args) {
158
+ assert(!!this.childProcess_, "The process is not running");
159
+ const messageId = this.generateMessageId(), pending = {
160
+ deferred: new Deferred(),
161
+ messageId,
162
+ timeoutId: setTimeout(() => this.removePendingMessage(messageId), UPM.Defaults.RequestTimeout)
163
+ };
164
+ this.pendingMessages_.set(messageId, pending);
165
+ const payload = {
166
+ channel: UPM.IPCChannel.UPMServiceMessage,
167
+ payload: { type, messageId, args, kind: UPM.MessageKind.Request }
168
+ };
169
+ this.childProcess_.postMessage(payload);
170
+ try {
171
+ const result = await pending.deferred.promise;
172
+ log.debug(`Completed utility request (messageId=${messageId})`);
173
+ return result;
174
+ }
175
+ catch (err) {
176
+ log.error(`Failed utility request (messageId=${messageId})`, err);
177
+ throw err;
178
+ }
179
+ }
180
+ async stop() {
181
+ await this.kill();
182
+ }
183
+ async kill() {
184
+ if (!this.readyDeferred_) {
185
+ return;
186
+ }
187
+ let killDeferred = this.killDeferred_;
188
+ if (killDeferred) {
189
+ return killDeferred.promise;
190
+ }
191
+ if (!this.readyDeferred_.isSettled()) {
192
+ await this.readyDeferred_.promise.catch(err => log.error(`ignoring error`, err));
193
+ }
194
+ const process = this.childProcess_;
195
+ if (!process) {
196
+ log.error("The process is not running");
197
+ return 0;
198
+ }
199
+ this.cancelAllPendingMessages();
200
+ this.removeAllMessageChannels();
201
+ killDeferred = this.killDeferred_ = new Deferred();
202
+ try {
203
+ process.once("exit", (code) => {
204
+ if (code !== 0) {
205
+ log.error(`Process exited with code ${code} upon stopping`);
206
+ }
207
+ killDeferred.resolve(code);
208
+ });
209
+ process.kill();
210
+ }
211
+ catch (err) {
212
+ log.error("Unable to kill utility process", err);
213
+ killDeferred.reject(err);
214
+ }
215
+ return await killDeferred.promise;
216
+ }
217
+ removeAllMessageChannels() {
218
+ for (const [id, channel] of [...this.messageChannels_.entries()]) {
219
+ this.closeMessageChannel(id, channel);
220
+ }
221
+ }
222
+ cancelAllPendingMessages() {
223
+ for (const key of [...this.pendingMessages_.keys()]) {
224
+ this.removePendingMessage(key);
225
+ }
226
+ }
227
+ constructor(serviceName, entryFile, options = {}) {
228
+ this.serviceName = serviceName;
229
+ this.entryFile = entryFile;
230
+ this.readyDeferred_ = null;
231
+ this.killDeferred_ = null;
232
+ this.lastMessageId_ = 0;
233
+ this.childProcess_ = null;
234
+ this.pendingMessages_ = new Map();
235
+ this.messageChannels_ = new Map();
236
+ //super()
237
+ assert(isString(entryFile) && isNotEmpty(entryFile) && Fsx.existsSync(entryFile), `entry file must be provided (${entryFile})`);
238
+ this.config_ = Object.assign({}, options);
239
+ this.init().catch(err => {
240
+ log.error(`Failed to init utility process`, err);
241
+ });
242
+ }
243
+ removePendingMessage(messageId) {
244
+ const pending = this.pendingMessages_.get(messageId);
245
+ if (!pending) {
246
+ return;
247
+ }
248
+ clearTimeout(pending.timeoutId);
249
+ if (!pending.deferred.isSettled()) {
250
+ pending.deferred.reject("The pending message is being removed before promise is settled");
251
+ }
252
+ this.pendingMessages_.delete(messageId);
253
+ }
254
+ generateMessageId() {
255
+ return this.lastMessageId_++;
256
+ }
257
+ async [Symbol.asyncDispose]() {
258
+ await this.stop();
259
+ }
260
+ }
261
+ export default UPMMainService;
262
+ //# sourceMappingURL=UPMMainService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UPMMainService.js","sourceRoot":"","sources":["../../../src/main/UPMMainService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import * as UPM from "../common";
2
+ import UPMMainService from "./UPMMainService";
3
+ export declare class UPMMainServiceManager {
4
+ private services_;
5
+ /**
6
+ * On new client request from renderer
7
+ *
8
+ * @param ev
9
+ * @param serviceName
10
+ * @param clientId
11
+ * @private
12
+ */
13
+ private onNewClient;
14
+ createMainChannel<Args extends UPM.MessageRequestMap = any, MType extends UPM.MessageRequestNames<Args> = UPM.MessageRequestNames<Args>>(serviceOrName: string | UPMMainService<Args, MType>, clientId: string): UPM.Port;
15
+ createMainClient<ReqMap extends UPM.MessageRequestMap = any, MType extends UPM.MessageRequestNames<ReqMap> = UPM.MessageRequestNames<ReqMap>>(serviceName: string, clientId: string): UPM.MessagePortClient<ReqMap, MType>;
16
+ /**
17
+ * Destroy all services
18
+ *
19
+ * @private
20
+ */
21
+ private destroy;
22
+ /**
23
+ * Get the service for a given name
24
+ *
25
+ * @param serviceName
26
+ */
27
+ getService<ReqMap extends UPM.MessageRequestMap, Type extends UPM.MessageRequestNames<ReqMap> = UPM.MessageRequestNames<ReqMap>>(serviceName: string): UPMMainService<ReqMap, Type>;
28
+ /**
29
+ * Create a utility process/service
30
+ *
31
+ * @param serviceName
32
+ * @param entryFile
33
+ */
34
+ createService<ReqMap extends UPM.MessageRequestMap, Type extends UPM.MessageRequestNames<ReqMap> = UPM.MessageRequestNames<ReqMap>>(serviceName: string, entryFile: string): Promise<UPMMainService<ReqMap, Type>>;
35
+ /**
36
+ * Destroy a specific service
37
+ *
38
+ * @param serviceName
39
+ */
40
+ destroyService(serviceName: string): Promise<void>;
41
+ /**
42
+ * Async dispose symbol
43
+ */
44
+ [Symbol.asyncDispose](): Promise<void>;
45
+ private constructor();
46
+ /**
47
+ * Singleton instance
48
+ *
49
+ * @private
50
+ */
51
+ private static sInstance_;
52
+ /**
53
+ * Get singleton instance
54
+ */
55
+ static get(): UPMMainServiceManager;
56
+ }
57
+ export declare const upmMainServiceManager: UPMMainServiceManager;
58
+ export default upmMainServiceManager;
@@ -0,0 +1,138 @@
1
+ import { ipcMain } from "electron";
2
+ import { assert, isString } from "@3fv/guard";
3
+ import * as UPM from "../common";
4
+ import UPMMainService from "./UPMMainService";
5
+ import Tracer from "tracer";
6
+ const log = Tracer.colorConsole();
7
+ export class UPMMainServiceManager {
8
+ /**
9
+ * On new client request from renderer
10
+ *
11
+ * @param ev
12
+ * @param serviceName
13
+ * @param clientId
14
+ * @private
15
+ */
16
+ onNewClient(ev, serviceName, clientId) {
17
+ const sender = ev.sender;
18
+ if (!sender) {
19
+ log.error(`sender is invalid on new client ipc message`, ev);
20
+ return;
21
+ }
22
+ const proc = this.getService(serviceName);
23
+ if (!proc) {
24
+ log.error(`no proc found for ${serviceName}`, ev);
25
+ return;
26
+ }
27
+ try {
28
+ const clientPort = proc.createMessageChannel(clientId);
29
+ log.info(`Received client port for proc (id=${serviceName},clientId=${clientId})`);
30
+ sender.postMessage(UPM.IPCChannel.UPMServiceNewClient, { serviceName, clientId }, [clientPort]);
31
+ }
32
+ catch (err) {
33
+ log.error(`failed to register new client`, err);
34
+ }
35
+ }
36
+ createMainChannel(serviceOrName, clientId) {
37
+ try {
38
+ const service = isString(serviceOrName) ? this.getService(serviceOrName) : serviceOrName;
39
+ const clientPort = service.createMessageChannel(clientId);
40
+ log.info(`Received client port for proc (id=${service.serviceName},clientId=${clientId})`);
41
+ return clientPort;
42
+ }
43
+ catch (err) {
44
+ log.error(`failed to register new client`, err);
45
+ throw err;
46
+ }
47
+ }
48
+ createMainClient(serviceName, clientId) {
49
+ const service = this.getService(serviceName);
50
+ assert(!!service, `no proc found for ${serviceName}`);
51
+ try {
52
+ return service.createMainClient(clientId);
53
+ }
54
+ catch (err) {
55
+ log.error(`failed to register new client`, err);
56
+ throw err;
57
+ }
58
+ }
59
+ /**
60
+ * Destroy all services
61
+ *
62
+ * @private
63
+ */
64
+ async destroy() {
65
+ for (const [id] of [...this.services_.keys()]) {
66
+ await this.destroyService(id);
67
+ }
68
+ }
69
+ /**
70
+ * Get the service for a given name
71
+ *
72
+ * @param serviceName
73
+ */
74
+ getService(serviceName) {
75
+ return this.services_.has(serviceName) ? this.services_.get(serviceName) : null;
76
+ }
77
+ /**
78
+ * Create a utility process/service
79
+ *
80
+ * @param serviceName
81
+ * @param entryFile
82
+ */
83
+ async createService(serviceName, entryFile) {
84
+ assert(!this.services_.has(serviceName), `utility process with id (${serviceName}) is already registered`);
85
+ const proc = new UPMMainService(serviceName, entryFile, {
86
+ serviceName
87
+ });
88
+ this.services_.set(serviceName, proc);
89
+ try {
90
+ await proc.whenReady();
91
+ return proc;
92
+ }
93
+ catch (err) {
94
+ await this.destroyService(serviceName);
95
+ throw err;
96
+ }
97
+ }
98
+ /**
99
+ * Destroy a specific service
100
+ *
101
+ * @param serviceName
102
+ */
103
+ async destroyService(serviceName) {
104
+ if (!this.services_.has(serviceName))
105
+ return;
106
+ const proc = this.services_.get(serviceName);
107
+ this.services_.delete(serviceName);
108
+ await proc.stop();
109
+ }
110
+ /**
111
+ * Async dispose symbol
112
+ */
113
+ async [Symbol.asyncDispose]() {
114
+ await this.destroy();
115
+ }
116
+ constructor() {
117
+ this.services_ = new Map();
118
+ ipcMain.on(UPM.IPCChannel.UPMServiceNewClient, this.onNewClient.bind(this));
119
+ }
120
+ /**
121
+ * Get singleton instance
122
+ */
123
+ static get() {
124
+ if (!this.sInstance_) {
125
+ this.sInstance_ = new UPMMainServiceManager();
126
+ }
127
+ return this.sInstance_;
128
+ }
129
+ }
130
+ /**
131
+ * Singleton instance
132
+ *
133
+ * @private
134
+ */
135
+ UPMMainServiceManager.sInstance_ = null;
136
+ export const upmMainServiceManager = UPMMainServiceManager.get();
137
+ export default upmMainServiceManager;
138
+ //# sourceMappingURL=UPMMainServiceManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UPMMainServiceManager.js","sourceRoot":"","sources":["../../../src/main/UPMMainServiceManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./UPMMainServiceManager";
2
+ export * from "./UPMMainService";
@@ -0,0 +1,3 @@
1
+ export * from "./UPMMainServiceManager";
2
+ export * from "./UPMMainService";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/main/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA"}