@push.rocks/smartrust 2.4.0 → 2.5.1

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartrust',
6
- version: '2.4.0',
6
+ version: '2.5.1',
7
7
  description: 'A type-safe bridge between JavaScript engines and Rust binaries.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx1QkFBdUI7SUFDN0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLGtFQUFrRTtDQUNoRixDQUFBIn0=
@@ -3,9 +3,16 @@ import type { IRustBridgeLogger } from './interfaces/index.js';
3
3
  * Buffer-based newline scanner for streaming binary data.
4
4
  * Accumulates chunks and emits complete lines via callback.
5
5
  * Used by both StdioTransport and SocketTransport.
6
+ *
7
+ * Each byte is scanned once and copied at most once into its line, so a line that arrives in many
8
+ * chunks costs time linear in its length.
6
9
  */
7
10
  export declare class LineScanner {
8
- private buffer;
11
+ /** Chunks of the line being received; none of them contains a newline. */
12
+ private pending;
13
+ private pendingLength;
14
+ /** Bytes after a line whose callback threw; they may contain newlines and are scanned first. */
15
+ private unscanned;
9
16
  private maxPayloadSize;
10
17
  private logger;
11
18
  constructor(maxPayloadSize: number, logger: IRustBridgeLogger);
@@ -15,4 +22,9 @@ export declare class LineScanner {
15
22
  push(chunk: Buffer, onLine: (line: string) => void): void;
16
23
  /** Reset the internal buffer. */
17
24
  clear(): void;
25
+ /** Joins the pending chunks with the line's last piece; null when the line is too large. */
26
+ private takeLine;
27
+ private appendPartial;
28
+ /** A subarray retains its entire backing allocation; copy a small piece of a large one. */
29
+ private static compact;
18
30
  }
@@ -2,9 +2,16 @@
2
2
  * Buffer-based newline scanner for streaming binary data.
3
3
  * Accumulates chunks and emits complete lines via callback.
4
4
  * Used by both StdioTransport and SocketTransport.
5
+ *
6
+ * Each byte is scanned once and copied at most once into its line, so a line that arrives in many
7
+ * chunks costs time linear in its length.
5
8
  */
6
9
  export class LineScanner {
7
- buffer = Buffer.alloc(0);
10
+ /** Chunks of the line being received; none of them contains a newline. */
11
+ pending = [];
12
+ pendingLength = 0;
13
+ /** Bytes after a line whose callback threw; they may contain newlines and are scanned first. */
14
+ unscanned = Buffer.alloc(0);
8
15
  maxPayloadSize;
9
16
  logger;
10
17
  constructor(maxPayloadSize, logger) {
@@ -15,14 +22,15 @@ export class LineScanner {
15
22
  * Feed a chunk of data. Calls onLine for each complete newline-terminated line found.
16
23
  */
17
24
  push(chunk, onLine) {
18
- this.buffer = Buffer.concat([this.buffer, chunk]);
25
+ const input = this.unscanned.length > 0 ? Buffer.concat([this.unscanned, chunk]) : chunk;
26
+ this.unscanned = Buffer.alloc(0);
27
+ let start = 0;
19
28
  try {
20
29
  let newlineIndex;
21
- while ((newlineIndex = this.buffer.indexOf(0x0A)) !== -1) {
22
- const lineBuffer = this.buffer.subarray(0, newlineIndex);
23
- this.buffer = this.buffer.subarray(newlineIndex + 1);
24
- if (lineBuffer.length > this.maxPayloadSize) {
25
- this.logger.log('error', `Inbound message exceeds maxPayloadSize (${lineBuffer.length} bytes), dropping`);
30
+ while ((newlineIndex = input.indexOf(0x0A, start)) !== -1) {
31
+ const lineBuffer = this.takeLine(input.subarray(start, newlineIndex));
32
+ start = newlineIndex + 1;
33
+ if (!lineBuffer) {
26
34
  continue;
27
35
  }
28
36
  const line = lineBuffer.toString('utf8').trim();
@@ -30,27 +38,52 @@ export class LineScanner {
30
38
  onLine(line);
31
39
  }
32
40
  }
33
- // Prevent OOM if sender never sends newline
34
- if (this.buffer.length > this.maxPayloadSize) {
35
- this.logger.log('error', `Buffer exceeded maxPayloadSize (${this.buffer.length} bytes) without newline, clearing`);
36
- this.buffer = Buffer.alloc(0);
37
- }
41
+ this.appendPartial(input.subarray(start));
38
42
  }
39
- finally {
40
- // A subarray retains its entire backing allocation, even when empty.
41
- // Compact once per chunk, including when a callback throws, without
42
- // repeatedly copying the unread suffix for each parsed line.
43
- if (this.buffer.length === 0) {
44
- this.buffer = Buffer.alloc(0);
45
- }
46
- else if (this.buffer.buffer.byteLength > Math.max(Buffer.poolSize, this.buffer.length * 2)) {
47
- this.buffer = Buffer.from(this.buffer);
48
- }
43
+ catch (error) {
44
+ // Keep what follows the failed line for the next push, without retaining what was consumed.
45
+ this.unscanned = LineScanner.compact(input.subarray(start));
46
+ throw error;
49
47
  }
50
48
  }
51
49
  /** Reset the internal buffer. */
52
50
  clear() {
53
- this.buffer = Buffer.alloc(0);
51
+ this.pending = [];
52
+ this.pendingLength = 0;
53
+ this.unscanned = Buffer.alloc(0);
54
+ }
55
+ /** Joins the pending chunks with the line's last piece; null when the line is too large. */
56
+ takeLine(tail) {
57
+ const length = this.pendingLength + tail.length;
58
+ const pending = this.pending;
59
+ this.pending = [];
60
+ this.pendingLength = 0;
61
+ if (length > this.maxPayloadSize) {
62
+ this.logger.log('error', `Inbound message exceeds maxPayloadSize (${length} bytes), dropping`);
63
+ return null;
64
+ }
65
+ return pending.length === 0 ? tail : Buffer.concat([...pending, tail], length);
66
+ }
67
+ appendPartial(partial) {
68
+ if (partial.length === 0) {
69
+ return;
70
+ }
71
+ // Prevent OOM if sender never sends newline
72
+ if (this.pendingLength + partial.length > this.maxPayloadSize) {
73
+ this.logger.log('error', `Buffer exceeded maxPayloadSize (${this.pendingLength + partial.length} bytes) without newline, clearing`);
74
+ this.pending = [];
75
+ this.pendingLength = 0;
76
+ return;
77
+ }
78
+ this.pending.push(LineScanner.compact(partial));
79
+ this.pendingLength += partial.length;
80
+ }
81
+ /** A subarray retains its entire backing allocation; copy a small piece of a large one. */
82
+ static compact(piece) {
83
+ if (piece.length === 0) {
84
+ return Buffer.alloc(0);
85
+ }
86
+ return piece.buffer.byteLength > Math.max(Buffer.poolSize, piece.length * 2) ? Buffer.from(piece) : piece;
54
87
  }
55
88
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5saW5lc2Nhbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMubGluZXNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBQ2QsTUFBTSxHQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsY0FBYyxDQUFTO0lBQ3ZCLE1BQU0sQ0FBb0I7SUFFbEMsWUFBWSxjQUFzQixFQUFFLE1BQXlCO1FBQzNELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUksQ0FBQyxLQUFhLEVBQUUsTUFBOEI7UUFDdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQztZQUNILElBQUksWUFBb0IsQ0FBQztZQUN6QixPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFckQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDJDQUEyQyxVQUFVLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxDQUFDO29CQUMxRyxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUM7WUFFRCw0Q0FBNEM7WUFDNUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxtQ0FBbUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxDQUFDLENBQUM7Z0JBQ25ILElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztnQkFBUyxDQUFDO1lBQ1QscUVBQXFFO1lBQ3JFLG9FQUFvRTtZQUNwRSw2REFBNkQ7WUFDN0QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdGLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsaUNBQWlDO0lBQzFCLEtBQUs7UUFDVixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGIn0=
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5saW5lc2Nhbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMubGluZXNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBQ3RCLDBFQUEwRTtJQUNsRSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQ3ZCLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDMUIsZ0dBQWdHO0lBQ3hGLFNBQVMsR0FBVyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLGNBQWMsQ0FBUztJQUN2QixNQUFNLENBQW9CO0lBRWxDLFlBQVksY0FBc0IsRUFBRSxNQUF5QjtRQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJLENBQUMsS0FBYSxFQUFFLE1BQThCO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFFZCxJQUFJLENBQUM7WUFDSCxJQUFJLFlBQW9CLENBQUM7WUFDekIsT0FBTyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMs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
@@ -1,6 +1,6 @@
1
1
  import * as plugins from './plugins.js';
2
2
  import { StreamingResponse } from './classes.streamingresponse.js';
3
- import type { IRustBridgeOptions, IRustBridgeRequestOptions, IRustBridgeTerminateOptions, ISocketConnectOptions, TCommandMap, TStreamingCommandKeys, TExtractChunk } from './interfaces/index.js';
3
+ import type { IRustBridgeOptions, IRustBridgeRequestOptions, IRustBridgeStreamingRequestOptions, IRustBridgeTerminateOptions, ISocketConnectOptions, TCommandMap, TStreamingCommandKeys, TExtractChunk } from './interfaces/index.js';
4
4
  /**
5
5
  * Generic bridge between TypeScript and a Rust binary.
6
6
  * Communicates via JSON-over-stdin/stdout IPC protocol (stdio mode)
@@ -25,6 +25,9 @@ export declare class RustBridge<TCommands extends TCommandMap = TCommandMap> ext
25
25
  private sensitiveRequestId;
26
26
  private sensitiveUsedGeneration;
27
27
  private regularRequestPreparations;
28
+ /** Whether the current transport generation's ready event advertised `cancel`. */
29
+ private remoteCancelSupported;
30
+ private remoteCancellations;
28
31
  constructor(options: IRustBridgeOptions);
29
32
  /**
30
33
  * Spawn the Rust binary and wait for it to signal readiness.
@@ -65,7 +68,7 @@ export declare class RustBridge<TCommands extends TCommandMap = TCommandMap> ext
65
68
  * Returns a StreamingResponse that yields chunks via `for await...of`
66
69
  * and exposes `.result` for the final response.
67
70
  */
68
- sendCommandStreaming<K extends string & TStreamingCommandKeys<TCommands>>(method: K, params: TCommands[K]['params']): StreamingResponse<TExtractChunk<TCommands[K]>, TCommands[K]['result']>;
71
+ sendCommandStreaming<K extends string & TStreamingCommandKeys<TCommands>>(method: K, params: TCommands[K]['params'], options?: IRustBridgeStreamingRequestOptions): StreamingResponse<TExtractChunk<TCommands[K]>, TCommands[K]['result']>;
69
72
  /**
70
73
  * Terminate the active transport and wait for confirmed closure.
71
74
  * For stdio this confirms child exit after SIGTERM/SIGKILL escalation.
@@ -83,6 +86,21 @@ export declare class RustBridge<TCommands extends TCommandMap = TCommandMap> ext
83
86
  private isStartingGeneration;
84
87
  private isCurrentTransport;
85
88
  private handleLine;
89
+ /** Start or restart the inactivity deadline of one streaming request. */
90
+ private armStreamingTimeout;
91
+ /**
92
+ * Reject a pending request on timeout or abort. When the request was
93
+ * already written to a transport that accepts cancel frames, send one and
94
+ * attach the remote settlement to the rejection.
95
+ */
96
+ private abandonPendingRequest;
97
+ /** Write one cancel frame and track the original id until Rust answers it. */
98
+ private sendRemoteCancel;
99
+ private settleRemoteCancellation;
100
+ /** Settle every tracked cancellation as disconnected after transport closure. */
101
+ private settleAllRemoteCancellations;
102
+ /** Read the `cancel` opt-in from a ready event's `capabilities`. */
103
+ private readCancelCapability;
86
104
  private acceptSensitiveResponse;
87
105
  private markSensitiveWriteComplete;
88
106
  private settleManagementResponse;