@push.rocks/smartrust 2.2.0 → 2.4.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 +245 -24
- package/dist_ts/classes.rustbridgerequesterror.d.ts +4 -1
- package/dist_ts/classes.rustbridgerequesterror.js +4 -1
- package/dist_ts/classes.stdiotransport.d.ts +12 -0
- package/dist_ts/classes.stdiotransport.js +147 -2
- package/dist_ts/interfaces/config.d.ts +9 -0
- package/dist_ts/interfaces/ipc.d.ts +16 -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 +5 -5
- package/readme.md +86 -6
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.rustbridge.ts +281 -26
- package/ts/classes.rustbridgerequesterror.ts +6 -0
- package/ts/classes.stdiotransport.ts +145 -1
- package/ts/interfaces/config.ts +9 -0
- package/ts/interfaces/ipc.ts +18 -0
- package/ts/interfaces/transport.ts +6 -0
- package/ts/plugins.ts +2 -1
|
@@ -6,6 +6,9 @@ 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;
|
|
10
13
|
/** Default for every cleanup path, including automatic stdin failure. */
|
|
11
14
|
terminationGracePeriodMs?: number;
|
|
@@ -23,12 +26,19 @@ export declare class StdioTransport extends plugins.events.EventEmitter implemen
|
|
|
23
26
|
private _connected;
|
|
24
27
|
constructor(options: IStdioTransportOptions);
|
|
25
28
|
get connected(): boolean;
|
|
29
|
+
get sensitiveFileDescriptor(): number | null;
|
|
26
30
|
/**
|
|
27
31
|
* Spawn the child process. Resolves when the process is running (not necessarily ready).
|
|
28
32
|
*/
|
|
29
33
|
connect(): Promise<void>;
|
|
30
34
|
/** Write data to stdin and resolve after the stream callback confirms it. */
|
|
31
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>;
|
|
32
42
|
/**
|
|
33
43
|
* Kill the child process without waiting for confirmation.
|
|
34
44
|
*/
|
|
@@ -43,6 +53,8 @@ export declare class StdioTransport extends plugins.events.EventEmitter implemen
|
|
|
43
53
|
private sendSignal;
|
|
44
54
|
private hasExited;
|
|
45
55
|
private destroyOwnedStdioEndpoint;
|
|
56
|
+
private writeSensitiveChunk;
|
|
57
|
+
private destroySensitiveEndpoint;
|
|
46
58
|
private toError;
|
|
47
59
|
private getErrorMessage;
|
|
48
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.
|
|
@@ -18,12 +20,27 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
18
20
|
&& (!Number.isSafeInteger(options.terminationGracePeriodMs) || options.terminationGracePeriodMs < 0)) {
|
|
19
21
|
throw new RangeError('StdioTransport terminationGracePeriodMs must be a non-negative safe integer');
|
|
20
22
|
}
|
|
21
|
-
|
|
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
|
+
};
|
|
22
34
|
this.lineScanner = new LineScanner(options.maxPayloadSize, options.logger);
|
|
23
35
|
}
|
|
24
36
|
get connected() {
|
|
25
37
|
return this._connected;
|
|
26
38
|
}
|
|
39
|
+
get sensitiveFileDescriptor() {
|
|
40
|
+
return this.options.sensitiveByteChannel
|
|
41
|
+
? 3 + (this.options.inheritedFileDescriptors?.length ?? 0)
|
|
42
|
+
: null;
|
|
43
|
+
}
|
|
27
44
|
/**
|
|
28
45
|
* Spawn the child process. Resolves when the process is running (not necessarily ready).
|
|
29
46
|
*/
|
|
@@ -41,6 +58,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
41
58
|
'pipe',
|
|
42
59
|
'pipe',
|
|
43
60
|
...(this.options.inheritedFileDescriptors ?? []),
|
|
61
|
+
...(this.options.sensitiveByteChannel ? ['pipe'] : []),
|
|
44
62
|
];
|
|
45
63
|
childProcess = plugins.childProcess.spawn(this.options.binaryPath, this.options.cliArgs, { stdio, env });
|
|
46
64
|
}
|
|
@@ -51,6 +69,12 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
51
69
|
const closePromise = new Promise((resolve) => {
|
|
52
70
|
resolveClose = resolve;
|
|
53
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;
|
|
54
78
|
const generation = {
|
|
55
79
|
childProcess,
|
|
56
80
|
stderrRemainder: '',
|
|
@@ -65,6 +89,9 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
65
89
|
sigtermAttempted: false,
|
|
66
90
|
sigkillAttempted: false,
|
|
67
91
|
sigtermError: null,
|
|
92
|
+
sensitiveWriter,
|
|
93
|
+
sensitiveUsed: false,
|
|
94
|
+
sensitiveError: null,
|
|
68
95
|
};
|
|
69
96
|
this.generation = generation;
|
|
70
97
|
this.childProcess = childProcess;
|
|
@@ -98,6 +125,28 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
98
125
|
}
|
|
99
126
|
});
|
|
100
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
|
+
});
|
|
101
150
|
// Handle stderr with cross-chunk buffering.
|
|
102
151
|
childProcess.stderr?.on('data', (data) => {
|
|
103
152
|
if (this.generation !== generation || generation.closed) {
|
|
@@ -140,6 +189,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
140
189
|
this.destroyOwnedStdioEndpoint(generation, 'stdin');
|
|
141
190
|
this.destroyOwnedStdioEndpoint(generation, 'stdout');
|
|
142
191
|
this.destroyOwnedStdioEndpoint(generation, 'stderr');
|
|
192
|
+
this.destroySensitiveEndpoint(generation);
|
|
143
193
|
});
|
|
144
194
|
});
|
|
145
195
|
// ChildProcess 'close' is the termination confirmation: the process has exited
|
|
@@ -213,6 +263,47 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
213
263
|
});
|
|
214
264
|
});
|
|
215
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
|
+
}
|
|
216
307
|
/**
|
|
217
308
|
* Kill the child process without waiting for confirmation.
|
|
218
309
|
*/
|
|
@@ -254,6 +345,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
254
345
|
generation.disconnectPromise = disconnectPromise;
|
|
255
346
|
generation.rejectDisconnect = rejectDisconnect;
|
|
256
347
|
this._connected = false;
|
|
348
|
+
this.destroySensitiveEndpoint(generation);
|
|
257
349
|
void disconnectPromise.then(() => {
|
|
258
350
|
if (generation.disconnectPromise === disconnectPromise) {
|
|
259
351
|
generation.rejectDisconnect = null;
|
|
@@ -276,6 +368,7 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
276
368
|
this.destroyOwnedStdioEndpoint(generation, 'stdin');
|
|
277
369
|
this.destroyOwnedStdioEndpoint(generation, 'stdout');
|
|
278
370
|
this.destroyOwnedStdioEndpoint(generation, 'stderr');
|
|
371
|
+
this.destroySensitiveEndpoint(generation);
|
|
279
372
|
return disconnectPromise;
|
|
280
373
|
}
|
|
281
374
|
generation.sigtermAttempted = true;
|
|
@@ -369,6 +462,58 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
369
462
|
}
|
|
370
463
|
}
|
|
371
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
|
+
}
|
|
372
517
|
toError(error, prefix) {
|
|
373
518
|
return new Error(prefix + ': ' + this.getErrorMessage(error));
|
|
374
519
|
}
|
|
@@ -376,4 +521,4 @@ export class StdioTransport extends plugins.events.EventEmitter {
|
|
|
376
521
|
return error instanceof Error ? error.message : String(error);
|
|
377
522
|
}
|
|
378
523
|
}
|
|
379
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdGRpb3RyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc3RkaW90cmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT3ZELE1BQU0sa0NBQWtDLEdBQUcsSUFBSSxDQUFDO0FBQ2hELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBNkJ6Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWTtJQUNyRCxPQUFPLENBQXlCO0lBQ2hDLFlBQVksR0FBNkMsSUFBSSxDQUFDO0lBQzlELFVBQVUsR0FBcUMsSUFBSSxDQUFDO0lBQ3BELFdBQVcsQ0FBYztJQUN6QixVQUFVLEdBQVksS0FBSyxDQUFDO0lBRXBDLFlBQVksT0FBK0I7UUFDekMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsS0FBSyxTQUFTO2VBQzdDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZHLE1BQU0sSUFBSSxVQUFVLENBQUMsNkVBQTZFLENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09B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
|
|
524
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdGRpb3RyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc3RkaW90cmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT3ZELE1BQU0sa0NBQWtDLEdBQUcsSUFBSSxDQUFDO0FBQ2hELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBQ3pDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBaUNyQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWTtJQUNyRCxPQUFPLENBQXlCO0lBQ2hDLFlBQVksR0FBNkMsSUFBSSxDQUFDO0lBQzlELFVBQVUsR0FBcUMsSUFBSSxDQUFDO0lBQ3BELFdBQVcsQ0FBYztJQUN6QixVQUFVLEdBQVksS0FBSyxDQUFDO0lBRXBDLFlBQVksT0FBK0I7UUFDekMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsS0FBSyxTQUFTO2VBQzdDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZHLE1BQU0sSUFBSSxVQUFVLENBQUMsNkVBQTZFLENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsb0JBQW9CO2VBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUM7bUJBQ2pFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLEVB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
|
|
@@ -57,6 +57,15 @@ export interface IRustBridgeOptions extends IBinaryLocatorOptions {
|
|
|
57
57
|
* closes the caller's source descriptors.
|
|
58
58
|
*/
|
|
59
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
|
+
};
|
|
60
69
|
/** Timeout for individual requests in ms (default: 30000) */
|
|
61
70
|
requestTimeoutMs?: number;
|
|
62
71
|
/** Timeout for the ready event during spawn in ms (default: 10000) */
|
|
@@ -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,10 @@ export interface IManagementResponse {
|
|
|
15
27
|
result?: any;
|
|
16
28
|
error?: string;
|
|
17
29
|
errorCode?: string;
|
|
30
|
+
/** Optional structured details of a failure, for example per-field validation errors. */
|
|
31
|
+
errorData?: unknown;
|
|
32
|
+
/** Required after the receiver consumed the exact associated binary frame. */
|
|
33
|
+
sensitiveAck?: IManagementSensitiveAck;
|
|
18
34
|
}
|
|
19
35
|
/**
|
|
20
36
|
* 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.4.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": "^
|
|
13
|
-
"@git.zone/tsrun": "^
|
|
14
|
-
"@git.zone/tstest": "^6.
|
|
15
|
-
"@types/node": "^26.
|
|
12
|
+
"@git.zone/tsbuild": "^5.0.0",
|
|
13
|
+
"@git.zone/tsrun": "^3.0.0",
|
|
14
|
+
"@git.zone/tstest": "^6.2.0",
|
|
15
|
+
"@types/node": "^26.6.1"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@push.rocks/smartpath": "^6.0.0"
|
package/readme.md
CHANGED
|
@@ -47,7 +47,7 @@ If you're integrating Rust into a Node.js project, you'll inevitably need:
|
|
|
47
47
|
|-----------|--------|-------------|
|
|
48
48
|
| **TS → Rust** (Request) | `{"id": "req_1", "method": "start", "params": {...}}` | Command with unique ID |
|
|
49
49
|
| **Rust → TS** (Response) | `{"id": "req_1", "success": true, "result": {...}}` | Final response correlated by ID |
|
|
50
|
-
| **Rust → TS** (Error) | `{"id": "req_1", "success": false, "error": "msg", "errorCode": "EAPP_INVALID"}` | Error correlated by ID; `errorCode`
|
|
50
|
+
| **Rust → TS** (Error) | `{"id": "req_1", "success": false, "error": "msg", "errorCode": "EAPP_INVALID", "errorData": {...}}` | Error correlated by ID; `errorCode` and `errorData` are optional |
|
|
51
51
|
| **Rust → TS** (Stream Chunk) | `{"id": "req_1", "stream": true, "data": {...}}` | Intermediate chunk (zero or more) |
|
|
52
52
|
| **Rust → TS** (Event) | `{"event": "ready", "data": {...}}` | Unsolicited event (no ID) |
|
|
53
53
|
|
|
@@ -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:
|
|
@@ -215,6 +274,24 @@ message. The bridge-owned `code` remains
|
|
|
215
274
|
failures from application-specific Rust failures. Legacy responses and
|
|
216
275
|
non-string `errorCode` values leave `responseErrorCode` undefined.
|
|
217
276
|
|
|
277
|
+
When a failure has structured details, for example one reason per invalid
|
|
278
|
+
input, Rust can send them as the optional response `errorData`, any JSON
|
|
279
|
+
value. `RustBridgeRequestError.responseErrorData` carries it as sent, typed
|
|
280
|
+
`unknown`, so the caller narrows it for its own error codes. A response
|
|
281
|
+
without `errorData` leaves `responseErrorData` undefined.
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
// Rust: {"id":"req_7","success":false,"error":"Validation failed",
|
|
285
|
+
// "errorCode":"EVALIDATION","errorData":{"fields":[{"name":"port","messages":["must be 1-65535"]}]}}
|
|
286
|
+
try {
|
|
287
|
+
await bridge.sendCommand('configure', { port: 0 });
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (error instanceof RustBridgeRequestError && error.responseErrorCode === 'EVALIDATION') {
|
|
290
|
+
console.error(error.responseErrorData);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
218
295
|
### Confirmed Termination
|
|
219
296
|
|
|
220
297
|
Use `await bridge.terminate()` when later work must not overlap the current
|
|
@@ -368,8 +445,9 @@ try {
|
|
|
368
445
|
```
|
|
369
446
|
|
|
370
447
|
A final `success: false` response rejects both paths with the same
|
|
371
|
-
`RustBridgeRequestError`. When the response includes an `errorCode
|
|
372
|
-
|
|
448
|
+
`RustBridgeRequestError`. When the response includes an `errorCode` or
|
|
449
|
+
`errorData`, they are available as `responseErrorCode` and `responseErrorData`
|
|
450
|
+
on that error.
|
|
373
451
|
|
|
374
452
|
#### Stream Timeout
|
|
375
453
|
|
|
@@ -457,6 +535,7 @@ const bridge = new RustBridge<TMyCommands>({
|
|
|
457
535
|
// --- Bridge Options ---
|
|
458
536
|
cliArgs: ['--management'], // optional: args passed to binary (default: ['--management'])
|
|
459
537
|
inheritedFileDescriptors: [sourceFd], // optional: caller-owned source fds mapped to child fd 3+
|
|
538
|
+
sensitiveByteChannel: { maxPayloadSize: 2 * 1024 * 1024 }, // optional: one owned raw-byte pipe per spawn
|
|
460
539
|
requestTimeoutMs: 30000, // optional: default request timeout (default: 30000)
|
|
461
540
|
streamTimeoutMs: 30000, // optional: streaming inactivity timeout (default: requestTimeoutMs)
|
|
462
541
|
readyTimeoutMs: 10000, // optional: ready event timeout (default: 10000)
|
|
@@ -672,8 +751,9 @@ fn main() {
|
|
|
672
751
|
|---|---|---|
|
|
673
752
|
| `constructor` | `new RustBridge<T>(options: IRustBridgeOptions)` | Create a new bridge instance |
|
|
674
753
|
| `spawn()` | `Promise<boolean>` | **Stdio mode**: Spawn and wait for ready; rejects invalid explicit selection, returns `false` for ordinary discovery/startup failure |
|
|
675
|
-
| `connect(socketPath, options?)` | `Promise<boolean>` | **Socket mode**: Connect to a running daemon; returns `false` on connection/readiness failure and rejects
|
|
754
|
+
| `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 |
|
|
676
755
|
| `sendCommand(method, params, options?)` | `Promise<TCommands[K]['result']>` | Send a typed command with an optional per-call timeout or abort signal |
|
|
756
|
+
| `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 |
|
|
677
757
|
| `sendCommandStreaming(method, params)` | `StreamingResponse<TChunk, TResult>` | Send a streaming command; returns immediately |
|
|
678
758
|
| `terminate(options?)` | `Promise<void>` | Confirm stdio child exit or local socket closure; `gracePeriodMs` controls SIGKILL escalation |
|
|
679
759
|
| `kill()` | `void` | Fire-and-forget compatibility wrapper around `terminate()` |
|
|
@@ -738,14 +818,14 @@ fn main() {
|
|
|
738
818
|
| `IRustBridgeLogger` | Logger interface: `{ log(level, message, data?) }` |
|
|
739
819
|
| `IRustTransport` | Transport interface (extends `EventEmitter`) |
|
|
740
820
|
| `IManagementRequest` | IPC request shape: `{ id, method, params }` |
|
|
741
|
-
| `IManagementResponse` | IPC response shape: `{ id, success, result?, error?, errorCode? }` |
|
|
821
|
+
| `IManagementResponse` | IPC response shape: `{ id, success, result?, error?, errorCode?, errorData? }` |
|
|
742
822
|
| `IManagementEvent` | IPC event shape: `{ event, data }` |
|
|
743
823
|
| `IManagementStreamChunk` | IPC stream chunk shape: `{ id, stream: true, data }` |
|
|
744
824
|
| `ICommandDefinition` | Single command definition: `{ params, result }` |
|
|
745
825
|
| `TCommandMap` | `Record<string, ICommandDefinition>` |
|
|
746
826
|
| `TStreamingCommandKeys<T>` | Extracts keys from a command map that have a `chunk` field |
|
|
747
827
|
| `TExtractChunk<T>` | Extracts the chunk type from a streaming command definition |
|
|
748
|
-
| `RustBridgeRequestError` | Request error class with stable `code`, optional `responseErrorCode`, `requestId`, and `method` fields |
|
|
828
|
+
| `RustBridgeRequestError` | Request error class with stable `code`, optional `responseErrorCode`, `responseErrorData`, `requestId`, and `method` fields |
|
|
749
829
|
| `TRustBridgeRequestErrorCode` | Union of stable request error code strings |
|
|
750
830
|
|
|
751
831
|
## License and Legal Information
|