@scrypted/server 0.123.9 → 0.123.10
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/cluster/cluster-labels.d.ts +3 -0
- package/dist/cluster/cluster-labels.js +39 -0
- package/dist/cluster/cluster-labels.js.map +1 -0
- package/dist/{scrypted-cluster-common.d.ts → cluster/cluster-setup.d.ts} +8 -6
- package/dist/{scrypted-cluster-common.js → cluster/cluster-setup.js} +52 -11
- package/dist/cluster/cluster-setup.js.map +1 -0
- package/dist/plugin/plugin-console.js +2 -2
- package/dist/plugin/plugin-console.js.map +1 -1
- package/dist/plugin/plugin-host.js +3 -3
- package/dist/plugin/plugin-host.js.map +1 -1
- package/dist/plugin/plugin-remote-worker.js +2 -2
- package/dist/plugin/plugin-remote-worker.js.map +1 -1
- package/dist/plugin/runtime/cluster-fork.worker.d.ts +1 -1
- package/dist/plugin/runtime/cluster-fork.worker.js +4 -3
- package/dist/plugin/runtime/cluster-fork.worker.js.map +1 -1
- package/dist/plugin/runtime/node-fork-worker.js +2 -2
- package/dist/plugin/runtime/node-fork-worker.js.map +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +2 -2
- package/dist/runtime.js.map +1 -1
- package/dist/scrypted-cluster-main.d.ts +31 -0
- package/dist/scrypted-cluster-main.js +232 -2
- package/dist/scrypted-cluster-main.js.map +1 -1
- package/dist/scrypted-main-exports.js +2 -2
- package/dist/scrypted-main-exports.js.map +1 -1
- package/dist/scrypted-server-main.js +4 -3
- package/dist/scrypted-server-main.js.map +1 -1
- package/dist/services/cluster-fork.d.ts +2 -2
- package/dist/services/cluster-fork.js +2 -2
- package/dist/services/cluster-fork.js.map +1 -1
- package/package.json +1 -1
- package/python/plugin_remote.py +100 -141
- package/src/cluster/cluster-labels.ts +36 -0
- package/src/{scrypted-cluster-common.ts → cluster/cluster-setup.ts} +65 -13
- package/src/plugin/plugin-console.ts +1 -1
- package/src/plugin/plugin-host.ts +4 -4
- package/src/plugin/plugin-remote-worker.ts +2 -7
- package/src/plugin/runtime/cluster-fork.worker.ts +2 -2
- package/src/plugin/runtime/node-fork-worker.ts +1 -1
- package/src/runtime.ts +2 -2
- package/src/scrypted-cluster-main.ts +280 -1
- package/src/scrypted-main-exports.ts +1 -1
- package/src/scrypted-server-main.ts +2 -1
- package/src/services/cluster-fork.ts +2 -1
- package/dist/scrypted-cluster-common.js.map +0 -1
- package/dist/scrypted-cluster.d.ts +0 -38
- package/dist/scrypted-cluster.js +0 -291
- package/dist/scrypted-cluster.js.map +0 -1
- package/src/scrypted-cluster.ts +0 -345
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"scrypted-cluster.js","sourceRoot":"","sources":["../src/scrypted-cluster.ts"],"names":[],"mappings":"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"}
|
package/src/scrypted-cluster.ts
DELETED
@@ -1,345 +0,0 @@
|
|
1
|
-
import type { ForkOptions } from '@scrypted/types';
|
2
|
-
import net from 'net';
|
3
|
-
import os from 'os';
|
4
|
-
import type { Readable } from 'stream';
|
5
|
-
import tls from 'tls';
|
6
|
-
import type { createSelfSignedCertificate } from './cert';
|
7
|
-
import { computeClusterObjectHash } from './cluster/cluster-hash';
|
8
|
-
import type { ClusterObject } from './cluster/connect-rpc-object';
|
9
|
-
import { getPluginVolume, getScryptedVolume } from './plugin/plugin-volume';
|
10
|
-
import { prepareZip } from './plugin/runtime/node-worker-common';
|
11
|
-
import { getBuiltinRuntimeHosts } from './plugin/runtime/runtime-host';
|
12
|
-
import { RuntimeWorker } from './plugin/runtime/runtime-worker';
|
13
|
-
import { RpcPeer } from './rpc';
|
14
|
-
import { createRpcDuplexSerializer } from './rpc-serializer';
|
15
|
-
import type { ScryptedRuntime } from './runtime';
|
16
|
-
import { prepareClusterPeer } from './scrypted-cluster-common';
|
17
|
-
import { sleep } from './sleep';
|
18
|
-
|
19
|
-
export class PeerLiveness {
|
20
|
-
__proxy_oneway_methods = ['kill'];
|
21
|
-
constructor(private killed: Promise<any>) {
|
22
|
-
}
|
23
|
-
async waitKilled() {
|
24
|
-
return this.killed;
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
export class ClusterForkResult extends PeerLiveness {
|
29
|
-
constructor(private peer: RpcPeer, killed: Promise<any>, private result: any) {
|
30
|
-
super(killed);
|
31
|
-
}
|
32
|
-
|
33
|
-
async kill() {
|
34
|
-
this.peer.kill('killed');
|
35
|
-
}
|
36
|
-
|
37
|
-
async getResult() {
|
38
|
-
return this.result;
|
39
|
-
}
|
40
|
-
}
|
41
|
-
|
42
|
-
export type ClusterForkParam = (peerLiveness: PeerLiveness, runtime: string, packageJson: any, zipHash: string, getZip: () => Promise<Buffer>) => Promise<ClusterForkResult>;
|
43
|
-
export type InitializeCluster = (cluster: { clusterId: string, clusterSecret: string }) => Promise<void>;
|
44
|
-
|
45
|
-
export interface ClusterWorkerProperties {
|
46
|
-
labels: string[];
|
47
|
-
}
|
48
|
-
|
49
|
-
export interface ClusterWorker extends ClusterWorkerProperties {
|
50
|
-
peer: RpcPeer;
|
51
|
-
}
|
52
|
-
|
53
|
-
export function getScryptedClusterMode(): ['server' | 'client', string, number] {
|
54
|
-
const mode = process.env.SCRYPTED_CLUSTER_MODE as 'server' | 'client';
|
55
|
-
if (!mode)
|
56
|
-
return;
|
57
|
-
|
58
|
-
if (!['server', 'client'].includes(mode))
|
59
|
-
throw new Error('SCRYPTED_CLUSTER_MODE must be set to either "server" or "client".');
|
60
|
-
|
61
|
-
if (!process.env.SCRYPTED_CLUSTER_SECRET)
|
62
|
-
throw new Error('SCRYPTED_CLUSTER_MODE is set but SCRYPTED_CLUSTER_SECRET is not set.');
|
63
|
-
|
64
|
-
const [server, sport] = process.env.SCRYPTED_CLUSTER_SERVER?.split(':') || [];
|
65
|
-
const port = parseInt(sport) || 10556;
|
66
|
-
const address = process.env.SCRYPTED_CLUSTER_ADDRESS;
|
67
|
-
|
68
|
-
if (mode === 'client') {
|
69
|
-
if (!net.isIP(server))
|
70
|
-
throw new Error('SCRYPTED_CLUSTER_SERVER is not a valid IP address:port.');
|
71
|
-
|
72
|
-
if (!net.isIP(address))
|
73
|
-
throw new Error('SCRYPTED_CLUSTER_ADDRESS is not set to a valid IP address.');
|
74
|
-
}
|
75
|
-
else {
|
76
|
-
// the cluster address may come from the server:port combo or address variable but not both.
|
77
|
-
if (address && server && server !== address)
|
78
|
-
throw new Error('SCRYPTED_CLUSTER_ADDRESS and SCRYPTED_CLUSTER_SERVER must not both be used.');
|
79
|
-
|
80
|
-
const serverAddress = address || server;
|
81
|
-
if (!net.isIP(serverAddress))
|
82
|
-
throw new Error('SCRYPTED_CLUSTER_ADDRESS is not set.');
|
83
|
-
process.env.SCRYPTED_CLUSTER_ADDRESS = serverAddress;
|
84
|
-
delete process.env.SCRYPTED_CLUSTER_SERVER;
|
85
|
-
}
|
86
|
-
|
87
|
-
return [mode, server, port];
|
88
|
-
}
|
89
|
-
|
90
|
-
function peerLifecycle(serializer: ReturnType<typeof createRpcDuplexSerializer>, peer: RpcPeer, socket: tls.TLSSocket, type: 'server' | 'client') {
|
91
|
-
serializer.setupRpcPeer(peer);
|
92
|
-
|
93
|
-
socket.on('data', data => serializer.onData(data));
|
94
|
-
|
95
|
-
socket.on('error', e => {
|
96
|
-
peer.kill(e.message);
|
97
|
-
});
|
98
|
-
socket.on('close', () => {
|
99
|
-
peer.kill(`cluster ${type} closed`);
|
100
|
-
});
|
101
|
-
peer.killed.then(() => {
|
102
|
-
socket.destroy();
|
103
|
-
});
|
104
|
-
}
|
105
|
-
|
106
|
-
function preparePeer(socket: tls.TLSSocket, type: 'server' | 'client') {
|
107
|
-
const serializer = createRpcDuplexSerializer(socket);
|
108
|
-
const peer = new RpcPeer(`cluster-remote:${socket.remoteAddress}:${socket.remotePort}`, 'cluster-host', (message, reject, serializationContext) => {
|
109
|
-
serializer.sendMessage(message, reject, serializationContext);
|
110
|
-
});
|
111
|
-
|
112
|
-
peerLifecycle(serializer, peer, socket, type);
|
113
|
-
|
114
|
-
return peer;
|
115
|
-
}
|
116
|
-
|
117
|
-
export interface ClusterForkOptions {
|
118
|
-
runtime?: ForkOptions['runtime'];
|
119
|
-
labels?: ForkOptions['labels'];
|
120
|
-
}
|
121
|
-
|
122
|
-
export function matchesClusterLabels(options: ClusterForkOptions, labels: string[]) {
|
123
|
-
let matched = 0;
|
124
|
-
for (const label of options?.labels?.require || []) {
|
125
|
-
if (!labels.includes(label))
|
126
|
-
return 0;
|
127
|
-
}
|
128
|
-
|
129
|
-
// if there is nothing in the any list, consider it matched
|
130
|
-
let foundAny = !options?.labels?.any?.length;
|
131
|
-
for (const label of options.labels?.any || []) {
|
132
|
-
if (labels.includes(label)) {
|
133
|
-
matched++;
|
134
|
-
foundAny = true;
|
135
|
-
}
|
136
|
-
}
|
137
|
-
if (!foundAny)
|
138
|
-
return 0;
|
139
|
-
|
140
|
-
for (const label of options?.labels?.prefer || []) {
|
141
|
-
if (labels.includes(label))
|
142
|
-
matched++;
|
143
|
-
}
|
144
|
-
// ensure non zero result.
|
145
|
-
matched++;
|
146
|
-
return matched;
|
147
|
-
}
|
148
|
-
|
149
|
-
export function getClusterLabels() {
|
150
|
-
let labels = process.env.SCRYPTED_CLUSTER_LABELS?.split(',') || [];
|
151
|
-
labels.push(process.arch, process.platform, os.hostname());
|
152
|
-
labels = [...new Set(labels)];
|
153
|
-
return labels;
|
154
|
-
}
|
155
|
-
|
156
|
-
type ConnectForkWorker = (auth: ClusterObject, properties: ClusterWorkerProperties) => Promise<{ clusterId: string }>;
|
157
|
-
|
158
|
-
export function startClusterClient(mainFilename: string) {
|
159
|
-
const labels = getClusterLabels();
|
160
|
-
|
161
|
-
const clusterSecret = process.env.SCRYPTED_CLUSTER_SECRET;
|
162
|
-
const clusterMode = getScryptedClusterMode();
|
163
|
-
const [, host, port] = clusterMode;
|
164
|
-
(async () => {
|
165
|
-
while (true) {
|
166
|
-
const backoff = sleep(10000);
|
167
|
-
const socket = tls.connect({
|
168
|
-
host,
|
169
|
-
port,
|
170
|
-
rejectUnauthorized: false,
|
171
|
-
});
|
172
|
-
|
173
|
-
const { localAddress, localPort } = socket;
|
174
|
-
socket.on('secureConnect', () => {
|
175
|
-
console.log('Cluster server connected.', localAddress, localPort);
|
176
|
-
});
|
177
|
-
socket.on('close', () => {
|
178
|
-
console.log('Cluster server disconnected.', localAddress, localPort);
|
179
|
-
});
|
180
|
-
|
181
|
-
const peer = preparePeer(socket, 'client');
|
182
|
-
|
183
|
-
try {
|
184
|
-
const connectForkWorker: ConnectForkWorker = await peer.getParam('connectForkWorker');
|
185
|
-
const auth: ClusterObject = {
|
186
|
-
address: socket.localAddress,
|
187
|
-
port: socket.localPort,
|
188
|
-
id: undefined,
|
189
|
-
proxyId: undefined,
|
190
|
-
sourceKey: undefined,
|
191
|
-
sha256: undefined,
|
192
|
-
};
|
193
|
-
auth.sha256 = computeClusterObjectHash(auth, clusterSecret);
|
194
|
-
|
195
|
-
const properties: ClusterWorkerProperties = {
|
196
|
-
labels,
|
197
|
-
};
|
198
|
-
|
199
|
-
const { clusterId } = await connectForkWorker(auth, properties);
|
200
|
-
const clusterPeerSetup = prepareClusterPeer(peer);
|
201
|
-
await clusterPeerSetup.initializeCluster({ clusterId, clusterSecret });
|
202
|
-
|
203
|
-
const clusterForkParam: ClusterForkParam = async (
|
204
|
-
peerLiveness: PeerLiveness,
|
205
|
-
runtime: string,
|
206
|
-
packageJson: any,
|
207
|
-
zipHash: string,
|
208
|
-
getZip: () => Promise<Buffer>) => {
|
209
|
-
let runtimeWorker: RuntimeWorker;
|
210
|
-
|
211
|
-
const builtins = getBuiltinRuntimeHosts();
|
212
|
-
const rt = builtins.get(runtime);
|
213
|
-
if (!rt)
|
214
|
-
throw new Error('unknown runtime ' + runtime);
|
215
|
-
|
216
|
-
const pluginId: string = packageJson.name;
|
217
|
-
const { zipFile, unzippedPath } = await prepareZip(getPluginVolume(pluginId), zipHash, getZip);
|
218
|
-
|
219
|
-
const volume = getScryptedVolume();
|
220
|
-
const pluginVolume = getPluginVolume(pluginId);
|
221
|
-
|
222
|
-
runtimeWorker = rt(mainFilename, pluginId, {
|
223
|
-
packageJson,
|
224
|
-
env: {
|
225
|
-
SCRYPTED_VOLUME: volume,
|
226
|
-
SCRYPTED_PLUGIN_VOLUME: pluginVolume,
|
227
|
-
},
|
228
|
-
pluginDebug: undefined,
|
229
|
-
zipFile,
|
230
|
-
unzippedPath,
|
231
|
-
zipHash,
|
232
|
-
}, undefined);
|
233
|
-
|
234
|
-
const threadPeer = new RpcPeer('main', 'thread', (message, reject, serializationContext) => runtimeWorker.send(message, reject, serializationContext));
|
235
|
-
runtimeWorker.setupRpcPeer(threadPeer);
|
236
|
-
runtimeWorker.on('exit', () => {
|
237
|
-
threadPeer.kill('worker exited');
|
238
|
-
});
|
239
|
-
runtimeWorker.on('error', e => {
|
240
|
-
threadPeer.kill('worker error ' + e);
|
241
|
-
});
|
242
|
-
threadPeer.killed.catch(() => { }).finally(() => {
|
243
|
-
runtimeWorker.kill();
|
244
|
-
});
|
245
|
-
peerLiveness.waitKilled().catch(() => { }).finally(() => {
|
246
|
-
threadPeer.kill('peer killed');
|
247
|
-
});
|
248
|
-
let getRemote: any;
|
249
|
-
try {
|
250
|
-
const initializeCluster: InitializeCluster = await threadPeer.getParam('initializeCluster');
|
251
|
-
await initializeCluster({ clusterId, clusterSecret });
|
252
|
-
getRemote = await threadPeer.getParam('getRemote');
|
253
|
-
}
|
254
|
-
catch (e) {
|
255
|
-
threadPeer.kill('cluster fork failed');
|
256
|
-
throw e;
|
257
|
-
}
|
258
|
-
|
259
|
-
const readStream = async function* (stream: Readable) {
|
260
|
-
for await (const buffer of stream) {
|
261
|
-
yield buffer;
|
262
|
-
}
|
263
|
-
}
|
264
|
-
|
265
|
-
const timeout = setTimeout(() => {
|
266
|
-
threadPeer.kill('cluster fork timeout');
|
267
|
-
}, 10000);
|
268
|
-
const clusterGetRemote = (...args: any[]) => {
|
269
|
-
clearTimeout(timeout);
|
270
|
-
return {
|
271
|
-
[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]: true,
|
272
|
-
stdout: readStream(runtimeWorker.stdout),
|
273
|
-
stderr: readStream(runtimeWorker.stderr),
|
274
|
-
getRemote,
|
275
|
-
};
|
276
|
-
};
|
277
|
-
|
278
|
-
const result = new ClusterForkResult(threadPeer, threadPeer.killed, clusterGetRemote);
|
279
|
-
return result;
|
280
|
-
};
|
281
|
-
|
282
|
-
peer.params['fork'] = clusterForkParam;
|
283
|
-
|
284
|
-
await peer.killed;
|
285
|
-
}
|
286
|
-
catch (e) {
|
287
|
-
peer.kill(e.message);
|
288
|
-
socket.destroy();
|
289
|
-
console.warn('Cluster client error:', localAddress, localPort, e);
|
290
|
-
}
|
291
|
-
await backoff;
|
292
|
-
}
|
293
|
-
})();
|
294
|
-
}
|
295
|
-
|
296
|
-
export function createClusterServer(runtime: ScryptedRuntime, certificate: ReturnType<typeof createSelfSignedCertificate>) {
|
297
|
-
const server = tls.createServer({
|
298
|
-
key: certificate.serviceKey,
|
299
|
-
cert: certificate.certificate,
|
300
|
-
}, (socket) => {
|
301
|
-
console.log('Cluster client connected.', socket.remoteAddress, socket.remotePort);
|
302
|
-
socket.on('close', () => {
|
303
|
-
console.log('Cluster client disconnected.', socket.remoteAddress, socket.remotePort);
|
304
|
-
});
|
305
|
-
|
306
|
-
const peer = preparePeer(socket, 'server');
|
307
|
-
|
308
|
-
const connectForkWorker: ConnectForkWorker = async (auth: ClusterObject, properties: ClusterWorkerProperties) => {
|
309
|
-
try {
|
310
|
-
const sha256 = computeClusterObjectHash(auth, runtime.clusterSecret);
|
311
|
-
if (sha256 !== auth.sha256)
|
312
|
-
throw new Error('cluster object hash mismatch');
|
313
|
-
// the remote address may be ipv6 prefixed so use a fuzzy match.
|
314
|
-
// eg ::ffff:192.168.2.124
|
315
|
-
if (!process.env.SCRYPTED_DISABLE_CLUSTER_SERVER_TRUST) {
|
316
|
-
if (auth.port !== socket.remotePort || !socket.remoteAddress.endsWith(auth.address))
|
317
|
-
throw new Error('cluster object address mismatch');
|
318
|
-
}
|
319
|
-
const worker: ClusterWorker = {
|
320
|
-
...properties,
|
321
|
-
peer,
|
322
|
-
};
|
323
|
-
runtime.clusterWorkers.add(worker);
|
324
|
-
peer.killed.then(() => {
|
325
|
-
runtime.clusterWorkers.delete(worker);
|
326
|
-
});
|
327
|
-
socket.on('close', () => {
|
328
|
-
runtime.clusterWorkers.delete(worker);
|
329
|
-
});
|
330
|
-
console.log('Cluster client authenticated.', socket.remoteAddress, socket.remotePort, properties);
|
331
|
-
}
|
332
|
-
catch (e) {
|
333
|
-
peer.kill(e);
|
334
|
-
socket.destroy();
|
335
|
-
}
|
336
|
-
|
337
|
-
return {
|
338
|
-
clusterId: runtime.clusterId,
|
339
|
-
}
|
340
|
-
}
|
341
|
-
peer.params['connectForkWorker'] = connectForkWorker;
|
342
|
-
});
|
343
|
-
|
344
|
-
return server;
|
345
|
-
}
|