@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.
- package/LICENSE +17 -0
- package/README.md +78 -0
- package/dist/auth.d.ts +287 -0
- package/dist/auth.js +1668 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +359 -0
- package/dist/client.js +3918 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.js +119 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto.d.ts +41 -0
- package/dist/crypto.js +85 -0
- package/dist/crypto.js.map +1 -0
- package/dist/discovery.d.ts +22 -0
- package/dist/discovery.js +110 -0
- package/dist/discovery.js.map +1 -0
- package/dist/e2ee-group.d.ts +192 -0
- package/dist/e2ee-group.js +1134 -0
- package/dist/e2ee-group.js.map +1 -0
- package/dist/e2ee.d.ts +120 -0
- package/dist/e2ee.js +890 -0
- package/dist/e2ee.js.map +1 -0
- package/dist/errors.d.ts +115 -0
- package/dist/errors.js +253 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +39 -0
- package/dist/events.js +82 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/keystore/aid-db.d.ts +79 -0
- package/dist/keystore/aid-db.js +621 -0
- package/dist/keystore/aid-db.js.map +1 -0
- package/dist/keystore/file.d.ts +82 -0
- package/dist/keystore/file.js +395 -0
- package/dist/keystore/file.js.map +1 -0
- package/dist/keystore/index.d.ts +88 -0
- package/dist/keystore/index.js +7 -0
- package/dist/keystore/index.js.map +1 -0
- package/dist/keystore/sqlite-backup.d.ts +40 -0
- package/dist/keystore/sqlite-backup.js +379 -0
- package/dist/keystore/sqlite-backup.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.js +53 -0
- package/dist/logger.js.map +1 -0
- package/dist/namespaces/auth.d.ts +49 -0
- package/dist/namespaces/auth.js +248 -0
- package/dist/namespaces/auth.js.map +1 -0
- package/dist/namespaces/custody.d.ts +47 -0
- package/dist/namespaces/custody.js +231 -0
- package/dist/namespaces/custody.js.map +1 -0
- package/dist/secret-store/file-store.d.ts +25 -0
- package/dist/secret-store/file-store.js +124 -0
- package/dist/secret-store/file-store.js.map +1 -0
- package/dist/secret-store/index.d.ts +28 -0
- package/dist/secret-store/index.js +19 -0
- package/dist/secret-store/index.js.map +1 -0
- package/dist/seq-tracker.d.ts +29 -0
- package/dist/seq-tracker.js +221 -0
- package/dist/seq-tracker.js.map +1 -0
- package/dist/transport.d.ts +60 -0
- package/dist/transport.js +355 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +170 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-AID SQLite 数据库。
|
|
3
|
+
*
|
|
4
|
+
* SQLite SDK 统一规则:
|
|
5
|
+
* - schema 与 Python / Go 完全一致
|
|
6
|
+
* - 敏感字段写入时一律字段级加密
|
|
7
|
+
* - 读取时兼容密文 JSON 与历史明文
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync } from 'node:fs';
|
|
10
|
+
import { createRequire } from 'node:module';
|
|
11
|
+
import { dirname, resolve } from 'node:path';
|
|
12
|
+
const SCHEMA_VERSION = 1;
|
|
13
|
+
const { DatabaseSync } = createRequire(import.meta.url)('node:sqlite');
|
|
14
|
+
const _dbPool = new Map();
|
|
15
|
+
function configureDatabase(db, busyTimeoutMs) {
|
|
16
|
+
db.exec(`PRAGMA busy_timeout = ${busyTimeoutMs}`);
|
|
17
|
+
const row = db.prepare('PRAGMA journal_mode = WAL').get();
|
|
18
|
+
if (String(row?.journal_mode ?? '').toLowerCase() !== 'wal') {
|
|
19
|
+
throw new Error(`SQLite WAL 模式启用失败: journal_mode=${String(row?.journal_mode ?? '')}`);
|
|
20
|
+
}
|
|
21
|
+
db.exec('PRAGMA synchronous = NORMAL');
|
|
22
|
+
}
|
|
23
|
+
function runImmediateTransaction(db, fn) {
|
|
24
|
+
db.exec('BEGIN IMMEDIATE');
|
|
25
|
+
try {
|
|
26
|
+
const result = fn();
|
|
27
|
+
db.exec('COMMIT');
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
try {
|
|
32
|
+
if (db.isTransaction)
|
|
33
|
+
db.exec('ROLLBACK');
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
/* ignore rollback failure */
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const DDL_STATEMENTS = [
|
|
42
|
+
`CREATE TABLE IF NOT EXISTS _schema_version (
|
|
43
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
44
|
+
version INTEGER NOT NULL
|
|
45
|
+
)`,
|
|
46
|
+
`CREATE TABLE IF NOT EXISTS tokens (
|
|
47
|
+
key TEXT PRIMARY KEY,
|
|
48
|
+
value TEXT NOT NULL,
|
|
49
|
+
updated_at INTEGER NOT NULL
|
|
50
|
+
)`,
|
|
51
|
+
`CREATE TABLE IF NOT EXISTS prekeys (
|
|
52
|
+
prekey_id TEXT NOT NULL,
|
|
53
|
+
device_id TEXT NOT NULL DEFAULT '',
|
|
54
|
+
private_key_enc TEXT NOT NULL DEFAULT '',
|
|
55
|
+
data TEXT NOT NULL DEFAULT '{}',
|
|
56
|
+
created_at INTEGER,
|
|
57
|
+
updated_at INTEGER NOT NULL,
|
|
58
|
+
expires_at INTEGER,
|
|
59
|
+
PRIMARY KEY (prekey_id, device_id)
|
|
60
|
+
)`,
|
|
61
|
+
`CREATE INDEX IF NOT EXISTS idx_prekeys_device ON prekeys (device_id, created_at)`,
|
|
62
|
+
`CREATE TABLE IF NOT EXISTS group_current (
|
|
63
|
+
group_id TEXT PRIMARY KEY,
|
|
64
|
+
epoch INTEGER NOT NULL,
|
|
65
|
+
secret_enc TEXT NOT NULL DEFAULT '',
|
|
66
|
+
data TEXT NOT NULL DEFAULT '{}',
|
|
67
|
+
updated_at INTEGER NOT NULL
|
|
68
|
+
)`,
|
|
69
|
+
`CREATE TABLE IF NOT EXISTS group_old_epochs (
|
|
70
|
+
group_id TEXT NOT NULL,
|
|
71
|
+
epoch INTEGER NOT NULL,
|
|
72
|
+
secret_enc TEXT NOT NULL DEFAULT '',
|
|
73
|
+
data TEXT NOT NULL DEFAULT '{}',
|
|
74
|
+
updated_at INTEGER NOT NULL,
|
|
75
|
+
expires_at INTEGER,
|
|
76
|
+
PRIMARY KEY (group_id, epoch)
|
|
77
|
+
)`,
|
|
78
|
+
`CREATE INDEX IF NOT EXISTS idx_group_old_expires ON group_old_epochs (group_id, expires_at)`,
|
|
79
|
+
`CREATE TABLE IF NOT EXISTS e2ee_sessions (
|
|
80
|
+
session_id TEXT PRIMARY KEY,
|
|
81
|
+
data_enc TEXT NOT NULL DEFAULT '{}',
|
|
82
|
+
updated_at INTEGER NOT NULL
|
|
83
|
+
)`,
|
|
84
|
+
`CREATE TABLE IF NOT EXISTS instance_state (
|
|
85
|
+
device_id TEXT NOT NULL,
|
|
86
|
+
slot_id TEXT NOT NULL DEFAULT '_singleton',
|
|
87
|
+
data TEXT NOT NULL DEFAULT '{}',
|
|
88
|
+
updated_at INTEGER NOT NULL,
|
|
89
|
+
PRIMARY KEY (device_id, slot_id)
|
|
90
|
+
)`,
|
|
91
|
+
`CREATE TABLE IF NOT EXISTS seq_tracker (
|
|
92
|
+
device_id TEXT NOT NULL,
|
|
93
|
+
slot_id TEXT NOT NULL DEFAULT '_singleton',
|
|
94
|
+
namespace TEXT NOT NULL,
|
|
95
|
+
contiguous_seq INTEGER NOT NULL DEFAULT 0,
|
|
96
|
+
updated_at INTEGER NOT NULL,
|
|
97
|
+
PRIMARY KEY (device_id, slot_id, namespace)
|
|
98
|
+
)`,
|
|
99
|
+
`CREATE TABLE IF NOT EXISTS metadata_kv (
|
|
100
|
+
key TEXT PRIMARY KEY,
|
|
101
|
+
value TEXT NOT NULL,
|
|
102
|
+
updated_at INTEGER NOT NULL
|
|
103
|
+
)`,
|
|
104
|
+
];
|
|
105
|
+
function jsonParseObject(value) {
|
|
106
|
+
try {
|
|
107
|
+
const parsed = JSON.parse(value);
|
|
108
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return {};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export class AIDDatabase {
|
|
115
|
+
_db;
|
|
116
|
+
_dbPath;
|
|
117
|
+
_secretStore;
|
|
118
|
+
_scope;
|
|
119
|
+
constructor(dbPath, secretStore, scope) {
|
|
120
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
121
|
+
const absPath = resolve(dbPath);
|
|
122
|
+
this._dbPath = absPath;
|
|
123
|
+
this._secretStore = secretStore ?? null;
|
|
124
|
+
this._scope = scope ?? dirname(absPath).split(/[\\/]/).pop() ?? '';
|
|
125
|
+
const cached = _dbPool.get(absPath);
|
|
126
|
+
if (cached) {
|
|
127
|
+
cached.refCount++;
|
|
128
|
+
this._db = cached.db;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this._db = new DatabaseSync(absPath, { timeout: 5000, readBigInts: false });
|
|
132
|
+
configureDatabase(this._db, 5000);
|
|
133
|
+
_dbPool.set(absPath, { db: this._db, refCount: 1 });
|
|
134
|
+
}
|
|
135
|
+
this._initSchema();
|
|
136
|
+
}
|
|
137
|
+
close() {
|
|
138
|
+
const cached = _dbPool.get(this._dbPath);
|
|
139
|
+
if (cached) {
|
|
140
|
+
cached.refCount--;
|
|
141
|
+
if (cached.refCount <= 0) {
|
|
142
|
+
_dbPool.delete(this._dbPath);
|
|
143
|
+
if (this._db.isOpen)
|
|
144
|
+
this._db.close();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
if (this._db.isOpen)
|
|
149
|
+
this._db.close();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
_initSchema() {
|
|
153
|
+
for (const ddl of DDL_STATEMENTS)
|
|
154
|
+
this._db.exec(ddl);
|
|
155
|
+
this._migrateLegacyColumns();
|
|
156
|
+
const row = this._db.prepare('SELECT version FROM _schema_version WHERE id = 1').get();
|
|
157
|
+
if (!row)
|
|
158
|
+
this._db.prepare('INSERT INTO _schema_version (id, version) VALUES (1, ?)').run(SCHEMA_VERSION);
|
|
159
|
+
}
|
|
160
|
+
_migrateLegacyColumns() {
|
|
161
|
+
this._renameColumnIfExists('prekeys', 'private_key_pem', 'private_key_enc');
|
|
162
|
+
this._renameColumnIfExists('group_current', 'secret', 'secret_enc');
|
|
163
|
+
this._renameColumnIfExists('group_old_epochs', 'secret', 'secret_enc');
|
|
164
|
+
this._renameColumnIfExists('e2ee_sessions', 'data', 'data_enc');
|
|
165
|
+
}
|
|
166
|
+
_renameColumnIfExists(table, oldName, newName) {
|
|
167
|
+
const rows = this._db.prepare(`PRAGMA table_info(${table})`).all();
|
|
168
|
+
const names = new Set(rows.map((row) => row.name));
|
|
169
|
+
if (names.has(oldName) && !names.has(newName)) {
|
|
170
|
+
this._db.exec(`ALTER TABLE ${table} RENAME COLUMN ${oldName} TO ${newName}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
_protectText(name, plaintext) {
|
|
174
|
+
if (!this._secretStore || !plaintext)
|
|
175
|
+
return plaintext;
|
|
176
|
+
try {
|
|
177
|
+
return JSON.stringify(this._secretStore.protect(this._scope, name, Buffer.from(plaintext, 'utf-8')));
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return plaintext;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
_revealText(name, stored) {
|
|
184
|
+
if (!this._secretStore || !stored)
|
|
185
|
+
return stored;
|
|
186
|
+
try {
|
|
187
|
+
const record = JSON.parse(stored);
|
|
188
|
+
if (record?.scheme !== 'file_aes')
|
|
189
|
+
return stored;
|
|
190
|
+
const plain = this._secretStore.reveal(this._scope, name, record);
|
|
191
|
+
return plain ? plain.toString('utf-8') : stored;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return stored;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
getToken(key) {
|
|
198
|
+
const row = this._db.prepare('SELECT value FROM tokens WHERE key = ?').get(key);
|
|
199
|
+
return row?.value ?? null;
|
|
200
|
+
}
|
|
201
|
+
setToken(key, value) {
|
|
202
|
+
this._db.prepare('INSERT INTO tokens (key, value, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value, updated_at=excluded.updated_at').run(key, value, Date.now());
|
|
203
|
+
}
|
|
204
|
+
deleteToken(key) {
|
|
205
|
+
this._db.prepare('DELETE FROM tokens WHERE key = ?').run(key);
|
|
206
|
+
}
|
|
207
|
+
getAllTokens() {
|
|
208
|
+
const rows = this._db.prepare('SELECT key, value FROM tokens').all();
|
|
209
|
+
const result = {};
|
|
210
|
+
for (const row of rows)
|
|
211
|
+
result[row.key] = row.value;
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
savePrekey(prekeyId, privateKeyPem, deviceId = '', createdAt, expiresAt, extraData) {
|
|
215
|
+
const now = Date.now();
|
|
216
|
+
this._db.prepare(`INSERT INTO prekeys (prekey_id, device_id, private_key_enc, data, created_at, updated_at, expires_at)
|
|
217
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
218
|
+
ON CONFLICT(prekey_id, device_id) DO UPDATE SET
|
|
219
|
+
private_key_enc=excluded.private_key_enc, data=excluded.data,
|
|
220
|
+
updated_at=excluded.updated_at, expires_at=excluded.expires_at`).run(prekeyId, deviceId, this._protectText(`prekey/${prekeyId}`, privateKeyPem), JSON.stringify(extraData ?? {}), createdAt ?? now, now, expiresAt ?? null);
|
|
221
|
+
}
|
|
222
|
+
loadPrekeys(deviceId = '') {
|
|
223
|
+
const rows = this._db.prepare('SELECT prekey_id, private_key_enc, data, created_at, updated_at, expires_at FROM prekeys WHERE device_id = ?').all(deviceId);
|
|
224
|
+
const result = {};
|
|
225
|
+
for (const row of rows) {
|
|
226
|
+
const entry = {
|
|
227
|
+
private_key_pem: this._revealText(`prekey/${row.prekey_id}`, row.private_key_enc),
|
|
228
|
+
};
|
|
229
|
+
if (row.created_at != null)
|
|
230
|
+
entry.created_at = row.created_at;
|
|
231
|
+
if (row.updated_at != null)
|
|
232
|
+
entry.updated_at = row.updated_at;
|
|
233
|
+
if (row.expires_at != null)
|
|
234
|
+
entry.expires_at = row.expires_at;
|
|
235
|
+
Object.assign(entry, jsonParseObject(row.data));
|
|
236
|
+
result[row.prekey_id] = entry;
|
|
237
|
+
}
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
240
|
+
deletePrekey(prekeyId, deviceId = '') {
|
|
241
|
+
this._db.prepare('DELETE FROM prekeys WHERE prekey_id = ? AND device_id = ?').run(prekeyId, deviceId);
|
|
242
|
+
}
|
|
243
|
+
cleanupPrekeys(deviceId, cutoffMs, keepLatest) {
|
|
244
|
+
const rows = this._db.prepare('SELECT prekey_id, created_at FROM prekeys WHERE device_id = ? ORDER BY created_at DESC').all(deviceId);
|
|
245
|
+
const latestIds = new Set(rows.slice(0, keepLatest).map((row) => row.prekey_id));
|
|
246
|
+
const toDelete = rows
|
|
247
|
+
.filter((row) => !latestIds.has(row.prekey_id) && row.created_at != null && row.created_at < cutoffMs)
|
|
248
|
+
.map((row) => row.prekey_id);
|
|
249
|
+
if (toDelete.length > 0) {
|
|
250
|
+
const del = this._db.prepare('DELETE FROM prekeys WHERE device_id = ? AND prekey_id = ?');
|
|
251
|
+
runImmediateTransaction(this._db, () => {
|
|
252
|
+
for (const id of toDelete)
|
|
253
|
+
del.run(deviceId, id);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return toDelete;
|
|
257
|
+
}
|
|
258
|
+
saveGroupCurrent(groupId, epoch, secret, data) {
|
|
259
|
+
this._db.prepare(`INSERT INTO group_current (group_id, epoch, secret_enc, data, updated_at)
|
|
260
|
+
VALUES (?, ?, ?, ?, ?)
|
|
261
|
+
ON CONFLICT(group_id) DO UPDATE SET epoch=excluded.epoch, secret_enc=excluded.secret_enc, data=excluded.data, updated_at=excluded.updated_at`).run(groupId, epoch, this._protectText(`group/${groupId}/current`, secret), JSON.stringify(data), Date.now());
|
|
262
|
+
}
|
|
263
|
+
loadGroupCurrent(groupId) {
|
|
264
|
+
const row = this._db.prepare('SELECT epoch, secret_enc, data, updated_at FROM group_current WHERE group_id = ?').get(groupId);
|
|
265
|
+
if (!row)
|
|
266
|
+
return null;
|
|
267
|
+
return {
|
|
268
|
+
group_id: groupId,
|
|
269
|
+
epoch: row.epoch,
|
|
270
|
+
secret: this._revealText(`group/${groupId}/current`, row.secret_enc),
|
|
271
|
+
...jsonParseObject(row.data),
|
|
272
|
+
updated_at: row.updated_at,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
loadGroupSecretEpoch(groupId, epoch) {
|
|
276
|
+
const current = this.loadGroupCurrent(groupId);
|
|
277
|
+
if (epoch === undefined || epoch === null)
|
|
278
|
+
return current;
|
|
279
|
+
if (current && Number(current.epoch ?? 0) === Number(epoch))
|
|
280
|
+
return current;
|
|
281
|
+
const row = this._db.prepare('SELECT epoch, secret_enc, data, updated_at, expires_at FROM group_old_epochs WHERE group_id = ? AND epoch = ?').get(groupId, epoch);
|
|
282
|
+
if (!row)
|
|
283
|
+
return null;
|
|
284
|
+
const entry = {
|
|
285
|
+
epoch: row.epoch,
|
|
286
|
+
secret: this._revealText(`group/${groupId}/epoch/${row.epoch}`, row.secret_enc),
|
|
287
|
+
...jsonParseObject(row.data),
|
|
288
|
+
updated_at: row.updated_at,
|
|
289
|
+
};
|
|
290
|
+
if (row.expires_at != null)
|
|
291
|
+
entry.expires_at = row.expires_at;
|
|
292
|
+
return entry;
|
|
293
|
+
}
|
|
294
|
+
loadGroupSecretEpochs(groupId) {
|
|
295
|
+
const result = [];
|
|
296
|
+
const current = this.loadGroupCurrent(groupId);
|
|
297
|
+
if (current)
|
|
298
|
+
result.push(current);
|
|
299
|
+
const rows = this._db.prepare('SELECT epoch, secret_enc, data, updated_at, expires_at FROM group_old_epochs WHERE group_id = ? ORDER BY epoch ASC').all(groupId);
|
|
300
|
+
for (const row of rows) {
|
|
301
|
+
const entry = {
|
|
302
|
+
epoch: row.epoch,
|
|
303
|
+
secret: this._revealText(`group/${groupId}/epoch/${row.epoch}`, row.secret_enc),
|
|
304
|
+
...jsonParseObject(row.data),
|
|
305
|
+
updated_at: row.updated_at,
|
|
306
|
+
};
|
|
307
|
+
if (row.expires_at != null)
|
|
308
|
+
entry.expires_at = row.expires_at;
|
|
309
|
+
result.push(entry);
|
|
310
|
+
}
|
|
311
|
+
return result;
|
|
312
|
+
}
|
|
313
|
+
loadAllGroupCurrent() {
|
|
314
|
+
const rows = this._db.prepare('SELECT group_id, epoch, secret_enc, data, updated_at FROM group_current').all();
|
|
315
|
+
const result = {};
|
|
316
|
+
for (const row of rows) {
|
|
317
|
+
result[row.group_id] = {
|
|
318
|
+
group_id: row.group_id,
|
|
319
|
+
epoch: row.epoch,
|
|
320
|
+
secret: this._revealText(`group/${row.group_id}/current`, row.secret_enc),
|
|
321
|
+
...jsonParseObject(row.data),
|
|
322
|
+
updated_at: row.updated_at,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
deleteGroupCurrent(groupId) {
|
|
328
|
+
this._db.prepare('DELETE FROM group_current WHERE group_id = ?').run(groupId);
|
|
329
|
+
}
|
|
330
|
+
saveGroupOldEpoch(groupId, epoch, secret, data, updatedAt, expiresAt) {
|
|
331
|
+
this._db.prepare(`INSERT INTO group_old_epochs (group_id, epoch, secret_enc, data, updated_at, expires_at)
|
|
332
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
333
|
+
ON CONFLICT(group_id, epoch) DO UPDATE SET secret_enc=excluded.secret_enc, data=excluded.data, updated_at=excluded.updated_at, expires_at=excluded.expires_at`).run(groupId, epoch, this._protectText(`group/${groupId}/epoch/${epoch}`, secret), JSON.stringify(data), updatedAt ?? Date.now(), expiresAt ?? null);
|
|
334
|
+
}
|
|
335
|
+
loadGroupOldEpochs(groupId) {
|
|
336
|
+
const rows = this._db.prepare('SELECT epoch, secret_enc, data, updated_at, expires_at FROM group_old_epochs WHERE group_id = ? ORDER BY epoch ASC').all(groupId);
|
|
337
|
+
return rows.map((row) => {
|
|
338
|
+
const entry = {
|
|
339
|
+
epoch: row.epoch,
|
|
340
|
+
secret: this._revealText(`group/${groupId}/epoch/${row.epoch}`, row.secret_enc),
|
|
341
|
+
...jsonParseObject(row.data),
|
|
342
|
+
updated_at: row.updated_at,
|
|
343
|
+
};
|
|
344
|
+
if (row.expires_at != null)
|
|
345
|
+
entry.expires_at = row.expires_at;
|
|
346
|
+
return entry;
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
deleteAllGroupOldEpochs(groupId) {
|
|
350
|
+
this._db.prepare('DELETE FROM group_old_epochs WHERE group_id = ?').run(groupId);
|
|
351
|
+
}
|
|
352
|
+
loadAllGroupIdsWithOldEpochs() {
|
|
353
|
+
const rows = this._db.prepare('SELECT DISTINCT group_id FROM group_old_epochs').all();
|
|
354
|
+
return rows.map((row) => row.group_id);
|
|
355
|
+
}
|
|
356
|
+
cleanupGroupOldEpochs(groupId, cutoffMs) {
|
|
357
|
+
const result = this._db.prepare('DELETE FROM group_old_epochs WHERE group_id = ? AND updated_at <= ?').run(groupId, cutoffMs);
|
|
358
|
+
return Number(result.changes);
|
|
359
|
+
}
|
|
360
|
+
storeGroupSecretTransition(groupId, opts) {
|
|
361
|
+
return Boolean(runImmediateTransaction(this._db, () => {
|
|
362
|
+
const now = Date.now();
|
|
363
|
+
const epoch = Number(opts.epoch);
|
|
364
|
+
const members = [...(opts.memberAids ?? [])].map((item) => String(item)).sort();
|
|
365
|
+
const pendingRotationId = String(opts.pendingRotationId ?? '').trim();
|
|
366
|
+
const current = this._db.prepare('SELECT epoch, secret_enc, data, updated_at FROM group_current WHERE group_id = ?').get(groupId);
|
|
367
|
+
if (current) {
|
|
368
|
+
const localEpoch = Number(current.epoch);
|
|
369
|
+
const currentSecret = this._revealText(`group/${groupId}/current`, current.secret_enc);
|
|
370
|
+
const currentData = jsonParseObject(current.data);
|
|
371
|
+
if (epoch < localEpoch)
|
|
372
|
+
return false;
|
|
373
|
+
if (epoch === localEpoch && currentSecret) {
|
|
374
|
+
if (currentSecret !== opts.secret) {
|
|
375
|
+
if (String(currentData.pending_rotation_id ?? '').trim()) {
|
|
376
|
+
this._upsertGroupCurrent(groupId, epoch, opts.secret, this._buildGroupCurrentData(opts, members, now), now);
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
const updated = { ...currentData };
|
|
382
|
+
let changed = false;
|
|
383
|
+
const oldMembers = Array.isArray(updated.member_aids) ? updated.member_aids.map(String).sort() : [];
|
|
384
|
+
if (members.length > 0 && JSON.stringify(oldMembers) !== JSON.stringify(members)) {
|
|
385
|
+
updated.member_aids = members;
|
|
386
|
+
updated.commitment = opts.commitment;
|
|
387
|
+
changed = true;
|
|
388
|
+
}
|
|
389
|
+
if (opts.epochChain !== undefined && updated.epoch_chain !== opts.epochChain) {
|
|
390
|
+
updated.epoch_chain = opts.epochChain;
|
|
391
|
+
changed = true;
|
|
392
|
+
}
|
|
393
|
+
if (opts.epochChainUnverified === true) {
|
|
394
|
+
if (updated.epoch_chain_unverified !== true) {
|
|
395
|
+
updated.epoch_chain_unverified = true;
|
|
396
|
+
changed = true;
|
|
397
|
+
}
|
|
398
|
+
if (opts.epochChainUnverifiedReason && updated.epoch_chain_unverified_reason !== opts.epochChainUnverifiedReason) {
|
|
399
|
+
updated.epoch_chain_unverified_reason = opts.epochChainUnverifiedReason;
|
|
400
|
+
changed = true;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
else if (opts.epochChainUnverified === false) {
|
|
404
|
+
if ('epoch_chain_unverified' in updated || 'epoch_chain_unverified_reason' in updated) {
|
|
405
|
+
delete updated.epoch_chain_unverified;
|
|
406
|
+
delete updated.epoch_chain_unverified_reason;
|
|
407
|
+
changed = true;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if (pendingRotationId && updated.pending_rotation_id !== pendingRotationId) {
|
|
411
|
+
updated.pending_rotation_id = pendingRotationId;
|
|
412
|
+
updated.pending_created_at = now;
|
|
413
|
+
changed = true;
|
|
414
|
+
}
|
|
415
|
+
if (!pendingRotationId && updated.pending_rotation_id) {
|
|
416
|
+
delete updated.pending_rotation_id;
|
|
417
|
+
delete updated.pending_created_at;
|
|
418
|
+
changed = true;
|
|
419
|
+
}
|
|
420
|
+
if (changed)
|
|
421
|
+
this._upsertGroupCurrent(groupId, epoch, currentSecret, updated, now);
|
|
422
|
+
return true;
|
|
423
|
+
}
|
|
424
|
+
if (localEpoch !== epoch) {
|
|
425
|
+
const expiresAt = Number(current.updated_at || now) + opts.oldEpochRetentionMs;
|
|
426
|
+
this._upsertGroupOldEpoch(groupId, localEpoch, currentSecret, currentData, Number(current.updated_at || now), expiresAt);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
this._upsertGroupCurrent(groupId, epoch, opts.secret, this._buildGroupCurrentData(opts, members, now), now);
|
|
430
|
+
return true;
|
|
431
|
+
}));
|
|
432
|
+
}
|
|
433
|
+
storeGroupSecretEpoch(groupId, opts) {
|
|
434
|
+
return Boolean(runImmediateTransaction(this._db, () => {
|
|
435
|
+
const now = Date.now();
|
|
436
|
+
const epoch = Number(opts.epoch);
|
|
437
|
+
const members = [...(opts.memberAids ?? [])].map((item) => String(item)).sort();
|
|
438
|
+
const pendingRotationId = String(opts.pendingRotationId ?? '').trim();
|
|
439
|
+
const data = this._buildGroupCurrentData(opts, members, now);
|
|
440
|
+
const current = this._db.prepare('SELECT epoch, secret_enc, data, updated_at FROM group_current WHERE group_id = ?').get(groupId);
|
|
441
|
+
if (!current) {
|
|
442
|
+
this._upsertGroupCurrent(groupId, epoch, opts.secret, data, now);
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
const localEpoch = Number(current.epoch);
|
|
446
|
+
if (epoch > localEpoch)
|
|
447
|
+
return false;
|
|
448
|
+
if (epoch === localEpoch) {
|
|
449
|
+
const currentSecret = this._revealText(`group/${groupId}/current`, current.secret_enc);
|
|
450
|
+
const currentData = jsonParseObject(current.data);
|
|
451
|
+
if (currentSecret && currentSecret !== opts.secret) {
|
|
452
|
+
if (!String(currentData.pending_rotation_id ?? '').trim())
|
|
453
|
+
return false;
|
|
454
|
+
this._upsertGroupCurrent(groupId, epoch, opts.secret, data, now);
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
const updated = { ...currentData };
|
|
458
|
+
let changed = false;
|
|
459
|
+
const oldMembers = Array.isArray(updated.member_aids) ? updated.member_aids.map(String).sort() : [];
|
|
460
|
+
if (members.length > 0 && JSON.stringify(oldMembers) !== JSON.stringify(members)) {
|
|
461
|
+
updated.member_aids = members;
|
|
462
|
+
updated.commitment = opts.commitment;
|
|
463
|
+
changed = true;
|
|
464
|
+
}
|
|
465
|
+
if (opts.epochChain !== undefined && updated.epoch_chain !== opts.epochChain) {
|
|
466
|
+
updated.epoch_chain = opts.epochChain;
|
|
467
|
+
changed = true;
|
|
468
|
+
}
|
|
469
|
+
if (opts.epochChainUnverified === true) {
|
|
470
|
+
if (updated.epoch_chain_unverified !== true) {
|
|
471
|
+
updated.epoch_chain_unverified = true;
|
|
472
|
+
changed = true;
|
|
473
|
+
}
|
|
474
|
+
if (opts.epochChainUnverifiedReason && updated.epoch_chain_unverified_reason !== opts.epochChainUnverifiedReason) {
|
|
475
|
+
updated.epoch_chain_unverified_reason = opts.epochChainUnverifiedReason;
|
|
476
|
+
changed = true;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
else if (opts.epochChainUnverified === false) {
|
|
480
|
+
if ('epoch_chain_unverified' in updated || 'epoch_chain_unverified_reason' in updated) {
|
|
481
|
+
delete updated.epoch_chain_unverified;
|
|
482
|
+
delete updated.epoch_chain_unverified_reason;
|
|
483
|
+
changed = true;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
if (pendingRotationId && updated.pending_rotation_id !== pendingRotationId) {
|
|
487
|
+
updated.pending_rotation_id = pendingRotationId;
|
|
488
|
+
updated.pending_created_at = now;
|
|
489
|
+
changed = true;
|
|
490
|
+
}
|
|
491
|
+
if (!pendingRotationId && updated.pending_rotation_id) {
|
|
492
|
+
delete updated.pending_rotation_id;
|
|
493
|
+
delete updated.pending_created_at;
|
|
494
|
+
changed = true;
|
|
495
|
+
}
|
|
496
|
+
if (changed)
|
|
497
|
+
this._upsertGroupCurrent(groupId, epoch, currentSecret, updated, now);
|
|
498
|
+
return true;
|
|
499
|
+
}
|
|
500
|
+
const old = this._db.prepare('SELECT secret_enc FROM group_old_epochs WHERE group_id = ? AND epoch = ?').get(groupId, epoch);
|
|
501
|
+
if (old) {
|
|
502
|
+
const oldSecret = this._revealText(`group/${groupId}/epoch/${epoch}`, old.secret_enc);
|
|
503
|
+
if (oldSecret && oldSecret !== opts.secret)
|
|
504
|
+
return false;
|
|
505
|
+
}
|
|
506
|
+
this._upsertGroupOldEpoch(groupId, epoch, opts.secret, data, now, now + opts.oldEpochRetentionMs);
|
|
507
|
+
return true;
|
|
508
|
+
}));
|
|
509
|
+
}
|
|
510
|
+
discardPendingGroupSecretState(groupId, epoch, rotationId) {
|
|
511
|
+
return Boolean(runImmediateTransaction(this._db, () => {
|
|
512
|
+
const rid = String(rotationId ?? '').trim();
|
|
513
|
+
if (!rid)
|
|
514
|
+
return false;
|
|
515
|
+
const current = this._db.prepare('SELECT epoch, data FROM group_current WHERE group_id = ?').get(groupId);
|
|
516
|
+
if (!current || Number(current.epoch) !== Number(epoch))
|
|
517
|
+
return false;
|
|
518
|
+
const data = jsonParseObject(current.data);
|
|
519
|
+
if (String(data.pending_rotation_id ?? '').trim() !== rid)
|
|
520
|
+
return false;
|
|
521
|
+
const old = this._db.prepare('SELECT epoch, secret_enc, data, updated_at, expires_at FROM group_old_epochs WHERE group_id = ? AND epoch < ? ORDER BY epoch DESC LIMIT 1').get(groupId, epoch);
|
|
522
|
+
if (!old) {
|
|
523
|
+
this._db.prepare('DELETE FROM group_current WHERE group_id = ?').run(groupId);
|
|
524
|
+
this._db.prepare('DELETE FROM group_old_epochs WHERE group_id = ?').run(groupId);
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
const secret = this._revealText(`group/${groupId}/epoch/${old.epoch}`, old.secret_enc);
|
|
528
|
+
this._upsertGroupCurrent(groupId, Number(old.epoch), secret, jsonParseObject(old.data), Date.now());
|
|
529
|
+
this._db.prepare('DELETE FROM group_old_epochs WHERE group_id = ? AND epoch = ?').run(groupId, old.epoch);
|
|
530
|
+
return true;
|
|
531
|
+
}));
|
|
532
|
+
}
|
|
533
|
+
_buildGroupCurrentData(opts, memberAids, now) {
|
|
534
|
+
const data = {
|
|
535
|
+
commitment: opts.commitment,
|
|
536
|
+
member_aids: memberAids,
|
|
537
|
+
};
|
|
538
|
+
if (opts.epochChain !== undefined)
|
|
539
|
+
data.epoch_chain = opts.epochChain;
|
|
540
|
+
const pendingRotationId = String(opts.pendingRotationId ?? '').trim();
|
|
541
|
+
if (pendingRotationId) {
|
|
542
|
+
data.pending_rotation_id = pendingRotationId;
|
|
543
|
+
data.pending_created_at = now;
|
|
544
|
+
}
|
|
545
|
+
if (opts.epochChainUnverified === true) {
|
|
546
|
+
data.epoch_chain_unverified = true;
|
|
547
|
+
if (opts.epochChainUnverifiedReason)
|
|
548
|
+
data.epoch_chain_unverified_reason = opts.epochChainUnverifiedReason;
|
|
549
|
+
}
|
|
550
|
+
return data;
|
|
551
|
+
}
|
|
552
|
+
_upsertGroupCurrent(groupId, epoch, secret, data, updatedAt) {
|
|
553
|
+
this._db.prepare(`INSERT INTO group_current (group_id, epoch, secret_enc, data, updated_at)
|
|
554
|
+
VALUES (?, ?, ?, ?, ?)
|
|
555
|
+
ON CONFLICT(group_id) DO UPDATE SET epoch=excluded.epoch, secret_enc=excluded.secret_enc, data=excluded.data, updated_at=excluded.updated_at`).run(groupId, epoch, this._protectText(`group/${groupId}/current`, secret), JSON.stringify(data), updatedAt);
|
|
556
|
+
}
|
|
557
|
+
_upsertGroupOldEpoch(groupId, epoch, secret, data, updatedAt, expiresAt) {
|
|
558
|
+
this._db.prepare(`INSERT INTO group_old_epochs (group_id, epoch, secret_enc, data, updated_at, expires_at)
|
|
559
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
560
|
+
ON CONFLICT(group_id, epoch) DO UPDATE SET secret_enc=excluded.secret_enc, data=excluded.data, updated_at=excluded.updated_at, expires_at=excluded.expires_at`).run(groupId, epoch, this._protectText(`group/${groupId}/epoch/${epoch}`, secret), JSON.stringify(data), updatedAt, expiresAt ?? null);
|
|
561
|
+
}
|
|
562
|
+
saveSession(sessionId, data) {
|
|
563
|
+
const dataJson = JSON.stringify(data);
|
|
564
|
+
this._db.prepare('INSERT INTO e2ee_sessions (session_id, data_enc, updated_at) VALUES (?, ?, ?) ON CONFLICT(session_id) DO UPDATE SET data_enc=excluded.data_enc, updated_at=excluded.updated_at').run(sessionId, this._protectText(`session/${sessionId}`, dataJson), Date.now());
|
|
565
|
+
}
|
|
566
|
+
loadAllSessions() {
|
|
567
|
+
const rows = this._db.prepare('SELECT session_id, data_enc, updated_at FROM e2ee_sessions').all();
|
|
568
|
+
return rows.map((row) => ({
|
|
569
|
+
...jsonParseObject(this._revealText(`session/${row.session_id}`, row.data_enc)),
|
|
570
|
+
session_id: row.session_id,
|
|
571
|
+
updated_at: row.updated_at,
|
|
572
|
+
}));
|
|
573
|
+
}
|
|
574
|
+
deleteSession(sessionId) {
|
|
575
|
+
this._db.prepare('DELETE FROM e2ee_sessions WHERE session_id = ?').run(sessionId);
|
|
576
|
+
}
|
|
577
|
+
saveInstanceState(deviceId, slotId, state) {
|
|
578
|
+
const slot = slotId || '_singleton';
|
|
579
|
+
this._db.prepare('INSERT INTO instance_state (device_id, slot_id, data, updated_at) VALUES (?, ?, ?, ?) ON CONFLICT(device_id, slot_id) DO UPDATE SET data=excluded.data, updated_at=excluded.updated_at').run(deviceId, slot, JSON.stringify(state), Date.now());
|
|
580
|
+
}
|
|
581
|
+
loadInstanceState(deviceId, slotId = '') {
|
|
582
|
+
const slot = slotId || '_singleton';
|
|
583
|
+
const row = this._db.prepare('SELECT data FROM instance_state WHERE device_id = ? AND slot_id = ?').get(deviceId, slot);
|
|
584
|
+
return row ? jsonParseObject(row.data) : null;
|
|
585
|
+
}
|
|
586
|
+
saveSeq(deviceId, slotId, namespace, contiguousSeq) {
|
|
587
|
+
const slot = slotId || '_singleton';
|
|
588
|
+
this._db.prepare('INSERT INTO seq_tracker (device_id, slot_id, namespace, contiguous_seq, updated_at) VALUES (?, ?, ?, ?, ?) ON CONFLICT(device_id, slot_id, namespace) DO UPDATE SET contiguous_seq=excluded.contiguous_seq, updated_at=excluded.updated_at').run(deviceId, slot, namespace, contiguousSeq, Date.now());
|
|
589
|
+
}
|
|
590
|
+
loadSeq(deviceId, slotId, namespace) {
|
|
591
|
+
const slot = slotId || '_singleton';
|
|
592
|
+
const row = this._db.prepare('SELECT contiguous_seq FROM seq_tracker WHERE device_id = ? AND slot_id = ? AND namespace = ?').get(deviceId, slot, namespace);
|
|
593
|
+
return row?.contiguous_seq ?? 0;
|
|
594
|
+
}
|
|
595
|
+
loadAllSeqs(deviceId, slotId) {
|
|
596
|
+
const slot = slotId || '_singleton';
|
|
597
|
+
const rows = this._db.prepare('SELECT namespace, contiguous_seq FROM seq_tracker WHERE device_id = ? AND slot_id = ?').all(deviceId, slot);
|
|
598
|
+
const result = {};
|
|
599
|
+
for (const row of rows)
|
|
600
|
+
result[row.namespace] = row.contiguous_seq;
|
|
601
|
+
return result;
|
|
602
|
+
}
|
|
603
|
+
getMetadata(key) {
|
|
604
|
+
const row = this._db.prepare('SELECT value FROM metadata_kv WHERE key = ?').get(key);
|
|
605
|
+
return row?.value ?? null;
|
|
606
|
+
}
|
|
607
|
+
setMetadata(key, value) {
|
|
608
|
+
this._db.prepare('INSERT INTO metadata_kv (key, value, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value, updated_at=excluded.updated_at').run(key, value, Date.now());
|
|
609
|
+
}
|
|
610
|
+
deleteMetadata(key) {
|
|
611
|
+
this._db.prepare('DELETE FROM metadata_kv WHERE key = ?').run(key);
|
|
612
|
+
}
|
|
613
|
+
getAllMetadata() {
|
|
614
|
+
const rows = this._db.prepare('SELECT key, value FROM metadata_kv').all();
|
|
615
|
+
const result = {};
|
|
616
|
+
for (const row of rows)
|
|
617
|
+
result[row.key] = row.value;
|
|
618
|
+
return result;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
//# sourceMappingURL=aid-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aid-db.js","sourceRoot":"","sources":["../../src/keystore/aid-db.ts"],"names":[],"mappings":"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"}
|