@scrypted/server 0.115.20 → 0.115.21
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/dist/deferred.d.ts +7 -0
- package/dist/deferred.js +30 -0
- package/dist/deferred.js.map +1 -0
- package/dist/plugin/plugin-remote-worker.js +165 -9
- package/dist/plugin/plugin-remote-worker.js.map +1 -1
- package/dist/plugin/runtime/node-thread-worker.d.ts +5 -2
- package/dist/plugin/runtime/node-thread-worker.js +55 -9
- package/dist/plugin/runtime/node-thread-worker.js.map +1 -1
- package/dist/rpc-buffer-serializer.js +2 -0
- package/dist/rpc-buffer-serializer.js.map +1 -1
- package/dist/scrypted-plugin-main.js +3 -12
- package/dist/scrypted-plugin-main.js.map +1 -1
- package/package.json +1 -1
- package/src/deferred.ts +25 -0
- package/src/plugin/plugin-remote-worker.ts +186 -9
- package/src/plugin/runtime/node-thread-worker.ts +69 -10
- package/src/rpc-buffer-serializer.ts +2 -0
- package/src/scrypted-plugin-main.ts +3 -12
package/dist/deferred.js
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.Deferred = void 0;
|
4
|
+
class Deferred {
|
5
|
+
finished = false;
|
6
|
+
resolve;
|
7
|
+
reject;
|
8
|
+
async resolvePromise(p) {
|
9
|
+
try {
|
10
|
+
this.resolve(await p);
|
11
|
+
}
|
12
|
+
catch (e) {
|
13
|
+
this.reject(e);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
promise = new Promise((resolve, reject) => {
|
17
|
+
this.resolve = v => {
|
18
|
+
this.finished = true;
|
19
|
+
resolve(v);
|
20
|
+
return this;
|
21
|
+
};
|
22
|
+
this.reject = e => {
|
23
|
+
this.finished = true;
|
24
|
+
reject(e);
|
25
|
+
return this;
|
26
|
+
};
|
27
|
+
});
|
28
|
+
}
|
29
|
+
exports.Deferred = Deferred;
|
30
|
+
//# sourceMappingURL=deferred.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"deferred.js","sourceRoot":"","sources":["../src/deferred.ts"],"names":[],"mappings":";;;AAAA,MAAa,QAAQ;IACjB,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,CAAsB;IAC7B,MAAM,CAA0B;IAChC,KAAK,CAAC,cAAc,CAAC,CAAa;QAC9B,IAAI,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,CAAU,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE;YACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,OAAO,CAAC,CAAC,CAAC,CAAC;YACX,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,MAAM,CAAC,CAAC,CAAC,CAAC;YACV,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;IACN,CAAC,CAAC,CAAC;CACN;AAxBD,4BAwBC"}
|
@@ -27,6 +27,7 @@ const node_thread_worker_1 = require("./runtime/node-thread-worker");
|
|
27
27
|
const node_worker_common_1 = require("./runtime/node-worker-common");
|
28
28
|
const runtime_host_1 = require("./runtime/runtime-host");
|
29
29
|
const child_process_worker_1 = require("./runtime/child-process-worker");
|
30
|
+
const deferred_1 = require("../deferred");
|
30
31
|
const serverVersion = require('../../package.json').version;
|
31
32
|
function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOptions) {
|
32
33
|
const peer = new rpc_1.RpcPeer('unknown', 'host', peerSend);
|
@@ -93,7 +94,8 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
|
|
93
94
|
const properties = rpc_1.RpcPeer.prepareProxyProperties(value) || {};
|
94
95
|
let clusterEntry = properties.__cluster;
|
95
96
|
// ensure globally stable proxyIds.
|
96
|
-
|
97
|
+
// worker threads will embed their pid and tid in the proxy id for cross worker fast path.
|
98
|
+
const proxyId = clusterEntry?.proxyId || (worker_threads_1.default.isMainThread ? rpc_1.RpcPeer.generateId() : `n-${process.pid}-${worker_threads_1.default.threadId}-${rpc_1.RpcPeer.generateId()}`);
|
97
99
|
// if the cluster entry already exists, check if it belongs to this node.
|
98
100
|
// if it belongs to this node, the entry must also be for this peer.
|
99
101
|
// relying on the liveness/gc of a different peer may cause race conditions.
|
@@ -188,6 +190,142 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
|
|
188
190
|
clusterPeers.set(clusterPeerKey, clusterPeerPromise);
|
189
191
|
return clusterPeerPromise;
|
190
192
|
};
|
193
|
+
async function peerConnectRPCObject(peer, o) {
|
194
|
+
let peerConnectRPCObject = peer.tags['connectRPCObject'];
|
195
|
+
if (!peerConnectRPCObject) {
|
196
|
+
peerConnectRPCObject = peer.getParam('connectRPCObject');
|
197
|
+
peer.tags['connectRPCObject'] = peerConnectRPCObject;
|
198
|
+
}
|
199
|
+
const resolved = await peerConnectRPCObject;
|
200
|
+
return resolved(o);
|
201
|
+
}
|
202
|
+
const tidChannels = new Map();
|
203
|
+
const tidPeers = new Map();
|
204
|
+
function finishTidPeerConnection(tid, port) {
|
205
|
+
const threadPeer = node_thread_worker_1.NodeThreadWorker.createRpcPeer(peer.selfName, 'thread-server', port);
|
206
|
+
// this connecting peer sourceKey (thread id) is used by the OTHER peer (the server)
|
207
|
+
// to determine if it is already connected to THIS peer (the client).
|
208
|
+
const threadPeerKey = `thread:${worker_threads_1.default.threadId}-${tid}`;
|
209
|
+
threadPeer.onProxySerialization = value => onProxySerialization(value, threadPeerKey);
|
210
|
+
const connectRPCObject = async (o) => {
|
211
|
+
const sha256 = (0, cluster_hash_1.computeClusterObjectHash)(o, clusterSecret);
|
212
|
+
if (sha256 !== o.sha256)
|
213
|
+
throw new Error('secret incorrect');
|
214
|
+
return resolveObject(o.proxyId, o.sourceKey);
|
215
|
+
};
|
216
|
+
threadPeer.params['connectRPCObject'] = connectRPCObject;
|
217
|
+
function cleanup(message) {
|
218
|
+
tidChannels.delete(tid);
|
219
|
+
tidPeers.delete(tid);
|
220
|
+
threadPeer.kill(message);
|
221
|
+
}
|
222
|
+
port.on('close', () => cleanup('connection closed.'));
|
223
|
+
port.on('messageerror', () => cleanup('message error.'));
|
224
|
+
return threadPeer;
|
225
|
+
}
|
226
|
+
function connectTidPeer(tid) {
|
227
|
+
let peerPromise = tidPeers.get(tid);
|
228
|
+
if (peerPromise)
|
229
|
+
return peerPromise;
|
230
|
+
let tidDeferred = tidChannels.get(tid);
|
231
|
+
// if the tid port is not available yet, request it.
|
232
|
+
if (!tidDeferred) {
|
233
|
+
tidDeferred = new deferred_1.Deferred();
|
234
|
+
tidChannels.set(tid, tidDeferred);
|
235
|
+
if (mainThreadPort) {
|
236
|
+
// request the connection via the main thread
|
237
|
+
mainThreadPort.postMessage({
|
238
|
+
threadId: tid,
|
239
|
+
});
|
240
|
+
}
|
241
|
+
}
|
242
|
+
function cleanup() {
|
243
|
+
clusterPeers.delete(threadPeerKey);
|
244
|
+
clusterPeers.delete(threadPeerKey);
|
245
|
+
}
|
246
|
+
peerPromise = tidDeferred.promise.then(port => {
|
247
|
+
port.on('close', () => cleanup());
|
248
|
+
port.on('messageerror', () => cleanup());
|
249
|
+
return finishTidPeerConnection(tid, port);
|
250
|
+
});
|
251
|
+
peerPromise.catch(() => cleanup());
|
252
|
+
const threadPeerKey = `thread:${worker_threads_1.default.threadId}-${tid}`;
|
253
|
+
clusterPeers.set(threadPeerKey, peerPromise);
|
254
|
+
tidPeers.set(tid, peerPromise);
|
255
|
+
return peerPromise;
|
256
|
+
}
|
257
|
+
const mainThreadPort = worker_threads_1.default.isMainThread ? undefined : worker_threads_1.default.workerData.mainThreadPort;
|
258
|
+
if (!worker_threads_1.default.isMainThread) {
|
259
|
+
// the main thread port will send messages with a thread port when a thread wants to initiate a connection.
|
260
|
+
mainThreadPort.on('message', async (message) => {
|
261
|
+
const { port, threadId } = message;
|
262
|
+
let tidDeferred = tidChannels.get(threadId);
|
263
|
+
if (!tidDeferred) {
|
264
|
+
tidDeferred = new deferred_1.Deferred();
|
265
|
+
tidChannels.set(threadId, tidDeferred);
|
266
|
+
}
|
267
|
+
tidDeferred.resolve(port);
|
268
|
+
connectTidPeer(threadId);
|
269
|
+
});
|
270
|
+
}
|
271
|
+
async function connectIPCObject(clusterObject, tid) {
|
272
|
+
// if the main thread is trying to connect to an object,
|
273
|
+
// the argument order matters here, as the connection attempt looks at the
|
274
|
+
// connectThreadId to see if the target is main thread.
|
275
|
+
if (worker_threads_1.default.isMainThread)
|
276
|
+
mainThreadBrokerConnect(tid, worker_threads_1.default.threadId);
|
277
|
+
const threadPeer = await connectTidPeer(tid);
|
278
|
+
return peerConnectRPCObject(threadPeer, clusterObject);
|
279
|
+
}
|
280
|
+
const brokeredConnections = new Set();
|
281
|
+
const workers = new Map();
|
282
|
+
function mainThreadBrokerConnect(threadId, connectThreadId) {
|
283
|
+
if (worker_threads_1.default.isMainThread && threadId === worker_threads_1.default.threadId) {
|
284
|
+
const msg = 'invalid ipc, main thread cannot connect to itself';
|
285
|
+
console.error(msg);
|
286
|
+
throw new Error(msg);
|
287
|
+
}
|
288
|
+
// both workers nay initiate connection to each other at same time, so this
|
289
|
+
// is a synchronization point.
|
290
|
+
const key = JSON.stringify([threadId, connectThreadId].sort());
|
291
|
+
if (brokeredConnections.has(key))
|
292
|
+
return;
|
293
|
+
brokeredConnections.add(key);
|
294
|
+
const worker = workers.get(threadId);
|
295
|
+
const connect = workers.get(connectThreadId);
|
296
|
+
const channel = new worker_threads_1.default.MessageChannel();
|
297
|
+
worker.postMessage({
|
298
|
+
port: channel.port1,
|
299
|
+
threadId: connectThreadId,
|
300
|
+
}, [channel.port1]);
|
301
|
+
if (connect) {
|
302
|
+
connect.postMessage({
|
303
|
+
port: channel.port2,
|
304
|
+
threadId,
|
305
|
+
}, [channel.port2]);
|
306
|
+
}
|
307
|
+
else if (connectThreadId === worker_threads_1.default.threadId) {
|
308
|
+
connectTidPeer(threadId);
|
309
|
+
const deferred = tidChannels.get(threadId);
|
310
|
+
deferred.resolve(channel.port2);
|
311
|
+
}
|
312
|
+
else {
|
313
|
+
channel.port2.close();
|
314
|
+
}
|
315
|
+
}
|
316
|
+
function mainThreadBrokerRegister(workerPort, threadId) {
|
317
|
+
workers.set(threadId, workerPort);
|
318
|
+
// this is main thread, so there will be two types of requests from the child: registration requests from grandchildren and connection requests.
|
319
|
+
workerPort.on('message', async (message) => {
|
320
|
+
const { port, threadId: connectThreadId } = message;
|
321
|
+
if (port) {
|
322
|
+
mainThreadBrokerRegister(port, connectThreadId);
|
323
|
+
}
|
324
|
+
else {
|
325
|
+
mainThreadBrokerConnect(threadId, connectThreadId);
|
326
|
+
}
|
327
|
+
});
|
328
|
+
}
|
191
329
|
scrypted.connectRPCObject = async (value) => {
|
192
330
|
const clusterObject = value?.__cluster;
|
193
331
|
if (clusterObject?.id !== clusterId)
|
@@ -197,6 +335,13 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
|
|
197
335
|
// returning the actual object, rather than initiating a loopback connection.
|
198
336
|
if (port === clusterPort)
|
199
337
|
return resolveObject(proxyId, sourceKey);
|
338
|
+
// can use worker to worker ipc if the address and pid matches and both side are node.
|
339
|
+
if (address === SCRYPTED_CLUSTER_ADDRESS && proxyId.startsWith('n-')) {
|
340
|
+
const parts = proxyId.split('-');
|
341
|
+
const pid = parseInt(parts[1]);
|
342
|
+
if (pid === process.pid)
|
343
|
+
return connectIPCObject(clusterObject, parseInt(parts[2]));
|
344
|
+
}
|
200
345
|
try {
|
201
346
|
const clusterPeerPromise = ensureClusterPeer(address, port);
|
202
347
|
const clusterPeer = await clusterPeerPromise;
|
@@ -204,12 +349,7 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
|
|
204
349
|
const existing = clusterPeer.remoteWeakProxies[proxyId]?.deref();
|
205
350
|
if (existing)
|
206
351
|
return existing;
|
207
|
-
|
208
|
-
if (!peerConnectRPCObject) {
|
209
|
-
peerConnectRPCObject = await clusterPeer.getParam('connectRPCObject');
|
210
|
-
clusterPeer.tags['connectRPCObject'] = peerConnectRPCObject;
|
211
|
-
}
|
212
|
-
const newValue = await peerConnectRPCObject(clusterObject);
|
352
|
+
const newValue = await peerConnectRPCObject(clusterPeer, clusterObject);
|
213
353
|
if (!newValue)
|
214
354
|
throw new Error('rpc object not found?');
|
215
355
|
return newValue;
|
@@ -332,6 +472,8 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
|
|
332
472
|
}
|
333
473
|
}
|
334
474
|
else {
|
475
|
+
// when a node thread is created, also create a secondary message channel to link the grandparent (or mainthread) and child.
|
476
|
+
const mainThreadChannel = new worker_threads_1.default.MessageChannel();
|
335
477
|
const ntw = new node_thread_worker_1.NodeThreadWorker(mainFilename, pluginId, {
|
336
478
|
packageJson,
|
337
479
|
env: process.env,
|
@@ -341,12 +483,26 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
|
|
341
483
|
zipHash,
|
342
484
|
}, {
|
343
485
|
name: options?.name,
|
344
|
-
}
|
486
|
+
}, {
|
487
|
+
// child connection to grandparent
|
488
|
+
mainThreadPort: mainThreadChannel.port1,
|
489
|
+
}, [mainThreadChannel.port1]);
|
345
490
|
runtimeWorker = ntw;
|
346
491
|
nativeWorker = ntw.worker;
|
492
|
+
const { threadId } = ntw.worker;
|
493
|
+
if (mainThreadPort) {
|
494
|
+
// grandparent connection to child
|
495
|
+
mainThreadPort.postMessage({
|
496
|
+
port: mainThreadChannel.port2,
|
497
|
+
threadId,
|
498
|
+
}, [mainThreadChannel.port2]);
|
499
|
+
}
|
500
|
+
else {
|
501
|
+
mainThreadBrokerRegister(mainThreadChannel.port2, threadId);
|
502
|
+
}
|
347
503
|
}
|
348
504
|
const result = (async () => {
|
349
|
-
const threadPeer = new rpc_1.RpcPeer('main', 'thread', (message, reject) => runtimeWorker.send(message, reject));
|
505
|
+
const threadPeer = new rpc_1.RpcPeer('main', 'thread', (message, reject, serializationContext) => runtimeWorker.send(message, reject, serializationContext));
|
350
506
|
threadPeer.params.updateStats = (stats) => {
|
351
507
|
allMemoryStats.set(runtimeWorker, stats.memoryUsage);
|
352
508
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"plugin-remote-worker.js","sourceRoot":"","sources":["../../src/plugin/plugin-remote-worker.ts"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"plugin-remote-worker.js","sourceRoot":"","sources":["../../src/plugin/plugin-remote-worker.ts"],"names":[],"mappings":"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"}
|
@@ -6,11 +6,14 @@ export declare class NodeThreadWorker extends EventEmitter implements RuntimeWor
|
|
6
6
|
pluginId: string;
|
7
7
|
worker: worker_threads.Worker;
|
8
8
|
port: worker_threads.MessagePort;
|
9
|
-
constructor(mainFilename: string, pluginId: string, options: RuntimeWorkerOptions, workerOptions?: worker_threads.WorkerOptions);
|
9
|
+
constructor(mainFilename: string, pluginId: string, options: RuntimeWorkerOptions, workerOptions?: worker_threads.WorkerOptions, workerData?: any, transferList?: Array<worker_threads.TransferListItem>);
|
10
10
|
get pid(): number;
|
11
11
|
get stdout(): import("stream").Readable;
|
12
12
|
get stderr(): import("stream").Readable;
|
13
13
|
kill(): void;
|
14
|
-
send(message: RpcMessage, reject?: (e: Error) => void): void;
|
14
|
+
send(message: RpcMessage, reject?: (e: Error) => void, serializationContext?: any): void;
|
15
15
|
setupRpcPeer(peer: RpcPeer): void;
|
16
|
+
static send(message: RpcMessage, port: worker_threads.MessagePort, reject?: (e: Error) => void, serializationContext?: any): void;
|
17
|
+
static setupRpcPeer(peer: RpcPeer, port: worker_threads.MessagePort): void;
|
18
|
+
static createRpcPeer(selfName: string, peerName: string, port: worker_threads.MessagePort): RpcPeer;
|
16
19
|
}
|
@@ -4,14 +4,37 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
exports.NodeThreadWorker = void 0;
|
7
|
-
const v8_1 = __importDefault(require("v8"));
|
8
7
|
const worker_threads_1 = __importDefault(require("worker_threads"));
|
9
8
|
const events_1 = require("events");
|
9
|
+
const rpc_1 = require("../../rpc");
|
10
|
+
const rpc_buffer_serializer_1 = require("../../rpc-buffer-serializer");
|
11
|
+
class BufferTransfer {
|
12
|
+
bufferSerializer = new rpc_buffer_serializer_1.BufferSerializer();
|
13
|
+
serialize(value, serializationContext) {
|
14
|
+
if (!serializationContext)
|
15
|
+
return this.bufferSerializer.serialize(value);
|
16
|
+
// must create a copy. Buffers as allocated by node are not transferable.
|
17
|
+
const ab = value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength);
|
18
|
+
value = Buffer.from(ab);
|
19
|
+
serializationContext.transferList ||= [];
|
20
|
+
const transferList = serializationContext.transferList;
|
21
|
+
transferList.push(value.buffer);
|
22
|
+
// can return the value directly, as the buffer is transferred.
|
23
|
+
return value;
|
24
|
+
}
|
25
|
+
deserialize(serialized, serializationContext) {
|
26
|
+
if (!serializationContext?.transferList)
|
27
|
+
return this.bufferSerializer.deserialize(serialized);
|
28
|
+
// the buffer was transferred, so we can return the value directly.
|
29
|
+
const u = serialized;
|
30
|
+
return Buffer.from(u.buffer, u.byteOffset, u.byteLength);
|
31
|
+
}
|
32
|
+
}
|
10
33
|
class NodeThreadWorker extends events_1.EventEmitter {
|
11
34
|
pluginId;
|
12
35
|
worker;
|
13
36
|
port;
|
14
|
-
constructor(mainFilename, pluginId, options, workerOptions) {
|
37
|
+
constructor(mainFilename, pluginId, options, workerOptions, workerData, transferList = []) {
|
15
38
|
super();
|
16
39
|
this.pluginId = pluginId;
|
17
40
|
const { env } = options;
|
@@ -22,8 +45,9 @@ class NodeThreadWorker extends events_1.EventEmitter {
|
|
22
45
|
env: Object.assign({}, process.env, env),
|
23
46
|
workerData: {
|
24
47
|
port: port1,
|
48
|
+
...workerData,
|
25
49
|
},
|
26
|
-
transferList: [port1],
|
50
|
+
transferList: [port1, ...transferList],
|
27
51
|
...workerOptions,
|
28
52
|
});
|
29
53
|
this.worker.on('exit', () => {
|
@@ -63,18 +87,40 @@ class NodeThreadWorker extends events_1.EventEmitter {
|
|
63
87
|
this.port = undefined;
|
64
88
|
this.worker = undefined;
|
65
89
|
}
|
66
|
-
send(message, reject) {
|
90
|
+
send(message, reject, serializationContext) {
|
91
|
+
NodeThreadWorker.send(message, this.port, reject, serializationContext);
|
92
|
+
}
|
93
|
+
setupRpcPeer(peer) {
|
94
|
+
NodeThreadWorker.setupRpcPeer(peer, this.port);
|
95
|
+
}
|
96
|
+
static send(message, port, reject, serializationContext) {
|
67
97
|
try {
|
68
|
-
|
69
|
-
|
70
|
-
|
98
|
+
const postMessage = {
|
99
|
+
message,
|
100
|
+
serializationContext,
|
101
|
+
};
|
102
|
+
const transferList = serializationContext?.transferList;
|
103
|
+
// delete the transfer list since that is simply transfered.
|
104
|
+
if (transferList)
|
105
|
+
serializationContext.transferList = [];
|
106
|
+
port.postMessage(postMessage, transferList);
|
71
107
|
}
|
72
108
|
catch (e) {
|
73
109
|
reject?.(e);
|
74
110
|
}
|
75
111
|
}
|
76
|
-
setupRpcPeer(peer) {
|
77
|
-
|
112
|
+
static setupRpcPeer(peer, port) {
|
113
|
+
port.on('message', (portMessage) => {
|
114
|
+
const { message, serializationContext } = portMessage;
|
115
|
+
peer.handleMessage(message, serializationContext);
|
116
|
+
});
|
117
|
+
peer.addSerializer(Buffer, 'Buffer', new BufferTransfer());
|
118
|
+
peer.addSerializer(Uint8Array, 'Uint8Array', new BufferTransfer());
|
119
|
+
}
|
120
|
+
static createRpcPeer(selfName, peerName, port) {
|
121
|
+
const peer = new rpc_1.RpcPeer(selfName, peerName, (message, reject, serializationContext) => NodeThreadWorker.send(message, port, reject, serializationContext));
|
122
|
+
NodeThreadWorker.setupRpcPeer(peer, port);
|
123
|
+
return peer;
|
78
124
|
}
|
79
125
|
}
|
80
126
|
exports.NodeThreadWorker = NodeThreadWorker;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"node-thread-worker.js","sourceRoot":"","sources":["../../../src/plugin/runtime/node-thread-worker.ts"],"names":[],"mappings":";;;;;;AAAA,
|
1
|
+
{"version":3,"file":"node-thread-worker.js","sourceRoot":"","sources":["../../../src/plugin/runtime/node-thread-worker.ts"],"names":[],"mappings":"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"}
|
@@ -3,9 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SidebandBufferSerializer = exports.BufferSerializer = void 0;
|
4
4
|
class BufferSerializer {
|
5
5
|
serialize(value) {
|
6
|
+
console.warn('Using slow buffer serialization. Ensure the peer supports SidebandBufferSerializer.');
|
6
7
|
return value.toString('base64');
|
7
8
|
}
|
8
9
|
deserialize(serialized) {
|
10
|
+
console.warn('Using slow buffer deserialization. Ensure the peer supports SidebandBufferSerializer.');
|
9
11
|
return Buffer.from(serialized, 'base64');
|
10
12
|
}
|
11
13
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rpc-buffer-serializer.js","sourceRoot":"","sources":["../src/rpc-buffer-serializer.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IACzB,SAAS,CAAC,KAAa;QACnB,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,WAAW,CAAC,UAAe;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACJ;
|
1
|
+
{"version":3,"file":"rpc-buffer-serializer.js","sourceRoot":"","sources":["../src/rpc-buffer-serializer.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IACzB,SAAS,CAAC,KAAa;QACnB,OAAO,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;QACpG,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,WAAW,CAAC,UAAe;QACvB,OAAO,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;QACtG,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACJ;AATD,4CASC;AAED,MAAa,wBAAwB;IACjC,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAE1C,SAAS,CAAC,KAAU,EAAE,oBAA0B;QAC5C,IAAI,CAAC,oBAAoB;YACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,OAAO,GAAa,oBAAoB,CAAC,OAAO,GAAG,oBAAoB,CAAC,OAAO,IAAI,EAAE,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,UAAe,EAAE,oBAA0B;QACnD,IAAI,CAAC,oBAAoB,EAAE,OAAO;YAC9B,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,OAAO,GAAa,oBAAoB,CAAC,OAAO,CAAC;QACvD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;CACJ;AAjBD,4DAiBC"}
|
@@ -4,28 +4,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const net_1 = __importDefault(require("net"));
|
7
|
-
const v8_1 = __importDefault(require("v8"));
|
8
7
|
const worker_threads_1 = __importDefault(require("worker_threads"));
|
9
8
|
const plugin_npm_dependencies_1 = require("./plugin/plugin-npm-dependencies");
|
10
9
|
const plugin_remote_worker_1 = require("./plugin/plugin-remote-worker");
|
11
10
|
const socket_serializer_1 = require("./plugin/socket-serializer");
|
11
|
+
const node_thread_worker_1 = require("./plugin/runtime/node-thread-worker");
|
12
12
|
function start(mainFilename) {
|
13
13
|
const pluginId = process.argv[3];
|
14
14
|
module.paths.push((0, plugin_npm_dependencies_1.getPluginNodePath)(pluginId));
|
15
15
|
if (process.argv[2] === 'child-thread') {
|
16
16
|
console.log('starting thread', pluginId);
|
17
17
|
const { port } = worker_threads_1.default.workerData;
|
18
|
-
const peer = (0, plugin_remote_worker_1.startPluginRemote)(mainFilename, pluginId, (message, reject) =>
|
19
|
-
|
20
|
-
port.postMessage(v8_1.default.serialize(message));
|
21
|
-
}
|
22
|
-
catch (e) {
|
23
|
-
reject?.(e);
|
24
|
-
}
|
25
|
-
});
|
26
|
-
peer.transportSafeArgumentTypes.add(Buffer.name);
|
27
|
-
peer.transportSafeArgumentTypes.add(Uint8Array.name);
|
28
|
-
port.on('message', message => peer.handleMessage(v8_1.default.deserialize(message)));
|
18
|
+
const peer = (0, plugin_remote_worker_1.startPluginRemote)(mainFilename, pluginId, (message, reject, serializationContext) => node_thread_worker_1.NodeThreadWorker.send(message, port, reject, serializationContext));
|
19
|
+
node_thread_worker_1.NodeThreadWorker.setupRpcPeer(peer, port);
|
29
20
|
port.on('messageerror', e => {
|
30
21
|
console.error('message error', e);
|
31
22
|
process.exit(1);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"scrypted-plugin-main.js","sourceRoot":"","sources":["../src/scrypted-plugin-main.ts"],"names":[],"mappings":";;;;;AAAA,8CAAsB;AACtB,
|
1
|
+
{"version":3,"file":"scrypted-plugin-main.js","sourceRoot":"","sources":["../src/scrypted-plugin-main.ts"],"names":[],"mappings":";;;;;AAAA,8CAAsB;AACtB,oEAA4C;AAC5C,8EAAqE;AACrE,wEAAkE;AAClE,kEAAsE;AAEtE,4EAAuE;AAEvE,SAAS,KAAK,CAAC,YAAoB;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,2CAAiB,EAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,cAAc,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,EAAE,IAAI,EAAE,GAAG,wBAAc,CAAC,UAAkD,CAAC;QACnF,MAAM,IAAI,GAAG,IAAA,wCAAiB,EAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,CAAC,qCAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACtK,qCAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC;SACI,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAA,wCAAiB,EAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE;YAC7J,aAAa,EAAE,CAAC,MAAM;SACzB,EAAE,CAAC,CAAC,EAAE;YACH,IAAI,CAAC;gBACD,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,CAAC,aAAG,CAAC,MAAM,EAAE,aAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,4CAAwB,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAqB,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,kBAAe,KAAK,CAAC"}
|
package/package.json
CHANGED
package/src/deferred.ts
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
export class Deferred<T> {
|
2
|
+
finished = false;
|
3
|
+
resolve!: (value: T) => this;
|
4
|
+
reject!: (error: Error) => this;
|
5
|
+
async resolvePromise(p: Promise<T>) {
|
6
|
+
try {
|
7
|
+
this.resolve(await p);
|
8
|
+
}
|
9
|
+
catch (e) {
|
10
|
+
this.reject(e as Error);
|
11
|
+
}
|
12
|
+
}
|
13
|
+
promise = new Promise<T>((resolve, reject) => {
|
14
|
+
this.resolve = v => {
|
15
|
+
this.finished = true;
|
16
|
+
resolve(v);
|
17
|
+
return this;
|
18
|
+
};
|
19
|
+
this.reject = e => {
|
20
|
+
this.finished = true;
|
21
|
+
reject(e);
|
22
|
+
return this;
|
23
|
+
};
|
24
|
+
});
|
25
|
+
}
|
@@ -25,6 +25,7 @@ import { prepareZip } from './runtime/node-worker-common';
|
|
25
25
|
import { RuntimeWorker } from './runtime/runtime-worker';
|
26
26
|
import { getBuiltinRuntimeHosts } from './runtime/runtime-host';
|
27
27
|
import { ChildProcessWorker } from './runtime/child-process-worker';
|
28
|
+
import { Deferred } from '../deferred';
|
28
29
|
|
29
30
|
const serverVersion = require('../../package.json').version;
|
30
31
|
|
@@ -112,7 +113,8 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
|
|
112
113
|
let clusterEntry: ClusterObject = properties.__cluster;
|
113
114
|
|
114
115
|
// ensure globally stable proxyIds.
|
115
|
-
|
116
|
+
// worker threads will embed their pid and tid in the proxy id for cross worker fast path.
|
117
|
+
const proxyId = clusterEntry?.proxyId || (worker_threads.isMainThread ? RpcPeer.generateId() : `n-${process.pid}-${worker_threads.threadId}-${RpcPeer.generateId()}`);
|
116
118
|
|
117
119
|
// if the cluster entry already exists, check if it belongs to this node.
|
118
120
|
// if it belongs to this node, the entry must also be for this peer.
|
@@ -222,6 +224,160 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
|
|
222
224
|
return clusterPeerPromise;
|
223
225
|
};
|
224
226
|
|
227
|
+
async function peerConnectRPCObject(peer: RpcPeer, o: ClusterObject) {
|
228
|
+
let peerConnectRPCObject: Promise<ConnectRPCObject> = peer.tags['connectRPCObject'];
|
229
|
+
if (!peerConnectRPCObject) {
|
230
|
+
peerConnectRPCObject = peer.getParam('connectRPCObject');
|
231
|
+
peer.tags['connectRPCObject'] = peerConnectRPCObject;
|
232
|
+
}
|
233
|
+
const resolved = await peerConnectRPCObject;
|
234
|
+
return resolved(o);
|
235
|
+
}
|
236
|
+
|
237
|
+
const tidChannels = new Map<number, Deferred<worker_threads.MessagePort>>();
|
238
|
+
const tidPeers = new Map<number, Promise<RpcPeer>>();
|
239
|
+
|
240
|
+
function finishTidPeerConnection(tid: number, port: worker_threads.MessagePort) {
|
241
|
+
const threadPeer = NodeThreadWorker.createRpcPeer(peer.selfName, 'thread-server', port);
|
242
|
+
// this connecting peer sourceKey (thread id) is used by the OTHER peer (the server)
|
243
|
+
// to determine if it is already connected to THIS peer (the client).
|
244
|
+
const threadPeerKey = `thread:${worker_threads.threadId}-${tid}`;
|
245
|
+
threadPeer.onProxySerialization = value => onProxySerialization(value, threadPeerKey);
|
246
|
+
|
247
|
+
const connectRPCObject: ConnectRPCObject = async (o) => {
|
248
|
+
const sha256 = computeClusterObjectHash(o, clusterSecret);
|
249
|
+
if (sha256 !== o.sha256)
|
250
|
+
throw new Error('secret incorrect');
|
251
|
+
return resolveObject(o.proxyId, o.sourceKey);
|
252
|
+
}
|
253
|
+
threadPeer.params['connectRPCObject'] = connectRPCObject;
|
254
|
+
function cleanup(message: string) {
|
255
|
+
tidChannels.delete(tid);
|
256
|
+
tidPeers.delete(tid);
|
257
|
+
threadPeer.kill(message);
|
258
|
+
}
|
259
|
+
port.on('close', () => cleanup('connection closed.'));
|
260
|
+
port.on('messageerror', () => cleanup('message error.'));
|
261
|
+
return threadPeer;
|
262
|
+
}
|
263
|
+
|
264
|
+
function connectTidPeer(tid: number) {
|
265
|
+
let peerPromise = tidPeers.get(tid);
|
266
|
+
if (peerPromise)
|
267
|
+
return peerPromise;
|
268
|
+
let tidDeferred = tidChannels.get(tid);
|
269
|
+
// if the tid port is not available yet, request it.
|
270
|
+
if (!tidDeferred) {
|
271
|
+
tidDeferred = new Deferred<worker_threads.MessagePort>();
|
272
|
+
tidChannels.set(tid, tidDeferred);
|
273
|
+
|
274
|
+
if (mainThreadPort) {
|
275
|
+
// request the connection via the main thread
|
276
|
+
mainThreadPort.postMessage({
|
277
|
+
threadId: tid,
|
278
|
+
});
|
279
|
+
}
|
280
|
+
}
|
281
|
+
|
282
|
+
function cleanup() {
|
283
|
+
clusterPeers.delete(threadPeerKey);
|
284
|
+
clusterPeers.delete(threadPeerKey);
|
285
|
+
}
|
286
|
+
peerPromise = tidDeferred.promise.then(port => {
|
287
|
+
port.on('close', () => cleanup());
|
288
|
+
port.on('messageerror', () => cleanup());
|
289
|
+
return finishTidPeerConnection(tid, port);
|
290
|
+
});
|
291
|
+
peerPromise.catch(() => cleanup());
|
292
|
+
const threadPeerKey = `thread:${worker_threads.threadId}-${tid}`;
|
293
|
+
clusterPeers.set(threadPeerKey, peerPromise);
|
294
|
+
tidPeers.set(tid, peerPromise);
|
295
|
+
|
296
|
+
return peerPromise;
|
297
|
+
}
|
298
|
+
|
299
|
+
const mainThreadPort: worker_threads.MessagePort = worker_threads.isMainThread ? undefined : worker_threads.workerData.mainThreadPort;
|
300
|
+
if (!worker_threads.isMainThread) {
|
301
|
+
// the main thread port will send messages with a thread port when a thread wants to initiate a connection.
|
302
|
+
mainThreadPort.on('message', async (message: { port: worker_threads.MessagePort, threadId: number }) => {
|
303
|
+
const { port, threadId } = message;
|
304
|
+
let tidDeferred = tidChannels.get(threadId);
|
305
|
+
if (!tidDeferred) {
|
306
|
+
tidDeferred = new Deferred<worker_threads.MessagePort>();
|
307
|
+
tidChannels.set(threadId, tidDeferred);
|
308
|
+
}
|
309
|
+
tidDeferred.resolve(port);
|
310
|
+
connectTidPeer(threadId);
|
311
|
+
});
|
312
|
+
}
|
313
|
+
|
314
|
+
async function connectIPCObject(clusterObject: ClusterObject, tid: number) {
|
315
|
+
// if the main thread is trying to connect to an object,
|
316
|
+
// the argument order matters here, as the connection attempt looks at the
|
317
|
+
// connectThreadId to see if the target is main thread.
|
318
|
+
if (worker_threads.isMainThread)
|
319
|
+
mainThreadBrokerConnect(tid, worker_threads.threadId);
|
320
|
+
const threadPeer = await connectTidPeer(tid);
|
321
|
+
return peerConnectRPCObject(threadPeer, clusterObject);
|
322
|
+
}
|
323
|
+
|
324
|
+
const brokeredConnections = new Set<string>();
|
325
|
+
const workers = new Map<number, worker_threads.MessagePort>();
|
326
|
+
function mainThreadBrokerConnect(threadId: number, connectThreadId: number) {
|
327
|
+
if (worker_threads.isMainThread && threadId === worker_threads.threadId) {
|
328
|
+
const msg = 'invalid ipc, main thread cannot connect to itself';
|
329
|
+
console.error(msg);
|
330
|
+
throw new Error(msg);
|
331
|
+
}
|
332
|
+
// both workers nay initiate connection to each other at same time, so this
|
333
|
+
// is a synchronization point.
|
334
|
+
const key = JSON.stringify([threadId, connectThreadId].sort());
|
335
|
+
if (brokeredConnections.has(key))
|
336
|
+
return;
|
337
|
+
|
338
|
+
brokeredConnections.add(key);
|
339
|
+
|
340
|
+
const worker = workers.get(threadId);
|
341
|
+
const connect = workers.get(connectThreadId);
|
342
|
+
const channel = new worker_threads.MessageChannel();
|
343
|
+
|
344
|
+
worker.postMessage({
|
345
|
+
port: channel.port1,
|
346
|
+
threadId: connectThreadId,
|
347
|
+
}, [channel.port1]);
|
348
|
+
|
349
|
+
if (connect) {
|
350
|
+
connect.postMessage({
|
351
|
+
port: channel.port2,
|
352
|
+
threadId,
|
353
|
+
}, [channel.port2]);
|
354
|
+
}
|
355
|
+
else if (connectThreadId === worker_threads.threadId) {
|
356
|
+
connectTidPeer(threadId);
|
357
|
+
const deferred = tidChannels.get(threadId);
|
358
|
+
deferred.resolve(channel.port2);
|
359
|
+
}
|
360
|
+
else {
|
361
|
+
channel.port2.close();
|
362
|
+
}
|
363
|
+
}
|
364
|
+
|
365
|
+
function mainThreadBrokerRegister(workerPort: worker_threads.MessagePort, threadId: number) {
|
366
|
+
workers.set(threadId, workerPort);
|
367
|
+
|
368
|
+
// this is main thread, so there will be two types of requests from the child: registration requests from grandchildren and connection requests.
|
369
|
+
workerPort.on('message', async (message: { port: worker_threads.MessagePort, threadId: number }) => {
|
370
|
+
const { port, threadId: connectThreadId } = message;
|
371
|
+
|
372
|
+
if (port) {
|
373
|
+
mainThreadBrokerRegister(port, connectThreadId);
|
374
|
+
}
|
375
|
+
else {
|
376
|
+
mainThreadBrokerConnect(threadId, connectThreadId);
|
377
|
+
}
|
378
|
+
});
|
379
|
+
}
|
380
|
+
|
225
381
|
scrypted.connectRPCObject = async (value: any) => {
|
226
382
|
const clusterObject: ClusterObject = value?.__cluster;
|
227
383
|
if (clusterObject?.id !== clusterId)
|
@@ -232,6 +388,14 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
|
|
232
388
|
if (port === clusterPort)
|
233
389
|
return resolveObject(proxyId, sourceKey);
|
234
390
|
|
391
|
+
// can use worker to worker ipc if the address and pid matches and both side are node.
|
392
|
+
if (address === SCRYPTED_CLUSTER_ADDRESS && proxyId.startsWith('n-')) {
|
393
|
+
const parts = proxyId.split('-');
|
394
|
+
const pid = parseInt(parts[1]);
|
395
|
+
if (pid === process.pid)
|
396
|
+
return connectIPCObject(clusterObject, parseInt(parts[2]));
|
397
|
+
}
|
398
|
+
|
235
399
|
try {
|
236
400
|
const clusterPeerPromise = ensureClusterPeer(address, port);
|
237
401
|
const clusterPeer = await clusterPeerPromise;
|
@@ -239,12 +403,7 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
|
|
239
403
|
const existing = clusterPeer.remoteWeakProxies[proxyId]?.deref();
|
240
404
|
if (existing)
|
241
405
|
return existing;
|
242
|
-
|
243
|
-
if (!peerConnectRPCObject) {
|
244
|
-
peerConnectRPCObject = await clusterPeer.getParam('connectRPCObject');
|
245
|
-
clusterPeer.tags['connectRPCObject'] = peerConnectRPCObject;
|
246
|
-
}
|
247
|
-
const newValue = await peerConnectRPCObject(clusterObject);
|
406
|
+
const newValue = await peerConnectRPCObject(clusterPeer, clusterObject);
|
248
407
|
if (!newValue)
|
249
408
|
throw new Error('rpc object not found?');
|
250
409
|
return newValue;
|
@@ -381,6 +540,9 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
|
|
381
540
|
}
|
382
541
|
}
|
383
542
|
else {
|
543
|
+
// when a node thread is created, also create a secondary message channel to link the grandparent (or mainthread) and child.
|
544
|
+
const mainThreadChannel = new worker_threads.MessageChannel();
|
545
|
+
|
384
546
|
const ntw = new NodeThreadWorker(mainFilename, pluginId, {
|
385
547
|
packageJson,
|
386
548
|
env: process.env,
|
@@ -390,13 +552,28 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
|
|
390
552
|
zipHash,
|
391
553
|
}, {
|
392
554
|
name: options?.name,
|
393
|
-
}
|
555
|
+
}, {
|
556
|
+
// child connection to grandparent
|
557
|
+
mainThreadPort: mainThreadChannel.port1,
|
558
|
+
}, [mainThreadChannel.port1]);
|
394
559
|
runtimeWorker = ntw;
|
395
560
|
nativeWorker = ntw.worker;
|
561
|
+
|
562
|
+
const { threadId } = ntw.worker;
|
563
|
+
if (mainThreadPort) {
|
564
|
+
// grandparent connection to child
|
565
|
+
mainThreadPort.postMessage({
|
566
|
+
port: mainThreadChannel.port2,
|
567
|
+
threadId,
|
568
|
+
}, [mainThreadChannel.port2]);
|
569
|
+
}
|
570
|
+
else {
|
571
|
+
mainThreadBrokerRegister(mainThreadChannel.port2, threadId);
|
572
|
+
}
|
396
573
|
}
|
397
574
|
|
398
575
|
const result = (async () => {
|
399
|
-
const threadPeer = new RpcPeer('main', 'thread', (message, reject) => runtimeWorker.send(message, reject));
|
576
|
+
const threadPeer = new RpcPeer('main', 'thread', (message, reject, serializationContext) => runtimeWorker.send(message, reject, serializationContext));
|
400
577
|
threadPeer.params.updateStats = (stats: PluginStats) => {
|
401
578
|
allMemoryStats.set(runtimeWorker, stats.memoryUsage);
|
402
579
|
}
|
@@ -1,14 +1,47 @@
|
|
1
|
-
import v8 from 'v8';
|
2
1
|
import worker_threads from "worker_threads";
|
3
2
|
import { EventEmitter } from "events";
|
4
|
-
import { RpcMessage, RpcPeer } from "../../rpc";
|
3
|
+
import { RpcMessage, RpcPeer, RpcSerializer } from "../../rpc";
|
5
4
|
import { RuntimeWorker, RuntimeWorkerOptions } from "./runtime-worker";
|
5
|
+
import { BufferSerializer } from '../../rpc-buffer-serializer';
|
6
|
+
|
7
|
+
|
8
|
+
class BufferTransfer implements RpcSerializer {
|
9
|
+
bufferSerializer = new BufferSerializer();
|
10
|
+
|
11
|
+
serialize(value: Buffer, serializationContext?: any): any {
|
12
|
+
if (!serializationContext)
|
13
|
+
return this.bufferSerializer.serialize(value);
|
14
|
+
|
15
|
+
// must create a copy. Buffers as allocated by node are not transferable.
|
16
|
+
const ab = value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength);
|
17
|
+
value = Buffer.from(ab);
|
18
|
+
|
19
|
+
serializationContext.transferList ||= [];
|
20
|
+
const transferList: worker_threads.TransferListItem[] = serializationContext.transferList;
|
21
|
+
transferList.push(value.buffer);
|
22
|
+
// can return the value directly, as the buffer is transferred.
|
23
|
+
return value;
|
24
|
+
}
|
25
|
+
|
26
|
+
deserialize(serialized: any, serializationContext?: any): any {
|
27
|
+
if (!serializationContext?.transferList)
|
28
|
+
return this.bufferSerializer.deserialize(serialized);
|
29
|
+
// the buffer was transferred, so we can return the value directly.
|
30
|
+
const u: Uint8Array = serialized;
|
31
|
+
return Buffer.from(u.buffer, u.byteOffset, u.byteLength);
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
interface PortMessage {
|
36
|
+
message: any;
|
37
|
+
serializationContext: any;
|
38
|
+
}
|
6
39
|
|
7
40
|
export class NodeThreadWorker extends EventEmitter implements RuntimeWorker {
|
8
41
|
worker: worker_threads.Worker;
|
9
42
|
port: worker_threads.MessagePort;
|
10
43
|
|
11
|
-
constructor(mainFilename: string, public pluginId: string, options: RuntimeWorkerOptions, workerOptions?: worker_threads.WorkerOptions) {
|
44
|
+
constructor(mainFilename: string, public pluginId: string, options: RuntimeWorkerOptions, workerOptions?: worker_threads.WorkerOptions, workerData?: any, transferList: Array<worker_threads.TransferListItem> = []) {
|
12
45
|
super();
|
13
46
|
const { env } = options;
|
14
47
|
|
@@ -19,8 +52,9 @@ export class NodeThreadWorker extends EventEmitter implements RuntimeWorker {
|
|
19
52
|
env: Object.assign({}, process.env, env),
|
20
53
|
workerData: {
|
21
54
|
port: port1,
|
55
|
+
...workerData,
|
22
56
|
},
|
23
|
-
transferList: [port1],
|
57
|
+
transferList: [port1, ...transferList],
|
24
58
|
...workerOptions,
|
25
59
|
});
|
26
60
|
|
@@ -67,18 +101,43 @@ export class NodeThreadWorker extends EventEmitter implements RuntimeWorker {
|
|
67
101
|
this.worker = undefined;
|
68
102
|
}
|
69
103
|
|
70
|
-
send(message: RpcMessage, reject?: (e: Error) => void): void {
|
104
|
+
send(message: RpcMessage, reject?: (e: Error) => void, serializationContext?: any): void {
|
105
|
+
NodeThreadWorker.send(message, this.port, reject, serializationContext);
|
106
|
+
}
|
107
|
+
|
108
|
+
setupRpcPeer(peer: RpcPeer): void {
|
109
|
+
NodeThreadWorker.setupRpcPeer(peer, this.port);
|
110
|
+
}
|
111
|
+
|
112
|
+
static send(message: RpcMessage, port: worker_threads.MessagePort, reject?: (e: Error) => void, serializationContext?: any) {
|
71
113
|
try {
|
72
|
-
|
73
|
-
|
74
|
-
|
114
|
+
const postMessage: PortMessage = {
|
115
|
+
message,
|
116
|
+
serializationContext,
|
117
|
+
};
|
118
|
+
const transferList: worker_threads.TransferListItem[] = serializationContext?.transferList;
|
119
|
+
// delete the transfer list since that is simply transfered.
|
120
|
+
if (transferList)
|
121
|
+
serializationContext.transferList = [];
|
122
|
+
port.postMessage(postMessage, transferList);
|
75
123
|
}
|
76
124
|
catch (e) {
|
77
125
|
reject?.(e);
|
78
126
|
}
|
79
127
|
}
|
80
128
|
|
81
|
-
setupRpcPeer(peer: RpcPeer
|
82
|
-
|
129
|
+
static setupRpcPeer(peer: RpcPeer, port: worker_threads.MessagePort) {
|
130
|
+
port.on('message', (portMessage: PortMessage) => {
|
131
|
+
const { message, serializationContext } = portMessage;
|
132
|
+
peer.handleMessage(message, serializationContext);
|
133
|
+
});
|
134
|
+
peer.addSerializer(Buffer, 'Buffer', new BufferTransfer());
|
135
|
+
peer.addSerializer(Uint8Array, 'Uint8Array', new BufferTransfer());
|
136
|
+
}
|
137
|
+
|
138
|
+
static createRpcPeer(selfName: string, peerName: string, port: worker_threads.MessagePort): RpcPeer {
|
139
|
+
const peer = new RpcPeer(selfName, peerName, (message, reject, serializationContext) => NodeThreadWorker.send(message, port, reject, serializationContext));
|
140
|
+
NodeThreadWorker.setupRpcPeer(peer, port);
|
141
|
+
return peer;
|
83
142
|
}
|
84
143
|
}
|
@@ -2,9 +2,11 @@ import { RpcSerializer } from "./rpc";
|
|
2
2
|
|
3
3
|
export class BufferSerializer implements RpcSerializer {
|
4
4
|
serialize(value: Buffer) {
|
5
|
+
console.warn('Using slow buffer serialization. Ensure the peer supports SidebandBufferSerializer.');
|
5
6
|
return value.toString('base64');
|
6
7
|
}
|
7
8
|
deserialize(serialized: any) {
|
9
|
+
console.warn('Using slow buffer deserialization. Ensure the peer supports SidebandBufferSerializer.');
|
8
10
|
return Buffer.from(serialized, 'base64');
|
9
11
|
}
|
10
12
|
}
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import net from 'net';
|
2
|
-
import v8 from 'v8';
|
3
2
|
import worker_threads from "worker_threads";
|
4
3
|
import { getPluginNodePath } from "./plugin/plugin-npm-dependencies";
|
5
4
|
import { startPluginRemote } from "./plugin/plugin-remote-worker";
|
6
5
|
import { SidebandSocketSerializer } from "./plugin/socket-serializer";
|
7
6
|
import { RpcMessage } from "./rpc";
|
7
|
+
import { NodeThreadWorker } from './plugin/runtime/node-thread-worker';
|
8
8
|
|
9
9
|
function start(mainFilename: string) {
|
10
10
|
const pluginId = process.argv[3];
|
@@ -13,17 +13,8 @@ function start(mainFilename: string) {
|
|
13
13
|
if (process.argv[2] === 'child-thread') {
|
14
14
|
console.log('starting thread', pluginId);
|
15
15
|
const { port } = worker_threads.workerData as { port: worker_threads.MessagePort };
|
16
|
-
const peer = startPluginRemote(mainFilename, pluginId, (message, reject) =>
|
17
|
-
|
18
|
-
port.postMessage(v8.serialize(message));
|
19
|
-
}
|
20
|
-
catch (e) {
|
21
|
-
reject?.(e);
|
22
|
-
}
|
23
|
-
});
|
24
|
-
peer.transportSafeArgumentTypes.add(Buffer.name);
|
25
|
-
peer.transportSafeArgumentTypes.add(Uint8Array.name);
|
26
|
-
port.on('message', message => peer.handleMessage(v8.deserialize(message)));
|
16
|
+
const peer = startPluginRemote(mainFilename, pluginId, (message, reject, serializationContext) => NodeThreadWorker.send(message, port, reject, serializationContext));
|
17
|
+
NodeThreadWorker.setupRpcPeer(peer, port);
|
27
18
|
port.on('messageerror', e => {
|
28
19
|
console.error('message error', e);
|
29
20
|
process.exit(1);
|