@push.rocks/smartrust 2.1.0 → 2.3.0
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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.rustbridge.d.ts +16 -0
- package/dist_ts/classes.rustbridge.js +251 -26
- package/dist_ts/classes.rustbridgerequesterror.d.ts +1 -1
- package/dist_ts/classes.rustbridgerequesterror.js +1 -1
- package/dist_ts/classes.stdiotransport.d.ts +14 -0
- package/dist_ts/classes.stdiotransport.js +152 -3
- package/dist_ts/interfaces/config.d.ts +19 -1
- package/dist_ts/interfaces/ipc.d.ts +14 -0
- package/dist_ts/interfaces/transport.d.ts +4 -0
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/package.json +4 -4
- package/readme.md +80 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.rustbridge.ts +287 -28
- package/ts/classes.rustbridgerequesterror.ts +2 -0
- package/ts/classes.stdiotransport.ts +152 -2
- package/ts/interfaces/config.ts +19 -1
- package/ts/interfaces/ipc.ts +16 -0
- package/ts/interfaces/transport.ts +6 -0
- package/ts/plugins.ts +2 -1
|
@@ -6,7 +6,12 @@ export interface IStdioTransportOptions {
|
|
|
6
6
|
cliArgs: string[];
|
|
7
7
|
env?: Record<string, string>;
|
|
8
8
|
inheritedFileDescriptors?: readonly number[];
|
|
9
|
+
sensitiveByteChannel?: {
|
|
10
|
+
maxPayloadSize: number;
|
|
11
|
+
};
|
|
9
12
|
maxPayloadSize: number;
|
|
13
|
+
/** Default for every cleanup path, including automatic stdin failure. */
|
|
14
|
+
terminationGracePeriodMs?: number;
|
|
10
15
|
logger: IRustBridgeLogger;
|
|
11
16
|
}
|
|
12
17
|
/**
|
|
@@ -21,12 +26,19 @@ export declare class StdioTransport extends plugins.events.EventEmitter implemen
|
|
|
21
26
|
private _connected;
|
|
22
27
|
constructor(options: IStdioTransportOptions);
|
|
23
28
|
get connected(): boolean;
|
|
29
|
+
get sensitiveFileDescriptor(): number | null;
|
|
24
30
|
/**
|
|
25
31
|
* Spawn the child process. Resolves when the process is running (not necessarily ready).
|
|
26
32
|
*/
|
|
27
33
|
connect(): Promise<void>;
|
|
28
34
|
/** Write data to stdin and resolve after the stream callback confirms it. */
|
|
29
35
|
write(data: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Write the single sensitive frame owned by this child generation. The frame
|
|
38
|
+
* header and request id are non-secret; `data` is written without converting
|
|
39
|
+
* it to a string or copying its backing ArrayBuffer.
|
|
40
|
+
*/
|
|
41
|
+
writeSensitiveFrame(requestId: string, data: Uint8Array<ArrayBuffer>): Promise<void>;
|
|
30
42
|
/**
|
|
31
43
|
* Kill the child process without waiting for confirmation.
|
|
32
44
|
*/
|
|
@@ -41,6 +53,8 @@ export declare class StdioTransport extends plugins.events.EventEmitter implemen
|
|
|
41
53
|
private sendSignal;
|
|
42
54
|
private hasExited;
|
|
43
55
|
private destroyOwnedStdioEndpoint;
|
|
56
|
+
private writeSensitiveChunk;
|
|
57
|
+
private destroySensitiveEndpoint;
|
|
44
58
|
private toError;
|
|
45
59
|
private getErrorMessage;
|
|
46
60
|
}
|
|
@@ -2,6 +2,8 @@ import * as plugins from './plugins.js';
|
|
|
2
2
|
import { LineScanner } from './classes.linescanner.js';
|
|
3
3
|
const DEFAULT_DISCONNECT_GRACE_PERIOD_MS = 5000;
|
|
4
4
|
const MAX_TIMER_DELAY_MS = 2_147_483_647;
|
|
5
|
+
const SENSITIVE_FRAME_HEADER_SIZE = 16;
|
|
6
|
+
const SENSITIVE_FRAME_MAGIC = 'SMRS';
|
|
5
7
|
/**
|
|
6
8
|
* Transport that spawns a child process and communicates via stdin/stdout.
|
|
7
9
|
* Extracted from the original RustBridge process management logic.
|
|
@@ -14,12 +16,31 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
14
16
|
_connected = false;
|
|
15
17
|
constructor(options) {
|
|
16
18
|
super();
|
|
17
|
-
|
|
19
|
+
if (options.terminationGracePeriodMs !== undefined
|
|
20
|
+
&& (!Number.isSafeInteger(options.terminationGracePeriodMs) || options.terminationGracePeriodMs < 0)) {
|
|
21
|
+
throw new RangeError('StdioTransport terminationGracePeriodMs must be a non-negative safe integer');
|
|
22
|
+
}
|
|
23
|
+
if (options.sensitiveByteChannel
|
|
24
|
+
&& (!Number.isSafeInteger(options.sensitiveByteChannel.maxPayloadSize)
|
|
25
|
+
|| options.sensitiveByteChannel.maxPayloadSize <= 0)) {
|
|
26
|
+
throw new RangeError('StdioTransport sensitiveByteChannel maxPayloadSize must be a positive safe integer');
|
|
27
|
+
}
|
|
28
|
+
this.options = {
|
|
29
|
+
...options,
|
|
30
|
+
sensitiveByteChannel: options.sensitiveByteChannel
|
|
31
|
+
? { ...options.sensitiveByteChannel }
|
|
32
|
+
: undefined,
|
|
33
|
+
};
|
|
18
34
|
this.lineScanner = new LineScanner(options.maxPayloadSize, options.logger);
|
|
19
35
|
}
|
|
20
36
|
get connected() {
|
|
21
37
|
return this._connected;
|
|
22
38
|
}
|
|
39
|
+
get sensitiveFileDescriptor() {
|
|
40
|
+
return this.options.sensitiveByteChannel
|
|
41
|
+
? 3 + (this.options.inheritedFileDescriptors?.length ?? 0)
|
|
42
|
+
: null;
|
|
43
|
+
}
|
|
23
44
|
/**
|
|
24
45
|
* Spawn the child process. Resolves when the process is running (not necessarily ready).
|
|
25
46
|
*/
|
|
@@ -37,6 +58,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
37
58
|
'pipe',
|
|
38
59
|
'pipe',
|
|
39
60
|
...(this.options.inheritedFileDescriptors ?? []),
|
|
61
|
+
...(this.options.sensitiveByteChannel ? ['pipe'] : []),
|
|
40
62
|
];
|
|
41
63
|
childProcess = plugins.childProcess.spawn(this.options.binaryPath, this.options.cliArgs, { stdio, env });
|
|
42
64
|
}
|
|
@@ -47,6 +69,12 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
47
69
|
const closePromise = new Promise((resolve) => {
|
|
48
70
|
resolveClose = resolve;
|
|
49
71
|
});
|
|
72
|
+
const sensitiveEndpoint = this.options.sensitiveByteChannel
|
|
73
|
+
? childProcess.stdio[this.sensitiveFileDescriptor]
|
|
74
|
+
: null;
|
|
75
|
+
const sensitiveWriter = sensitiveEndpoint instanceof plugins.stream.Writable
|
|
76
|
+
? sensitiveEndpoint
|
|
77
|
+
: null;
|
|
50
78
|
const generation = {
|
|
51
79
|
childProcess,
|
|
52
80
|
stderrRemainder: '',
|
|
@@ -61,6 +89,9 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
61
89
|
sigtermAttempted: false,
|
|
62
90
|
sigkillAttempted: false,
|
|
63
91
|
sigtermError: null,
|
|
92
|
+
sensitiveWriter,
|
|
93
|
+
sensitiveUsed: false,
|
|
94
|
+
sensitiveError: null,
|
|
64
95
|
};
|
|
65
96
|
this.generation = generation;
|
|
66
97
|
this.childProcess = childProcess;
|
|
@@ -94,6 +125,28 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
94
125
|
}
|
|
95
126
|
});
|
|
96
127
|
});
|
|
128
|
+
generation.sensitiveWriter?.on('error', (error) => {
|
|
129
|
+
if (generation.sensitiveError)
|
|
130
|
+
return;
|
|
131
|
+
generation.sensitiveError = error;
|
|
132
|
+
if (this.generation !== generation || generation.closed)
|
|
133
|
+
return;
|
|
134
|
+
this._connected = false;
|
|
135
|
+
queueMicrotask(() => {
|
|
136
|
+
if (this.generation !== generation || generation.closed)
|
|
137
|
+
return;
|
|
138
|
+
void this.disconnectAndWait().catch((disconnectError) => {
|
|
139
|
+
this.options.logger.log('error', 'Failed to clean up child after sensitive pipe error: '
|
|
140
|
+
+ this.getErrorMessage(disconnectError));
|
|
141
|
+
});
|
|
142
|
+
if (this.listenerCount('error') > 0)
|
|
143
|
+
this.emit('error', error);
|
|
144
|
+
else if (generation.disconnectPromise)
|
|
145
|
+
this.options.logger.log('error', 'Sensitive pipe error during disconnect: ' + error.message);
|
|
146
|
+
else
|
|
147
|
+
this.emit('error', error);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
97
150
|
// Handle stderr with cross-chunk buffering.
|
|
98
151
|
childProcess.stderr?.on('data', (data) => {
|
|
99
152
|
if (this.generation !== generation || generation.closed) {
|
|
@@ -136,6 +189,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
136
189
|
this.destroyOwnedStdioEndpoint(generation, 'stdin');
|
|
137
190
|
this.destroyOwnedStdioEndpoint(generation, 'stdout');
|
|
138
191
|
this.destroyOwnedStdioEndpoint(generation, 'stderr');
|
|
192
|
+
this.destroySensitiveEndpoint(generation);
|
|
139
193
|
});
|
|
140
194
|
});
|
|
141
195
|
// ChildProcess 'close' is the termination confirmation: the process has exited
|
|
@@ -209,6 +263,47 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
209
263
|
});
|
|
210
264
|
});
|
|
211
265
|
}
|
|
266
|
+
/**
|
|
267
|
+
* Write the single sensitive frame owned by this child generation. The frame
|
|
268
|
+
* header and request id are non-secret; `data` is written without converting
|
|
269
|
+
* it to a string or copying its backing ArrayBuffer.
|
|
270
|
+
*/
|
|
271
|
+
async writeSensitiveFrame(requestId, data) {
|
|
272
|
+
if (!(data instanceof Uint8Array) || !(data.buffer instanceof ArrayBuffer)) {
|
|
273
|
+
throw new TypeError('sensitive bytes must use an ArrayBuffer-backed Uint8Array');
|
|
274
|
+
}
|
|
275
|
+
const generation = this.generation;
|
|
276
|
+
if (!generation || generation.closed || generation.childProcess !== this.childProcess
|
|
277
|
+
|| !this._connected || !generation.sensitiveWriter || generation.sensitiveWriter.destroyed) {
|
|
278
|
+
throw new Error('sensitive byte pipe not available');
|
|
279
|
+
}
|
|
280
|
+
if (generation.sensitiveUsed)
|
|
281
|
+
throw new Error('sensitive byte pipe was already used');
|
|
282
|
+
generation.sensitiveUsed = true;
|
|
283
|
+
const maxPayloadSize = this.options.sensitiveByteChannel?.maxPayloadSize;
|
|
284
|
+
if (maxPayloadSize === undefined || data.byteLength > maxPayloadSize) {
|
|
285
|
+
throw new Error('sensitive byte payload exceeds its configured limit');
|
|
286
|
+
}
|
|
287
|
+
if (!/^[A-Za-z0-9_-]{1,128}$/.test(requestId))
|
|
288
|
+
throw new Error('invalid sensitive request id');
|
|
289
|
+
const requestIdBytes = Buffer.from(requestId, 'ascii');
|
|
290
|
+
const header = Buffer.alloc(SENSITIVE_FRAME_HEADER_SIZE + requestIdBytes.byteLength);
|
|
291
|
+
header.write(SENSITIVE_FRAME_MAGIC, 0, 4, 'ascii');
|
|
292
|
+
header.writeUInt8(1, 4);
|
|
293
|
+
header.writeUInt8(0, 5);
|
|
294
|
+
header.writeUInt16BE(requestIdBytes.byteLength, 6);
|
|
295
|
+
header.writeBigUInt64BE(BigInt(data.byteLength), 8);
|
|
296
|
+
requestIdBytes.copy(header, SENSITIVE_FRAME_HEADER_SIZE);
|
|
297
|
+
const payload = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
|
|
298
|
+
try {
|
|
299
|
+
await this.writeSensitiveChunk(generation, header, false);
|
|
300
|
+
await this.writeSensitiveChunk(generation, payload, true);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
this.destroySensitiveEndpoint(generation);
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
212
307
|
/**
|
|
213
308
|
* Kill the child process without waiting for confirmation.
|
|
214
309
|
*/
|
|
@@ -227,7 +322,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
227
322
|
* ChildProcess 'close' to confirm termination.
|
|
228
323
|
*/
|
|
229
324
|
disconnectAndWait(options = {}) {
|
|
230
|
-
const gracePeriodMs = options.gracePeriodMs ?? DEFAULT_DISCONNECT_GRACE_PERIOD_MS;
|
|
325
|
+
const gracePeriodMs = options.gracePeriodMs ?? this.options.terminationGracePeriodMs ?? DEFAULT_DISCONNECT_GRACE_PERIOD_MS;
|
|
231
326
|
if (!Number.isSafeInteger(gracePeriodMs) || gracePeriodMs < 0) {
|
|
232
327
|
throw new RangeError('StdioTransport gracePeriodMs must be a non-negative safe integer');
|
|
233
328
|
}
|
|
@@ -250,6 +345,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
250
345
|
generation.disconnectPromise = disconnectPromise;
|
|
251
346
|
generation.rejectDisconnect = rejectDisconnect;
|
|
252
347
|
this._connected = false;
|
|
348
|
+
this.destroySensitiveEndpoint(generation);
|
|
253
349
|
void disconnectPromise.then(() => {
|
|
254
350
|
if (generation.disconnectPromise === disconnectPromise) {
|
|
255
351
|
generation.rejectDisconnect = null;
|
|
@@ -272,6 +368,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
272
368
|
this.destroyOwnedStdioEndpoint(generation, 'stdin');
|
|
273
369
|
this.destroyOwnedStdioEndpoint(generation, 'stdout');
|
|
274
370
|
this.destroyOwnedStdioEndpoint(generation, 'stderr');
|
|
371
|
+
this.destroySensitiveEndpoint(generation);
|
|
275
372
|
return disconnectPromise;
|
|
276
373
|
}
|
|
277
374
|
generation.sigtermAttempted = true;
|
|
@@ -365,6 +462,58 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
365
462
|
}
|
|
366
463
|
}
|
|
367
464
|
}
|
|
465
|
+
writeSensitiveChunk(generation, data, end) {
|
|
466
|
+
return new Promise((resolve, reject) => {
|
|
467
|
+
const writer = generation.sensitiveWriter;
|
|
468
|
+
if (!writer || writer.destroyed || generation.closed || this.generation !== generation) {
|
|
469
|
+
reject(new Error('sensitive byte pipe not available'));
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
let settled = false;
|
|
473
|
+
const cleanup = () => {
|
|
474
|
+
writer.off('error', onError);
|
|
475
|
+
writer.off('close', onClose);
|
|
476
|
+
};
|
|
477
|
+
const settle = (error) => {
|
|
478
|
+
if (settled)
|
|
479
|
+
return;
|
|
480
|
+
settled = true;
|
|
481
|
+
cleanup();
|
|
482
|
+
if (error)
|
|
483
|
+
reject(error);
|
|
484
|
+
else
|
|
485
|
+
resolve();
|
|
486
|
+
};
|
|
487
|
+
const onError = (error) => settle(error);
|
|
488
|
+
const onClose = () => settle(new Error('sensitive byte pipe closed before write completion'));
|
|
489
|
+
writer.once('error', onError);
|
|
490
|
+
writer.once('close', onClose);
|
|
491
|
+
try {
|
|
492
|
+
if (end)
|
|
493
|
+
writer.end(data, () => settle());
|
|
494
|
+
else
|
|
495
|
+
writer.write(data, error => settle(error));
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
settle(this.toError(error, 'Failed to write sensitive byte pipe'));
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
destroySensitiveEndpoint(generation) {
|
|
503
|
+
const endpoint = generation.sensitiveWriter;
|
|
504
|
+
if (!endpoint || endpoint.destroyed)
|
|
505
|
+
return;
|
|
506
|
+
try {
|
|
507
|
+
endpoint.destroy();
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
const endpointError = this.toError(error, 'Failed to close sensitive byte pipe');
|
|
511
|
+
generation.rejectDisconnect?.(endpointError);
|
|
512
|
+
this.options.logger.log('error', endpointError.message);
|
|
513
|
+
if (this.listenerCount('error') > 0)
|
|
514
|
+
this.emit('error', endpointError);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
368
517
|
toError(error, prefix) {
|
|
369
518
|
return new Error(prefix + ': ' + this.getErrorMessage(error));
|
|
370
519
|
}
|
|
@@ -372,4 +521,4 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
372
521
|
return error instanceof Error ? error.message : String(error);
|
|
373
522
|
}
|
|
374
523
|
}
|
|
375
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdGRpb3RyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc3RkaW90cmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT3ZELE1BQU0sa0NBQWtDLEdBQUcsSUFBSSxDQUFDO0FBQ2hELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBMkJ6Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWTtJQUNyRCxPQUFPLENBQXlCO0lBQ2hDLFlBQVksR0FBNkMsSUFBSSxDQUFDO0lBQzlELFVBQVUsR0FBcUMsSUFBSSxDQUFDO0lBQ3BELFdBQVcsQ0FBYztJQUN6QixVQUFVLEdBQVksS0FBSyxDQUFDO0lBRXBDLFlBQVksT0FBK0I7UUFDekMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9DLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FDbkIsSUFBSSxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FDaEYsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7WUFD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
|
|
524
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdGRpb3RyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc3RkaW90cmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT3ZELE1BQU0sa0NBQWtDLEdBQUcsSUFBSSxDQUFDO0FBQ2hELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBQ3pDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBaUNyQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWTtJQUNyRCxPQUFPLENBQXlCO0lBQ2hDLFlBQVksR0FBNkMsSUFBSSxDQUFDO0lBQzlELFVBQVUsR0FBcUMsSUFBSSxDQUFDO0lBQ3BELFdBQVcsQ0FBYztJQUN6QixVQUFVLEdBQVksS0FBSyxDQUFDO0lBRXBDLFlBQVksT0FBK0I7UUFDekMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsS0FBSyxTQUFTO2VBQzdDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZHLE1BQU0sSUFBSSxVQUFVLENBQUMsNkVBQTZFLENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsb0JBQW9CO2VBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUM7bUJBQ2pFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLEVB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
|
|
@@ -17,7 +17,8 @@ export interface IRustBridgeRequestOptions {
|
|
|
17
17
|
export interface IRustBridgeTerminateOptions {
|
|
18
18
|
/**
|
|
19
19
|
* Time to allow an owned stdio child to exit after SIGTERM before SIGKILL.
|
|
20
|
-
* Zero requests immediate SIGKILL. Defaults to
|
|
20
|
+
* Zero requests immediate SIGKILL. Defaults to the bridge's
|
|
21
|
+
* terminationGracePeriodMs, or 5000 milliseconds when not configured.
|
|
21
22
|
*/
|
|
22
23
|
gracePeriodMs?: number;
|
|
23
24
|
}
|
|
@@ -56,10 +57,27 @@ export interface IRustBridgeOptions extends IBinaryLocatorOptions {
|
|
|
56
57
|
* closes the caller's source descriptors.
|
|
57
58
|
*/
|
|
58
59
|
inheritedFileDescriptors?: readonly number[];
|
|
60
|
+
/**
|
|
61
|
+
* Opt in to one owned, one-shot binary pipe for a sensitive request in each
|
|
62
|
+
* spawned stdio generation. The pipe is appended after caller-owned inherited
|
|
63
|
+
* descriptors, so their child descriptor numbers remain unchanged.
|
|
64
|
+
*/
|
|
65
|
+
sensitiveByteChannel?: {
|
|
66
|
+
/** Maximum raw sensitive payload size accepted by the bridge. */
|
|
67
|
+
maxPayloadSize: number;
|
|
68
|
+
};
|
|
59
69
|
/** Timeout for individual requests in ms (default: 30000) */
|
|
60
70
|
requestTimeoutMs?: number;
|
|
61
71
|
/** Timeout for the ready event during spawn in ms (default: 10000) */
|
|
62
72
|
readyTimeoutMs?: number;
|
|
73
|
+
/**
|
|
74
|
+
* Default stdio SIGTERM-to-SIGKILL grace period in milliseconds, including
|
|
75
|
+
* automatic startup and stdin-failure cleanup (default: 5000).
|
|
76
|
+
* Must be a non-negative safe integer. Explicit terminate() options override
|
|
77
|
+
* it only before cleanup starts; concurrent cleanup keeps its first choice.
|
|
78
|
+
* Socket termination never signals the remote daemon.
|
|
79
|
+
*/
|
|
80
|
+
terminationGracePeriodMs?: number;
|
|
63
81
|
/** Additional environment variables for the child process */
|
|
64
82
|
env?: Record<string, string>;
|
|
65
83
|
/** Name of the ready event emitted by the Rust binary (default: 'ready') */
|
|
@@ -5,6 +5,18 @@ export interface IManagementRequest {
|
|
|
5
5
|
id: string;
|
|
6
6
|
method: string;
|
|
7
7
|
params: Record<string, any>;
|
|
8
|
+
/** Value-free metadata for an associated one-shot binary frame. */
|
|
9
|
+
sensitive?: IManagementSensitivePayload;
|
|
10
|
+
}
|
|
11
|
+
export interface IManagementSensitivePayload {
|
|
12
|
+
protocol: 'smartrust-sensitive-v1';
|
|
13
|
+
fileDescriptor: number;
|
|
14
|
+
byteLength: number;
|
|
15
|
+
}
|
|
16
|
+
export interface IManagementSensitiveAck {
|
|
17
|
+
protocol: 'smartrust-sensitive-v1';
|
|
18
|
+
consumed: true;
|
|
19
|
+
byteLength: number;
|
|
8
20
|
}
|
|
9
21
|
/**
|
|
10
22
|
* Management response received from the Rust binary via stdout.
|
|
@@ -15,6 +27,8 @@ export interface IManagementResponse {
|
|
|
15
27
|
result?: any;
|
|
16
28
|
error?: string;
|
|
17
29
|
errorCode?: string;
|
|
30
|
+
/** Required after the receiver consumed the exact associated binary frame. */
|
|
31
|
+
sensitiveAck?: IManagementSensitiveAck;
|
|
18
32
|
}
|
|
19
33
|
/**
|
|
20
34
|
* Management event received from the Rust binary (unsolicited, no id field).
|
|
@@ -30,6 +30,10 @@ export interface IRustTransport extends plugins.events.EventEmitter {
|
|
|
30
30
|
connect(): Promise<void>;
|
|
31
31
|
/** Write a string to the transport. Handles backpressure. */
|
|
32
32
|
write(data: string): Promise<void>;
|
|
33
|
+
/** Child descriptor for the optional one-shot sensitive byte pipe. */
|
|
34
|
+
readonly sensitiveFileDescriptor?: number | null;
|
|
35
|
+
/** Write and close one correlated binary frame. Available only in stdio mode. */
|
|
36
|
+
writeSensitiveFrame?(requestId: string, data: Uint8Array<ArrayBuffer>): Promise<void>;
|
|
33
37
|
/** Disconnect the transport. For stdio: kills the process. For socket: closes the connection. */
|
|
34
38
|
disconnect(): void;
|
|
35
39
|
/** Disconnect and resolve only after the local transport has confirmed closure. */
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import * as childProcess from 'child_process';
|
|
|
4
4
|
import * as events from 'events';
|
|
5
5
|
import * as url from 'url';
|
|
6
6
|
import * as net from 'net';
|
|
7
|
-
|
|
7
|
+
import * as stream from 'stream';
|
|
8
|
+
export { path, fs, childProcess, events, url, net, stream };
|
|
8
9
|
import * as smartpath from '@push.rocks/smartpath';
|
|
9
10
|
export { smartpath };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -5,8 +5,9 @@ import * as childProcess from 'child_process';
|
|
|
5
5
|
import * as events from 'events';
|
|
6
6
|
import * as url from 'url';
|
|
7
7
|
import * as net from 'net';
|
|
8
|
-
|
|
8
|
+
import * as stream from 'stream';
|
|
9
|
+
export { path, fs, childProcess, events, url, net, stream };
|
|
9
10
|
// @push.rocks scope
|
|
10
11
|
import * as smartpath from '@push.rocks/smartpath';
|
|
11
12
|
export { smartpath };
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZTtBQUNmLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUU1RCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartrust",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A type-safe bridge between JavaScript engines and Rust binaries.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
"author": "Task Venture Capital GmbH",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@git.zone/tsbuild": "^4.
|
|
12
|
+
"@git.zone/tsbuild": "^4.5.0",
|
|
13
13
|
"@git.zone/tsrun": "^2.0.6",
|
|
14
|
-
"@git.zone/tstest": "^6.
|
|
15
|
-
"@types/node": "^26.5.
|
|
14
|
+
"@git.zone/tstest": "^6.1.1",
|
|
15
|
+
"@types/node": "^26.5.1"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@push.rocks/smartpath": "^6.0.0"
|
package/readme.md
CHANGED
|
@@ -134,6 +134,65 @@ non-empty descriptor list rejects because a socket daemon is not a child of the
|
|
|
134
134
|
bridge and cannot inherit them. Node.js does not support passing socket
|
|
135
135
|
descriptors this way on Windows.
|
|
136
136
|
|
|
137
|
+
### One-shot sensitive byte requests
|
|
138
|
+
|
|
139
|
+
Stdio mode can append one Smartrust-owned pipe after all caller-owned inherited
|
|
140
|
+
descriptors. It carries one raw byte payload without putting those bytes in the
|
|
141
|
+
JSON request, a string, an environment variable, or a backing file:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
const bridge = new RustBridge<TMyCommands>({
|
|
145
|
+
binaryName: 'my-rust-server',
|
|
146
|
+
sensitiveByteChannel: { maxPayloadSize: 2 * 1024 * 1024 },
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
await bridge.spawn();
|
|
150
|
+
const bytes = new Uint8Array([1, 2, 3]);
|
|
151
|
+
const result = await bridge.sendCommandWithSensitiveBytes('start', { port: 8080 }, bytes);
|
|
152
|
+
// Smartrust has cleared the exact `bytes` view before the promise settles.
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Only one sensitive request may use a spawned generation. It runs exclusively
|
|
156
|
+
with respect to other commands, but ordinary JSON commands can continue after
|
|
157
|
+
its successful acknowledgement. A new `spawn()` creates a new pipe. Socket
|
|
158
|
+
mode rejects `sensitiveByteChannel` because the daemon is not a child process.
|
|
159
|
+
|
|
160
|
+
The JSON request adds only this value-free metadata:
|
|
161
|
+
|
|
162
|
+
```json
|
|
163
|
+
{"sensitive":{"protocol":"smartrust-sensitive-v1","fileDescriptor":3,"byteLength":3}}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
The child descriptor is `3 + inheritedFileDescriptors.length`, so existing
|
|
167
|
+
inherited descriptor numbers never move. The binary frame is:
|
|
168
|
+
|
|
169
|
+
| Offset | Size | Value |
|
|
170
|
+
|---:|---:|---|
|
|
171
|
+
| 0 | 4 | ASCII `SMRS` |
|
|
172
|
+
| 4 | 1 | version `1` |
|
|
173
|
+
| 5 | 1 | flags `0` |
|
|
174
|
+
| 6 | 2 | big-endian request-id byte length |
|
|
175
|
+
| 8 | 8 | big-endian payload byte length |
|
|
176
|
+
| 16 | variable | ASCII request id, then raw payload bytes |
|
|
177
|
+
|
|
178
|
+
The receiver must consume and validate the complete frame before sending its
|
|
179
|
+
normal JSON response. That response must include an exact value-free ACK:
|
|
180
|
+
|
|
181
|
+
```json
|
|
182
|
+
{"sensitiveAck":{"protocol":"smartrust-sensitive-v1","consumed":true,"byteLength":3}}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Smartrust settles only after both the local pipe write callback and the matching
|
|
186
|
+
ACK, regardless of their event order. Abort, timeout, partial pipe failure,
|
|
187
|
+
malformed ACK, or a receiver error terminates the child and rejects every pending
|
|
188
|
+
request, so buffered bytes cannot become a later request.
|
|
189
|
+
|
|
190
|
+
Calling the method transfers exclusive use of the supplied mutable
|
|
191
|
+
`Uint8Array<ArrayBuffer>` view until settlement. Smartrust clears that exact
|
|
192
|
+
view after the write callback or failure. It cannot promise erasure of aliases,
|
|
193
|
+
JavaScript engine or Node.js internal copies, kernel pipe buffers, or memory the
|
|
194
|
+
receiver owns; each receiver must bound and clear its own buffers.
|
|
195
|
+
|
|
137
196
|
### Per-Command Deadlines and Cancellation
|
|
138
197
|
|
|
139
198
|
Non-streaming commands accept an optional `IRustBridgeRequestOptions` argument:
|
|
@@ -227,6 +286,24 @@ SIGKILL:
|
|
|
227
286
|
await bridge.terminate({ gracePeriodMs: 250 });
|
|
228
287
|
```
|
|
229
288
|
|
|
289
|
+
For workers that need longer cleanup, set `terminationGracePeriodMs` when
|
|
290
|
+
constructing the bridge. This default also applies when startup fails or stdin
|
|
291
|
+
breaks and cleanup begins automatically. Calling `terminate()` afterwards
|
|
292
|
+
cannot replace a grace period already selected by automatic cleanup.
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
const bridge = new RustBridge({
|
|
296
|
+
binaryName: 'worker',
|
|
297
|
+
terminationGracePeriodMs: 60_000,
|
|
298
|
+
});
|
|
299
|
+
await bridge.spawn();
|
|
300
|
+
await bridge.terminate(); // allows up to 60 seconds before SIGKILL
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
`terminationGracePeriodMs` accepts non-negative safe integers and defaults to
|
|
304
|
+
5000. `StdioTransport` accepts the same constructor option. Confirmed process
|
|
305
|
+
closure alone does not prove that an application's external cleanup succeeded.
|
|
306
|
+
|
|
230
307
|
Concurrent calls share one termination operation, and calls after confirmed
|
|
231
308
|
closure are no-ops. The first concurrent caller's grace period applies. In
|
|
232
309
|
socket mode, termination confirms only the local socket closure; the remote
|
|
@@ -439,6 +516,7 @@ const bridge = new RustBridge<TMyCommands>({
|
|
|
439
516
|
// --- Bridge Options ---
|
|
440
517
|
cliArgs: ['--management'], // optional: args passed to binary (default: ['--management'])
|
|
441
518
|
inheritedFileDescriptors: [sourceFd], // optional: caller-owned source fds mapped to child fd 3+
|
|
519
|
+
sensitiveByteChannel: { maxPayloadSize: 2 * 1024 * 1024 }, // optional: one owned raw-byte pipe per spawn
|
|
442
520
|
requestTimeoutMs: 30000, // optional: default request timeout (default: 30000)
|
|
443
521
|
streamTimeoutMs: 30000, // optional: streaming inactivity timeout (default: requestTimeoutMs)
|
|
444
522
|
readyTimeoutMs: 10000, // optional: ready event timeout (default: 10000)
|
|
@@ -654,8 +732,9 @@ fn main() {
|
|
|
654
732
|
|---|---|---|
|
|
655
733
|
| `constructor` | `new RustBridge<T>(options: IRustBridgeOptions)` | Create a new bridge instance |
|
|
656
734
|
| `spawn()` | `Promise<boolean>` | **Stdio mode**: Spawn and wait for ready; rejects invalid explicit selection, returns `false` for ordinary discovery/startup failure |
|
|
657
|
-
| `connect(socketPath, options?)` | `Promise<boolean>` | **Socket mode**: Connect to a running daemon; returns `false` on connection/readiness failure and rejects
|
|
735
|
+
| `connect(socketPath, options?)` | `Promise<boolean>` | **Socket mode**: Connect to a running daemon; returns `false` on connection/readiness failure and rejects stdio-only descriptor/byte-channel options |
|
|
658
736
|
| `sendCommand(method, params, options?)` | `Promise<TCommands[K]['result']>` | Send a typed command with an optional per-call timeout or abort signal |
|
|
737
|
+
| `sendCommandWithSensitiveBytes(method, params, bytes, options?)` | `Promise<TCommands[K]['result']>` | Send one exclusive JSON command with its raw bytes on the generation-owned one-shot pipe |
|
|
659
738
|
| `sendCommandStreaming(method, params)` | `StreamingResponse<TChunk, TResult>` | Send a streaming command; returns immediately |
|
|
660
739
|
| `terminate(options?)` | `Promise<void>` | Confirm stdio child exit or local socket closure; `gracePeriodMs` controls SIGKILL escalation |
|
|
661
740
|
| `kill()` | `void` | Fire-and-forget compatibility wrapper around `terminate()` |
|