@vex-chat/libvex 5.1.0 → 5.3.0
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/CLA.md +38 -0
- package/LICENSE-COMMERCIAL +10 -0
- package/LICENSING.md +15 -0
- package/README.md +8 -2
- package/dist/Client.d.ts +47 -3
- package/dist/Client.d.ts.map +1 -1
- package/dist/Client.js +998 -496
- package/dist/Client.js.map +1 -1
- package/dist/Storage.d.ts +5 -0
- package/dist/Storage.d.ts.map +1 -1
- package/dist/Storage.js +5 -0
- package/dist/Storage.js.map +1 -1
- package/dist/__tests__/harness/memory-storage.d.ts +7 -2
- package/dist/__tests__/harness/memory-storage.d.ts.map +1 -1
- package/dist/__tests__/harness/memory-storage.js +44 -29
- package/dist/__tests__/harness/memory-storage.js.map +1 -1
- package/dist/codec.d.ts +9 -9
- package/dist/codec.d.ts.map +1 -1
- package/dist/codec.js +17 -19
- package/dist/codec.js.map +1 -1
- package/dist/codecs.d.ts +5 -0
- package/dist/codecs.d.ts.map +1 -1
- package/dist/codecs.js +5 -0
- package/dist/codecs.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/keystore/memory.d.ts +5 -0
- package/dist/keystore/memory.d.ts.map +1 -1
- package/dist/keystore/memory.js +5 -0
- package/dist/keystore/memory.js.map +1 -1
- package/dist/keystore/node.d.ts +5 -0
- package/dist/keystore/node.d.ts.map +1 -1
- package/dist/keystore/node.js +16 -8
- package/dist/keystore/node.js.map +1 -1
- package/dist/preset/common.d.ts +5 -0
- package/dist/preset/common.d.ts.map +1 -1
- package/dist/preset/common.js +5 -0
- package/dist/preset/common.js.map +1 -1
- package/dist/preset/node.d.ts +5 -0
- package/dist/preset/node.d.ts.map +1 -1
- package/dist/preset/node.js +9 -1
- package/dist/preset/node.js.map +1 -1
- package/dist/preset/test.d.ts +5 -0
- package/dist/preset/test.d.ts.map +1 -1
- package/dist/preset/test.js +9 -1
- package/dist/preset/test.js.map +1 -1
- package/dist/storage/node/http-agents.d.ts +5 -0
- package/dist/storage/node/http-agents.d.ts.map +1 -1
- package/dist/storage/node/http-agents.js +5 -0
- package/dist/storage/node/http-agents.js.map +1 -1
- package/dist/storage/node.d.ts +6 -1
- package/dist/storage/node.d.ts.map +1 -1
- package/dist/storage/node.js +7 -4
- package/dist/storage/node.js.map +1 -1
- package/dist/storage/schema.d.ts +5 -0
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +5 -0
- package/dist/storage/schema.js.map +1 -1
- package/dist/storage/sqlite.d.ts +22 -4
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +172 -98
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/transport/types.d.ts +5 -0
- package/dist/transport/types.d.ts.map +1 -1
- package/dist/transport/types.js +5 -0
- package/dist/transport/types.js.map +1 -1
- package/dist/transport/websocket.d.ts +5 -0
- package/dist/transport/websocket.d.ts.map +1 -1
- package/dist/transport/websocket.js +5 -0
- package/dist/transport/websocket.js.map +1 -1
- package/dist/types/crypto.d.ts +5 -0
- package/dist/types/crypto.d.ts.map +1 -1
- package/dist/types/crypto.js +3 -5
- package/dist/types/crypto.js.map +1 -1
- package/dist/types/identity.d.ts +5 -0
- package/dist/types/identity.d.ts.map +1 -1
- package/dist/types/identity.js +3 -2
- package/dist/types/identity.js.map +1 -1
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/capitalize.d.ts +5 -0
- package/dist/utils/capitalize.d.ts.map +1 -1
- package/dist/utils/capitalize.js +5 -0
- package/dist/utils/capitalize.js.map +1 -1
- package/dist/utils/fipsMailExtra.d.ts +30 -0
- package/dist/utils/fipsMailExtra.d.ts.map +1 -0
- package/dist/utils/fipsMailExtra.js +114 -0
- package/dist/utils/fipsMailExtra.js.map +1 -0
- package/dist/utils/formatBytes.d.ts +5 -0
- package/dist/utils/formatBytes.d.ts.map +1 -1
- package/dist/utils/formatBytes.js +5 -0
- package/dist/utils/formatBytes.js.map +1 -1
- package/dist/utils/resolveAtRestAesKey.d.ts +13 -0
- package/dist/utils/resolveAtRestAesKey.d.ts.map +1 -0
- package/dist/utils/resolveAtRestAesKey.js +26 -0
- package/dist/utils/resolveAtRestAesKey.js.map +1 -0
- package/dist/utils/sqlSessionToCrypto.d.ts +5 -0
- package/dist/utils/sqlSessionToCrypto.d.ts.map +1 -1
- package/dist/utils/sqlSessionToCrypto.js +5 -0
- package/dist/utils/sqlSessionToCrypto.js.map +1 -1
- package/dist/utils/uint8uuid.d.ts +5 -0
- package/dist/utils/uint8uuid.d.ts.map +1 -1
- package/dist/utils/uint8uuid.js +5 -0
- package/dist/utils/uint8uuid.js.map +1 -1
- package/package.json +10 -3
- package/src/Client.ts +1281 -642
- package/src/Storage.ts +6 -0
- package/src/__tests__/codec.test.ts +6 -0
- package/src/__tests__/harness/fixtures.ts +6 -0
- package/src/__tests__/harness/memory-storage.ts +72 -52
- package/src/__tests__/harness/platform-transports.ts +6 -0
- package/src/__tests__/harness/poison-node-imports.ts +6 -0
- package/src/__tests__/harness/shared-suite.ts +288 -124
- package/src/__tests__/platform-browser.test.ts +15 -1
- package/src/__tests__/platform-node.test.ts +17 -3
- package/src/codec.ts +21 -8
- package/src/codecs.ts +6 -0
- package/src/index.ts +6 -0
- package/src/keystore/memory.ts +6 -0
- package/src/keystore/node.ts +27 -13
- package/src/preset/common.ts +6 -0
- package/src/preset/node.ts +14 -1
- package/src/preset/test.ts +14 -1
- package/src/storage/node/http-agents.ts +6 -0
- package/src/storage/node.ts +11 -4
- package/src/storage/schema.ts +6 -0
- package/src/storage/sqlite.ts +208 -135
- package/src/transport/types.ts +6 -0
- package/src/transport/websocket.ts +6 -0
- package/src/types/crypto.ts +6 -0
- package/src/types/identity.ts +6 -0
- package/src/types/index.ts +6 -0
- package/src/utils/capitalize.ts +6 -0
- package/src/utils/fipsMailExtra.ts +164 -0
- package/src/utils/formatBytes.ts +6 -0
- package/src/utils/resolveAtRestAesKey.ts +39 -0
- package/src/utils/sqlSessionToCrypto.ts +6 -0
- package/src/utils/uint8uuid.ts +6 -0
package/src/keystore/node.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-2026 Vex Heavy Industries LLC
|
|
3
|
+
* Licensed under AGPL-3.0. See LICENSE for details.
|
|
4
|
+
* Commercial licenses available at vex.wtf
|
|
5
|
+
*/
|
|
6
|
+
|
|
1
7
|
import type { KeyStore, StoredCredentials } from "../types/index.js";
|
|
2
8
|
|
|
3
9
|
import * as fs from "node:fs";
|
|
@@ -9,7 +15,7 @@ import * as path from "node:path";
|
|
|
9
15
|
* Stores credentials as encrypted files on disk using XUtils.encryptKeyData.
|
|
10
16
|
* Node-only — imports node:fs.
|
|
11
17
|
*/
|
|
12
|
-
import { XUtils } from "@vex-chat/crypto";
|
|
18
|
+
import { getCryptoProfile, XUtils } from "@vex-chat/crypto";
|
|
13
19
|
|
|
14
20
|
export class NodeKeyStore implements KeyStore {
|
|
15
21
|
private readonly dir: string;
|
|
@@ -37,7 +43,7 @@ export class NodeKeyStore implements KeyStore {
|
|
|
37
43
|
|
|
38
44
|
load(username?: string): Promise<null | StoredCredentials> {
|
|
39
45
|
if (username) {
|
|
40
|
-
return
|
|
46
|
+
return this.readFile(this.filePath(username));
|
|
41
47
|
}
|
|
42
48
|
// Find most recent .vex file in the directory
|
|
43
49
|
try {
|
|
@@ -52,32 +58,40 @@ export class NodeKeyStore implements KeyStore {
|
|
|
52
58
|
if (files.length === 0) return Promise.resolve(null);
|
|
53
59
|
const newest = files[0];
|
|
54
60
|
if (!newest) return Promise.resolve(null);
|
|
55
|
-
return
|
|
56
|
-
this.readFile(path.join(this.dir, newest.name)),
|
|
57
|
-
);
|
|
61
|
+
return this.readFile(path.join(this.dir, newest.name));
|
|
58
62
|
} catch {
|
|
59
63
|
return Promise.resolve(null);
|
|
60
64
|
}
|
|
61
65
|
}
|
|
62
66
|
|
|
63
|
-
save(creds: StoredCredentials): Promise<void> {
|
|
67
|
+
async save(creds: StoredCredentials): Promise<void> {
|
|
64
68
|
const data = JSON.stringify(creds);
|
|
65
|
-
const encrypted =
|
|
69
|
+
const encrypted =
|
|
70
|
+
getCryptoProfile() === "fips"
|
|
71
|
+
? await XUtils.encryptKeyDataAsync(this.passphrase, data)
|
|
72
|
+
: XUtils.encryptKeyData(this.passphrase, data);
|
|
66
73
|
fs.writeFileSync(this.filePath(creds.username), encrypted);
|
|
67
|
-
return Promise.resolve();
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
private filePath(username: string): string {
|
|
71
77
|
return path.join(this.dir, `${username}.vex`);
|
|
72
78
|
}
|
|
73
79
|
|
|
74
|
-
private readFile(
|
|
80
|
+
private async readFile(
|
|
81
|
+
filePath: string,
|
|
82
|
+
): Promise<null | StoredCredentials> {
|
|
75
83
|
try {
|
|
76
84
|
const data = fs.readFileSync(filePath);
|
|
77
|
-
const decrypted =
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
85
|
+
const decrypted =
|
|
86
|
+
getCryptoProfile() === "fips"
|
|
87
|
+
? await XUtils.decryptKeyDataAsync(
|
|
88
|
+
new Uint8Array(data),
|
|
89
|
+
this.passphrase,
|
|
90
|
+
)
|
|
91
|
+
: XUtils.decryptKeyData(
|
|
92
|
+
new Uint8Array(data),
|
|
93
|
+
this.passphrase,
|
|
94
|
+
);
|
|
81
95
|
const parsed: unknown = JSON.parse(decrypted);
|
|
82
96
|
if (isStoredCredentials(parsed)) {
|
|
83
97
|
return parsed;
|
package/src/preset/common.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-2026 Vex Heavy Industries LLC
|
|
3
|
+
* Licensed under AGPL-3.0. See LICENSE for details.
|
|
4
|
+
* Commercial licenses available at vex.wtf
|
|
5
|
+
*/
|
|
6
|
+
|
|
1
7
|
import type { Storage } from "../Storage.js";
|
|
2
8
|
|
|
3
9
|
/** Internal preset interface used by nodePreset and testPreset. */
|
package/src/preset/node.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-2026 Vex Heavy Industries LLC
|
|
3
|
+
* Licensed under AGPL-3.0. See LICENSE for details.
|
|
4
|
+
* Commercial licenses available at vex.wtf
|
|
5
|
+
*/
|
|
6
|
+
|
|
1
7
|
import type { Storage } from "../Storage.js";
|
|
2
8
|
/**
|
|
3
9
|
* Platform preset for Node.js (CLI tools, bots, tests).
|
|
@@ -10,8 +16,15 @@ import type { PlatformPreset } from "./common.js";
|
|
|
10
16
|
export function nodePreset(): PlatformPreset {
|
|
11
17
|
return {
|
|
12
18
|
async createStorage(dbName, privateKey): Promise<Storage> {
|
|
19
|
+
const { getCryptoProfile } = await import("@vex-chat/crypto");
|
|
13
20
|
const { createNodeStorage } = await import("../storage/node.js");
|
|
14
|
-
|
|
21
|
+
const { resolveAtRestAesKeyFromSignKeyHex } =
|
|
22
|
+
await import("../utils/resolveAtRestAesKey.js");
|
|
23
|
+
const atRest = await resolveAtRestAesKeyFromSignKeyHex(
|
|
24
|
+
privateKey,
|
|
25
|
+
getCryptoProfile(),
|
|
26
|
+
);
|
|
27
|
+
return createNodeStorage(dbName, atRest);
|
|
15
28
|
},
|
|
16
29
|
deviceName: process.platform,
|
|
17
30
|
};
|
package/src/preset/test.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-2026 Vex Heavy Industries LLC
|
|
3
|
+
* Licensed under AGPL-3.0. See LICENSE for details.
|
|
4
|
+
* Commercial licenses available at vex.wtf
|
|
5
|
+
*/
|
|
6
|
+
|
|
1
7
|
/**
|
|
2
8
|
* Platform preset for tests — no I/O, no platform dependencies.
|
|
3
9
|
*
|
|
@@ -9,9 +15,16 @@ import type { PlatformPreset } from "./common.js";
|
|
|
9
15
|
export function testPreset(): PlatformPreset {
|
|
10
16
|
return {
|
|
11
17
|
async createStorage(_dbName, privateKey) {
|
|
18
|
+
const { getCryptoProfile } = await import("@vex-chat/crypto");
|
|
19
|
+
const { resolveAtRestAesKeyFromSignKeyHex } =
|
|
20
|
+
await import("../utils/resolveAtRestAesKey.js");
|
|
12
21
|
const { MemoryStorage } =
|
|
13
22
|
await import("../__tests__/harness/memory-storage.js");
|
|
14
|
-
const
|
|
23
|
+
const atRest = await resolveAtRestAesKeyFromSignKeyHex(
|
|
24
|
+
privateKey,
|
|
25
|
+
getCryptoProfile(),
|
|
26
|
+
);
|
|
27
|
+
const storage = new MemoryStorage(atRest);
|
|
15
28
|
await storage.init();
|
|
16
29
|
return storage;
|
|
17
30
|
},
|
package/src/storage/node.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-2026 Vex Heavy Industries LLC
|
|
3
|
+
* Licensed under AGPL-3.0. See LICENSE for details.
|
|
4
|
+
* Commercial licenses available at vex.wtf
|
|
5
|
+
*/
|
|
6
|
+
|
|
1
7
|
import type { Storage } from "../Storage.js";
|
|
2
8
|
import type { ClientDatabase } from "./schema.js";
|
|
3
9
|
|
|
@@ -10,13 +16,14 @@ import { Kysely, SqliteDialect } from "kysely";
|
|
|
10
16
|
|
|
11
17
|
import { SqliteStorage } from "./sqlite.js";
|
|
12
18
|
|
|
13
|
-
export function createNodeStorage(
|
|
19
|
+
export function createNodeStorage(
|
|
20
|
+
dbPath: string,
|
|
21
|
+
atRestAesKey: Uint8Array,
|
|
22
|
+
): Storage {
|
|
14
23
|
const db = new Kysely<ClientDatabase>({
|
|
15
24
|
dialect: new SqliteDialect({
|
|
16
25
|
database: new BetterSqlite3(dbPath),
|
|
17
26
|
}),
|
|
18
27
|
});
|
|
19
|
-
|
|
20
|
-
void storage.init();
|
|
21
|
-
return storage;
|
|
28
|
+
return new SqliteStorage(db, atRestAesKey);
|
|
22
29
|
}
|
package/src/storage/schema.ts
CHANGED