@hile/message-modem 2.0.1 → 2.0.3

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.
Files changed (2) hide show
  1. package/README.md +37 -2
  2. package/package.json +2 -2
package/README.md CHANGED
@@ -13,6 +13,7 @@ pnpm add @hile/message-modem
13
13
  - **传输无关** — 子类只需实现 `post`(如何发送)和 `exec`(如何处理),即可运行于任何通信通道
14
14
  - **双向请求/响应** — `_send` 发送请求并等待对端响应(`twoway: true`)
15
15
  - **单向推送** — `_push` 发送消息无需对端响应(`twoway: false`)
16
+ - **流式传输** — `_stream` 发送流式请求,对端返回 async generator 时分块回传,发送方获得 `Readable` stream
16
17
  - **请求/响应配对** — 自增 ID + Promise 栈,自动配对请求与响应
17
18
  - **超时控制** — 默认 30 秒,可按请求自定义
18
19
  - **主动中止** — 发送方可 abort 等待,接收方可取消正在执行的任务
@@ -91,8 +92,9 @@ try {
91
92
  |------|--------|------|
92
93
  | `post(data)` | `protected abstract` | 子类实现:如何将消息发送到远端 |
93
94
  | `exec(data)` | `protected abstract` | 子类实现:如何处理收到的请求,返回 Promise |
94
- | `_send(data, timeout?)` | `protected` | 发送双向请求(`twoway: true`),返回 `{ abort, response }` |
95
- | `_push(data, timeout?)` | `protected` | 发送单向推送(`twoway: false`),无返回值,接收方不回复 RESPONSE |
95
+ | `_send(data, opts?)` | `protected` | 发送双向请求(`twoway: true`),返回 `{ abort, response }` |
96
+ | `_push(data, opts?)` | `protected` | 发送单向推送(`twoway: false`),无返回值,接收方不回复 RESPONSE |
97
+ | `_stream(data, opts?)` | `protected` | 发送流式请求,返回 `Readable` stream。对端 `exec()` 须返回 async generator |
96
98
  | `receive(msg)` | `public` | 接收消息入口,根据 mode 分发处理 |
97
99
 
98
100
  ### `_send` 返回值
@@ -126,6 +128,7 @@ interface MessageTransferFormat<T = any> {
126
128
  id: number;
127
129
  mode: MESSAGE_MODEM_TYPE;
128
130
  twoway: boolean;
131
+ stream?: boolean; // true → 流式模式
129
132
  data?: T;
130
133
  }
131
134
 
@@ -135,6 +138,14 @@ interface MessageReturnFormat<T = any> {
135
138
  data: T;
136
139
  message: string;
137
140
  }
141
+
142
+ // 流式分块格式(stream=true 时 RESPONSE 携带)
143
+ interface MessageStreamChunk<T = any> {
144
+ status: string | number;
145
+ seq: number; // 块序号,从 0 递增
146
+ payload: T; // 块数据
147
+ final: boolean; // true → 最后一块
148
+ }
138
149
  ```
139
150
 
140
151
  ## 消息流转
@@ -167,6 +178,30 @@ interface MessageReturnFormat<T = any> {
167
178
  │ │ (不回复 RESPONSE)
168
179
  ```
169
180
 
181
+ ### 流式模式(`_stream`)
182
+
183
+ ```
184
+ 发送方 接收方
185
+ │ │
186
+ │ _stream(data) │
187
+ │──── REQUEST (stream) ──────►│
188
+ │ │ exec(data) → async generator
189
+ │ │
190
+ │◄─── RESPONSE (seq:0) ───────│ for await (chunk of gen)
191
+ │◄─── RESPONSE (seq:1) ───────│
192
+ │◄─── RESPONSE (seq:2) ───────│
193
+ │ ... │
194
+ │◄─── RESPONSE (final) ───────│ 迭代结束
195
+ │ │
196
+ │ abort() │
197
+ │──── ABORT ─────────────────►│ 取消迭代
198
+ ```
199
+
200
+ 对端 `exec()` 返回 `AsyncIterable` 时,`MessageModem` 自动检测并进入分块传输模式。发送方通过 `for await` 消费 `Readable` stream。
201
+
202
+ **何时用**:大数据集、实时事件流、LLM token 输出、进度上报等需要持续推送的场景。
203
+ **何时不用**:单次请求/响应 —— 用 `_send()` 即可,无需 `_stream()`。
204
+
170
205
  ## 适用场景
171
206
 
172
207
  - **iframe 通信** — 父子页面 postMessage
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hile/message-modem",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -21,5 +21,5 @@
21
21
  "fix-esm-import-path": "^1.10.3",
22
22
  "vitest": "^4.0.18"
23
23
  },
24
- "gitHead": "8e0fd1f78b5a8abd21218d1f596ada2533a0c8e7"
24
+ "gitHead": "a7615000fcb87e6bc0e573af760c814ec935bab2"
25
25
  }