@dfx.swiss/wallet 0.0.0-stage → 0.1.1-beta.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 +39 -2
- package/dist/config/environment.d.ts +40 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +37 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/derivation/bitcoin-keys.d.ts +20 -0
- package/dist/derivation/bitcoin-keys.d.ts.map +1 -0
- package/dist/derivation/bitcoin-keys.js +50 -0
- package/dist/derivation/bitcoin-keys.js.map +1 -0
- package/dist/derivation/evm-keys.d.ts +8 -0
- package/dist/derivation/evm-keys.d.ts.map +1 -0
- package/dist/derivation/evm-keys.js +32 -0
- package/dist/derivation/evm-keys.js.map +1 -0
- package/dist/derivation/keyring.d.ts +68 -0
- package/dist/derivation/keyring.d.ts.map +1 -0
- package/dist/derivation/keyring.js +150 -0
- package/dist/derivation/keyring.js.map +1 -0
- package/dist/derivation/public-data.d.ts +26 -0
- package/dist/derivation/public-data.d.ts.map +1 -0
- package/dist/derivation/public-data.js +19 -0
- package/dist/derivation/public-data.js.map +1 -0
- package/dist/derivation/seed-check.d.ts +6 -0
- package/dist/derivation/seed-check.d.ts.map +1 -0
- package/dist/derivation/seed-check.js +13 -0
- package/dist/derivation/seed-check.js.map +1 -0
- package/dist/derivation/spark-keys.d.ts +14 -0
- package/dist/derivation/spark-keys.d.ts.map +1 -0
- package/dist/derivation/spark-keys.js +64 -0
- package/dist/derivation/spark-keys.js.map +1 -0
- package/dist/derivation/v1.d.ts +32 -0
- package/dist/derivation/v1.d.ts.map +1 -0
- package/dist/derivation/v1.js +64 -0
- package/dist/derivation/v1.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/passkey/ceremonies.d.ts +91 -0
- package/dist/passkey/ceremonies.d.ts.map +1 -0
- package/dist/passkey/ceremonies.js +250 -0
- package/dist/passkey/ceremonies.js.map +1 -0
- package/dist/passkey/ceremony-gate.d.ts +25 -0
- package/dist/passkey/ceremony-gate.d.ts.map +1 -0
- package/dist/passkey/ceremony-gate.js +45 -0
- package/dist/passkey/ceremony-gate.js.map +1 -0
- package/dist/passkey/credential-cache.d.ts +38 -0
- package/dist/passkey/credential-cache.d.ts.map +1 -0
- package/dist/passkey/credential-cache.js +91 -0
- package/dist/passkey/credential-cache.js.map +1 -0
- package/dist/passkey/diagnostics.d.ts +22 -0
- package/dist/passkey/diagnostics.d.ts.map +1 -0
- package/dist/passkey/diagnostics.js +59 -0
- package/dist/passkey/diagnostics.js.map +1 -0
- package/dist/passkey/errors.d.ts +49 -0
- package/dist/passkey/errors.d.ts.map +1 -0
- package/dist/passkey/errors.js +87 -0
- package/dist/passkey/errors.js.map +1 -0
- package/dist/passkey/platform.d.ts +77 -0
- package/dist/passkey/platform.d.ts.map +1 -0
- package/dist/passkey/platform.js +163 -0
- package/dist/passkey/platform.js.map +1 -0
- package/dist/passkey/webauthn-json.d.ts +35 -0
- package/dist/passkey/webauthn-json.d.ts.map +1 -0
- package/dist/passkey/webauthn-json.js +79 -0
- package/dist/passkey/webauthn-json.js.map +1 -0
- package/dist/providers/blocklist.d.ts +22 -0
- package/dist/providers/blocklist.d.ts.map +1 -0
- package/dist/providers/blocklist.js +51 -0
- package/dist/providers/blocklist.js.map +1 -0
- package/dist/providers/chain-registry.d.ts +26 -0
- package/dist/providers/chain-registry.d.ts.map +1 -0
- package/dist/providers/chain-registry.js +59 -0
- package/dist/providers/chain-registry.js.map +1 -0
- package/dist/providers/dfx-data.d.ts +25 -0
- package/dist/providers/dfx-data.d.ts.map +1 -0
- package/dist/providers/dfx-data.js +44 -0
- package/dist/providers/dfx-data.js.map +1 -0
- package/dist/providers/price.d.ts +34 -0
- package/dist/providers/price.d.ts.map +1 -0
- package/dist/providers/price.js +46 -0
- package/dist/providers/price.js.map +1 -0
- package/dist/providers/snapshot.d.ts +28 -0
- package/dist/providers/snapshot.d.ts.map +1 -0
- package/dist/providers/snapshot.js +2 -0
- package/dist/providers/snapshot.js.map +1 -0
- package/dist/session/idle-lock.d.ts +31 -0
- package/dist/session/idle-lock.d.ts.map +1 -0
- package/dist/session/idle-lock.js +73 -0
- package/dist/session/idle-lock.js.map +1 -0
- package/dist/session/passkey-auth.d.ts +95 -0
- package/dist/session/passkey-auth.d.ts.map +1 -0
- package/dist/session/passkey-auth.js +356 -0
- package/dist/session/passkey-auth.js.map +1 -0
- package/dist/session/tab-lock.d.ts +30 -0
- package/dist/session/tab-lock.d.ts.map +1 -0
- package/dist/session/tab-lock.js +79 -0
- package/dist/session/tab-lock.js.map +1 -0
- package/dist/signing/auto-signer.d.ts +26 -0
- package/dist/signing/auto-signer.d.ts.map +1 -0
- package/dist/signing/auto-signer.js +76 -0
- package/dist/signing/auto-signer.js.map +1 -0
- package/dist/signing/bitcoin-message.d.ts +11 -0
- package/dist/signing/bitcoin-message.d.ts.map +1 -0
- package/dist/signing/bitcoin-message.js +62 -0
- package/dist/signing/bitcoin-message.js.map +1 -0
- package/dist/signing/login-messages.d.ts +15 -0
- package/dist/signing/login-messages.d.ts.map +1 -0
- package/dist/signing/login-messages.js +16 -0
- package/dist/signing/login-messages.js.map +1 -0
- package/dist/signing/login-text-guard.d.ts +3 -0
- package/dist/signing/login-text-guard.d.ts.map +1 -0
- package/dist/signing/login-text-guard.js +13 -0
- package/dist/signing/login-text-guard.js.map +1 -0
- package/dist/signing/spark-login.d.ts +17 -0
- package/dist/signing/spark-login.d.ts.map +1 -0
- package/dist/signing/spark-login.js +51 -0
- package/dist/signing/spark-login.js.map +1 -0
- package/dist/util/bytes.d.ts +11 -0
- package/dist/util/bytes.d.ts.map +1 -0
- package/dist/util/bytes.js +26 -0
- package/dist/util/bytes.js.map +1 -0
- package/dist/util/emitter.d.ts +17 -0
- package/dist/util/emitter.d.ts.map +1 -0
- package/dist/util/emitter.js +53 -0
- package/dist/util/emitter.js.map +1 -0
- package/dist/util/errors.d.ts +12 -0
- package/dist/util/errors.d.ts.map +1 -0
- package/dist/util/errors.js +15 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/jwt.d.ts +6 -0
- package/dist/util/jwt.d.ts.map +1 -0
- package/dist/util/jwt.js +23 -0
- package/dist/util/jwt.js.map +1 -0
- package/dist/util/kv-store.d.ts +51 -0
- package/dist/util/kv-store.d.ts.map +1 -0
- package/dist/util/kv-store.js +133 -0
- package/dist/util/kv-store.js.map +1 -0
- package/dist/util/random.d.ts +3 -0
- package/dist/util/random.d.ts.map +1 -0
- package/dist/util/random.js +18 -0
- package/dist/util/random.js.map +1 -0
- package/package.json +42 -4
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal typed event emitter. A throwing listener neither stops the other listeners nor the emitting code;
|
|
3
|
+
* its error goes to `onListenerError`, by default rethrown asynchronously so that it still surfaces.
|
|
4
|
+
*/
|
|
5
|
+
export class Emitter {
|
|
6
|
+
constructor(onListenerError = rethrowAsync) {
|
|
7
|
+
this.onListenerError = onListenerError;
|
|
8
|
+
this.listeners = new Map();
|
|
9
|
+
}
|
|
10
|
+
/** Registers a listener and returns a function that removes it. */
|
|
11
|
+
on(event, listener) {
|
|
12
|
+
let set = this.listeners.get(event);
|
|
13
|
+
if (!set) {
|
|
14
|
+
set = new Set();
|
|
15
|
+
this.listeners.set(event, set);
|
|
16
|
+
}
|
|
17
|
+
set.add(listener);
|
|
18
|
+
return () => this.off(event, listener);
|
|
19
|
+
}
|
|
20
|
+
off(event, listener) {
|
|
21
|
+
const set = this.listeners.get(event);
|
|
22
|
+
if (!set)
|
|
23
|
+
return;
|
|
24
|
+
set.delete(listener);
|
|
25
|
+
if (set.size === 0)
|
|
26
|
+
this.listeners.delete(event);
|
|
27
|
+
}
|
|
28
|
+
emit(event, payload) {
|
|
29
|
+
const set = this.listeners.get(event);
|
|
30
|
+
if (!set)
|
|
31
|
+
return;
|
|
32
|
+
for (const listener of Array.from(set)) {
|
|
33
|
+
try {
|
|
34
|
+
listener(payload);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
this.onListenerError(error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
listenerCount(event) {
|
|
42
|
+
return this.listeners.get(event)?.size ?? 0;
|
|
43
|
+
}
|
|
44
|
+
removeAllListeners() {
|
|
45
|
+
this.listeners.clear();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function rethrowAsync(error) {
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
throw error;
|
|
51
|
+
}, 0);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/util/emitter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,OAAO;IAGlB,YAA6B,kBAA4C,YAAY;QAAxD,oBAAe,GAAf,eAAe,CAAyC;QAFpE,cAAS,GAAG,IAAI,GAAG,EAAoC,CAAC;IAEe,CAAC;IAEzF,mEAAmE;IACnE,EAAE,CAAyB,KAAQ,EAAE,QAA6B;QAChE,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAyB,KAAQ,EAAE,QAA6B;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrB,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAyB,KAAQ,EAAE,OAAkB;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa,CAAC,KAAmB;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,KAAK,CAAC;IACd,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class of every error the wallet throws. `code` is a stable machine-readable identifier that callers
|
|
3
|
+
* may branch on; `message` is for logs and diagnostics and never contains secrets.
|
|
4
|
+
*/
|
|
5
|
+
export declare class WalletError extends Error {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
constructor(code: string, message?: string, options?: {
|
|
8
|
+
cause?: unknown;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export declare function isWalletError(error: unknown, code?: string): error is WalletError;
|
|
12
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/util/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAEjF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class of every error the wallet throws. `code` is a stable machine-readable identifier that callers
|
|
3
|
+
* may branch on; `message` is for logs and diagnostics and never contains secrets.
|
|
4
|
+
*/
|
|
5
|
+
export class WalletError extends Error {
|
|
6
|
+
constructor(code, message, options) {
|
|
7
|
+
super(message ?? code, options);
|
|
8
|
+
this.name = new.target.name;
|
|
9
|
+
this.code = code;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function isWalletError(error, code) {
|
|
13
|
+
return error instanceof WalletError && (code === undefined || error.code === code);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/util/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGpC,YAAY,IAAY,EAAE,OAAgB,EAAE,OAA6B;QACvE,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,IAAa;IACzD,OAAO,KAAK,YAAY,WAAW,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decodes the payload of a JWT without verifying it. The wallet only reads claims of tokens it received from
|
|
3
|
+
* the DFX API over TLS (e.g. expiry, account, passkey credential); it never trusts them for key decisions.
|
|
4
|
+
*/
|
|
5
|
+
export declare function decodeJwtPayload<T extends object = Record<string, unknown>>(token: string): T;
|
|
6
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/util/jwt.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAe7F"}
|
package/dist/util/jwt.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { base64UrlDecode, bytesToUtf8 } from './bytes';
|
|
2
|
+
import { WalletError } from './errors';
|
|
3
|
+
/**
|
|
4
|
+
* Decodes the payload of a JWT without verifying it. The wallet only reads claims of tokens it received from
|
|
5
|
+
* the DFX API over TLS (e.g. expiry, account, passkey credential); it never trusts them for key decisions.
|
|
6
|
+
*/
|
|
7
|
+
export function decodeJwtPayload(token) {
|
|
8
|
+
const parts = token.split('.');
|
|
9
|
+
if (parts.length !== 3 || !parts[1])
|
|
10
|
+
throw new WalletError('invalid-jwt', 'Malformed JWT');
|
|
11
|
+
let payload;
|
|
12
|
+
try {
|
|
13
|
+
payload = JSON.parse(bytesToUtf8(base64UrlDecode(parts[1])));
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
throw new WalletError('invalid-jwt', 'Malformed JWT payload', { cause: error });
|
|
17
|
+
}
|
|
18
|
+
if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
|
|
19
|
+
throw new WalletError('invalid-jwt', 'JWT payload is not an object');
|
|
20
|
+
}
|
|
21
|
+
return payload;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/util/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAA6C,KAAa;IACxF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAE3F,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC,aAAa,EAAE,uBAAuB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,WAAW,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,OAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent key-value storage for local wallet data (never secrets). Entries are grouped in namespaces, e.g.
|
|
3
|
+
* one per wallet and data kind, so several wallets on one device stay separated. Values must be
|
|
4
|
+
* structured-cloneable; they are stored and returned as copies.
|
|
5
|
+
*/
|
|
6
|
+
export interface KeyValueStore {
|
|
7
|
+
get<T = unknown>(namespace: string, key: string): Promise<T | undefined>;
|
|
8
|
+
set(namespace: string, key: string, value: unknown): Promise<void>;
|
|
9
|
+
delete(namespace: string, key: string): Promise<void>;
|
|
10
|
+
/** Keys of a namespace in ascending order. */
|
|
11
|
+
keys(namespace: string): Promise<string[]>;
|
|
12
|
+
/** Removes every entry of a namespace. */
|
|
13
|
+
clear(namespace: string): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare const WALLET_DB_NAME = "dfx-wallet";
|
|
16
|
+
/** In-memory store for tests, server-side rendering and browsers without IndexedDB. */
|
|
17
|
+
export declare class MemoryKeyValueStore implements KeyValueStore {
|
|
18
|
+
private readonly data;
|
|
19
|
+
get<T = unknown>(namespace: string, key: string): Promise<T | undefined>;
|
|
20
|
+
set(namespace: string, key: string, value: unknown): Promise<void>;
|
|
21
|
+
delete(namespace: string, key: string): Promise<void>;
|
|
22
|
+
keys(namespace: string): Promise<string[]>;
|
|
23
|
+
clear(namespace: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export interface IndexedDbKeyValueStoreOptions {
|
|
26
|
+
/** Database name, default `dfx-wallet`. */
|
|
27
|
+
name?: string;
|
|
28
|
+
/** IndexedDB implementation, default `globalThis.indexedDB`. */
|
|
29
|
+
indexedDB?: IDBFactory;
|
|
30
|
+
/** Key range constructor of the same implementation, default `globalThis.IDBKeyRange`. */
|
|
31
|
+
keyRange?: typeof IDBKeyRange;
|
|
32
|
+
}
|
|
33
|
+
/** IndexedDB store: one object store with compound keys `[namespace, key]`. */
|
|
34
|
+
export declare class IndexedDbKeyValueStore implements KeyValueStore {
|
|
35
|
+
private readonly name;
|
|
36
|
+
private readonly factory?;
|
|
37
|
+
private readonly keyRange?;
|
|
38
|
+
private db?;
|
|
39
|
+
constructor(options?: IndexedDbKeyValueStoreOptions);
|
|
40
|
+
get<T = unknown>(namespace: string, key: string): Promise<T | undefined>;
|
|
41
|
+
set(namespace: string, key: string, value: unknown): Promise<void>;
|
|
42
|
+
delete(namespace: string, key: string): Promise<void>;
|
|
43
|
+
keys(namespace: string): Promise<string[]>;
|
|
44
|
+
clear(namespace: string): Promise<void>;
|
|
45
|
+
private namespaceRange;
|
|
46
|
+
private open;
|
|
47
|
+
private run;
|
|
48
|
+
}
|
|
49
|
+
/** IndexedDB store when the platform has IndexedDB, otherwise an in-memory store. */
|
|
50
|
+
export declare function createDefaultKeyValueStore(): KeyValueStore;
|
|
51
|
+
//# sourceMappingURL=kv-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv-store.d.ts","sourceRoot":"","sources":["../../src/util/kv-store.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACzE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,8CAA8C;IAC9C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,0CAA0C;IAC1C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,eAAO,MAAM,cAAc,eAAe,CAAC;AAK3C,uFAAuF;AACvF,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2C;IAE1D,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAMxE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK1C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI9C;AAED,MAAM,WAAW,6BAA6B;IAC5C,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,OAAO,WAAW,CAAC;CAC/B;AAED,+EAA+E;AAC/E,qBAAa,sBAAuB,YAAW,aAAa;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAqB;IAC/C,OAAO,CAAC,EAAE,CAAC,CAAuB;gBAEtB,OAAO,GAAE,6BAAkC;IAMjD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKxE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAO1C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,IAAI;YA+BE,GAAG;CAclB;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,IAAI,aAAa,CAE1D"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { WalletError } from './errors';
|
|
2
|
+
export const WALLET_DB_NAME = 'dfx-wallet';
|
|
3
|
+
const DB_VERSION = 1;
|
|
4
|
+
const OBJECT_STORE = 'kv';
|
|
5
|
+
/** In-memory store for tests, server-side rendering and browsers without IndexedDB. */
|
|
6
|
+
export class MemoryKeyValueStore {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.data = new Map();
|
|
9
|
+
}
|
|
10
|
+
async get(namespace, key) {
|
|
11
|
+
checkKey(namespace, key);
|
|
12
|
+
const entries = this.data.get(namespace);
|
|
13
|
+
return entries?.has(key) ? structuredClone(entries.get(key)) : undefined;
|
|
14
|
+
}
|
|
15
|
+
async set(namespace, key, value) {
|
|
16
|
+
checkKey(namespace, key);
|
|
17
|
+
const copy = structuredClone(value);
|
|
18
|
+
let entries = this.data.get(namespace);
|
|
19
|
+
if (!entries) {
|
|
20
|
+
entries = new Map();
|
|
21
|
+
this.data.set(namespace, entries);
|
|
22
|
+
}
|
|
23
|
+
entries.set(key, copy);
|
|
24
|
+
}
|
|
25
|
+
async delete(namespace, key) {
|
|
26
|
+
checkKey(namespace, key);
|
|
27
|
+
const entries = this.data.get(namespace);
|
|
28
|
+
entries?.delete(key);
|
|
29
|
+
if (entries?.size === 0)
|
|
30
|
+
this.data.delete(namespace);
|
|
31
|
+
}
|
|
32
|
+
async keys(namespace) {
|
|
33
|
+
checkNamespace(namespace);
|
|
34
|
+
return Array.from(this.data.get(namespace)?.keys() ?? []).sort();
|
|
35
|
+
}
|
|
36
|
+
async clear(namespace) {
|
|
37
|
+
checkNamespace(namespace);
|
|
38
|
+
this.data.delete(namespace);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** IndexedDB store: one object store with compound keys `[namespace, key]`. */
|
|
42
|
+
export class IndexedDbKeyValueStore {
|
|
43
|
+
constructor(options = {}) {
|
|
44
|
+
this.name = options.name ?? WALLET_DB_NAME;
|
|
45
|
+
this.factory = options.indexedDB ?? globalThis.indexedDB;
|
|
46
|
+
this.keyRange = options.keyRange ?? globalThis.IDBKeyRange;
|
|
47
|
+
}
|
|
48
|
+
async get(namespace, key) {
|
|
49
|
+
checkKey(namespace, key);
|
|
50
|
+
return (await this.run('readonly', (store) => store.get([namespace, key])));
|
|
51
|
+
}
|
|
52
|
+
async set(namespace, key, value) {
|
|
53
|
+
checkKey(namespace, key);
|
|
54
|
+
await this.run('readwrite', (store) => store.put(value, [namespace, key]));
|
|
55
|
+
}
|
|
56
|
+
async delete(namespace, key) {
|
|
57
|
+
checkKey(namespace, key);
|
|
58
|
+
await this.run('readwrite', (store) => store.delete([namespace, key]));
|
|
59
|
+
}
|
|
60
|
+
async keys(namespace) {
|
|
61
|
+
checkNamespace(namespace);
|
|
62
|
+
const range = this.namespaceRange(namespace);
|
|
63
|
+
const keys = await this.run('readonly', (store) => store.getAllKeys(range));
|
|
64
|
+
return keys.map((compound) => compound[1]);
|
|
65
|
+
}
|
|
66
|
+
async clear(namespace) {
|
|
67
|
+
checkNamespace(namespace);
|
|
68
|
+
const range = this.namespaceRange(namespace);
|
|
69
|
+
await this.run('readwrite', (store) => store.delete(range));
|
|
70
|
+
}
|
|
71
|
+
// [namespace] sorts before every [namespace, key], and an array sorts after every string, so
|
|
72
|
+
// [namespace, []] is an upper bound for all string keys of the namespace.
|
|
73
|
+
namespaceRange(namespace) {
|
|
74
|
+
if (!this.keyRange)
|
|
75
|
+
throw new WalletError('storage-unavailable', 'IDBKeyRange is not available');
|
|
76
|
+
return this.keyRange.bound([namespace], [namespace, []]);
|
|
77
|
+
}
|
|
78
|
+
open() {
|
|
79
|
+
if (!this.db) {
|
|
80
|
+
const factory = this.factory;
|
|
81
|
+
const db = new Promise((resolve, reject) => {
|
|
82
|
+
if (!factory)
|
|
83
|
+
throw new WalletError('storage-unavailable', 'IndexedDB is not available');
|
|
84
|
+
const request = factory.open(this.name, DB_VERSION);
|
|
85
|
+
request.onupgradeneeded = () => {
|
|
86
|
+
if (!request.result.objectStoreNames.contains(OBJECT_STORE))
|
|
87
|
+
request.result.createObjectStore(OBJECT_STORE);
|
|
88
|
+
};
|
|
89
|
+
request.onsuccess = () => {
|
|
90
|
+
const opened = request.result;
|
|
91
|
+
// Let a newer version in another tab upgrade the database; the next call reopens it.
|
|
92
|
+
opened.onversionchange = () => {
|
|
93
|
+
opened.close();
|
|
94
|
+
this.db = undefined;
|
|
95
|
+
};
|
|
96
|
+
resolve(opened);
|
|
97
|
+
};
|
|
98
|
+
request.onerror = () => reject(new WalletError('storage-unavailable', 'IndexedDB could not be opened', { cause: request.error }));
|
|
99
|
+
});
|
|
100
|
+
// A failed open is retried on the next call.
|
|
101
|
+
db.catch(() => {
|
|
102
|
+
if (this.db === db)
|
|
103
|
+
this.db = undefined;
|
|
104
|
+
});
|
|
105
|
+
this.db = db;
|
|
106
|
+
}
|
|
107
|
+
return this.db;
|
|
108
|
+
}
|
|
109
|
+
async run(mode, operation) {
|
|
110
|
+
const db = await this.open();
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
const transaction = db.transaction(OBJECT_STORE, mode);
|
|
113
|
+
const request = operation(transaction.objectStore(OBJECT_STORE));
|
|
114
|
+
transaction.oncomplete = () => resolve(request.result);
|
|
115
|
+
transaction.onerror = () => reject(new WalletError('storage-failed', 'IndexedDB request failed', { cause: request.error ?? transaction.error }));
|
|
116
|
+
transaction.onabort = () => reject(new WalletError('storage-failed', 'IndexedDB transaction aborted', { cause: transaction.error }));
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** IndexedDB store when the platform has IndexedDB, otherwise an in-memory store. */
|
|
121
|
+
export function createDefaultKeyValueStore() {
|
|
122
|
+
return typeof globalThis.indexedDB !== 'undefined' ? new IndexedDbKeyValueStore() : new MemoryKeyValueStore();
|
|
123
|
+
}
|
|
124
|
+
function checkNamespace(namespace) {
|
|
125
|
+
if (typeof namespace !== 'string' || !namespace)
|
|
126
|
+
throw new WalletError('invalid-storage-key', 'Empty namespace');
|
|
127
|
+
}
|
|
128
|
+
function checkKey(namespace, key) {
|
|
129
|
+
checkNamespace(namespace);
|
|
130
|
+
if (typeof key !== 'string')
|
|
131
|
+
throw new WalletError('invalid-storage-key', 'Key must be a string');
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=kv-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv-store.js","sourceRoot":"","sources":["../../src/util/kv-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/util/random.ts"],"names":[],"mappings":"AAKA,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAatD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { WalletError } from './errors';
|
|
2
|
+
// crypto.getRandomValues fills at most 65536 bytes per call.
|
|
3
|
+
const MAX_CHUNK = 65536;
|
|
4
|
+
/** Cryptographically secure random bytes from the platform CSPRNG (Web Crypto). */
|
|
5
|
+
export function randomBytes(length) {
|
|
6
|
+
if (!Number.isSafeInteger(length) || length < 0)
|
|
7
|
+
throw new RangeError(`Invalid random byte length: ${length}`);
|
|
8
|
+
const crypto = globalThis.crypto;
|
|
9
|
+
if (typeof crypto?.getRandomValues !== 'function') {
|
|
10
|
+
throw new WalletError('csprng-unavailable', 'crypto.getRandomValues is not available');
|
|
11
|
+
}
|
|
12
|
+
const bytes = new Uint8Array(length);
|
|
13
|
+
for (let offset = 0; offset < length; offset += MAX_CHUNK) {
|
|
14
|
+
crypto.getRandomValues(bytes.subarray(offset, Math.min(offset + MAX_CHUNK, length)));
|
|
15
|
+
}
|
|
16
|
+
return bytes;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/util/random.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,6DAA6D;AAC7D,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAE/G,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACjC,IAAI,OAAO,MAAM,EAAE,eAAe,KAAK,UAAU,EAAE,CAAC;QAClD,MAAM,IAAI,WAAW,CAAC,oBAAoB,EAAE,yCAAyC,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;QAC1D,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,44 @@
|
|
|
1
1
|
{
|
|
2
|
+
"private": false,
|
|
2
3
|
"name": "@dfx.swiss/wallet",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
4
|
+
"version": "0.1.1-beta.0",
|
|
5
|
+
"description": "Self-custodial passkey seed wallet core for the DFX.swiss app (Bitcoin, EVM, Spark)",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/DFXswiss/packages.git"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"main": "dist/index.js",
|
|
15
|
+
"types": "dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -b ./tsconfig.build.json",
|
|
22
|
+
"clean": "rm -rf ./dist/ && rm -rf ./tsconfig.build.tsbuildinfo",
|
|
23
|
+
"test": "jest",
|
|
24
|
+
"lint": "eslint src --ext .ts",
|
|
25
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
26
|
+
"format": "prettier --write src",
|
|
27
|
+
"format:check": "prettier --check src",
|
|
28
|
+
"pack": "npm pack"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@dfx.swiss/core": "^0.7.6-beta.0",
|
|
32
|
+
"@noble/curves": "~1.9.1",
|
|
33
|
+
"@noble/hashes": "~1.8.0",
|
|
34
|
+
"@scure/base": "~1.2.5",
|
|
35
|
+
"@scure/bip32": "1.7.0",
|
|
36
|
+
"@scure/bip39": "1.6.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/jest": "^29.5.14",
|
|
40
|
+
"jest": "^29.7.0",
|
|
41
|
+
"ts-jest": "^29.4.9",
|
|
42
|
+
"typescript": "^5.7.0"
|
|
43
|
+
}
|
|
44
|
+
}
|