@vex-chat/libvex 1.0.0-rc.2 → 1.0.2

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 (58) hide show
  1. package/dist/Client.d.ts +13 -9
  2. package/dist/Client.js +131 -74
  3. package/dist/Client.js.map +1 -1
  4. package/dist/IStorage.d.ts +1 -1
  5. package/dist/IStorage.js +1 -1
  6. package/dist/IStorage.js.map +1 -1
  7. package/dist/__tests__/harness/memory-storage.d.ts +45 -0
  8. package/dist/__tests__/harness/memory-storage.js +181 -0
  9. package/dist/__tests__/harness/memory-storage.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/keystore/memory.d.ts +11 -0
  12. package/dist/keystore/memory.js +18 -0
  13. package/dist/keystore/memory.js.map +1 -0
  14. package/dist/keystore/node.d.ts +10 -0
  15. package/dist/keystore/node.js +64 -0
  16. package/dist/keystore/node.js.map +1 -0
  17. package/dist/keystore/types.d.ts +4 -0
  18. package/dist/keystore/types.js +2 -0
  19. package/dist/keystore/types.js.map +1 -0
  20. package/dist/preset/expo.d.ts +2 -0
  21. package/dist/preset/expo.js +37 -0
  22. package/dist/preset/expo.js.map +1 -0
  23. package/dist/preset/node.d.ts +12 -0
  24. package/dist/preset/node.js +16 -0
  25. package/dist/preset/node.js.map +1 -0
  26. package/dist/preset/tauri.d.ts +2 -0
  27. package/dist/preset/tauri.js +35 -0
  28. package/dist/preset/tauri.js.map +1 -0
  29. package/dist/preset/test.d.ts +10 -0
  30. package/dist/preset/test.js +28 -0
  31. package/dist/preset/test.js.map +1 -0
  32. package/dist/preset/types.d.ts +13 -0
  33. package/dist/preset/types.js +2 -0
  34. package/dist/preset/types.js.map +1 -0
  35. package/dist/storage/expo.d.ts +3 -0
  36. package/dist/storage/expo.js +18 -0
  37. package/dist/storage/expo.js.map +1 -0
  38. package/dist/storage/node.d.ts +3 -0
  39. package/dist/storage/node.js +24 -0
  40. package/dist/storage/node.js.map +1 -0
  41. package/dist/storage/schema.d.ts +79 -0
  42. package/dist/storage/schema.js +2 -0
  43. package/dist/storage/schema.js.map +1 -0
  44. package/dist/{Storage.d.ts → storage/sqlite.d.ts} +19 -21
  45. package/dist/storage/sqlite.js +487 -0
  46. package/dist/storage/sqlite.js.map +1 -0
  47. package/dist/storage/tauri.d.ts +3 -0
  48. package/dist/storage/tauri.js +21 -0
  49. package/dist/storage/tauri.js.map +1 -0
  50. package/dist/transport/browser.d.ts +17 -0
  51. package/dist/transport/browser.js +56 -0
  52. package/dist/transport/browser.js.map +1 -0
  53. package/dist/transport/types.d.ts +20 -0
  54. package/dist/transport/types.js +2 -0
  55. package/dist/transport/types.js.map +1 -0
  56. package/package.json +102 -14
  57. package/dist/Storage.js +0 -444
  58. package/dist/Storage.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vex-chat/libvex",
3
- "version": "1.0.0-rc.2",
3
+ "version": "1.0.2",
4
4
  "description": "Library for communicating with xchat server.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -10,6 +10,50 @@
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
12
  "import": "./dist/index.js"
13
+ },
14
+ "./preset/node": {
15
+ "types": "./dist/preset/node.d.ts",
16
+ "import": "./dist/preset/node.js"
17
+ },
18
+ "./preset/tauri": {
19
+ "types": "./dist/preset/tauri.d.ts",
20
+ "import": "./dist/preset/tauri.js"
21
+ },
22
+ "./preset/expo": {
23
+ "types": "./dist/preset/expo.d.ts",
24
+ "import": "./dist/preset/expo.js"
25
+ },
26
+ "./preset/test": {
27
+ "types": "./dist/preset/test.d.ts",
28
+ "import": "./dist/preset/test.js"
29
+ },
30
+ "./storage/node": {
31
+ "types": "./dist/storage/node.d.ts",
32
+ "import": "./dist/storage/node.js"
33
+ },
34
+ "./storage/tauri": {
35
+ "types": "./dist/storage/tauri.d.ts",
36
+ "import": "./dist/storage/tauri.js"
37
+ },
38
+ "./storage/expo": {
39
+ "types": "./dist/storage/expo.d.ts",
40
+ "import": "./dist/storage/expo.js"
41
+ },
42
+ "./storage/sqlite": {
43
+ "types": "./dist/storage/sqlite.d.ts",
44
+ "import": "./dist/storage/sqlite.js"
45
+ },
46
+ "./storage/schema": {
47
+ "types": "./dist/storage/schema.d.ts",
48
+ "import": "./dist/storage/schema.js"
49
+ },
50
+ "./keystore/node": {
51
+ "types": "./dist/keystore/node.d.ts",
52
+ "import": "./dist/keystore/node.js"
53
+ },
54
+ "./keystore/memory": {
55
+ "types": "./dist/keystore/memory.d.ts",
56
+ "import": "./dist/keystore/memory.js"
13
57
  }
14
58
  },
15
59
  "files": [
@@ -22,16 +66,22 @@
22
66
  },
23
67
  "scripts": {
24
68
  "build": "rimraf dist && tsc",
25
- "format": "prettier '**/*.{ts,tsx,json,md}' --tab-width 4 --ignore-path .gitignore --write",
69
+ "format": "prettier --write .",
70
+ "format:check": "prettier --check .",
71
+ "lint": "eslint src/",
72
+ "lint:fix": "eslint src/ --fix",
73
+ "prepare": "husky",
26
74
  "prepack": "npm run build",
27
75
  "docs": "npx typedoc --options typedoc.json",
28
- "test": "vitest run"
29
- },
30
- "peerDependencies": {
31
- "@vex-chat/crypto": "1.1.0-rc.1",
32
- "@vex-chat/types": "1.0.0-rc.1"
76
+ "test": "vitest run",
77
+ "test:node": "vitest run -c vitest.config.node.ts",
78
+ "test:browser": "vitest run -c vitest.config.browser.ts",
79
+ "test:rn": "vitest run -c vitest.config.rn.ts",
80
+ "test:platforms": "vitest run -c vitest.config.node.ts && vitest run -c vitest.config.browser.ts && vitest run -c vitest.config.rn.ts"
33
81
  },
34
82
  "devDependencies": {
83
+ "@tauri-apps/plugin-sql": "^2.4.0",
84
+ "@types/better-sqlite3": "^7.6.13",
35
85
  "@types/browser-or-node": "^1.3.0",
36
86
  "@types/btoa": "^1.2.3",
37
87
  "@types/ed2curve": "^0.2.4",
@@ -39,9 +89,16 @@
39
89
  "@types/object-hash": "^1.3.4",
40
90
  "@types/uuid": "^8.3.0",
41
91
  "@types/ws": "^8.5.10",
42
- "@vex-chat/crypto": "1.1.0-rc.1",
43
- "@vex-chat/types": "1.0.0-rc.1",
92
+ "@typescript-eslint/eslint-plugin": "^8.57.1",
93
+ "@typescript-eslint/parser": "^8.57.1",
94
+ "better-sqlite3": "^11.0.0",
44
95
  "dotenv": "^8.2.0",
96
+ "eslint": "^10.1.0",
97
+ "eslint-config-prettier": "^9.0.0",
98
+ "expo-sqlite": "^14.0.6",
99
+ "husky": "^9.1.7",
100
+ "kysely-dialect-tauri": "^1.2.1",
101
+ "lint-staged": "^16.3.2",
45
102
  "prettier": "^3.2.0",
46
103
  "rimraf": "^6.1.3",
47
104
  "typedoc": "^0.28.0",
@@ -53,20 +110,45 @@
53
110
  },
54
111
  "dependencies": {
55
112
  "@extrahash/sleep": "^1.0.0",
56
- "msgpackr": "1.11.8",
113
+ "@vex-chat/crypto": "^1.1.1",
114
+ "@vex-chat/types": "^1.0.1",
57
115
  "axios": "^1.7.0",
58
116
  "browser-or-node": "^1.3.0",
59
- "btoa": "^1.2.1",
60
- "chalk": "^4.1.0",
61
- "knex": "^3.1.0",
117
+ "eventemitter3": "^5.0.4",
118
+ "kysely": "^0.28.15",
119
+ "msgpackr": "1.11.8",
62
120
  "object-hash": "^2.1.1",
63
121
  "parse-duration": "^2.0.0",
64
- "better-sqlite3": "^11.0.0",
122
+ "picocolors": "^1.1.1",
65
123
  "tweetnacl": "^1.0.3",
66
124
  "uuid": "^8.3.1",
67
125
  "winston": "^3.3.3",
68
126
  "ws": "^8.17.0"
69
127
  },
128
+ "peerDependencies": {
129
+ "@tauri-apps/plugin-sql": ">=2.0.0",
130
+ "better-sqlite3": ">=11.0.0",
131
+ "expo-sqlite": ">=14.0.0",
132
+ "kysely-dialect-tauri": ">=1.2.0",
133
+ "kysely-expo": ">=5.0.0"
134
+ },
135
+ "peerDependenciesMeta": {
136
+ "@tauri-apps/plugin-sql": {
137
+ "optional": true
138
+ },
139
+ "better-sqlite3": {
140
+ "optional": true
141
+ },
142
+ "expo-sqlite": {
143
+ "optional": true
144
+ },
145
+ "kysely-dialect-tauri": {
146
+ "optional": true
147
+ },
148
+ "kysely-expo": {
149
+ "optional": true
150
+ }
151
+ },
70
152
  "directories": {
71
153
  "doc": "docs"
72
154
  },
@@ -81,5 +163,11 @@
81
163
  "publishConfig": {
82
164
  "access": "public",
83
165
  "registry": "https://registry.npmjs.org/"
166
+ },
167
+ "lint-staged": {
168
+ "*.ts": [
169
+ "eslint --fix",
170
+ "prettier --write"
171
+ ]
84
172
  }
85
173
  }
package/dist/Storage.js DELETED
@@ -1,444 +0,0 @@
1
- import { sleep } from "@extrahash/sleep";
2
- import { XKeyConvert, XUtils } from "@vex-chat/crypto";
3
- import { EventEmitter } from "events";
4
- import knex, {} from "knex";
5
- import parseDuration from "parse-duration";
6
- import nacl from "tweetnacl";
7
- import winston from "winston";
8
- import { createLogger } from "./utils/createLogger.js";
9
- import { sqlSessionToCrypto } from "./utils/sqlSessionToCrypto.js";
10
- /**
11
- * The default IStorage() implementation, using knex and sqlite3 driver
12
- *
13
- * @hidden
14
- */
15
- export class Storage extends EventEmitter {
16
- ready = false;
17
- closing = false;
18
- dbPath;
19
- db;
20
- log;
21
- idKeys;
22
- saveHistory;
23
- constructor(dbPath, SK, options) {
24
- super();
25
- this.log = createLogger("db", options?.dbLogLevel || options?.logLevel);
26
- const idKeys = XKeyConvert.convertKeyPair(nacl.sign.keyPair.fromSecretKey(XUtils.decodeHex(SK)));
27
- if (!idKeys) {
28
- throw new Error("Can't convert SK!");
29
- }
30
- this.saveHistory = options?.saveHistory || true;
31
- this.idKeys = idKeys;
32
- this.dbPath = dbPath;
33
- this.log.info("Opening database file at " + this.dbPath);
34
- this.db = knex({
35
- client: "better-sqlite3",
36
- connection: {
37
- filename: this.dbPath,
38
- },
39
- useNullAsDefault: true,
40
- });
41
- this.init();
42
- }
43
- async close() {
44
- this.closing = true;
45
- this.log.info("Closing database.");
46
- await this.db.destroy();
47
- }
48
- async saveMessage(message) {
49
- if (!this.saveHistory) {
50
- return;
51
- }
52
- if (this.closing) {
53
- this.log.warn("Database is closing, saveMessage() will not complete.");
54
- return;
55
- }
56
- const copy = { ...message };
57
- // encrypt plaintext with our idkey before it gets saved to disk
58
- copy.message = XUtils.encodeHex(nacl.secretbox(XUtils.decodeUTF8(message.message), XUtils.decodeHex(message.nonce), this.idKeys.secretKey));
59
- try {
60
- await this.db("messages").insert(copy);
61
- }
62
- catch (err) {
63
- if (err.errno !== 19) {
64
- throw err;
65
- }
66
- this.log.warn("Attempted to insert duplicate nonce into message table.");
67
- }
68
- }
69
- async deleteMessage(mailID) {
70
- if (this.closing) {
71
- this.log.warn("Database is closing, saveMessage() will not complete.");
72
- return;
73
- }
74
- await this.db.from("messages").where({ mailID }).del();
75
- }
76
- async markSessionVerified(sessionID, status = true) {
77
- if (this.closing) {
78
- this.log.warn("Database is closing, markSessionVerified() will not complete.");
79
- return;
80
- }
81
- await this.db("sessions")
82
- .where({ sessionID })
83
- .update({ verified: status });
84
- }
85
- async getMessageHistory(userID) {
86
- if (this.closing) {
87
- this.log.warn("Database is closing, getMessageHistory() will not complete.");
88
- return [];
89
- }
90
- const messages = await this.db("messages")
91
- .select()
92
- .where({ direction: "incoming", authorID: userID, group: null })
93
- .orWhere({ direction: "outgoing", readerID: userID, group: null })
94
- .orderBy("timestamp", "desc");
95
- const fixedMessages = messages.reverse().map((message) => {
96
- // some cleanup because of how knex serializes the data
97
- message.timestamp = new Date(message.timestamp);
98
- // decrypt
99
- message.decrypted = Boolean(message.decrypted);
100
- if (message.decrypted) {
101
- const localDecrypt = nacl.secretbox.open(XUtils.decodeHex(message.message), XUtils.decodeHex(message.nonce), this.idKeys.secretKey);
102
- if (localDecrypt) {
103
- message.message = XUtils.encodeUTF8(localDecrypt);
104
- }
105
- else {
106
- throw new Error("Couldn't decrypt messages on disk!");
107
- }
108
- }
109
- return message;
110
- });
111
- this.log.debug("getMessageHistory() => " + JSON.stringify(fixedMessages, null, 4));
112
- return fixedMessages;
113
- }
114
- async getGroupHistory(channelID) {
115
- if (this.closing) {
116
- this.log.warn("Database is closing, getGroupHistory() will not complete.");
117
- return [];
118
- }
119
- const messages = await this.db("messages")
120
- .select()
121
- .where({ group: channelID })
122
- .orderBy("timestamp", "desc");
123
- const fixedMessages = messages.reverse().map((message) => {
124
- // some cleanup because of how knex serializes the data
125
- message.timestamp = new Date(message.timestamp);
126
- // decrypt
127
- message.decrypted = Boolean(message.decrypted);
128
- if (message.decrypted) {
129
- const localDecrypt = nacl.secretbox.open(XUtils.decodeHex(message.message), XUtils.decodeHex(message.nonce), this.idKeys.secretKey);
130
- if (localDecrypt) {
131
- message.message = XUtils.encodeUTF8(localDecrypt);
132
- }
133
- else {
134
- throw new Error("Couldn't decrypt messages on disk!");
135
- }
136
- }
137
- return message;
138
- });
139
- this.log.debug("getGroupHistory() => " + JSON.stringify(fixedMessages, null, 4));
140
- return fixedMessages;
141
- }
142
- async savePreKeys(preKeys, oneTime) {
143
- const addedIndexes = [];
144
- await this.untilReady();
145
- if (this.closing) {
146
- this.log.warn("Database is closing, savePreKeys() will not complete.");
147
- return [];
148
- }
149
- for (const preKey of preKeys) {
150
- const index = await this.db(oneTime ? "oneTimeKeys" : "preKeys").insert({
151
- privateKey: XUtils.encodeHex(preKey.keyPair.secretKey),
152
- publicKey: XUtils.encodeHex(preKey.keyPair.publicKey),
153
- signature: XUtils.encodeHex(preKey.signature),
154
- });
155
- addedIndexes.push(index[0]);
156
- }
157
- const addedKeys = (await this.db
158
- .from(oneTime ? "oneTimeKeys" : "preKeys")
159
- .select()
160
- .whereIn("index", addedIndexes)).map((key) => {
161
- delete key.privateKey;
162
- return key;
163
- });
164
- this.log.silly("savePreKeys() => " + JSON.stringify(addedKeys, null, 4));
165
- return addedKeys;
166
- }
167
- async getSessionByPublicKey(publicKey) {
168
- if (this.closing) {
169
- this.log.warn("Database is closing, getGroupHistory() will not complete.");
170
- return null;
171
- }
172
- const str = XUtils.encodeHex(publicKey);
173
- const rows = await this.db
174
- .from("sessions")
175
- .select()
176
- .where({ publicKey: str })
177
- .limit(1);
178
- if (rows.length === 0) {
179
- this.log.warn(`getSessionByPublicKey(${XUtils.encodeHex(publicKey)}) => ` +
180
- JSON.stringify(null, null, 4));
181
- return null;
182
- }
183
- const [session] = rows;
184
- const wsSession = sqlSessionToCrypto(session);
185
- this.log.debug("getSessionByPublicKey() => " + JSON.stringify(wsSession, null, 4));
186
- return wsSession;
187
- }
188
- async markSessionUsed(sessionID) {
189
- if (this.closing) {
190
- this.log.warn("Database is closing, markSessionUsed() will not complete.");
191
- return;
192
- }
193
- await this.db
194
- .from("sessions")
195
- .update({ lastUsed: new Date(Date.now()) })
196
- .where({ sessionID });
197
- }
198
- async getAllSessions() {
199
- if (this.closing) {
200
- this.log.warn("Database is closing, getAllSessions() will not complete.");
201
- return [];
202
- }
203
- const rows = await this.db
204
- .from("sessions")
205
- .select()
206
- .orderBy("lastUsed", "desc");
207
- const fixedRows = rows.map((session) => {
208
- session.verified = Boolean(session.verified);
209
- return session;
210
- });
211
- this.log.debug("getAllSessions() => " + JSON.stringify(fixedRows, null, 4));
212
- return fixedRows;
213
- }
214
- async getSessionByDeviceID(deviceID) {
215
- if (this.closing) {
216
- this.log.warn("Database is closing, getSessionByUserID() will not complete.");
217
- return null;
218
- }
219
- const rows = await this.db
220
- .from("sessions")
221
- .select()
222
- .where({ deviceID })
223
- .limit(1)
224
- .orderBy("lastUsed", "desc");
225
- if (rows.length === 0) {
226
- this.log.debug("getSession() => " + JSON.stringify(null, null, 4));
227
- return null;
228
- }
229
- const [session] = rows;
230
- const wsSession = {
231
- sessionID: session.sessionID,
232
- userID: session.userID,
233
- mode: session.mode,
234
- SK: XUtils.decodeHex(session.SK),
235
- publicKey: XUtils.decodeHex(session.publicKey),
236
- lastUsed: session.lastUsed,
237
- fingerprint: XUtils.decodeHex(session.fingerprint),
238
- };
239
- this.log.debug("getSession() => " + JSON.stringify(wsSession, null, 4));
240
- return wsSession;
241
- }
242
- async getPreKeys() {
243
- await this.untilReady();
244
- if (this.closing) {
245
- this.log.warn("Database is closing, getPreKeys() will not complete.");
246
- return null;
247
- }
248
- const rows = await this.db.from("preKeys").select();
249
- if (rows.length === 0) {
250
- this.log.debug("getPreKeys() => " + JSON.stringify(null, null, 4));
251
- return null;
252
- }
253
- const [preKeyInfo] = rows;
254
- const preKeys = {
255
- keyPair: nacl.box.keyPair.fromSecretKey(XUtils.decodeHex(preKeyInfo.privateKey)),
256
- signature: XUtils.decodeHex(preKeyInfo.signature),
257
- };
258
- this.log.debug("getPreKeys() => " + JSON.stringify(preKeys, null, 4));
259
- return preKeys;
260
- }
261
- async getOneTimeKey(index) {
262
- await this.untilReady();
263
- if (this.closing) {
264
- this.log.warn("Database is closing, getOneTimeKey() will not complete.");
265
- return null;
266
- }
267
- const rows = await this.db
268
- .from("oneTimeKeys")
269
- .select()
270
- .where({ index });
271
- if (rows.length === 0) {
272
- this.log.debug("getOneTimeKey() => " + JSON.stringify(null, null, 4));
273
- return null;
274
- }
275
- const [otkInfo] = rows;
276
- const otk = {
277
- keyPair: nacl.box.keyPair.fromSecretKey(XUtils.decodeHex(otkInfo.privateKey)),
278
- signature: XUtils.decodeHex(otkInfo.signature),
279
- index: otkInfo.index,
280
- };
281
- this.log.debug("getOneTimeKey() => " + JSON.stringify(otk, null, 4));
282
- return otk;
283
- }
284
- async deleteOneTimeKey(index) {
285
- if (this.closing) {
286
- this.log.warn("Database is closing, deleteOneTimeKey() will not complete.");
287
- return;
288
- }
289
- // delete the otk
290
- await this.db.from("oneTimeKeys").delete().where({ index });
291
- }
292
- async saveSession(session) {
293
- if (this.closing) {
294
- this.log.warn("Database is closing, deleteOneTimeKey() will not complete.");
295
- return;
296
- }
297
- try {
298
- await this.db("sessions").insert(session);
299
- }
300
- catch (err) {
301
- if (err.errno === 19) {
302
- this.log.warn("Attempted to insert duplicate SK");
303
- return;
304
- }
305
- else {
306
- throw err;
307
- }
308
- }
309
- }
310
- async getDevice(deviceID) {
311
- const rows = await this.db.from("devices").select().where({ deviceID });
312
- if (rows.length === 0) {
313
- return null;
314
- }
315
- return rows[0];
316
- }
317
- async purgeHistory() {
318
- await this.db.from("messages").truncate();
319
- }
320
- async purgeKeyData() {
321
- await this.db.from("sessions").truncate();
322
- await this.db.from("oneTimeKeys").truncate();
323
- await this.db.from("preKeys").truncate();
324
- await this.db.from("messages").truncate();
325
- }
326
- async deleteHistory(channelOrUserID, olderThan) {
327
- if (!olderThan) {
328
- await this.db
329
- .from("messages")
330
- .where({ group: channelOrUserID })
331
- .orWhere({ group: null, authorID: channelOrUserID })
332
- .orWhere({ group: null, readerID: channelOrUserID })
333
- .delete();
334
- }
335
- else {
336
- const duration = parseDuration(olderThan);
337
- if (!duration) {
338
- throw new Error("Bad duration. See parse-duration library for more details.");
339
- }
340
- console.log(duration);
341
- const res = await this.db
342
- .from("messages")
343
- .where("time", "<", new Date(Date.now() - duration).toISOString());
344
- console.log(res);
345
- }
346
- }
347
- async saveDevice(device) {
348
- if (this.closing) {
349
- this.log.warn("Database is closing, saveDevice() will not complete.");
350
- return;
351
- }
352
- try {
353
- await this.db("devices").insert(device);
354
- }
355
- catch (err) {
356
- if (err.errno === 19) {
357
- this.log.warn("Attempted to insert duplicate deviceID");
358
- return;
359
- }
360
- else {
361
- throw err;
362
- }
363
- }
364
- }
365
- async init() {
366
- this.log.info("Initializing database tables.");
367
- try {
368
- if (!(await this.db.schema.hasTable("messages"))) {
369
- await this.db.schema.createTable("messages", (table) => {
370
- table.string("nonce").primary();
371
- table.string("sender").index();
372
- table.string("recipient").index();
373
- table.string("group").index();
374
- table.string("mailID");
375
- table.string("message");
376
- table.string("direction");
377
- table.date("timestamp");
378
- table.boolean("decrypted");
379
- table.boolean("forward");
380
- table.string("authorID");
381
- table.string("readerID");
382
- });
383
- }
384
- if (!(await this.db.schema.hasTable("devices"))) {
385
- await this.db.schema.createTable("devices", (table) => {
386
- table.string("deviceID").primary();
387
- table.string("owner").index();
388
- table.string("signKey");
389
- table.string("name");
390
- table.string("lastLogin");
391
- table.boolean("deleted");
392
- });
393
- }
394
- if (!(await this.db.schema.hasTable("sessions"))) {
395
- await this.db.schema.createTable("sessions", (table) => {
396
- table.string("sessionID").primary();
397
- table.string("userID");
398
- table.string("deviceID");
399
- table.string("SK").unique();
400
- table.string("publicKey");
401
- table.string("fingerprint");
402
- table.string("mode");
403
- table.date("lastUsed");
404
- table.boolean("verified");
405
- });
406
- }
407
- if (!(await this.db.schema.hasTable("preKeys"))) {
408
- await this.db.schema.createTable("preKeys", (table) => {
409
- table.increments("index");
410
- table.string("keyID").unique();
411
- table.string("userID");
412
- table.string("deviceID");
413
- table.string("privateKey");
414
- table.string("publicKey");
415
- table.string("signature");
416
- });
417
- }
418
- if (!(await this.db.schema.hasTable("oneTimeKeys"))) {
419
- await this.db.schema.createTable("oneTimeKeys", (table) => {
420
- table.increments("index");
421
- table.string("keyID").unique();
422
- table.string("userID");
423
- table.string("deviceID");
424
- table.string("privateKey");
425
- table.string("publicKey");
426
- table.string("signature");
427
- });
428
- }
429
- this.ready = true;
430
- this.emit("ready");
431
- }
432
- catch (err) {
433
- this.emit("error", err);
434
- }
435
- }
436
- async untilReady() {
437
- let timeout = 1;
438
- while (!this.ready) {
439
- await sleep(timeout);
440
- timeout *= 2;
441
- }
442
- }
443
- }
444
- //# sourceMappingURL=Storage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Storage.js","sourceRoot":"","sources":["../src/Storage.ts"],"names":[],"mappings":"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"}