@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":"ceremonies.js","sourceRoot":"","sources":["../../src/passkey/ceremonies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** One ceremony at a time: a run ticket that goes stale when a newer ceremony begins. */
2
+ export interface CeremonyRun {
3
+ readonly id: number;
4
+ /** Whether this run is still the newest one. */
5
+ isCurrent(): boolean;
6
+ /** Throws `CeremonySupersededError` when a newer ceremony has begun. */
7
+ checkCurrent(): void;
8
+ /** Marks the run as finished; stale runs may finish silently. */
9
+ finish(): void;
10
+ }
11
+ /**
12
+ * Serializes the wallet's passkey ceremonies: beginning a new run supersedes the previous one, and
13
+ * `cancelActive()` supersedes without starting anything new (§6). Cancel handlers run synchronously —
14
+ * they abort the underlying WebAuthn call where the platform allows an AbortSignal.
15
+ */
16
+ export declare class CeremonyGate {
17
+ private next;
18
+ private current?;
19
+ private readonly cancelHandlers;
20
+ /** Begins a new run, superseding the previous one. */
21
+ begin(onCancel?: () => void): CeremonyRun;
22
+ /** Supersedes the active run, if any, without starting a new one. */
23
+ cancelActive(): void;
24
+ }
25
+ //# sourceMappingURL=ceremony-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ceremony-gate.d.ts","sourceRoot":"","sources":["../../src/passkey/ceremony-gate.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,SAAS,IAAI,OAAO,CAAC;IACrB,wEAAwE;IACxE,YAAY,IAAI,IAAI,CAAC;IACrB,iEAAiE;IACjE,MAAM,IAAI,IAAI,CAAC;CAChB;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsC;IAErE,sDAAsD;IACtD,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,WAAW;IAmBzC,qEAAqE;IACrE,YAAY,IAAI,IAAI;CAQrB"}
@@ -0,0 +1,45 @@
1
+ import { CeremonySupersededError } from './errors';
2
+ /**
3
+ * Serializes the wallet's passkey ceremonies: beginning a new run supersedes the previous one, and
4
+ * `cancelActive()` supersedes without starting anything new (§6). Cancel handlers run synchronously —
5
+ * they abort the underlying WebAuthn call where the platform allows an AbortSignal.
6
+ */
7
+ export class CeremonyGate {
8
+ constructor() {
9
+ this.next = 0;
10
+ this.cancelHandlers = new Map();
11
+ }
12
+ /** Begins a new run, superseding the previous one. */
13
+ begin(onCancel) {
14
+ this.cancelActive();
15
+ const id = ++this.next;
16
+ this.current = id;
17
+ if (onCancel)
18
+ this.cancelHandlers.set(id, new Set([onCancel]));
19
+ return {
20
+ id,
21
+ isCurrent: () => this.current === id,
22
+ checkCurrent: () => {
23
+ if (this.current !== id)
24
+ throw new CeremonySupersededError();
25
+ },
26
+ finish: () => {
27
+ this.cancelHandlers.delete(id);
28
+ if (this.current === id)
29
+ this.current = undefined;
30
+ },
31
+ };
32
+ }
33
+ /** Supersedes the active run, if any, without starting a new one. */
34
+ cancelActive() {
35
+ const id = this.current;
36
+ if (id === undefined)
37
+ return;
38
+ this.current = undefined;
39
+ const handlers = this.cancelHandlers.get(id);
40
+ this.cancelHandlers.delete(id);
41
+ for (const handler of handlers ?? [])
42
+ handler();
43
+ }
44
+ }
45
+ //# sourceMappingURL=ceremony-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ceremony-gate.js","sourceRoot":"","sources":["../../src/passkey/ceremony-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAanD;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAAzB;QACU,SAAI,GAAG,CAAC,CAAC;QAEA,mBAAc,GAAG,IAAI,GAAG,EAA2B,CAAC;IA+BvE,CAAC;IA7BC,sDAAsD;IACtD,KAAK,CAAC,QAAqB;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,QAAQ;YAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE/D,OAAO;YACL,EAAE;YACF,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE;YACpC,YAAY,EAAE,GAAG,EAAE;gBACjB,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE;oBAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAC/D,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE;oBAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACpD,CAAC;SACF,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,YAAY;QACV,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACxB,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO;QAC7B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { SeedPublicData } from '../derivation/public-data';
2
+ /** Public, non-secret per-credential record cached per origin after a server-verified seed check (§11.4). */
3
+ export interface CachedPasskeyCredential {
4
+ /** Credential id, base64url. */
5
+ credentialId: string;
6
+ rpId: string;
7
+ state: 'pending' | 'active' | 'revoked';
8
+ seedCheckAddress?: string;
9
+ publicData?: SeedPublicData;
10
+ backupEligible?: boolean;
11
+ backupSeen?: boolean;
12
+ createdAt: number;
13
+ }
14
+ /** Storage abstraction: the browser's `localStorage`, or anything with the same shape in tests. */
15
+ export interface CredentialStorage {
16
+ getItem(key: string): string | null;
17
+ setItem(key: string, value: string): void;
18
+ removeItem(key: string): void;
19
+ }
20
+ /**
21
+ * The credential list of one RP ID in `localStorage` (`dfx.wallet.credentials.v1`): public data only —
22
+ * never PRF bytes, mnemonics or signatures. Written after a server-verified seed check; feeds
23
+ * `excludeCredentials` with every non-revoked credential id.
24
+ */
25
+ export declare class CredentialCache {
26
+ private readonly rpId;
27
+ private readonly key;
28
+ private storage;
29
+ constructor(storage?: CredentialStorage, key?: string, rpId?: string);
30
+ list(): CachedPasskeyCredential[];
31
+ put(entry: CachedPasskeyCredential): void;
32
+ update(credentialId: string, patch: Partial<Omit<CachedPasskeyCredential, 'credentialId' | 'rpId'>>): void;
33
+ remove(credentialId: string): void;
34
+ /** Credential ids that must not be created again: everything not revoked. */
35
+ activeIds(): string[];
36
+ private write;
37
+ }
38
+ //# sourceMappingURL=credential-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-cache.d.ts","sourceRoot":"","sources":["../../src/passkey/credential-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,6GAA6G;AAC7G,MAAM,WAAW,uBAAuB;IACtC,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mGAAmG;AACnG,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAeD;;;;GAIG;AACH,qBAAa,eAAe;IAOxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAoB;gBAGjC,OAAO,GAAE,iBAAoC,EAC7C,GAAG,SAA8B,EAChB,IAAI,GAAE,MAAW;IAMpC,IAAI,IAAI,uBAAuB,EAAE;IAWjC,GAAG,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI;IAMzC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,cAAc,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI;IAQ1G,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAIlC,6EAA6E;IAC7E,SAAS,IAAI,MAAM,EAAE;IAMrB,OAAO,CAAC,KAAK;CAWd"}
@@ -0,0 +1,91 @@
1
+ class MemoryStorage {
2
+ constructor() {
3
+ this.map = new Map();
4
+ }
5
+ getItem(key) {
6
+ return this.map.get(key) ?? null;
7
+ }
8
+ setItem(key, value) {
9
+ this.map.set(key, value);
10
+ }
11
+ removeItem(key) {
12
+ this.map.delete(key);
13
+ }
14
+ }
15
+ /**
16
+ * The credential list of one RP ID in `localStorage` (`dfx.wallet.credentials.v1`): public data only —
17
+ * never PRF bytes, mnemonics or signatures. Written after a server-verified seed check; feeds
18
+ * `excludeCredentials` with every non-revoked credential id.
19
+ */
20
+ export class CredentialCache {
21
+ constructor(storage = defaultStorage(), key = 'dfx.wallet.credentials.v1', rpId = '') {
22
+ this.rpId = rpId;
23
+ this.storage = storage;
24
+ this.key = `${key}.${this.rpId}`;
25
+ }
26
+ list() {
27
+ try {
28
+ const raw = this.storage.getItem(this.key);
29
+ const parsed = raw ? JSON.parse(raw) : [];
30
+ if (!Array.isArray(parsed))
31
+ return [];
32
+ return parsed.filter(isCachedCredential);
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ }
38
+ put(entry) {
39
+ const all = this.list().filter((existing) => existing.credentialId !== entry.credentialId);
40
+ all.push(entry);
41
+ this.write(all);
42
+ }
43
+ update(credentialId, patch) {
44
+ const all = this.list();
45
+ const entry = all.find((existing) => existing.credentialId === credentialId);
46
+ if (!entry)
47
+ return;
48
+ Object.assign(entry, patch);
49
+ this.write(all);
50
+ }
51
+ remove(credentialId) {
52
+ this.write(this.list().filter((existing) => existing.credentialId !== credentialId));
53
+ }
54
+ /** Credential ids that must not be created again: everything not revoked. */
55
+ activeIds() {
56
+ return this.list()
57
+ .filter((entry) => entry.state !== 'revoked')
58
+ .map((entry) => entry.credentialId);
59
+ }
60
+ write(all) {
61
+ const payload = JSON.stringify(all);
62
+ try {
63
+ this.storage.setItem(this.key, payload);
64
+ }
65
+ catch {
66
+ // The cache is optional. A locked or full store must not fail a login that already succeeded.
67
+ if (this.storage instanceof MemoryStorage)
68
+ return;
69
+ this.storage = new MemoryStorage();
70
+ this.storage.setItem(this.key, payload);
71
+ }
72
+ }
73
+ }
74
+ function defaultStorage() {
75
+ try {
76
+ return globalThis.localStorage ?? new MemoryStorage();
77
+ }
78
+ catch {
79
+ return new MemoryStorage();
80
+ }
81
+ }
82
+ function isCachedCredential(value) {
83
+ if (!value || typeof value !== 'object')
84
+ return false;
85
+ const entry = value;
86
+ return (typeof entry['credentialId'] === 'string' &&
87
+ typeof entry['rpId'] === 'string' &&
88
+ (entry['state'] === 'pending' || entry['state'] === 'active' || entry['state'] === 'revoked') &&
89
+ typeof entry['createdAt'] === 'number');
90
+ }
91
+ //# sourceMappingURL=credential-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-cache.js","sourceRoot":"","sources":["../../src/passkey/credential-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Allowlisted passkey diagnostics: stage, outcome, error name, one sanitized message line, attachment,
3
+ * transports, backup flags, PRF presence, OS label and client capabilities. Never PRF bytes, mnemonics,
4
+ * keys, signatures or challenges (§6.6).
5
+ */
6
+ export interface PasskeyDiagnosticInput {
7
+ stage: string;
8
+ outcome: 'completed' | 'failed' | 'aborted';
9
+ errorName?: string;
10
+ message?: string;
11
+ attachment?: string | null;
12
+ transports?: string[];
13
+ backupEligible?: boolean;
14
+ backedUp?: boolean;
15
+ prf?: boolean;
16
+ os?: string;
17
+ clientCapabilities?: Record<string, boolean>;
18
+ }
19
+ export type PasskeyDiagnostic = Record<string, unknown>;
20
+ /** Builds the sanitized diagnostic record; the app forwards it to `POST passkey/diagnostics`. */
21
+ export declare function passkeyDiagnostic(input: PasskeyDiagnosticInput): PasskeyDiagnostic;
22
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/passkey/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAyBxD,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,iBAAiB,CA4BlF"}
@@ -0,0 +1,59 @@
1
+ /** Message characters diagnostics may carry; anything else (urls, keys, base64 blobs) is dropped. */
2
+ const SAFE_MESSAGE = /^[A-Za-z0-9 .,:;'()_-]{1,120}$/;
3
+ /** Hex, a base64url blob, or a 12-word phrase is a secret, not a diagnostic sentence. */
4
+ function isSecretShaped(message) {
5
+ const compact = message.replace(/\s+/g, '');
6
+ if (/^[0-9a-fA-F]{32,}$/.test(compact))
7
+ return true;
8
+ if (!message.includes(' ') && /^[A-Za-z0-9_-]{32,}$/.test(message))
9
+ return true;
10
+ const words = message.trim().split(/\s+/);
11
+ return words.length >= 12 && words.every((word) => /^[a-z]+$/.test(word));
12
+ }
13
+ function diagnosticOutcome(outcome) {
14
+ switch (outcome) {
15
+ case 'completed':
16
+ return 'Success';
17
+ case 'failed':
18
+ return 'Failure';
19
+ case 'aborted':
20
+ return 'Aborted';
21
+ }
22
+ }
23
+ /** Builds the sanitized diagnostic record; the app forwards it to `POST passkey/diagnostics`. */
24
+ export function passkeyDiagnostic(input) {
25
+ const record = {
26
+ stage: String(input.stage).slice(0, 64),
27
+ outcome: diagnosticOutcome(input.outcome),
28
+ };
29
+ if (input.errorName !== undefined)
30
+ record['errorName'] = String(input.errorName).slice(0, 64);
31
+ if (input.message !== undefined)
32
+ record['message'] =
33
+ SAFE_MESSAGE.test(input.message) && !isSecretShaped(input.message) ? input.message : '<unavailable>';
34
+ if (input.attachment !== undefined)
35
+ record['authenticatorAttachment'] = input.attachment;
36
+ if (input.transports !== undefined)
37
+ record['transports'] = input.transports.filter((t) => typeof t === 'string').slice(0, 8);
38
+ if (input.backupEligible !== undefined)
39
+ record['backupEligible'] = input.backupEligible;
40
+ if (input.backedUp !== undefined)
41
+ record['backedUp'] = input.backedUp;
42
+ if (input.prf !== undefined)
43
+ record['prfPresent'] = input.prf;
44
+ if (input.os !== undefined)
45
+ record['os'] = String(input.os).slice(0, 32);
46
+ if (input.clientCapabilities !== undefined) {
47
+ const entries = Object.entries(input.clientCapabilities)
48
+ .filter(([, value]) => typeof value === 'boolean')
49
+ .slice(0, 16);
50
+ let serialized = JSON.stringify(Object.fromEntries(entries));
51
+ while (serialized.length > 1024 && entries.length > 0) {
52
+ entries.pop();
53
+ serialized = JSON.stringify(Object.fromEntries(entries));
54
+ }
55
+ record['clientCapabilities'] = serialized;
56
+ }
57
+ return record;
58
+ }
59
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/passkey/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { WalletError } from '../util/errors';
2
+ /** Base of every passkey ceremony failure; `code` is stable and branchable. */
3
+ export declare class PasskeyError extends WalletError {
4
+ }
5
+ /** The page runs inside an iframe or another embedded context (NG3). */
6
+ export declare class EmbeddedContextError extends PasskeyError {
7
+ constructor();
8
+ }
9
+ /** The page is not served from the RP ID of its environment. */
10
+ export declare class WrongOriginError extends PasskeyError {
11
+ constructor(hostname: string, expected: string);
12
+ }
13
+ /** The browser or OS cannot run the wallet's passkey ceremonies at all. */
14
+ export declare class PlatformUnsupportedError extends PasskeyError {
15
+ constructor(reason: string);
16
+ }
17
+ /** The page runs inside an in-app browser that cannot complete a ceremony. */
18
+ export declare class InAppBrowserError extends PasskeyError {
19
+ constructor();
20
+ }
21
+ /** A cross-platform (hybrid/roaming) credential may never hold the wallet seed (D21). */
22
+ export declare class CrossDeviceRegistrationError extends PasskeyError {
23
+ constructor();
24
+ }
25
+ /** `create` and `get` returned different PRF outputs for the same credential. */
26
+ export declare class PrfMismatchError extends PasskeyError {
27
+ constructor();
28
+ }
29
+ /** The authenticator has no PRF extension; no seed can be derived. */
30
+ export declare class PrfUnavailableError extends PasskeyError {
31
+ constructor();
32
+ }
33
+ /** A newer ceremony superseded this one. */
34
+ export declare class CeremonySupersededError extends PasskeyError {
35
+ constructor();
36
+ }
37
+ /** The ceremony was cancelled by the app. */
38
+ export declare class CeremonyCancelledError extends PasskeyError {
39
+ constructor();
40
+ }
41
+ /** The user gesture requirement (WebKit 291258) was not met. */
42
+ export declare class UserActivationMissingError extends PasskeyError {
43
+ constructor();
44
+ }
45
+ /** Classification of raw WebAuthn failures for the UI. */
46
+ export type WebAuthnErrorKind = 'cancel' | 'timeout' | 'exists' | 'unsupported' | 'security' | 'generic';
47
+ /** Maps a WebAuthn rejection to a stable UI discriminant. */
48
+ export declare function classifyWebAuthnError(error: unknown): WebAuthnErrorKind;
49
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/passkey/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,+EAA+E;AAC/E,qBAAa,YAAa,SAAQ,WAAW;CAAG;AAEhD,wEAAwE;AACxE,qBAAa,oBAAqB,SAAQ,YAAY;;CAIrD;AAED,gEAAgE;AAChE,qBAAa,gBAAiB,SAAQ,YAAY;gBACpC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAG/C;AAED,2EAA2E;AAC3E,qBAAa,wBAAyB,SAAQ,YAAY;gBAC5C,MAAM,EAAE,MAAM;CAG3B;AAED,8EAA8E;AAC9E,qBAAa,iBAAkB,SAAQ,YAAY;;CAIlD;AAED,yFAAyF;AACzF,qBAAa,4BAA6B,SAAQ,YAAY;;CAI7D;AAED,iFAAiF;AACjF,qBAAa,gBAAiB,SAAQ,YAAY;;CAIjD;AAED,sEAAsE;AACtE,qBAAa,mBAAoB,SAAQ,YAAY;;CAIpD;AAED,4CAA4C;AAC5C,qBAAa,uBAAwB,SAAQ,YAAY;;CAIxD;AAED,6CAA6C;AAC7C,qBAAa,sBAAuB,SAAQ,YAAY;;CAIvD;AAED,gEAAgE;AAChE,qBAAa,0BAA2B,SAAQ,YAAY;;CAI3D;AAED,0DAA0D;AAC1D,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AAEzG,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAmBvE"}
@@ -0,0 +1,87 @@
1
+ import { WalletError } from '../util/errors';
2
+ /** Base of every passkey ceremony failure; `code` is stable and branchable. */
3
+ export class PasskeyError extends WalletError {
4
+ }
5
+ /** The page runs inside an iframe or another embedded context (NG3). */
6
+ export class EmbeddedContextError extends PasskeyError {
7
+ constructor() {
8
+ super('embedded-context', 'The wallet must run in a top-level browser context');
9
+ }
10
+ }
11
+ /** The page is not served from the RP ID of its environment. */
12
+ export class WrongOriginError extends PasskeyError {
13
+ constructor(hostname, expected) {
14
+ super('wrong-origin', `Passkey ceremonies need ${expected}, this page is ${hostname}`);
15
+ }
16
+ }
17
+ /** The browser or OS cannot run the wallet's passkey ceremonies at all. */
18
+ export class PlatformUnsupportedError extends PasskeyError {
19
+ constructor(reason) {
20
+ super('platform-unsupported', reason);
21
+ }
22
+ }
23
+ /** The page runs inside an in-app browser that cannot complete a ceremony. */
24
+ export class InAppBrowserError extends PasskeyError {
25
+ constructor() {
26
+ super('in-app-browser', 'This browser is embedded in an app and cannot create passkeys');
27
+ }
28
+ }
29
+ /** A cross-platform (hybrid/roaming) credential may never hold the wallet seed (D21). */
30
+ export class CrossDeviceRegistrationError extends PasskeyError {
31
+ constructor() {
32
+ super('cross-device-registration', 'The passkey was created cross-platform; wallet seeds stay on-device');
33
+ }
34
+ }
35
+ /** `create` and `get` returned different PRF outputs for the same credential. */
36
+ export class PrfMismatchError extends PasskeyError {
37
+ constructor() {
38
+ super('prf-mismatch', 'The authenticator returned a different PRF output for the new credential');
39
+ }
40
+ }
41
+ /** The authenticator has no PRF extension; no seed can be derived. */
42
+ export class PrfUnavailableError extends PasskeyError {
43
+ constructor() {
44
+ super('prf-unavailable', 'This passkey cannot derive a wallet seed (no PRF extension)');
45
+ }
46
+ }
47
+ /** A newer ceremony superseded this one. */
48
+ export class CeremonySupersededError extends PasskeyError {
49
+ constructor() {
50
+ super('ceremony-superseded', 'A newer passkey ceremony superseded this one');
51
+ }
52
+ }
53
+ /** The ceremony was cancelled by the app. */
54
+ export class CeremonyCancelledError extends PasskeyError {
55
+ constructor() {
56
+ super('ceremony-cancelled', 'The passkey ceremony was cancelled');
57
+ }
58
+ }
59
+ /** The user gesture requirement (WebKit 291258) was not met. */
60
+ export class UserActivationMissingError extends PasskeyError {
61
+ constructor() {
62
+ super('user-activation-missing', 'The passkey ceremony must start from a user gesture');
63
+ }
64
+ }
65
+ /** Maps a WebAuthn rejection to a stable UI discriminant. */
66
+ export function classifyWebAuthnError(error) {
67
+ const name = error && typeof error === 'object' && 'name' in error ? String(error.name) : '';
68
+ switch (name) {
69
+ case 'NotAllowedError':
70
+ return 'cancel';
71
+ case 'TimeoutError':
72
+ case 'AbortError':
73
+ return 'timeout';
74
+ case 'InvalidStateError':
75
+ return 'exists';
76
+ case 'NotSupportedError':
77
+ case 'SecurityError':
78
+ return name === 'SecurityError' ? 'security' : 'unsupported';
79
+ default: {
80
+ const message = error instanceof Error ? error.message : String(error ?? '');
81
+ if (/time\s*out/i.test(message))
82
+ return 'timeout';
83
+ return 'generic';
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/passkey/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,+EAA+E;AAC/E,MAAM,OAAO,YAAa,SAAQ,WAAW;CAAG;AAEhD,wEAAwE;AACxE,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IACpD;QACE,KAAK,CAAC,kBAAkB,EAAE,oDAAoD,CAAC,CAAC;IAClF,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAChD,YAAY,QAAgB,EAAE,QAAgB;QAC5C,KAAK,CAAC,cAAc,EAAE,2BAA2B,QAAQ,kBAAkB,QAAQ,EAAE,CAAC,CAAC;IACzF,CAAC;CACF;AAED,2EAA2E;AAC3E,MAAM,OAAO,wBAAyB,SAAQ,YAAY;IACxD,YAAY,MAAc;QACxB,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;CACF;AAED,8EAA8E;AAC9E,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD;QACE,KAAK,CAAC,gBAAgB,EAAE,+DAA+D,CAAC,CAAC;IAC3F,CAAC;CACF;AAED,yFAAyF;AACzF,MAAM,OAAO,4BAA6B,SAAQ,YAAY;IAC5D;QACE,KAAK,CAAC,2BAA2B,EAAE,qEAAqE,CAAC,CAAC;IAC5G,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAChD;QACE,KAAK,CAAC,cAAc,EAAE,0EAA0E,CAAC,CAAC;IACpG,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD;QACE,KAAK,CAAC,iBAAiB,EAAE,6DAA6D,CAAC,CAAC;IAC1F,CAAC;CACF;AAED,4CAA4C;AAC5C,MAAM,OAAO,uBAAwB,SAAQ,YAAY;IACvD;QACE,KAAK,CAAC,qBAAqB,EAAE,8CAA8C,CAAC,CAAC;IAC/E,CAAC;CACF;AAED,6CAA6C;AAC7C,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IACtD;QACE,KAAK,CAAC,oBAAoB,EAAE,oCAAoC,CAAC,CAAC;IACpE,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,OAAO,0BAA2B,SAAQ,YAAY;IAC1D;QACE,KAAK,CAAC,yBAAyB,EAAE,qDAAqD,CAAC,CAAC;IAC1F,CAAC;CACF;AAKD,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAE,KAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnH,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB;YACpB,OAAO,QAAQ,CAAC;QAClB,KAAK,cAAc,CAAC;QACpB,KAAK,YAAY;YACf,OAAO,SAAS,CAAC;QACnB,KAAK,mBAAmB;YACtB,OAAO,QAAQ,CAAC;QAClB,KAAK,mBAAmB,CAAC;QACzB,KAAK,eAAe;YAClB,OAAO,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;QAC/D,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC7E,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,SAAS,CAAC;YAClD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { WalletEnv } from '../config/environment';
2
+ /** What the app needs to know before it may show the passkey tile. */
3
+ export interface PlatformReport {
4
+ available: boolean;
5
+ reason?: 'no-webauthn' | 'no-prf' | 'in-app-browser' | 'embedded' | 'wrong-origin' | 'os-too-old';
6
+ /** Whether the client advertises the PRF extension: `false` hides the tile (§6.3). */
7
+ prf: 'yes' | 'no' | 'unknown';
8
+ /** Installed OS version when it could be read, for diagnostics. */
9
+ os?: string;
10
+ }
11
+ /** Host surface the platform checks inspect (browser or fake). */
12
+ export interface PlatformHost {
13
+ navigator: {
14
+ userAgent: string;
15
+ credentials?: {
16
+ create?: unknown;
17
+ get?: unknown;
18
+ };
19
+ userAgentData?: {
20
+ getHighEntropyValues?: (hints: string[]) => Promise<Record<string, string>>;
21
+ };
22
+ /** Present when the host can tell iPadOS desktop mode from desktop Safari. */
23
+ platform?: string;
24
+ maxTouchPoints?: number;
25
+ };
26
+ location: {
27
+ hostname: string;
28
+ href: string;
29
+ origin: string;
30
+ pathname: string;
31
+ };
32
+ open?: (url: string, target?: string, features?: string) => unknown;
33
+ /** `window.top` / `window.self` when inspectable; both absent means "assume top-level". */
34
+ top?: unknown;
35
+ self?: unknown;
36
+ PublicKeyCredential?: {
37
+ getClientCapabilities?: () => Promise<Record<string, boolean>>;
38
+ isConditionalMediationAvailable?: () => Promise<boolean>;
39
+ };
40
+ TelegramWebviewProxy?: unknown;
41
+ TelegramWebview?: unknown;
42
+ Telegram?: {
43
+ WebApp?: {
44
+ openLink?: (url: string) => unknown;
45
+ };
46
+ };
47
+ }
48
+ /** True inside an embedded in-app browser (Telegram, Instagram, …). */
49
+ export declare function isInAppBrowser(win?: PlatformHost): boolean;
50
+ /** Installed iOS version from the UA, or null on other platforms / missing token. */
51
+ export declare function iosInstalledVersion(userAgent: string): string | null;
52
+ /** iPadOS desktop mode reports a Macintosh UA. Touch points tell it apart from desktop Safari. */
53
+ export declare function isIpadDesktopMode(nav: {
54
+ platform?: string;
55
+ maxTouchPoints?: number;
56
+ }): boolean;
57
+ /**
58
+ * Installed iPadOS version in desktop mode. That UA drops the iPad token and puts the OS major in
59
+ * Safari's `Version/`. A real Mac has no touch points, so its Safari version is not an iPadOS release.
60
+ * Null when this is not iPad desktop mode or the token is missing — the floor must not guess.
61
+ */
62
+ export declare function ipadDesktopInstalledVersion(nav: {
63
+ userAgent: string;
64
+ platform?: string;
65
+ maxTouchPoints?: number;
66
+ }): string | null;
67
+ /** Installed Android version, preferring `userAgentData` (Chrome freezes the UA at Android 10). */
68
+ export declare function androidInstalledVersion(win?: PlatformHost): Promise<string | null>;
69
+ /**
70
+ * Checks whether the wallet's passkey ceremonies can run here at all: real top-level page on the
71
+ * environment's RP host, WebAuthn present, OS new enough, not inside an in-app browser. The PRF soft gate
72
+ * only hides the tile (`available: false`, `prf: 'no'`); PRF absence in an old browser is `unknown`.
73
+ */
74
+ export declare function checkPasskeyPlatform(env: WalletEnv, win?: PlatformHost): Promise<PlatformReport>;
75
+ /** Best-effort handoff of the login URL to the system browser when stuck in an in-app browser. */
76
+ export declare function openInSystemBrowser(url: string, win?: PlatformHost): void;
77
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/passkey/platform.ts"],"names":[],"mappings":"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"}