@lyrify/znl 0.4.1 → 0.5.1
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 +28 -6
- package/package.json +2 -2
- package/src/ZNL.js +580 -77
- package/src/constants.js +24 -0
- package/src/protocol.js +74 -12
- package/src/security.js +560 -0
package/README.md
CHANGED
|
@@ -5,11 +5,15 @@
|
|
|
5
5
|
## 特性
|
|
6
6
|
|
|
7
7
|
- 基于 `ROUTER/DEALER` 同时实现 RPC 请求-响应与 PUB/SUB 广播,一套连接两种模式
|
|
8
|
-
-
|
|
8
|
+
- 自动处理并发消息匹配、自动处理心跳包、超时控制、最大并发限制
|
|
9
9
|
- 支持 Master → Slave 主动发起请求(双向 RPC)
|
|
10
10
|
- 基于 ROUTER 实现 PUB/SUB 广播,无需额外 socket 或端口
|
|
11
11
|
- Slave 自动注册/注销,Master 实时感知在线节点
|
|
12
|
-
-
|
|
12
|
+
- 支持可选加密认证(签名 + 防重放 + AES-256-GCM 透明加密)
|
|
13
|
+
- 加密开关 `encrypted`:
|
|
14
|
+
- `false`:明文模式(不签名/不加密)
|
|
15
|
+
- `true`:签名 + 防重放 + payload 透明加密(AES-256-GCM)
|
|
16
|
+
- `authKey` 仅在 `encrypted=true` 时必填
|
|
13
17
|
- Payload 支持 `string`、`Buffer`、`Uint8Array` 及其数组(多帧)
|
|
14
18
|
|
|
15
19
|
## 安装
|
|
@@ -36,6 +40,7 @@ const master = new ZNL({
|
|
|
36
40
|
id: "master-1",
|
|
37
41
|
endpoints: { router: "tcp://127.0.0.1:6003" },
|
|
38
42
|
authKey: "your-shared-key",
|
|
43
|
+
encrypted: true, // 推荐:透明加密 + 防重放
|
|
39
44
|
});
|
|
40
45
|
|
|
41
46
|
// RPC:自动回复 slave 的请求
|
|
@@ -65,6 +70,7 @@ const slave = new ZNL({
|
|
|
65
70
|
id: "slave-001",
|
|
66
71
|
endpoints: { router: "tcp://127.0.0.1:6003" },
|
|
67
72
|
authKey: "your-shared-key",
|
|
73
|
+
encrypted: true, // 需与 master 一致
|
|
68
74
|
});
|
|
69
75
|
|
|
70
76
|
// PUB/SUB:精确订阅(可在 start 前调用)
|
|
@@ -95,6 +101,9 @@ new ZNL({
|
|
|
95
101
|
},
|
|
96
102
|
maxPending: 0,
|
|
97
103
|
authKey: "",
|
|
104
|
+
encrypted: false,
|
|
105
|
+
maxTimeSkewMs: 30000,
|
|
106
|
+
replayWindowMs: 120000,
|
|
98
107
|
});
|
|
99
108
|
```
|
|
100
109
|
|
|
@@ -104,7 +113,10 @@ new ZNL({
|
|
|
104
113
|
| `id` | ✓ | 节点唯一标识;slave 端同时作为 ZMQ `routingId` |
|
|
105
114
|
| `endpoints.router` | | ROUTER 端点,默认 `tcp://127.0.0.1:6003` |
|
|
106
115
|
| `maxPending` | | 最大并发 RPC 请求数,`0` 表示不限制 |
|
|
107
|
-
| `authKey` | |
|
|
116
|
+
| `authKey` | | 共享认证 Key;仅在 `encrypted=true` 时必填(用于签名/加密) |
|
|
117
|
+
| `encrypted` | | 是否启用加密:`false`(默认,明文) / `true`(签名+防重放+透明加密) |
|
|
118
|
+
| `maxTimeSkewMs` | | 时间戳最大允许偏移(毫秒),默认 `30000`,用于防重放校验 |
|
|
119
|
+
| `replayWindowMs` | | nonce 重放缓存窗口(毫秒),默认 `120000` |
|
|
108
120
|
|
|
109
121
|
## API
|
|
110
122
|
|
|
@@ -199,7 +211,7 @@ console.log(master.slaves); // ["slave-001", "slave-002"]
|
|
|
199
211
|
| `publish` | Slave | 收到 master 广播,携带 `{ topic, payload }` |
|
|
200
212
|
| `slave_connected` | Master | slave 注册成功上线,携带 `slaveId` |
|
|
201
213
|
| `slave_disconnected` | Master | slave 注销或发送失败下线,携带 `slaveId` |
|
|
202
|
-
| `auth_failed` | Master |
|
|
214
|
+
| `auth_failed` | Master / Slave | 认证失败(签名校验失败、重放检测失败、解密失败等),请求已被丢弃 |
|
|
203
215
|
| `error` | 两者 | 内部错误 |
|
|
204
216
|
|
|
205
217
|
## 本地示例
|
|
@@ -224,13 +236,23 @@ pnpm test
|
|
|
224
236
|
## 并发压测
|
|
225
237
|
|
|
226
238
|
```bash
|
|
227
|
-
# 终端 1:启动 Echo
|
|
239
|
+
# 终端 1:启动 Echo 服务端(plain)
|
|
228
240
|
pnpm test:echo
|
|
229
241
|
|
|
230
|
-
# 终端 2
|
|
242
|
+
# 终端 2:发起并发压测(plain)
|
|
231
243
|
pnpm test:100 -- 100 10000 slave-001
|
|
232
244
|
```
|
|
233
245
|
|
|
246
|
+
启用安全模式示例:
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
# 终端 1:加密模式启动 Echo 服务端
|
|
250
|
+
ZNL_AUTH_KEY=my-secret ZNL_ENCRYPTED=true pnpm test:echo
|
|
251
|
+
|
|
252
|
+
# 终端 2:加密模式压测
|
|
253
|
+
pnpm test:100 -- 100 10000 slave-001 my-secret true
|
|
254
|
+
```
|
|
255
|
+
|
|
234
256
|
参数说明:
|
|
235
257
|
|
|
236
258
|
- 总请求数
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lyrify/znl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "ZNL - ZeroMQ Node Link",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -41,6 +41,6 @@
|
|
|
41
41
|
"test": "node test/run.js",
|
|
42
42
|
"test:echo": "node test/master/test-echo-server.js",
|
|
43
43
|
"test:100": "node test/slave/test-100-concurrent.js",
|
|
44
|
-
"check": "node --check index.js && node --check src/constants.js && node --check src/protocol.js && node --check src/PendingManager.js && node --check src/SendQueue.js && node --check src/ZNL.js && node --check test/master/index.js && node --check test/slave/index.js && node --check test/master/test-echo-server.js && node --check test/slave/test-100-concurrent.js && node --check test/run.js"
|
|
44
|
+
"check": "node --check index.js && node --check src/constants.js && node --check src/protocol.js && node --check src/security.js && node --check src/PendingManager.js && node --check src/SendQueue.js && node --check src/ZNL.js && node --check test/master/index.js && node --check test/slave/index.js && node --check test/master/test-echo-server.js && node --check test/slave/test-100-concurrent.js && node --check test/run.js"
|
|
45
45
|
}
|
|
46
46
|
}
|