@agentunion/fastaun-browser 0.2.20 → 0.3.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.
Files changed (128) hide show
  1. package/CHANGELOG.md +66 -26
  2. package/README.md +0 -1
  3. package/_packed_docs/CHANGELOG.md +66 -26
  4. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +542 -0
  5. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1 -24
  6. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +419 -0
  7. package/_packed_docs/protocol/index.md +13 -3
  8. package/_packed_docs/python-sdk-v2-only-changelog.md +189 -0
  9. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +39 -16
  10. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +131 -39
  11. package/_packed_docs/sdk/09-message-rpc-manual.md +30 -67
  12. package/dist/auth.d.ts.map +1 -1
  13. package/dist/auth.js +25 -5
  14. package/dist/auth.js.map +1 -1
  15. package/dist/bundle.js +15042 -0
  16. package/dist/client.d.ts +179 -187
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +3148 -3993
  19. package/dist/client.js.map +1 -1
  20. package/dist/config.d.ts +0 -4
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +0 -4
  23. package/dist/config.js.map +1 -1
  24. package/dist/crypto.d.ts +8 -1
  25. package/dist/crypto.d.ts.map +1 -1
  26. package/dist/crypto.js +114 -1
  27. package/dist/crypto.js.map +1 -1
  28. package/dist/e2ee.d.ts +5 -210
  29. package/dist/e2ee.d.ts.map +1 -1
  30. package/dist/e2ee.js +4 -1379
  31. package/dist/e2ee.js.map +1 -1
  32. package/dist/index.d.ts +7 -3
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +5 -4
  35. package/dist/index.js.map +1 -1
  36. package/dist/namespaces/auth.d.ts +9 -0
  37. package/dist/namespaces/auth.d.ts.map +1 -1
  38. package/dist/namespaces/auth.js +248 -4
  39. package/dist/namespaces/auth.js.map +1 -1
  40. package/dist/protected-headers.d.ts +14 -0
  41. package/dist/protected-headers.d.ts.map +1 -0
  42. package/dist/protected-headers.js +47 -0
  43. package/dist/protected-headers.js.map +1 -0
  44. package/dist/seq-tracker.d.ts +7 -2
  45. package/dist/seq-tracker.d.ts.map +1 -1
  46. package/dist/seq-tracker.js +33 -13
  47. package/dist/seq-tracker.js.map +1 -1
  48. package/dist/transport.d.ts +9 -1
  49. package/dist/transport.d.ts.map +1 -1
  50. package/dist/transport.js +262 -10
  51. package/dist/transport.js.map +1 -1
  52. package/dist/v2/crypto/aead.d.ts +26 -0
  53. package/dist/v2/crypto/aead.d.ts.map +1 -0
  54. package/dist/v2/crypto/aead.js +63 -0
  55. package/dist/v2/crypto/aead.js.map +1 -0
  56. package/dist/v2/crypto/canonical.d.ts +21 -0
  57. package/dist/v2/crypto/canonical.d.ts.map +1 -0
  58. package/dist/v2/crypto/canonical.js +111 -0
  59. package/dist/v2/crypto/canonical.js.map +1 -0
  60. package/dist/v2/crypto/dh-path.d.ts +21 -0
  61. package/dist/v2/crypto/dh-path.d.ts.map +1 -0
  62. package/dist/v2/crypto/dh-path.js +50 -0
  63. package/dist/v2/crypto/dh-path.js.map +1 -0
  64. package/dist/v2/crypto/ecdh.d.ts +19 -0
  65. package/dist/v2/crypto/ecdh.d.ts.map +1 -0
  66. package/dist/v2/crypto/ecdh.js +101 -0
  67. package/dist/v2/crypto/ecdh.js.map +1 -0
  68. package/dist/v2/crypto/ecdsa.d.ts +16 -0
  69. package/dist/v2/crypto/ecdsa.d.ts.map +1 -0
  70. package/dist/v2/crypto/ecdsa.js +52 -0
  71. package/dist/v2/crypto/ecdsa.js.map +1 -0
  72. package/dist/v2/crypto/hkdf.d.ts +21 -0
  73. package/dist/v2/crypto/hkdf.d.ts.map +1 -0
  74. package/dist/v2/crypto/hkdf.js +32 -0
  75. package/dist/v2/crypto/hkdf.js.map +1 -0
  76. package/dist/v2/crypto/index.d.ts +9 -0
  77. package/dist/v2/crypto/index.d.ts.map +1 -0
  78. package/dist/v2/crypto/index.js +8 -0
  79. package/dist/v2/crypto/index.js.map +1 -0
  80. package/dist/v2/crypto/recipients.d.ts +43 -0
  81. package/dist/v2/crypto/recipients.d.ts.map +1 -0
  82. package/dist/v2/crypto/recipients.js +188 -0
  83. package/dist/v2/crypto/recipients.js.map +1 -0
  84. package/dist/v2/e2ee/decrypt.d.ts +13 -0
  85. package/dist/v2/e2ee/decrypt.d.ts.map +1 -0
  86. package/dist/v2/e2ee/decrypt.js +176 -0
  87. package/dist/v2/e2ee/decrypt.js.map +1 -0
  88. package/dist/v2/e2ee/encrypt-group.d.ts +14 -0
  89. package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -0
  90. package/dist/v2/e2ee/encrypt-group.js +196 -0
  91. package/dist/v2/e2ee/encrypt-group.js.map +1 -0
  92. package/dist/v2/e2ee/encrypt-p2p.d.ts +15 -0
  93. package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -0
  94. package/dist/v2/e2ee/encrypt-p2p.js +240 -0
  95. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -0
  96. package/dist/v2/e2ee/index.d.ts +9 -0
  97. package/dist/v2/e2ee/index.d.ts.map +1 -0
  98. package/dist/v2/e2ee/index.js +9 -0
  99. package/dist/v2/e2ee/index.js.map +1 -0
  100. package/dist/v2/e2ee/metadata-auth.d.ts +9 -0
  101. package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -0
  102. package/dist/v2/e2ee/metadata-auth.js +60 -0
  103. package/dist/v2/e2ee/metadata-auth.js.map +1 -0
  104. package/dist/v2/e2ee/types.d.ts +57 -0
  105. package/dist/v2/e2ee/types.d.ts.map +1 -0
  106. package/dist/v2/e2ee/types.js +7 -0
  107. package/dist/v2/e2ee/types.js.map +1 -0
  108. package/dist/v2/session/index.d.ts +4 -0
  109. package/dist/v2/session/index.d.ts.map +1 -0
  110. package/dist/v2/session/index.js +3 -0
  111. package/dist/v2/session/index.js.map +1 -0
  112. package/dist/v2/session/keystore.d.ts +57 -0
  113. package/dist/v2/session/keystore.d.ts.map +1 -0
  114. package/dist/v2/session/keystore.js +244 -0
  115. package/dist/v2/session/keystore.js.map +1 -0
  116. package/dist/v2/session/session.d.ts +121 -0
  117. package/dist/v2/session/session.d.ts.map +1 -0
  118. package/dist/v2/session/session.js +344 -0
  119. package/dist/v2/session/session.js.map +1 -0
  120. package/dist/v2/state/commitment.d.ts +10 -0
  121. package/dist/v2/state/commitment.d.ts.map +1 -0
  122. package/dist/v2/state/commitment.js +86 -0
  123. package/dist/v2/state/commitment.js.map +1 -0
  124. package/dist/v2/state/index.d.ts +2 -0
  125. package/dist/v2/state/index.d.ts.map +1 -0
  126. package/dist/v2/state/index.js +2 -0
  127. package/dist/v2/state/index.js.map +1 -0
  128. package/package.json +8 -5
@@ -0,0 +1,244 @@
1
+ /**
2
+ * AUN E2EE V2: 设备密钥存储(IndexedDB 持久化)
3
+ *
4
+ * 与 Python `aun_core.v2.keystore.V2KeyStore` 行为对齐:
5
+ * - 每个 `(device_id)` 持有一对 IK 与若干 SPK(按 spk_id 索引)
6
+ * - SPK 按 created_at 排序,支持 `loadCurrentSPK` / `listRecentSPKIds(n)`
7
+ *
8
+ * 浏览器目标:所有 IO 是 async(IndexedDB 事务)。
9
+ */
10
+ export const V2_DB_NAME = 'aun_v2';
11
+ export const V2_DB_VERSION = 1;
12
+ export const V2_STORE_NAME = 'v2_device_keys';
13
+ export const V2_INDEX_BY_DEVICE_TYPE_CREATED = 'by_device_type_created';
14
+ /**
15
+ * V2 设备密钥持久化存储。复合主键 [device_id, key_type, key_id]。
16
+ *
17
+ * 使用 IndexedDB;在浏览器内置 indexedDB 不可用时(如 jsdom)请提前安装
18
+ * `fake-indexeddb/auto` 作为 polyfill(见 `tests/setup.ts`)。
19
+ */
20
+ export class V2KeyStore {
21
+ db;
22
+ constructor(db) {
23
+ this.db = db;
24
+ }
25
+ /** 打开/创建 V2 keystore 数据库。 */
26
+ static async open(dbName = V2_DB_NAME) {
27
+ return new Promise((resolve, reject) => {
28
+ const req = indexedDB.open(dbName, V2_DB_VERSION);
29
+ req.onupgradeneeded = () => {
30
+ const db = req.result;
31
+ if (!db.objectStoreNames.contains(V2_STORE_NAME)) {
32
+ const store = db.createObjectStore(V2_STORE_NAME, {
33
+ keyPath: ['device_id', 'key_type', 'key_id'],
34
+ });
35
+ store.createIndex(V2_INDEX_BY_DEVICE_TYPE_CREATED, ['device_id', 'key_type', 'created_at']);
36
+ }
37
+ };
38
+ req.onsuccess = () => resolve(new V2KeyStore(req.result));
39
+ req.onerror = () => reject(req.error);
40
+ req.onblocked = () => reject(new Error('V2KeyStore.open: blocked'));
41
+ });
42
+ }
43
+ /** 关闭数据库连接(测试或释放资源时使用)。 */
44
+ close() {
45
+ this.db.close();
46
+ }
47
+ store(mode) {
48
+ return this.db.transaction(V2_STORE_NAME, mode).objectStore(V2_STORE_NAME);
49
+ }
50
+ // ---------- SPK ----------
51
+ async saveSPK(deviceId, spkId, priv, pubDer) {
52
+ const record = {
53
+ device_id: deviceId,
54
+ key_type: 'spk',
55
+ key_id: spkId,
56
+ private_key: priv,
57
+ public_key: pubDer,
58
+ created_at: Date.now(),
59
+ };
60
+ return new Promise((resolve, reject) => {
61
+ const req = this.store('readwrite').put(record);
62
+ req.onsuccess = () => resolve();
63
+ req.onerror = () => reject(req.error);
64
+ });
65
+ }
66
+ async loadSPK(deviceId, spkId) {
67
+ return new Promise((resolve, reject) => {
68
+ const req = this.store('readonly').get([deviceId, 'spk', spkId]);
69
+ req.onsuccess = () => {
70
+ const r = req.result;
71
+ // 用 new Uint8Array(...) 拷贝,规避 fake-indexeddb / 跨 realm 实例对象
72
+ resolve(r ? new Uint8Array(r.private_key) : null);
73
+ };
74
+ req.onerror = () => reject(req.error);
75
+ });
76
+ }
77
+ /** 取最新 SPK(按 created_at DESC LIMIT 1)。 */
78
+ async loadCurrentSPK(deviceId) {
79
+ return new Promise((resolve, reject) => {
80
+ const idx = this.store('readonly').index(V2_INDEX_BY_DEVICE_TYPE_CREATED);
81
+ const range = IDBKeyRange.bound([deviceId, 'spk', -Infinity], [deviceId, 'spk', Infinity]);
82
+ const req = idx.openCursor(range, 'prev');
83
+ req.onsuccess = () => {
84
+ const cursor = req.result;
85
+ if (!cursor) {
86
+ resolve(null);
87
+ return;
88
+ }
89
+ const r = cursor.value;
90
+ resolve({
91
+ spkId: r.key_id,
92
+ priv: new Uint8Array(r.private_key),
93
+ pubDer: new Uint8Array(r.public_key),
94
+ });
95
+ };
96
+ req.onerror = () => reject(req.error);
97
+ });
98
+ }
99
+ async deleteSPK(deviceId, spkId) {
100
+ return new Promise((resolve, reject) => {
101
+ const req = this.store('readwrite').delete([deviceId, 'spk', spkId]);
102
+ req.onsuccess = () => resolve();
103
+ req.onerror = () => reject(req.error);
104
+ });
105
+ }
106
+ /** 返回最近 N 代 SPK 的 spk_id(按 created_at DESC)。 */
107
+ async listRecentSPKIds(deviceId, n) {
108
+ if (n <= 0)
109
+ return [];
110
+ return new Promise((resolve, reject) => {
111
+ const idx = this.store('readonly').index(V2_INDEX_BY_DEVICE_TYPE_CREATED);
112
+ const range = IDBKeyRange.bound([deviceId, 'spk', -Infinity], [deviceId, 'spk', Infinity]);
113
+ const req = idx.openCursor(range, 'prev');
114
+ const out = [];
115
+ req.onsuccess = () => {
116
+ const cursor = req.result;
117
+ if (cursor && out.length < n) {
118
+ out.push(cursor.value.key_id);
119
+ cursor.continue();
120
+ }
121
+ else {
122
+ resolve(out);
123
+ }
124
+ };
125
+ req.onerror = () => reject(req.error);
126
+ });
127
+ }
128
+ async listExpiredSPKIds(deviceId, maxAgeMs) {
129
+ const cutoff = Date.now() - maxAgeMs;
130
+ return new Promise((resolve, reject) => {
131
+ const idx = this.store('readonly').index(V2_INDEX_BY_DEVICE_TYPE_CREATED);
132
+ const range = IDBKeyRange.bound([deviceId, 'spk', -Infinity], [deviceId, 'spk', cutoff], false, true);
133
+ const req = idx.openCursor(range);
134
+ const out = [];
135
+ req.onsuccess = () => {
136
+ const cursor = req.result;
137
+ if (cursor) {
138
+ out.push(cursor.value.key_id);
139
+ cursor.continue();
140
+ }
141
+ else {
142
+ resolve(out);
143
+ }
144
+ };
145
+ req.onerror = () => reject(req.error);
146
+ });
147
+ }
148
+ // ---------- Group SPK ----------
149
+ static _groupSpkKeyId(groupId, spkId) {
150
+ return `${groupId}\0${spkId}`;
151
+ }
152
+ async saveGroupSPK(deviceId, groupId, spkId, priv, pubDer) {
153
+ const record = {
154
+ device_id: deviceId,
155
+ key_type: 'group_spk',
156
+ key_id: V2KeyStore._groupSpkKeyId(groupId, spkId),
157
+ private_key: priv,
158
+ public_key: pubDer,
159
+ created_at: Date.now(),
160
+ };
161
+ return new Promise((resolve, reject) => {
162
+ const req = this.store('readwrite').put(record);
163
+ req.onsuccess = () => resolve();
164
+ req.onerror = () => reject(req.error);
165
+ });
166
+ }
167
+ async loadGroupSPK(deviceId, groupId, spkId) {
168
+ const keyId = V2KeyStore._groupSpkKeyId(groupId, spkId);
169
+ return new Promise((resolve, reject) => {
170
+ const req = this.store('readonly').get([deviceId, 'group_spk', keyId]);
171
+ req.onsuccess = () => {
172
+ const r = req.result;
173
+ resolve(r ? new Uint8Array(r.private_key) : null);
174
+ };
175
+ req.onerror = () => reject(req.error);
176
+ });
177
+ }
178
+ /** 取指定群最新 group SPK(按 created_at DESC,key_id 前缀匹配)。 */
179
+ async loadCurrentGroupSPK(deviceId, groupId) {
180
+ const prefix = `${groupId}\0`;
181
+ return new Promise((resolve, reject) => {
182
+ const idx = this.store('readonly').index(V2_INDEX_BY_DEVICE_TYPE_CREATED);
183
+ const range = IDBKeyRange.bound([deviceId, 'group_spk', -Infinity], [deviceId, 'group_spk', Infinity]);
184
+ const req = idx.openCursor(range, 'prev');
185
+ req.onsuccess = () => {
186
+ const cursor = req.result;
187
+ if (!cursor) {
188
+ resolve(null);
189
+ return;
190
+ }
191
+ const r = cursor.value;
192
+ if (r.key_id.startsWith(prefix)) {
193
+ const spkId = r.key_id.slice(prefix.length);
194
+ resolve({
195
+ spkId,
196
+ priv: new Uint8Array(r.private_key),
197
+ pubDer: new Uint8Array(r.public_key),
198
+ });
199
+ }
200
+ else {
201
+ // 继续遍历,找到匹配前缀的记录
202
+ cursor.continue();
203
+ }
204
+ };
205
+ req.onerror = () => reject(req.error);
206
+ });
207
+ }
208
+ // ---------- IK ----------
209
+ async saveIK(deviceId, priv, pubDer) {
210
+ const record = {
211
+ device_id: deviceId,
212
+ key_type: 'ik',
213
+ key_id: '',
214
+ private_key: priv,
215
+ public_key: pubDer,
216
+ created_at: Date.now(),
217
+ };
218
+ return new Promise((resolve, reject) => {
219
+ const req = this.store('readwrite').put(record);
220
+ req.onsuccess = () => resolve();
221
+ req.onerror = () => reject(req.error);
222
+ });
223
+ }
224
+ async loadIK(deviceId) {
225
+ return new Promise((resolve, reject) => {
226
+ const req = this.store('readonly').get([deviceId, 'ik', '']);
227
+ req.onsuccess = () => {
228
+ const r = req.result;
229
+ resolve(r ? { priv: new Uint8Array(r.private_key), pubDer: new Uint8Array(r.public_key) } : null);
230
+ };
231
+ req.onerror = () => reject(req.error);
232
+ });
233
+ }
234
+ // ---------- 测试用 ----------
235
+ /** 测试用:清空 store。 */
236
+ async _clear() {
237
+ return new Promise((resolve, reject) => {
238
+ const req = this.store('readwrite').clear();
239
+ req.onsuccess = () => resolve();
240
+ req.onerror = () => reject(req.error);
241
+ });
242
+ }
243
+ }
244
+ //# sourceMappingURL=keystore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../src/v2/session/keystore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * AUN E2EE V2 Session Manager(浏览器版,全 async)。
3
+ *
4
+ * 与 Python `aun_core.v2.session.V2Session` 行为对齐:
5
+ * - IK = AID 长期密钥(多设备共享 AID 身份),由构造函数注入,不独立生成
6
+ * - SPK 设备级 P-256 密钥对,IK 签名背书
7
+ * - SPK 销毁三重条件:
8
+ * contig_seq >= 该 SPK 引用的最大 seq
9
+ * && now - last_seen >= 7 小时
10
+ * && 不在最近 7 代保留窗口内
11
+ * - 对端 IK 公钥缓存 TTL 1 小时
12
+ * - SPK 注册:`callFn("message.v2.put_peer_pk", ...)`
13
+ *
14
+ * 浏览器目标:所有 store 调用均 `await`,签名走 noble(确定性 ECDSA)。
15
+ */
16
+ import { V2KeyStore } from './keystore';
17
+ /** 对端 IK 公钥缓存 TTL(毫秒)。 */
18
+ export declare const PEER_KEY_CACHE_TTL_MS: number;
19
+ /** SPK 销毁安全窗口(毫秒)。 */
20
+ export declare const DESTROY_DELAY_MS: number;
21
+ /** SPK 销毁时保留的最近代数。 */
22
+ export declare const RECENT_GENERATIONS = 7;
23
+ /** SPK 180 天硬上限。 */
24
+ export declare const HARD_LIMIT_MS: number;
25
+ /** 服务端 RPC 调用函数签名(与 Python `call_fn` 等价)。 */
26
+ export type CallFn = (method: string, params: Record<string, unknown>) => Promise<Record<string, unknown> | unknown>;
27
+ /** 加密所需的发送方身份。 */
28
+ export interface SenderIdentity {
29
+ aid: string;
30
+ deviceId: string;
31
+ ikPriv: Uint8Array;
32
+ ikPubDer: Uint8Array;
33
+ }
34
+ /** 解密所需的私钥。 */
35
+ export interface DecryptKeys {
36
+ ikPriv: Uint8Array;
37
+ spkPriv?: Uint8Array;
38
+ }
39
+ export declare class V2Session {
40
+ private readonly _store;
41
+ private readonly _deviceId;
42
+ private readonly _aid;
43
+ private readonly _ikPriv;
44
+ private readonly _ikPubDer;
45
+ private _spkId;
46
+ private _spkPriv?;
47
+ private _spkPubDer?;
48
+ private _registered;
49
+ private _lastUploadedSPKId;
50
+ private _lastUploadedGroupSPKIds;
51
+ private _peerIKCache;
52
+ private _verifiedSPKs;
53
+ private _oldSPKMaxSeq;
54
+ private _nowFn;
55
+ constructor(store: V2KeyStore, deviceId: string, aid: string, ikPriv: Uint8Array, ikPubDer: Uint8Array);
56
+ /** 测试用:注入虚拟时钟。 */
57
+ _setNowFn(fn: () => number): void;
58
+ get deviceId(): string;
59
+ get aid(): string;
60
+ get currentSpkId(): string;
61
+ get currentIkPubDer(): Uint8Array;
62
+ /** 暴露 store 以便测试(与 Python 同等私有约定)。 */
63
+ get _storeForTest(): V2KeyStore;
64
+ /** 加载或生成当前 SPK;IK 由构造函数注入,无需加载。 */
65
+ ensureKeys(): Promise<void>;
66
+ private _generateNewSPK;
67
+ /** SPK 由 AID 私钥(IK)签名背书并上报到 message.v2.put_peer_pk。 */
68
+ private _registerSPK;
69
+ /** 注册本设备 SPK 到服务端。IK = AID 长期密钥,无需注册。幂等。 */
70
+ ensureRegistered(callFn: CallFn): Promise<void>;
71
+ /** 返回加密所需的 sender 结构。 */
72
+ getSenderIdentity(): Promise<SenderIdentity>;
73
+ /**
74
+ * 返回解密所需的私钥。
75
+ * - spkId 空:1DH(仅 IK)
76
+ * - spkId == 当前 SPK:当前 spkPriv
77
+ * - 否则:从 store 加载旧 SPK 私钥(可能 undefined = 已销毁)
78
+ */
79
+ getDecryptKeys(spkId: string | null | undefined): Promise<DecryptKeys>;
80
+ /** 判断 spkId 是否命中当前活跃 SPK。 */
81
+ isCurrentSPK(spkId: string | null | undefined): boolean;
82
+ /** 跟踪每个旧 SPK 引用的最大 seq(用于销毁判定)。 */
83
+ trackOldSPKMaxSeq(spkId: string, seq: number): void;
84
+ /**
85
+ * contig_seq 已覆盖、超过 7 天安全窗口、且不在最近 7 代保留窗口内时销毁。
86
+ *
87
+ * 销毁条件(全部满足才销毁):
88
+ * - contig_seq >= 该 SPK 引用的最大 seq
89
+ * - 自最后一次见到该 spk_id 引用 >= 7 天
90
+ * - 不在最近 7 代 SPK 保留窗口内
91
+ */
92
+ maybeDestroyOldSPKs(contigSeq: number): Promise<string[]>;
93
+ /** 轮换 SPK:生成新 SPK 并上报到服务端。旧 SPK 保留本地用于解密。 */
94
+ rotateSPK(callFn: CallFn): Promise<void>;
95
+ /** 判断 spkId 是否为本进程最后一次成功上传的 P2P SPK。 */
96
+ isLastUploadedSPK(spkId: string | null | undefined): boolean;
97
+ /** 判断 spkId 是否为本进程在该群最后一次成功上传的 group SPK。 */
98
+ isLastUploadedGroupSPK(groupId: string, spkId: string | null | undefined): boolean;
99
+ /** 确保指定群有独立 group SPK,返回 { spkId, priv, pubDer }。 */
100
+ ensureGroupSPK(groupId: string): Promise<{
101
+ spkId: string;
102
+ priv: Uint8Array;
103
+ pubDer: Uint8Array;
104
+ }>;
105
+ /** 注册指定群的 group SPK。group 服务负责成员鉴权。 */
106
+ ensureGroupRegistered(groupId: string, callFn: CallFn): Promise<void>;
107
+ /** 轮换指定群的 group SPK,保留旧私钥用于缓存窗口内的历史 wrap 解密。 */
108
+ rotateGroupSPK(groupId: string, callFn: CallFn): Promise<{
109
+ spkId: string;
110
+ priv: Uint8Array;
111
+ pubDer: Uint8Array;
112
+ }>;
113
+ /** 群消息解密优先查 group SPK;找不到时 fallback 旧 P2P SPK 兼容历史消息。 */
114
+ getGroupDecryptKeys(groupId: string, spkId: string | null | undefined): Promise<DecryptKeys>;
115
+ private _publishGroupSPK;
116
+ cachePeerIK(peerAid: string, deviceId: string, ikPubDer: Uint8Array): void;
117
+ getPeerIK(peerAid: string, deviceId: string): Uint8Array | null;
118
+ isPeerSPKVerified(peerAid: string, deviceId: string, spkId: string): boolean;
119
+ markPeerSPKVerified(peerAid: string, deviceId: string, spkId: string): void;
120
+ }
121
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/v2/session/session.ts"],"names":[],"mappings":"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"}