Skip to content

Commit a1c22ae

Browse files
Copilotmax-lt
andcommitted
Update streams.md diagram and API documentation
Co-authored-by: max-lt <9805205+max-lt@users.noreply.github.com>
1 parent 62b4e61 commit a1c22ae

1 file changed

Lines changed: 32 additions & 20 deletions

File tree

docs/streams.md

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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
6167
SchedulerMessage::StreamRead(callback_id, stream_id)
68+
SchedulerMessage::StreamCancel(stream_id)
6269

63-
// Scheduler → V8 (chunk ready)
70+
// Scheduler → V8
6471
CallbackMessage::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

Comments
 (0)