@bounded-sh/client 0.0.118 → 0.0.120-expo.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/dist/auth/oidc-auth.d.ts +2 -1
- package/dist/auth/providers/email-auth-provider.d.ts +2 -1
- package/dist/auth/providers/offchain-auth-provider.d.ts +2 -1
- package/dist/auth/turnkey-signer-bridge.d.ts +16 -0
- package/dist/auth/turnkey-wallet-widget.d.ts +4 -0
- package/dist/{email-auth-provider-C-qQ46kD.js → email-auth-provider-Bb_0mHJ_.js} +7 -2
- package/dist/email-auth-provider-Bb_0mHJ_.js.map +1 -0
- package/dist/{email-auth-provider-BYiK3ZCv.js → email-auth-provider-IsiArtx0.js} +7 -2
- package/dist/email-auth-provider-IsiArtx0.js.map +1 -0
- package/dist/{email-auth-provider-B9cZ-puM.mjs → email-auth-provider-TA2AbU5Y.mjs} +7 -2
- package/dist/email-auth-provider-TA2AbU5Y.mjs.map +1 -0
- package/dist/{email-auth-provider-DFHalX9c.mjs → email-auth-provider-ao5ce_SN.mjs} +7 -2
- package/dist/email-auth-provider-ao5ce_SN.mjs.map +1 -0
- package/dist/{guest-auth-provider-g5-T58yA.js → guest-auth-provider-CJUbifdu.js} +2 -2
- package/dist/{guest-auth-provider-g5-T58yA.js.map → guest-auth-provider-CJUbifdu.js.map} +1 -1
- package/dist/{guest-auth-provider-D1q3C5uC.js → guest-auth-provider-DTEwf7qP.js} +2 -2
- package/dist/{guest-auth-provider-D1q3C5uC.js.map → guest-auth-provider-DTEwf7qP.js.map} +1 -1
- package/dist/{guest-auth-provider-i8-RL0js.mjs → guest-auth-provider-Dw-bF10B.mjs} +2 -2
- package/dist/{guest-auth-provider-BRq3JB0_.mjs.map → guest-auth-provider-Dw-bF10B.mjs.map} +1 -1
- package/dist/{guest-auth-provider-BRq3JB0_.mjs → guest-auth-provider-DxQG3JvU.mjs} +2 -2
- package/dist/{guest-auth-provider-i8-RL0js.mjs.map → guest-auth-provider-DxQG3JvU.mjs.map} +1 -1
- package/dist/{index-xNGb1ROp.mjs → index-BdzGX8fS.mjs} +113 -23
- package/dist/index-BdzGX8fS.mjs.map +1 -0
- package/dist/{index-eMCWYiRe.js → index-KUBcQdTX.js} +113 -22
- package/dist/index-KUBcQdTX.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/{index.native-ByI3rRu4.js → index.native-CZSRvIAb.js} +130 -23
- package/dist/index.native-CZSRvIAb.js.map +1 -0
- package/dist/{index.native-YmmnwqEw.mjs → index.native-N5zxPEYK.mjs} +130 -24
- package/dist/index.native-N5zxPEYK.mjs.map +1 -0
- package/dist/index.native.js +1 -1
- package/dist/index.native.mjs +1 -1
- package/dist/{injected-evm-wallet-provider-BIYAL_NZ.js → injected-evm-wallet-provider--XJFh-7d.js} +2 -2
- package/dist/{injected-evm-wallet-provider-BIYAL_NZ.js.map → injected-evm-wallet-provider--XJFh-7d.js.map} +1 -1
- package/dist/{injected-evm-wallet-provider-BMjQaUiB.js → injected-evm-wallet-provider-4T_-2UQI.js} +2 -2
- package/dist/{injected-evm-wallet-provider-BMjQaUiB.js.map → injected-evm-wallet-provider-4T_-2UQI.js.map} +1 -1
- package/dist/{injected-evm-wallet-provider--x3yWNps.mjs → injected-evm-wallet-provider-BlSFIzEA.mjs} +2 -2
- package/dist/{injected-evm-wallet-provider--x3yWNps.mjs.map → injected-evm-wallet-provider-BlSFIzEA.mjs.map} +1 -1
- package/dist/{injected-evm-wallet-provider-BoLGCVqD.mjs → injected-evm-wallet-provider-CtPPhtMh.mjs} +2 -2
- package/dist/{injected-evm-wallet-provider-BoLGCVqD.mjs.map → injected-evm-wallet-provider-CtPPhtMh.mjs.map} +1 -1
- package/dist/{injected-wallet-provider-DuWTw-fM.mjs → injected-wallet-provider-Bnsfazum.mjs} +2 -2
- package/dist/{injected-wallet-provider-DuWTw-fM.mjs.map → injected-wallet-provider-Bnsfazum.mjs.map} +1 -1
- package/dist/{injected-wallet-provider-D3fVFadN.js → injected-wallet-provider-CJ0v5Sgn.js} +2 -2
- package/dist/{injected-wallet-provider-D3fVFadN.js.map → injected-wallet-provider-CJ0v5Sgn.js.map} +1 -1
- package/dist/{injected-wallet-provider-zXw__lyf.js → injected-wallet-provider-Ckljhcbu.js} +2 -2
- package/dist/{injected-wallet-provider-zXw__lyf.js.map → injected-wallet-provider-Ckljhcbu.js.map} +1 -1
- package/dist/{injected-wallet-provider-DSOjJP3u.mjs → injected-wallet-provider-yyJfuVgv.mjs} +2 -2
- package/dist/{injected-wallet-provider-DSOjJP3u.mjs.map → injected-wallet-provider-yyJfuVgv.mjs.map} +1 -1
- package/package.json +2 -2
- package/dist/email-auth-provider-B9cZ-puM.mjs.map +0 -1
- package/dist/email-auth-provider-BYiK3ZCv.js.map +0 -1
- package/dist/email-auth-provider-C-qQ46kD.js.map +0 -1
- package/dist/email-auth-provider-DFHalX9c.mjs.map +0 -1
- package/dist/index-eMCWYiRe.js.map +0 -1
- package/dist/index-xNGb1ROp.mjs.map +0 -1
- package/dist/index.native-ByI3rRu4.js.map +0 -1
- package/dist/index.native-YmmnwqEw.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guest-auth-provider-BRq3JB0_.mjs","sources":["../.rollup-tmp/auth/providers/guest-keystore.js","../.rollup-tmp/auth/providers/guest-auth-provider.js"],"sourcesContent":["// guest-keystore.ts — durable per-device keypair for anonymous (\"guest\") auth.\n//\n// A guest is an ed25519 keypair generated on the device. Its public key is the\n// Bounded account address; it signs the auth challenge exactly like a wallet.\n//\n// Guest auth has one backend: WebCrypto Ed25519 + IndexedDB. The key is\n// NON-EXTRACTABLE: an XSS can ask it to sign but can never read the private\n// bytes. If WebCrypto or IndexedDB is unavailable, guest auth fails closed\n// instead of silently creating an extractable/stored-secret credential.\n//\n// The public output is a base58 address + a base64\n// detached signature, which is the format the session endpoint already accepts.\nimport bs58 from 'bs58';\nimport { getPlatform } from '../../platform';\nconst LEGACY_STORED_SECRET_KEY = 'bounded_guest_key_v1';\nconst IDB_NAME = 'bounded-guest';\nconst IDB_STORE = 'keys';\nconst IDB_KEY = 'ed25519';\nconst GUEST_KEY_REQUIREMENT = 'Guest auth requires non-extractable WebCrypto Ed25519 keys persisted in IndexedDB; ' +\n 'stored-secret guest credentials are disabled.';\nfunction toBase64(bytes) {\n let bin = '';\n for (let i = 0; i < bytes.length; i++)\n bin += String.fromCharCode(bytes[i]);\n // btoa exists in browsers + RN (Hermes) ; Buffer is the Node/SSR fallback.\n return typeof btoa !== 'undefined' ? btoa(bin) : Buffer.from(bytes).toString('base64');\n}\n// ----- WebCrypto (non-extractable) backend -----------------------------------\nfunction subtle() {\n const c = globalThis === null || globalThis === void 0 ? void 0 : globalThis.crypto;\n return c && c.subtle ? c.subtle : null;\n}\nfunction idb() {\n return new Promise((resolve, reject) => {\n const req = globalThis.indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nfunction idbGet(db, key) {\n return new Promise((resolve, reject) => {\n const r = db.transaction(IDB_STORE, 'readonly').objectStore(IDB_STORE).get(key);\n r.onsuccess = () => resolve(r.result);\n r.onerror = () => reject(r.error);\n });\n}\n// Atomic create-if-absent: the get and the conditional put happen inside ONE\n// readwrite transaction, so a concurrent creation cannot land between the read and\n// the write. Returns whatever ends up stored - the EXISTING key when another writer\n// won the race, otherwise the candidate. It NEVER overwrites an existing key, so a\n// racing tab's identity can no longer be stranded (DS4-0032).\n//\n// It settles on the TRANSACTION, not on the requests. A successful IndexedDB request\n// is not a durable write: the transaction can still abort at commit (quota exhausted\n// at flush, storage eviction), rolling the put back. Resolving from the request would\n// report a key as saved that is not on disk, and the caller would then mint a session\n// for an address this device cannot sign for - the same stranded identity from the\n// other direction.\nfunction idbGetOrPut(db, key, candidate) {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite');\n const store = tx.objectStore(IDB_STORE);\n let stored;\n const getReq = store.get(key);\n getReq.onsuccess = () => {\n const existing = getReq.result;\n if (existing !== undefined && existing !== null) {\n stored = existing;\n return;\n }\n const putReq = store.put(candidate, key);\n putReq.onsuccess = () => { stored = candidate; };\n };\n // A committed transaction that produced neither an existing key nor a stored\n // candidate cannot happen, but resolving `undefined` would hand the caller a\n // key-less identity, so refuse instead of guessing.\n tx.oncomplete = () => stored === undefined || stored === null\n ? reject(new Error('IndexedDB guest-key write committed without a key'))\n : resolve(stored);\n tx.onabort = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key write was rolled back')); };\n tx.onerror = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key write failed')); };\n });\n}\nfunction guestKeyUnavailable(cause) {\n const detail = cause instanceof Error && cause.message ? ` Cause: ${cause.message}` : '';\n return new Error(`${GUEST_KEY_REQUIREMENT}${detail}`);\n}\nasync function webCryptoKey(createIfMissing) {\n const s = subtle();\n if (!s)\n throw guestKeyUnavailable(new Error('WebCrypto subtle crypto is unavailable.'));\n if (typeof globalThis.indexedDB === 'undefined') {\n throw guestKeyUnavailable(new Error('IndexedDB is unavailable.'));\n }\n try {\n const db = await idb();\n let pair = (await idbGet(db, IDB_KEY));\n if (!pair) {\n if (!createIfMissing)\n return null;\n // Probe Ed25519 support by generating (throws on unsupported engines).\n const candidate = (await s.generateKey({ name: 'Ed25519' }, /* extractable */ false, [\n 'sign',\n 'verify',\n ]));\n // Persist atomically. If a concurrent creation already stored a key, keep\n // THEIRS and discard our candidate - never overwrite (DS4-0032). CryptoKey is\n // structured-cloneable; the private bytes are never exposed.\n pair = (await idbGetOrPut(db, IDB_KEY, candidate));\n }\n const raw = new Uint8Array(await s.exportKey('raw', pair.publicKey)); // public is exportable\n const address = bs58.encode(raw);\n return {\n address,\n nonExtractable: true,\n async sign(message) {\n const data = new TextEncoder().encode(message);\n const sig = new Uint8Array(await s.sign({ name: 'Ed25519' }, pair.privateKey, data));\n return toBase64(sig);\n },\n };\n }\n catch (error) {\n throw guestKeyUnavailable(error);\n }\n}\nlet cached = null;\n// Single-flight for creation: concurrent callers in ONE realm (a retry, two awaits,\n// two components mounting at once) share a single creation rather than each racing\n// to generate + persist. Cross-tab races are handled durably by idbGetOrPut; this\n// closes the same-realm window where `cached` is not yet set (DS4-0032).\nlet creating = null;\n/** Get (or create) this device's durable guest key. */\nexport async function getGuestKey() {\n if (cached)\n return cached;\n if (creating)\n return creating;\n creating = (async () => {\n const key = await webCryptoKey(true);\n if (!key)\n throw guestKeyUnavailable(new Error('Guest key creation returned no key.'));\n cached = key;\n return key;\n })();\n try {\n return await creating;\n }\n finally {\n creating = null;\n }\n}\n/** Read the existing durable guest key without ever minting a replacement. */\nexport async function getExistingGuestKey() {\n if (cached)\n return cached;\n cached = await webCryptoKey(false);\n return cached;\n}\n/** Forget the guest key on this device (a fresh signInAnonymously mints a new one). */\nexport async function clearGuestKey() {\n cached = null;\n // The legacy stored-secret cleanup stays best-effort: that key is not the durable\n // guest credential (it is a removed backend) and its absence is the normal case.\n try {\n getPlatform().storage.removeItem(LEGACY_STORED_SECRET_KEY);\n }\n catch (_a) { }\n // The IndexedDB delete is the DURABLE forget. A failure here must PROPAGATE\n // (DS2-0284): swallowing it - or resolving on the delete request's onerror -\n // reported a successful forget while the device key was still on disk, so a\n // caller (forgetGuest) believed the guest identity was wiped when it was not.\n if (typeof globalThis.indexedDB === 'undefined')\n return;\n const db = await idb();\n // Settle on the transaction for the same reason as idbGetOrPut: a delete request\n // that succeeded inside a transaction that later aborts leaves the key on disk,\n // and reporting THAT as a successful forget is exactly the DS2-0284 failure.\n await new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite');\n tx.objectStore(IDB_STORE).delete(IDB_KEY);\n tx.oncomplete = () => resolve();\n tx.onabort = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key delete was rolled back')); };\n tx.onerror = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key delete failed')); };\n });\n}\n","import { getActiveSessionManager as SessionManager, browserSignInDomain, createSessionWithSignature, genAuthNonce, genSolanaMessage, genSolanaSignInMessage, } from '@bounded-sh/core';\nimport { getPlatform } from '../../platform';\nimport { setCurrentUser, setAuthLoading } from '../../global';\nimport { getGuestKey, getExistingGuestKey, clearGuestKey } from './guest-keystore';\nconst GUEST_TX_UNSUPPORTED = 'Guest (anonymous) auth is offchain-only — it cannot sign or submit Solana transactions. ' +\n 'Use a wallet provider for onchain actions.';\nexport class GuestAuthProvider {\n async loginInternal(commitGlobalState, manageLoading) {\n if (manageLoading)\n setAuthLoading(true);\n try {\n const key = await getGuestKey();\n // Reuse a still-valid session for this exact guest.\n const existing = await SessionManager().getSession();\n if (existing && existing.address === key.address) {\n if (!this.tokenIsGuest(SessionManager().getIdToken(), key.address)) {\n throw new Error('The active session for this device key is not anonymous. Sign out explicitly before starting a guest session.');\n }\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n // Mint a fresh session: nonce -> the login text -> local signature. A browser page\n // sends its Origin, so it must sign the Sign In With Solana text naming the page host\n // (SEC-01); the device key is the SDK's own, so the SDK stamps that host itself.\n // Off-browser (React Native) no Origin is sent and the legacy template rides the\n // origin-less lane.\n const nonce = await genAuthNonce();\n const domain = browserSignInDomain();\n const message = domain\n ? await genSolanaSignInMessage(key.address, nonce, domain)\n : await genSolanaMessage(key.address, nonce);\n const signature = await key.sign(message); // base64 detached ed25519\n // Pass the discriminator explicitly. During a transactional switch the\n // shared core config intentionally remains on the previous provider until\n // this session is safely minted and persisted.\n const result = await createSessionWithSignature(key.address, message, signature, 'guest');\n if (!this.tokenIsGuest(result.idToken, key.address)) {\n throw new Error('Guest session issuer returned a non-anonymous or identity-mismatched token.');\n }\n await SessionManager().storeSession(key.address, result.accessToken, result.idToken, result.refreshToken);\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n finally {\n if (manageLoading)\n setAuthLoading(false);\n }\n }\n async login() {\n return this.loginInternal(true, true);\n }\n /** @internal Stage a guest session without exposing mixed provider/user state. */\n async loginForProviderSwitch() {\n return this.loginInternal(false, false);\n }\n tokenIsGuest(idToken, expectedAddress) {\n var _a;\n try {\n if (!idToken)\n return false;\n let b64 = (_a = idToken.split('.')[1]) === null || _a === void 0 ? void 0 : _a.replace(/-/g, '+').replace(/_/g, '/');\n if (!b64)\n return false;\n const pad = b64.length % 4;\n if (pad === 2)\n b64 += '==';\n else if (pad === 3)\n b64 += '=';\n const claims = JSON.parse(getPlatform().atob(b64));\n if ((claims === null || claims === void 0 ? void 0 : claims.is_anonymous) !== true)\n return false;\n if (expectedAddress && (claims === null || claims === void 0 ? void 0 : claims['custom:walletAddress']) !== expectedAddress)\n return false;\n return true;\n }\n catch (_b) {\n return false;\n }\n }\n async restoreSessionInternal(commitGlobalState, beforeCommit) {\n const manager = SessionManager();\n const session = await manager.getSession();\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n if (!session)\n return null;\n // The marker/provider choice is not authority. A guest provider may only\n // continue with an issuer-stamped guest bearer whose persisted device key\n // still controls the exact same address. Anything else is an identity split\n // and must lose bearer authority immediately.\n if (!this.tokenIsGuest(manager.getIdToken(), session.address)) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n let key;\n try {\n key = await getExistingGuestKey();\n }\n catch (_a) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n if (!key || session.address !== key.address) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n async restoreSession(beforeCommit) {\n return this.restoreSessionInternal(true, beforeCommit);\n }\n /** @internal Reconcile an applied-yet-error guest mint before committing a switch. */\n async restoreSessionForProviderSwitch() {\n return this.restoreSessionInternal(false);\n }\n async logout() {\n // Clears the SESSION but keeps the device key, so logging back in returns the\n // SAME guest identity (and its data). Use forgetGuest() to wipe the key too.\n await SessionManager().clearSession();\n setCurrentUser(null);\n }\n /** Wipe the device key — the next login() is a brand-new guest identity. */\n async forgetGuest() {\n await SessionManager().clearSession();\n await clearGuestKey();\n setCurrentUser(null);\n }\n async signMessage(message) {\n const key = await getGuestKey();\n return key.sign(message);\n }\n async signTransaction(_t) {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async signAndSubmitTransaction() {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async getNativeMethods() {\n return {};\n }\n}\n"],"names":["SessionManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"guest-auth-provider-Dw-bF10B.mjs","sources":["../.rollup-tmp/auth/providers/guest-keystore.js","../.rollup-tmp/auth/providers/guest-auth-provider.js"],"sourcesContent":["// guest-keystore.ts — durable per-device keypair for anonymous (\"guest\") auth.\n//\n// A guest is an ed25519 keypair generated on the device. Its public key is the\n// Bounded account address; it signs the auth challenge exactly like a wallet.\n//\n// Guest auth has one backend: WebCrypto Ed25519 + IndexedDB. The key is\n// NON-EXTRACTABLE: an XSS can ask it to sign but can never read the private\n// bytes. If WebCrypto or IndexedDB is unavailable, guest auth fails closed\n// instead of silently creating an extractable/stored-secret credential.\n//\n// The public output is a base58 address + a base64\n// detached signature, which is the format the session endpoint already accepts.\nimport bs58 from 'bs58';\nimport { getPlatform } from '../../platform';\nconst LEGACY_STORED_SECRET_KEY = 'bounded_guest_key_v1';\nconst IDB_NAME = 'bounded-guest';\nconst IDB_STORE = 'keys';\nconst IDB_KEY = 'ed25519';\nconst GUEST_KEY_REQUIREMENT = 'Guest auth requires non-extractable WebCrypto Ed25519 keys persisted in IndexedDB; ' +\n 'stored-secret guest credentials are disabled.';\nfunction toBase64(bytes) {\n let bin = '';\n for (let i = 0; i < bytes.length; i++)\n bin += String.fromCharCode(bytes[i]);\n // btoa exists in browsers + RN (Hermes) ; Buffer is the Node/SSR fallback.\n return typeof btoa !== 'undefined' ? btoa(bin) : Buffer.from(bytes).toString('base64');\n}\n// ----- WebCrypto (non-extractable) backend -----------------------------------\nfunction subtle() {\n const c = globalThis === null || globalThis === void 0 ? void 0 : globalThis.crypto;\n return c && c.subtle ? c.subtle : null;\n}\nfunction idb() {\n return new Promise((resolve, reject) => {\n const req = globalThis.indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nfunction idbGet(db, key) {\n return new Promise((resolve, reject) => {\n const r = db.transaction(IDB_STORE, 'readonly').objectStore(IDB_STORE).get(key);\n r.onsuccess = () => resolve(r.result);\n r.onerror = () => reject(r.error);\n });\n}\n// Atomic create-if-absent: the get and the conditional put happen inside ONE\n// readwrite transaction, so a concurrent creation cannot land between the read and\n// the write. Returns whatever ends up stored - the EXISTING key when another writer\n// won the race, otherwise the candidate. It NEVER overwrites an existing key, so a\n// racing tab's identity can no longer be stranded (DS4-0032).\n//\n// It settles on the TRANSACTION, not on the requests. A successful IndexedDB request\n// is not a durable write: the transaction can still abort at commit (quota exhausted\n// at flush, storage eviction), rolling the put back. Resolving from the request would\n// report a key as saved that is not on disk, and the caller would then mint a session\n// for an address this device cannot sign for - the same stranded identity from the\n// other direction.\nfunction idbGetOrPut(db, key, candidate) {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite');\n const store = tx.objectStore(IDB_STORE);\n let stored;\n const getReq = store.get(key);\n getReq.onsuccess = () => {\n const existing = getReq.result;\n if (existing !== undefined && existing !== null) {\n stored = existing;\n return;\n }\n const putReq = store.put(candidate, key);\n putReq.onsuccess = () => { stored = candidate; };\n };\n // A committed transaction that produced neither an existing key nor a stored\n // candidate cannot happen, but resolving `undefined` would hand the caller a\n // key-less identity, so refuse instead of guessing.\n tx.oncomplete = () => stored === undefined || stored === null\n ? reject(new Error('IndexedDB guest-key write committed without a key'))\n : resolve(stored);\n tx.onabort = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key write was rolled back')); };\n tx.onerror = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key write failed')); };\n });\n}\nfunction guestKeyUnavailable(cause) {\n const detail = cause instanceof Error && cause.message ? ` Cause: ${cause.message}` : '';\n return new Error(`${GUEST_KEY_REQUIREMENT}${detail}`);\n}\nasync function webCryptoKey(createIfMissing) {\n const s = subtle();\n if (!s)\n throw guestKeyUnavailable(new Error('WebCrypto subtle crypto is unavailable.'));\n if (typeof globalThis.indexedDB === 'undefined') {\n throw guestKeyUnavailable(new Error('IndexedDB is unavailable.'));\n }\n try {\n const db = await idb();\n let pair = (await idbGet(db, IDB_KEY));\n if (!pair) {\n if (!createIfMissing)\n return null;\n // Probe Ed25519 support by generating (throws on unsupported engines).\n const candidate = (await s.generateKey({ name: 'Ed25519' }, /* extractable */ false, [\n 'sign',\n 'verify',\n ]));\n // Persist atomically. If a concurrent creation already stored a key, keep\n // THEIRS and discard our candidate - never overwrite (DS4-0032). CryptoKey is\n // structured-cloneable; the private bytes are never exposed.\n pair = (await idbGetOrPut(db, IDB_KEY, candidate));\n }\n const raw = new Uint8Array(await s.exportKey('raw', pair.publicKey)); // public is exportable\n const address = bs58.encode(raw);\n return {\n address,\n nonExtractable: true,\n async sign(message) {\n const data = new TextEncoder().encode(message);\n const sig = new Uint8Array(await s.sign({ name: 'Ed25519' }, pair.privateKey, data));\n return toBase64(sig);\n },\n };\n }\n catch (error) {\n throw guestKeyUnavailable(error);\n }\n}\nlet cached = null;\n// Single-flight for creation: concurrent callers in ONE realm (a retry, two awaits,\n// two components mounting at once) share a single creation rather than each racing\n// to generate + persist. Cross-tab races are handled durably by idbGetOrPut; this\n// closes the same-realm window where `cached` is not yet set (DS4-0032).\nlet creating = null;\n/** Get (or create) this device's durable guest key. */\nexport async function getGuestKey() {\n if (cached)\n return cached;\n if (creating)\n return creating;\n creating = (async () => {\n const key = await webCryptoKey(true);\n if (!key)\n throw guestKeyUnavailable(new Error('Guest key creation returned no key.'));\n cached = key;\n return key;\n })();\n try {\n return await creating;\n }\n finally {\n creating = null;\n }\n}\n/** Read the existing durable guest key without ever minting a replacement. */\nexport async function getExistingGuestKey() {\n if (cached)\n return cached;\n cached = await webCryptoKey(false);\n return cached;\n}\n/** Forget the guest key on this device (a fresh signInAnonymously mints a new one). */\nexport async function clearGuestKey() {\n cached = null;\n // The legacy stored-secret cleanup stays best-effort: that key is not the durable\n // guest credential (it is a removed backend) and its absence is the normal case.\n try {\n getPlatform().storage.removeItem(LEGACY_STORED_SECRET_KEY);\n }\n catch (_a) { }\n // The IndexedDB delete is the DURABLE forget. A failure here must PROPAGATE\n // (DS2-0284): swallowing it - or resolving on the delete request's onerror -\n // reported a successful forget while the device key was still on disk, so a\n // caller (forgetGuest) believed the guest identity was wiped when it was not.\n if (typeof globalThis.indexedDB === 'undefined')\n return;\n const db = await idb();\n // Settle on the transaction for the same reason as idbGetOrPut: a delete request\n // that succeeded inside a transaction that later aborts leaves the key on disk,\n // and reporting THAT as a successful forget is exactly the DS2-0284 failure.\n await new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite');\n tx.objectStore(IDB_STORE).delete(IDB_KEY);\n tx.oncomplete = () => resolve();\n tx.onabort = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key delete was rolled back')); };\n tx.onerror = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key delete failed')); };\n });\n}\n","import { getActiveSessionManager as SessionManager, browserSignInDomain, createSessionWithSignature, genAuthNonce, genSolanaMessage, genSolanaSignInMessage, } from '@bounded-sh/core';\nimport { getPlatform } from '../../platform';\nimport { setCurrentUser, setAuthLoading } from '../../global';\nimport { getGuestKey, getExistingGuestKey, clearGuestKey } from './guest-keystore';\nconst GUEST_TX_UNSUPPORTED = 'Guest (anonymous) auth is offchain-only — it cannot sign or submit Solana transactions. ' +\n 'Use a wallet provider for onchain actions.';\nexport class GuestAuthProvider {\n async loginInternal(commitGlobalState, manageLoading) {\n if (manageLoading)\n setAuthLoading(true);\n try {\n const key = await getGuestKey();\n // Reuse a still-valid session for this exact guest.\n const existing = await SessionManager().getSession();\n if (existing && existing.address === key.address) {\n if (!this.tokenIsGuest(SessionManager().getIdToken(), key.address)) {\n throw new Error('The active session for this device key is not anonymous. Sign out explicitly before starting a guest session.');\n }\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n // Mint a fresh session: nonce -> the login text -> local signature. A browser page\n // sends its Origin, so it must sign the Sign In With Solana text naming the page host\n // (SEC-01); the device key is the SDK's own, so the SDK stamps that host itself.\n // Off-browser (React Native) no Origin is sent and the legacy template rides the\n // origin-less lane.\n const nonce = await genAuthNonce();\n const domain = browserSignInDomain();\n const message = domain\n ? await genSolanaSignInMessage(key.address, nonce, domain)\n : await genSolanaMessage(key.address, nonce);\n const signature = await key.sign(message); // base64 detached ed25519\n // Pass the discriminator explicitly. During a transactional switch the\n // shared core config intentionally remains on the previous provider until\n // this session is safely minted and persisted.\n const result = await createSessionWithSignature(key.address, message, signature, 'guest');\n if (!this.tokenIsGuest(result.idToken, key.address)) {\n throw new Error('Guest session issuer returned a non-anonymous or identity-mismatched token.');\n }\n await SessionManager().storeSession(key.address, result.accessToken, result.idToken, result.refreshToken);\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n finally {\n if (manageLoading)\n setAuthLoading(false);\n }\n }\n async login() {\n return this.loginInternal(true, true);\n }\n /** @internal Stage a guest session without exposing mixed provider/user state. */\n async loginForProviderSwitch() {\n return this.loginInternal(false, false);\n }\n tokenIsGuest(idToken, expectedAddress) {\n var _a;\n try {\n if (!idToken)\n return false;\n let b64 = (_a = idToken.split('.')[1]) === null || _a === void 0 ? void 0 : _a.replace(/-/g, '+').replace(/_/g, '/');\n if (!b64)\n return false;\n const pad = b64.length % 4;\n if (pad === 2)\n b64 += '==';\n else if (pad === 3)\n b64 += '=';\n const claims = JSON.parse(getPlatform().atob(b64));\n if ((claims === null || claims === void 0 ? void 0 : claims.is_anonymous) !== true)\n return false;\n if (expectedAddress && (claims === null || claims === void 0 ? void 0 : claims['custom:walletAddress']) !== expectedAddress)\n return false;\n return true;\n }\n catch (_b) {\n return false;\n }\n }\n async restoreSessionInternal(commitGlobalState, beforeCommit) {\n const manager = SessionManager();\n const session = await manager.getSession();\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n if (!session)\n return null;\n // The marker/provider choice is not authority. A guest provider may only\n // continue with an issuer-stamped guest bearer whose persisted device key\n // still controls the exact same address. Anything else is an identity split\n // and must lose bearer authority immediately.\n if (!this.tokenIsGuest(manager.getIdToken(), session.address)) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n let key;\n try {\n key = await getExistingGuestKey();\n }\n catch (_a) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n if (!key || session.address !== key.address) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n async restoreSession(beforeCommit) {\n return this.restoreSessionInternal(true, beforeCommit);\n }\n /** @internal Reconcile an applied-yet-error guest mint before committing a switch. */\n async restoreSessionForProviderSwitch() {\n return this.restoreSessionInternal(false);\n }\n async logout() {\n // Clears the SESSION but keeps the device key, so logging back in returns the\n // SAME guest identity (and its data). Use forgetGuest() to wipe the key too.\n await SessionManager().clearSession();\n setCurrentUser(null);\n }\n /** Wipe the device key — the next login() is a brand-new guest identity. */\n async forgetGuest() {\n await SessionManager().clearSession();\n await clearGuestKey();\n setCurrentUser(null);\n }\n async signMessage(message) {\n const key = await getGuestKey();\n return key.sign(message);\n }\n async signTransaction(_t) {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async signAndSubmitTransaction() {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async getNativeMethods() {\n return {};\n }\n}\n"],"names":["SessionManager"],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA,MAAM,wBAAwB,GAAG,sBAAsB;AACvD,MAAM,QAAQ,GAAG,eAAe;AAChC,MAAM,SAAS,GAAG,MAAM;AACxB,MAAM,OAAO,GAAG,SAAS;AACzB,MAAM,qBAAqB,GAAG,qFAAqF;AACnH,IAAI,+CAA+C;AACnD,SAAS,QAAQ,CAAC,KAAK,EAAE;AACzB,IAAI,IAAI,GAAG,GAAG,EAAE;AAChB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;AACzC,QAAQ,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5C;AACA,IAAI,OAAO,OAAO,IAAI,KAAK,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC1F;AACA;AACA,SAAS,MAAM,GAAG;AAClB,IAAI,MAAM,CAAC,GAAG,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC,MAAM;AACvF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI;AAC1C;AACA,SAAS,GAAG,GAAG;AACf,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAC5C,QAAQ,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1D,QAAQ,GAAG,CAAC,eAAe,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAC3E,QAAQ,GAAG,CAAC,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACjD,QAAQ,GAAG,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,IAAI,CAAC,CAAC;AACN;AACA,SAAS,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE;AACzB,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAC5C,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AACvF,QAAQ,CAAC,CAAC,SAAS,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAC7C,QAAQ,CAAC,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AACzC,IAAI,CAAC,CAAC;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;AACzC,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAC5C,QAAQ,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC;AACzD,QAAQ,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;AAC/C,QAAQ,IAAI,MAAM;AAClB,QAAQ,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACrC,QAAQ,MAAM,CAAC,SAAS,GAAG,MAAM;AACjC,YAAY,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM;AAC1C,YAAY,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE;AAC7D,gBAAgB,MAAM,GAAG,QAAQ;AACjC,gBAAgB;AAChB,YAAY;AACZ,YAAY,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC;AACpD,YAAY,MAAM,CAAC,SAAS,GAAG,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAC5D,QAAQ,CAAC;AACT;AACA;AACA;AACA,QAAQ,EAAE,CAAC,UAAU,GAAG,MAAM,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK;AACjE,cAAc,MAAM,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC;AACnF,cAAc,OAAO,CAAC,MAAM,CAAC;AAC7B,QAAQ,EAAE,CAAC,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9J,QAAQ,EAAE,CAAC,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrJ,IAAI,CAAC,CAAC;AACN;AACA,SAAS,mBAAmB,CAAC,KAAK,EAAE;AACpC,IAAI,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE;AAC5F,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACzD;AACA,eAAe,YAAY,CAAC,eAAe,EAAE;AAC7C,IAAI,MAAM,CAAC,GAAG,MAAM,EAAE;AACtB,IAAI,IAAI,CAAC,CAAC;AACV,QAAQ,MAAM,mBAAmB,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AACvF,IAAI,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,EAAE;AACrD,QAAQ,MAAM,mBAAmB,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AACzE,IAAI;AACJ,IAAI,IAAI;AACR,QAAQ,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE;AAC9B,QAAQ,IAAI,IAAI,IAAI,MAAM,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AAC9C,QAAQ,IAAI,CAAC,IAAI,EAAE;AACnB,YAAY,IAAI,CAAC,eAAe;AAChC,gBAAgB,OAAO,IAAI;AAC3B;AACA,YAAY,MAAM,SAAS,IAAI,MAAM,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,KAAK,EAAE;AACjG,gBAAgB,MAAM;AACtB,gBAAgB,QAAQ;AACxB,aAAa,CAAC,CAAC;AACf;AACA;AACA;AACA,YAAY,IAAI,IAAI,MAAM,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAC9D,QAAQ;AACR,QAAQ,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7E,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACxC,QAAQ,OAAO;AACf,YAAY,OAAO;AACnB,YAAY,cAAc,EAAE,IAAI;AAChC,YAAY,MAAM,IAAI,CAAC,OAAO,EAAE;AAChC,gBAAgB,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;AAC9D,gBAAgB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACpG,gBAAgB,OAAO,QAAQ,CAAC,GAAG,CAAC;AACpC,YAAY,CAAC;AACb,SAAS;AACT,IAAI;AACJ,IAAI,OAAO,KAAK,EAAE;AAClB,QAAQ,MAAM,mBAAmB,CAAC,KAAK,CAAC;AACxC,IAAI;AACJ;AACA,IAAI,MAAM,GAAG,IAAI;AACjB;AACA;AACA;AACA;AACA,IAAI,QAAQ,GAAG,IAAI;AACnB;AACO,eAAe,WAAW,GAAG;AACpC,IAAI,IAAI,MAAM;AACd,QAAQ,OAAO,MAAM;AACrB,IAAI,IAAI,QAAQ;AAChB,QAAQ,OAAO,QAAQ;AACvB,IAAI,QAAQ,GAAG,CAAC,YAAY;AAC5B,QAAQ,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;AAC5C,QAAQ,IAAI,CAAC,GAAG;AAChB,YAAY,MAAM,mBAAmB,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvF,QAAQ,MAAM,GAAG,GAAG;AACpB,QAAQ,OAAO,GAAG;AAClB,IAAI,CAAC,GAAG;AACR,IAAI,IAAI;AACR,QAAQ,OAAO,MAAM,QAAQ;AAC7B,IAAI;AACJ,YAAY;AACZ,QAAQ,QAAQ,GAAG,IAAI;AACvB,IAAI;AACJ;AACA;AACO,eAAe,mBAAmB,GAAG;AAC5C,IAAI,IAAI,MAAM;AACd,QAAQ,OAAO,MAAM;AACrB,IAAI,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC;AACtC,IAAI,OAAO,MAAM;AACjB;AACA;AACO,eAAe,aAAa,GAAG;AACtC,IAAI,MAAM,GAAG,IAAI;AACjB;AACA;AACA,IAAI,IAAI;AACR,QAAQ,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,wBAAwB,CAAC;AAClE,IAAI;AACJ,IAAI,OAAO,EAAE,EAAE,EAAE;AACjB;AACA;AACA;AACA;AACA,IAAI,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW;AACnD,QAAQ;AACR,IAAI,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE;AAC1B;AACA;AACA;AACA,IAAI,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAC3C,QAAQ,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC;AACzD,QAAQ,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACjD,QAAQ,EAAE,CAAC,UAAU,GAAG,MAAM,OAAO,EAAE;AACvC,QAAQ,EAAE,CAAC,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/J,QAAQ,EAAE,CAAC,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtJ,IAAI,CAAC,CAAC;AACN;;ACtLA,MAAM,oBAAoB,GAAG,0FAA0F;AACvH,IAAI,4CAA4C;AACzC,MAAM,iBAAiB,CAAC;AAC/B,IAAI,MAAM,aAAa,CAAC,iBAAiB,EAAE,aAAa,EAAE;AAC1D,QAAQ,IAAI,aAAa;AACzB,YAAY,cAAc,CAAC,IAAI,CAAC;AAChC,QAAQ,IAAI;AACZ,YAAY,MAAM,GAAG,GAAG,MAAM,WAAW,EAAE;AAC3C;AACA,YAAY,MAAM,QAAQ,GAAG,MAAMA,uBAAc,EAAE,CAAC,UAAU,EAAE;AAChE,YAAY,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE;AAC9D,gBAAgB,IAAI,CAAC,IAAI,CAAC,YAAY,CAACA,uBAAc,EAAE,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;AACpF,oBAAoB,MAAM,IAAI,KAAK,CAAC,+GAA+G,CAAC;AACpJ,gBAAgB;AAChB,gBAAgB,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AACxF,gBAAgB,IAAI,iBAAiB;AACrC,oBAAoB,cAAc,CAAC,IAAI,CAAC;AACxC,gBAAgB,OAAO,IAAI;AAC3B,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE;AAC9C,YAAY,MAAM,MAAM,GAAG,mBAAmB,EAAE;AAChD,YAAY,MAAM,OAAO,GAAG;AAC5B,kBAAkB,MAAM,sBAAsB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM;AACzE,kBAAkB,MAAM,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;AAC5D,YAAY,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtD;AACA;AACA;AACA,YAAY,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AACrG,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;AACjE,gBAAgB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC;AAC9G,YAAY;AACZ,YAAY,MAAMA,uBAAc,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC;AACrH,YAAY,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AACpF,YAAY,IAAI,iBAAiB;AACjC,gBAAgB,cAAc,CAAC,IAAI,CAAC;AACpC,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,gBAAgB;AAChB,YAAY,IAAI,aAAa;AAC7B,gBAAgB,cAAc,CAAC,KAAK,CAAC;AACrC,QAAQ;AACR,IAAI;AACJ,IAAI,MAAM,KAAK,GAAG;AAClB,QAAQ,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;AAC7C,IAAI;AACJ;AACA,IAAI,MAAM,sBAAsB,GAAG;AACnC,QAAQ,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;AAC/C,IAAI;AACJ,IAAI,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE;AAC3C,QAAQ,IAAI,EAAE;AACd,QAAQ,IAAI;AACZ,YAAY,IAAI,CAAC,OAAO;AACxB,gBAAgB,OAAO,KAAK;AAC5B,YAAY,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAChI,YAAY,IAAI,CAAC,GAAG;AACpB,gBAAgB,OAAO,KAAK;AAC5B,YAAY,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC;AACtC,YAAY,IAAI,GAAG,KAAK,CAAC;AACzB,gBAAgB,GAAG,IAAI,IAAI;AAC3B,iBAAiB,IAAI,GAAG,KAAK,CAAC;AAC9B,gBAAgB,GAAG,IAAI,GAAG;AAC1B,YAAY,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9D,YAAY,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,YAAY,MAAM,IAAI;AAC9F,gBAAgB,OAAO,KAAK;AAC5B,YAAY,IAAI,eAAe,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,sBAAsB,CAAC,MAAM,eAAe;AACvI,gBAAgB,OAAO,KAAK;AAC5B,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,EAAE,EAAE;AACnB,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,IAAI;AACJ,IAAI,MAAM,sBAAsB,CAAC,iBAAiB,EAAE,YAAY,EAAE;AAClE,QAAQ,MAAM,OAAO,GAAGA,uBAAc,EAAE;AACxC,QAAQ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE;AAClD,QAAQ,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,MAAM,GAAG,MAAM,GAAG,YAAY,EAAE;AAClF,QAAQ,IAAI,CAAC,OAAO;AACpB,YAAY,OAAO,IAAI;AACvB;AACA;AACA;AACA;AACA,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;AACvE,YAAY,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,MAAM,GAAG,MAAM,GAAG,YAAY,EAAE;AACtF,YAAY,MAAM,OAAO,CAAC,YAAY,EAAE;AACxC,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,IAAI,GAAG;AACf,QAAQ,IAAI;AACZ,YAAY,GAAG,GAAG,MAAM,mBAAmB,EAAE;AAC7C,QAAQ;AACR,QAAQ,OAAO,EAAE,EAAE;AACnB,YAAY,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,MAAM,GAAG,MAAM,GAAG,YAAY,EAAE;AACtF,YAAY,MAAM,OAAO,CAAC,YAAY,EAAE;AACxC,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE;AACrD,YAAY,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,MAAM,GAAG,MAAM,GAAG,YAAY,EAAE;AACtF,YAAY,MAAM,OAAO,CAAC,YAAY,EAAE;AACxC,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,MAAM,GAAG,MAAM,GAAG,YAAY,EAAE;AAClF,QAAQ,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AAChF,QAAQ,IAAI,iBAAiB;AAC7B,YAAY,cAAc,CAAC,IAAI,CAAC;AAChC,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ,IAAI,MAAM,cAAc,CAAC,YAAY,EAAE;AACvC,QAAQ,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC;AAC9D,IAAI;AACJ;AACA,IAAI,MAAM,+BAA+B,GAAG;AAC5C,QAAQ,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;AACjD,IAAI;AACJ,IAAI,MAAM,MAAM,GAAG;AACnB;AACA;AACA,QAAQ,MAAMA,uBAAc,EAAE,CAAC,YAAY,EAAE;AAC7C,QAAQ,cAAc,CAAC,IAAI,CAAC;AAC5B,IAAI;AACJ;AACA,IAAI,MAAM,WAAW,GAAG;AACxB,QAAQ,MAAMA,uBAAc,EAAE,CAAC,YAAY,EAAE;AAC7C,QAAQ,MAAM,aAAa,EAAE;AAC7B,QAAQ,cAAc,CAAC,IAAI,CAAC;AAC5B,IAAI;AACJ,IAAI,MAAM,WAAW,CAAC,OAAO,EAAE;AAC/B,QAAQ,MAAM,GAAG,GAAG,MAAM,WAAW,EAAE;AACvC,QAAQ,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;AAChC,IAAI;AACJ,IAAI,MAAM,eAAe,CAAC,EAAE,EAAE;AAC9B,QAAQ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;AAC7C,IAAI;AACJ,IAAI,MAAM,wBAAwB,GAAG;AACrC,QAAQ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;AAC7C,IAAI;AACJ,IAAI,MAAM,gBAAgB,GAAG;AAC7B,QAAQ,OAAO,EAAE;AACjB,IAAI;AACJ;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getActiveSessionManager, genAuthNonce, browserSignInDomain, genSolanaSignInMessage, genSolanaMessage, createSessionWithSignature } from '@bounded-sh/core';
|
|
2
|
-
import { g as getPlatform,
|
|
2
|
+
import { g as getPlatform, f as bs58, m as setAuthLoading, s as setCurrentUser } from './index.native-N5zxPEYK.mjs';
|
|
3
3
|
import 'react';
|
|
4
4
|
|
|
5
5
|
// guest-keystore.ts — durable per-device keypair for anonymous ("guest") auth.
|
|
@@ -337,4 +337,4 @@ class GuestAuthProvider {
|
|
|
337
337
|
}
|
|
338
338
|
|
|
339
339
|
export { GuestAuthProvider };
|
|
340
|
-
//# sourceMappingURL=guest-auth-provider-
|
|
340
|
+
//# sourceMappingURL=guest-auth-provider-DxQG3JvU.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guest-auth-provider-i8-RL0js.mjs","sources":["../.rollup-tmp/auth/providers/guest-keystore.js","../.rollup-tmp/auth/providers/guest-auth-provider.js"],"sourcesContent":["// guest-keystore.ts — durable per-device keypair for anonymous (\"guest\") auth.\n//\n// A guest is an ed25519 keypair generated on the device. Its public key is the\n// Bounded account address; it signs the auth challenge exactly like a wallet.\n//\n// Guest auth has one backend: WebCrypto Ed25519 + IndexedDB. The key is\n// NON-EXTRACTABLE: an XSS can ask it to sign but can never read the private\n// bytes. If WebCrypto or IndexedDB is unavailable, guest auth fails closed\n// instead of silently creating an extractable/stored-secret credential.\n//\n// The public output is a base58 address + a base64\n// detached signature, which is the format the session endpoint already accepts.\nimport bs58 from 'bs58';\nimport { getPlatform } from '../../platform';\nconst LEGACY_STORED_SECRET_KEY = 'bounded_guest_key_v1';\nconst IDB_NAME = 'bounded-guest';\nconst IDB_STORE = 'keys';\nconst IDB_KEY = 'ed25519';\nconst GUEST_KEY_REQUIREMENT = 'Guest auth requires non-extractable WebCrypto Ed25519 keys persisted in IndexedDB; ' +\n 'stored-secret guest credentials are disabled.';\nfunction toBase64(bytes) {\n let bin = '';\n for (let i = 0; i < bytes.length; i++)\n bin += String.fromCharCode(bytes[i]);\n // btoa exists in browsers + RN (Hermes) ; Buffer is the Node/SSR fallback.\n return typeof btoa !== 'undefined' ? btoa(bin) : Buffer.from(bytes).toString('base64');\n}\n// ----- WebCrypto (non-extractable) backend -----------------------------------\nfunction subtle() {\n const c = globalThis === null || globalThis === void 0 ? void 0 : globalThis.crypto;\n return c && c.subtle ? c.subtle : null;\n}\nfunction idb() {\n return new Promise((resolve, reject) => {\n const req = globalThis.indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nfunction idbGet(db, key) {\n return new Promise((resolve, reject) => {\n const r = db.transaction(IDB_STORE, 'readonly').objectStore(IDB_STORE).get(key);\n r.onsuccess = () => resolve(r.result);\n r.onerror = () => reject(r.error);\n });\n}\n// Atomic create-if-absent: the get and the conditional put happen inside ONE\n// readwrite transaction, so a concurrent creation cannot land between the read and\n// the write. Returns whatever ends up stored - the EXISTING key when another writer\n// won the race, otherwise the candidate. It NEVER overwrites an existing key, so a\n// racing tab's identity can no longer be stranded (DS4-0032).\n//\n// It settles on the TRANSACTION, not on the requests. A successful IndexedDB request\n// is not a durable write: the transaction can still abort at commit (quota exhausted\n// at flush, storage eviction), rolling the put back. Resolving from the request would\n// report a key as saved that is not on disk, and the caller would then mint a session\n// for an address this device cannot sign for - the same stranded identity from the\n// other direction.\nfunction idbGetOrPut(db, key, candidate) {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite');\n const store = tx.objectStore(IDB_STORE);\n let stored;\n const getReq = store.get(key);\n getReq.onsuccess = () => {\n const existing = getReq.result;\n if (existing !== undefined && existing !== null) {\n stored = existing;\n return;\n }\n const putReq = store.put(candidate, key);\n putReq.onsuccess = () => { stored = candidate; };\n };\n // A committed transaction that produced neither an existing key nor a stored\n // candidate cannot happen, but resolving `undefined` would hand the caller a\n // key-less identity, so refuse instead of guessing.\n tx.oncomplete = () => stored === undefined || stored === null\n ? reject(new Error('IndexedDB guest-key write committed without a key'))\n : resolve(stored);\n tx.onabort = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key write was rolled back')); };\n tx.onerror = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key write failed')); };\n });\n}\nfunction guestKeyUnavailable(cause) {\n const detail = cause instanceof Error && cause.message ? ` Cause: ${cause.message}` : '';\n return new Error(`${GUEST_KEY_REQUIREMENT}${detail}`);\n}\nasync function webCryptoKey(createIfMissing) {\n const s = subtle();\n if (!s)\n throw guestKeyUnavailable(new Error('WebCrypto subtle crypto is unavailable.'));\n if (typeof globalThis.indexedDB === 'undefined') {\n throw guestKeyUnavailable(new Error('IndexedDB is unavailable.'));\n }\n try {\n const db = await idb();\n let pair = (await idbGet(db, IDB_KEY));\n if (!pair) {\n if (!createIfMissing)\n return null;\n // Probe Ed25519 support by generating (throws on unsupported engines).\n const candidate = (await s.generateKey({ name: 'Ed25519' }, /* extractable */ false, [\n 'sign',\n 'verify',\n ]));\n // Persist atomically. If a concurrent creation already stored a key, keep\n // THEIRS and discard our candidate - never overwrite (DS4-0032). CryptoKey is\n // structured-cloneable; the private bytes are never exposed.\n pair = (await idbGetOrPut(db, IDB_KEY, candidate));\n }\n const raw = new Uint8Array(await s.exportKey('raw', pair.publicKey)); // public is exportable\n const address = bs58.encode(raw);\n return {\n address,\n nonExtractable: true,\n async sign(message) {\n const data = new TextEncoder().encode(message);\n const sig = new Uint8Array(await s.sign({ name: 'Ed25519' }, pair.privateKey, data));\n return toBase64(sig);\n },\n };\n }\n catch (error) {\n throw guestKeyUnavailable(error);\n }\n}\nlet cached = null;\n// Single-flight for creation: concurrent callers in ONE realm (a retry, two awaits,\n// two components mounting at once) share a single creation rather than each racing\n// to generate + persist. Cross-tab races are handled durably by idbGetOrPut; this\n// closes the same-realm window where `cached` is not yet set (DS4-0032).\nlet creating = null;\n/** Get (or create) this device's durable guest key. */\nexport async function getGuestKey() {\n if (cached)\n return cached;\n if (creating)\n return creating;\n creating = (async () => {\n const key = await webCryptoKey(true);\n if (!key)\n throw guestKeyUnavailable(new Error('Guest key creation returned no key.'));\n cached = key;\n return key;\n })();\n try {\n return await creating;\n }\n finally {\n creating = null;\n }\n}\n/** Read the existing durable guest key without ever minting a replacement. */\nexport async function getExistingGuestKey() {\n if (cached)\n return cached;\n cached = await webCryptoKey(false);\n return cached;\n}\n/** Forget the guest key on this device (a fresh signInAnonymously mints a new one). */\nexport async function clearGuestKey() {\n cached = null;\n // The legacy stored-secret cleanup stays best-effort: that key is not the durable\n // guest credential (it is a removed backend) and its absence is the normal case.\n try {\n getPlatform().storage.removeItem(LEGACY_STORED_SECRET_KEY);\n }\n catch (_a) { }\n // The IndexedDB delete is the DURABLE forget. A failure here must PROPAGATE\n // (DS2-0284): swallowing it - or resolving on the delete request's onerror -\n // reported a successful forget while the device key was still on disk, so a\n // caller (forgetGuest) believed the guest identity was wiped when it was not.\n if (typeof globalThis.indexedDB === 'undefined')\n return;\n const db = await idb();\n // Settle on the transaction for the same reason as idbGetOrPut: a delete request\n // that succeeded inside a transaction that later aborts leaves the key on disk,\n // and reporting THAT as a successful forget is exactly the DS2-0284 failure.\n await new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite');\n tx.objectStore(IDB_STORE).delete(IDB_KEY);\n tx.oncomplete = () => resolve();\n tx.onabort = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key delete was rolled back')); };\n tx.onerror = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key delete failed')); };\n });\n}\n","import { getActiveSessionManager as SessionManager, browserSignInDomain, createSessionWithSignature, genAuthNonce, genSolanaMessage, genSolanaSignInMessage, } from '@bounded-sh/core';\nimport { getPlatform } from '../../platform';\nimport { setCurrentUser, setAuthLoading } from '../../global';\nimport { getGuestKey, getExistingGuestKey, clearGuestKey } from './guest-keystore';\nconst GUEST_TX_UNSUPPORTED = 'Guest (anonymous) auth is offchain-only — it cannot sign or submit Solana transactions. ' +\n 'Use a wallet provider for onchain actions.';\nexport class GuestAuthProvider {\n async loginInternal(commitGlobalState, manageLoading) {\n if (manageLoading)\n setAuthLoading(true);\n try {\n const key = await getGuestKey();\n // Reuse a still-valid session for this exact guest.\n const existing = await SessionManager().getSession();\n if (existing && existing.address === key.address) {\n if (!this.tokenIsGuest(SessionManager().getIdToken(), key.address)) {\n throw new Error('The active session for this device key is not anonymous. Sign out explicitly before starting a guest session.');\n }\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n // Mint a fresh session: nonce -> the login text -> local signature. A browser page\n // sends its Origin, so it must sign the Sign In With Solana text naming the page host\n // (SEC-01); the device key is the SDK's own, so the SDK stamps that host itself.\n // Off-browser (React Native) no Origin is sent and the legacy template rides the\n // origin-less lane.\n const nonce = await genAuthNonce();\n const domain = browserSignInDomain();\n const message = domain\n ? await genSolanaSignInMessage(key.address, nonce, domain)\n : await genSolanaMessage(key.address, nonce);\n const signature = await key.sign(message); // base64 detached ed25519\n // Pass the discriminator explicitly. During a transactional switch the\n // shared core config intentionally remains on the previous provider until\n // this session is safely minted and persisted.\n const result = await createSessionWithSignature(key.address, message, signature, 'guest');\n if (!this.tokenIsGuest(result.idToken, key.address)) {\n throw new Error('Guest session issuer returned a non-anonymous or identity-mismatched token.');\n }\n await SessionManager().storeSession(key.address, result.accessToken, result.idToken, result.refreshToken);\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n finally {\n if (manageLoading)\n setAuthLoading(false);\n }\n }\n async login() {\n return this.loginInternal(true, true);\n }\n /** @internal Stage a guest session without exposing mixed provider/user state. */\n async loginForProviderSwitch() {\n return this.loginInternal(false, false);\n }\n tokenIsGuest(idToken, expectedAddress) {\n var _a;\n try {\n if (!idToken)\n return false;\n let b64 = (_a = idToken.split('.')[1]) === null || _a === void 0 ? void 0 : _a.replace(/-/g, '+').replace(/_/g, '/');\n if (!b64)\n return false;\n const pad = b64.length % 4;\n if (pad === 2)\n b64 += '==';\n else if (pad === 3)\n b64 += '=';\n const claims = JSON.parse(getPlatform().atob(b64));\n if ((claims === null || claims === void 0 ? void 0 : claims.is_anonymous) !== true)\n return false;\n if (expectedAddress && (claims === null || claims === void 0 ? void 0 : claims['custom:walletAddress']) !== expectedAddress)\n return false;\n return true;\n }\n catch (_b) {\n return false;\n }\n }\n async restoreSessionInternal(commitGlobalState, beforeCommit) {\n const manager = SessionManager();\n const session = await manager.getSession();\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n if (!session)\n return null;\n // The marker/provider choice is not authority. A guest provider may only\n // continue with an issuer-stamped guest bearer whose persisted device key\n // still controls the exact same address. Anything else is an identity split\n // and must lose bearer authority immediately.\n if (!this.tokenIsGuest(manager.getIdToken(), session.address)) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n let key;\n try {\n key = await getExistingGuestKey();\n }\n catch (_a) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n if (!key || session.address !== key.address) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n async restoreSession(beforeCommit) {\n return this.restoreSessionInternal(true, beforeCommit);\n }\n /** @internal Reconcile an applied-yet-error guest mint before committing a switch. */\n async restoreSessionForProviderSwitch() {\n return this.restoreSessionInternal(false);\n }\n async logout() {\n // Clears the SESSION but keeps the device key, so logging back in returns the\n // SAME guest identity (and its data). Use forgetGuest() to wipe the key too.\n await SessionManager().clearSession();\n setCurrentUser(null);\n }\n /** Wipe the device key — the next login() is a brand-new guest identity. */\n async forgetGuest() {\n await SessionManager().clearSession();\n await clearGuestKey();\n setCurrentUser(null);\n }\n async signMessage(message) {\n const key = await getGuestKey();\n return key.sign(message);\n }\n async signTransaction(_t) {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async signAndSubmitTransaction() {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async getNativeMethods() {\n return {};\n }\n}\n"],"names":["SessionManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"guest-auth-provider-DxQG3JvU.mjs","sources":["../.rollup-tmp/auth/providers/guest-keystore.js","../.rollup-tmp/auth/providers/guest-auth-provider.js"],"sourcesContent":["// guest-keystore.ts — durable per-device keypair for anonymous (\"guest\") auth.\n//\n// A guest is an ed25519 keypair generated on the device. Its public key is the\n// Bounded account address; it signs the auth challenge exactly like a wallet.\n//\n// Guest auth has one backend: WebCrypto Ed25519 + IndexedDB. The key is\n// NON-EXTRACTABLE: an XSS can ask it to sign but can never read the private\n// bytes. If WebCrypto or IndexedDB is unavailable, guest auth fails closed\n// instead of silently creating an extractable/stored-secret credential.\n//\n// The public output is a base58 address + a base64\n// detached signature, which is the format the session endpoint already accepts.\nimport bs58 from 'bs58';\nimport { getPlatform } from '../../platform';\nconst LEGACY_STORED_SECRET_KEY = 'bounded_guest_key_v1';\nconst IDB_NAME = 'bounded-guest';\nconst IDB_STORE = 'keys';\nconst IDB_KEY = 'ed25519';\nconst GUEST_KEY_REQUIREMENT = 'Guest auth requires non-extractable WebCrypto Ed25519 keys persisted in IndexedDB; ' +\n 'stored-secret guest credentials are disabled.';\nfunction toBase64(bytes) {\n let bin = '';\n for (let i = 0; i < bytes.length; i++)\n bin += String.fromCharCode(bytes[i]);\n // btoa exists in browsers + RN (Hermes) ; Buffer is the Node/SSR fallback.\n return typeof btoa !== 'undefined' ? btoa(bin) : Buffer.from(bytes).toString('base64');\n}\n// ----- WebCrypto (non-extractable) backend -----------------------------------\nfunction subtle() {\n const c = globalThis === null || globalThis === void 0 ? void 0 : globalThis.crypto;\n return c && c.subtle ? c.subtle : null;\n}\nfunction idb() {\n return new Promise((resolve, reject) => {\n const req = globalThis.indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nfunction idbGet(db, key) {\n return new Promise((resolve, reject) => {\n const r = db.transaction(IDB_STORE, 'readonly').objectStore(IDB_STORE).get(key);\n r.onsuccess = () => resolve(r.result);\n r.onerror = () => reject(r.error);\n });\n}\n// Atomic create-if-absent: the get and the conditional put happen inside ONE\n// readwrite transaction, so a concurrent creation cannot land between the read and\n// the write. Returns whatever ends up stored - the EXISTING key when another writer\n// won the race, otherwise the candidate. It NEVER overwrites an existing key, so a\n// racing tab's identity can no longer be stranded (DS4-0032).\n//\n// It settles on the TRANSACTION, not on the requests. A successful IndexedDB request\n// is not a durable write: the transaction can still abort at commit (quota exhausted\n// at flush, storage eviction), rolling the put back. Resolving from the request would\n// report a key as saved that is not on disk, and the caller would then mint a session\n// for an address this device cannot sign for - the same stranded identity from the\n// other direction.\nfunction idbGetOrPut(db, key, candidate) {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite');\n const store = tx.objectStore(IDB_STORE);\n let stored;\n const getReq = store.get(key);\n getReq.onsuccess = () => {\n const existing = getReq.result;\n if (existing !== undefined && existing !== null) {\n stored = existing;\n return;\n }\n const putReq = store.put(candidate, key);\n putReq.onsuccess = () => { stored = candidate; };\n };\n // A committed transaction that produced neither an existing key nor a stored\n // candidate cannot happen, but resolving `undefined` would hand the caller a\n // key-less identity, so refuse instead of guessing.\n tx.oncomplete = () => stored === undefined || stored === null\n ? reject(new Error('IndexedDB guest-key write committed without a key'))\n : resolve(stored);\n tx.onabort = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key write was rolled back')); };\n tx.onerror = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key write failed')); };\n });\n}\nfunction guestKeyUnavailable(cause) {\n const detail = cause instanceof Error && cause.message ? ` Cause: ${cause.message}` : '';\n return new Error(`${GUEST_KEY_REQUIREMENT}${detail}`);\n}\nasync function webCryptoKey(createIfMissing) {\n const s = subtle();\n if (!s)\n throw guestKeyUnavailable(new Error('WebCrypto subtle crypto is unavailable.'));\n if (typeof globalThis.indexedDB === 'undefined') {\n throw guestKeyUnavailable(new Error('IndexedDB is unavailable.'));\n }\n try {\n const db = await idb();\n let pair = (await idbGet(db, IDB_KEY));\n if (!pair) {\n if (!createIfMissing)\n return null;\n // Probe Ed25519 support by generating (throws on unsupported engines).\n const candidate = (await s.generateKey({ name: 'Ed25519' }, /* extractable */ false, [\n 'sign',\n 'verify',\n ]));\n // Persist atomically. If a concurrent creation already stored a key, keep\n // THEIRS and discard our candidate - never overwrite (DS4-0032). CryptoKey is\n // structured-cloneable; the private bytes are never exposed.\n pair = (await idbGetOrPut(db, IDB_KEY, candidate));\n }\n const raw = new Uint8Array(await s.exportKey('raw', pair.publicKey)); // public is exportable\n const address = bs58.encode(raw);\n return {\n address,\n nonExtractable: true,\n async sign(message) {\n const data = new TextEncoder().encode(message);\n const sig = new Uint8Array(await s.sign({ name: 'Ed25519' }, pair.privateKey, data));\n return toBase64(sig);\n },\n };\n }\n catch (error) {\n throw guestKeyUnavailable(error);\n }\n}\nlet cached = null;\n// Single-flight for creation: concurrent callers in ONE realm (a retry, two awaits,\n// two components mounting at once) share a single creation rather than each racing\n// to generate + persist. Cross-tab races are handled durably by idbGetOrPut; this\n// closes the same-realm window where `cached` is not yet set (DS4-0032).\nlet creating = null;\n/** Get (or create) this device's durable guest key. */\nexport async function getGuestKey() {\n if (cached)\n return cached;\n if (creating)\n return creating;\n creating = (async () => {\n const key = await webCryptoKey(true);\n if (!key)\n throw guestKeyUnavailable(new Error('Guest key creation returned no key.'));\n cached = key;\n return key;\n })();\n try {\n return await creating;\n }\n finally {\n creating = null;\n }\n}\n/** Read the existing durable guest key without ever minting a replacement. */\nexport async function getExistingGuestKey() {\n if (cached)\n return cached;\n cached = await webCryptoKey(false);\n return cached;\n}\n/** Forget the guest key on this device (a fresh signInAnonymously mints a new one). */\nexport async function clearGuestKey() {\n cached = null;\n // The legacy stored-secret cleanup stays best-effort: that key is not the durable\n // guest credential (it is a removed backend) and its absence is the normal case.\n try {\n getPlatform().storage.removeItem(LEGACY_STORED_SECRET_KEY);\n }\n catch (_a) { }\n // The IndexedDB delete is the DURABLE forget. A failure here must PROPAGATE\n // (DS2-0284): swallowing it - or resolving on the delete request's onerror -\n // reported a successful forget while the device key was still on disk, so a\n // caller (forgetGuest) believed the guest identity was wiped when it was not.\n if (typeof globalThis.indexedDB === 'undefined')\n return;\n const db = await idb();\n // Settle on the transaction for the same reason as idbGetOrPut: a delete request\n // that succeeded inside a transaction that later aborts leaves the key on disk,\n // and reporting THAT as a successful forget is exactly the DS2-0284 failure.\n await new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, 'readwrite');\n tx.objectStore(IDB_STORE).delete(IDB_KEY);\n tx.oncomplete = () => resolve();\n tx.onabort = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key delete was rolled back')); };\n tx.onerror = () => { var _a; return reject((_a = tx.error) !== null && _a !== void 0 ? _a : new Error('IndexedDB guest-key delete failed')); };\n });\n}\n","import { getActiveSessionManager as SessionManager, browserSignInDomain, createSessionWithSignature, genAuthNonce, genSolanaMessage, genSolanaSignInMessage, } from '@bounded-sh/core';\nimport { getPlatform } from '../../platform';\nimport { setCurrentUser, setAuthLoading } from '../../global';\nimport { getGuestKey, getExistingGuestKey, clearGuestKey } from './guest-keystore';\nconst GUEST_TX_UNSUPPORTED = 'Guest (anonymous) auth is offchain-only — it cannot sign or submit Solana transactions. ' +\n 'Use a wallet provider for onchain actions.';\nexport class GuestAuthProvider {\n async loginInternal(commitGlobalState, manageLoading) {\n if (manageLoading)\n setAuthLoading(true);\n try {\n const key = await getGuestKey();\n // Reuse a still-valid session for this exact guest.\n const existing = await SessionManager().getSession();\n if (existing && existing.address === key.address) {\n if (!this.tokenIsGuest(SessionManager().getIdToken(), key.address)) {\n throw new Error('The active session for this device key is not anonymous. Sign out explicitly before starting a guest session.');\n }\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n // Mint a fresh session: nonce -> the login text -> local signature. A browser page\n // sends its Origin, so it must sign the Sign In With Solana text naming the page host\n // (SEC-01); the device key is the SDK's own, so the SDK stamps that host itself.\n // Off-browser (React Native) no Origin is sent and the legacy template rides the\n // origin-less lane.\n const nonce = await genAuthNonce();\n const domain = browserSignInDomain();\n const message = domain\n ? await genSolanaSignInMessage(key.address, nonce, domain)\n : await genSolanaMessage(key.address, nonce);\n const signature = await key.sign(message); // base64 detached ed25519\n // Pass the discriminator explicitly. During a transactional switch the\n // shared core config intentionally remains on the previous provider until\n // this session is safely minted and persisted.\n const result = await createSessionWithSignature(key.address, message, signature, 'guest');\n if (!this.tokenIsGuest(result.idToken, key.address)) {\n throw new Error('Guest session issuer returned a non-anonymous or identity-mismatched token.');\n }\n await SessionManager().storeSession(key.address, result.accessToken, result.idToken, result.refreshToken);\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n finally {\n if (manageLoading)\n setAuthLoading(false);\n }\n }\n async login() {\n return this.loginInternal(true, true);\n }\n /** @internal Stage a guest session without exposing mixed provider/user state. */\n async loginForProviderSwitch() {\n return this.loginInternal(false, false);\n }\n tokenIsGuest(idToken, expectedAddress) {\n var _a;\n try {\n if (!idToken)\n return false;\n let b64 = (_a = idToken.split('.')[1]) === null || _a === void 0 ? void 0 : _a.replace(/-/g, '+').replace(/_/g, '/');\n if (!b64)\n return false;\n const pad = b64.length % 4;\n if (pad === 2)\n b64 += '==';\n else if (pad === 3)\n b64 += '=';\n const claims = JSON.parse(getPlatform().atob(b64));\n if ((claims === null || claims === void 0 ? void 0 : claims.is_anonymous) !== true)\n return false;\n if (expectedAddress && (claims === null || claims === void 0 ? void 0 : claims['custom:walletAddress']) !== expectedAddress)\n return false;\n return true;\n }\n catch (_b) {\n return false;\n }\n }\n async restoreSessionInternal(commitGlobalState, beforeCommit) {\n const manager = SessionManager();\n const session = await manager.getSession();\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n if (!session)\n return null;\n // The marker/provider choice is not authority. A guest provider may only\n // continue with an issuer-stamped guest bearer whose persisted device key\n // still controls the exact same address. Anything else is an identity split\n // and must lose bearer authority immediately.\n if (!this.tokenIsGuest(manager.getIdToken(), session.address)) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n let key;\n try {\n key = await getExistingGuestKey();\n }\n catch (_a) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n if (!key || session.address !== key.address) {\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n await manager.clearSession();\n return null;\n }\n beforeCommit === null || beforeCommit === void 0 ? void 0 : beforeCommit();\n const user = { address: key.address, isAnonymous: true, provider: this };\n if (commitGlobalState)\n setCurrentUser(user);\n return user;\n }\n async restoreSession(beforeCommit) {\n return this.restoreSessionInternal(true, beforeCommit);\n }\n /** @internal Reconcile an applied-yet-error guest mint before committing a switch. */\n async restoreSessionForProviderSwitch() {\n return this.restoreSessionInternal(false);\n }\n async logout() {\n // Clears the SESSION but keeps the device key, so logging back in returns the\n // SAME guest identity (and its data). Use forgetGuest() to wipe the key too.\n await SessionManager().clearSession();\n setCurrentUser(null);\n }\n /** Wipe the device key — the next login() is a brand-new guest identity. */\n async forgetGuest() {\n await SessionManager().clearSession();\n await clearGuestKey();\n setCurrentUser(null);\n }\n async signMessage(message) {\n const key = await getGuestKey();\n return key.sign(message);\n }\n async signTransaction(_t) {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async signAndSubmitTransaction() {\n throw new Error(GUEST_TX_UNSUPPORTED);\n }\n async getNativeMethods() {\n return {};\n }\n}\n"],"names":["SessionManager"],"mappings":"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"}
|
|
@@ -137,8 +137,17 @@ function createWebPlatform() {
|
|
|
137
137
|
// bundlers do not externalize or preload a Node-only module in the
|
|
138
138
|
// email/guest graph; this branch is unreachable when WebCrypto is
|
|
139
139
|
// available (all supported browsers and current Node releases).
|
|
140
|
+
// The try makes it an optional dependency for Metro, whose production
|
|
141
|
+
// constant folding turns the specifier back into a literal: a React Native
|
|
142
|
+
// app with no node:crypto mapping still bundles (it passes setPlatform({ sha256 })).
|
|
140
143
|
const nodeCryptoSpecifier = 'node:crypto';
|
|
141
|
-
|
|
144
|
+
let createHash;
|
|
145
|
+
try {
|
|
146
|
+
({ createHash } = await import(/* @vite-ignore */ nodeCryptoSpecifier));
|
|
147
|
+
}
|
|
148
|
+
catch (_b) {
|
|
149
|
+
throw new Error('SHA-256 needs WebCrypto here: pass setPlatform({ sha256 }) (e.g. expo-crypto digest).');
|
|
150
|
+
}
|
|
142
151
|
const hash = createHash('sha256').update(data).digest();
|
|
143
152
|
return hash.buffer.slice(hash.byteOffset, hash.byteOffset + hash.byteLength);
|
|
144
153
|
},
|
|
@@ -274,6 +283,10 @@ class OffchainAuthProvider {
|
|
|
274
283
|
async signTransaction(tx) {
|
|
275
284
|
return this.wrappedProvider.signTransaction(tx);
|
|
276
285
|
}
|
|
286
|
+
async prepareToSign() {
|
|
287
|
+
var _a, _b, _c;
|
|
288
|
+
return (_c = (await ((_b = (_a = this.wrappedProvider).prepareToSign) === null || _b === void 0 ? void 0 : _b.call(_a)))) !== null && _c !== void 0 ? _c : 'ready';
|
|
289
|
+
}
|
|
277
290
|
/**
|
|
278
291
|
* Sign and submit transaction - not supported in poofnet environment.
|
|
279
292
|
* See the real providers (PhantomWalletProvider, SolanaKeypairProvider)
|
|
@@ -4369,7 +4382,7 @@ async function runWidget(url, signerOrigin, ex, popupFallback) {
|
|
|
4369
4382
|
const requestId = String(ex.request.requestId);
|
|
4370
4383
|
// Serialize: the approve card is modal, and one warm frame handles one request at a time.
|
|
4371
4384
|
const run = m.chain.then(() => new Promise((resolve, reject) => {
|
|
4372
|
-
var _a;
|
|
4385
|
+
var _a, _b;
|
|
4373
4386
|
let settled = false;
|
|
4374
4387
|
let usedFallback = false;
|
|
4375
4388
|
(_a = ex.assertCurrent) === null || _a === void 0 ? void 0 : _a.call(ex);
|
|
@@ -4412,16 +4425,20 @@ async function runWidget(url, signerOrigin, ex, popupFallback) {
|
|
|
4412
4425
|
/* frame gone */
|
|
4413
4426
|
}
|
|
4414
4427
|
};
|
|
4428
|
+
const dismiss = () => {
|
|
4429
|
+
if (!ex.silent)
|
|
4430
|
+
hideModal(m);
|
|
4431
|
+
};
|
|
4415
4432
|
const goFallback = () => {
|
|
4416
4433
|
if (usedFallback || settled)
|
|
4417
4434
|
return;
|
|
4418
4435
|
usedFallback = true;
|
|
4419
|
-
|
|
4436
|
+
dismiss();
|
|
4420
4437
|
finish(() => popupFallback().then(resolve, reject));
|
|
4421
4438
|
};
|
|
4422
4439
|
m.onBackdrop = () => {
|
|
4423
4440
|
cancelInFrame();
|
|
4424
|
-
|
|
4441
|
+
dismiss();
|
|
4425
4442
|
finish(() => reject(new Error("cancelled")));
|
|
4426
4443
|
};
|
|
4427
4444
|
m.onIframeMessage = (d) => {
|
|
@@ -4436,17 +4453,18 @@ async function runWidget(url, signerOrigin, ex, popupFallback) {
|
|
|
4436
4453
|
if (d.type === "bounded:turnkey:result" && d.requestId === requestId) {
|
|
4437
4454
|
const outcome = ex.onResult(d);
|
|
4438
4455
|
if ("error" in outcome) {
|
|
4439
|
-
|
|
4456
|
+
dismiss();
|
|
4440
4457
|
finish(() => reject(new Error(outcome.error)));
|
|
4441
4458
|
return;
|
|
4442
4459
|
}
|
|
4443
4460
|
if (outcome.done) {
|
|
4444
|
-
|
|
4461
|
+
dismiss();
|
|
4445
4462
|
finish(() => resolve(outcome.value));
|
|
4446
4463
|
}
|
|
4447
4464
|
}
|
|
4448
4465
|
};
|
|
4449
|
-
|
|
4466
|
+
if (!ex.silent)
|
|
4467
|
+
showModal(m);
|
|
4450
4468
|
if (m.iframeReady)
|
|
4451
4469
|
send();
|
|
4452
4470
|
// If the frame never loads, degrade to the popup (best-effort - a post-load
|
|
@@ -4459,10 +4477,10 @@ async function runWidget(url, signerOrigin, ex, popupFallback) {
|
|
|
4459
4477
|
ceilingTimer = window.setTimeout(() => {
|
|
4460
4478
|
if (!settled) {
|
|
4461
4479
|
cancelInFrame();
|
|
4462
|
-
|
|
4480
|
+
dismiss();
|
|
4463
4481
|
finish(() => reject(new Error("Wallet approval timed out.")));
|
|
4464
4482
|
}
|
|
4465
|
-
}, 5 * 60 * 1000);
|
|
4483
|
+
}, (_b = ex.ceilingMs) !== null && _b !== void 0 ? _b : 5 * 60 * 1000);
|
|
4466
4484
|
}));
|
|
4467
4485
|
m.chain = run.then(() => undefined, () => undefined);
|
|
4468
4486
|
return run;
|
|
@@ -5044,6 +5062,59 @@ async function clearTurnkeySigningSession(idToken) {
|
|
|
5044
5062
|
function hasTurnkeyWallet() {
|
|
5045
5063
|
return activeTurnkeyAddress() !== null;
|
|
5046
5064
|
}
|
|
5065
|
+
/** The signer frame could not take the exchange: it never loaded, or a page from before the request existed stays silent. */
|
|
5066
|
+
class SignerFrameUnavailable extends Error {
|
|
5067
|
+
constructor() { super('The Bounded signer frame did not answer.'); }
|
|
5068
|
+
}
|
|
5069
|
+
/** How long a silent session probe may wait for the frame before the write goes on without it. */
|
|
5070
|
+
const SESSION_PROBE_MS = 8000;
|
|
5071
|
+
/**
|
|
5072
|
+
* Make the wallet's 24-hour signing session live BEFORE a transaction exists. Without one the
|
|
5073
|
+
* approve card must first collect an emailed code, which takes longer than a transaction's
|
|
5074
|
+
* blockhash lifetime (about 33 seconds on mainnet in late 2026), so a transaction built before
|
|
5075
|
+
* the code is dead by the time it is signed. A live session is found with nothing shown: the
|
|
5076
|
+
* warm frame answers a silent probe, and it holds the session even where the browser blocks its
|
|
5077
|
+
* storage. Only a lapsed session opens the card, which runs the code ceremony and closes without
|
|
5078
|
+
* signing anything. Resolves `'established'` when that ceremony ran, else `'ready'`.
|
|
5079
|
+
*
|
|
5080
|
+
* Both exchanges run in the warm frame only, since it is the frame that signs next and a popup
|
|
5081
|
+
* keeps its session to itself. Where the frame cannot answer (an embedder that blocks it, or a
|
|
5082
|
+
* signer page from before this request existed), the write goes on the way it always did: the
|
|
5083
|
+
* approve card collects the code itself, and an expired build is built again.
|
|
5084
|
+
*/
|
|
5085
|
+
async function ensureTurnkeySigningSession() {
|
|
5086
|
+
if (!hasDOM$3())
|
|
5087
|
+
throw new Error('Turnkey embedded-wallet signing is only available in the browser (trusted wallet UI).');
|
|
5088
|
+
const context = await turnkeySignerPage();
|
|
5089
|
+
context.assertCurrent();
|
|
5090
|
+
if (hasWarmSignerFrame(context.key) && walletSessionState(context.key).status === 'ready')
|
|
5091
|
+
return 'ready';
|
|
5092
|
+
const { url, origin } = context;
|
|
5093
|
+
const authorization = await fetchActionAuthorization('createWallet', context);
|
|
5094
|
+
const frameOnly = () => Promise.reject(new SignerFrameUnavailable());
|
|
5095
|
+
const exchange = (probeOnly) => ({
|
|
5096
|
+
context: context.key, assertCurrent: context.assertCurrent,
|
|
5097
|
+
request: Object.assign({ type: 'bounded:turnkey:session', requestId: `tksession_${Date.now()}_${++requestSeq}`, authorization }, (probeOnly ? { probeOnly: true } : {})),
|
|
5098
|
+
onResult: (d) => d.ok ? { done: true, value: d } : { error: String(d.error || 'The signing session could not be established') },
|
|
5099
|
+
});
|
|
5100
|
+
const probed = await runWidget(url, origin, Object.assign(Object.assign({}, exchange(true)), { silent: true, ceilingMs: SESSION_PROBE_MS }), frameOnly)
|
|
5101
|
+
.catch(() => null);
|
|
5102
|
+
if (!probed)
|
|
5103
|
+
return 'ready';
|
|
5104
|
+
let result = probed;
|
|
5105
|
+
if (result.ready !== true) {
|
|
5106
|
+
try {
|
|
5107
|
+
result = await runWidget(url, origin, exchange(false), frameOnly);
|
|
5108
|
+
}
|
|
5109
|
+
catch (error) {
|
|
5110
|
+
if (error instanceof SignerFrameUnavailable)
|
|
5111
|
+
return 'ready';
|
|
5112
|
+
throw error;
|
|
5113
|
+
}
|
|
5114
|
+
}
|
|
5115
|
+
setWalletSessionState(context.key, { status: 'ready', expiresAt: Number(result.signingSessionExpiresAt) });
|
|
5116
|
+
return result.established === true ? 'established' : 'ready';
|
|
5117
|
+
}
|
|
5047
5118
|
/**
|
|
5048
5119
|
* Get-or-create the user's non-custodial Turnkey wallet, resolving with its stable
|
|
5049
5120
|
* Solana address. Creation never prompts: on first use the signer silently provisions
|
|
@@ -5276,6 +5347,7 @@ async function getTurnkeyWalletRecoveryUrl() {
|
|
|
5276
5347
|
var turnkeySignerBridge = /*#__PURE__*/Object.freeze({
|
|
5277
5348
|
__proto__: null,
|
|
5278
5349
|
clearTurnkeySigningSession: clearTurnkeySigningSession,
|
|
5350
|
+
ensureTurnkeySigningSession: ensureTurnkeySigningSession,
|
|
5279
5351
|
getOrCreateTurnkeyWallet: getOrCreateTurnkeyWallet,
|
|
5280
5352
|
getTurnkeyWalletRecoveryUrl: getTurnkeyWalletRecoveryUrl,
|
|
5281
5353
|
getTurnkeyWalletSessionState: getTurnkeyWalletSessionState,
|
|
@@ -5359,6 +5431,11 @@ const oidcProviderSingleton = {
|
|
|
5359
5431
|
throw new Error(OIDC_NO_WALLET);
|
|
5360
5432
|
return signTransactionV1WithTurnkey(transaction);
|
|
5361
5433
|
},
|
|
5434
|
+
async prepareToSign() {
|
|
5435
|
+
if (!hasTurnkeyWallet())
|
|
5436
|
+
throw new Error(OIDC_NO_WALLET);
|
|
5437
|
+
return ensureTurnkeySigningSession();
|
|
5438
|
+
},
|
|
5362
5439
|
supportedTransactionVersions() {
|
|
5363
5440
|
return hasTurnkeyWallet() ? ['legacy', 0, 1] : ['legacy', 0];
|
|
5364
5441
|
},
|
|
@@ -5433,6 +5510,14 @@ function cleanCallbackUrl(url) {
|
|
|
5433
5510
|
clean.searchParams.delete(key);
|
|
5434
5511
|
return clean;
|
|
5435
5512
|
}
|
|
5513
|
+
// The address a code returned to, without the fragment. The issuer never sets one
|
|
5514
|
+
// (redirectUri may not carry one), but a browser can keep one across the redirect
|
|
5515
|
+
// chain: iOS lands a Google sign-in on `<redirectUri>?code=...#`.
|
|
5516
|
+
function returnAddress(url) {
|
|
5517
|
+
const clean = cleanCallbackUrl(url);
|
|
5518
|
+
clean.hash = '';
|
|
5519
|
+
return clean.href;
|
|
5520
|
+
}
|
|
5436
5521
|
async function validateAttempt(pkce, callback) {
|
|
5437
5522
|
const cfg = await getConfig();
|
|
5438
5523
|
if (!pkce || typeof pkce.verifier !== 'string' || !pkce.verifier ||
|
|
@@ -5442,7 +5527,7 @@ async function validateAttempt(pkce, callback) {
|
|
|
5442
5527
|
if (!Number.isFinite(pkce.createdAt) || Date.now() - pkce.createdAt > LOGIN_TIMEOUT_MS || pkce.createdAt > Date.now()) {
|
|
5443
5528
|
throw new Error('Login expired. Start sign-in again.');
|
|
5444
5529
|
}
|
|
5445
|
-
if (callback && (
|
|
5530
|
+
if (callback && (returnAddress(callback) !== returnAddress(new URL(pkce.redirectUri)) ||
|
|
5446
5531
|
(callback.searchParams.has('iss') && callback.searchParams.get('iss') !== pkce.issuer))) {
|
|
5447
5532
|
throw new Error('Login returned to a different address or from a different auth server. Start sign-in again.');
|
|
5448
5533
|
}
|
|
@@ -5695,7 +5780,7 @@ function parseCallbackParams(callbackUrl) {
|
|
|
5695
5780
|
// universal-link callback, verify state, and run the SAME PKCE code→token exchange
|
|
5696
5781
|
// as web. Returns the signed-in User inline; web redirects complete on the next init().
|
|
5697
5782
|
async function runNativeLogin(opts) {
|
|
5698
|
-
var _a, _b;
|
|
5783
|
+
var _a, _b, _c, _d;
|
|
5699
5784
|
const { url, pkce } = await buildAuthorize(opts);
|
|
5700
5785
|
const WebBrowser = await loadExpoWebBrowser();
|
|
5701
5786
|
const openAuthSession = WebBrowser.openAuthSessionAsync || ((_a = WebBrowser.default) === null || _a === void 0 ? void 0 : _a.openAuthSessionAsync);
|
|
@@ -5707,12 +5792,16 @@ async function runNativeLogin(opts) {
|
|
|
5707
5792
|
// openAuthSessionAsync keeps JS alive while the system browser is shown, then
|
|
5708
5793
|
// resolves with the callback URL once the universal link fires — so `pkce`
|
|
5709
5794
|
// stays in scope and never needs to be persisted.
|
|
5710
|
-
|
|
5795
|
+
// iOS (17.4+) only returns an https callback to the app when asked to; without it the
|
|
5796
|
+
// sheet treats "https" as a custom scheme and never completes. A custom scheme callback
|
|
5797
|
+
// (an Expo Go preview's exps://) is caught by its scheme either way.
|
|
5798
|
+
const preferUniversalLinks = (_c = (_b = opts.redirectUri) === null || _b === void 0 ? void 0 : _b.startsWith('https:')) !== null && _c !== void 0 ? _c : false;
|
|
5799
|
+
const result = await openAuthSession(url, opts.redirectUri, { preferUniversalLinks });
|
|
5711
5800
|
if (!result || result.type === 'cancel' || result.type === 'dismiss') {
|
|
5712
5801
|
throw new Error('Login cancelled');
|
|
5713
5802
|
}
|
|
5714
5803
|
if (result.type !== 'success' || typeof result.url !== 'string') {
|
|
5715
|
-
throw new Error(`Hosted login did not complete (result: ${(
|
|
5804
|
+
throw new Error(`Hosted login did not complete (result: ${(_d = result === null || result === void 0 ? void 0 : result.type) !== null && _d !== void 0 ? _d : 'unknown'})`);
|
|
5716
5805
|
}
|
|
5717
5806
|
const { code, state: returnedState } = parseCallbackParams(result.url);
|
|
5718
5807
|
if (!code)
|
|
@@ -5735,7 +5824,8 @@ async function runNativeLogin(opts) {
|
|
|
5735
5824
|
* callback, runs the PKCE exchange INLINE, and resolves with the signed-in User. No
|
|
5736
5825
|
* completeLoginFromRedirect() call is needed on native. Requires `redirectUri` to be an
|
|
5737
5826
|
* https UNIVERSAL LINK whose origin the app owner registered in the app's allowedOrigins
|
|
5738
|
-
* (custom `myapp://` schemes are rejected by the issuer
|
|
5827
|
+
* (custom `myapp://` schemes are rejected by the issuer; an app preview opened in Expo Go
|
|
5828
|
+
* uses `exps://<preview host>/--/<path>`). Needs the optional peer deps
|
|
5739
5829
|
* expo-web-browser + (expo-crypto or react-native-get-random-values). */
|
|
5740
5830
|
async function loginWithRedirect(opts) {
|
|
5741
5831
|
if (isNative())
|
|
@@ -6472,7 +6562,7 @@ async function getAuthProvider(config, fromStorage = false) {
|
|
|
6472
6562
|
// manager as legacy email sessions. Human login should be started
|
|
6473
6563
|
// with loginWithRedirect(); this provider is kept as the restore and
|
|
6474
6564
|
// logout surface for those sessions.
|
|
6475
|
-
currentAuthProvider = new (await import('./email-auth-provider-
|
|
6565
|
+
currentAuthProvider = new (await import('./email-auth-provider-TA2AbU5Y.mjs')).EmailAuthProvider();
|
|
6476
6566
|
break;
|
|
6477
6567
|
case "phantom": {
|
|
6478
6568
|
// First-class Solana WALLET LOGIN (the poof/TaroBase-style "connect
|
|
@@ -6514,7 +6604,7 @@ async function getAuthProvider(config, fromStorage = false) {
|
|
|
6514
6604
|
// (bounded-login-widget.ts), so registration never counts as
|
|
6515
6605
|
// evidence the user has a wallet.
|
|
6516
6606
|
await ensureSolanaMobileWalletRegistered(config, configuredNetwork);
|
|
6517
|
-
const { InjectedWalletProvider } = await import('./injected-wallet-provider-
|
|
6607
|
+
const { InjectedWalletProvider } = await import('./injected-wallet-provider-Bnsfazum.mjs');
|
|
6518
6608
|
currentAuthProvider = new InjectedWalletProvider(resolveInjectedWalletConfig(config), rpcUrl, configuredNetwork);
|
|
6519
6609
|
break;
|
|
6520
6610
|
}
|
|
@@ -6527,7 +6617,7 @@ async function getAuthProvider(config, fromStorage = false) {
|
|
|
6527
6617
|
// Selecting authMethod:'evm-wallet' IS the opt-in — pass evmWalletConfig
|
|
6528
6618
|
// to point at a specific wallet or set chainId/domain.
|
|
6529
6619
|
const evmWalletConfig = ((_a = config.evmWalletConfig) !== null && _a !== void 0 ? _a : {});
|
|
6530
|
-
const { InjectedEvmWalletProvider } = await import('./injected-evm-wallet-provider
|
|
6620
|
+
const { InjectedEvmWalletProvider } = await import('./injected-evm-wallet-provider-BlSFIzEA.mjs');
|
|
6531
6621
|
currentAuthProvider = new InjectedEvmWalletProvider(evmWalletConfig);
|
|
6532
6622
|
break;
|
|
6533
6623
|
}
|
|
@@ -6552,7 +6642,7 @@ async function getAuthProvider(config, fromStorage = false) {
|
|
|
6552
6642
|
break;
|
|
6553
6643
|
case "guest":
|
|
6554
6644
|
// Anonymous auth: a device-local ed25519 keypair signs the challenge.
|
|
6555
|
-
currentAuthProvider = new (await import('./guest-auth-provider-
|
|
6645
|
+
currentAuthProvider = new (await import('./guest-auth-provider-Dw-bF10B.mjs')).GuestAuthProvider();
|
|
6556
6646
|
break;
|
|
6557
6647
|
}
|
|
6558
6648
|
if (!currentAuthProvider) {
|
|
@@ -6614,7 +6704,7 @@ async function signInAnonymously() {
|
|
|
6614
6704
|
// Lazy-load the guest provider so its ed25519/web3 dependencies stay out of
|
|
6615
6705
|
// the main bundle for data-only apps. Specifier is a static string literal
|
|
6616
6706
|
// so bundle-splitting can see it.
|
|
6617
|
-
const provider = new (await import('./guest-auth-provider-
|
|
6707
|
+
const provider = new (await import('./guest-auth-provider-Dw-bF10B.mjs')).GuestAuthProvider();
|
|
6618
6708
|
setAuthLoading(true); // reflect "signing in…" while the guest keypair session is minted
|
|
6619
6709
|
// adoptSessionProvider awaits only getConfig() (already resolved here) and then
|
|
6620
6710
|
// runs every write - provider/method/config/marker/user - in one synchronous
|
|
@@ -6785,7 +6875,7 @@ function ensureSharedWalletLoginReady() {
|
|
|
6785
6875
|
if (!sharedWalletReady) {
|
|
6786
6876
|
sharedWalletReady = (async () => {
|
|
6787
6877
|
await getConfig();
|
|
6788
|
-
await import('./injected-wallet-provider-
|
|
6878
|
+
await import('./injected-wallet-provider-Bnsfazum.mjs');
|
|
6789
6879
|
})().catch((error) => {
|
|
6790
6880
|
sharedWalletReady = null;
|
|
6791
6881
|
throw error;
|
|
@@ -6890,7 +6980,7 @@ async function loginWithWallet(options) {
|
|
|
6890
6980
|
await ensureSharedWalletLoginReady();
|
|
6891
6981
|
else
|
|
6892
6982
|
await ensureWalletLoginReady();
|
|
6893
|
-
const { InjectedWalletProvider } = await import('./injected-wallet-provider-
|
|
6983
|
+
const { InjectedWalletProvider } = await import('./injected-wallet-provider-Bnsfazum.mjs');
|
|
6894
6984
|
// Keep the RAW wallet provider: the offchain wrapper forwards only a fixed
|
|
6895
6985
|
// set of methods, so cleanup below must speak to the provider that actually
|
|
6896
6986
|
// holds the config rather than to whatever is wrapping it.
|
|
@@ -12268,5 +12358,5 @@ function init(config = {}) {
|
|
|
12268
12358
|
return init$1(resolved);
|
|
12269
12359
|
}
|
|
12270
12360
|
|
|
12271
|
-
export {
|
|
12272
|
-
//# sourceMappingURL=index-
|
|
12361
|
+
export { getIdToken as $, login as A, logout as B, getAuthProvider as C, signInAnonymously as D, loginWithPrivy as E, loginWithWallet as F, ensureWalletLoginReady as G, ensureSharedWalletLoginReady as H, preloadWalletLogin as I, loginWithRedirect as J, completeLoginFromRedirect as K, getLoginReturnError as L, loginWithPopup as M, openBoundedWidget as N, ensureSignedIn as O, useAuth as P, useQuery as Q, useBuildRun as R, SELECTED_WALLET_UNAVAILABLE_ERR as S, apps as T, signSolanaMessageViaTurnkey as U, getOrCreateTurnkeyWallet as V, WalletConfigError as W, openTurnkeyKeyExport as X, getTurnkeyWalletSessionState as Y, getTurnkeyWalletRecoveryUrl as Z, startTurnkeyEmailLogin as _, signMessageWithTurnkey as a, onramp as a0, onrampQuote as a1, onrampStatus as a2, connect as a3, completeConnection as a4, getConnections as a5, disconnect as a6, ConnectionError as a7, fundVenueEscrow as a8, disputeVenueEscrow as a9, getVenueEscrow as aa, VenueEscrowError as ab, setPlatform as ac, OffchainAuthProvider as ad, PrivyExpoProvider as ae, requestEip6963Providers as af, connectBroadcast as ag, connectServiceSession as ah, builds as ai, BuildsApiError as aj, mediaAgentTools as ak, NON_TERMINAL_STATES as al, TERMINAL_STATES as am, RUN_STATES as an, PARK_REASONS as ao, FAILURE_REASONS as ap, BUILD_REVIEW_CAPABILITY_SCHEMA as aq, BUILD_REVIEW_CAPABILITY_REFRESH_SCHEMA as ar, BUILD_DELEGATED_REVIEW_CAPABILITY_SCHEMA as as, signTransactionWithTurnkey as b, signTransactionV1WithTurnkey as c, signAndSubmitTransactionWithTurnkey as d, ensureTurnkeySigningSession as e, bs58 as f, getPlatform as g, hasTurnkeyWallet as h, defaultInjectedProvider as i, firstStandardWalletProvider as j, setAuthLoading as k, supportsWalletSignIn as l, bufferExports as m, normalizeSolanaRpcUrl as n, setStoredAuthMethod as o, confirmAndCheckTransaction as p, defaultInjectedEvmProvider as q, resolveSolanaRpcUrl as r, setCurrentUser as s, transactionHasSignature as t, init as u, getCurrentUser as v, onAuthStateChanged as w, onAuthLoadingChanged as x, getAuthLoading as y, waitForAuthReady as z };
|
|
12362
|
+
//# sourceMappingURL=index-BdzGX8fS.mjs.map
|