tywrap 0.6.1 → 0.8.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/README.md +15 -5
- package/dist/core/annotation-parser.d.ts.map +1 -1
- package/dist/core/annotation-parser.js.map +1 -1
- package/dist/core/emit-call.d.ts.map +1 -1
- package/dist/core/emit-call.js +1 -1
- package/dist/core/emit-call.js.map +1 -1
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +40 -9
- package/dist/core/generator.js.map +1 -1
- package/dist/dev.d.ts.map +1 -1
- package/dist/dev.js +1 -3
- package/dist/dev.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/base-bridge.d.ts +57 -0
- package/dist/runtime/base-bridge.d.ts.map +1 -0
- package/dist/runtime/base-bridge.js +72 -0
- package/dist/runtime/base-bridge.js.map +1 -0
- package/dist/runtime/frame-codec.d.ts +111 -0
- package/dist/runtime/frame-codec.d.ts.map +1 -0
- package/dist/runtime/frame-codec.js +352 -0
- package/dist/runtime/frame-codec.js.map +1 -0
- package/dist/runtime/http-transport.d.ts +11 -1
- package/dist/runtime/http-transport.d.ts.map +1 -1
- package/dist/runtime/http-transport.js +19 -0
- package/dist/runtime/http-transport.js.map +1 -1
- package/dist/runtime/http.d.ts +5 -12
- package/dist/runtime/http.d.ts.map +1 -1
- package/dist/runtime/http.js +6 -29
- package/dist/runtime/http.js.map +1 -1
- package/dist/runtime/index.d.ts +2 -2
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/node.d.ts +25 -19
- package/dist/runtime/node.d.ts.map +1 -1
- package/dist/runtime/node.js +19 -34
- package/dist/runtime/node.js.map +1 -1
- package/dist/runtime/pooled-transport.d.ts +21 -2
- package/dist/runtime/pooled-transport.d.ts.map +1 -1
- package/dist/runtime/pooled-transport.js +16 -0
- package/dist/runtime/pooled-transport.js.map +1 -1
- package/dist/runtime/pyodide-bootstrap-core.generated.d.ts.map +1 -1
- package/dist/runtime/pyodide-bootstrap-core.generated.js +1 -1
- package/dist/runtime/pyodide-bootstrap-core.generated.js.map +1 -1
- package/dist/runtime/pyodide-transport.d.ts +12 -1
- package/dist/runtime/pyodide-transport.d.ts.map +1 -1
- package/dist/runtime/pyodide-transport.js +20 -0
- package/dist/runtime/pyodide-transport.js.map +1 -1
- package/dist/runtime/pyodide.d.ts +5 -12
- package/dist/runtime/pyodide.d.ts.map +1 -1
- package/dist/runtime/pyodide.js +6 -29
- package/dist/runtime/pyodide.js.map +1 -1
- package/dist/runtime/rpc-client.d.ts +14 -1
- package/dist/runtime/rpc-client.d.ts.map +1 -1
- package/dist/runtime/rpc-client.js +68 -6
- package/dist/runtime/rpc-client.js.map +1 -1
- package/dist/runtime/subprocess-transport.d.ts +177 -3
- package/dist/runtime/subprocess-transport.d.ts.map +1 -1
- package/dist/runtime/subprocess-transport.js +526 -26
- package/dist/runtime/subprocess-transport.js.map +1 -1
- package/dist/runtime/transport.d.ts +141 -0
- package/dist/runtime/transport.d.ts.map +1 -1
- package/dist/runtime/transport.js +21 -0
- package/dist/runtime/transport.js.map +1 -1
- package/dist/types/index.d.ts +59 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/tywrap.d.ts.map +1 -1
- package/dist/tywrap.js +204 -149
- package/dist/tywrap.js.map +1 -1
- package/dist/utils/codec.d.ts +2 -0
- package/dist/utils/codec.d.ts.map +1 -1
- package/dist/utils/codec.js +205 -6
- package/dist/utils/codec.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -1
- package/runtime/__pycache__/_tywrap_conformance_chunking_fixtures.cpython-311.pyc +0 -0
- package/runtime/__pycache__/_tywrap_member_fixtures.cpython-311.pyc +0 -0
- package/runtime/__pycache__/_tywrap_w4_chunking_fixture.cpython-311.pyc +0 -0
- package/runtime/__pycache__/_tywrap_w5_request_chunking_fixture.cpython-311.pyc +0 -0
- package/runtime/__pycache__/_tywrap_w6_pool_chunking_fixture.cpython-311.pyc +0 -0
- package/runtime/__pycache__/frame_codec.cpython-311.pyc +0 -0
- package/runtime/__pycache__/safe_codec.cpython-311.pyc +0 -0
- package/runtime/__pycache__/tywrap_bridge_core.cpython-311.pyc +0 -0
- package/runtime/frame_codec.py +424 -0
- package/runtime/python_bridge.py +241 -42
- package/runtime/tywrap_bridge_core.py +152 -13
- package/src/core/annotation-parser.ts +2 -1
- package/src/core/emit-call.ts +1 -7
- package/src/core/generator.ts +50 -11
- package/src/dev.ts +1 -3
- package/src/index.ts +1 -0
- package/src/runtime/base-bridge.ts +106 -0
- package/src/runtime/frame-codec.ts +469 -0
- package/src/runtime/http-transport.ts +21 -1
- package/src/runtime/http.ts +7 -51
- package/src/runtime/index.ts +2 -6
- package/src/runtime/node.ts +42 -53
- package/src/runtime/pooled-transport.ts +25 -2
- package/src/runtime/pyodide-bootstrap-core.generated.ts +1 -1
- package/src/runtime/pyodide-transport.ts +22 -0
- package/src/runtime/pyodide.ts +7 -52
- package/src/runtime/rpc-client.ts +91 -7
- package/src/runtime/subprocess-transport.ts +629 -30
- package/src/runtime/transport.ts +169 -0
- package/src/types/index.ts +62 -0
- package/src/tywrap.ts +265 -162
- package/src/utils/codec.ts +245 -7
- package/src/version.ts +1 -1
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* @see https://github.com/bbopen/tywrap/issues/149
|
|
14
14
|
*/
|
|
15
15
|
import { DisposableBase } from './bounded-context.js';
|
|
16
|
-
import type
|
|
16
|
+
import { type Transport, type TransportCapabilities } from './transport.js';
|
|
17
17
|
/**
|
|
18
18
|
* Options for the SubprocessTransport.
|
|
19
19
|
*/
|
|
@@ -32,6 +32,26 @@ export interface SubprocessTransportOptions {
|
|
|
32
32
|
restartAfterRequests?: number;
|
|
33
33
|
/** Write queue timeout in milliseconds. Default: 30000ms */
|
|
34
34
|
writeQueueTimeoutMs?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Enable `tywrap-frame/1` chunked transport negotiation. When `true`, the
|
|
37
|
+
* transport spawns the bridge with the three `TYWRAP_TRANSPORT_*` env vars and,
|
|
38
|
+
* during {@link SubprocessTransport.init}, probes the bridge's `meta` for a
|
|
39
|
+
* `transport.supportsChunking` block. If the bridge advertises chunking,
|
|
40
|
+
* oversize responses are transparently reassembled from frames; otherwise
|
|
41
|
+
* behavior is unchanged and an oversize response still fails loud (no silent
|
|
42
|
+
* single-frame fallback). Default: `false` (no negotiation, legacy behavior).
|
|
43
|
+
*
|
|
44
|
+
* Subprocess-only (0.8.0). See docs/transport-framing.md.
|
|
45
|
+
*/
|
|
46
|
+
enableChunking?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Cap (UTF-8 bytes) on a single chunked RESPONSE reassembled in memory. A
|
|
49
|
+
* frame stream whose declared or accumulated payload exceeds this fails loud
|
|
50
|
+
* instead of buffering, so chunking cannot OOM the process before the codec's
|
|
51
|
+
* payload cap rejects the result. Should track the codec's `maxPayloadBytes`.
|
|
52
|
+
* Default: 10 MiB (matches the codec default).
|
|
53
|
+
*/
|
|
54
|
+
maxReassemblyBytes?: number;
|
|
35
55
|
}
|
|
36
56
|
/**
|
|
37
57
|
* Transport implementation for subprocess-based Python communication.
|
|
@@ -64,8 +84,31 @@ export declare class SubprocessTransport extends DisposableBase implements Trans
|
|
|
64
84
|
private readonly envOverrides;
|
|
65
85
|
private readonly cwd;
|
|
66
86
|
private readonly maxLineLength;
|
|
87
|
+
private readonly maxReassemblyBytes;
|
|
67
88
|
private readonly restartAfterRequests;
|
|
68
89
|
private readonly writeQueueTimeoutMs;
|
|
90
|
+
/** Whether `tywrap-frame/1` negotiation was requested by the caller. */
|
|
91
|
+
private readonly enableChunking;
|
|
92
|
+
/**
|
|
93
|
+
* Whether the bridge advertised chunking during the init meta probe. Only
|
|
94
|
+
* `true` after a successful negotiation; drives {@link capabilities} and the
|
|
95
|
+
* frame-aware stdout line ceiling.
|
|
96
|
+
*/
|
|
97
|
+
private negotiatedChunking;
|
|
98
|
+
/**
|
|
99
|
+
* The per-frame UTF-8 byte ceiling actually agreed with the bridge:
|
|
100
|
+
* `min(maxLineLength, the bridge's advertised maxFrameBytes)`. Defaults to
|
|
101
|
+
* `maxLineLength` and is narrowed during negotiation, so REQUEST frames are
|
|
102
|
+
* never sized larger than the bridge said it will accept (the reference bridge
|
|
103
|
+
* echoes the requested value, but a custom bridge may advertise a smaller one).
|
|
104
|
+
*/
|
|
105
|
+
private negotiatedFrameBytes;
|
|
106
|
+
/**
|
|
107
|
+
* Reassembles `tywrap-frame/1` response frames into single logical response
|
|
108
|
+
* lines. Constructed lazily once chunking is negotiated; per-id discard tracks
|
|
109
|
+
* timed-out/aborted streams so late frames cannot desync stdout.
|
|
110
|
+
*/
|
|
111
|
+
private responseReassembler;
|
|
69
112
|
private process;
|
|
70
113
|
private processExited;
|
|
71
114
|
private processError;
|
|
@@ -77,6 +120,16 @@ export declare class SubprocessTransport extends DisposableBase implements Trans
|
|
|
77
120
|
private needsRestart;
|
|
78
121
|
private readonly writeQueue;
|
|
79
122
|
private draining;
|
|
123
|
+
/**
|
|
124
|
+
* Per-logical-request write mutex (W5). When a request is chunked into
|
|
125
|
+
* `tywrap-frame/1` frames, all of that request's frames must reach stdin
|
|
126
|
+
* contiguously — no other request's frame (or single line) may interleave —
|
|
127
|
+
* or the Python reassembler would see frames from two ids mixed on one stream.
|
|
128
|
+
* `writeChunkedRequest` chains the whole frame burst onto this tail; the
|
|
129
|
+
* single-line write path also serializes behind it so a small request issued
|
|
130
|
+
* concurrently never slips between another request's frames.
|
|
131
|
+
*/
|
|
132
|
+
private writeMutex;
|
|
80
133
|
/**
|
|
81
134
|
* Create a new SubprocessTransport.
|
|
82
135
|
*
|
|
@@ -93,9 +146,53 @@ export declare class SubprocessTransport extends DisposableBase implements Trans
|
|
|
93
146
|
*/
|
|
94
147
|
send(message: string, timeoutMs: number, signal?: AbortSignal): Promise<string>;
|
|
95
148
|
/**
|
|
96
|
-
*
|
|
149
|
+
* Static capability descriptor for the subprocess backend.
|
|
150
|
+
*
|
|
151
|
+
* Per the {@link Transport.capabilities} contract this is lifecycle-independent
|
|
152
|
+
* (safe before `init()` / after `dispose()`) and never makes a Python round
|
|
153
|
+
* trip. Subprocess carries Arrow IPC and arbitrary binary (bytes envelopes)
|
|
154
|
+
* over the JSONL stream. `supportsChunking` reports the *configured* capability
|
|
155
|
+
* — `this.enableChunking`, i.e. whether this transport is set up to use the
|
|
156
|
+
* `tywrap-frame/1` framing path — exactly as `supportsArrow` reports a static
|
|
157
|
+
* channel capability rather than a runtime fact. Whether the *connected* bridge
|
|
158
|
+
* actually advertised framing is the negotiated fact, surfaced separately on
|
|
159
|
+
* `BridgeInfo.transport.supportsChunking`; "will chunking actually happen"
|
|
160
|
+
* needs both `true`. `supportsStreaming` stays `false` (0.8.0). `maxFrameBytes`
|
|
161
|
+
* is the configured JSONL line-length limit — the largest single (unchunked)
|
|
162
|
+
* response line this transport accepts.
|
|
163
|
+
*/
|
|
164
|
+
capabilities(): TransportCapabilities;
|
|
165
|
+
/**
|
|
166
|
+
* Initialize the transport by spawning the Python process and, when chunking
|
|
167
|
+
* is enabled, negotiating `tywrap-frame/1` via a small unchunked `meta` probe.
|
|
97
168
|
*/
|
|
98
169
|
protected doInit(): Promise<void>;
|
|
170
|
+
/**
|
|
171
|
+
* Probe the freshly-spawned bridge for `tywrap-frame/1` support.
|
|
172
|
+
*
|
|
173
|
+
* Sends a small unchunked `meta` request directly over stdin (NOT via the
|
|
174
|
+
* public {@link send}, which would re-enter init while we are mid-init) and
|
|
175
|
+
* reads the single-line response. If the bridge reports
|
|
176
|
+
* `transport.supportsChunking: true`, response reassembly is enabled. If the
|
|
177
|
+
* bridge does not advertise chunking (old bridge, or it disabled framing), the
|
|
178
|
+
* transport stays single-frame and an oversize response still fails loud — no
|
|
179
|
+
* silent fallback. A probe failure leaves chunking disabled but does not fail
|
|
180
|
+
* init (small calls must keep working); the loud failure is deferred to the
|
|
181
|
+
* first oversize response.
|
|
182
|
+
*/
|
|
183
|
+
private negotiateChunking;
|
|
184
|
+
/**
|
|
185
|
+
* Whether a parsed `meta` response advertises `tywrap-frame/1` chunking with a
|
|
186
|
+
* matching frame protocol. Defensive: any missing/mismatched field => `false`.
|
|
187
|
+
*/
|
|
188
|
+
private bridgeAdvertisesChunking;
|
|
189
|
+
/**
|
|
190
|
+
* Send a single in-init probe message over stdin and resolve with its raw
|
|
191
|
+
* response line. Registers a pending entry keyed by `probeId` exactly like the
|
|
192
|
+
* normal send path so {@link handleResponseLine} resolves it, but bypasses the
|
|
193
|
+
* `isReady`/auto-init guard (we are deliberately running during `doInit`).
|
|
194
|
+
*/
|
|
195
|
+
private sendProbe;
|
|
99
196
|
/**
|
|
100
197
|
* Dispose the transport by killing the Python process.
|
|
101
198
|
*/
|
|
@@ -118,14 +215,51 @@ export declare class SubprocessTransport extends DisposableBase implements Trans
|
|
|
118
215
|
* Works independently of restartAfterRequests setting.
|
|
119
216
|
*/
|
|
120
217
|
private markForRestart;
|
|
218
|
+
/**
|
|
219
|
+
* Effective stdout line ceiling.
|
|
220
|
+
*
|
|
221
|
+
* Without chunking it is exactly {@link maxLineLength} (legacy behavior). With
|
|
222
|
+
* chunking negotiated, a single wire line is a `tywrap-frame/1` envelope whose
|
|
223
|
+
* `data` slice is capped at `maxLineLength` UTF-8 bytes by the bridge, but the
|
|
224
|
+
* JSON envelope adds escaping (`"`/`\`) plus fixed keys; the ceiling is widened
|
|
225
|
+
* to bound that overhead so a legitimate frame line is never rejected while a
|
|
226
|
+
* runaway/garbage line still is.
|
|
227
|
+
*/
|
|
228
|
+
private effectiveLineCeiling;
|
|
121
229
|
/**
|
|
122
230
|
* Handle stdout data from the Python process.
|
|
123
231
|
*/
|
|
124
232
|
private handleStdoutData;
|
|
125
233
|
/**
|
|
126
234
|
* Handle a complete response line from stdout.
|
|
235
|
+
*
|
|
236
|
+
* When chunking is negotiated, a line may be a `tywrap-frame/1` envelope: it is
|
|
237
|
+
* routed into the per-id {@link Reassembler}, which returns the reassembled
|
|
238
|
+
* logical response only once the stream is complete and valid. Single-line
|
|
239
|
+
* (non-frame) responses keep the original fast path unchanged.
|
|
127
240
|
*/
|
|
128
241
|
private handleResponseLine;
|
|
242
|
+
/**
|
|
243
|
+
* Route one `tywrap-frame/1` response frame into the reassembler.
|
|
244
|
+
*
|
|
245
|
+
* On completion the reassembled logical line resolves the pending request. The
|
|
246
|
+
* reassembler validates structure, ordering, byte count, and UTF-8 internally
|
|
247
|
+
* and throws on any framing violation (malformed/duplicate/byte-mismatch/
|
|
248
|
+
* unknown-protocol) — those reject the pending id and mark the subprocess for
|
|
249
|
+
* restart, since stdout can no longer be trusted to be frame-aligned. Frames
|
|
250
|
+
* for a timed-out/aborted id are silently discarded by the reassembler (it
|
|
251
|
+
* returns `null` and tracks the discard set) so late multi-frame responses
|
|
252
|
+
* cannot desync the stream.
|
|
253
|
+
*/
|
|
254
|
+
private handleResponseFrame;
|
|
255
|
+
/**
|
|
256
|
+
* Reject the pending request correlated to a frame id, if one exists.
|
|
257
|
+
*
|
|
258
|
+
* Used when frame reassembly throws. If the id is unknown (e.g. it already
|
|
259
|
+
* timed out and was dropped from `pending`), the error still surfaces as a
|
|
260
|
+
* protocol error so the desync is not swallowed silently.
|
|
261
|
+
*/
|
|
262
|
+
private rejectFrameId;
|
|
129
263
|
/**
|
|
130
264
|
* Handle stderr data from the Python process.
|
|
131
265
|
*/
|
|
@@ -169,6 +303,38 @@ export declare class SubprocessTransport extends DisposableBase implements Trans
|
|
|
169
303
|
* Write data to stdin with backpressure handling.
|
|
170
304
|
*/
|
|
171
305
|
private writeToStdin;
|
|
306
|
+
/**
|
|
307
|
+
* Write one logical request to stdin, fragmenting it into `tywrap-frame/1`
|
|
308
|
+
* request frames when chunking is negotiated and the encoded request exceeds
|
|
309
|
+
* the per-frame ceiling (W5 — the mirror of W4's response chunking).
|
|
310
|
+
*
|
|
311
|
+
* Both the chunked and single-line paths run under {@link writeMutex} so a
|
|
312
|
+
* logical request's bytes (one line, or a burst of frames) reach stdin
|
|
313
|
+
* contiguously: a small request issued concurrently can never interleave
|
|
314
|
+
* between another request's frames, which would desync the Python
|
|
315
|
+
* reassembler (it correlates frames by id, but the JSONL stream itself must
|
|
316
|
+
* stay frame-aligned). The mutex tail is advanced regardless of success so a
|
|
317
|
+
* failed write never wedges every subsequent request.
|
|
318
|
+
*
|
|
319
|
+
* @param message - the encoded logical JSON request (no trailing newline)
|
|
320
|
+
* @param messageId - the request's correlation id (already validated integer)
|
|
321
|
+
* @param signal - optional abort signal; an abort observed between frames
|
|
322
|
+
* stops further frames and rejects this send (the pending entry is rejected
|
|
323
|
+
* by the abort handler / the caller's `.catch`).
|
|
324
|
+
*/
|
|
325
|
+
private writeRequest;
|
|
326
|
+
/**
|
|
327
|
+
* Fragment a logical request into `tywrap-frame/1` request frames and write
|
|
328
|
+
* them contiguously (one JSONL line per frame). Runs while holding the write
|
|
329
|
+
* mutex (see {@link writeRequest}), so no other write interleaves.
|
|
330
|
+
*
|
|
331
|
+
* Each frame is awaited in turn so backpressure on stdin is respected. Before
|
|
332
|
+
* every frame the abort signal and process liveness are re-checked: an abort
|
|
333
|
+
* mid-burst stops the remaining frames and rejects the send LOUD (the Python
|
|
334
|
+
* reassembler drops the now-incomplete id when the next request's frames /
|
|
335
|
+
* timeout arrive, exactly as the response side handles a discarded id).
|
|
336
|
+
*/
|
|
337
|
+
private writeChunkedRequest;
|
|
172
338
|
/**
|
|
173
339
|
* Reject and clear every entry currently in the write queue.
|
|
174
340
|
* Clears each entry's timeout before rejecting so no late timer fires.
|
|
@@ -198,7 +364,15 @@ export declare class SubprocessTransport extends DisposableBase implements Trans
|
|
|
198
364
|
*/
|
|
199
365
|
private withStderrTail;
|
|
200
366
|
/**
|
|
201
|
-
* Handle a protocol error by rejecting all pending requests
|
|
367
|
+
* Handle a protocol error by rejecting all pending requests and marking the
|
|
368
|
+
* subprocess for restart.
|
|
369
|
+
*
|
|
370
|
+
* Every caller represents genuine stdout-stream corruption (a too-long line, a
|
|
371
|
+
* response with no `id`, a frame with no reassembler, or a truly unexpected id
|
|
372
|
+
* — benign late responses from timed-out requests are already filtered upstream
|
|
373
|
+
* via {@link timedOutRequests}). After such an error stdout can no longer be
|
|
374
|
+
* trusted to be line/frame-aligned, so the process is marked for restart —
|
|
375
|
+
* matching the frame-reassembly-corruption path and the framing spec.
|
|
202
376
|
*/
|
|
203
377
|
private handleProtocolError;
|
|
204
378
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subprocess-transport.d.ts","sourceRoot":"","sources":["../../src/runtime/subprocess-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"subprocess-transport.d.ts","sourceRoot":"","sources":["../../src/runtime/subprocess-transport.ts"],"names":[],"mappings":"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"}
|