@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.
Files changed (142) hide show
  1. package/README.md +39 -2
  2. package/dist/config/environment.d.ts +40 -0
  3. package/dist/config/environment.d.ts.map +1 -0
  4. package/dist/config/environment.js +37 -0
  5. package/dist/config/environment.js.map +1 -0
  6. package/dist/derivation/bitcoin-keys.d.ts +20 -0
  7. package/dist/derivation/bitcoin-keys.d.ts.map +1 -0
  8. package/dist/derivation/bitcoin-keys.js +50 -0
  9. package/dist/derivation/bitcoin-keys.js.map +1 -0
  10. package/dist/derivation/evm-keys.d.ts +8 -0
  11. package/dist/derivation/evm-keys.d.ts.map +1 -0
  12. package/dist/derivation/evm-keys.js +32 -0
  13. package/dist/derivation/evm-keys.js.map +1 -0
  14. package/dist/derivation/keyring.d.ts +68 -0
  15. package/dist/derivation/keyring.d.ts.map +1 -0
  16. package/dist/derivation/keyring.js +150 -0
  17. package/dist/derivation/keyring.js.map +1 -0
  18. package/dist/derivation/public-data.d.ts +26 -0
  19. package/dist/derivation/public-data.d.ts.map +1 -0
  20. package/dist/derivation/public-data.js +19 -0
  21. package/dist/derivation/public-data.js.map +1 -0
  22. package/dist/derivation/seed-check.d.ts +6 -0
  23. package/dist/derivation/seed-check.d.ts.map +1 -0
  24. package/dist/derivation/seed-check.js +13 -0
  25. package/dist/derivation/seed-check.js.map +1 -0
  26. package/dist/derivation/spark-keys.d.ts +14 -0
  27. package/dist/derivation/spark-keys.d.ts.map +1 -0
  28. package/dist/derivation/spark-keys.js +64 -0
  29. package/dist/derivation/spark-keys.js.map +1 -0
  30. package/dist/derivation/v1.d.ts +32 -0
  31. package/dist/derivation/v1.d.ts.map +1 -0
  32. package/dist/derivation/v1.js +64 -0
  33. package/dist/derivation/v1.js.map +1 -0
  34. package/dist/index.d.ts +46 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +36 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/passkey/ceremonies.d.ts +91 -0
  39. package/dist/passkey/ceremonies.d.ts.map +1 -0
  40. package/dist/passkey/ceremonies.js +250 -0
  41. package/dist/passkey/ceremonies.js.map +1 -0
  42. package/dist/passkey/ceremony-gate.d.ts +25 -0
  43. package/dist/passkey/ceremony-gate.d.ts.map +1 -0
  44. package/dist/passkey/ceremony-gate.js +45 -0
  45. package/dist/passkey/ceremony-gate.js.map +1 -0
  46. package/dist/passkey/credential-cache.d.ts +38 -0
  47. package/dist/passkey/credential-cache.d.ts.map +1 -0
  48. package/dist/passkey/credential-cache.js +91 -0
  49. package/dist/passkey/credential-cache.js.map +1 -0
  50. package/dist/passkey/diagnostics.d.ts +22 -0
  51. package/dist/passkey/diagnostics.d.ts.map +1 -0
  52. package/dist/passkey/diagnostics.js +59 -0
  53. package/dist/passkey/diagnostics.js.map +1 -0
  54. package/dist/passkey/errors.d.ts +49 -0
  55. package/dist/passkey/errors.d.ts.map +1 -0
  56. package/dist/passkey/errors.js +87 -0
  57. package/dist/passkey/errors.js.map +1 -0
  58. package/dist/passkey/platform.d.ts +77 -0
  59. package/dist/passkey/platform.d.ts.map +1 -0
  60. package/dist/passkey/platform.js +163 -0
  61. package/dist/passkey/platform.js.map +1 -0
  62. package/dist/passkey/webauthn-json.d.ts +35 -0
  63. package/dist/passkey/webauthn-json.d.ts.map +1 -0
  64. package/dist/passkey/webauthn-json.js +79 -0
  65. package/dist/passkey/webauthn-json.js.map +1 -0
  66. package/dist/providers/blocklist.d.ts +22 -0
  67. package/dist/providers/blocklist.d.ts.map +1 -0
  68. package/dist/providers/blocklist.js +51 -0
  69. package/dist/providers/blocklist.js.map +1 -0
  70. package/dist/providers/chain-registry.d.ts +26 -0
  71. package/dist/providers/chain-registry.d.ts.map +1 -0
  72. package/dist/providers/chain-registry.js +59 -0
  73. package/dist/providers/chain-registry.js.map +1 -0
  74. package/dist/providers/dfx-data.d.ts +25 -0
  75. package/dist/providers/dfx-data.d.ts.map +1 -0
  76. package/dist/providers/dfx-data.js +44 -0
  77. package/dist/providers/dfx-data.js.map +1 -0
  78. package/dist/providers/price.d.ts +34 -0
  79. package/dist/providers/price.d.ts.map +1 -0
  80. package/dist/providers/price.js +46 -0
  81. package/dist/providers/price.js.map +1 -0
  82. package/dist/providers/snapshot.d.ts +28 -0
  83. package/dist/providers/snapshot.d.ts.map +1 -0
  84. package/dist/providers/snapshot.js +2 -0
  85. package/dist/providers/snapshot.js.map +1 -0
  86. package/dist/session/idle-lock.d.ts +31 -0
  87. package/dist/session/idle-lock.d.ts.map +1 -0
  88. package/dist/session/idle-lock.js +73 -0
  89. package/dist/session/idle-lock.js.map +1 -0
  90. package/dist/session/passkey-auth.d.ts +95 -0
  91. package/dist/session/passkey-auth.d.ts.map +1 -0
  92. package/dist/session/passkey-auth.js +356 -0
  93. package/dist/session/passkey-auth.js.map +1 -0
  94. package/dist/session/tab-lock.d.ts +30 -0
  95. package/dist/session/tab-lock.d.ts.map +1 -0
  96. package/dist/session/tab-lock.js +79 -0
  97. package/dist/session/tab-lock.js.map +1 -0
  98. package/dist/signing/auto-signer.d.ts +26 -0
  99. package/dist/signing/auto-signer.d.ts.map +1 -0
  100. package/dist/signing/auto-signer.js +76 -0
  101. package/dist/signing/auto-signer.js.map +1 -0
  102. package/dist/signing/bitcoin-message.d.ts +11 -0
  103. package/dist/signing/bitcoin-message.d.ts.map +1 -0
  104. package/dist/signing/bitcoin-message.js +62 -0
  105. package/dist/signing/bitcoin-message.js.map +1 -0
  106. package/dist/signing/login-messages.d.ts +15 -0
  107. package/dist/signing/login-messages.d.ts.map +1 -0
  108. package/dist/signing/login-messages.js +16 -0
  109. package/dist/signing/login-messages.js.map +1 -0
  110. package/dist/signing/login-text-guard.d.ts +3 -0
  111. package/dist/signing/login-text-guard.d.ts.map +1 -0
  112. package/dist/signing/login-text-guard.js +13 -0
  113. package/dist/signing/login-text-guard.js.map +1 -0
  114. package/dist/signing/spark-login.d.ts +17 -0
  115. package/dist/signing/spark-login.d.ts.map +1 -0
  116. package/dist/signing/spark-login.js +51 -0
  117. package/dist/signing/spark-login.js.map +1 -0
  118. package/dist/util/bytes.d.ts +11 -0
  119. package/dist/util/bytes.d.ts.map +1 -0
  120. package/dist/util/bytes.js +26 -0
  121. package/dist/util/bytes.js.map +1 -0
  122. package/dist/util/emitter.d.ts +17 -0
  123. package/dist/util/emitter.d.ts.map +1 -0
  124. package/dist/util/emitter.js +53 -0
  125. package/dist/util/emitter.js.map +1 -0
  126. package/dist/util/errors.d.ts +12 -0
  127. package/dist/util/errors.d.ts.map +1 -0
  128. package/dist/util/errors.js +15 -0
  129. package/dist/util/errors.js.map +1 -0
  130. package/dist/util/jwt.d.ts +6 -0
  131. package/dist/util/jwt.d.ts.map +1 -0
  132. package/dist/util/jwt.js +23 -0
  133. package/dist/util/jwt.js.map +1 -0
  134. package/dist/util/kv-store.d.ts +51 -0
  135. package/dist/util/kv-store.d.ts.map +1 -0
  136. package/dist/util/kv-store.js +133 -0
  137. package/dist/util/kv-store.js.map +1 -0
  138. package/dist/util/random.d.ts +3 -0
  139. package/dist/util/random.d.ts.map +1 -0
  140. package/dist/util/random.js +18 -0
  141. package/dist/util/random.js.map +1 -0
  142. package/package.json +42 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkey-auth.js","sourceRoot":"","sources":["../../src/session/passkey-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** Web Locks surface the wallet needs (browsers and fakes in tests). */
2
+ export interface LockManagerLike {
3
+ request(name: string, options: {
4
+ mode?: string;
5
+ ifAvailable?: boolean;
6
+ steal?: boolean;
7
+ }, callback: (lock: unknown) => Promise<void>): Promise<undefined | 'acquired'>;
8
+ }
9
+ /**
10
+ * Whether this tab owns the wallet (X24): one open wallet per browser, "use here" steals the lock. The
11
+ * lock is held from inside the request callback; a stolen lock rejects the request and informs the
12
+ * `onLost` handlers, exactly like the Web Locks API.
13
+ */
14
+ export declare class TabLock {
15
+ private readonly locks;
16
+ private readonly name;
17
+ private held;
18
+ private lostHandlers;
19
+ private releaseResolver?;
20
+ constructor(locks?: LockManagerLike | undefined, name?: string);
21
+ get isHeld(): boolean;
22
+ /** Acquires the lock when free; never waits. */
23
+ acquire(): Promise<'acquired' | 'busy'>;
24
+ /** "Use here": takes the lock from the other tab; the loser is informed through `onLost`. */
25
+ takeOver(): void;
26
+ onLost(callback: () => void): void;
27
+ release(): void;
28
+ private onStolen;
29
+ }
30
+ //# sourceMappingURL=tab-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-lock.d.ts","sourceRoot":"","sources":["../../src/session/tab-lock.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAClE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GACzC,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;CACpC;AAED;;;;GAIG;AACH,qBAAa,OAAO;IAMhB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAGtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IARvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,eAAe,CAAC,CAAa;gBAGlB,KAAK,GAAE,eAAe,GAAG,SAElC,EACS,IAAI,SAAe;IAGtC,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,gDAAgD;IAChD,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;IA+BvC,6FAA6F;IAC7F,QAAQ,IAAI,IAAI;IAmBhB,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,QAAQ;CAIjB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Whether this tab owns the wallet (X24): one open wallet per browser, "use here" steals the lock. The
3
+ * lock is held from inside the request callback; a stolen lock rejects the request and informs the
4
+ * `onLost` handlers, exactly like the Web Locks API.
5
+ */
6
+ export class TabLock {
7
+ constructor(locks = globalThis.navigator?.locks, name = 'dfx-wallet') {
8
+ this.locks = locks;
9
+ this.name = name;
10
+ this.held = false;
11
+ this.lostHandlers = [];
12
+ }
13
+ get isHeld() {
14
+ return this.held;
15
+ }
16
+ /** Acquires the lock when free; never waits. */
17
+ acquire() {
18
+ const locks = this.locks;
19
+ if (!locks) {
20
+ this.held = true;
21
+ return Promise.resolve('acquired');
22
+ }
23
+ return new Promise((resolve) => {
24
+ let settled = false;
25
+ const finish = (result) => {
26
+ if (!settled) {
27
+ settled = true;
28
+ resolve(result);
29
+ }
30
+ };
31
+ void locks
32
+ .request(this.name, { ifAvailable: true }, async (lock) => {
33
+ if (lock == null) {
34
+ finish('busy');
35
+ return;
36
+ }
37
+ this.held = true;
38
+ finish('acquired');
39
+ await new Promise((resolveRelease) => (this.releaseResolver = resolveRelease));
40
+ this.held = false;
41
+ })
42
+ .catch(() => this.onStolen())
43
+ .finally(() => finish(this.held ? 'acquired' : 'busy'));
44
+ });
45
+ }
46
+ /** "Use here": takes the lock from the other tab; the loser is informed through `onLost`. */
47
+ takeOver() {
48
+ if (!this.locks) {
49
+ this.held = true;
50
+ return;
51
+ }
52
+ const locks = this.locks;
53
+ if (!locks) {
54
+ this.held = true;
55
+ return;
56
+ }
57
+ void locks
58
+ .request(this.name, { steal: true }, async () => {
59
+ this.held = true;
60
+ await new Promise((resolveRelease) => (this.releaseResolver = resolveRelease));
61
+ this.held = false;
62
+ })
63
+ .catch(() => this.onStolen());
64
+ }
65
+ onLost(callback) {
66
+ this.lostHandlers.push(callback);
67
+ }
68
+ release() {
69
+ this.held = false;
70
+ this.releaseResolver?.();
71
+ this.releaseResolver = undefined;
72
+ }
73
+ onStolen() {
74
+ this.held = false;
75
+ for (const handler of this.lostHandlers)
76
+ handler();
77
+ }
78
+ }
79
+ //# sourceMappingURL=tab-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-lock.js","sourceRoot":"","sources":["../../src/session/tab-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { WalletEnv } from '../config/environment';
2
+ import { KeyRing } from '../derivation/keyring';
3
+ import { WalletError } from '../util/errors';
4
+ /** The server message did not exactly match the DFX login text of this address — never signed. */
5
+ export declare class LoginMessageMismatchError extends WalletError {
6
+ constructor(detail: string);
7
+ }
8
+ /** EIP-191 personal_sign hash of the message. */
9
+ export declare function eip191MessageHash(message: string): Uint8Array;
10
+ /** EIP-191 signature as the DFX API expects it: 0x-prefixed lowercase hex r‖s‖v, v = 27 + recovery id. */
11
+ export declare function signEip191(message: string, privateKey: Uint8Array): string;
12
+ /**
13
+ * The only silent signer of the wallet (§8.5): signs exactly the DFX login text of one of the wallet's own
14
+ * addresses — EVM EIP-191, Bitcoin BIP-137 P2WPKH, Spark D31 — and refuses every other message byte-for-byte,
15
+ * so a malicious server text can never be signed under the login pretext.
16
+ */
17
+ export declare class LoginAutoSigner {
18
+ private readonly keys;
19
+ private readonly env;
20
+ constructor(keys: KeyRing, env: WalletEnv);
21
+ sign(family: 'evm' | 'bitcoin' | 'spark', address: string, serverMessage: string): string;
22
+ private signEvm;
23
+ private signBitcoin;
24
+ private signSpark;
25
+ }
26
+ //# sourceMappingURL=auto-signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-signer.d.ts","sourceRoot":"","sources":["../../src/signing/auto-signer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAkB,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK7C,kGAAkG;AAClG,qBAAa,yBAA0B,SAAQ,WAAW;gBAC5C,MAAM,EAAE,MAAM;CAG3B;AAOD,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAG7D;AAED,0GAA0G;AAC1G,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAG1E;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBADH,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,SAAS;IAGjC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM;IAoBzF,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,SAAS;CAMlB"}
@@ -0,0 +1,76 @@
1
+ import { secp256k1 } from '@noble/curves/secp256k1';
2
+ import { keccak_256 } from '@noble/hashes/sha3';
3
+ import { withPrivateKey } from '../derivation/keyring';
4
+ import { bytesToHex, concatBytes, utf8ToBytes } from '../util/bytes';
5
+ import { WalletError } from '../util/errors';
6
+ import { buildLoginMessage } from './login-messages';
7
+ import { signBitcoinMessageBip137 } from './bitcoin-message';
8
+ import { signSparkLogin } from './spark-login';
9
+ /** The server message did not exactly match the DFX login text of this address — never signed. */
10
+ export class LoginMessageMismatchError extends WalletError {
11
+ constructor(detail) {
12
+ super('login-message-mismatch', `Refusing to sign: ${detail}`);
13
+ }
14
+ }
15
+ /** How many EVM accounts are scanned when matching a login address (the wallet uses index 0 by default). */
16
+ const EVM_ADDRESS_SCAN = 100;
17
+ const EIP_191_PREFIX = 'Ethereum Signed Message:\n';
18
+ /** EIP-191 personal_sign hash of the message. */
19
+ export function eip191MessageHash(message) {
20
+ const content = utf8ToBytes(message);
21
+ return keccak_256(concatBytes(utf8ToBytes(`\x19${EIP_191_PREFIX}${content.length}`), content));
22
+ }
23
+ /** EIP-191 signature as the DFX API expects it: 0x-prefixed lowercase hex r‖s‖v, v = 27 + recovery id. */
24
+ export function signEip191(message, privateKey) {
25
+ const signature = secp256k1.sign(eip191MessageHash(message), privateKey);
26
+ return `0x${bytesToHex(concatBytes(signature.toBytes('compact'), new Uint8Array([27 + signature.recovery])))}`;
27
+ }
28
+ /**
29
+ * The only silent signer of the wallet (§8.5): signs exactly the DFX login text of one of the wallet's own
30
+ * addresses — EVM EIP-191, Bitcoin BIP-137 P2WPKH, Spark D31 — and refuses every other message byte-for-byte,
31
+ * so a malicious server text can never be signed under the login pretext.
32
+ */
33
+ export class LoginAutoSigner {
34
+ constructor(keys, env) {
35
+ this.keys = keys;
36
+ this.env = env;
37
+ }
38
+ sign(family, address, serverMessage) {
39
+ const expected = buildLoginMessage(this.env, address);
40
+ if (serverMessage !== expected) {
41
+ throw new LoginMessageMismatchError(`the server message is not the ${this.env} login text of ${address} (expected ${JSON.stringify(expected)})`);
42
+ }
43
+ switch (family) {
44
+ case 'evm':
45
+ return this.signEvm(address, serverMessage);
46
+ case 'bitcoin':
47
+ return this.signBitcoin(address, serverMessage);
48
+ case 'spark':
49
+ return this.signSpark(address, serverMessage);
50
+ default:
51
+ throw new LoginMessageMismatchError(`unknown login family ${String(family)}`);
52
+ }
53
+ }
54
+ signEvm(address, message) {
55
+ for (let index = 0; index < EVM_ADDRESS_SCAN; index++) {
56
+ if (this.keys.evm(index).address.toLowerCase() === address.toLowerCase()) {
57
+ return withPrivateKey(this.keys, { family: 'evm', index }, (privateKey) => signEip191(message, privateKey));
58
+ }
59
+ }
60
+ throw new LoginMessageMismatchError(`${address} is not an EVM address of this wallet`);
61
+ }
62
+ signBitcoin(address, message) {
63
+ // The Bitcoin login address is receive chain 0, index 0 of the wallet's network.
64
+ if (this.keys.bitcoinAddress(0, 0).address !== address) {
65
+ throw new LoginMessageMismatchError(`${address} is not the Bitcoin login address of this wallet`);
66
+ }
67
+ return withPrivateKey(this.keys, { family: 'bitcoin', chain: 0, index: 0 }, (privateKey) => signBitcoinMessageBip137(message, privateKey));
68
+ }
69
+ signSpark(address, message) {
70
+ if (this.keys.sparkIdentity().address !== address) {
71
+ throw new LoginMessageMismatchError(`${address} is not the Spark address of this wallet`);
72
+ }
73
+ return withPrivateKey(this.keys, { family: 'spark' }, (privateKey) => signSparkLogin(message, privateKey));
74
+ }
75
+ }
76
+ //# sourceMappingURL=auto-signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-signer.js","sourceRoot":"","sources":["../../src/signing/auto-signer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { BitcoinNetwork } from '../config/environment';
2
+ /** BIP-137 magic hash: double SHA-256 over varint-length prefix and message. */
3
+ export declare function bitcoinMessageMagicHash(message: string): Uint8Array;
4
+ /** Signs the message with a private key (called through `withPrivateKey`); base64, header 39..42. */
5
+ export declare function signBitcoinMessageBip137(message: string, privateKey: Uint8Array): string;
6
+ /**
7
+ * Verifies a BIP-137 P2WPKH signature (header 39..42) of the given message against the given native segwit
8
+ * address. Everything else — other headers, malformed base64, wrong length, failed recovery — is `false`.
9
+ */
10
+ export declare function verifyBitcoinMessage(network: BitcoinNetwork, address: string, message: string, signature: string): boolean;
11
+ //# sourceMappingURL=bitcoin-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitcoin-message.d.ts","sourceRoot":"","sources":["../../src/signing/bitcoin-message.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA6B5D,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CASnE;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAKxF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAYT"}
@@ -0,0 +1,62 @@
1
+ import { secp256k1 } from '@noble/curves/secp256k1';
2
+ import { sha256 } from '@noble/hashes/sha2';
3
+ import { base64 } from '@scure/base';
4
+ import { p2wpkhAddress } from '../derivation/bitcoin-keys';
5
+ import { concatBytes, utf8ToBytes } from '../util/bytes';
6
+ /**
7
+ * BIP-137 message signatures for the wallet's P2WPKH login address: Electrum-style compact signature with
8
+ * header 39..42 (27 + 12 + recovery id), base64, over the double-SHA-256 magic hash — exactly what the DFX
9
+ * API verifies with bitcoinjs-message. Header values of other script types are not produced by this wallet.
10
+ */
11
+ const MAGIC_PREFIX = 'Bitcoin Signed Message:\n';
12
+ const P2WPKH_HEADER_BASE = 39;
13
+ function varInt(length) {
14
+ if (length < 0xfd)
15
+ return new Uint8Array([length]);
16
+ if (length <= 0xffff)
17
+ return new Uint8Array([0xfd, length & 0xff, (length >>> 8) & 0xff]);
18
+ if (length <= 0xffffffff)
19
+ return new Uint8Array([0xfe, length & 0xff, (length >>> 8) & 0xff, (length >>> 16) & 0xff, length >>> 24]);
20
+ return new Uint8Array([
21
+ 0xff,
22
+ length & 0xff,
23
+ (length >>> 8) & 0xff,
24
+ (length >>> 16) & 0xff,
25
+ (length >>> 24) & 0xff,
26
+ 0,
27
+ 0,
28
+ 0,
29
+ ]);
30
+ }
31
+ /** BIP-137 magic hash: double SHA-256 over varint-length prefix and message. */
32
+ export function bitcoinMessageMagicHash(message) {
33
+ const messageBytes = utf8ToBytes(message);
34
+ const preimage = concatBytes(varInt(MAGIC_PREFIX.length), utf8ToBytes(MAGIC_PREFIX), varInt(messageBytes.length), messageBytes);
35
+ return sha256(sha256(preimage));
36
+ }
37
+ /** Signs the message with a private key (called through `withPrivateKey`); base64, header 39..42. */
38
+ export function signBitcoinMessageBip137(message, privateKey) {
39
+ const signature = secp256k1.sign(bitcoinMessageMagicHash(message), privateKey);
40
+ return base64.encode(concatBytes(new Uint8Array([P2WPKH_HEADER_BASE + signature.recovery]), signature.toBytes('compact')));
41
+ }
42
+ /**
43
+ * Verifies a BIP-137 P2WPKH signature (header 39..42) of the given message against the given native segwit
44
+ * address. Everything else — other headers, malformed base64, wrong length, failed recovery — is `false`.
45
+ */
46
+ export function verifyBitcoinMessage(network, address, message, signature) {
47
+ try {
48
+ const decoded = base64.decode(signature);
49
+ if (decoded.length !== 65)
50
+ return false;
51
+ const header = decoded[0];
52
+ if (header < P2WPKH_HEADER_BASE || header > P2WPKH_HEADER_BASE + 3)
53
+ return false;
54
+ const compact = secp256k1.Signature.fromCompact(decoded.subarray(1)).addRecoveryBit(header - P2WPKH_HEADER_BASE);
55
+ const publicKey = compact.recoverPublicKey(bitcoinMessageMagicHash(message)).toRawBytes(true);
56
+ return p2wpkhAddress(publicKey, network) === address;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ //# sourceMappingURL=bitcoin-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitcoin-message.js","sourceRoot":"","sources":["../../src/signing/bitcoin-message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { WalletEnv } from '../config/environment';
2
+ /**
3
+ * The two login texts of the DFX API, byte-for-byte. `general` is the wallet login text for every blockchain
4
+ * (`Config.auth.signMessageGeneral`, config.ts:443-445); `fallback` is the historical DeFiChain text
5
+ * (`Config.auth.signMessage`). The API puts the environment prefix in front of both (config.ts:410), the
6
+ * address behind. Changing any byte invalidates every future login signature.
7
+ */
8
+ export declare const LOGIN_TEMPLATES: Readonly<{
9
+ readonly general: "By_signing_this_message,_you_confirm_that_you_are_the_sole_owner_of_the_provided_Blockchain_address._Your_ID:_";
10
+ readonly fallback: "By_signing_this_message,_you_confirm_that_you_are_the_sole_owner_of_the_provided_DeFiChain_address_and_are_in_possession_of_its_private_key._Your_ID:_";
11
+ }>;
12
+ export type LoginTemplate = keyof typeof LOGIN_TEMPLATES;
13
+ /** The exact text the DFX API asks a wallet address to sign: prefix + template + address. */
14
+ export declare function buildLoginMessage(env: WalletEnv, address: string, template?: LoginTemplate): string;
15
+ //# sourceMappingURL=login-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-messages.d.ts","sourceRoot":"","sources":["../../src/signing/login-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;EAKjB,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,eAAe,CAAC;AAEzD,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAyB,GAAG,MAAM,CAE9G"}
@@ -0,0 +1,16 @@
1
+ import { SIGN_MESSAGE_PREFIX } from '../config/environment';
2
+ /**
3
+ * The two login texts of the DFX API, byte-for-byte. `general` is the wallet login text for every blockchain
4
+ * (`Config.auth.signMessageGeneral`, config.ts:443-445); `fallback` is the historical DeFiChain text
5
+ * (`Config.auth.signMessage`). The API puts the environment prefix in front of both (config.ts:410), the
6
+ * address behind. Changing any byte invalidates every future login signature.
7
+ */
8
+ export const LOGIN_TEMPLATES = Object.freeze({
9
+ general: 'By_signing_this_message,_you_confirm_that_you_are_the_sole_owner_of_the_provided_Blockchain_address._Your_ID:_',
10
+ fallback: 'By_signing_this_message,_you_confirm_that_you_are_the_sole_owner_of_the_provided_DeFiChain_address_and_are_in_possession_of_its_private_key._Your_ID:_',
11
+ });
12
+ /** The exact text the DFX API asks a wallet address to sign: prefix + template + address. */
13
+ export function buildLoginMessage(env, address, template = 'general') {
14
+ return SIGN_MESSAGE_PREFIX[env] + LOGIN_TEMPLATES[template] + address;
15
+ }
16
+ //# sourceMappingURL=login-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-messages.js","sourceRoot":"","sources":["../../src/signing/login-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,OAAO,EACL,gHAAgH;IAClH,QAAQ,EACN,wJAAwJ;CAClJ,CAAC,CAAC;AAIZ,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,GAAc,EAAE,OAAe,EAAE,WAA0B,SAAS;IACpG,OAAO,mBAAmB,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;AACxE,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Whether the text (or its UTF-8 bytes) is a DFX login text, whatever the prefix and address. */
2
+ export declare function isDfxLoginText(text: string | Uint8Array): boolean;
3
+ //# sourceMappingURL=login-text-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-text-guard.d.ts","sourceRoot":"","sources":["../../src/signing/login-text-guard.ts"],"names":[],"mappings":"AAUA,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAGjE"}
@@ -0,0 +1,13 @@
1
+ import { bytesToUtf8 } from '../util/bytes';
2
+ /**
3
+ * Shape of every DFX login text: optional lower-case environment prefix `[<env>]_`, then one of the two
4
+ * login templates. Used to refuse exactly these texts in every signing path that is not the login auto-signer
5
+ * (§9.3): message signing, dApp requests and the Spark signer proxy must never produce a DFX login proof.
6
+ */
7
+ const DFX_LOGIN_TEXT = /^(\[[a-z]{1,16}\]_)?By_signing_this_message,_you_confirm_that_you_are_the_sole_owner_of_the_provided_(Blockchain|DeFiChain)_address/;
8
+ /** Whether the text (or its UTF-8 bytes) is a DFX login text, whatever the prefix and address. */
9
+ export function isDfxLoginText(text) {
10
+ const value = typeof text === 'string' ? text : bytesToUtf8(text);
11
+ return DFX_LOGIN_TEXT.test(value);
12
+ }
13
+ //# sourceMappingURL=login-text-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-text-guard.js","sourceRoot":"","sources":["../../src/signing/login-text-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;GAIG;AACH,MAAM,cAAc,GAClB,qIAAqI,CAAC;AAExI,kGAAkG;AAClG,MAAM,UAAU,cAAc,CAAC,IAAyB;IACtD,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClE,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * D31 Spark login for passkey Spark addresses: ECDSA secp256k1 over
3
+ * Keccak-256(0x18 ‖ UTF-8 tag ‖ UTF-8 message) with the Spark identity key, RFC 6979, low-S, 64-byte
4
+ * compact r‖s as lowercase hex. The tag length 0x18 = 24 is the length of the tag itself. Pinned by the
5
+ * DFX API test vectors in the derivation fixture (private key 32 × 0x11) and by every login vector.
6
+ */
7
+ export declare const SPARK_LOGIN_TAG = "dfx.swiss/spark-login/v1";
8
+ /** D31 digest of the login message. */
9
+ export declare function sparkLoginDigestV1(message: string): Uint8Array;
10
+ /** Signs the D31 digest with a private key (called through `withPrivateKey`); compact r‖s lowercase hex. */
11
+ export declare function signSparkLogin(message: string, privateKey: Uint8Array): string;
12
+ /**
13
+ * Verifies a D31 signature against the expected identity public key by recovering it from the digest and the
14
+ * compact signature (recovery ids 0..3). Malformed input never throws, it just does not verify.
15
+ */
16
+ export declare function verifySparkLogin(message: string, signature: string, publicKey: Uint8Array): boolean;
17
+ //# sourceMappingURL=spark-login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spark-login.d.ts","sourceRoot":"","sources":["../../src/signing/spark-login.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D,uCAAuC;AACvC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAG9D;AAED,4GAA4G;AAC5G,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAG9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAsBnG"}
@@ -0,0 +1,51 @@
1
+ import { secp256k1 } from '@noble/curves/secp256k1';
2
+ import { keccak_256 } from '@noble/hashes/sha3';
3
+ import { bytesToHex, concatBytes, hexToBytes, utf8ToBytes } from '../util/bytes';
4
+ /**
5
+ * D31 Spark login for passkey Spark addresses: ECDSA secp256k1 over
6
+ * Keccak-256(0x18 ‖ UTF-8 tag ‖ UTF-8 message) with the Spark identity key, RFC 6979, low-S, 64-byte
7
+ * compact r‖s as lowercase hex. The tag length 0x18 = 24 is the length of the tag itself. Pinned by the
8
+ * DFX API test vectors in the derivation fixture (private key 32 × 0x11) and by every login vector.
9
+ */
10
+ export const SPARK_LOGIN_TAG = 'dfx.swiss/spark-login/v1';
11
+ /** D31 digest of the login message. */
12
+ export function sparkLoginDigestV1(message) {
13
+ const tag = utf8ToBytes(SPARK_LOGIN_TAG);
14
+ return keccak_256(concatBytes(new Uint8Array([tag.length]), tag, utf8ToBytes(message)));
15
+ }
16
+ /** Signs the D31 digest with a private key (called through `withPrivateKey`); compact r‖s lowercase hex. */
17
+ export function signSparkLogin(message, privateKey) {
18
+ const signature = secp256k1.sign(sparkLoginDigestV1(message), privateKey);
19
+ return bytesToHex(signature.toBytes('compact'));
20
+ }
21
+ /**
22
+ * Verifies a D31 signature against the expected identity public key by recovering it from the digest and the
23
+ * compact signature (recovery ids 0..3). Malformed input never throws, it just does not verify.
24
+ */
25
+ export function verifySparkLogin(message, signature, publicKey) {
26
+ try {
27
+ const compact = typeof signature === 'string' && /^[0-9a-f]{128}$/.test(signature) ? hexToBytes(signature) : null;
28
+ if (!compact)
29
+ return false;
30
+ const digest = sparkLoginDigestV1(message);
31
+ for (let recoveryId = 0; recoveryId < 4; recoveryId++) {
32
+ try {
33
+ const recovered = secp256k1.Signature.fromCompact(compact)
34
+ .addRecoveryBit(recoveryId)
35
+ .recoverPublicKey(digest)
36
+ .toRawBytes(true);
37
+ if (recovered.length === publicKey.length && recovered.every((byte, i) => byte === publicKey[i])) {
38
+ return true;
39
+ }
40
+ }
41
+ catch {
42
+ // try the next recovery id
43
+ }
44
+ }
45
+ return false;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ //# sourceMappingURL=spark-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spark-login.js","sourceRoot":"","sources":["../../src/signing/spark-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAE1D,uCAAuC;AACvC,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,GAAG,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IACzC,OAAO,UAAU,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,UAAsB;IACpE,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1E,OAAO,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,SAAiB,EAAE,SAAqB;IACxF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClH,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;qBACvD,cAAc,CAAC,UAAU,CAAC;qBAC1B,gBAAgB,CAAC,MAAM,CAAC;qBACxB,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpB,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjG,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { bytesToHex, bytesToUtf8, concatBytes, hexToBytes, isBytes, utf8ToBytes } from '@noble/hashes/utils';
2
+ export { bytesToHex, bytesToUtf8, concatBytes, hexToBytes, isBytes, utf8ToBytes };
3
+ /** Base64url without padding, as used by WebAuthn JSON and JWT. */
4
+ export declare function base64UrlEncode(bytes: Uint8Array): string;
5
+ /** Decodes base64url; trailing `=` padding is accepted and ignored. */
6
+ export declare function base64UrlDecode(text: string): Uint8Array;
7
+ /** Compares two byte arrays in time independent of the position of the first difference. */
8
+ export declare function equalBytes(a: Uint8Array, b: Uint8Array): boolean;
9
+ /** Overwrites the given buffers with zeros, e.g. key material that is no longer needed. */
10
+ export declare function wipeBytes(...arrays: (Uint8Array | undefined)[]): void;
11
+ //# sourceMappingURL=bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/util/bytes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE7G,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAElF,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAExD;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAKhE;AAED,2FAA2F;AAC3F,wBAAgB,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI,CAErE"}
@@ -0,0 +1,26 @@
1
+ import { base64urlnopad } from '@scure/base';
2
+ import { bytesToHex, bytesToUtf8, concatBytes, hexToBytes, isBytes, utf8ToBytes } from '@noble/hashes/utils';
3
+ export { bytesToHex, bytesToUtf8, concatBytes, hexToBytes, isBytes, utf8ToBytes };
4
+ /** Base64url without padding, as used by WebAuthn JSON and JWT. */
5
+ export function base64UrlEncode(bytes) {
6
+ return base64urlnopad.encode(bytes);
7
+ }
8
+ /** Decodes base64url; trailing `=` padding is accepted and ignored. */
9
+ export function base64UrlDecode(text) {
10
+ return base64urlnopad.decode(text.replace(/=+$/, ''));
11
+ }
12
+ /** Compares two byte arrays in time independent of the position of the first difference. */
13
+ export function equalBytes(a, b) {
14
+ if (a.length !== b.length)
15
+ return false;
16
+ let diff = 0;
17
+ for (let i = 0; i < a.length; i++)
18
+ diff |= a[i] ^ b[i];
19
+ return diff === 0;
20
+ }
21
+ /** Overwrites the given buffers with zeros, e.g. key material that is no longer needed. */
22
+ export function wipeBytes(...arrays) {
23
+ for (const array of arrays)
24
+ array?.fill(0);
25
+ }
26
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/util/bytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE7G,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAElF,mEAAmE;AACnE,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,UAAU,CAAC,CAAa,EAAE,CAAa;IACrD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,SAAS,CAAC,GAAG,MAAkC;IAC7D,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type Listener<T> = (payload: T) => void;
2
+ /**
3
+ * Minimal typed event emitter. A throwing listener neither stops the other listeners nor the emitting code;
4
+ * its error goes to `onListenerError`, by default rethrown asynchronously so that it still surfaces.
5
+ */
6
+ export declare class Emitter<Events extends object> {
7
+ private readonly onListenerError;
8
+ private readonly listeners;
9
+ constructor(onListenerError?: (error: unknown) => void);
10
+ /** Registers a listener and returns a function that removes it. */
11
+ on<E extends keyof Events>(event: E, listener: Listener<Events[E]>): () => void;
12
+ off<E extends keyof Events>(event: E, listener: Listener<Events[E]>): void;
13
+ emit<E extends keyof Events>(event: E, payload: Events[E]): void;
14
+ listenerCount(event: keyof Events): number;
15
+ removeAllListeners(): void;
16
+ }
17
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/util/emitter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAE/C;;;GAGG;AACH,qBAAa,OAAO,CAAC,MAAM,SAAS,MAAM;IAG5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAF5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+C;gBAE5C,eAAe,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAmB;IAErF,mEAAmE;IACnE,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAU/E,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAO1E,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAYhE,aAAa,CAAC,KAAK,EAAE,MAAM,MAAM,GAAG,MAAM;IAI1C,kBAAkB,IAAI,IAAI;CAG3B"}