@delight-rpc/child-process 0.7.0 → 0.7.2
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/lib/client.js +20 -10
- package/lib/client.js.map +1 -1
- package/lib/server.js +10 -5
- package/lib/server.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +24 -12
- package/src/server.ts +11 -5
package/lib/client.js
CHANGED
|
@@ -5,7 +5,8 @@ import { raceAbortSignals, timeoutSignal, withAbortSignal } from 'extra-abort';
|
|
|
5
5
|
import { isntUndefined } from '@blackglory/prelude';
|
|
6
6
|
export function createClient(process, { parameterValidators, expectedVersion, channel, timeout } = {}) {
|
|
7
7
|
const pendings = new Map();
|
|
8
|
-
process.on('message',
|
|
8
|
+
process.on('message', handleMessage);
|
|
9
|
+
process.on('disconnect', abortAllPendings);
|
|
9
10
|
const client = DelightRPC.createClient(async function send(request, signal) {
|
|
10
11
|
const res = new Deferred();
|
|
11
12
|
pendings.set(request.id, res);
|
|
@@ -31,13 +32,17 @@ export function createClient(process, { parameterValidators, expectedVersion, ch
|
|
|
31
32
|
});
|
|
32
33
|
return [client, close];
|
|
33
34
|
function close() {
|
|
34
|
-
process.off('message',
|
|
35
|
-
|
|
35
|
+
process.off('message', handleMessage);
|
|
36
|
+
process.off('disconnect', abortAllPendings);
|
|
37
|
+
abortAllPendings();
|
|
38
|
+
}
|
|
39
|
+
function abortAllPendings() {
|
|
40
|
+
for (const deferred of pendings.values()) {
|
|
36
41
|
deferred.reject(new ClientClosed());
|
|
37
|
-
pendings.delete(key);
|
|
38
42
|
}
|
|
43
|
+
pendings.clear();
|
|
39
44
|
}
|
|
40
|
-
function
|
|
45
|
+
function handleMessage(res) {
|
|
41
46
|
var _a;
|
|
42
47
|
if (DelightRPC.isResult(res) || DelightRPC.isError(res)) {
|
|
43
48
|
(_a = pendings.get(res.id)) === null || _a === void 0 ? void 0 : _a.resolve(res);
|
|
@@ -46,7 +51,8 @@ export function createClient(process, { parameterValidators, expectedVersion, ch
|
|
|
46
51
|
}
|
|
47
52
|
export function createBatchClient(process, { expectedVersion, channel, timeout } = {}) {
|
|
48
53
|
const pendings = new Map();
|
|
49
|
-
process.on('message',
|
|
54
|
+
process.on('message', handleMessage);
|
|
55
|
+
process.on('disconnect', abortAllPendings);
|
|
50
56
|
const client = new DelightRPC.BatchClient(async function send(request) {
|
|
51
57
|
const res = new Deferred();
|
|
52
58
|
pendings.set(request.id, res);
|
|
@@ -70,13 +76,17 @@ export function createBatchClient(process, { expectedVersion, channel, timeout }
|
|
|
70
76
|
});
|
|
71
77
|
return [client, close];
|
|
72
78
|
function close() {
|
|
73
|
-
process.off('message',
|
|
74
|
-
|
|
79
|
+
process.off('message', handleMessage);
|
|
80
|
+
process.off('disconnect', abortAllPendings);
|
|
81
|
+
abortAllPendings();
|
|
82
|
+
}
|
|
83
|
+
function abortAllPendings() {
|
|
84
|
+
for (const deferred of pendings.values()) {
|
|
75
85
|
deferred.reject(new ClientClosed());
|
|
76
|
-
pendings.delete(key);
|
|
77
86
|
}
|
|
87
|
+
pendings.clear();
|
|
78
88
|
}
|
|
79
|
-
function
|
|
89
|
+
function handleMessage(res) {
|
|
80
90
|
var _a;
|
|
81
91
|
if (DelightRPC.isError(res) || DelightRPC.isBatchResponse(res)) {
|
|
82
92
|
(_a = pendings.get(res.id)) === null || _a === void 0 ? void 0 : _a.resolve(res);
|
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,UAAU,YAAY,CAC1B,OAAsC,EACtC,EAAE,mBAAmB,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,KAKpD,EAAE;IAEN,MAAM,QAAQ,GAA8C,IAAI,GAAG,EAAE,CAAA;IAErE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/lib/server.js
CHANGED
|
@@ -4,15 +4,20 @@ import { AbortController } from 'extra-abort';
|
|
|
4
4
|
import { HashMap } from '@blackglory/structures';
|
|
5
5
|
export function createServer(api, process, { parameterValidators, version, channel, ownPropsOnly } = {}) {
|
|
6
6
|
const channelIdToController = new HashMap(({ channel, id }) => JSON.stringify([channel, id]));
|
|
7
|
-
process.on('message',
|
|
8
|
-
process.on('disconnect',
|
|
7
|
+
process.on('message', handleMessage);
|
|
8
|
+
process.on('disconnect', abortAllPendings);
|
|
9
|
+
return () => {
|
|
10
|
+
process.off('message', handleMessage);
|
|
11
|
+
process.off('disconnect', abortAllPendings);
|
|
12
|
+
abortAllPendings();
|
|
13
|
+
};
|
|
14
|
+
function abortAllPendings() {
|
|
9
15
|
for (const controller of channelIdToController.values()) {
|
|
10
16
|
controller.abort();
|
|
11
17
|
}
|
|
12
18
|
channelIdToController.clear();
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async function handler(message) {
|
|
19
|
+
}
|
|
20
|
+
async function handleMessage(message) {
|
|
16
21
|
var _a;
|
|
17
22
|
if (DelightRPC.isRequest(message) || DelightRPC.isBatchRequest(message)) {
|
|
18
23
|
const controller = new AbortController();
|
package/lib/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD,MAAM,UAAU,YAAY,CAC1B,GAAsC,EACtC,OAAsC,EACtC,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,KAKjD,EAAE;IAEN,MAAM,qBAAqB,GAMvB,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAEnE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD,MAAM,UAAU,YAAY,CAC1B,GAAsC,EACtC,OAAsC,EACtC,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,KAKjD,EAAE;IAEN,MAAM,qBAAqB,GAMvB,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAEnE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;IACpC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;IAC1C,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;QAC3C,gBAAgB,EAAE,CAAA;IACpB,CAAC,CAAA;IAED,SAAS,gBAAgB;QACvB,KAAK,MAAM,UAAU,IAAI,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC;YACxD,UAAU,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;QAED,qBAAqB,CAAC,KAAK,EAAE,CAAA;IAC/B,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,OAAgB;;QAC3C,IAAI,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;YACxC,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YAE9C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAC5C,GAAG,EACH,OAAO,EACP;oBACE,mBAAmB;oBACnB,OAAO;oBACP,OAAO;oBACP,YAAY;oBACZ,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CACF,CAAA;gBAED,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAErB,OAAO,CAAC,IAAK,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;wBAC1B,IAAI,GAAG,EAAE,CAAC;4BACR,IAAK,GAA6B,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;gCACrE,IAAI,EAAE,CAAA;4BACR,CAAC;iCAAM,CAAC;gCACN,MAAM,GAAG,CAAA;4BACX,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9C,MAAA,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,0CAAE,KAAK,EAAE,CAAA;gBAC3C,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -17,7 +17,8 @@ export function createClient<IAPI extends object>(
|
|
|
17
17
|
): [client: DelightRPC.ClientProxy<IAPI>, close: () => void] {
|
|
18
18
|
const pendings: Map<string, Deferred<IResponse<unknown>>> = new Map()
|
|
19
19
|
|
|
20
|
-
process.on('message',
|
|
20
|
+
process.on('message', handleMessage)
|
|
21
|
+
process.on('disconnect', abortAllPendings)
|
|
21
22
|
|
|
22
23
|
const client = DelightRPC.createClient<IAPI>(
|
|
23
24
|
async function send(request, signal) {
|
|
@@ -49,16 +50,21 @@ export function createClient<IAPI extends object>(
|
|
|
49
50
|
|
|
50
51
|
return [client, close]
|
|
51
52
|
|
|
52
|
-
function close() {
|
|
53
|
-
process.off('message',
|
|
53
|
+
function close(): void {
|
|
54
|
+
process.off('message', handleMessage)
|
|
55
|
+
process.off('disconnect', abortAllPendings)
|
|
56
|
+
abortAllPendings()
|
|
57
|
+
}
|
|
54
58
|
|
|
55
|
-
|
|
59
|
+
function abortAllPendings(): void {
|
|
60
|
+
for (const deferred of pendings.values()) {
|
|
56
61
|
deferred.reject(new ClientClosed())
|
|
57
|
-
pendings.delete(key)
|
|
58
62
|
}
|
|
63
|
+
|
|
64
|
+
pendings.clear()
|
|
59
65
|
}
|
|
60
66
|
|
|
61
|
-
function
|
|
67
|
+
function handleMessage(res: unknown): void {
|
|
62
68
|
if (DelightRPC.isResult(res) || DelightRPC.isError(res)) {
|
|
63
69
|
pendings.get(res.id)?.resolve(res)
|
|
64
70
|
}
|
|
@@ -78,7 +84,8 @@ export function createBatchClient<DataType>(
|
|
|
78
84
|
, Deferred<IError | IBatchResponse<unknown>>
|
|
79
85
|
> = new Map()
|
|
80
86
|
|
|
81
|
-
process.on('message',
|
|
87
|
+
process.on('message', handleMessage)
|
|
88
|
+
process.on('disconnect', abortAllPendings)
|
|
82
89
|
|
|
83
90
|
const client = new DelightRPC.BatchClient(
|
|
84
91
|
async function send(request: IBatchRequest<unknown>) {
|
|
@@ -111,16 +118,21 @@ export function createBatchClient<DataType>(
|
|
|
111
118
|
|
|
112
119
|
return [client, close]
|
|
113
120
|
|
|
114
|
-
function close() {
|
|
115
|
-
process.off('message',
|
|
121
|
+
function close(): void {
|
|
122
|
+
process.off('message', handleMessage)
|
|
123
|
+
process.off('disconnect', abortAllPendings)
|
|
124
|
+
abortAllPendings()
|
|
125
|
+
}
|
|
116
126
|
|
|
117
|
-
|
|
127
|
+
function abortAllPendings(): void {
|
|
128
|
+
for (const deferred of pendings.values()) {
|
|
118
129
|
deferred.reject(new ClientClosed())
|
|
119
|
-
pendings.delete(key)
|
|
120
130
|
}
|
|
131
|
+
|
|
132
|
+
pendings.clear()
|
|
121
133
|
}
|
|
122
134
|
|
|
123
|
-
function
|
|
135
|
+
function handleMessage(res: unknown): void {
|
|
124
136
|
if (DelightRPC.isError(res) || DelightRPC.isBatchResponse(res)) {
|
|
125
137
|
pendings.get(res.id)?.resolve(res)
|
|
126
138
|
}
|
package/src/server.ts
CHANGED
|
@@ -22,17 +22,23 @@ export function createServer<IAPI extends object>(
|
|
|
22
22
|
, AbortController
|
|
23
23
|
> = new HashMap(({ channel, id }) => JSON.stringify([channel, id]))
|
|
24
24
|
|
|
25
|
-
process.on('message',
|
|
26
|
-
process.on('disconnect',
|
|
25
|
+
process.on('message', handleMessage)
|
|
26
|
+
process.on('disconnect', abortAllPendings)
|
|
27
|
+
return () => {
|
|
28
|
+
process.off('message', handleMessage)
|
|
29
|
+
process.off('disconnect', abortAllPendings)
|
|
30
|
+
abortAllPendings()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function abortAllPendings(): void {
|
|
27
34
|
for (const controller of channelIdToController.values()) {
|
|
28
35
|
controller.abort()
|
|
29
36
|
}
|
|
30
37
|
|
|
31
38
|
channelIdToController.clear()
|
|
32
|
-
}
|
|
33
|
-
return () => process.off('message', handler)
|
|
39
|
+
}
|
|
34
40
|
|
|
35
|
-
async function
|
|
41
|
+
async function handleMessage(message: unknown): Promise<void> {
|
|
36
42
|
if (DelightRPC.isRequest(message) || DelightRPC.isBatchRequest(message)) {
|
|
37
43
|
const controller = new AbortController()
|
|
38
44
|
channelIdToController.set(message, controller)
|