@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.
- package/README.md +37 -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,
|
|
95
|
-
| `_push(data,
|
|
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.
|
|
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": "
|
|
24
|
+
"gitHead": "a7615000fcb87e6bc0e573af760c814ec935bab2"
|
|
25
25
|
}
|