@agentunion/fastaun 0.2.13

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 (69) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +78 -0
  3. package/dist/auth.d.ts +287 -0
  4. package/dist/auth.js +1668 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/client.d.ts +359 -0
  7. package/dist/client.js +3918 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/config.d.ts +43 -0
  10. package/dist/config.js +119 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/crypto.d.ts +41 -0
  13. package/dist/crypto.js +85 -0
  14. package/dist/crypto.js.map +1 -0
  15. package/dist/discovery.d.ts +22 -0
  16. package/dist/discovery.js +110 -0
  17. package/dist/discovery.js.map +1 -0
  18. package/dist/e2ee-group.d.ts +192 -0
  19. package/dist/e2ee-group.js +1134 -0
  20. package/dist/e2ee-group.js.map +1 -0
  21. package/dist/e2ee.d.ts +120 -0
  22. package/dist/e2ee.js +890 -0
  23. package/dist/e2ee.js.map +1 -0
  24. package/dist/errors.d.ts +115 -0
  25. package/dist/errors.js +253 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/events.d.ts +39 -0
  28. package/dist/events.js +82 -0
  29. package/dist/events.js.map +1 -0
  30. package/dist/index.d.ts +23 -0
  31. package/dist/index.js +32 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/keystore/aid-db.d.ts +79 -0
  34. package/dist/keystore/aid-db.js +621 -0
  35. package/dist/keystore/aid-db.js.map +1 -0
  36. package/dist/keystore/file.d.ts +82 -0
  37. package/dist/keystore/file.js +395 -0
  38. package/dist/keystore/file.js.map +1 -0
  39. package/dist/keystore/index.d.ts +88 -0
  40. package/dist/keystore/index.js +7 -0
  41. package/dist/keystore/index.js.map +1 -0
  42. package/dist/keystore/sqlite-backup.d.ts +40 -0
  43. package/dist/keystore/sqlite-backup.js +379 -0
  44. package/dist/keystore/sqlite-backup.js.map +1 -0
  45. package/dist/logger.d.ts +6 -0
  46. package/dist/logger.js +53 -0
  47. package/dist/logger.js.map +1 -0
  48. package/dist/namespaces/auth.d.ts +49 -0
  49. package/dist/namespaces/auth.js +248 -0
  50. package/dist/namespaces/auth.js.map +1 -0
  51. package/dist/namespaces/custody.d.ts +47 -0
  52. package/dist/namespaces/custody.js +231 -0
  53. package/dist/namespaces/custody.js.map +1 -0
  54. package/dist/secret-store/file-store.d.ts +25 -0
  55. package/dist/secret-store/file-store.js +124 -0
  56. package/dist/secret-store/file-store.js.map +1 -0
  57. package/dist/secret-store/index.d.ts +28 -0
  58. package/dist/secret-store/index.js +19 -0
  59. package/dist/secret-store/index.js.map +1 -0
  60. package/dist/seq-tracker.d.ts +29 -0
  61. package/dist/seq-tracker.js +221 -0
  62. package/dist/seq-tracker.js.map +1 -0
  63. package/dist/transport.d.ts +60 -0
  64. package/dist/transport.js +355 -0
  65. package/dist/transport.js.map +1 -0
  66. package/dist/types.d.ts +170 -0
  67. package/dist/types.js +12 -0
  68. package/dist/types.js.map +1 -0
  69. package/package.json +42 -0
@@ -0,0 +1,355 @@
1
+ /**
2
+ * RPC 传输层
3
+ *
4
+ * 基于 WebSocket(ws 包)的 JSON-RPC 2.0 传输层。
5
+ * 与 Python SDK 的 RPCTransport 完全对齐:
6
+ * - connect → 接收初始 challenge
7
+ * - call → 请求/响应匹配
8
+ * - 事件路由 → EventDispatcher
9
+ */
10
+ import WebSocket from 'ws';
11
+ import * as crypto from 'node:crypto';
12
+ import { ConnectionError, SerializationError, TimeoutError, mapRemoteError } from './errors.js';
13
+ import { isJsonObject } from './types.js';
14
+ /** 协议事件名映射 */
15
+ const EVENT_NAME_MAP = {
16
+ 'message.received': 'message.received',
17
+ 'message.recalled': 'message.recalled',
18
+ 'message.ack': 'message.ack',
19
+ 'group.changed': 'group.changed',
20
+ 'group.message_created': 'group.message_created',
21
+ 'storage.object_changed': 'storage.object_changed',
22
+ };
23
+ /**
24
+ * WebSocket JSON-RPC 2.0 传输层
25
+ */
26
+ export class RPCTransport {
27
+ _dispatcher;
28
+ _timeout;
29
+ _onDisconnect;
30
+ _verifySsl;
31
+ _ws = null;
32
+ _closed = true;
33
+ _challenge = null;
34
+ _pending = new Map();
35
+ _idCounter = 0;
36
+ constructor(opts) {
37
+ this._dispatcher = opts.eventDispatcher;
38
+ this._timeout = opts.timeout ?? 10_000;
39
+ this._onDisconnect = opts.onDisconnect ?? null;
40
+ this._verifySsl = opts.verifySsl ?? true;
41
+ }
42
+ /** 设置默认 RPC 超时(毫秒) */
43
+ setTimeout(timeout) {
44
+ this._timeout = timeout;
45
+ }
46
+ /** 获取上次连接的 challenge 消息 */
47
+ get challenge() {
48
+ return this._challenge;
49
+ }
50
+ /**
51
+ * 连接到 Gateway WebSocket 端点。
52
+ * 返回初始 challenge 消息(如果有)。
53
+ */
54
+ async connect(url) {
55
+ // ws 8.x+ 中 rejectUnauthorized 需通过 https.Agent 传递
56
+ let wsOpts = undefined;
57
+ if (!this._verifySsl) {
58
+ const https = await import('https');
59
+ wsOpts = { agent: new https.Agent({ rejectUnauthorized: false }) };
60
+ }
61
+ const ws = new WebSocket(url, wsOpts);
62
+ return this._connectWithWs(ws);
63
+ }
64
+ /**
65
+ * 内部:使用已创建的 WebSocket 实例完成握手。
66
+ * 握手阶段(open 后到首条消息处理完毕)如果发生 error 或解析失败,
67
+ * 会回滚 _ws / _closed,确保不留下半连接状态。
68
+ */
69
+ _connectWithWs(ws) {
70
+ return new Promise((resolve, reject) => {
71
+ let initialResolved = false;
72
+ /** 握手失败时回滚内部状态,避免半连接 */
73
+ const rollback = () => {
74
+ this._ws = null;
75
+ this._closed = true;
76
+ try {
77
+ ws.close();
78
+ }
79
+ catch { /* noop */ }
80
+ };
81
+ /** 清理握手阶段的临时监听器 */
82
+ const cleanupHandshakeListeners = () => {
83
+ try {
84
+ ws.removeListener('message', onFirstMessage);
85
+ }
86
+ catch { /* noop */ }
87
+ try {
88
+ ws.removeListener('error', onHandshakeError);
89
+ }
90
+ catch { /* noop */ }
91
+ try {
92
+ ws.removeListener('open', onOpen);
93
+ }
94
+ catch { /* noop */ }
95
+ };
96
+ let connectTimeout = null;
97
+ const onHandshakeError = (err) => {
98
+ if (!initialResolved) {
99
+ initialResolved = true;
100
+ if (connectTimeout)
101
+ clearTimeout(connectTimeout);
102
+ cleanupHandshakeListeners();
103
+ rollback();
104
+ reject(new ConnectionError(`websocket connect failed: ${err.message}`));
105
+ }
106
+ };
107
+ const onOpen = () => {
108
+ // 防止超时/错误已 rollback 后,迟到的 open 事件重新赋值 _ws 导致 zombie 连接
109
+ if (initialResolved)
110
+ return;
111
+ this._ws = ws;
112
+ this._closed = false;
113
+ // 等待第一条消息作为 challenge
114
+ };
115
+ const onFirstMessage = (data) => {
116
+ if (!initialResolved) {
117
+ // 第一条消息:尝试解析为 challenge
118
+ initialResolved = true;
119
+ if (connectTimeout)
120
+ clearTimeout(connectTimeout);
121
+ cleanupHandshakeListeners();
122
+ try {
123
+ const message = this._decodeMessage(data);
124
+ if (message.method === 'challenge') {
125
+ this._challenge = message;
126
+ this._setupListeners(ws);
127
+ resolve(message);
128
+ }
129
+ else {
130
+ this._challenge = null;
131
+ this._setupListeners(ws);
132
+ // 非 challenge 消息,路由处理后返回 null
133
+ this._routeMessage(message);
134
+ resolve(null);
135
+ }
136
+ }
137
+ catch (err) {
138
+ // 握手消息解析失败:回滚状态,不留半连接
139
+ rollback();
140
+ reject(err instanceof Error ? err : new SerializationError(String(err)));
141
+ }
142
+ return;
143
+ }
144
+ // 后续消息由 _setupListeners 处理
145
+ };
146
+ ws.on('error', onHandshakeError);
147
+ ws.on('open', onOpen);
148
+ ws.on('message', onFirstMessage);
149
+ // 连接超时覆盖整个握手流程(open + 等待 challenge)。
150
+ // 不在 open 时清除,防止服务端沉默导致 Promise 永远不 resolve。
151
+ connectTimeout = setTimeout(() => {
152
+ if (!initialResolved) {
153
+ initialResolved = true;
154
+ cleanupHandshakeListeners();
155
+ rollback();
156
+ reject(new ConnectionError('websocket connect timeout'));
157
+ }
158
+ }, this._timeout);
159
+ });
160
+ }
161
+ /** 关闭连接 */
162
+ async close() {
163
+ this._closed = true;
164
+ // 取消所有待处理的 RPC
165
+ for (const [id, pending] of this._pending) {
166
+ clearTimeout(pending.timer);
167
+ pending.reject(new ConnectionError('transport closed'));
168
+ }
169
+ this._pending.clear();
170
+ if (this._ws) {
171
+ const ws = this._ws;
172
+ this._ws = null;
173
+ // M25: close() 返回前先移除路由相关的监听器,避免
174
+ // 超时强制 resolve 后,stale ws 仍把消息注入 _routeMessage 或
175
+ // 向 EventDispatcher 广播 connection.error。
176
+ try {
177
+ ws.removeAllListeners('message');
178
+ }
179
+ catch { /* noop */ }
180
+ try {
181
+ ws.removeAllListeners('error');
182
+ }
183
+ catch { /* noop */ }
184
+ return new Promise((resolve) => {
185
+ let settled = false;
186
+ const finish = () => {
187
+ if (settled)
188
+ return;
189
+ settled = true;
190
+ clearTimeout(timer);
191
+ try {
192
+ ws.removeAllListeners();
193
+ }
194
+ catch { /* noop */ }
195
+ try {
196
+ ws.terminate?.();
197
+ }
198
+ catch { /* noop */ }
199
+ resolve();
200
+ };
201
+ ws.on('close', finish);
202
+ try {
203
+ ws.close();
204
+ }
205
+ catch {
206
+ finish();
207
+ return;
208
+ }
209
+ // 超时强制解析,并在定时器触发时通过 terminate() 彻底清理残留 socket
210
+ const timer = setTimeout(finish, 3_000);
211
+ });
212
+ }
213
+ }
214
+ /**
215
+ * 发送 JSON-RPC 2.0 请求并等待响应。
216
+ */
217
+ async call(method, params, timeout) {
218
+ if (this._closed || !this._ws) {
219
+ throw new ConnectionError('transport not connected');
220
+ }
221
+ const rpcId = `rpc-${crypto.randomBytes(8).toString('hex')}`;
222
+ const effectiveTimeout = timeout ?? this._timeout;
223
+ return new Promise((resolve, reject) => {
224
+ const timer = setTimeout(() => {
225
+ this._pending.delete(rpcId);
226
+ reject(new TimeoutError(`rpc timeout: ${method}`, { retryable: true }));
227
+ }, effectiveTimeout);
228
+ this._pending.set(rpcId, {
229
+ resolve: (response) => {
230
+ clearTimeout(timer);
231
+ if (response.error !== undefined) {
232
+ reject(mapRemoteError(response.error));
233
+ }
234
+ else if (response.result !== undefined) {
235
+ resolve(response.result);
236
+ }
237
+ else {
238
+ reject(new SerializationError(`rpc response missing result and error: ${method}`));
239
+ }
240
+ },
241
+ reject: (err) => {
242
+ clearTimeout(timer);
243
+ reject(err);
244
+ },
245
+ timer,
246
+ });
247
+ const payload = JSON.stringify({
248
+ jsonrpc: '2.0',
249
+ id: rpcId,
250
+ method,
251
+ params: params ?? {},
252
+ });
253
+ try {
254
+ this._ws.send(payload);
255
+ }
256
+ catch (err) {
257
+ this._pending.delete(rpcId);
258
+ clearTimeout(timer);
259
+ reject(new ConnectionError(`failed to send rpc ${method}: ${err instanceof Error ? err.message : String(err)}`));
260
+ }
261
+ });
262
+ }
263
+ // ── 内部方法 ────────────────────────────────────────────
264
+ /** 设置 WebSocket 监听器(首条消息已处理后调用) */
265
+ _setupListeners(ws) {
266
+ ws.on('message', (data) => {
267
+ try {
268
+ const message = this._decodeMessage(data);
269
+ this._routeMessage(message);
270
+ }
271
+ catch (err) {
272
+ // 解析异常,发布错误事件
273
+ this._dispatcher.publish('connection.error', {
274
+ error: err instanceof Error ? err : String(err),
275
+ });
276
+ }
277
+ });
278
+ ws.on('close', (code) => {
279
+ const wasClosed = this._closed;
280
+ this._closed = true;
281
+ if (!wasClosed && this._onDisconnect) {
282
+ const cb = this._onDisconnect;
283
+ Promise.resolve(cb(null, code)).catch(() => console.warn('[aun_core.transport] disconnect 回调异常'));
284
+ }
285
+ });
286
+ ws.on('error', (err) => {
287
+ if (!this._closed) {
288
+ this._dispatcher.publish('connection.error', { error: err });
289
+ }
290
+ });
291
+ }
292
+ /** 路由消息:RPC 响应 / challenge / 事件 / 通知 */
293
+ _routeMessage(message) {
294
+ // RPC 响应(有 id 字段)
295
+ if ('id' in message) {
296
+ const rpcId = String(message.id);
297
+ const pending = this._pending.get(rpcId);
298
+ if (pending) {
299
+ this._pending.delete(rpcId);
300
+ pending.resolve(message);
301
+ }
302
+ return;
303
+ }
304
+ const method = String(message.method ?? '');
305
+ // Challenge 消息
306
+ if (method === 'challenge') {
307
+ this._challenge = message;
308
+ this._dispatcher.publish('connection.challenge', message.params ?? {});
309
+ return;
310
+ }
311
+ // 事件消息(event/ 前缀)
312
+ if (method.startsWith('event/')) {
313
+ const protocolEvent = method.slice('event/'.length);
314
+ const sdkEvent = EVENT_NAME_MAP[protocolEvent] ?? protocolEvent;
315
+ // 发布为 _raw.{event},由 AUNClient 处理后再发布用户可见的事件
316
+ this._dispatcher.publish(`_raw.${sdkEvent}`, message.params ?? {});
317
+ return;
318
+ }
319
+ // 其他通知
320
+ this._dispatcher.publish('notification', message);
321
+ }
322
+ /** 解码 WebSocket 消息为 JSON 对象 */
323
+ _decodeMessage(raw) {
324
+ if (isJsonObject(raw)) {
325
+ return raw;
326
+ }
327
+ let str;
328
+ if (Buffer.isBuffer(raw)) {
329
+ str = raw.toString('utf-8');
330
+ }
331
+ else if (Array.isArray(raw)) {
332
+ str = Buffer.concat(raw).toString('utf-8');
333
+ }
334
+ else if (raw instanceof ArrayBuffer) {
335
+ str = Buffer.from(raw).toString('utf-8');
336
+ }
337
+ else if (typeof raw === 'string') {
338
+ str = raw;
339
+ }
340
+ else {
341
+ throw new SerializationError(`unsupported websocket payload type: ${typeof raw}`);
342
+ }
343
+ try {
344
+ const parsed = JSON.parse(str);
345
+ if (!isJsonObject(parsed)) {
346
+ throw new SerializationError('invalid json payload');
347
+ }
348
+ return parsed;
349
+ }
350
+ catch {
351
+ throw new SerializationError('invalid json payload');
352
+ }
353
+ }
354
+ }
355
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhG,OAAO,EAAE,YAAY,EAAoF,MAAM,YAAY,CAAC;AAE5H,cAAc;AACd,MAAM,cAAc,GAA2B;IAC7C,kBAAkB,EAAE,kBAAkB;IACtC,kBAAkB,EAAE,kBAAkB;IACtC,aAAa,EAAE,aAAa;IAC5B,eAAe,EAAE,eAAe;IAChC,uBAAuB,EAAE,uBAAuB;IAChD,wBAAwB,EAAE,wBAAwB;CACnD,CAAC;AAKF;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,WAAW,CAAkB;IAC7B,QAAQ,CAAS;IACjB,aAAa,CAA4B;IACzC,UAAU,CAAU;IACpB,GAAG,GAAqB,IAAI,CAAC;IAC7B,OAAO,GAAG,IAAI,CAAC;IACf,UAAU,GAAsB,IAAI,CAAC;IACrC,QAAQ,GAIX,IAAI,GAAG,EAAE,CAAC;IACP,UAAU,GAAG,CAAC,CAAC;IAEvB,YAAY,IAKX;QACC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;IAC3C,CAAC;IAED,sBAAsB;IACtB,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,kDAAkD;QAClD,IAAI,MAAM,GAAQ,SAAS,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACrE,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,EAAa;QAClC,OAAO,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxD,IAAI,eAAe,GAAG,KAAK,CAAC;YAE5B,wBAAwB;YACxB,MAAM,QAAQ,GAAG,GAAS,EAAE;gBAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC;oBAAC,EAAE,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC,CAAC;YAEF,mBAAmB;YACnB,MAAM,yBAAyB,GAAG,GAAS,EAAE;gBAC3C,IAAI,CAAC;oBAAC,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC1E,IAAI,CAAC;oBAAC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC1E,IAAI,CAAC;oBAAC,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YACjE,CAAC,CAAC;YAEF,IAAI,cAAc,GAAyC,IAAI,CAAC;YAEhE,MAAM,gBAAgB,GAAG,CAAC,GAAU,EAAQ,EAAE;gBAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,eAAe,GAAG,IAAI,CAAC;oBACvB,IAAI,cAAc;wBAAE,YAAY,CAAC,cAAc,CAAC,CAAC;oBACjD,yBAAyB,EAAE,CAAC;oBAC5B,QAAQ,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,eAAe,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,GAAS,EAAE;gBACxB,uDAAuD;gBACvD,IAAI,eAAe;oBAAE,OAAO;gBAC5B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,sBAAsB;YACxB,CAAC,CAAC;YAEF,MAAM,cAAc,GAAG,CAAC,IAAa,EAAQ,EAAE;gBAC7C,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,wBAAwB;oBACxB,eAAe,GAAG,IAAI,CAAC;oBACvB,IAAI,cAAc;wBAAE,YAAY,CAAC,cAAc,CAAC,CAAC;oBACjD,yBAAyB,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAA6D,CAAC,CAAC;wBACnG,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;4BACnC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;4BAC1B,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;4BACzB,OAAO,CAAC,OAAO,CAAC,CAAC;wBACnB,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;4BACvB,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;4BACzB,8BAA8B;4BAC9B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;4BAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;wBAChB,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,sBAAsB;wBACtB,QAAQ,EAAE,CAAC;wBACX,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC3E,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,2BAA2B;YAC7B,CAAC,CAAC;YAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YACjC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtB,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAEjC,qCAAqC;YACrC,6CAA6C;YAC7C,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,eAAe,GAAG,IAAI,CAAC;oBACvB,yBAAyB,EAAE,CAAC;oBAC5B,QAAQ,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,eAAe,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACX,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,eAAe;QACf,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;YACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,iCAAiC;YACjC,iDAAiD;YACjD,yCAAyC;YACzC,IAAI,CAAC;gBAAC,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YAC9D,IAAI,CAAC;gBAAC,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YAC5D,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,MAAM,MAAM,GAAG,GAAS,EAAE;oBACxB,IAAI,OAAO;wBAAE,OAAO;oBACpB,OAAO,GAAG,IAAI,CAAC;oBACf,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,IAAI,CAAC;wBAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;oBACrD,IAAI,CAAC;wBAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;oBAC9C,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;gBACF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACvB,IAAI,CAAC;oBACH,EAAE,CAAC,KAAK,EAAE,CAAC;gBACb,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,EAAE,CAAC;oBACT,OAAO;gBACT,CAAC;gBACD,8CAA8C;gBAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,MAAc,EACd,MAAkB,EAClB,OAAgB;QAEhB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,MAAM,gBAAgB,GAAG,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;QAElD,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,MAAM,CAAC,IAAI,YAAY,CAAC,gBAAgB,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAErB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE;gBACvB,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;oBACpB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBACjC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBACzC,CAAC;yBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC3B,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,kBAAkB,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAC,CAAC;oBACrF,CAAC;gBACH,CAAC;gBACD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;oBACd,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;gBACD,KAAK;aACN,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC7B,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,KAAK;gBACT,MAAM;gBACN,MAAM,EAAE,MAAM,IAAI,EAAE;aACrB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,IAAI,CAAC,GAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CACJ,IAAI,eAAe,CACjB,sBAAsB,MAAM,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpF,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IAEvD,mCAAmC;IAC3B,eAAe,CAAC,EAAa;QACnC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,cAAc;gBACd,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,kBAAkB,EAAE;oBAC3C,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBAChD,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;YAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC9B,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;YACpG,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wCAAwC;IAChC,aAAa,CAAC,OAAmB;QACvC,kBAAkB;QAClB,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAE5C,eAAe;QACf,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC;YAChE,6CAA6C;YAC7C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,QAAQ,EAAE,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,OAAO;QACP,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,+BAA+B;IACvB,cAAc,CAAC,GAA0D;QAC/E,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,GAAiB,CAAC;QAC3B,CAAC;QACD,IAAI,GAAW,CAAC;QAChB,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YACtC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,GAAG,GAAG,GAAG,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,kBAAkB,CAAC,uCAAuC,OAAO,GAAG,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;YAC5C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,MAAoB,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * AUN SDK 核心类型定义
3
+ */
4
+ /** JSON 原子值 */
5
+ export type JsonPrimitive = string | number | boolean | null;
6
+ /** JSON 对象 */
7
+ export interface JsonObject {
8
+ [key: string]: JsonValue | undefined;
9
+ }
10
+ /** JSON 数组 */
11
+ export interface JsonArray extends Array<JsonValue> {
12
+ }
13
+ /** JSON 值 */
14
+ export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
15
+ /** P2P 投递模式 */
16
+ export type DeliveryMode = 'fanout' | 'queue';
17
+ /** 判断值是否为普通 JSON 对象 */
18
+ export declare function isJsonObject(value: JsonValue | object | null | undefined): value is JsonObject;
19
+ /** RPC 参数 */
20
+ export interface RpcParams extends JsonObject {
21
+ }
22
+ /** RPC 返回值 */
23
+ export type RpcResult = JsonValue;
24
+ /** RPC 错误对象 */
25
+ export interface RpcErrorObject extends JsonObject {
26
+ code?: number;
27
+ message?: string;
28
+ data?: JsonValue;
29
+ }
30
+ /** RPC 消息 */
31
+ export interface RpcMessage extends JsonObject {
32
+ jsonrpc?: string;
33
+ id?: string | number | null;
34
+ method?: string;
35
+ params?: JsonObject;
36
+ result?: RpcResult;
37
+ error?: RpcErrorObject;
38
+ }
39
+ /** Gateway 条目 */
40
+ export interface GatewayEntry extends JsonObject {
41
+ url?: string;
42
+ priority?: number;
43
+ }
44
+ /** Gateway 发现文档 */
45
+ export interface GatewayDiscoveryDocument extends JsonObject {
46
+ gateways?: GatewayEntry[];
47
+ }
48
+ /** 身份密钥对记录 */
49
+ export interface KeyPairRecord extends JsonObject {
50
+ private_key_pem?: string;
51
+ public_key_der_b64?: string;
52
+ curve?: string;
53
+ }
54
+ /** E2EE prekey 记录 */
55
+ export interface PrekeyRecord extends JsonObject {
56
+ prekey_id?: string;
57
+ public_key?: string;
58
+ signature?: string;
59
+ private_key_pem?: string;
60
+ created_at?: number;
61
+ updated_at?: number;
62
+ expires_at?: number;
63
+ }
64
+ /** prekey 映射 */
65
+ export type PrekeyMap = Record<string, PrekeyRecord>;
66
+ /** 群组旧 epoch 记录 */
67
+ export interface GroupOldEpochRecord extends JsonObject {
68
+ epoch?: number;
69
+ secret?: string;
70
+ commitment?: string;
71
+ member_aids?: string[];
72
+ epoch_chain?: string;
73
+ epoch_chain_unverified?: boolean;
74
+ epoch_chain_unverified_reason?: string;
75
+ pending_rotation_id?: string;
76
+ pending_created_at?: number;
77
+ secret_protection?: JsonObject;
78
+ created_at?: number;
79
+ updated_at?: number;
80
+ expires_at?: number;
81
+ }
82
+ /** 群组密钥状态 */
83
+ export interface GroupSecretRecord extends JsonObject {
84
+ group_id?: string;
85
+ epoch?: number;
86
+ secret?: string;
87
+ commitment?: string;
88
+ member_aids?: string[];
89
+ epoch_chain?: string;
90
+ epoch_chain_unverified?: boolean;
91
+ epoch_chain_unverified_reason?: string;
92
+ pending_rotation_id?: string;
93
+ pending_created_at?: number;
94
+ updated_at?: number;
95
+ secret_protection?: JsonObject;
96
+ old_epochs?: GroupOldEpochRecord[];
97
+ }
98
+ /** metadata 记录 */
99
+ export interface MetadataRecord extends JsonObject {
100
+ access_token?: string;
101
+ refresh_token?: string;
102
+ kite_token?: string;
103
+ e2ee_prekeys?: PrekeyMap;
104
+ e2ee_sessions?: JsonObject[];
105
+ }
106
+ /** 身份记录 */
107
+ export interface IdentityRecord extends MetadataRecord, KeyPairRecord {
108
+ aid?: string;
109
+ cert?: string;
110
+ cert_pem?: string;
111
+ token?: string;
112
+ token_exp?: number;
113
+ expires_at?: number;
114
+ }
115
+ /** E2EE session 记录 */
116
+ export interface SessionRecord extends JsonObject {
117
+ session_id?: string;
118
+ key?: string;
119
+ key_protection?: JsonObject;
120
+ peer_aid?: string;
121
+ created_at?: number;
122
+ updated_at?: number;
123
+ expires_at?: number;
124
+ }
125
+ /** SecretStore 加密记录 */
126
+ export interface SecretRecord extends JsonObject {
127
+ scheme?: string;
128
+ name?: string;
129
+ persisted?: boolean;
130
+ nonce?: string;
131
+ ciphertext?: string;
132
+ tag?: string;
133
+ iv?: string;
134
+ }
135
+ /** 消息结构 */
136
+ export interface Message extends JsonObject {
137
+ message_id?: string;
138
+ seq?: number;
139
+ from?: string;
140
+ to?: string;
141
+ type?: string;
142
+ payload?: JsonValue;
143
+ encrypted?: boolean;
144
+ delivery_mode?: DeliveryMode;
145
+ timestamp?: number;
146
+ e2ee?: JsonObject;
147
+ group_id?: string;
148
+ sender_aid?: string;
149
+ direction?: string;
150
+ }
151
+ /** 发送结果 */
152
+ export interface SendResult extends JsonObject {
153
+ ok?: boolean;
154
+ message_id?: string;
155
+ seq?: number;
156
+ timestamp?: number;
157
+ status?: 'sent' | 'delivered' | 'duplicate';
158
+ delivery_mode?: DeliveryMode;
159
+ }
160
+ /** 确认结果 */
161
+ export interface AckResult extends JsonObject {
162
+ success?: boolean;
163
+ ack_seq?: number;
164
+ }
165
+ /** 拉取结果 */
166
+ export interface PullResult extends JsonObject {
167
+ messages?: Message[];
168
+ count?: number;
169
+ latest_seq?: number;
170
+ }
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * AUN SDK 核心类型定义
3
+ */
4
+ /** 判断值是否为普通 JSON 对象 */
5
+ export function isJsonObject(value) {
6
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
7
+ return false;
8
+ }
9
+ const proto = Object.getPrototypeOf(value);
10
+ return proto === Object.prototype || proto === null;
11
+ }
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,uBAAuB;AACvB,MAAM,UAAU,YAAY,CAAC,KAA4C;IACvE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AACtD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@agentunion/fastaun",
3
+ "version": "0.2.13",
4
+ "description": "AUN Protocol Core SDK for Node.js",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "engines": {
15
+ "node": ">=22.16.0"
16
+ },
17
+ "license": "Apache-2.0",
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "test": "vitest run",
26
+ "test:unit": "vitest run tests/unit",
27
+ "test:integration": "vitest run tests/integration/e2ee.test.ts",
28
+ "test:e2e": "vitest run tests/e2e/group-e2ee.test.ts",
29
+ "test:federation": "vitest run tests/integration/federation.test.ts tests/integration/federation-storage.test.ts",
30
+ "test:watch": "vitest"
31
+ },
32
+ "dependencies": {
33
+ "ws": "^8.18.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.0.0",
37
+ "@types/ws": "^8.5.0",
38
+ "@vitest/coverage-v8": "^4.1.3",
39
+ "typescript": "^5.6.0",
40
+ "vitest": "^2.0.0"
41
+ }
42
+ }