@zqagent/shared 0.0.0-stage → 0.3.8
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/LICENSE +190 -0
- package/README.md +21 -2
- package/dist/approval-view.cjs +99 -0
- package/dist/approval-view.cjs.map +1 -0
- package/dist/approval-view.d.cts +39 -0
- package/dist/approval-view.d.ts +39 -0
- package/dist/approval-view.js +69 -0
- package/dist/approval-view.js.map +1 -0
- package/dist/fleet.cjs +263 -0
- package/dist/fleet.cjs.map +1 -0
- package/dist/fleet.d.cts +284 -0
- package/dist/fleet.d.ts +284 -0
- package/dist/fleet.js +214 -0
- package/dist/fleet.js.map +1 -0
- package/dist/hub-api.cjs +901 -0
- package/dist/hub-api.cjs.map +1 -0
- package/dist/hub-api.d.cts +1677 -0
- package/dist/hub-api.d.ts +1677 -0
- package/dist/hub-api.js +776 -0
- package/dist/hub-api.js.map +1 -0
- package/dist/index-DokiNlGJ.d.cts +182 -0
- package/dist/index-DokiNlGJ.d.ts +182 -0
- package/dist/index.cjs +861 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +779 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-presets.cjs +92 -0
- package/dist/llm-presets.cjs.map +1 -0
- package/dist/llm-presets.d.cts +28 -0
- package/dist/llm-presets.d.ts +28 -0
- package/dist/llm-presets.js +66 -0
- package/dist/llm-presets.js.map +1 -0
- package/dist/media.cjs +111 -0
- package/dist/media.cjs.map +1 -0
- package/dist/media.d.cts +59 -0
- package/dist/media.d.ts +59 -0
- package/dist/media.js +79 -0
- package/dist/media.js.map +1 -0
- package/dist/messages-CiXjdR1Z.d.cts +257 -0
- package/dist/messages-CiXjdR1Z.d.ts +257 -0
- package/dist/model-capabilities.cjs +105 -0
- package/dist/model-capabilities.cjs.map +1 -0
- package/dist/model-capabilities.d.cts +46 -0
- package/dist/model-capabilities.d.ts +46 -0
- package/dist/model-capabilities.js +74 -0
- package/dist/model-capabilities.js.map +1 -0
- package/dist/notify/index.cjs +375 -0
- package/dist/notify/index.cjs.map +1 -0
- package/dist/notify/index.d.cts +2 -0
- package/dist/notify/index.d.ts +2 -0
- package/dist/notify/index.js +330 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/secrets.cjs +121 -0
- package/dist/secrets.cjs.map +1 -0
- package/dist/secrets.d.cts +25 -0
- package/dist/secrets.d.ts +25 -0
- package/dist/secrets.js +82 -0
- package/dist/secrets.js.map +1 -0
- package/dist/wire/index.cjs +1265 -0
- package/dist/wire/index.cjs.map +1 -0
- package/dist/wire/index.d.cts +199 -0
- package/dist/wire/index.d.ts +199 -0
- package/dist/wire/index.js +1181 -0
- package/dist/wire/index.js.map +1 -0
- package/dist/wire/node.cjs +224 -0
- package/dist/wire/node.cjs.map +1 -0
- package/dist/wire/node.d.cts +14 -0
- package/dist/wire/node.d.ts +14 -0
- package/dist/wire/node.js +195 -0
- package/dist/wire/node.js.map +1 -0
- package/package.json +99 -3
|
@@ -0,0 +1,1181 @@
|
|
|
1
|
+
// src/wire/utf8.ts
|
|
2
|
+
var Utf8Error = class extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "Utf8Error";
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
function utf8Encode(s) {
|
|
9
|
+
const buf = new Uint8Array(s.length * 4);
|
|
10
|
+
let n = 0;
|
|
11
|
+
for (let i = 0; i < s.length; i++) {
|
|
12
|
+
let cp = s.charCodeAt(i);
|
|
13
|
+
if (cp >= 55296 && cp <= 56319) {
|
|
14
|
+
const lo = i + 1 < s.length ? s.charCodeAt(i + 1) : 0;
|
|
15
|
+
if (lo < 56320 || lo > 57343) throw new Utf8Error("\u5B64\u7ACB\u7684 UTF-16 \u9AD8\u4EE3\u7406\u9879");
|
|
16
|
+
cp = 65536 + (cp - 55296 << 10) + (lo - 56320);
|
|
17
|
+
i++;
|
|
18
|
+
} else if (cp >= 56320 && cp <= 57343) {
|
|
19
|
+
throw new Utf8Error("\u5B64\u7ACB\u7684 UTF-16 \u4F4E\u4EE3\u7406\u9879");
|
|
20
|
+
}
|
|
21
|
+
if (cp < 128) {
|
|
22
|
+
buf[n++] = cp;
|
|
23
|
+
} else if (cp < 2048) {
|
|
24
|
+
buf[n++] = 192 | cp >> 6;
|
|
25
|
+
buf[n++] = 128 | cp & 63;
|
|
26
|
+
} else if (cp < 65536) {
|
|
27
|
+
buf[n++] = 224 | cp >> 12;
|
|
28
|
+
buf[n++] = 128 | cp >> 6 & 63;
|
|
29
|
+
buf[n++] = 128 | cp & 63;
|
|
30
|
+
} else {
|
|
31
|
+
buf[n++] = 240 | cp >> 18;
|
|
32
|
+
buf[n++] = 128 | cp >> 12 & 63;
|
|
33
|
+
buf[n++] = 128 | cp >> 6 & 63;
|
|
34
|
+
buf[n++] = 128 | cp & 63;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return buf.slice(0, n);
|
|
38
|
+
}
|
|
39
|
+
function utf8Decode(b) {
|
|
40
|
+
let out = "";
|
|
41
|
+
let i = 0;
|
|
42
|
+
while (i < b.length) {
|
|
43
|
+
const c = b[i];
|
|
44
|
+
if (c < 128) {
|
|
45
|
+
out += String.fromCharCode(c);
|
|
46
|
+
i++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
let cp;
|
|
50
|
+
let need;
|
|
51
|
+
let min;
|
|
52
|
+
if ((c & 224) === 192) {
|
|
53
|
+
cp = c & 31;
|
|
54
|
+
need = 1;
|
|
55
|
+
min = 128;
|
|
56
|
+
} else if ((c & 240) === 224) {
|
|
57
|
+
cp = c & 15;
|
|
58
|
+
need = 2;
|
|
59
|
+
min = 2048;
|
|
60
|
+
} else if ((c & 248) === 240) {
|
|
61
|
+
cp = c & 7;
|
|
62
|
+
need = 3;
|
|
63
|
+
min = 65536;
|
|
64
|
+
} else {
|
|
65
|
+
throw new Utf8Error(`\u975E\u6CD5 UTF-8 \u8D77\u59CB\u5B57\u8282 0x${c.toString(16)}`);
|
|
66
|
+
}
|
|
67
|
+
if (i + need >= b.length) throw new Utf8Error("UTF-8 \u5E8F\u5217\u88AB\u622A\u65AD");
|
|
68
|
+
for (let k = 1; k <= need; k++) {
|
|
69
|
+
const cc = b[i + k];
|
|
70
|
+
if ((cc & 192) !== 128) throw new Utf8Error(`\u975E\u6CD5 UTF-8 \u7EED\u63A5\u5B57\u8282 0x${cc.toString(16)}`);
|
|
71
|
+
cp = cp << 6 | cc & 63;
|
|
72
|
+
}
|
|
73
|
+
if (cp < min) throw new Utf8Error("UTF-8 \u8FC7\u957F\u7F16\u7801\uFF08overlong\uFF09");
|
|
74
|
+
if (cp > 1114111) throw new Utf8Error("\u7801\u70B9\u8D85\u51FA U+10FFFF");
|
|
75
|
+
if (cp >= 55296 && cp <= 57343) throw new Utf8Error("UTF-8 \u7F16\u7801\u4E86 UTF-16 \u4EE3\u7406\u9879");
|
|
76
|
+
i += need + 1;
|
|
77
|
+
if (cp < 65536) {
|
|
78
|
+
out += String.fromCharCode(cp);
|
|
79
|
+
} else {
|
|
80
|
+
const v = cp - 65536;
|
|
81
|
+
out += String.fromCharCode(55296 + (v >> 10), 56320 + (v & 1023));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// src/wire/varint.ts
|
|
88
|
+
var WIRE_VARINT = 0;
|
|
89
|
+
var WIRE_FIXED64 = 1;
|
|
90
|
+
var WIRE_LEN = 2;
|
|
91
|
+
var WIRE_FIXED32 = 5;
|
|
92
|
+
var WireError = class extends Error {
|
|
93
|
+
constructor(message) {
|
|
94
|
+
super(message);
|
|
95
|
+
this.name = "WireError";
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);
|
|
99
|
+
var EMPTY = new Uint8Array(0);
|
|
100
|
+
var Writer = class {
|
|
101
|
+
buf;
|
|
102
|
+
len = 0;
|
|
103
|
+
constructor(initialCapacity = 64) {
|
|
104
|
+
this.buf = new Uint8Array(Math.max(8, initialCapacity));
|
|
105
|
+
}
|
|
106
|
+
ensure(n) {
|
|
107
|
+
if (this.len + n <= this.buf.length) return;
|
|
108
|
+
let cap = this.buf.length * 2;
|
|
109
|
+
while (cap < this.len + n) cap *= 2;
|
|
110
|
+
const next = new Uint8Array(cap);
|
|
111
|
+
next.set(this.buf.subarray(0, this.len));
|
|
112
|
+
this.buf = next;
|
|
113
|
+
}
|
|
114
|
+
/** 裸字节(帧头用,不带任何前缀) */
|
|
115
|
+
u8(b) {
|
|
116
|
+
this.ensure(1);
|
|
117
|
+
this.buf[this.len++] = b & 255;
|
|
118
|
+
}
|
|
119
|
+
raw(b) {
|
|
120
|
+
this.ensure(b.length);
|
|
121
|
+
this.buf.set(b, this.len);
|
|
122
|
+
this.len += b.length;
|
|
123
|
+
}
|
|
124
|
+
/** 无符号 varint(接受 number 或 bigint) */
|
|
125
|
+
varint(v) {
|
|
126
|
+
let x = typeof v === "bigint" ? v : BigInt(v);
|
|
127
|
+
if (x < 0n) throw new WireError("varint \u4E0D\u63A5\u53D7\u8D1F\u503C");
|
|
128
|
+
this.ensure(10);
|
|
129
|
+
while (x >= 0x80n) {
|
|
130
|
+
this.buf[this.len++] = Number(x & 0x7fn | 0x80n);
|
|
131
|
+
x >>= 7n;
|
|
132
|
+
}
|
|
133
|
+
this.buf[this.len++] = Number(x);
|
|
134
|
+
}
|
|
135
|
+
tag(field, wire) {
|
|
136
|
+
this.varint(field << 3 | wire);
|
|
137
|
+
}
|
|
138
|
+
/** length-delimited:长度 varint + 内容 */
|
|
139
|
+
lenPrefixed(b) {
|
|
140
|
+
this.varint(b.length);
|
|
141
|
+
this.raw(b);
|
|
142
|
+
}
|
|
143
|
+
// ---- proto3 字段:默认值不写线 ----
|
|
144
|
+
uint64Field(field, v) {
|
|
145
|
+
const x = typeof v === "bigint" ? v : BigInt(v);
|
|
146
|
+
if (x === 0n) return;
|
|
147
|
+
this.tag(field, WIRE_VARINT);
|
|
148
|
+
this.varint(x);
|
|
149
|
+
}
|
|
150
|
+
boolField(field, v) {
|
|
151
|
+
if (!v) return;
|
|
152
|
+
this.tag(field, WIRE_VARINT);
|
|
153
|
+
this.varint(1);
|
|
154
|
+
}
|
|
155
|
+
stringField(field, v) {
|
|
156
|
+
if (v === "") return;
|
|
157
|
+
this.tag(field, WIRE_LEN);
|
|
158
|
+
this.lenPrefixed(utf8Encode(v));
|
|
159
|
+
}
|
|
160
|
+
bytesField(field, v) {
|
|
161
|
+
if (v.length === 0) return;
|
|
162
|
+
this.tag(field, WIRE_LEN);
|
|
163
|
+
this.lenPrefixed(v);
|
|
164
|
+
}
|
|
165
|
+
finish() {
|
|
166
|
+
return this.buf.slice(0, this.len);
|
|
167
|
+
}
|
|
168
|
+
get length() {
|
|
169
|
+
return this.len;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
var Reader = class {
|
|
173
|
+
constructor(buf) {
|
|
174
|
+
this.buf = buf;
|
|
175
|
+
}
|
|
176
|
+
buf;
|
|
177
|
+
pos = 0;
|
|
178
|
+
get remaining() {
|
|
179
|
+
return this.buf.length - this.pos;
|
|
180
|
+
}
|
|
181
|
+
get eof() {
|
|
182
|
+
return this.pos >= this.buf.length;
|
|
183
|
+
}
|
|
184
|
+
varint() {
|
|
185
|
+
let shift = 0n;
|
|
186
|
+
let result = 0n;
|
|
187
|
+
for (let i = 0; i < 10; i++) {
|
|
188
|
+
if (this.pos >= this.buf.length) throw new WireError("varint \u8D8A\u754C");
|
|
189
|
+
const b = this.buf[this.pos++];
|
|
190
|
+
result |= BigInt(b & 127) << shift;
|
|
191
|
+
if ((b & 128) === 0) {
|
|
192
|
+
if (i === 9 && b > 1) throw new WireError("varint \u6EA2\u51FA\uFF08\u8D85\u8FC7 64 \u4F4D\uFF09");
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
shift += 7n;
|
|
196
|
+
}
|
|
197
|
+
throw new WireError("varint \u8D85\u8FC7 10 \u5B57\u8282");
|
|
198
|
+
}
|
|
199
|
+
/** u64 → number(超安全整数范围即判错,避免静默精度丢失) */
|
|
200
|
+
u64() {
|
|
201
|
+
const v = this.varint();
|
|
202
|
+
if (v > MAX_SAFE) throw new WireError(`u64 \u8D85\u51FA JS \u5B89\u5168\u6574\u6570\u8303\u56F4: ${v}`);
|
|
203
|
+
return Number(v);
|
|
204
|
+
}
|
|
205
|
+
tag() {
|
|
206
|
+
const t = this.varint();
|
|
207
|
+
const field = Number(t >> 3n);
|
|
208
|
+
const wire = Number(t & 7n);
|
|
209
|
+
if (field <= 0) throw new WireError("\u5B57\u6BB5\u53F7\u5FC5\u987B \u2265 1");
|
|
210
|
+
return { field, wire };
|
|
211
|
+
}
|
|
212
|
+
/** 取 n 个字节(越界判错) */
|
|
213
|
+
take(n) {
|
|
214
|
+
if (!Number.isInteger(n) || n < 0) throw new WireError(`\u975E\u6CD5\u957F\u5EA6: ${n}`);
|
|
215
|
+
if (this.pos + n > this.buf.length) {
|
|
216
|
+
throw new WireError(`\u8BFB\u53D6\u8D8A\u754C\uFF1A\u9700\u8981 ${n} \u5B57\u8282\uFF0C\u5269\u4F59 ${this.buf.length - this.pos}`);
|
|
217
|
+
}
|
|
218
|
+
const out = this.buf.subarray(this.pos, this.pos + n);
|
|
219
|
+
this.pos += n;
|
|
220
|
+
return out;
|
|
221
|
+
}
|
|
222
|
+
/** length-delimited:读长度再取其内容 */
|
|
223
|
+
lenPrefixed() {
|
|
224
|
+
return this.take(this.u64());
|
|
225
|
+
}
|
|
226
|
+
string() {
|
|
227
|
+
return utf8Decode(this.lenPrefixed());
|
|
228
|
+
}
|
|
229
|
+
/** 跳过未知字段(前向兼容的关键:未来新增字段号不应导致解析失败) */
|
|
230
|
+
skip(wire) {
|
|
231
|
+
switch (wire) {
|
|
232
|
+
case WIRE_VARINT:
|
|
233
|
+
this.varint();
|
|
234
|
+
return;
|
|
235
|
+
case WIRE_LEN:
|
|
236
|
+
this.lenPrefixed();
|
|
237
|
+
return;
|
|
238
|
+
case WIRE_FIXED64:
|
|
239
|
+
this.take(8);
|
|
240
|
+
return;
|
|
241
|
+
case WIRE_FIXED32:
|
|
242
|
+
this.take(4);
|
|
243
|
+
return;
|
|
244
|
+
default:
|
|
245
|
+
throw new WireError(`\u4E0D\u652F\u6301\u7684 wire type: ${wire}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
// src/wire/frame.ts
|
|
251
|
+
var FRAME_MAGIC = [90, 81];
|
|
252
|
+
var PROTOCOL_VERSION = 1;
|
|
253
|
+
var MAX_FRAME_BYTES = 16 * 1024 * 1024;
|
|
254
|
+
var CAP_DEFLATE = 1 << 0;
|
|
255
|
+
var FrameType = {
|
|
256
|
+
/**
|
|
257
|
+
* 帧级压缩容器(原 `HELLO` 占位,从未实现握手)。
|
|
258
|
+
*
|
|
259
|
+
* payload = `[内部帧类型 1 字节][deflate-raw 压缩后的内部 payload]`;
|
|
260
|
+
* seq 沿用内层帧的 seq,解压后与原帧语义完全一致。
|
|
261
|
+
*/
|
|
262
|
+
COMPRESSED: 0,
|
|
263
|
+
AUTH: 1,
|
|
264
|
+
SNAPSHOT: 2,
|
|
265
|
+
STATUS: 3,
|
|
266
|
+
INFO: 4,
|
|
267
|
+
EVENT: 5,
|
|
268
|
+
NOTIFY: 6,
|
|
269
|
+
CMD: 7,
|
|
270
|
+
ACK: 8,
|
|
271
|
+
SUBSCRIBE: 9,
|
|
272
|
+
UNSUBSCRIBE: 10,
|
|
273
|
+
RESUME: 11,
|
|
274
|
+
PING: 12,
|
|
275
|
+
PONG: 13,
|
|
276
|
+
/** 握手结果(服务端 → 客户端)。与 AUTH 分开,避免「同类型双向」的解析歧义 */
|
|
277
|
+
AUTH_OK: 14,
|
|
278
|
+
/**
|
|
279
|
+
* 命令终端数据(`TerminalData`)。
|
|
280
|
+
*
|
|
281
|
+
* 注意低 4 位的 16 个取值到此用尽:之后再扩帧类型只能升协议版本。
|
|
282
|
+
* 与 `EVENT` 分开是**性能隔离**(终端数据不进事件环形缓冲、不分配全局游标、
|
|
283
|
+
* 不走事件扇出队列),理由见 `proto/fleet.proto` 的 `TerminalData`。
|
|
284
|
+
*/
|
|
285
|
+
TERMINAL: 15
|
|
286
|
+
};
|
|
287
|
+
var KNOWN_TYPES = new Set(Object.values(FrameType));
|
|
288
|
+
var FrameError = class extends Error {
|
|
289
|
+
constructor(message) {
|
|
290
|
+
super(message);
|
|
291
|
+
this.name = "FrameError";
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
var MIN_HEADER_BYTES = 5;
|
|
295
|
+
var MAX_STREAM_BUFFER_BYTES = MAX_FRAME_BYTES * 2 + 64;
|
|
296
|
+
function encodeFrame(frame) {
|
|
297
|
+
if (!Number.isInteger(frame.type) || frame.type < 0 || frame.type > 15) {
|
|
298
|
+
throw new FrameError(`\u975E\u6CD5\u5E27\u7C7B\u578B: ${frame.type}`);
|
|
299
|
+
}
|
|
300
|
+
if (frame.payload.length > MAX_FRAME_BYTES) {
|
|
301
|
+
throw new FrameError(`\u8F7D\u8377\u8D85\u9650: ${frame.payload.length} > ${MAX_FRAME_BYTES}`);
|
|
302
|
+
}
|
|
303
|
+
const w = new Writer(frame.payload.length + MIN_HEADER_BYTES);
|
|
304
|
+
w.u8(FRAME_MAGIC[0]);
|
|
305
|
+
w.u8(FRAME_MAGIC[1]);
|
|
306
|
+
w.u8(PROTOCOL_VERSION << 4 | frame.type);
|
|
307
|
+
w.varint(frame.seq);
|
|
308
|
+
w.varint(frame.payload.length);
|
|
309
|
+
w.raw(frame.payload);
|
|
310
|
+
return w.finish();
|
|
311
|
+
}
|
|
312
|
+
function decodeFrame(bytes) {
|
|
313
|
+
if (bytes.length < MIN_HEADER_BYTES) {
|
|
314
|
+
throw new FrameError(`\u5E27\u8FC7\u77ED: ${bytes.length} \u5B57\u8282`);
|
|
315
|
+
}
|
|
316
|
+
if (bytes[0] !== FRAME_MAGIC[0] || bytes[1] !== FRAME_MAGIC[1]) {
|
|
317
|
+
throw new FrameError("magic \u4E0D\u7B26\uFF08\u975E\u672C\u534F\u8BAE\u6D41\u91CF\uFF09");
|
|
318
|
+
}
|
|
319
|
+
const verType = bytes[2];
|
|
320
|
+
const version = verType >> 4;
|
|
321
|
+
const type = verType & 15;
|
|
322
|
+
if (version !== PROTOCOL_VERSION) {
|
|
323
|
+
throw new FrameError(`\u4E0D\u652F\u6301\u7684\u534F\u8BAE\u7248\u672C: ${version}`);
|
|
324
|
+
}
|
|
325
|
+
if (!KNOWN_TYPES.has(type)) {
|
|
326
|
+
throw new FrameError(`\u672A\u5B9A\u4E49\u7684\u5E27\u7C7B\u578B: ${type}`);
|
|
327
|
+
}
|
|
328
|
+
let r;
|
|
329
|
+
let seq;
|
|
330
|
+
let len;
|
|
331
|
+
try {
|
|
332
|
+
r = new Reader(bytes.subarray(3));
|
|
333
|
+
seq = r.u64();
|
|
334
|
+
len = r.u64();
|
|
335
|
+
} catch (e) {
|
|
336
|
+
throw new FrameError(`\u5E27\u5934\u89E3\u6790\u5931\u8D25: ${e instanceof WireError ? e.message : String(e)}`);
|
|
337
|
+
}
|
|
338
|
+
if (len > MAX_FRAME_BYTES) {
|
|
339
|
+
throw new FrameError(`\u8F7D\u8377\u8D85\u9650: ${len} > ${MAX_FRAME_BYTES}`);
|
|
340
|
+
}
|
|
341
|
+
if (r.remaining !== len) {
|
|
342
|
+
throw new FrameError(`len(${len}) \u4E0E\u5269\u4F59\u5B57\u8282(${r.remaining})\u4E0D\u7B26`);
|
|
343
|
+
}
|
|
344
|
+
const payload = r.take(len);
|
|
345
|
+
return { type, seq, payload };
|
|
346
|
+
}
|
|
347
|
+
function frameTypeName(type) {
|
|
348
|
+
for (const [name, value] of Object.entries(FrameType)) {
|
|
349
|
+
if (value === type) return name;
|
|
350
|
+
}
|
|
351
|
+
throw new FrameError(`\u672A\u5B9A\u4E49\u7684\u5E27\u7C7B\u578B: ${type}`);
|
|
352
|
+
}
|
|
353
|
+
function encodeCompressedPayload(innerType, deflated) {
|
|
354
|
+
if (innerType === FrameType.COMPRESSED) {
|
|
355
|
+
throw new FrameError("\u538B\u7F29\u5E27\u4E0D\u5F97\u5D4C\u5957");
|
|
356
|
+
}
|
|
357
|
+
const out = new Uint8Array(deflated.length + 1);
|
|
358
|
+
out[0] = innerType;
|
|
359
|
+
out.set(deflated, 1);
|
|
360
|
+
return out;
|
|
361
|
+
}
|
|
362
|
+
function decodeCompressedPayload(payload) {
|
|
363
|
+
if (payload.length < 2) return null;
|
|
364
|
+
const type = payload[0];
|
|
365
|
+
if (type === FrameType.COMPRESSED) return null;
|
|
366
|
+
if (!KNOWN_TYPES.has(type)) return null;
|
|
367
|
+
return { type, deflated: payload.subarray(1) };
|
|
368
|
+
}
|
|
369
|
+
function frameTypeFromName(name) {
|
|
370
|
+
if (name === "HELLO") return FrameType.COMPRESSED;
|
|
371
|
+
if (!(name in FrameType)) throw new FrameError(`\u672A\u77E5\u5E27\u7C7B\u578B\u540D: ${name}`);
|
|
372
|
+
return FrameType[name];
|
|
373
|
+
}
|
|
374
|
+
function peekVarint(b, at) {
|
|
375
|
+
let value = 0n;
|
|
376
|
+
let shift = 0n;
|
|
377
|
+
for (let i = 0; i < 10; i++) {
|
|
378
|
+
if (at + i >= b.length) return null;
|
|
379
|
+
const byte = b[at + i];
|
|
380
|
+
if (i === 9 && byte > 1) return "bad";
|
|
381
|
+
value |= BigInt(byte & 127) << shift;
|
|
382
|
+
if ((byte & 128) === 0) {
|
|
383
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER)) return "bad";
|
|
384
|
+
return { value: Number(value), size: i + 1 };
|
|
385
|
+
}
|
|
386
|
+
shift += 7n;
|
|
387
|
+
}
|
|
388
|
+
return "bad";
|
|
389
|
+
}
|
|
390
|
+
var StreamDecoder = class {
|
|
391
|
+
constructor(maxBuffer = MAX_STREAM_BUFFER_BYTES) {
|
|
392
|
+
this.maxBuffer = maxBuffer;
|
|
393
|
+
}
|
|
394
|
+
maxBuffer;
|
|
395
|
+
buf = new Uint8Array(0);
|
|
396
|
+
/** 已缓存但尚未解出的字节数 */
|
|
397
|
+
get buffered() {
|
|
398
|
+
return this.buf.length;
|
|
399
|
+
}
|
|
400
|
+
/** 丢弃缓存(协议错误后重新同步用) */
|
|
401
|
+
reset() {
|
|
402
|
+
this.buf = new Uint8Array(0);
|
|
403
|
+
}
|
|
404
|
+
push(chunk) {
|
|
405
|
+
if (this.buf.length === 0) {
|
|
406
|
+
this.buf = chunk.slice();
|
|
407
|
+
} else {
|
|
408
|
+
const next = new Uint8Array(this.buf.length + chunk.length);
|
|
409
|
+
next.set(this.buf, 0);
|
|
410
|
+
next.set(chunk, this.buf.length);
|
|
411
|
+
this.buf = next;
|
|
412
|
+
}
|
|
413
|
+
if (this.buf.length > this.maxBuffer) {
|
|
414
|
+
throw new FrameError(`\u63A5\u6536\u7F13\u51B2\u8D85\u9650: ${this.buf.length} > ${this.maxBuffer}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/** 解出下一帧;不足返回 `null`。协议错误抛 `FrameError`。 */
|
|
418
|
+
nextFrame() {
|
|
419
|
+
const b = this.buf;
|
|
420
|
+
if (b.length < MIN_HEADER_BYTES) return null;
|
|
421
|
+
if (b[0] !== FRAME_MAGIC[0] || b[1] !== FRAME_MAGIC[1]) {
|
|
422
|
+
throw new FrameError("magic \u4E0D\u7B26\uFF08\u975E\u672C\u534F\u8BAE\u6D41\u91CF\uFF09");
|
|
423
|
+
}
|
|
424
|
+
const verType = b[2];
|
|
425
|
+
const version = verType >> 4;
|
|
426
|
+
const type = verType & 15;
|
|
427
|
+
if (version !== PROTOCOL_VERSION) {
|
|
428
|
+
throw new FrameError(`\u4E0D\u652F\u6301\u7684\u534F\u8BAE\u7248\u672C: ${version}`);
|
|
429
|
+
}
|
|
430
|
+
if (!KNOWN_TYPES.has(type)) {
|
|
431
|
+
throw new FrameError(`\u672A\u5B9A\u4E49\u7684\u5E27\u7C7B\u578B: ${type}`);
|
|
432
|
+
}
|
|
433
|
+
const seqPeek = peekVarint(b, 3);
|
|
434
|
+
if (seqPeek === null) return null;
|
|
435
|
+
if (seqPeek === "bad") throw new FrameError("\u5E27\u5934 varint \u975E\u6CD5: seq");
|
|
436
|
+
const lenPeek = peekVarint(b, 3 + seqPeek.size);
|
|
437
|
+
if (lenPeek === null) return null;
|
|
438
|
+
if (lenPeek === "bad") throw new FrameError("\u5E27\u5934 varint \u975E\u6CD5: len");
|
|
439
|
+
if (lenPeek.value > MAX_FRAME_BYTES) {
|
|
440
|
+
throw new FrameError(`\u8F7D\u8377\u8D85\u9650: ${lenPeek.value} > ${MAX_FRAME_BYTES}`);
|
|
441
|
+
}
|
|
442
|
+
const header = 3 + seqPeek.size + lenPeek.size;
|
|
443
|
+
const total = header + lenPeek.value;
|
|
444
|
+
if (b.length < total) return null;
|
|
445
|
+
const payload = b.slice(header, total);
|
|
446
|
+
this.buf = b.subarray(total);
|
|
447
|
+
return { type, seq: seqPeek.value, payload };
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
// src/wire/messages.ts
|
|
452
|
+
var MSG_KIND_NODE_STATE = 1;
|
|
453
|
+
var MSG_KIND_STATUS = 2;
|
|
454
|
+
function encodeEnvelope(env) {
|
|
455
|
+
const w = new Writer(128);
|
|
456
|
+
w.uint64Field(1, env.t);
|
|
457
|
+
w.stringField(2, env.nonce);
|
|
458
|
+
w.stringField(3, env.reqId);
|
|
459
|
+
w.stringField(4, env.type);
|
|
460
|
+
w.stringField(5, env.clientId);
|
|
461
|
+
w.stringField(6, env.nodeId);
|
|
462
|
+
w.stringField(7, env.projectId ?? "");
|
|
463
|
+
w.stringField(8, env.sessionId ?? "");
|
|
464
|
+
w.bytesField(9, env.payload ?? EMPTY);
|
|
465
|
+
w.uint64Field(10, env.timeoutMs ?? 0);
|
|
466
|
+
w.bytesField(11, env.sig ?? EMPTY);
|
|
467
|
+
return w.finish();
|
|
468
|
+
}
|
|
469
|
+
function signableBytes(env) {
|
|
470
|
+
return encodeEnvelope({ ...env, sig: void 0 });
|
|
471
|
+
}
|
|
472
|
+
function decodeEnvelope(bytes) {
|
|
473
|
+
const r = new Reader(bytes);
|
|
474
|
+
const env = { t: 0, nonce: "", reqId: "", type: "", clientId: "", nodeId: "" };
|
|
475
|
+
while (!r.eof) {
|
|
476
|
+
const { field, wire } = r.tag();
|
|
477
|
+
switch (field) {
|
|
478
|
+
case 1:
|
|
479
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
480
|
+
else env.t = r.u64();
|
|
481
|
+
break;
|
|
482
|
+
case 2:
|
|
483
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
484
|
+
else env.nonce = r.string();
|
|
485
|
+
break;
|
|
486
|
+
case 3:
|
|
487
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
488
|
+
else env.reqId = r.string();
|
|
489
|
+
break;
|
|
490
|
+
case 4:
|
|
491
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
492
|
+
else env.type = r.string();
|
|
493
|
+
break;
|
|
494
|
+
case 5:
|
|
495
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
496
|
+
else env.clientId = r.string();
|
|
497
|
+
break;
|
|
498
|
+
case 6:
|
|
499
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
500
|
+
else env.nodeId = r.string();
|
|
501
|
+
break;
|
|
502
|
+
case 7:
|
|
503
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
504
|
+
else env.projectId = r.string();
|
|
505
|
+
break;
|
|
506
|
+
case 8:
|
|
507
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
508
|
+
else env.sessionId = r.string();
|
|
509
|
+
break;
|
|
510
|
+
case 9:
|
|
511
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
512
|
+
else env.payload = r.lenPrefixed();
|
|
513
|
+
break;
|
|
514
|
+
case 10:
|
|
515
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
516
|
+
else env.timeoutMs = r.u64();
|
|
517
|
+
break;
|
|
518
|
+
case 11:
|
|
519
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
520
|
+
else env.sig = r.lenPrefixed();
|
|
521
|
+
break;
|
|
522
|
+
default:
|
|
523
|
+
r.skip(wire);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
return env;
|
|
527
|
+
}
|
|
528
|
+
function encodeAck(ack) {
|
|
529
|
+
const w = new Writer(64);
|
|
530
|
+
w.stringField(1, ack.reqId);
|
|
531
|
+
w.stringField(2, ack.type);
|
|
532
|
+
w.boolField(3, ack.ok);
|
|
533
|
+
w.stringField(4, ack.error ?? "");
|
|
534
|
+
w.bytesField(5, ack.data ?? EMPTY);
|
|
535
|
+
return w.finish();
|
|
536
|
+
}
|
|
537
|
+
function decodeAck(bytes) {
|
|
538
|
+
const r = new Reader(bytes);
|
|
539
|
+
const ack = { reqId: "", type: "", ok: false };
|
|
540
|
+
while (!r.eof) {
|
|
541
|
+
const { field, wire } = r.tag();
|
|
542
|
+
switch (field) {
|
|
543
|
+
case 1:
|
|
544
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
545
|
+
else ack.reqId = r.string();
|
|
546
|
+
break;
|
|
547
|
+
case 2:
|
|
548
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
549
|
+
else ack.type = r.string();
|
|
550
|
+
break;
|
|
551
|
+
case 3:
|
|
552
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
553
|
+
else ack.ok = r.varint() !== 0n;
|
|
554
|
+
break;
|
|
555
|
+
case 4:
|
|
556
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
557
|
+
else ack.error = r.string();
|
|
558
|
+
break;
|
|
559
|
+
case 5:
|
|
560
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
561
|
+
else ack.data = r.lenPrefixed();
|
|
562
|
+
break;
|
|
563
|
+
default:
|
|
564
|
+
r.skip(wire);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
return ack;
|
|
568
|
+
}
|
|
569
|
+
function encodeStatus(st) {
|
|
570
|
+
const w = new Writer(96);
|
|
571
|
+
w.stringField(1, st.nodeId);
|
|
572
|
+
w.boolField(2, st.online);
|
|
573
|
+
w.uint64Field(3, st.ts);
|
|
574
|
+
w.stringField(4, st.label ?? "");
|
|
575
|
+
w.stringField(5, st.platform ?? "");
|
|
576
|
+
w.stringField(6, st.mode ?? "");
|
|
577
|
+
w.stringField(7, st.version ?? "");
|
|
578
|
+
w.stringField(8, st.ip ?? "");
|
|
579
|
+
w.uint64Field(9, MSG_KIND_STATUS);
|
|
580
|
+
return w.finish();
|
|
581
|
+
}
|
|
582
|
+
function decodeStatus(bytes) {
|
|
583
|
+
const r = new Reader(bytes);
|
|
584
|
+
const st = { nodeId: "", online: false, ts: 0 };
|
|
585
|
+
while (!r.eof) {
|
|
586
|
+
const { field, wire } = r.tag();
|
|
587
|
+
switch (field) {
|
|
588
|
+
case 1:
|
|
589
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
590
|
+
else st.nodeId = r.string();
|
|
591
|
+
break;
|
|
592
|
+
case 2:
|
|
593
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
594
|
+
else st.online = r.varint() !== 0n;
|
|
595
|
+
break;
|
|
596
|
+
case 3:
|
|
597
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
598
|
+
else st.ts = r.u64();
|
|
599
|
+
break;
|
|
600
|
+
case 4:
|
|
601
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
602
|
+
else st.label = r.string();
|
|
603
|
+
break;
|
|
604
|
+
case 5:
|
|
605
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
606
|
+
else st.platform = r.string();
|
|
607
|
+
break;
|
|
608
|
+
case 6:
|
|
609
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
610
|
+
else st.mode = r.string();
|
|
611
|
+
break;
|
|
612
|
+
case 7:
|
|
613
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
614
|
+
else st.version = r.string();
|
|
615
|
+
break;
|
|
616
|
+
case 8:
|
|
617
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
618
|
+
else st.ip = r.string();
|
|
619
|
+
break;
|
|
620
|
+
case 9: {
|
|
621
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
622
|
+
else checkMsgKind("Status", Number(r.varint()), MSG_KIND_STATUS);
|
|
623
|
+
break;
|
|
624
|
+
}
|
|
625
|
+
default:
|
|
626
|
+
r.skip(wire);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return st;
|
|
630
|
+
}
|
|
631
|
+
function encodeEvent(ev) {
|
|
632
|
+
const w = new Writer(128);
|
|
633
|
+
w.uint64Field(1, ev.seq);
|
|
634
|
+
w.uint64Field(2, ev.ts);
|
|
635
|
+
w.stringField(3, ev.type);
|
|
636
|
+
w.stringField(4, ev.projectId ?? "");
|
|
637
|
+
w.stringField(5, ev.sessionId ?? "");
|
|
638
|
+
w.bytesField(6, ev.data ?? EMPTY);
|
|
639
|
+
w.stringField(7, ev.nodeId ?? "");
|
|
640
|
+
return w.finish();
|
|
641
|
+
}
|
|
642
|
+
function decodeEvent(bytes) {
|
|
643
|
+
const r = new Reader(bytes);
|
|
644
|
+
const ev = { seq: 0, ts: 0, type: "" };
|
|
645
|
+
while (!r.eof) {
|
|
646
|
+
const { field, wire } = r.tag();
|
|
647
|
+
switch (field) {
|
|
648
|
+
case 1:
|
|
649
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
650
|
+
else ev.seq = r.u64();
|
|
651
|
+
break;
|
|
652
|
+
case 2:
|
|
653
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
654
|
+
else ev.ts = r.u64();
|
|
655
|
+
break;
|
|
656
|
+
case 3:
|
|
657
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
658
|
+
else ev.type = r.string();
|
|
659
|
+
break;
|
|
660
|
+
case 4:
|
|
661
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
662
|
+
else ev.projectId = r.string();
|
|
663
|
+
break;
|
|
664
|
+
case 5:
|
|
665
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
666
|
+
else ev.sessionId = r.string();
|
|
667
|
+
break;
|
|
668
|
+
case 6:
|
|
669
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
670
|
+
else ev.data = r.lenPrefixed();
|
|
671
|
+
break;
|
|
672
|
+
case 7:
|
|
673
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
674
|
+
else ev.nodeId = r.string();
|
|
675
|
+
break;
|
|
676
|
+
default:
|
|
677
|
+
r.skip(wire);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
return ev;
|
|
681
|
+
}
|
|
682
|
+
function encodeInfo(info) {
|
|
683
|
+
const w = new Writer(96);
|
|
684
|
+
w.stringField(1, info.nodeId);
|
|
685
|
+
w.stringField(2, info.platform ?? "");
|
|
686
|
+
w.stringField(3, info.version ?? "");
|
|
687
|
+
w.stringField(4, info.ip ?? "");
|
|
688
|
+
w.uint64Field(5, info.projects);
|
|
689
|
+
w.uint64Field(6, info.sessions);
|
|
690
|
+
w.uint64Field(7, info.running);
|
|
691
|
+
w.uint64Field(8, info.waiting);
|
|
692
|
+
w.uint64Field(9, info.ts);
|
|
693
|
+
w.bytesField(10, info.detail ?? EMPTY);
|
|
694
|
+
return w.finish();
|
|
695
|
+
}
|
|
696
|
+
function decodeInfo(bytes) {
|
|
697
|
+
const r = new Reader(bytes);
|
|
698
|
+
const info = { nodeId: "", projects: 0, sessions: 0, running: 0, waiting: 0, ts: 0 };
|
|
699
|
+
while (!r.eof) {
|
|
700
|
+
const { field, wire } = r.tag();
|
|
701
|
+
switch (field) {
|
|
702
|
+
case 1:
|
|
703
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
704
|
+
else info.nodeId = r.string();
|
|
705
|
+
break;
|
|
706
|
+
case 2:
|
|
707
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
708
|
+
else info.platform = r.string();
|
|
709
|
+
break;
|
|
710
|
+
case 3:
|
|
711
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
712
|
+
else info.version = r.string();
|
|
713
|
+
break;
|
|
714
|
+
case 4:
|
|
715
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
716
|
+
else info.ip = r.string();
|
|
717
|
+
break;
|
|
718
|
+
case 5:
|
|
719
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
720
|
+
else info.projects = r.u64();
|
|
721
|
+
break;
|
|
722
|
+
case 6:
|
|
723
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
724
|
+
else info.sessions = r.u64();
|
|
725
|
+
break;
|
|
726
|
+
case 7:
|
|
727
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
728
|
+
else info.running = r.u64();
|
|
729
|
+
break;
|
|
730
|
+
case 8:
|
|
731
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
732
|
+
else info.waiting = r.u64();
|
|
733
|
+
break;
|
|
734
|
+
case 9:
|
|
735
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
736
|
+
else info.ts = r.u64();
|
|
737
|
+
break;
|
|
738
|
+
case 10:
|
|
739
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
740
|
+
else info.detail = r.lenPrefixed();
|
|
741
|
+
break;
|
|
742
|
+
default:
|
|
743
|
+
r.skip(wire);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
return info;
|
|
747
|
+
}
|
|
748
|
+
function encodeNotify(n) {
|
|
749
|
+
const w = new Writer(160);
|
|
750
|
+
w.uint64Field(1, n.seq);
|
|
751
|
+
w.uint64Field(2, n.ts);
|
|
752
|
+
w.stringField(3, n.kind);
|
|
753
|
+
w.stringField(4, n.projectId ?? "");
|
|
754
|
+
w.stringField(5, n.sessionId ?? "");
|
|
755
|
+
w.bytesField(6, n.data ?? EMPTY);
|
|
756
|
+
w.stringField(7, n.nodeId ?? "");
|
|
757
|
+
return w.finish();
|
|
758
|
+
}
|
|
759
|
+
function decodeNotify(bytes) {
|
|
760
|
+
const r = new Reader(bytes);
|
|
761
|
+
const n = { seq: 0, ts: 0, kind: "" };
|
|
762
|
+
while (!r.eof) {
|
|
763
|
+
const { field, wire } = r.tag();
|
|
764
|
+
switch (field) {
|
|
765
|
+
case 1:
|
|
766
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
767
|
+
else n.seq = r.u64();
|
|
768
|
+
break;
|
|
769
|
+
case 2:
|
|
770
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
771
|
+
else n.ts = r.u64();
|
|
772
|
+
break;
|
|
773
|
+
case 3:
|
|
774
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
775
|
+
else n.kind = r.string();
|
|
776
|
+
break;
|
|
777
|
+
case 4:
|
|
778
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
779
|
+
else n.projectId = r.string();
|
|
780
|
+
break;
|
|
781
|
+
case 5:
|
|
782
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
783
|
+
else n.sessionId = r.string();
|
|
784
|
+
break;
|
|
785
|
+
case 6:
|
|
786
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
787
|
+
else n.data = r.lenPrefixed();
|
|
788
|
+
break;
|
|
789
|
+
case 7:
|
|
790
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
791
|
+
else n.nodeId = r.string();
|
|
792
|
+
break;
|
|
793
|
+
default:
|
|
794
|
+
r.skip(wire);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
return n;
|
|
798
|
+
}
|
|
799
|
+
function encodeAuth(auth) {
|
|
800
|
+
const w = new Writer(64);
|
|
801
|
+
w.stringField(1, auth.id);
|
|
802
|
+
w.uint64Field(2, auth.ts);
|
|
803
|
+
w.stringField(3, auth.nonce);
|
|
804
|
+
w.uint64Field(4, auth.proto);
|
|
805
|
+
w.stringField(5, auth.kind);
|
|
806
|
+
w.stringField(6, auth.client ?? "");
|
|
807
|
+
w.bytesField(7, auth.token ?? EMPTY);
|
|
808
|
+
for (const id of auth.scope ?? []) w.stringField(8, id);
|
|
809
|
+
w.uint64Field(9, auth.expires ?? 0);
|
|
810
|
+
w.uint64Field(10, auth.caps ?? 0);
|
|
811
|
+
return w.finish();
|
|
812
|
+
}
|
|
813
|
+
function signableAuthBytes(auth) {
|
|
814
|
+
return encodeAuth({ ...auth, token: void 0 });
|
|
815
|
+
}
|
|
816
|
+
function decodeAuth(bytes) {
|
|
817
|
+
const r = new Reader(bytes);
|
|
818
|
+
const auth = { id: "", ts: 0, nonce: "", proto: 0, kind: "" };
|
|
819
|
+
while (!r.eof) {
|
|
820
|
+
const { field, wire } = r.tag();
|
|
821
|
+
switch (field) {
|
|
822
|
+
case 1:
|
|
823
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
824
|
+
else auth.id = r.string();
|
|
825
|
+
break;
|
|
826
|
+
case 2:
|
|
827
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
828
|
+
else auth.ts = r.u64();
|
|
829
|
+
break;
|
|
830
|
+
case 3:
|
|
831
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
832
|
+
else auth.nonce = r.string();
|
|
833
|
+
break;
|
|
834
|
+
case 4:
|
|
835
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
836
|
+
else auth.proto = r.u64();
|
|
837
|
+
break;
|
|
838
|
+
case 5:
|
|
839
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
840
|
+
else auth.kind = r.string();
|
|
841
|
+
break;
|
|
842
|
+
case 6:
|
|
843
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
844
|
+
else auth.client = r.string();
|
|
845
|
+
break;
|
|
846
|
+
case 7:
|
|
847
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
848
|
+
else auth.token = r.lenPrefixed();
|
|
849
|
+
break;
|
|
850
|
+
case 8:
|
|
851
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
852
|
+
else (auth.scope ??= []).push(r.string());
|
|
853
|
+
break;
|
|
854
|
+
case 9:
|
|
855
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
856
|
+
else auth.expires = r.u64();
|
|
857
|
+
break;
|
|
858
|
+
case 10:
|
|
859
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
860
|
+
else auth.caps = r.u64();
|
|
861
|
+
break;
|
|
862
|
+
default:
|
|
863
|
+
r.skip(wire);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
return auth;
|
|
867
|
+
}
|
|
868
|
+
function encodeAuthOk(ok) {
|
|
869
|
+
const w = new Writer(48);
|
|
870
|
+
w.boolField(1, ok.ok);
|
|
871
|
+
w.stringField(2, ok.error ?? "");
|
|
872
|
+
w.uint64Field(3, ok.serverTs);
|
|
873
|
+
w.uint64Field(4, ok.caps ?? 0);
|
|
874
|
+
return w.finish();
|
|
875
|
+
}
|
|
876
|
+
function decodeAuthOk(bytes) {
|
|
877
|
+
const r = new Reader(bytes);
|
|
878
|
+
const out = { ok: false, serverTs: 0 };
|
|
879
|
+
while (!r.eof) {
|
|
880
|
+
const { field, wire } = r.tag();
|
|
881
|
+
switch (field) {
|
|
882
|
+
case 1:
|
|
883
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
884
|
+
else out.ok = r.varint() !== 0n;
|
|
885
|
+
break;
|
|
886
|
+
case 2:
|
|
887
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
888
|
+
else out.error = r.string();
|
|
889
|
+
break;
|
|
890
|
+
case 3:
|
|
891
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
892
|
+
else out.serverTs = r.u64();
|
|
893
|
+
break;
|
|
894
|
+
case 4:
|
|
895
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
896
|
+
else out.caps = r.u64();
|
|
897
|
+
break;
|
|
898
|
+
default:
|
|
899
|
+
r.skip(wire);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
return out;
|
|
903
|
+
}
|
|
904
|
+
function encodeTerminalData(td) {
|
|
905
|
+
const w = new Writer(64 + (td.data?.length ?? 0));
|
|
906
|
+
w.stringField(1, td.nodeId ?? "");
|
|
907
|
+
w.stringField(2, td.terminalId);
|
|
908
|
+
w.stringField(3, td.kind);
|
|
909
|
+
w.bytesField(4, td.data ?? EMPTY);
|
|
910
|
+
w.uint64Field(5, td.seq ?? 0);
|
|
911
|
+
if (td.channel) w.uint64Field(6, td.channel);
|
|
912
|
+
if (td.session) w.stringField(7, td.session);
|
|
913
|
+
return w.finish();
|
|
914
|
+
}
|
|
915
|
+
function decodeTerminalData(bytes) {
|
|
916
|
+
const r = new Reader(bytes);
|
|
917
|
+
const td = { terminalId: "", kind: "" };
|
|
918
|
+
while (!r.eof) {
|
|
919
|
+
const { field, wire } = r.tag();
|
|
920
|
+
switch (field) {
|
|
921
|
+
case 1:
|
|
922
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
923
|
+
else td.nodeId = r.string();
|
|
924
|
+
break;
|
|
925
|
+
case 2:
|
|
926
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
927
|
+
else td.terminalId = r.string();
|
|
928
|
+
break;
|
|
929
|
+
case 3:
|
|
930
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
931
|
+
else td.kind = r.string();
|
|
932
|
+
break;
|
|
933
|
+
case 4:
|
|
934
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
935
|
+
else td.data = r.lenPrefixed();
|
|
936
|
+
break;
|
|
937
|
+
case 5:
|
|
938
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
939
|
+
else td.seq = r.u64();
|
|
940
|
+
break;
|
|
941
|
+
case 6:
|
|
942
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
943
|
+
else td.channel = r.u64();
|
|
944
|
+
break;
|
|
945
|
+
case 7:
|
|
946
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
947
|
+
else td.session = r.string();
|
|
948
|
+
break;
|
|
949
|
+
default:
|
|
950
|
+
r.skip(wire);
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
return td;
|
|
954
|
+
}
|
|
955
|
+
function encodeNodeState(n) {
|
|
956
|
+
const w = new Writer(96);
|
|
957
|
+
w.stringField(1, n.nodeId);
|
|
958
|
+
w.boolField(2, n.online);
|
|
959
|
+
w.uint64Field(3, n.lastSeen);
|
|
960
|
+
w.stringField(4, n.platform ?? "");
|
|
961
|
+
w.stringField(5, n.version ?? "");
|
|
962
|
+
w.stringField(6, n.ip ?? "");
|
|
963
|
+
w.bytesField(7, n.detail ?? EMPTY);
|
|
964
|
+
w.uint64Field(9, MSG_KIND_NODE_STATE);
|
|
965
|
+
return w.finish();
|
|
966
|
+
}
|
|
967
|
+
function decodeNodeState(bytes) {
|
|
968
|
+
const r = new Reader(bytes);
|
|
969
|
+
const n = { nodeId: "", online: false, lastSeen: 0 };
|
|
970
|
+
while (!r.eof) {
|
|
971
|
+
const { field, wire } = r.tag();
|
|
972
|
+
switch (field) {
|
|
973
|
+
case 1:
|
|
974
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
975
|
+
else n.nodeId = r.string();
|
|
976
|
+
break;
|
|
977
|
+
case 2:
|
|
978
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
979
|
+
else n.online = r.varint() !== 0n;
|
|
980
|
+
break;
|
|
981
|
+
case 3:
|
|
982
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
983
|
+
else n.lastSeen = r.u64();
|
|
984
|
+
break;
|
|
985
|
+
case 4:
|
|
986
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
987
|
+
else n.platform = r.string();
|
|
988
|
+
break;
|
|
989
|
+
case 5:
|
|
990
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
991
|
+
else n.version = r.string();
|
|
992
|
+
break;
|
|
993
|
+
case 6:
|
|
994
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
995
|
+
else n.ip = r.string();
|
|
996
|
+
break;
|
|
997
|
+
case 7:
|
|
998
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
999
|
+
else n.detail = r.lenPrefixed();
|
|
1000
|
+
break;
|
|
1001
|
+
case 9: {
|
|
1002
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
1003
|
+
else checkMsgKind("NodeState", Number(r.varint()), MSG_KIND_NODE_STATE);
|
|
1004
|
+
break;
|
|
1005
|
+
}
|
|
1006
|
+
default:
|
|
1007
|
+
r.skip(wire);
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
return n;
|
|
1011
|
+
}
|
|
1012
|
+
function checkMsgKind(label, actual, expected) {
|
|
1013
|
+
if (actual !== 0 && actual !== expected) {
|
|
1014
|
+
throw new WireError(
|
|
1015
|
+
`${label} \u5E27\u7684\u8EAB\u4EFD\u6807\u8BB0\u4E0D\u7B26\uFF08msg_kind=${actual}\uFF0C\u671F\u671B ${expected}\uFF09\uFF1A\u5F88\u53EF\u80FD\u7528\u9519\u4E86\u89E3\u7801\u5668`
|
|
1016
|
+
);
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
function encodeSnapshot(snap) {
|
|
1020
|
+
const w = new Writer(128);
|
|
1021
|
+
for (const node of snap.nodes) {
|
|
1022
|
+
w.tag(1, WIRE_LEN);
|
|
1023
|
+
w.lenPrefixed(encodeNodeState(node));
|
|
1024
|
+
}
|
|
1025
|
+
w.uint64Field(2, snap.seq);
|
|
1026
|
+
return w.finish();
|
|
1027
|
+
}
|
|
1028
|
+
function decodeSnapshot(bytes) {
|
|
1029
|
+
const r = new Reader(bytes);
|
|
1030
|
+
const snap = { nodes: [], seq: 0 };
|
|
1031
|
+
while (!r.eof) {
|
|
1032
|
+
const { field, wire } = r.tag();
|
|
1033
|
+
switch (field) {
|
|
1034
|
+
case 1:
|
|
1035
|
+
if (wire !== WIRE_LEN) r.skip(wire);
|
|
1036
|
+
else snap.nodes.push(decodeNodeState(r.lenPrefixed()));
|
|
1037
|
+
break;
|
|
1038
|
+
case 2:
|
|
1039
|
+
if (wire !== WIRE_VARINT) r.skip(wire);
|
|
1040
|
+
else snap.seq = r.u64();
|
|
1041
|
+
break;
|
|
1042
|
+
default:
|
|
1043
|
+
r.skip(wire);
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
return snap;
|
|
1047
|
+
}
|
|
1048
|
+
function encodeNodeIds(ids) {
|
|
1049
|
+
const w = new Writer(64);
|
|
1050
|
+
for (const id of ids) w.stringField(1, id);
|
|
1051
|
+
return w.finish();
|
|
1052
|
+
}
|
|
1053
|
+
function decodeNodeIds(bytes) {
|
|
1054
|
+
const r = new Reader(bytes);
|
|
1055
|
+
const ids = [];
|
|
1056
|
+
while (!r.eof) {
|
|
1057
|
+
const { field, wire } = r.tag();
|
|
1058
|
+
if (field === 1 && wire === WIRE_LEN) ids.push(r.string());
|
|
1059
|
+
else r.skip(wire);
|
|
1060
|
+
}
|
|
1061
|
+
return ids;
|
|
1062
|
+
}
|
|
1063
|
+
function encodeSubscribe(ids, noDetail = false) {
|
|
1064
|
+
if (!noDetail) return encodeNodeIds(ids);
|
|
1065
|
+
const w = new Writer(64);
|
|
1066
|
+
for (const id of ids) w.stringField(1, id);
|
|
1067
|
+
w.boolField(2, true);
|
|
1068
|
+
return w.finish();
|
|
1069
|
+
}
|
|
1070
|
+
var decodeSubscribe = decodeNodeIds;
|
|
1071
|
+
function decodeSubscribeDetail(bytes) {
|
|
1072
|
+
const r = new Reader(bytes);
|
|
1073
|
+
const nodeIds = [];
|
|
1074
|
+
let noDetail = false;
|
|
1075
|
+
while (!r.eof) {
|
|
1076
|
+
const { field, wire } = r.tag();
|
|
1077
|
+
if (field === 1 && wire === WIRE_LEN) nodeIds.push(r.string());
|
|
1078
|
+
else if (field === 2 && wire === WIRE_VARINT) noDetail = r.varint() !== 0n;
|
|
1079
|
+
else r.skip(wire);
|
|
1080
|
+
}
|
|
1081
|
+
return { nodeIds, noDetail };
|
|
1082
|
+
}
|
|
1083
|
+
var encodeUnsubscribe = encodeNodeIds;
|
|
1084
|
+
var decodeUnsubscribe = decodeNodeIds;
|
|
1085
|
+
function encodeResume(since, nodeIds = []) {
|
|
1086
|
+
const w = new Writer(16 + nodeIds.length * 16);
|
|
1087
|
+
w.uint64Field(1, since);
|
|
1088
|
+
for (const id of nodeIds) w.stringField(2, id);
|
|
1089
|
+
return w.finish();
|
|
1090
|
+
}
|
|
1091
|
+
function decodeResume(bytes) {
|
|
1092
|
+
const r = new Reader(bytes);
|
|
1093
|
+
let since = 0;
|
|
1094
|
+
const nodeIds = [];
|
|
1095
|
+
while (!r.eof) {
|
|
1096
|
+
const { field, wire } = r.tag();
|
|
1097
|
+
if (field === 1 && wire === WIRE_VARINT) since = r.u64();
|
|
1098
|
+
else if (field === 2 && wire === WIRE_LEN) nodeIds.push(r.string());
|
|
1099
|
+
else r.skip(wire);
|
|
1100
|
+
}
|
|
1101
|
+
return { since, nodeIds };
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
// src/wire/hex.ts
|
|
1105
|
+
function toHex(bytes) {
|
|
1106
|
+
let out = "";
|
|
1107
|
+
for (const b of bytes) out += b.toString(16).padStart(2, "0");
|
|
1108
|
+
return out;
|
|
1109
|
+
}
|
|
1110
|
+
function fromHex(hex) {
|
|
1111
|
+
const s = hex.trim();
|
|
1112
|
+
if (s.length % 2 !== 0) throw new Error(`\u5341\u516D\u8FDB\u5236\u957F\u5EA6\u5FC5\u987B\u4E3A\u5076\u6570: ${s.length}`);
|
|
1113
|
+
const out = new Uint8Array(s.length / 2);
|
|
1114
|
+
for (let i = 0; i < out.length; i++) {
|
|
1115
|
+
const byte = Number.parseInt(s.slice(i * 2, i * 2 + 2), 16);
|
|
1116
|
+
if (Number.isNaN(byte)) throw new Error(`\u975E\u6CD5\u5341\u516D\u8FDB\u5236\u5185\u5BB9: ${s.slice(i * 2, i * 2 + 2)}`);
|
|
1117
|
+
out[i] = byte;
|
|
1118
|
+
}
|
|
1119
|
+
return out;
|
|
1120
|
+
}
|
|
1121
|
+
export {
|
|
1122
|
+
CAP_DEFLATE,
|
|
1123
|
+
EMPTY as EMPTY_BYTES,
|
|
1124
|
+
FRAME_MAGIC,
|
|
1125
|
+
FrameError,
|
|
1126
|
+
FrameType,
|
|
1127
|
+
MAX_FRAME_BYTES,
|
|
1128
|
+
MAX_STREAM_BUFFER_BYTES,
|
|
1129
|
+
PROTOCOL_VERSION,
|
|
1130
|
+
Reader,
|
|
1131
|
+
StreamDecoder,
|
|
1132
|
+
Utf8Error,
|
|
1133
|
+
WIRE_FIXED32,
|
|
1134
|
+
WIRE_FIXED64,
|
|
1135
|
+
WIRE_LEN,
|
|
1136
|
+
WIRE_VARINT,
|
|
1137
|
+
WireError,
|
|
1138
|
+
Writer,
|
|
1139
|
+
decodeAck,
|
|
1140
|
+
decodeAuth,
|
|
1141
|
+
decodeAuthOk,
|
|
1142
|
+
decodeCompressedPayload,
|
|
1143
|
+
decodeEnvelope,
|
|
1144
|
+
decodeEvent,
|
|
1145
|
+
decodeFrame,
|
|
1146
|
+
decodeInfo,
|
|
1147
|
+
decodeNodeState,
|
|
1148
|
+
decodeNotify,
|
|
1149
|
+
decodeResume,
|
|
1150
|
+
decodeSnapshot,
|
|
1151
|
+
decodeStatus,
|
|
1152
|
+
decodeSubscribe,
|
|
1153
|
+
decodeSubscribeDetail,
|
|
1154
|
+
decodeTerminalData,
|
|
1155
|
+
decodeUnsubscribe,
|
|
1156
|
+
encodeAck,
|
|
1157
|
+
encodeAuth,
|
|
1158
|
+
encodeAuthOk,
|
|
1159
|
+
encodeCompressedPayload,
|
|
1160
|
+
encodeEnvelope,
|
|
1161
|
+
encodeEvent,
|
|
1162
|
+
encodeFrame,
|
|
1163
|
+
encodeInfo,
|
|
1164
|
+
encodeNodeState,
|
|
1165
|
+
encodeNotify,
|
|
1166
|
+
encodeResume,
|
|
1167
|
+
encodeSnapshot,
|
|
1168
|
+
encodeStatus,
|
|
1169
|
+
encodeSubscribe,
|
|
1170
|
+
encodeTerminalData,
|
|
1171
|
+
encodeUnsubscribe,
|
|
1172
|
+
frameTypeFromName,
|
|
1173
|
+
frameTypeName,
|
|
1174
|
+
fromHex,
|
|
1175
|
+
signableAuthBytes,
|
|
1176
|
+
signableBytes,
|
|
1177
|
+
toHex,
|
|
1178
|
+
utf8Decode,
|
|
1179
|
+
utf8Encode
|
|
1180
|
+
};
|
|
1181
|
+
//# sourceMappingURL=index.js.map
|