@vex-chat/libvex 1.0.2 → 2.0.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/README.md +103 -41
- package/dist/Client.d.ts +449 -554
- package/dist/Client.d.ts.map +1 -0
- package/dist/Client.js +1542 -1484
- package/dist/Client.js.map +1 -1
- package/dist/Storage.d.ts +111 -0
- package/dist/Storage.d.ts.map +1 -0
- package/dist/Storage.js +2 -0
- package/dist/Storage.js.map +1 -0
- package/dist/__tests__/harness/memory-storage.d.ts +29 -27
- package/dist/__tests__/harness/memory-storage.d.ts.map +1 -0
- package/dist/__tests__/harness/memory-storage.js +120 -109
- package/dist/__tests__/harness/memory-storage.js.map +1 -1
- package/dist/codec.d.ts +44 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +51 -0
- package/dist/codec.js.map +1 -0
- package/dist/codecs.d.ts +201 -0
- package/dist/codecs.d.ts.map +1 -0
- package/dist/codecs.js +67 -0
- package/dist/codecs.js.map +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/keystore/memory.d.ts +5 -4
- package/dist/keystore/memory.d.ts.map +1 -0
- package/dist/keystore/memory.js +9 -7
- package/dist/keystore/memory.js.map +1 -1
- package/dist/keystore/node.d.ts +6 -5
- package/dist/keystore/node.d.ts.map +1 -0
- package/dist/keystore/node.js +38 -19
- package/dist/keystore/node.js.map +1 -1
- package/dist/preset/common.d.ts +9 -0
- package/dist/preset/common.d.ts.map +1 -0
- package/dist/preset/common.js +2 -0
- package/dist/preset/common.js.map +1 -0
- package/dist/preset/node.d.ts +3 -5
- package/dist/preset/node.d.ts.map +1 -0
- package/dist/preset/node.js +5 -7
- package/dist/preset/node.js.map +1 -1
- package/dist/preset/test.d.ts +4 -4
- package/dist/preset/test.d.ts.map +1 -0
- package/dist/preset/test.js +8 -10
- package/dist/preset/test.js.map +1 -1
- package/dist/storage/node.d.ts +4 -3
- package/dist/storage/node.d.ts.map +1 -0
- package/dist/storage/node.js +4 -4
- package/dist/storage/node.js.map +1 -1
- package/dist/storage/schema.d.ts +55 -57
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/sqlite.d.ts +33 -28
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +330 -290
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/transport/types.d.ts +23 -16
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/websocket.d.ts +26 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +83 -0
- package/dist/transport/websocket.js.map +1 -0
- package/dist/types/crypto.d.ts +35 -0
- package/dist/types/crypto.d.ts.map +1 -0
- package/dist/types/crypto.js +9 -0
- package/dist/types/crypto.js.map +1 -0
- package/dist/types/identity.d.ts +17 -0
- package/dist/types/identity.d.ts.map +1 -0
- package/dist/types/identity.js +6 -0
- package/dist/types/identity.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/capitalize.d.ts +1 -0
- package/dist/utils/capitalize.d.ts.map +1 -0
- package/dist/utils/createLogger.d.ts +1 -0
- package/dist/utils/createLogger.d.ts.map +1 -0
- package/dist/utils/createLogger.js +4 -11
- package/dist/utils/createLogger.js.map +1 -1
- package/dist/utils/formatBytes.d.ts +1 -0
- package/dist/utils/formatBytes.d.ts.map +1 -0
- package/dist/utils/formatBytes.js +3 -1
- package/dist/utils/formatBytes.js.map +1 -1
- package/dist/utils/sqlSessionToCrypto.d.ts +4 -2
- package/dist/utils/sqlSessionToCrypto.d.ts.map +1 -0
- package/dist/utils/sqlSessionToCrypto.js +5 -5
- package/dist/utils/sqlSessionToCrypto.js.map +1 -1
- package/dist/utils/uint8uuid.d.ts +1 -4
- package/dist/utils/uint8uuid.d.ts.map +1 -0
- package/dist/utils/uint8uuid.js +1 -7
- package/dist/utils/uint8uuid.js.map +1 -1
- package/package.json +58 -87
- package/src/Client.ts +3304 -0
- package/{dist/IStorage.d.ts → src/Storage.ts} +70 -62
- package/src/__tests__/codec.test.ts +251 -0
- package/src/__tests__/ghost.png +0 -0
- package/src/__tests__/harness/fixtures.ts +22 -0
- package/src/__tests__/harness/memory-storage.ts +254 -0
- package/src/__tests__/harness/platform-transports.ts +17 -0
- package/src/__tests__/harness/poison-node-imports.ts +108 -0
- package/src/__tests__/harness/shared-suite.ts +446 -0
- package/src/__tests__/platform-browser.test.ts +19 -0
- package/src/__tests__/platform-node.test.ts +10 -0
- package/src/__tests__/triggered.png +0 -0
- package/src/codec.ts +68 -0
- package/src/codecs.ts +101 -0
- package/src/index.ts +33 -0
- package/src/keystore/memory.ts +30 -0
- package/src/keystore/node.ts +91 -0
- package/src/preset/common.ts +13 -0
- package/src/preset/node.ts +34 -0
- package/src/preset/test.ts +37 -0
- package/src/storage/node.ts +33 -0
- package/src/storage/schema.ts +94 -0
- package/src/storage/sqlite.ts +676 -0
- package/src/transport/types.ts +29 -0
- package/src/transport/websocket.ts +106 -0
- package/src/types/crypto.ts +39 -0
- package/src/types/identity.ts +18 -0
- package/src/types/index.ts +9 -0
- package/src/utils/capitalize.ts +6 -0
- package/src/utils/createLogger.ts +37 -0
- package/src/utils/formatBytes.ts +15 -0
- package/src/utils/sqlSessionToCrypto.ts +16 -0
- package/src/utils/uint8uuid.ts +7 -0
- package/dist/IStorage.js +0 -2
- package/dist/IStorage.js.map +0 -1
- package/dist/keystore/types.d.ts +0 -4
- package/dist/keystore/types.js +0 -2
- package/dist/keystore/types.js.map +0 -1
- package/dist/preset/expo.d.ts +0 -2
- package/dist/preset/expo.js +0 -37
- package/dist/preset/expo.js.map +0 -1
- package/dist/preset/tauri.d.ts +0 -2
- package/dist/preset/tauri.js +0 -35
- package/dist/preset/tauri.js.map +0 -1
- package/dist/preset/types.d.ts +0 -13
- package/dist/preset/types.js +0 -2
- package/dist/preset/types.js.map +0 -1
- package/dist/storage/expo.d.ts +0 -3
- package/dist/storage/expo.js +0 -18
- package/dist/storage/expo.js.map +0 -1
- package/dist/storage/tauri.d.ts +0 -3
- package/dist/storage/tauri.js +0 -21
- package/dist/storage/tauri.js.map +0 -1
- package/dist/transport/browser.d.ts +0 -17
- package/dist/transport/browser.js +0 -56
- package/dist/transport/browser.js.map +0 -1
- package/dist/utils/constants.d.ts +0 -8
- package/dist/utils/constants.js +0 -9
- package/dist/utils/constants.js.map +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapts the standard WebSocket API (addEventListener/MessageEvent) to the
|
|
3
|
+
* EventEmitter-style .on()/.off() interface used internally by Client.
|
|
4
|
+
*
|
|
5
|
+
* Works everywhere: Node 22+, browsers, Tauri, React Native.
|
|
6
|
+
*/
|
|
7
|
+
import type { WebSocketLike } from "./types.js";
|
|
8
|
+
|
|
9
|
+
export class WebSocketAdapter implements WebSocketLike {
|
|
10
|
+
onerror: ((err: Error | Event) => void) | null = null;
|
|
11
|
+
get readyState() {
|
|
12
|
+
return this.ws.readyState;
|
|
13
|
+
}
|
|
14
|
+
private readonly errorListeners = new Map<
|
|
15
|
+
(error: Error) => void,
|
|
16
|
+
EventListener
|
|
17
|
+
>();
|
|
18
|
+
private readonly lifecycleListeners = new Map<() => void, EventListener>();
|
|
19
|
+
private readonly messageListeners = new Map<
|
|
20
|
+
(data: Uint8Array) => void,
|
|
21
|
+
EventListener
|
|
22
|
+
>();
|
|
23
|
+
|
|
24
|
+
private readonly ws: WebSocket;
|
|
25
|
+
|
|
26
|
+
constructor(url: string, _options?: object) {
|
|
27
|
+
this.ws = new globalThis.WebSocket(url);
|
|
28
|
+
this.ws.binaryType = "arraybuffer";
|
|
29
|
+
this.ws.onerror = (ev) => this.onerror?.(ev);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
close() {
|
|
33
|
+
this.ws.close();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
off(event: "close" | "open", listener: () => void): void;
|
|
37
|
+
off(event: "error", listener: (error: Error) => void): void;
|
|
38
|
+
off(event: "message", listener: (data: Uint8Array) => void): void;
|
|
39
|
+
off(event: string, listener: never): void {
|
|
40
|
+
if (event === "message") {
|
|
41
|
+
const typedListener: (data: Uint8Array) => void = listener;
|
|
42
|
+
const wrapped = this.messageListeners.get(typedListener);
|
|
43
|
+
if (wrapped) {
|
|
44
|
+
this.ws.removeEventListener(event, wrapped);
|
|
45
|
+
this.messageListeners.delete(typedListener);
|
|
46
|
+
}
|
|
47
|
+
} else if (event === "error") {
|
|
48
|
+
const typedListener: (error: Error) => void = listener;
|
|
49
|
+
const wrapped = this.errorListeners.get(typedListener);
|
|
50
|
+
if (wrapped) {
|
|
51
|
+
this.ws.removeEventListener(event, wrapped);
|
|
52
|
+
this.errorListeners.delete(typedListener);
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
const typedListener: () => void = listener;
|
|
56
|
+
const wrapped = this.lifecycleListeners.get(typedListener);
|
|
57
|
+
if (wrapped) {
|
|
58
|
+
this.ws.removeEventListener(event, wrapped);
|
|
59
|
+
this.lifecycleListeners.delete(typedListener);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
on(event: "close" | "open", listener: () => void): void;
|
|
65
|
+
on(event: "error", listener: (error: Error) => void): void;
|
|
66
|
+
on(event: "message", listener: (data: Uint8Array) => void): void;
|
|
67
|
+
on(event: string, listener: never): void {
|
|
68
|
+
if (event === "message") {
|
|
69
|
+
const typedListener: (data: Uint8Array) => void = listener;
|
|
70
|
+
const wrapped: EventListener = (ev: Event) => {
|
|
71
|
+
if (!("data" in ev)) return;
|
|
72
|
+
const { data } = ev;
|
|
73
|
+
if (data instanceof ArrayBuffer) {
|
|
74
|
+
typedListener(new Uint8Array(data));
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
this.messageListeners.set(typedListener, wrapped);
|
|
78
|
+
this.ws.addEventListener(event, wrapped);
|
|
79
|
+
} else if (event === "error") {
|
|
80
|
+
const typedListener: (error: Error) => void = listener;
|
|
81
|
+
const wrapped: EventListener = (ev: Event) => {
|
|
82
|
+
typedListener(
|
|
83
|
+
ev instanceof Error ? ev : new Error("WebSocket error"),
|
|
84
|
+
);
|
|
85
|
+
};
|
|
86
|
+
this.errorListeners.set(typedListener, wrapped);
|
|
87
|
+
this.ws.addEventListener(event, wrapped);
|
|
88
|
+
} else {
|
|
89
|
+
// "open" | "close"
|
|
90
|
+
const typedListener: () => void = listener;
|
|
91
|
+
const wrapped: EventListener = () => {
|
|
92
|
+
typedListener();
|
|
93
|
+
};
|
|
94
|
+
this.lifecycleListeners.set(typedListener, wrapped);
|
|
95
|
+
this.ws.addEventListener(event, wrapped);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
send(data: Uint8Array) {
|
|
100
|
+
this.ws.send(new Uint8Array(data));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
terminate() {
|
|
104
|
+
this.ws.close();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK-internal crypto types. These were moved from @vex-chat/types
|
|
3
|
+
* because they are only used by the SDK, never by the server.
|
|
4
|
+
*
|
|
5
|
+
* The KeyPair shape matches tweetnacl's nacl.BoxKeyPair without
|
|
6
|
+
* importing from tweetnacl — future WASM migration only changes this file.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface KeyPair {
|
|
10
|
+
publicKey: Uint8Array;
|
|
11
|
+
secretKey: Uint8Array;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Prekey after DB storage — index assigned by autoincrement. */
|
|
15
|
+
export interface PreKeysCrypto extends UnsavedPreKey {
|
|
16
|
+
index: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface SessionCrypto {
|
|
20
|
+
fingerprint: Uint8Array;
|
|
21
|
+
lastUsed: string;
|
|
22
|
+
mode: "initiator" | "receiver";
|
|
23
|
+
publicKey: Uint8Array;
|
|
24
|
+
sessionID: string;
|
|
25
|
+
SK: Uint8Array;
|
|
26
|
+
userID: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Prekey before DB storage — no index yet. */
|
|
30
|
+
export interface UnsavedPreKey {
|
|
31
|
+
keyPair: KeyPair;
|
|
32
|
+
signature: Uint8Array;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface XKeyRing {
|
|
36
|
+
ephemeralKeys: KeyPair;
|
|
37
|
+
identityKeys: KeyPair;
|
|
38
|
+
preKeys: PreKeysCrypto;
|
|
39
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK credential storage types. Moved from @vex-chat/types
|
|
3
|
+
* because only the SDK and app consumers use them.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface KeyStore {
|
|
7
|
+
clear(username: string): Promise<void>;
|
|
8
|
+
load(username?: string): Promise<null | StoredCredentials>;
|
|
9
|
+
save(creds: StoredCredentials): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface StoredCredentials {
|
|
13
|
+
deviceID: string;
|
|
14
|
+
deviceKey: string;
|
|
15
|
+
preKey?: string;
|
|
16
|
+
token?: string;
|
|
17
|
+
username: string;
|
|
18
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import winston from "winston";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @ignore
|
|
5
|
+
*/
|
|
6
|
+
export function createLogger(logName: string, logLevel?: string) {
|
|
7
|
+
const logger = winston.createLogger({
|
|
8
|
+
defaultMeta: { service: "vex-" + logName },
|
|
9
|
+
format: winston.format.combine(
|
|
10
|
+
winston.format.timestamp({
|
|
11
|
+
format: "YYYY-MM-DD HH:mm:ss",
|
|
12
|
+
}),
|
|
13
|
+
winston.format.errors({ stack: true }),
|
|
14
|
+
winston.format.splat(),
|
|
15
|
+
winston.format.json(),
|
|
16
|
+
),
|
|
17
|
+
level: logLevel || "error",
|
|
18
|
+
transports: [
|
|
19
|
+
new winston.transports.File({
|
|
20
|
+
filename: "vex:" + logName + ".log",
|
|
21
|
+
level: "error",
|
|
22
|
+
}),
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
// Also log to console outside production.
|
|
26
|
+
if (process.env["NODE_ENV"] !== "production") {
|
|
27
|
+
logger.add(
|
|
28
|
+
new winston.transports.Console({
|
|
29
|
+
format: winston.format.combine(
|
|
30
|
+
winston.format.colorize(),
|
|
31
|
+
winston.format.simple(),
|
|
32
|
+
),
|
|
33
|
+
}),
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return logger;
|
|
37
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const formatBytes = (bytes: number, decimals = 2) => {
|
|
2
|
+
if (bytes === 0) {
|
|
3
|
+
return "0 Bytes";
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const k = 1024;
|
|
7
|
+
const dm = decimals < 0 ? 0 : decimals;
|
|
8
|
+
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|
9
|
+
|
|
10
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
11
|
+
|
|
12
|
+
const value = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));
|
|
13
|
+
const unit = sizes[i] ?? "Bytes";
|
|
14
|
+
return `${String(value)} ${unit}`;
|
|
15
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SessionCrypto } from "../types/index.js";
|
|
2
|
+
import type { SessionSQL } from "@vex-chat/types";
|
|
3
|
+
|
|
4
|
+
import { XUtils } from "@vex-chat/crypto";
|
|
5
|
+
|
|
6
|
+
export function sqlSessionToCrypto(session: SessionSQL): SessionCrypto {
|
|
7
|
+
return {
|
|
8
|
+
fingerprint: XUtils.decodeHex(session.fingerprint),
|
|
9
|
+
lastUsed: session.lastUsed,
|
|
10
|
+
mode: session.mode,
|
|
11
|
+
publicKey: XUtils.decodeHex(session.publicKey),
|
|
12
|
+
sessionID: session.sessionID,
|
|
13
|
+
SK: XUtils.decodeHex(session.SK),
|
|
14
|
+
userID: session.userID,
|
|
15
|
+
};
|
|
16
|
+
}
|
package/dist/IStorage.js
DELETED
package/dist/IStorage.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IStorage.js","sourceRoot":"","sources":["../src/IStorage.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/keystore/types.d.ts
DELETED
package/dist/keystore/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/keystore/types.ts"],"names":[],"mappings":""}
|
package/dist/preset/expo.d.ts
DELETED
package/dist/preset/expo.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Platform preset for Expo / React Native apps.
|
|
3
|
-
*
|
|
4
|
-
* - WebSocket: browser-native (React Native's global WebSocket)
|
|
5
|
-
* - Storage: Kysely + kysely-expo + expo-sqlite
|
|
6
|
-
* - Logger: console
|
|
7
|
-
*
|
|
8
|
-
* expo-sqlite and kysely-expo are optional peerDependencies.
|
|
9
|
-
*/
|
|
10
|
-
import { BrowserWebSocket } from "../transport/browser.js";
|
|
11
|
-
const logger = {
|
|
12
|
-
info(m) {
|
|
13
|
-
console.log(`[vex] ${m}`);
|
|
14
|
-
},
|
|
15
|
-
warn(m) {
|
|
16
|
-
console.warn(`[vex] ${m}`);
|
|
17
|
-
},
|
|
18
|
-
error(m) {
|
|
19
|
-
console.error(`[vex] ${m}`);
|
|
20
|
-
},
|
|
21
|
-
debug(m) {
|
|
22
|
-
console.debug(`[vex] ${m}`);
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
export function expoPreset() {
|
|
26
|
-
return {
|
|
27
|
-
adapters: {
|
|
28
|
-
logger,
|
|
29
|
-
WebSocket: BrowserWebSocket,
|
|
30
|
-
},
|
|
31
|
-
async createStorage(dbName, privateKey, _logger) {
|
|
32
|
-
const { createExpoStorage } = await import("../storage/expo.js");
|
|
33
|
-
return createExpoStorage(dbName, privateKey, _logger ?? logger);
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=expo.js.map
|
package/dist/preset/expo.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"expo.js","sourceRoot":"","sources":["../../src/preset/expo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,MAAM,MAAM,GAAY;IACpB,IAAI,CAAC,CAAS;QACV,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,CAAS;QACV,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,CAAC,CAAS;QACX,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,KAAK,CAAC,CAAS;QACX,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;CACJ,CAAC;AAEF,MAAM,UAAU,UAAU;IACtB,OAAO;QACH,QAAQ,EAAE;YACN,MAAM;YACN,SAAS,EAAE,gBAAuB;SACrC;QACD,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO;YAC3C,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACjE,OAAO,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC;QACpE,CAAC;KACJ,CAAC;AACN,CAAC"}
|
package/dist/preset/tauri.d.ts
DELETED
package/dist/preset/tauri.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Platform preset for Tauri (desktop) apps.
|
|
3
|
-
*
|
|
4
|
-
* - WebSocket: browser-native (Tauri webview)
|
|
5
|
-
* - Storage: Kysely + kysely-dialect-tauri + @tauri-apps/plugin-sql
|
|
6
|
-
* - Logger: console
|
|
7
|
-
*/
|
|
8
|
-
import { BrowserWebSocket } from "../transport/browser.js";
|
|
9
|
-
const logger = {
|
|
10
|
-
info(m) {
|
|
11
|
-
console.log(`[vex] ${m}`);
|
|
12
|
-
},
|
|
13
|
-
warn(m) {
|
|
14
|
-
console.warn(`[vex] ${m}`);
|
|
15
|
-
},
|
|
16
|
-
error(m) {
|
|
17
|
-
console.error(`[vex] ${m}`);
|
|
18
|
-
},
|
|
19
|
-
debug(m) {
|
|
20
|
-
console.debug(`[vex] ${m}`);
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
export function tauriPreset() {
|
|
24
|
-
return {
|
|
25
|
-
adapters: {
|
|
26
|
-
logger,
|
|
27
|
-
WebSocket: BrowserWebSocket,
|
|
28
|
-
},
|
|
29
|
-
async createStorage(dbName, privateKey, _logger) {
|
|
30
|
-
const { createTauriStorage } = await import("../storage/tauri.js");
|
|
31
|
-
return createTauriStorage(dbName, privateKey, _logger ?? logger);
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=tauri.js.map
|
package/dist/preset/tauri.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tauri.js","sourceRoot":"","sources":["../../src/preset/tauri.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,MAAM,MAAM,GAAY;IACpB,IAAI,CAAC,CAAS;QACV,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,CAAS;QACV,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,CAAC,CAAS;QACX,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,KAAK,CAAC,CAAS;QACX,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;CACJ,CAAC;AAEF,MAAM,UAAU,WAAW;IACvB,OAAO;QACH,QAAQ,EAAE;YACN,MAAM;YACN,SAAS,EAAE,gBAAuB;SACrC;QACD,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO;YAC3C,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACnE,OAAO,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC;QACrE,CAAC;KACJ,CAAC;AACN,CAAC"}
|
package/dist/preset/types.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { IClientAdapters, ILogger } from "../transport/types.js";
|
|
2
|
-
import type { IStorage } from "../IStorage.js";
|
|
3
|
-
/**
|
|
4
|
-
* Bundles platform-specific adapters + storage factory.
|
|
5
|
-
*
|
|
6
|
-
* Each platform (Tauri, Expo, Node CLI) provides a preset factory
|
|
7
|
-
* that returns one of these. The store's bootstrap functions accept it
|
|
8
|
-
* so app code stays a one-liner.
|
|
9
|
-
*/
|
|
10
|
-
export interface PlatformPreset {
|
|
11
|
-
adapters: IClientAdapters;
|
|
12
|
-
createStorage(dbName: string, privateKey: string, logger: ILogger): Promise<IStorage>;
|
|
13
|
-
}
|
package/dist/preset/types.js
DELETED
package/dist/preset/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/preset/types.ts"],"names":[],"mappings":""}
|
package/dist/storage/expo.d.ts
DELETED
package/dist/storage/expo.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Expo (React Native) storage factory — creates SqliteStorage with kysely-expo.
|
|
3
|
-
*
|
|
4
|
-
* expo-sqlite and kysely-expo are peerDependencies —
|
|
5
|
-
* only available in Expo apps.
|
|
6
|
-
*/
|
|
7
|
-
import { Kysely } from "kysely";
|
|
8
|
-
import { SqliteStorage } from "./sqlite.js";
|
|
9
|
-
export async function createExpoStorage(dbName, SK, logger) {
|
|
10
|
-
const { ExpoDialect } = await import("kysely-expo");
|
|
11
|
-
const db = new Kysely({
|
|
12
|
-
dialect: new ExpoDialect({ database: dbName }),
|
|
13
|
-
});
|
|
14
|
-
const storage = new SqliteStorage(db, SK, logger);
|
|
15
|
-
await storage.init();
|
|
16
|
-
return storage;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=expo.js.map
|
package/dist/storage/expo.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"expo.js","sourceRoot":"","sources":["../../src/storage/expo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,MAAc,EACd,EAAU,EACV,MAAe;IAEf,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,IAAI,MAAM,CAAiB;QAClC,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAQ;KACxD,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
package/dist/storage/tauri.d.ts
DELETED
package/dist/storage/tauri.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tauri storage factory — creates SqliteStorage with kysely-dialect-tauri.
|
|
3
|
-
*
|
|
4
|
-
* @tauri-apps/plugin-sql and kysely-dialect-tauri are peerDependencies —
|
|
5
|
-
* only available inside a Tauri app.
|
|
6
|
-
*/
|
|
7
|
-
import { Kysely } from "kysely";
|
|
8
|
-
import { SqliteStorage } from "./sqlite.js";
|
|
9
|
-
export async function createTauriStorage(dbName, SK, logger) {
|
|
10
|
-
const { TauriSqliteDialect } = await import("kysely-dialect-tauri");
|
|
11
|
-
const { default: Database } = await import("@tauri-apps/plugin-sql");
|
|
12
|
-
const db = new Kysely({
|
|
13
|
-
dialect: new TauriSqliteDialect({
|
|
14
|
-
database: () => Database.load(`sqlite:${dbName}`),
|
|
15
|
-
}),
|
|
16
|
-
});
|
|
17
|
-
const storage = new SqliteStorage(db, SK, logger);
|
|
18
|
-
await storage.init();
|
|
19
|
-
return storage;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=tauri.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tauri.js","sourceRoot":"","sources":["../../src/storage/tauri.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,MAAc,EACd,EAAU,EACV,MAAe;IAEf,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACpE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,IAAI,MAAM,CAAiB;QAClC,OAAO,EAAE,IAAI,kBAAkB,CAAC;YAC5B,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;SACpD,CAAQ;KACZ,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wraps the browser's native WebSocket to match the IWebSocketLike interface
|
|
3
|
-
* expected by Client. Used by Tauri (webview) and future web builds.
|
|
4
|
-
*/
|
|
5
|
-
import type { IWebSocketLike } from "./types.js";
|
|
6
|
-
export declare class BrowserWebSocket implements IWebSocketLike {
|
|
7
|
-
private ws;
|
|
8
|
-
private listeners;
|
|
9
|
-
onerror: ((err: any) => void) | null;
|
|
10
|
-
constructor(url: string, _options?: object);
|
|
11
|
-
get readyState(): 0 | 1 | 2 | 3;
|
|
12
|
-
on(event: string, listener: (...args: any[]) => void): void;
|
|
13
|
-
off(event: string, listener: (...args: any[]) => void): void;
|
|
14
|
-
send(data: any): void;
|
|
15
|
-
close(): void;
|
|
16
|
-
terminate(): void;
|
|
17
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
export class BrowserWebSocket {
|
|
2
|
-
ws;
|
|
3
|
-
listeners = new Map();
|
|
4
|
-
onerror = null;
|
|
5
|
-
constructor(url, _options) {
|
|
6
|
-
this.ws = new globalThis.WebSocket(url);
|
|
7
|
-
this.ws.binaryType = "arraybuffer";
|
|
8
|
-
this.ws.onerror = (ev) => this.onerror?.(ev);
|
|
9
|
-
}
|
|
10
|
-
get readyState() {
|
|
11
|
-
return this.ws.readyState;
|
|
12
|
-
}
|
|
13
|
-
on(event, listener) {
|
|
14
|
-
let wrapped;
|
|
15
|
-
if (event === "message") {
|
|
16
|
-
// Browser WebSocket wraps data in MessageEvent — unwrap to Uint8Array
|
|
17
|
-
wrapped = (ev) => {
|
|
18
|
-
const data = ev.data;
|
|
19
|
-
if (data instanceof ArrayBuffer) {
|
|
20
|
-
listener(new Uint8Array(data));
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
listener(data);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
else if (event === "open" || event === "close" || event === "error") {
|
|
28
|
-
wrapped = () => listener();
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
wrapped = (ev) => listener(ev);
|
|
32
|
-
}
|
|
33
|
-
if (!this.listeners.has(event)) {
|
|
34
|
-
this.listeners.set(event, new Map());
|
|
35
|
-
}
|
|
36
|
-
this.listeners.get(event).set(listener, wrapped);
|
|
37
|
-
this.ws.addEventListener(event, wrapped);
|
|
38
|
-
}
|
|
39
|
-
off(event, listener) {
|
|
40
|
-
const wrapped = this.listeners.get(event)?.get(listener);
|
|
41
|
-
if (wrapped) {
|
|
42
|
-
this.ws.removeEventListener(event, wrapped);
|
|
43
|
-
this.listeners.get(event).delete(listener);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
send(data) {
|
|
47
|
-
this.ws.send(data);
|
|
48
|
-
}
|
|
49
|
-
close() {
|
|
50
|
-
this.ws.close();
|
|
51
|
-
}
|
|
52
|
-
terminate() {
|
|
53
|
-
this.ws.close();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=browser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/transport/browser.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,gBAAgB;IACjB,EAAE,CAAY;IACd,SAAS,GAAG,IAAI,GAAG,EAA4C,CAAC;IACxE,OAAO,GAAgC,IAAI,CAAC;IAE5C,YAAY,GAAW,EAAE,QAAiB;QACtC,IAAI,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC;IAC9B,CAAC;IAED,EAAE,CAAC,KAAa,EAAE,QAAkC;QAChD,IAAI,OAA0B,CAAC;QAE/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,sEAAsE;YACtE,OAAO,GAAG,CAAC,EAAS,EAAE,EAAE;gBACpB,MAAM,IAAI,GAAI,EAAmB,CAAC,IAAI,CAAC;gBACvC,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;oBAC9B,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACJ,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACL,CAAC,CAAC;QACN,CAAC;aAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACpE,OAAO,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,OAAO,GAAG,CAAC,EAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,QAAkC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAc,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,IAAI,CAAC,IAAS;QACV,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,SAAS;QACL,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACJ"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The default host to connect to if none is provided in options.
|
|
3
|
-
*/
|
|
4
|
-
export declare const DEFAULT_HOST = "api.vex.wtf";
|
|
5
|
-
/**
|
|
6
|
-
* The Environment variable to check for a host override (Node.js only).
|
|
7
|
-
*/
|
|
8
|
-
export declare const ENV_HOST_VAR = "VEX_API_HOST";
|
package/dist/utils/constants.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The default host to connect to if none is provided in options.
|
|
3
|
-
*/
|
|
4
|
-
export const DEFAULT_HOST = "api.vex.wtf";
|
|
5
|
-
/**
|
|
6
|
-
* The Environment variable to check for a host override (Node.js only).
|
|
7
|
-
*/
|
|
8
|
-
export const ENV_HOST_VAR = "VEX_API_HOST";
|
|
9
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC"}
|