@@ -9,21 +9,24 @@ Rust ↔ JavaScript streaming bridge for efficient data transfer without full bu
99│ RUST │
1010│ │
1111│ Data Source StreamManager Scheduler │
12- │ (reqwest ) ───────── ► senders[id] ◄────────► read_chunk() │
12+ │ (HTTP, body ) ──────► senders[id] ◄───────── ► read_chunk() │
1313│ │ receivers[id] │ │
14- │ │ write_chunk() │ │
15- │ ▼ ▼ │
16- │ mpsc::channel ───── StreamChunk::Data|Done|Error ─ ─────────────►│
14+ │ │ write_chunk() high_water_mark │ │
15+ │ ▼ (backpressure) ▼ │
16+ │ mpsc::channel ────── StreamChunk::Data|Done|Error ─────────────►│
1717│ │
1818├──────────────────────────────────────────────────────────────────┤
1919│ JAVASCRIPT │
2020│ │
21+ │ // Reading (fetch response body, request body) │
2122│ const stream = __createNativeStream(streamId); │
2223│ const reader = stream.getReader(); │
23- │ while (true) { │
24- │ const { done, value } = await reader.read(); ◄── pull() │
25- │ if (done) break; │
26- │ } │
24+ │ const { done, value } = await reader.read(); ◄── pull() │
25+ │ │
26+ │ // Writing (streaming response) │
27+ │ const streamId = __responseStreamCreate(); │
28+ │ __responseStreamWrite(streamId, chunk); │
29+ │ __responseStreamEnd(streamId); │
2730└──────────────────────────────────────────────────────────────────┘
2831```
2932
@@ -47,31 +50,40 @@ pub enum StreamChunk {
4750}
4851```
4952
50- | Method | Called by | Purpose |
51- | ------------------------ | --------- | ------------------------------- |
52- | ` create_stream() ` | Rust | Create channel, return StreamId |
53- | ` write_chunk(id, chunk) ` | Rust | Send data to JS |
54- | ` read_chunk(id).await ` | Scheduler | Receive data for JS callback |
55- | ` close_stream(id) ` | Both | Cleanup |
53+ | Method | Called by | Purpose |
54+ | -------------------------- | --------- | ---------------------------------- |
55+ | ` create_stream(url) ` | Rust | Create bounded channel, return ID |
56+ | ` write_chunk(id, chunk) ` | Rust | Send data (async, backpressure) |
57+ | ` try_write_chunk(id, chunk) ` | Rust | Send data (sync, fails if full) |
58+ | ` read_chunk(id).await ` | Scheduler | Receive data for JS callback |
59+ | ` take_receiver(id) ` | Rust | Take receiver for HttpBody::Stream |
60+ | ` pump_request_body(rx) ` | Rust | Bridge mpsc::Receiver to stream |
61+ | ` close_stream(id) ` | Both | Cleanup |
5662
5763### Messages
5864
5965``` rust
60- // JS → Scheduler (request chunk)
66+ // JS → Scheduler
6167SchedulerMessage :: StreamRead (callback_id , stream_id )
68+ SchedulerMessage :: StreamCancel (stream_id )
6269
63- // Scheduler → V8 (chunk ready)
70+ // Scheduler → V8
6471CallbackMessage :: StreamChunk (callback_id , StreamChunk )
6572```
6673
6774### JavaScript API
6875
6976``` javascript
70- // Native function: request next chunk
77+ // Reading streams (fetch response, request body)
7178__nativeStreamRead (streamId, callback);
72-
73- // Creates WHATWG ReadableStream with pull()
74- const stream = __createNativeStream (streamId);
79+ __nativeStreamCancel (streamId);
80+ const stream = __createNativeStream (streamId); // → ReadableStream
81+
82+ // Writing streams (streaming response)
83+ const id = __responseStreamCreate ();
84+ __responseStreamWrite (id, uint8Array); // → bool (false if full)
85+ __responseStreamEnd (id);
86+ __responseStreamIsClosed (id); // → bool
7587```
7688
7789## Data Flow
0 commit comments