@3fv/electron-utility-process-manager 1.0.2 → 1.0.4
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.
- package/README.md +39 -26
- package/examples/lib-examples/simple/simple-main.js +9 -2
- package/examples/lib-examples/simple/simple-main.js.map +1 -1
- package/examples/lib-examples/simple/simple-renderer.js +1 -1
- package/examples/lib-examples/simple/simple-renderer.js.map +1 -1
- package/lib/cjs/common/types.d.ts +24 -2
- package/lib/cjs/common/types.js.map +1 -1
- package/lib/cjs/main/UPMMainService.d.ts +109 -28
- package/lib/cjs/main/UPMMainService.js +249 -136
- package/lib/cjs/main/UPMMainService.js.map +1 -1
- package/lib/cjs/main/UPMMainServiceManager.d.ts +2 -1
- package/lib/cjs/main/UPMMainServiceManager.js +4 -4
- package/lib/cjs/main/UPMMainServiceManager.js.map +1 -1
- package/lib/mjs/common/types.d.ts +24 -2
- package/lib/mjs/common/types.js.map +1 -1
- package/lib/mjs/main/UPMMainService.d.ts +109 -28
- package/lib/mjs/main/UPMMainService.js +251 -138
- package/lib/mjs/main/UPMMainService.js.map +1 -1
- package/lib/mjs/main/UPMMainServiceManager.d.ts +2 -1
- package/lib/mjs/main/UPMMainServiceManager.js +4 -4
- package/lib/mjs/main/UPMMainServiceManager.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
#
|
|
2
|
-
---
|
|
1
|
+
# Electron UPM (Utility Process Manager)
|
|
3
2
|
|
|
4
3
|
## Overview
|
|
5
4
|
|
|
6
|
-
`@3fv/electron-utility-process-manager` manages `1..n` `Electron.utilityProcess` instances/services/processes via a
|
|
7
|
-
single library & provides fully typed client facades automatically
|
|
5
|
+
`@3fv/electron-utility-process-manager` manages `1..n` `Electron.utilityProcess` instances/services/processes via a
|
|
6
|
+
single library & provides fully typed client facades automatically
|
|
8
7
|
|
|
9
8
|
## Install
|
|
10
9
|
|
|
@@ -14,21 +13,42 @@ yarn add @3fv/electron-utility-process-manager
|
|
|
14
13
|
|
|
15
14
|
## Usage
|
|
16
15
|
|
|
17
|
-
This library integrates into the `node`, `main` and `renderer` processes to provide
|
|
16
|
+
This library integrates into the `node`, `main` and `renderer` processes to provide
|
|
18
17
|
transparent access from any process to a `node` (`Electron.utilityProcess`).
|
|
19
18
|
|
|
20
|
-
### Possible Use-cases
|
|
19
|
+
### Possible Use-cases
|
|
21
20
|
|
|
22
21
|
- main -> node
|
|
23
22
|
- renderer -> node
|
|
24
23
|
- node -> node
|
|
25
24
|
|
|
25
|
+
|
|
26
|
+
### Debugging Config (Applies to all examples)
|
|
27
|
+
|
|
28
|
+
In order to debug a service/utility process, simply add the following to
|
|
29
|
+
the `options` argument passed to `createService`
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// ENABLE DEBUGGING (standard node.js inspect config)
|
|
33
|
+
const options = {
|
|
34
|
+
inspect: {
|
|
35
|
+
break: true,
|
|
36
|
+
port: 9449
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
upmMainServiceManager.createService("example-service", "/path/to/entry.js", options)
|
|
40
|
+
```
|
|
41
|
+
> NOTE: If `break` is `true` the utility/service process
|
|
42
|
+
> will not be paused until a debugger is attached.
|
|
43
|
+
> the process will print a chrome debugging url (i.e. `ws://`)
|
|
44
|
+
|
|
45
|
+
|
|
26
46
|
### Examples
|
|
27
47
|
|
|
28
48
|
#### Simple Example
|
|
29
49
|
|
|
30
50
|
> NOTE: The simple example uses the bare-bones approach
|
|
31
|
-
> and basically avoids typing wherever possible.
|
|
51
|
+
> and basically avoids typing wherever possible. For a
|
|
32
52
|
> fully typed example, checkout the [complex example](#complex-example)
|
|
33
53
|
|
|
34
54
|
##### Node/Utility Process ([simple-node.ts](examples/simple/simple-node.ts))
|
|
@@ -41,13 +61,13 @@ upmNodeProcess.addEventHandler((clientId, port, payload) => {
|
|
|
41
61
|
return true
|
|
42
62
|
})
|
|
43
63
|
|
|
44
|
-
upmNodeProcess.addRequestHandler("ping", async (type, messageId, what:
|
|
64
|
+
upmNodeProcess.addRequestHandler("ping", async (type, messageId, what:string) => {
|
|
45
65
|
console.info(`Ping request received (${messageId})`, what)
|
|
46
66
|
return `pong: ${what}`
|
|
47
67
|
})
|
|
48
68
|
```
|
|
49
69
|
|
|
50
|
-
##### Main Process ([simple-main.ts](examples/simple/simple-main.ts))
|
|
70
|
+
##### Main Process ([simple-main.ts](examples/simple/simple-main.ts))
|
|
51
71
|
|
|
52
72
|
```typescript
|
|
53
73
|
import { app, BrowserWindow } from "electron"
|
|
@@ -55,15 +75,14 @@ import { UPM } from "@3fv/electron-utility-process-manager"
|
|
|
55
75
|
import type { UPMMainService } from "@3fv/electron-utility-process-manager/main"
|
|
56
76
|
import Path from "path"
|
|
57
77
|
|
|
58
|
-
let upmService:
|
|
78
|
+
let upmService:UPMMainService = null
|
|
59
79
|
|
|
60
80
|
async function start() {
|
|
61
81
|
const upm = await import("@3fv/electron-utility-process-manager/main")
|
|
62
82
|
const upmManager = upm.upmMainServiceManager
|
|
63
83
|
|
|
64
84
|
Object.assign(global, {
|
|
65
|
-
upm,
|
|
66
|
-
upmManager
|
|
85
|
+
upm, upmManager
|
|
67
86
|
})
|
|
68
87
|
|
|
69
88
|
console.info("UPM manager ready, now creating service", upmManager)
|
|
@@ -74,8 +93,7 @@ async function start() {
|
|
|
74
93
|
|
|
75
94
|
const clientPort = upmManager.createMainChannel("simple", "main-channel-01")
|
|
76
95
|
console.info("Start the client port")
|
|
77
|
-
if (UPM.isMessagePort(clientPort))
|
|
78
|
-
clientPort.start()
|
|
96
|
+
if (UPM.isMessagePort(clientPort)) clientPort.start()
|
|
79
97
|
|
|
80
98
|
console.info("Post a message directly")
|
|
81
99
|
clientPort.postMessage({
|
|
@@ -90,7 +108,7 @@ async function start() {
|
|
|
90
108
|
const client = upmManager.createMainClient("simple", "main-client-01")
|
|
91
109
|
console.info(`Send request/response: ping`)
|
|
92
110
|
|
|
93
|
-
const pongResult = await client.executeRequest("ping",
|
|
111
|
+
const pongResult = await client.executeRequest("ping", "main")
|
|
94
112
|
console.info(`Received pong response`, pongResult)
|
|
95
113
|
|
|
96
114
|
await createWindow()
|
|
@@ -110,15 +128,10 @@ async function start() {
|
|
|
110
128
|
*
|
|
111
129
|
* @returns {Promise<void>}
|
|
112
130
|
*/
|
|
113
|
-
async function createWindow():
|
|
131
|
+
async function createWindow():Promise<void> {
|
|
114
132
|
const mainWindow = new BrowserWindow({
|
|
115
|
-
width: 1000,
|
|
116
|
-
|
|
117
|
-
webPreferences: {
|
|
118
|
-
contextIsolation: false,
|
|
119
|
-
nodeIntegration: true,
|
|
120
|
-
sandbox: false,
|
|
121
|
-
devTools: true
|
|
133
|
+
width: 1000, height: 1000, webPreferences: {
|
|
134
|
+
contextIsolation: false, nodeIntegration: true, sandbox: false, devTools: true
|
|
122
135
|
}
|
|
123
136
|
})
|
|
124
137
|
|
|
@@ -144,13 +157,13 @@ import UPMRendererClientFactory from "@3fv/electron-utility-process-manager/rend
|
|
|
144
157
|
document.querySelector("#root").innerHTML = `simple-renderer-example`
|
|
145
158
|
|
|
146
159
|
async function simpleExampleUPM() {
|
|
147
|
-
const client = await UPMRendererClientFactory.createClient("simple"
|
|
148
|
-
const result = await client.executeRequest("ping",
|
|
160
|
+
const client = await UPMRendererClientFactory.createClient("simple", `${process.type}-01`)
|
|
161
|
+
const result = await client.executeRequest("ping", process.type)
|
|
149
162
|
console.info(`Result: ${result}`)
|
|
150
163
|
}
|
|
151
164
|
|
|
152
165
|
simpleExampleUPM()
|
|
153
|
-
|
|
166
|
+
.catch(err => console.error(`renderer error: ${err.message}`, err))
|
|
154
167
|
|
|
155
168
|
export {}
|
|
156
169
|
```
|
|
@@ -66,7 +66,14 @@ async function start() {
|
|
|
66
66
|
upmManager
|
|
67
67
|
});
|
|
68
68
|
log.info("UPM manager ready, now creating service", upmManager);
|
|
69
|
-
|
|
69
|
+
const entryFile = path_1.default.join(__dirname, "simple-node.js");
|
|
70
|
+
upmService = await upmManager.createService("simple", entryFile, {
|
|
71
|
+
// ENABLE DEBUGGING (standard node.js inspect config)
|
|
72
|
+
// inspect: {
|
|
73
|
+
// break: true,
|
|
74
|
+
// port: 9449
|
|
75
|
+
// }
|
|
76
|
+
});
|
|
70
77
|
log.info("UPM service ready");
|
|
71
78
|
upmService.sendEvent("test123");
|
|
72
79
|
const clientPort = upmManager.createMainChannel("simple", "main-channel-01");
|
|
@@ -83,7 +90,7 @@ async function start() {
|
|
|
83
90
|
log.info(`Creating port client`);
|
|
84
91
|
const client = upmManager.createMainClient("simple", "main-client-01");
|
|
85
92
|
log.info(`Send request/response: ping`);
|
|
86
|
-
const pongResult = await client.executeRequest("ping",
|
|
93
|
+
const pongResult = await client.executeRequest("ping", "main");
|
|
87
94
|
log.info(`Received pong response`, pongResult);
|
|
88
95
|
log.info(`Create the window/renderer`);
|
|
89
96
|
await createWindow();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-main.js","sourceRoot":"","sources":["../../simple/simple-main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uEAAuE;AACvE,uCAA6C;AAC7C,4FAA2D;AAG3D,oDAA2B;AAC3B,gDAAuB;AAEvB,MAAM,GAAG,GAAG,gBAAM,CAAC,YAAY,EAAE,CAAA;AACjC,IAAI,UAAU,GAAmB,IAAI,CAAA;AAErC;;;;;;;;GAQG;AACH,KAAK,UAAU,YAAY;IACzB,MAAM,UAAU,GAAG,IAAI,wBAAa,CAAC;QACnC,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE;YACd,gBAAgB,EAAE,KAAK;YACvB,eAAe,EAAE,IAAI;YACrB,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,IAAI;SACf;KACF,CAAC,CAAA;IAEF,uBAAuB;IACvB,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAA;IACxG,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IAEtD,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAGrC,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,MAAM,GAAG,GAAG,wDAAa,4CAA4C,GAAC,CAAA;IACtE,MAAM,UAAU,GAAG,GAAG,CAAC,qBAAqB,CAAA;IAE5C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QACpB,GAAG;QACH,UAAU;KACX,CAAC,CAAA;IAEF,GAAG,CAAC,IAAI,CAAC,yCAAyC,EAAE,UAAU,CAAC,CAAA;IAC/D,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"simple-main.js","sourceRoot":"","sources":["../../simple/simple-main.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ const log = tracer_1.default.colorConsole();
|
|
|
9
9
|
document.querySelector("#root").innerHTML = `simple-renderer-example`;
|
|
10
10
|
async function simpleExampleUPM() {
|
|
11
11
|
const client = await renderer_1.default.createClient("simple", `${process.type}-01`);
|
|
12
|
-
const result = await client.executeRequest("ping",
|
|
12
|
+
const result = await client.executeRequest("ping", process.type);
|
|
13
13
|
log.info(`Result: ${result}`);
|
|
14
14
|
}
|
|
15
15
|
simpleExampleUPM()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-renderer.js","sourceRoot":"","sources":["../../simple/simple-renderer.ts"],"names":[],"mappings":";;;;;AAAA,8FAAqF;AACrF,oDAA2B;AAE3B,MAAM,GAAG,GAAG,gBAAM,CAAC,YAAY,EAAE,CAAA;AAEjC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,yBAAyB,CAAA;AAErE,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,kBAAwB,CAAC,YAAY,CAAC,QAAQ,EAAC,GAAG,OAAO,CAAC,IAAI,KAAK,CAAC,CAAA;IACzF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"simple-renderer.js","sourceRoot":"","sources":["../../simple/simple-renderer.ts"],"names":[],"mappings":";;;;;AAAA,8FAAqF;AACrF,oDAA2B;AAE3B,MAAM,GAAG,GAAG,gBAAM,CAAC,YAAY,EAAE,CAAA;AAEjC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,yBAAyB,CAAA;AAErE,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,kBAAwB,CAAC,YAAY,CAAC,QAAQ,EAAC,GAAG,OAAO,CAAC,IAAI,KAAK,CAAC,CAAA;IACzF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,GAAG,CAAC,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,gBAAgB,EAAE;KACf,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA"}
|
|
@@ -21,7 +21,7 @@ export type MessageRequestMap = {};
|
|
|
21
21
|
export type MessageRequestNames<ReqMap extends MessageRequestMap> = keyof ReqMap;
|
|
22
22
|
export type MessageRequestFn<ReqMap extends MessageRequestMap, Name extends MessageRequestNames<ReqMap>> = ReqMap[Name] extends MessageRequestFnBase ? ReqMap[Name] : never;
|
|
23
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]
|
|
24
|
+
export type MessageRequestReturnType<ReqMap extends MessageRequestMap, Name extends MessageRequestNames<ReqMap>> = ReqMap[Name] extends MessageRequestFnBase ? Awaited<ReturnType<ReqMap[Name]>> : never;
|
|
25
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
26
|
type: Type;
|
|
27
27
|
kind: MessageKind;
|
|
@@ -35,7 +35,7 @@ export interface NodeEnvelope<Payload extends {} = any> {
|
|
|
35
35
|
channel: IPCChannel;
|
|
36
36
|
payload: Payload;
|
|
37
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) => R
|
|
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
39
|
export type NodeMessage<ReqMap extends MessageRequestMap = any, Type extends MessageRequestNames<ReqMap> = MessageRequestNames<ReqMap>> = NodeEnvelope<Message<ReqMap, Type>>;
|
|
40
40
|
export interface PendingRequestMessage<ReqMap extends MessageRequestMap = any, Type extends MessageRequestNames<ReqMap> = MessageRequestNames<ReqMap>, R extends MessageRequestReturnType<ReqMap, Type> = MessageRequestReturnType<ReqMap, Type>> {
|
|
41
41
|
deferred: Deferred<R>;
|
|
@@ -46,4 +46,26 @@ export interface PendingRequestMessage<ReqMap extends MessageRequestMap = any, T
|
|
|
46
46
|
* @returns true if payload was handled, false if not
|
|
47
47
|
*/
|
|
48
48
|
export type EventHandler = (clientId: string, port: Port, payload: any) => boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Port of any kind
|
|
51
|
+
*/
|
|
49
52
|
export type Port = MessagePort | Electron.MessagePortMain | Electron.ParentPort | UtilityProcess;
|
|
53
|
+
/**
|
|
54
|
+
* Debugging & Inspection config
|
|
55
|
+
*/
|
|
56
|
+
export type ServiceInspectConfig = number | {
|
|
57
|
+
port: number;
|
|
58
|
+
break?: boolean;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Configuration to use when creating/launching
|
|
62
|
+
* a service (`Electron.UtilityProcess`)
|
|
63
|
+
*/
|
|
64
|
+
export interface CreateServiceConfig {
|
|
65
|
+
serviceName: string;
|
|
66
|
+
inspect: false | ServiceInspectConfig;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Optional/Partial `CreateServiceConfig`
|
|
70
|
+
*/
|
|
71
|
+
export type CreateServiceOptions = Partial<CreateServiceConfig>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":";;;AAIa,QAAA,QAAQ,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAAA;AAElD,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;AACvB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAED,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,qDAAuC,CAAA;IACvC,yDAA2C,CAAA;AAC7C,CAAC,EAHW,UAAU,0BAAV,UAAU,QAGrB;AAED,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,8DAA2C,CAAA;IAC3C,2EAAwD,CAAA;AAC1D,CAAC,EAHW,eAAe,+BAAf,eAAe,QAG1B"}
|
|
@@ -1,22 +1,35 @@
|
|
|
1
1
|
import { MessagePortMain } from "electron";
|
|
2
2
|
import * as UPM from "../common/index.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Contains & Manages a `Utility/Process`
|
|
5
|
+
* providing simplified messaging & event
|
|
6
|
+
* propagation.
|
|
7
|
+
*/
|
|
7
8
|
export declare class UPMMainService<ReqMap extends UPM.MessageRequestMap = any, MType extends UPM.MessageRequestNames<ReqMap> = UPM.MessageRequestNames<ReqMap>> implements UPM.IMessageClient<ReqMap, MType> {
|
|
8
9
|
readonly serviceName: string;
|
|
9
10
|
readonly entryFile: string;
|
|
11
|
+
/**
|
|
12
|
+
* As this container/wrapper implements
|
|
13
|
+
* `IMessageClient`, it needs to provide
|
|
14
|
+
* a `clientId`, which is constant in the
|
|
15
|
+
* main process
|
|
16
|
+
*/
|
|
10
17
|
readonly clientId: string;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Send an event as `fire-and-forget`
|
|
20
|
+
*
|
|
21
|
+
* @param data
|
|
22
|
+
* @param port
|
|
23
|
+
*/
|
|
24
|
+
sendEvent(data: any, port?: UPM.Port): void;
|
|
25
|
+
/**
|
|
26
|
+
* Send request
|
|
27
|
+
*
|
|
28
|
+
* @param type
|
|
29
|
+
* @param args
|
|
30
|
+
*/
|
|
31
|
+
executeRequest<Type extends MType, R extends UPM.MessageRequestReturnType<ReqMap, Type> = UPM.MessageRequestReturnType<ReqMap, Type>>(type: Type, ...args: UPM.MessageRequestParams<ReqMap, Type>): Promise<R>;
|
|
32
|
+
close(): void;
|
|
20
33
|
/**
|
|
21
34
|
* Resolves when ready
|
|
22
35
|
*
|
|
@@ -27,7 +40,15 @@ export declare class UPMMainService<ReqMap extends UPM.MessageRequestMap = any,
|
|
|
27
40
|
* Return a simple proxy facade wrapping
|
|
28
41
|
* `executeRequest` into individual methods
|
|
29
42
|
*/
|
|
30
|
-
getServiceClient(): IServiceClient<ReqMap, MType>;
|
|
43
|
+
getServiceClient(): UPM.IServiceClient<ReqMap, MType>;
|
|
44
|
+
private readonly config_;
|
|
45
|
+
private readyDeferred_;
|
|
46
|
+
private killDeferred_;
|
|
47
|
+
private messageIdSeq_;
|
|
48
|
+
private childProcess_;
|
|
49
|
+
private pendingMessages_;
|
|
50
|
+
private messageChannels_;
|
|
51
|
+
private onServiceExit;
|
|
31
52
|
/**
|
|
32
53
|
* Returned client side port (for Renderer)
|
|
33
54
|
* @param clientId
|
|
@@ -38,33 +59,93 @@ export declare class UPMMainService<ReqMap extends UPM.MessageRequestMap = any,
|
|
|
38
59
|
* (useful to avoid congestion on default child_process channel)
|
|
39
60
|
*
|
|
40
61
|
* @param {string} clientId
|
|
41
|
-
* @returns {UPM.MessagePortClient
|
|
62
|
+
* @returns {UPM.MessagePortClient}
|
|
42
63
|
*/
|
|
43
64
|
createMainClient(clientId: string): UPM.MessagePortClient<ReqMap, MType>;
|
|
65
|
+
/**
|
|
66
|
+
* Service is still in a healthy/running/runnable state
|
|
67
|
+
*/
|
|
68
|
+
get isRunning(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Stop the service (kill)
|
|
71
|
+
*/
|
|
72
|
+
stop(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Resource management & cleanup
|
|
75
|
+
*/
|
|
76
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Initialize the service
|
|
79
|
+
*
|
|
80
|
+
* @private
|
|
81
|
+
*/
|
|
82
|
+
private init;
|
|
83
|
+
/**
|
|
84
|
+
* OnMessage really only handles `results` from
|
|
85
|
+
* `executeRequest(...)`; this may be expanded in
|
|
86
|
+
* the future
|
|
87
|
+
*
|
|
88
|
+
* @param payload
|
|
89
|
+
* @private
|
|
90
|
+
*/
|
|
91
|
+
private onMessage;
|
|
92
|
+
/**
|
|
93
|
+
* This handler is currently unused, but
|
|
94
|
+
* could be attached to a `MessagePort.on('close')`
|
|
95
|
+
* event
|
|
96
|
+
*
|
|
97
|
+
* @param id
|
|
98
|
+
* @param channel
|
|
99
|
+
* @private
|
|
100
|
+
*/
|
|
44
101
|
private onPortClose;
|
|
45
|
-
private closeMessageChannel;
|
|
46
|
-
close(): void;
|
|
47
102
|
/**
|
|
48
|
-
*
|
|
103
|
+
* Close a message channel
|
|
49
104
|
*
|
|
50
|
-
* @param
|
|
51
|
-
* @param
|
|
105
|
+
* @param id
|
|
106
|
+
* @param channel
|
|
107
|
+
* @private
|
|
52
108
|
*/
|
|
53
|
-
|
|
109
|
+
private closeMessageChannel;
|
|
54
110
|
/**
|
|
55
|
-
*
|
|
111
|
+
* Kill the service
|
|
56
112
|
*
|
|
57
|
-
* @
|
|
58
|
-
* @param args
|
|
113
|
+
* @private
|
|
59
114
|
*/
|
|
60
|
-
executeRequest<Type extends MType, R extends UPM.MessageRequestReturnType<ReqMap, Type> = UPM.MessageRequestReturnType<ReqMap, Type>>(type: Type, ...args: UPM.MessageRequestParams<ReqMap, Type>): Promise<R>;
|
|
61
|
-
stop(): Promise<void>;
|
|
62
115
|
private kill;
|
|
116
|
+
/**
|
|
117
|
+
* Close all message channels
|
|
118
|
+
*
|
|
119
|
+
* @private
|
|
120
|
+
*/
|
|
63
121
|
private removeAllMessageChannels;
|
|
122
|
+
/**
|
|
123
|
+
* Remove all pending messages
|
|
124
|
+
*
|
|
125
|
+
* @private
|
|
126
|
+
*/
|
|
64
127
|
private cancelAllPendingMessages;
|
|
65
|
-
|
|
128
|
+
/**
|
|
129
|
+
* Remove a pending message from the queue,
|
|
130
|
+
* whether settled or not
|
|
131
|
+
*
|
|
132
|
+
* @param messageId
|
|
133
|
+
* @private
|
|
134
|
+
*/
|
|
66
135
|
private removePendingMessage;
|
|
136
|
+
/**
|
|
137
|
+
* Generate next message id
|
|
138
|
+
*
|
|
139
|
+
* @private
|
|
140
|
+
*/
|
|
67
141
|
private generateMessageId;
|
|
68
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Construct a new service
|
|
144
|
+
*
|
|
145
|
+
* @param serviceName
|
|
146
|
+
* @param entryFile
|
|
147
|
+
* @param options
|
|
148
|
+
*/
|
|
149
|
+
constructor(serviceName: string, entryFile: string, options?: UPM.CreateServiceOptions);
|
|
69
150
|
}
|
|
70
151
|
export default UPMMainService;
|