@tatchi-xyz/sdk 0.16.0 → 0.18.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/cjs/core/EmailRecovery/emailRecoveryPendingStore.js +69 -0
- package/dist/cjs/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
- package/dist/cjs/core/EmailRecovery/index.js +32 -13
- package/dist/cjs/core/EmailRecovery/index.js.map +1 -1
- package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js +35 -36
- package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
- package/dist/cjs/core/NearClient.js +2 -1
- package/dist/cjs/core/NearClient.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/emailRecovery.js +557 -377
- package/dist/cjs/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js +1 -0
- package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/index.js +26 -0
- package/dist/cjs/core/TatchiPasskey/index.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/linkDevice.js +2 -0
- package/dist/cjs/core/TatchiPasskey/linkDevice.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/login.js +15 -4
- package/dist/cjs/core/TatchiPasskey/login.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/recoverAccount.js +1 -0
- package/dist/cjs/core/TatchiPasskey/recoverAccount.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/relay.js +23 -1
- package/dist/cjs/core/TatchiPasskey/relay.js.map +1 -1
- package/dist/cjs/core/TatchiPasskey/scanDevice.js +1 -0
- package/dist/cjs/core/TatchiPasskey/scanDevice.js.map +1 -1
- package/dist/cjs/core/WalletIframe/client/IframeTransport.js +3 -0
- package/dist/cjs/core/WalletIframe/client/IframeTransport.js.map +1 -1
- package/dist/cjs/core/WalletIframe/client/router.js +15 -2
- package/dist/cjs/core/WalletIframe/client/router.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
- package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
- package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +10 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +1 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +1 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +1 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +1 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +1 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +1 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +1 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/index.js +1 -0
- package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +6 -0
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -0
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +1 -0
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +4 -15
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +1 -0
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +1 -0
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +1 -0
- package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/index.js +17 -0
- package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
- package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +64 -54
- package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/credentialsHelpers.js +12 -2
- package/dist/cjs/core/WebAuthnManager/credentialsHelpers.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/index.js +6 -1
- package/dist/cjs/core/WebAuthnManager/index.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/touchIdPrompt.js +209 -201
- package/dist/cjs/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
- package/dist/cjs/core/WebAuthnManager/userHandle.js +2 -1
- package/dist/cjs/core/WebAuthnManager/userHandle.js.map +1 -1
- package/dist/cjs/core/defaultConfigs.js +1 -1
- package/dist/cjs/core/defaultConfigs.js.map +1 -1
- package/dist/cjs/core/rpcCalls.js +8 -0
- package/dist/cjs/core/rpcCalls.js.map +1 -1
- package/dist/cjs/core/types/vrf-worker.js +10 -1
- package/dist/cjs/core/types/vrf-worker.js.map +1 -1
- package/dist/cjs/index.js +6 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{LinkedDevicesModal-STvIsylA.css → LinkedDevicesModal-CSSowiHP.css} +1 -1
- package/dist/{esm/react/components/AccountMenuButton/LinkedDevicesModal-STvIsylA.css.map → cjs/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{ProfileDropdown-iARgUwK1.css → ProfileDropdown-CEPMZ1gY.css} +1 -1
- package/dist/{esm/react/components/AccountMenuButton/ProfileDropdown-iARgUwK1.css.map → cjs/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css → Web3AuthProfileButton-DopOg7Xc.css} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css.map → Web3AuthProfileButton-DopOg7Xc.css.map} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css → TouchIcon-BQWentvJ.css} +1 -1
- package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css.map → TouchIcon-BQWentvJ.css.map} +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css → PasskeyAuthMenu-DwrzWMYx.css} +14 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css.map → PasskeyAuthMenu-DwrzWMYx.css.map} +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +122 -53
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
- package/dist/cjs/react/components/{ShowQRCode-DCnR__fx.css → ShowQRCode-CCN4h6Uv.css} +1 -1
- package/dist/cjs/react/components/{ShowQRCode-DCnR__fx.css.map → ShowQRCode-CCN4h6Uv.css.map} +1 -1
- package/dist/cjs/react/deviceDetection.js +75 -92
- package/dist/cjs/react/deviceDetection.js.map +1 -1
- package/dist/cjs/react/hooks/useQRCamera.js +1 -0
- package/dist/cjs/react/hooks/useQRCamera.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js +69 -0
- package/dist/cjs/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
- package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js +32 -13
- package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js +35 -36
- package/dist/cjs/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/NearClient.js +2 -1
- package/dist/cjs/react/sdk/src/core/NearClient.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +557 -377
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +1 -0
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js +26 -0
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -0
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/login.js +15 -4
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/login.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/recoverAccount.js +1 -0
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/recoverAccount.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/relay.js +23 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/relay.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js +1 -0
- package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WalletIframe/client/IframeTransport.js +3 -0
- package/dist/cjs/react/sdk/src/core/WalletIframe/client/IframeTransport.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js +15 -2
- package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +10 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +6 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +4 -15
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js +17 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +64 -54
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js +12 -2
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/index.js +6 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/index.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js +209 -201
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/userHandle.js +2 -1
- package/dist/cjs/react/sdk/src/core/WebAuthnManager/userHandle.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/defaultConfigs.js +1 -1
- package/dist/cjs/react/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/rpcCalls.js +8 -0
- package/dist/cjs/react/sdk/src/core/rpcCalls.js.map +1 -1
- package/dist/cjs/react/sdk/src/core/types/vrf-worker.js +10 -1
- package/dist/cjs/react/sdk/src/core/types/vrf-worker.js.map +1 -1
- package/dist/cjs/react/sdk/src/utils/index.js +13 -3
- package/dist/cjs/server/email-recovery/emailEncryptor.js +11 -0
- package/dist/cjs/server/email-recovery/emailEncryptor.js.map +1 -1
- package/dist/cjs/server/email-recovery/emailParsers.js +57 -0
- package/dist/cjs/server/email-recovery/emailParsers.js.map +1 -1
- package/dist/cjs/server/email-recovery/index.js +1 -1
- package/dist/cjs/server/email-recovery/index.js.map +1 -1
- package/dist/cjs/server/email-recovery/rpcCalls.js +14 -1
- package/dist/cjs/server/email-recovery/rpcCalls.js.map +1 -1
- package/dist/cjs/server/index.js +1 -0
- package/dist/cjs/server/router/cloudflare.js.map +1 -1
- package/dist/cjs/server/router/express.js.map +1 -1
- package/dist/cjs/server/sdk/src/core/defaultConfigs.js +1 -1
- package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/cjs/utils/index.js +13 -3
- package/dist/esm/core/EmailRecovery/emailRecoveryPendingStore.js +63 -0
- package/dist/esm/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
- package/dist/esm/core/EmailRecovery/index.js +28 -14
- package/dist/esm/core/EmailRecovery/index.js.map +1 -1
- package/dist/esm/core/IndexedDBManager/passkeyClientDB.js +35 -36
- package/dist/esm/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
- package/dist/esm/core/NearClient.js +2 -1
- package/dist/esm/core/NearClient.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/emailRecovery.js +557 -377
- package/dist/esm/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js +2 -1
- package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/index.js +28 -2
- package/dist/esm/core/TatchiPasskey/index.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/linkDevice.js +4 -2
- package/dist/esm/core/TatchiPasskey/linkDevice.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/login.js +13 -7
- package/dist/esm/core/TatchiPasskey/login.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/recoverAccount.js +2 -1
- package/dist/esm/core/TatchiPasskey/recoverAccount.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/relay.js +23 -1
- package/dist/esm/core/TatchiPasskey/relay.js.map +1 -1
- package/dist/esm/core/TatchiPasskey/scanDevice.js +2 -1
- package/dist/esm/core/TatchiPasskey/scanDevice.js.map +1 -1
- package/dist/esm/core/WalletIframe/client/IframeTransport.js +4 -1
- package/dist/esm/core/WalletIframe/client/IframeTransport.js.map +1 -1
- package/dist/esm/core/WalletIframe/client/router.js +16 -3
- package/dist/esm/core/WalletIframe/client/router.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
- package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
- package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +6 -2
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +4 -2
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/index.js +2 -1
- package/dist/esm/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +8 -2
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +2 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +2 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +5 -16
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +2 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +2 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +2 -1
- package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/index.js +12 -0
- package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
- package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +61 -55
- package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/credentialsHelpers.js +8 -3
- package/dist/esm/core/WebAuthnManager/index.js +8 -3
- package/dist/esm/core/WebAuthnManager/index.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/touchIdPrompt.js +207 -204
- package/dist/esm/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
- package/dist/esm/core/WebAuthnManager/userHandle.js +2 -1
- package/dist/esm/core/WebAuthnManager/userHandle.js.map +1 -1
- package/dist/esm/core/defaultConfigs.js +1 -1
- package/dist/esm/core/defaultConfigs.js.map +1 -1
- package/dist/esm/core/rpcCalls.js +8 -1
- package/dist/esm/core/rpcCalls.js.map +1 -1
- package/dist/esm/core/types/vrf-worker.js +6 -2
- package/dist/esm/index.js +4 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/components/AccountMenuButton/{LinkedDevicesModal-STvIsylA.css → LinkedDevicesModal-CSSowiHP.css} +1 -1
- package/dist/{cjs/react/components/AccountMenuButton/LinkedDevicesModal-STvIsylA.css.map → esm/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{ProfileDropdown-iARgUwK1.css → ProfileDropdown-CEPMZ1gY.css} +1 -1
- package/dist/{cjs/react/components/AccountMenuButton/ProfileDropdown-iARgUwK1.css.map → esm/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css → Web3AuthProfileButton-DopOg7Xc.css} +1 -1
- package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css.map → Web3AuthProfileButton-DopOg7Xc.css.map} +1 -1
- package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css → TouchIcon-BQWentvJ.css} +1 -1
- package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css.map → TouchIcon-BQWentvJ.css.map} +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css → PasskeyAuthMenu-DwrzWMYx.css} +14 -1
- package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css.map → PasskeyAuthMenu-DwrzWMYx.css.map} +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +123 -54
- package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
- package/dist/esm/react/components/{ShowQRCode-DCnR__fx.css → ShowQRCode-CCN4h6Uv.css} +1 -1
- package/dist/esm/react/components/{ShowQRCode-DCnR__fx.css.map → ShowQRCode-CCN4h6Uv.css.map} +1 -1
- package/dist/esm/react/deviceDetection.js +72 -93
- package/dist/esm/react/deviceDetection.js.map +1 -1
- package/dist/esm/react/hooks/useQRCamera.js +2 -1
- package/dist/esm/react/hooks/useQRCamera.js.map +1 -1
- package/dist/esm/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js +63 -0
- package/dist/esm/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
- package/dist/esm/react/sdk/src/core/EmailRecovery/index.js +28 -14
- package/dist/esm/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
- package/dist/esm/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js +35 -36
- package/dist/esm/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
- package/dist/esm/react/sdk/src/core/NearClient.js +2 -1
- package/dist/esm/react/sdk/src/core/NearClient.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +557 -377
- package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +2 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js +28 -2
- package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js +4 -2
- package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/login.js +13 -7
- package/dist/esm/react/sdk/src/core/TatchiPasskey/login.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/recoverAccount.js +2 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/recoverAccount.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/relay.js +23 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/relay.js.map +1 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js +2 -1
- package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WalletIframe/client/IframeTransport.js +4 -1
- package/dist/esm/react/sdk/src/core/WalletIframe/client/IframeTransport.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js +16 -3
- package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
- package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +6 -2
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +4 -2
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +8 -2
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +5 -16
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js +12 -0
- package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
- package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +61 -55
- package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js +8 -3
- package/dist/esm/react/sdk/src/core/WebAuthnManager/index.js +8 -3
- package/dist/esm/react/sdk/src/core/WebAuthnManager/index.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js +207 -204
- package/dist/esm/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/userHandle.js +2 -1
- package/dist/esm/react/sdk/src/core/WebAuthnManager/userHandle.js.map +1 -1
- package/dist/esm/react/sdk/src/core/defaultConfigs.js +1 -1
- package/dist/esm/react/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/esm/react/sdk/src/core/rpcCalls.js +8 -1
- package/dist/esm/react/sdk/src/core/rpcCalls.js.map +1 -1
- package/dist/esm/react/sdk/src/core/types/vrf-worker.js +6 -2
- package/dist/esm/react/sdk/src/utils/index.js +10 -4
- package/dist/esm/react/styles/styles.css +13 -0
- package/dist/esm/sdk/{safari-fallbacks-oQKu9xUs.js → WebAuthnFallbacks-Bl4BTsNt.js} +131 -135
- package/dist/esm/sdk/{createAdapters-pNiL2KNq.js → createAdapters-BumKM2ft.js} +59 -54
- package/dist/esm/sdk/createAdapters-BumKM2ft.js.map +1 -0
- package/dist/esm/sdk/{createAdapters-BWLe9Ddo.js → createAdapters-qVGD6i0g.js} +10 -3
- package/dist/esm/sdk/{defaultConfigs-VzvDejmy.js → defaultConfigs-DpslkAQd.js} +1 -1
- package/dist/esm/sdk/{getDeviceNumber-CkWRT17I.js → getDeviceNumber-fXizNGQl.js} +2 -2
- package/dist/esm/sdk/getDeviceNumber-fXizNGQl.js.map +1 -0
- package/dist/esm/sdk/{getDeviceNumber-CfmlgfMX.js → getDeviceNumber-zsOHT_Um.js} +6 -3
- package/dist/esm/sdk/{localOnly-DnpSyDaF.js → localOnly-Byi3AK7A.js} +2 -2
- package/dist/esm/sdk/{localOnly-DnpSyDaF.js.map → localOnly-Byi3AK7A.js.map} +1 -1
- package/dist/esm/sdk/{localOnly-BdumO2st.js → localOnly-pXMTqh1m.js} +5 -4
- package/dist/esm/sdk/offline-export-app.js +46 -44
- package/dist/esm/sdk/offline-export-app.js.map +1 -1
- package/dist/esm/sdk/{overlay-BTqPGG-o.js → overlay-ZGbucXIa.js} +2 -0
- package/dist/esm/sdk/{registration-C633u6x8.js → registration-CBiS4Ua_.js} +2 -2
- package/dist/esm/sdk/{registration-C633u6x8.js.map → registration-CBiS4Ua_.js.map} +1 -1
- package/dist/esm/sdk/{registration-xyYUFRqk.js → registration-DLPLsGCz.js} +5 -4
- package/dist/esm/sdk/{requestHelpers-DLBGBHMw.js → requestHelpers-Dh1hEYL9.js} +206 -204
- package/dist/esm/sdk/{router-BG6KC_p7.js → router-DuGYOd3G.js} +19 -4
- package/dist/esm/sdk/{rpcCalls-fLObBbbz.js → rpcCalls-BQrJMTdg.js} +3 -3
- package/dist/esm/sdk/{rpcCalls-CAU5XYEF.js → rpcCalls-YVeUVMk2.js} +9 -2
- package/dist/esm/sdk/{transactions-jH38BZ-Q.js → transactions-BIqKZeR0.js} +6 -18
- package/dist/esm/sdk/transactions-BIqKZeR0.js.map +1 -0
- package/dist/esm/sdk/{transactions-CzZAt1Yn.js → transactions-Bk-VavcV.js} +10 -21
- package/dist/esm/sdk/tx-confirm-ui.js +53 -53
- package/dist/esm/sdk/{tx-confirmer-wrapper-CqfVBUaA.js → tx-confirmer-wrapper-lHNgz9i4.js} +53 -53
- package/dist/esm/sdk/tx-confirmer.css +6 -4
- package/dist/esm/sdk/w3a-tx-confirmer.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host.js +782 -447
- package/dist/esm/server/email-recovery/emailEncryptor.js +11 -1
- package/dist/esm/server/email-recovery/emailEncryptor.js.map +1 -1
- package/dist/esm/server/email-recovery/emailParsers.js +55 -1
- package/dist/esm/server/email-recovery/emailParsers.js.map +1 -1
- package/dist/esm/server/email-recovery/index.js +2 -2
- package/dist/esm/server/email-recovery/index.js.map +1 -1
- package/dist/esm/server/email-recovery/rpcCalls.js +14 -1
- package/dist/esm/server/email-recovery/rpcCalls.js.map +1 -1
- package/dist/esm/server/index.js +2 -2
- package/dist/esm/server/router/cloudflare.js.map +1 -1
- package/dist/esm/server/router/express.js.map +1 -1
- package/dist/esm/server/sdk/src/core/defaultConfigs.js +1 -1
- package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
- package/dist/esm/utils/index.js +10 -4
- package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker.js +3 -0
- package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
- package/dist/types/src/core/EmailRecovery/emailRecoveryPendingStore.d.ts +25 -0
- package/dist/types/src/core/EmailRecovery/emailRecoveryPendingStore.d.ts.map +1 -0
- package/dist/types/src/core/EmailRecovery/index.d.ts +1 -0
- package/dist/types/src/core/EmailRecovery/index.d.ts.map +1 -1
- package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts +11 -21
- package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts.map +1 -1
- package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts +45 -5
- package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts.map +1 -1
- package/dist/types/src/core/TatchiPasskey/index.d.ts +10 -2
- package/dist/types/src/core/TatchiPasskey/index.d.ts.map +1 -1
- package/dist/types/src/core/TatchiPasskey/relay.d.ts +2 -1
- package/dist/types/src/core/TatchiPasskey/relay.d.ts.map +1 -1
- package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts +4 -0
- package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts.map +1 -1
- package/dist/types/src/core/WalletIframe/client/router.d.ts +7 -3
- package/dist/types/src/core/WalletIframe/client/router.d.ts.map +1 -1
- package/dist/types/src/core/WalletIframe/host/wallet-iframe-handlers.d.ts.map +1 -1
- package/dist/types/src/core/WalletIframe/shared/messages.d.ts +6 -2
- package/dist/types/src/core/WalletIframe/shared/messages.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.d.ts.map +1 -1
- package/dist/types/src/core/WebAuthnManager/index.d.ts.map +1 -1
- package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
- package/dist/types/src/core/rpcCalls.d.ts +9 -0
- package/dist/types/src/core/rpcCalls.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
- package/dist/types/src/server/email-recovery/emailEncryptor.d.ts +4 -0
- package/dist/types/src/server/email-recovery/emailEncryptor.d.ts.map +1 -1
- package/dist/types/src/server/email-recovery/emailParsers.d.ts +7 -0
- package/dist/types/src/server/email-recovery/emailParsers.d.ts.map +1 -1
- package/dist/types/src/server/email-recovery/index.d.ts +1 -1
- package/dist/types/src/server/email-recovery/rpcCalls.d.ts +1 -1
- package/dist/types/src/server/email-recovery/rpcCalls.d.ts.map +1 -1
- package/dist/types/src/wasm_vrf_worker/pkg/wasm_vrf_worker.d.ts.map +1 -1
- package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
- package/dist/workers/web3authn-vrf.worker.js +3 -0
- package/package.json +1 -1
- package/dist/esm/sdk/createAdapters-pNiL2KNq.js.map +0 -1
- package/dist/esm/sdk/getDeviceNumber-CkWRT17I.js.map +0 -1
- package/dist/esm/sdk/transactions-jH38BZ-Q.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","names":["parsedOrigin: URL","IframeTransport","OverlayController","OnEventsProgressBus","defaultPhaseHeuristics","err: Error & { code?: string; details?: unknown }","full: ParentToChildEnvelope","isObject","isBoolean","toError","cancelEnvelope: ParentToChildEnvelope","RegistrationPhase","LoginPhase","ActionPhase","DeviceLinkingPhase","AccountRecoveryPhase","isPlainSignedTransactionLike","SignedTransaction","extractBorshBytesFromPlainSignedTx","stripFunctionsShallow"],"sources":["../../../../../../../../src/core/WalletIframe/client/router.ts"],"sourcesContent":["/*\n * WalletIframeRouter - Client-Side Communication Layer\n *\n * Owns all iframe overlay show/hide behavior for WebAuthn activation. It is the\n * single place that decides *how* the wallet iframe is displayed (fullscreen vs\n * anchored, sticky mode, force-fullscreen during registration, etc.).\n *\n * Responsibilities:\n * - Request/Response Correlation: Tracks pending requests with unique IDs.\n * - Progress Event Bridging: Receives PROGRESS from the wallet iframe and forwards\n * them to app `onEvent` handlers.\n * - Overlay Ownership:\n * - Delegates *when* to show/hide to OnEventsProgressBus (based on progress events).\n * - Executes *how* to show/hide via OverlayController (DOM / CSS / ARIA).\n * - Also reacts to wallet-host UI messages (e.g., WALLET_UI_CLOSED) and export flows.\n * - Timeout Handling: Manages request timeouts and cleanup.\n * - Message Serialization: Strips non-serializable functions from messages.\n * - Error Handling: Converts iframe errors to parent-appropriate errors.\n *\n * High-level flow:\n *\n * Step legend\n * -----------\n * (1) App calls a router RPC (executeAction, registerPasskey, etc).\n * (2) Router posts request to iframe and tracks a pending entry.\n * (3) Wallet iframe sends PROGRESS messages back to the router.\n * (4) Router forwards ProgressPayloads into OnEventsProgressBus.\n * (5) OnEventsProgressBus decides 'show' | 'hide' and calls router adapters.\n * (6) Router delegates to OverlayController to show|hide the iframe.\n * (7) Router receives final result, resolves the pending promise, unregisters,\n * and may hide the overlay if no other request still needs it.\n *\n * +-----------+ +--------------------+ +----------------------+ +----------------------+\n * | App | | WalletIframeRouter | | OnEventsProgressBus | | OverlayController |\n * +-----+-----+ +---------+----------+ +----------+-----------+ +----------+-----------+\n * | (1) RPC call (executeAction, etc.) | |\n * |---------------------->|---------------------------->| |\n * | | |\n * | (2) post(): send request to iframe |\n * | | |\n * | (3) PROGRESS from iframe via onPortMessage() |\n * |<----------------------------------------------------| |\n * | | |\n * | (4) ProgressPayload → heuristic |\n * | |---(5) 'show'|'hide' intent-->|\n * | | |\n * | (6) showFrameForActivation() | hideFrameForActivation() |\n * | | |\n * | | (6) show()|hide() |\n * | |----------------------------->|\n * | | |\n * | (7) PM_RESULT/ERROR → resolve pending, maybe hide overlay |\n * |<----------------------------------------------------| |\n *\n * Communication Flow (requests):\n * 1. Parent calls RPC method (e.g., registerPasskey).\n * 2. Router creates unique request ID and pending entry.\n * 3. Message sent to iframe via MessagePort.\n * 4. Progress events bridged back to parent callbacks and fed into OnEventsProgressBus.\n * 5. OnEventsProgressBus emits show/hide intents; router invokes OverlayController.\n * 6. Final result resolves the pending promise; router unregisters and may hide overlay.\n */\n\nimport {\n type ParentToChildEnvelope,\n type ChildToParentEnvelope,\n type ProgressPayload,\n type PreferencesChangedPayload,\n} from '../shared/messages';\nimport { SignedTransaction } from '../../NearClient';\nimport { OnEventsProgressBus, defaultPhaseHeuristics } from './on-events-progress-bus';\nimport type {\n ActionSSEEvent,\n ActionHooksOptions,\n AfterCall,\n AccountRecoverySSEEvent,\n DelegateActionSSEEvent,\n DeviceLinkingSSEEvent,\n LoginSSEvent,\n RegistrationSSEEvent,\n SendTransactionHooksOptions,\n SignAndSendTransactionHooksOptions,\n} from '../../types/sdkSentEvents';\nimport {\n RegistrationPhase,\n LoginPhase,\n ActionPhase,\n DeviceLinkingPhase,\n AccountRecoveryPhase,\n} from '../../types/sdkSentEvents';\nimport type {\n ActionResult,\n GetRecentLoginsResult,\n LoginAndCreateSessionResult,\n LoginSession,\n RegistrationResult,\n SignTransactionResult,\n} from '../../types/tatchi';\nimport {\n ActionArgs,\n TransactionInput,\n TxExecutionStatus\n} from '../../types';\nimport type { DelegateActionInput } from '../../types/delegate';\nimport { IframeTransport } from './IframeTransport';\nimport OverlayController, { type DOMRectLike } from './overlay-controller';\nimport { isObject, isPlainSignedTransactionLike, extractBorshBytesFromPlainSignedTx, isBoolean } from '../validation';\nimport type { WalletUIRegistry } from '../host/iframe-lit-element-registry';\nimport { toError } from '../../../utils/errors';\nimport {\n DeviceLinkingQRData,\n LinkDeviceResult,\n StartDevice2LinkingFlowArgs,\n StartDevice2LinkingFlowResults,\n} from '../../types/linkDevice'\nimport type { AuthenticatorOptions } from '../../types/authenticatorOptions';\nimport type { ConfirmationConfig } from '../../types/signer-worker';\nimport type { AccessKeyList } from '../../NearClient';\nimport type { SignNEP413MessageResult } from '../../TatchiPasskey/signNEP413';\nimport type { RecoveryResult } from '../../TatchiPasskey';\nimport { openOfflineExportWindow } from '../../OfflineExport/index.js';\nimport type { DerivedAddressRecord } from '../../IndexedDBManager';\nimport type { EmailRecoveryContracts } from '../../types/tatchi';\n\n// Simple, framework-agnostic service iframe client.\n// Responsibilities split:\n// - IframeTransport: low-level mount + load + CONNECT/READY handshake (MessagePort)\n// - WalletIframeRouter (this): request/response correlation, progress events,\n// overlay display, and high-level wallet RPC helpers\n\nexport interface WalletIframeRouterOptions {\n walletOrigin: string; // e.g., https://wallet.example.com\n servicePath?: string; // default '/wallet-service'\n connectTimeoutMs?: number; // default 8000\n requestTimeoutMs?: number; // default 20000\n theme?: 'dark' | 'light';\n // Enable verbose client-side logging for debugging\n debug?: boolean;\n // Test-only/diagnostic options (not part of the public API contract for apps)\n testOptions?: {\n // Optional identity/ownership tags for the iframe instance (useful for tests/tools)\n routerId?: string;\n ownerTag?: string; // e.g., 'app' | 'tests'\n // Lazy mounting: when false, do not auto-connect/mount during init(); connect on first use\n autoMount?: boolean;\n };\n // Optional config forwarded to wallet host\n nearRpcUrl?: string;\n nearNetwork?: 'testnet' | 'mainnet';\n contractId?: string;\n relayer?: {\n url: string;\n };\n vrfWorkerConfigs?: Record<string, unknown>;\n rpIdOverride?: string;\n authenticatorOptions?: AuthenticatorOptions;\n emailRecoveryContracts?: Partial<EmailRecoveryContracts>;\n // SDK asset base path for embedded bundles when mounting same‑origin via srcdoc\n // Must serve dist/esm under this base path. Defaults to '/sdk'.\n sdkBasePath?: string;\n // Optional: pre-register UI components in wallet host\n uiRegistry?: Record<string, unknown>;\n // Optional: explorer base URL for TxTree links\n nearExplorerUrl?: string;\n}\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (reason?: unknown) => void;\n timer: number | undefined;\n onProgress?: (payload: ProgressPayload) => void;\n onTimeout: () => Error;\n};\n\ntype PostResult<T> = {\n ok: boolean,\n result: T\n}\n\nexport class WalletIframeRouter {\n private opts: Required<WalletIframeRouterOptions>;\n // Low-level transport handling iframe mount + handshake\n private transport: IframeTransport;\n private port: MessagePort | null = null;\n private ready = false;\n // Deduplicate concurrent init() calls and avoid race conditions\n private initInFlight: Promise<void> | null = null;\n private pending = new Map<string, Pending>();\n private reqCounter = 0;\n private readyListeners: Set<() => void> = new Set();\n private vrfStatusListeners: Set<(status: { active: boolean; nearAccountId: string | null; sessionDuration?: number }) => void> = new Set();\n private preferencesChangedListeners: Set<(payload: PreferencesChangedPayload) => void> = new Set();\n // Coalesce duplicate Device2 start calls (e.g., React StrictMode double-effects)\n private device2StartPromise: Promise<{ qrData: DeviceLinkingQRData; qrCodeDataURL: string }> | null = null;\n private progressBus: OnEventsProgressBus;\n private debug = false;\n private readonly walletOriginUrl: URL;\n private readonly walletOriginOrigin: string;\n private overlay: OverlayController;\n // Force the overlay to remain fullscreen during critical flows (e.g., registration)\n // and ignore anchored rect updates from helper hooks.\n private overlayForceFullscreen = false;\n // Overlay register button window-message bridging (wallet-host UI → parent)\n private readonly registerOverlayResultListeners = new Set<(\n payload: { ok: boolean; result?: RegistrationResult; cancelled?: boolean; error?: string }\n ) => void>();\n private readonly registerOverlaySubmitListeners = new Set<() => void>();\n private windowMsgHandlerBound?: (ev: MessageEvent) => void;\n\n constructor(options: WalletIframeRouterOptions) {\n if (!options?.walletOrigin) {\n throw new Error('[WalletIframeRouter] walletOrigin is required when using the wallet iframe');\n }\n\n let parsedOrigin: URL;\n try {\n parsedOrigin = new URL(options.walletOrigin);\n } catch (err) {\n throw new Error(`[WalletIframeRouter] Invalid walletOrigin: ${options.walletOrigin}`);\n }\n\n if (typeof window !== 'undefined') {\n const parentOrigin = window.location.origin;\n if (parsedOrigin.origin === parentOrigin) {\n console.warn('[WalletIframeRouter] walletOrigin matches the host origin. Isolation safeguards rely on the parent; consider moving the wallet to a dedicated origin.');\n }\n }\n\n const defaultRouterId = `w3a-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const testOptions = {\n routerId: defaultRouterId,\n ownerTag: undefined as string | undefined,\n autoMount: true,\n ...(options?.testOptions || {}),\n };\n this.opts = {\n connectTimeoutMs: 8000,\n requestTimeoutMs: 20000,\n servicePath: '/wallet-service',\n sdkBasePath: '/sdk',\n testOptions,\n ...options,\n } as Required<WalletIframeRouterOptions>;\n this.walletOriginUrl = parsedOrigin;\n this.walletOriginOrigin = parsedOrigin.origin;\n this.debug = !!this.opts.debug;\n // Encapsulate iframe mount + handshake logic in transport\n this.transport = new IframeTransport({\n walletOrigin: this.opts.walletOrigin,\n servicePath: this.opts.servicePath,\n connectTimeoutMs: this.opts.connectTimeoutMs,\n testOptions: {\n routerId: this.opts.testOptions.routerId,\n ownerTag: this.opts.testOptions.ownerTag,\n },\n });\n\n // Centralize overlay sizing/visibility. The router is the single owner of\n // \"how\" the iframe is shown/hidden (fullscreen vs anchored, sticky, etc).\n this.overlay = new OverlayController({ ensureIframe: () => this.transport.ensureIframeMounted() });\n\n // Initialize progress router with overlay control and phase heuristics.\n // OnEventsProgressBus only decides *when* to show/hide based on events; it calls\n // these adapter functions, and the router delegates to OverlayController.\n this.progressBus = new OnEventsProgressBus(\n {\n show: () => this.showFrameForActivation(),\n hide: () => this.hideFrameForActivation()\n },\n defaultPhaseHeuristics,\n this.debug\n ? (msg: string, data?: Record<string, unknown>) => {\n console.debug('[WalletIframeRouter][OnEventsProgressBus]', msg, data || {});\n }\n : undefined\n );\n\n // Bridge wallet-host overlay UI messages into router callbacks\n this.windowMsgHandlerBound = (ev: MessageEvent) => {\n if (ev.origin !== this.walletOriginOrigin) return;\n const data = ev.data as unknown;\n if (!data || typeof data !== 'object') return;\n const type = (data as { type?: unknown }).type;\n if (type === 'REGISTER_BUTTON_SUBMIT') {\n // User clicked the register arrow inside the wallet-anchored UI\n // Force the overlay to fullscreen immediately so the TxConfirmer\n // can mount and capture activation in Safari/iOS/mobile.\n this.overlayForceFullscreen = true;\n this.overlay.setSticky(true);\n this.overlay.showFullscreen();\n for (const cb of Array.from(this.registerOverlaySubmitListeners)) {\n try { cb(); } catch {}\n }\n return;\n }\n if (type === 'REGISTER_BUTTON_RESULT') {\n const payload = (data as { payload?: unknown }).payload as\n | { ok?: boolean; result?: RegistrationResult; cancelled?: boolean; error?: string }\n | undefined;\n const ok = !!payload?.ok;\n for (const cb of Array.from(this.registerOverlayResultListeners)) {\n cb({ ok, result: payload?.result, cancelled: payload?.cancelled, error: payload?.error });\n }\n // Release overlay lock after result\n this.overlayForceFullscreen = false;\n this.overlay.setSticky(false);\n // Progress bus will hide after completion; hide defensively here\n this.hideFrameForActivation();\n if (ok) {\n const acct = payload?.result?.nearAccountId;\n void this.getLoginSession(acct)\n .then(({ login: st }) => {\n this.emitVrfStatusChanged({ active: !!st.vrfActive, nearAccountId: st.nearAccountId, sessionDuration: st.vrfSessionDuration });\n })\n .catch(() => {});\n }\n return;\n }\n };\n globalThis.addEventListener?.('message', this.windowMsgHandlerBound);\n }\n\n private attachExportUiClosedListener = (walletOrigin: string): (() => void) => {\n const onUiClosed = (ev: MessageEvent) => {\n if (ev.origin !== walletOrigin) return;\n const data = ev.data as unknown;\n if (!data || (data as any).type !== 'WALLET_UI_CLOSED') return;\n this.overlay.setSticky(false);\n this.hideFrameForActivation();\n globalThis.removeEventListener?.('message', onUiClosed);\n };\n globalThis.addEventListener?.('message', onUiClosed);\n return () => { globalThis.removeEventListener?.('message', onUiClosed) };\n }\n\n private attachExportUiFallbackListener = (walletOrigin: string, accountId: string): (() => void) => {\n const onFallback = async (ev: MessageEvent) => {\n if (ev.origin !== walletOrigin) return;\n const data = ev.data as any;\n if (!data || data.type !== 'OFFLINE_EXPORT_FALLBACK') return;\n globalThis.removeEventListener?.('message', onFallback);\n this.overlay.setSticky(false);\n this.hideFrameForActivation();\n await this.openOfflineExport({ accountId });\n };\n globalThis.addEventListener?.('message', onFallback);\n return () => { globalThis.removeEventListener?.('message', onFallback) };\n }\n\n /**\n * Subscribe to service-ready event. Returns an unsubscribe function.\n * If already ready, the listener is invoked on next microtask.\n */\n onReady(listener: () => void): () => void {\n if (this.ready) {\n Promise.resolve().then(() => { listener(); });\n return () => {};\n }\n this.readyListeners.add(listener);\n return () => { this.readyListeners.delete(listener); };\n }\n\n private emitReady(): void {\n if (!this.readyListeners.size) return;\n for (const cb of Array.from(this.readyListeners)) { cb(); }\n // Keep listeners registered; callers can unsubscribe if desired.\n }\n\n /**\n * Initialize the transport and configure the wallet host.\n * Safe to call multiple times; concurrent calls deduplicate via initInFlight.\n */\n async init(): Promise<void> {\n if (this.ready) return;\n if (this.initInFlight) { return this.initInFlight; }\n this.initInFlight = (async () => {\n // Respect autoMount=false by deferring connect until first use\n if (this.opts.testOptions.autoMount !== false) {\n this.port = await this.transport.connect();\n this.port.onmessage = (ev) => this.onPortMessage(ev);\n this.port.start?.();\n this.ready = true;\n }\n console.debug('[WalletIframeRouter] init: %s', this.ready ? 'connected' : 'deferred (autoMount=false)');\n await this.post({\n type: 'PM_SET_CONFIG',\n payload: {\n theme: this.opts.theme,\n nearRpcUrl: this.opts.nearRpcUrl,\n nearNetwork: this.opts.nearNetwork,\n // Align with PMSetConfigPayload which expects `contractId`\n // while keeping RouterOptions field name `contractId` for external API.\n contractId: this.opts.contractId,\n nearExplorerUrl: this.opts.nearExplorerUrl,\n relayer: this.opts.relayer,\n vrfWorkerConfigs: this.opts.vrfWorkerConfigs,\n rpIdOverride: this.opts.rpIdOverride,\n authenticatorOptions: this.opts.authenticatorOptions,\n emailRecoveryContracts: this.opts.emailRecoveryContracts,\n uiRegistry: this.opts.uiRegistry,\n // for embedded Lit components\n assetsBaseUrl: (() => {\n try {\n const base = new URL(this.opts.sdkBasePath, this.walletOriginUrl).toString();\n return base.endsWith('/') ? base : `${base}/`;\n } catch {\n const fallback = new URL('/sdk/', this.walletOriginUrl).toString();\n return fallback.endsWith('/') ? fallback : `${fallback}/`;\n }\n })(),\n }\n });\n this.emitReady();\n })();\n\n try {\n await this.initInFlight;\n } finally {\n this.initInFlight = null;\n }\n }\n\n isReady(): boolean { return this.ready; }\n\n // ===== UI registry/window-message helpers (generic mounting) =====\n registerUiTypes(registry: WalletUIRegistry): void {\n const iframe = this.transport.ensureIframeMounted();\n const w = iframe.contentWindow;\n if (!w) return;\n const target = this.walletOriginOrigin;\n this.postWindowMessage(w, { type: 'WALLET_UI_REGISTER_TYPES', payload: registry }, target);\n }\n\n mountUiComponent(params: { key: string; props?: Record<string, unknown>; targetSelector?: string; id?: string }): void {\n const iframe = this.transport.ensureIframeMounted();\n const w = iframe.contentWindow;\n if (!w) return;\n const target = this.walletOriginOrigin;\n this.postWindowMessage(w, { type: 'WALLET_UI_MOUNT', payload: params }, target);\n }\n\n updateUiComponent(params: { id: string; props?: Record<string, unknown> }): void {\n const iframe = this.transport.ensureIframeMounted();\n const w = iframe.contentWindow;\n if (!w) return;\n const target = this.walletOriginOrigin;\n this.postWindowMessage(w, { type: 'WALLET_UI_UPDATE', payload: params }, target);\n }\n\n unmountUiComponent(id: string): void {\n const iframe = this.transport.ensureIframeMounted();\n const w = iframe.contentWindow;\n if (!w) return;\n const target = this.walletOriginOrigin;\n this.postWindowMessage(w, { type: 'WALLET_UI_UNMOUNT', payload: { id } }, target);\n }\n\n // ===== Public RPC helpers =====\n\n // Subscribe to VRF status changes observed by this client\n onVrfStatusChanged(listener: (status: {\n active: boolean;\n nearAccountId: string | null;\n sessionDuration?: number\n }) => void): () => void {\n this.vrfStatusListeners.add(listener);\n return () => { this.vrfStatusListeners.delete(listener); };\n }\n\n // Subscribe to wallet-host preference changes (authoritative in wallet-iframe mode).\n onPreferencesChanged(listener: (payload: PreferencesChangedPayload) => void): () => void {\n this.preferencesChangedListeners.add(listener);\n return () => { this.preferencesChangedListeners.delete(listener); };\n }\n\n private emitVrfStatusChanged(status: {\n active: boolean;\n nearAccountId: string | null;\n sessionDuration?: number\n }): void {\n for (const cb of Array.from(this.vrfStatusListeners)) {\n try { cb(status); } catch {}\n }\n }\n\n private emitPreferencesChanged(payload: PreferencesChangedPayload): void {\n if (!this.preferencesChangedListeners.size) return;\n for (const cb of Array.from(this.preferencesChangedListeners)) {\n try { cb(payload); } catch {}\n }\n }\n\n // Overlay register button events (optional convenience API)\n onRegisterOverlayResult(listener: (payload: { ok: boolean; result?: RegistrationResult; cancelled?: boolean; error?: string }) => void): () => void {\n this.registerOverlayResultListeners.add(listener);\n return () => { this.registerOverlayResultListeners.delete(listener); };\n }\n\n onRegisterOverlaySubmit(listener: () => void): () => void {\n this.registerOverlaySubmitListeners.add(listener);\n return () => { this.registerOverlaySubmitListeners.delete(listener); };\n }\n\n // ===== TatchiPasskey RPCs =====\n\n async signTransactionsWithActions(payload: {\n nearAccountId: string;\n transactions: TransactionInput[];\n options?: {\n onEvent?: (ev: ActionSSEEvent) => void;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<SignTransactionResult[]>;\n // Allow minimal overrides (e.g., { uiMode: 'drawer' })\n confirmationConfig?: Partial<ConfirmationConfig>;\n confirmerText?: { title?: string; body?: string };\n }\n }): Promise<SignTransactionResult[]> {\n // Do not forward non-cloneable functions in options; host emits its own PROGRESS messages\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n }\n : undefined;\n const res = await this.post<SignTransactionResult>({\n type: 'PM_SIGN_TXS_WITH_ACTIONS',\n payload: {\n nearAccountId: payload.nearAccountId,\n transactions: payload.transactions,\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isActionSSEEvent) }\n });\n return normalizeSignedTransactionObject(res.result)\n }\n\n async signDelegateAction(payload: {\n nearAccountId: string;\n delegate: DelegateActionInput;\n options?: {\n onEvent?: (ev: ActionSSEEvent) => void;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<any>;\n confirmationConfig?: Partial<ConfirmationConfig>;\n confirmerText?: { title?: string; body?: string };\n }\n }): Promise<unknown> {\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n }\n : undefined;\n const res = await this.post<unknown>({\n type: 'PM_SIGN_DELEGATE_ACTION',\n payload: {\n nearAccountId: payload.nearAccountId,\n delegate: payload.delegate,\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isActionSSEEvent) }\n });\n return res.result;\n }\n\n async registerPasskey(payload: {\n nearAccountId: string;\n confirmationConfig?: Partial<ConfirmationConfig>;\n options?: {\n onEvent?: (ev: RegistrationSSEEvent) => void;\n confirmerText?: { title?: string; body?: string };\n }\n }): Promise<RegistrationResult> {\n // Step 1: For registration, force fullscreen overlay (not anchored to CTA)\n // so the TxConfirmer (drawer/modal) has space to render and capture activation.\n // Lock overlay to fullscreen for the duration of registration\n this.overlayForceFullscreen = true;\n this.overlay.setSticky(true);\n this.overlay.showFullscreen();\n\n try {\n // Optional one-time confirmation override (non-persistent)\n if (payload.confirmationConfig) {\n const base = await this.getConfirmationConfig();\n await this.setConfirmationConfig({ ...base, ...payload.confirmationConfig });\n }\n\n // Step 2: Strip non-serializable functions from options (functions can't cross iframe boundary)\n const safeOptions = removeFunctionsFromOptions(payload.options);\n\n // Step 3: Send PM_REGISTER message to iframe and wait for response\n const res = await this.post<RegistrationResult>({\n type: 'PM_REGISTER',\n payload: {\n nearAccountId: payload.nearAccountId,\n options: safeOptions,\n ...(payload.confirmationConfig ? { confirmationConfig: payload.confirmationConfig as unknown as Record<string, unknown> } : {})\n },\n // Bridge progress events from iframe back to parent callback\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isRegistrationSSEEvent) }\n });\n\n // Step 4: Update VRF status after successful registration\n const { login: st } = await this.getLoginSession(payload.nearAccountId);\n this.emitVrfStatusChanged({\n active: !!st.vrfActive,\n nearAccountId: st.nearAccountId,\n sessionDuration: st.vrfSessionDuration\n });\n\n return res?.result;\n } finally {\n // Step 5: Always release overlay lock and hide when done (success or error)\n this.overlayForceFullscreen = false;\n this.overlay.setSticky(false);\n this.hideFrameForActivation();\n }\n }\n\n async loginAndCreateSession(payload: {\n nearAccountId: string;\n options?: {\n onEvent?: (ev: LoginSSEvent) => void;\n // Forward session config so host can mint JWT/cookie\n session?: {\n kind: 'jwt' | 'cookie';\n relayUrl?: string;\n route?: string;\n };\n // Warm signing session policy override during login\n signingSession?: {\n ttlMs?: number;\n remainingUses?: number;\n };\n }\n }): Promise<LoginAndCreateSessionResult> {\n this.showFrameForActivation();\n try {\n const safeOptions = removeFunctionsFromOptions(payload.options);\n const res = await this.post<LoginAndCreateSessionResult>({\n type: 'PM_LOGIN',\n payload: {\n nearAccountId: payload.nearAccountId,\n options: safeOptions\n },\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isLoginSSEEvent) }\n });\n const { login: st } = await this.getLoginSession(payload.nearAccountId);\n this.emitVrfStatusChanged({ active: !!st.vrfActive, nearAccountId: st.nearAccountId, sessionDuration: st.vrfSessionDuration });\n return res?.result;\n } finally {\n this.hideFrameForActivation();\n }\n }\n\n async getLoginSession(nearAccountId?: string): Promise<LoginSession> {\n const res = await this.post<LoginSession>({\n type: 'PM_GET_LOGIN_SESSION',\n payload: nearAccountId ? { nearAccountId } : undefined\n });\n return res.result;\n }\n\n async checkVrfStatus(): Promise<PostResult<{ active: boolean; nearAccountId: string | null; sessionDuration?: number }>> {\n const { login: st } = await this.getLoginSession();\n return {\n ok: true,\n result: {\n active: !!st.vrfActive,\n nearAccountId: st.nearAccountId,\n sessionDuration: st.vrfSessionDuration\n }\n };\n }\n\n async clearVrfSession(): Promise<PostResult<void>> {\n await this.post<void>({ type: 'PM_LOGOUT' });\n this.emitVrfStatusChanged({ active: false, nearAccountId: null });\n return { ok: true, result: undefined };\n }\n\n async signNep413Message(payload: {\n nearAccountId: string;\n message: string;\n recipient: string;\n state?: string;\n options?: {\n onEvent?: (ev: ActionSSEEvent) => void;\n confirmerText?: { title?: string; body?: string };\n confirmationConfig?: Partial<ConfirmationConfig>;\n }\n }): Promise<SignNEP413MessageResult> {\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n }\n : undefined;\n const res = await this.post<SignNEP413MessageResult>({\n type: 'PM_SIGN_NEP413',\n payload: {\n nearAccountId: payload.nearAccountId,\n params: {\n message: payload.message,\n recipient: payload.recipient,\n state: payload.state\n },\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isActionSSEEvent) }\n });\n return res.result\n }\n\n async signTransactionWithKeyPair(payload: {\n signedTransaction: SignedTransaction;\n options?: {\n onEvent?: (ev: ActionSSEEvent) => void\n }\n }): Promise<ActionResult> {\n // Strip non-cloneable functions from options; host emits PROGRESS events\n const { options } = payload;\n const res = await this.post<ActionResult>( {\n type: 'PM_SEND_TRANSACTION',\n payload: {\n signedTransaction: payload.signedTransaction,\n options: options\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result;\n }\n\n async executeAction(payload: {\n nearAccountId: string;\n receiverId: string;\n actionArgs: ActionArgs | ActionArgs[];\n options?: ActionHooksOptions\n }): Promise<ActionResult> {\n // Strip non-cloneable functions from options; host emits PROGRESS events\n const { options } = payload;\n const safeOptions = options\n ? {\n waitUntil: options.waitUntil,\n confirmationConfig: options.confirmationConfig,\n ...(options.confirmerText ? { confirmerText: options.confirmerText } : {}),\n }\n : undefined;\n\n const res = await this.post<ActionResult>({\n type: 'PM_EXECUTE_ACTION',\n payload: {\n ...payload,\n options: safeOptions\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result;\n }\n\n async setConfirmBehavior(behavior: 'requireClick' | 'autoProceed'): Promise<void> {\n let { nearAccountId } = (await this.getLoginSession()).login;\n await this.post<void>({\n type: 'PM_SET_CONFIRM_BEHAVIOR',\n payload: { behavior, nearAccountId }\n });\n }\n\n async setConfirmationConfig(config: ConfirmationConfig): Promise<void> {\n let { nearAccountId } = (await this.getLoginSession()).login;\n await this.post<void>({\n type: 'PM_SET_CONFIRMATION_CONFIG',\n payload: { config, nearAccountId }\n });\n }\n\n async getConfirmationConfig(): Promise<ConfirmationConfig> {\n const res = await this.post<ConfirmationConfig>({ type: 'PM_GET_CONFIRMATION_CONFIG' });\n return res.result\n }\n\n async setTheme(theme: 'dark' | 'light'): Promise<void> {\n await this.post<void>({ type: 'PM_SET_THEME', payload: { theme } });\n }\n\n async prefetchBlockheight(): Promise<void> {\n await this.post<void>({ type: 'PM_PREFETCH_BLOCKHEIGHT' } );\n }\n\n async getRecentLogins(): Promise<GetRecentLoginsResult> {\n const res = await this.post<GetRecentLoginsResult>({ type: 'PM_GET_RECENT_LOGINS' } );\n return res.result;\n }\n\n // === Local persistence helpers (wallet-origin IndexedDB) ===\n\n async setDerivedAddress(payload: {\n nearAccountId: string;\n args: { contractId: string; path: string; address: string };\n }): Promise<void> {\n await this.post<void>({\n type: 'PM_SET_DERIVED_ADDRESS',\n payload,\n });\n }\n\n async getDerivedAddressRecord(payload: {\n nearAccountId: string;\n args: { contractId: string; path: string };\n }): Promise<DerivedAddressRecord | null> {\n const res = await this.post<DerivedAddressRecord | null>({\n type: 'PM_GET_DERIVED_ADDRESS_RECORD',\n payload,\n });\n return (res.result as DerivedAddressRecord | null) || null;\n }\n\n async getDerivedAddress(payload: {\n nearAccountId: string;\n args: { contractId: string; path: string };\n }): Promise<string | null> {\n const res = await this.post<string | null>({\n type: 'PM_GET_DERIVED_ADDRESS',\n payload,\n });\n return (res.result as string | null) || null;\n }\n\n async getRecoveryEmails(\n nearAccountId: string,\n ): Promise<Array<{ hashHex: string; email: string }>> {\n const res = await this.post<Array<{ hashHex: string; email: string }>>({\n type: 'PM_GET_RECOVERY_EMAILS',\n payload: { nearAccountId },\n });\n return (res.result as Array<{ hashHex: string; email: string }>) || [];\n }\n\n async setRecoveryEmails(payload: {\n nearAccountId: string;\n recoveryEmails: string[];\n options?: ActionHooksOptions;\n }): Promise<ActionResult> {\n const { options } = payload;\n const safeOptions = options\n ? {\n waitUntil: options.waitUntil,\n confirmationConfig: options.confirmationConfig,\n }\n : undefined;\n\n const res = await this.post<ActionResult>({\n type: 'PM_SET_RECOVERY_EMAILS',\n payload: {\n nearAccountId: payload.nearAccountId,\n recoveryEmails: payload.recoveryEmails,\n options: safeOptions,\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) },\n });\n return res.result;\n }\n\n // Bridge typed public onEvent callbacks to the transport's onProgress callback.\n // - onEvent: consumer's strongly-typed event handler (e.g., ActionSSEEvent)\n // - isExpectedEvent: runtime type guard that validates a ProgressPayload as that event type\n // Returns an onProgress handler that safely narrows before invoking onEvent.\n private wrapOnEvent<TEvent extends ProgressPayload>(\n onEvent: ((event: TEvent) => void) | undefined,\n isExpectedEvent: (progress: ProgressPayload) => progress is TEvent\n ): ((progress: ProgressPayload) => void) | undefined {\n if (!onEvent) return undefined;\n return (progress: ProgressPayload) => {\n try {\n if (isExpectedEvent(progress)) onEvent(progress);\n } catch {}\n };\n }\n\n async signAndSendTransactions(payload: {\n nearAccountId: string;\n transactions: TransactionInput[];\n options?: SignAndSendTransactionHooksOptions\n }): Promise<ActionResult[]> {\n\n const { options } = payload;\n // cannot send objects/functions through postMessage(), clean options first\n const safeOptions = options\n ? {\n waitUntil: options.waitUntil,\n executionWait: options.executionWait,\n confirmationConfig: options.confirmationConfig,\n ...(options.confirmerText ? { confirmerText: options.confirmerText } : {}),\n }\n : undefined;\n\n const res = await this.post<ActionResult[]>({\n type: 'PM_SIGN_AND_SEND_TXS',\n payload: {\n nearAccountId: payload.nearAccountId,\n transactions: payload.transactions,\n options: safeOptions\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result;\n }\n\n async hasPasskeyCredential(nearAccountId: string): Promise<boolean> {\n const res = await this.post<boolean>({\n type: 'PM_HAS_PASSKEY',\n payload: { nearAccountId }\n });\n return !!res?.result;\n }\n\n async viewAccessKeyList(accountId: string): Promise<AccessKeyList> {\n const res = await this.post<AccessKeyList>({\n type: 'PM_VIEW_ACCESS_KEYS',\n payload: { accountId }\n });\n return res.result\n }\n\n async deleteDeviceKey(\n accountId: string,\n publicKeyToDelete: string,\n options?: { onEvent?: (ev: ActionSSEEvent) => void }\n ) : Promise<ActionResult> {\n const res = await this.post<ActionResult>({\n type: 'PM_DELETE_DEVICE_KEY',\n payload: {\n accountId,\n publicKeyToDelete\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result\n }\n\n async sendTransaction(args: {\n signedTransaction: SignedTransaction;\n options?: SendTransactionHooksOptions;\n }): Promise<ActionResult> {\n // Strip non-cloneable functions from options; host emits PROGRESS events\n const { options } = args;\n const safeOptions = options\n ? { waitUntil: options.waitUntil }\n : undefined;\n\n const res = await this.post<ActionResult>({\n type: 'PM_SEND_TRANSACTION',\n payload: {\n signedTransaction: args.signedTransaction,\n options: safeOptions\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result\n }\n\n async exportNearKeypairWithUI(\n nearAccountId: string,\n options?: { variant?: 'drawer' | 'modal'; theme?: 'dark' | 'light' }\n ): Promise<void> {\n try {\n // Make the wallet iframe visible while the export viewer is open.\n // Unlike request/response flows, the wallet host renders UI and manages\n // its own lifecycle; it will notify us when to hide via window message.\n this.showFrameForActivation();\n const walletOrigin = this.walletOriginOrigin;\n const detachClosed = this.attachExportUiClosedListener(walletOrigin);\n const detachFallback = this.attachExportUiFallbackListener(walletOrigin, nearAccountId);\n await this.post<void>({\n type: 'PM_EXPORT_NEAR_KEYPAIR_UI',\n payload: { nearAccountId, variant: options?.variant, theme: options?.theme },\n options: { sticky: true }\n });\n // Cleanup once posted (handlers will remove themselves on events)\n void detachClosed;\n void detachFallback;\n return;\n } catch (e) {\n // Fallback to offline-export route (new tab) if wallet host is unreachable or errors out\n await this.openOfflineExport({ accountId: nearAccountId });\n }\n }\n\n /**\n * Open the offline-export route as a full-screen overlay iframe and instruct it via postMessage\n * to begin the export flow for the given account. Cleans up when the viewer closes or on error.\n */\n async openOfflineExport({ accountId, timeoutMs = 20000 }: { accountId: string; timeoutMs?: number }): Promise<void> {\n const walletOrigin = this.opts.walletOrigin || window.location.origin;\n // Default: open a new tab/window for clarity\n openOfflineExportWindow({ walletOrigin, target: '_blank', accountId });\n return Promise.resolve();\n }\n\n // ===== Account Recovery (single-endpoint flow) =====\n async recoverAccountFlow(payload: {\n accountId?: string;\n onEvent?: (ev: AccountRecoverySSEEvent) => void\n }): Promise<RecoveryResult> {\n const res = await this.post<RecoveryResult>({\n type: 'PM_RECOVER_ACCOUNT_FLOW',\n payload: { accountId: payload.accountId },\n options: {\n onProgress: this.wrapOnEvent(payload.onEvent, isAccountRecoverySSEEvent)\n }\n });\n return res.result\n }\n\n // ===== Email Recovery (wallet-hosted) =====\n async startEmailRecovery(payload: {\n accountId: string;\n recoveryEmail: string;\n onEvent?: (ev: ProgressPayload) => void;\n options?: {\n confirmerText?: { title?: string; body?: string };\n confirmationConfig?: Partial<ConfirmationConfig>;\n }\n }): Promise<{ mailtoUrl: string; nearPublicKey: string }> {\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n }\n : undefined;\n const res = await this.post<{ mailtoUrl: string; nearPublicKey: string }>({\n type: 'PM_START_EMAIL_RECOVERY',\n payload: {\n accountId: payload.accountId,\n recoveryEmail: payload.recoveryEmail,\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: {\n onProgress: payload.onEvent\n }\n });\n return res.result;\n }\n\n async finalizeEmailRecovery(payload: {\n accountId: string;\n nearPublicKey?: string;\n onEvent?: (ev: ProgressPayload) => void\n }): Promise<void> {\n await this.post<void>({\n type: 'PM_FINALIZE_EMAIL_RECOVERY',\n payload: { accountId: payload.accountId, nearPublicKey: payload.nearPublicKey },\n options: {\n onProgress: payload.onEvent\n }\n });\n }\n\n // ===== Device Linking (iframe-hosted) =====\n async linkDeviceWithScannedQRData(payload: {\n qrData: DeviceLinkingQRData;\n fundingAmount: string;\n options?: {\n onEvent?: (ev: DeviceLinkingSSEEvent) => void;\n confirmationConfig?: Partial<ConfirmationConfig>;\n confirmerText?: { title?: string; body?: string };\n }\n }): Promise<LinkDeviceResult> {\n // TouchID required within host\n this.showFrameForActivation();\n try {\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n }\n : undefined;\n const res = await this.post<LinkDeviceResult>({\n type: 'PM_LINK_DEVICE_WITH_SCANNED_QR_DATA',\n payload: {\n qrData: payload.qrData,\n fundingAmount: payload.fundingAmount,\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: {\n onProgress: this.wrapOnEvent(payload.options?.onEvent, isDeviceLinkingSSEEvent)\n }\n });\n return res.result\n } finally {\n this.hideFrameForActivation();\n }\n }\n\n async startDevice2LinkingFlow(payload?: StartDevice2LinkingFlowArgs): Promise<StartDevice2LinkingFlowResults> {\n if (this.device2StartPromise) {\n return this.device2StartPromise\n }\n const options = payload?.options;\n const safeOptions = options\n ? {\n ...(options.confirmationConfig\n ? { confirmationConfig: options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n ...(options.confirmerText ? { confirmerText: options.confirmerText } : {}),\n }\n : undefined;\n const p = this.post<StartDevice2LinkingFlowResults>({\n type: 'PM_START_DEVICE2_LINKING_FLOW',\n payload: {\n ui: payload?.ui,\n cameraId: payload?.cameraId,\n options: safeOptions\n },\n options: {\n onProgress: this.wrapOnEvent(options?.onEvent, isDeviceLinkingSSEEvent),\n sticky: true\n }\n }).then((res) => res.result)\n .finally(() => { this.device2StartPromise = null; });\n\n this.device2StartPromise = p;\n return p;\n }\n\n async stopDevice2LinkingFlow(): Promise<void> {\n await this.post<void>({ type: 'PM_STOP_DEVICE2_LINKING_FLOW' });\n this.progressBus.clearAll();\n }\n\n // ===== Control APIs =====\n async cancelRequest(requestId: string): Promise<void> {\n // Best-effort cancel. Host will attempt to close open modals and mark the request as cancelled.\n await this.post<void>({ type: 'PM_CANCEL', payload: { requestId } }).catch(() => {});\n // Always clear local progress + hide overlay even if the host didn't receive the message\n this.progressBus.unregister(requestId);\n this.hideFrameForActivation();\n }\n\n async cancelAll(): Promise<void> {\n // Try to cancel all requests on the host, but don't depend on READY/port availability\n await this.post<void>({ type: 'PM_CANCEL', payload: {} }).catch(() => {});\n // Clear all local progress listeners and force-hide the overlay\n this.progressBus.clearAll();\n this.hideFrameForActivation();\n }\n\n private onPortMessage(e: MessageEvent<ChildToParentEnvelope>) {\n const msg = e.data as ChildToParentEnvelope;\n // Some wallet-host messages are push-style and are not correlated to a requestId.\n if (msg.type === 'PREFERENCES_CHANGED') {\n this.emitPreferencesChanged(msg.payload as PreferencesChangedPayload);\n return;\n }\n const requestId = msg.requestId;\n if (!requestId) return;\n\n // Bridge PROGRESS events to caller-provided onEvent callback via pending registry\n if (msg.type === 'PROGRESS') {\n const payload = (msg.payload as ProgressPayload);\n // Route via ProgressBus (handles overlay + sticky delivery)\n this.progressBus.dispatch({ requestId: requestId, payload: payload });\n // Refresh timeout for long-running operations whenever progress is received\n const pend = this.pending.get(requestId);\n if (pend) {\n if (pend.timer) window.clearTimeout(pend.timer);\n pend.timer = window.setTimeout(() => {\n const err = pend.onTimeout();\n pend.reject(err);\n }, this.opts.requestTimeoutMs);\n }\n return;\n }\n\n const pending = this.pending.get(requestId);\n // Hide overlay on completion only if no other requests still need it,\n // and this request wasn't marked sticky (UI-managed lifecycle).\n if (!this.progressBus.isSticky(requestId)) {\n if (!this.progressBus.wantsVisible()) {\n this.hideFrameForActivation();\n }\n }\n if (!pending) {\n // Even if no pending exists (e.g., early cancel or pre-resolved),\n // ensure any lingering progress subscriber is removed.\n if (this.debug) {\n console.debug('[WalletIframeRouter] Non-PROGRESS without pending → hide + unregister', {\n requestId,\n type: (msg as unknown as { type?: unknown })?.type || 'unknown'\n });\n }\n this.progressBus.unregister(requestId);\n return;\n }\n this.pending.delete(requestId);\n if (pending.timer) window.clearTimeout(pending.timer);\n\n if (msg.type === 'ERROR') {\n const err: Error & { code?: string; details?: unknown } = new Error(msg.payload?.message || 'Wallet error');\n err.code = msg.payload?.code;\n err.details = msg.payload?.details;\n // Deliver to pending promise if present\n pending.reject(err);\n // Also notify all progress subscribers for this requestId\n this.progressBus.dispatch({\n requestId: requestId,\n payload: {\n step: 0,\n phase: 'error',\n status: 'error',\n message: msg.payload?.message\n }\n });\n this.progressBus.unregister(requestId);\n return;\n }\n\n pending.resolve(msg.payload);\n if (!this.progressBus.isSticky(requestId)) {\n this.progressBus.unregister(requestId);\n }\n }\n\n /**\n * Post a typed envelope over the MessagePort with robust readiness handling.\n * This is the core method that handles all communication with the iframe.\n *\n * Flow:\n * 1. Ensure iframe is ready (lazy initialization)\n * 2. Generate unique request ID for correlation\n * 3. Set up timeout and progress handling\n * 4. Send message to iframe via MessagePort\n * 5. Wait for response (PM_RESULT or ERROR)\n * 6. Clean up on completion or timeout\n */\n private async post<T>(\n envelope: Omit<ParentToChildEnvelope, 'requestId'>,\n ): Promise<PostResult<T>> {\n\n // Step 1: Lazily initialize the iframe/client if not ready yet\n if (!this.ready || !this.port) {\n await this.init();\n }\n\n // Step 2: Generate unique request ID for correlation\n const requestId = `${Date.now()}-${++this.reqCounter}`;\n const full: ParentToChildEnvelope = { ...(envelope as ParentToChildEnvelope), requestId };\n const { options } = full;\n\n return new Promise<PostResult<T>>((resolve, reject) => {\n const onTimeout = () => {\n const pending = this.pending.get(requestId);\n if (pending?.timer !== undefined) window.clearTimeout(pending.timer);\n this.pending.delete(requestId);\n this.progressBus.unregister(requestId);\n this.overlay.setSticky(false);\n if (!this.progressBus.wantsVisible()) {\n this.hideFrameForActivation();\n }\n this.sendBestEffortCancel(requestId);\n return new Error(`Wallet request timeout for ${envelope.type}`);\n };\n\n // Step 3: Set up timeout handler for request\n const timer = window.setTimeout(() => {\n const err = onTimeout();\n reject(err);\n }, this.opts.requestTimeoutMs);\n\n // Step 4: Register pending request for correlation\n this.pending.set(requestId, {\n resolve: (v) => resolve(v as PostResult<T>),\n reject,\n timer,\n onProgress: options?.onProgress,\n onTimeout,\n });\n\n // Step 5: Register progress handler for real-time updates\n this.progressBus.register({\n requestId: requestId,\n sticky: !!options?.sticky, // Some flows need to persist after completion\n onProgress: (payload: ProgressPayload) => {\n // Bridge progress events from iframe back to parent callback\n try {\n options?.onProgress?.(payload);\n } catch {}\n },\n });\n\n try {\n // Step 6: Strip non-cloneable fields (functions) from envelope options before posting\n const wireOptions = (options && isObject(options))\n ? (() => {\n const stickyVal = (options as { sticky?: unknown }).sticky;\n return isBoolean(stickyVal) ? { sticky: stickyVal } : undefined;\n })()\n : undefined;\n const serializableFull = wireOptions ? { ...full, options: wireOptions } : { ...full, options: undefined };\n\n // Align overlay stickiness with request options (phase 2 will use intents)\n this.overlay.setSticky(!!(wireOptions && (wireOptions as { sticky?: boolean }).sticky));\n\n // Step 7: Apply overlay intent (conservative) if not already visible, then post\n if (!this.overlay.getState().visible) {\n const intent = this.computeOverlayIntent(serializableFull.type);\n if (intent.mode === 'fullscreen') {\n this.overlay.setSticky(!!(wireOptions && (wireOptions as { sticky?: boolean }).sticky));\n this.overlay.showFullscreen();\n }\n }\n\n // Send message to iframe via MessagePort\n this.port!.postMessage(serializableFull as ParentToChildEnvelope);\n } catch (err) {\n // Step 8: Handle send errors - clean up and reject\n this.pending.delete(requestId);\n window.clearTimeout(timer);\n this.progressBus.unregister(requestId);\n reject(toError(err));\n }\n });\n }\n\n /**\n * computeOverlayIntent - Preflight \"Show\" Decision\n *\n * This method makes the initial decision about whether to show the overlay\n * BEFORE sending the request to the iframe. It's a conservative preflight\n * check that ensures the iframe is visible in time for user activation.\n *\n * Key Responsibilities:\n * - Preflight Decision: Determines overlay visibility before request is sent\n * - User Activation Timing: Ensures iframe is visible when WebAuthn prompts appear\n * - Conservative Approach: Only shows overlay if not already visible\n * - Request Type Mapping: Maps message types to overlay requirements\n *\n * How it differs from other components:\n *\n * vs OnEventsProgressBus (lifecycle and close decision):\n * - computeOverlayIntent: \"SHOW\" decision - runs before sending request\n * - OnEventsProgressBus: \"CLOSE\" decision - runs during operation lifecycle\n * - OnEventsProgressBus drives ongoing UI phases and manages sticky behavior\n * - OnEventsProgressBus handles PM_RESULT/ERROR and decides when to hide overlay\n *\n * vs OverlayController (single executor):\n * - computeOverlayIntent: DECIDES what to do (show/hide decision logic)\n * - OverlayController: EXECUTES the decision (actual CSS manipulation)\n * - OverlayController receives commands from both intent and ProgressBus\n * - OverlayController keeps all style mutations in one place\n *\n * Architecture Flow:\n * 1. computeOverlayIntent() → decides to show overlay\n * 2. OverlayController.showFullscreen() → executes the decision\n * 3. Request sent to iframe → operation begins\n * 4. OnEventsProgressBus manages lifecycle → handles progress events\n * 5. OnEventsProgressBus decides to hide → when operation completes\n * 6. OverlayController.hide() → executes the hide decision\n *\n * Special Cases:\n * - Anchored flows (UI registry with viewportRect) are message-driven\n * - Parent sets bounds and sticky via registry messages\n * - computeOverlayIntent returns 'hidden' for these (don't pre-show)\n * - Some legacy paths still call showFrameForActivation() directly\n *\n * Future Evolution:\n * - If host always emits early PROGRESS for a type, this can be reduced\n * - Intent is to move toward OnEventsProgressBus-driven lifecycle management\n * - This provides predictable, glitch-free activation without hardcoding\n */\n private computeOverlayIntent(type: ParentToChildEnvelope['type']): { mode: 'hidden' | 'fullscreen' } {\n switch (type) {\n // Operations that require fullscreen overlay for WebAuthn activation\n case 'PM_EXPORT_NEAR_KEYPAIR_UI':\n case 'PM_REGISTER':\n case 'PM_LOGIN':\n case 'PM_LINK_DEVICE_WITH_SCANNED_QR_DATA':\n case 'PM_SIGN_AND_SEND_TXS':\n case 'PM_EXECUTE_ACTION':\n case 'PM_SEND_TRANSACTION':\n case 'PM_SIGN_TXS_WITH_ACTIONS':\n return { mode: 'fullscreen' };\n\n // All other operations (background/read-only) don't need overlay\n default:\n return { mode: 'hidden' };\n }\n }\n\n // Temporarily show the service iframe to capture user activation\n private showFrameForActivation(): void {\n // Ensure iframe exists so overlay can be applied immediately\n this.transport.ensureIframeMounted();\n if (this.overlayForceFullscreen) {\n this.overlay.showFullscreen();\n } else {\n // Prefer fullscreen by default\n this.overlay.showFullscreen();\n }\n }\n\n private hideFrameForActivation(): void {\n if (!this.overlay.getState().visible) return;\n this.overlay.hide();\n }\n\n private sendBestEffortCancel(targetRequestId?: string): void {\n const port = this.port;\n if (!port) return;\n const cancelEnvelope: ParentToChildEnvelope = {\n type: 'PM_CANCEL',\n requestId: `cancel-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n payload: targetRequestId ? { requestId: targetRequestId } : {}\n };\n port.postMessage(cancelEnvelope);\n }\n\n /**\n * Public toggle to surface the wallet iframe for user activation or hide it.\n * Useful when mounting inline UI components that require direct user clicks.\n */\n setOverlayVisible(visible: boolean): void {\n if (visible) {\n // Respect fullscreen lock when present\n if (this.overlayForceFullscreen) {\n this.overlay.showFullscreen();\n } else {\n this.showFrameForActivation();\n }\n } else {\n this.hideFrameForActivation();\n }\n }\n\n /** Public helper for tests/tools: get the underlying iframe element. */\n getIframeEl(): HTMLIFrameElement | null {\n return this.transport.getIframeEl();\n }\n\n /** Public helper for tests/tools: inspect current overlay state. */\n getOverlayState(): { visible: boolean; mode: 'hidden' | 'fullscreen' | 'anchored'; sticky: boolean; rect?: DOMRectLike } {\n return this.overlay.getState();\n }\n\n /**\n * Position and show the wallet iframe as an anchored overlay matching a DOMRect.\n * Accepts viewport-relative coordinates (from getBoundingClientRect()).\n *\n * Important: Some apps apply CSS transforms (or filters/perspective) on html/body,\n * which changes the containing block for position: fixed. In those cases a fixed\n * iframe will be offset by the page scroll. To avoid that mismatch, anchor the\n * overlay using absolute positioning in document coordinates.\n */\n setOverlayBounds(rect: { top: number; left: number; width: number; height: number }): void {\n if (this.overlayForceFullscreen) return; // ignore anchored bounds while locked to fullscreen\n this.transport.ensureIframeMounted();\n this.overlay.showAnchored(rect as DOMRectLike);\n }\n\n // setAnchoredOverlayBounds/clearAnchoredOverlay removed with Arrow overlay deprecation\n\n // Post a window message and surface errors in debug mode instead of silently swallowing them\n private postWindowMessage(w: Window, data: unknown, target: string): void {\n try {\n w.postMessage(data, target);\n } catch (err) {\n if (this.debug) {\n console.error('[WalletIframeRouter] window.postMessage failed', { error: err, data });\n }\n }\n }\n\n}\n\n// ===== Runtime type guards to safely bridge ProgressPayload → typed SSE events =====\nconst REGISTRATION_PHASES = new Set<string>(Object.values(RegistrationPhase) as string[]);\nconst LOGIN_PHASES = new Set<string>(Object.values(LoginPhase) as string[]);\nconst ACTION_PHASES = new Set<string>(Object.values(ActionPhase) as string[]);\nconst DEVICE_LINKING_PHASES = new Set<string>(Object.values(DeviceLinkingPhase) as string[]);\nconst ACCOUNT_RECOVERY_PHASES = new Set<string>(Object.values(AccountRecoveryPhase) as string[]);\n\nfunction phaseOf(progress: ProgressPayload): string {\n return String((progress as { phase?: unknown })?.phase ?? '');\n}\n\nfunction isRegistrationSSEEvent(progress: ProgressPayload): progress is RegistrationSSEEvent {\n return REGISTRATION_PHASES.has(phaseOf(progress));\n}\n\nfunction isLoginSSEEvent(p: ProgressPayload): p is LoginSSEvent {\n return LOGIN_PHASES.has(phaseOf(p));\n}\n\nfunction isActionSSEEvent(p: ProgressPayload): p is ActionSSEEvent {\n return ACTION_PHASES.has(phaseOf(p));\n}\n\nexport function isDelegateSSEEvent(p: ProgressPayload): p is DelegateActionSSEEvent {\n if (!isActionSSEEvent(p)) return false;\n const data = (p as any).data;\n return !!data && typeof data === 'object' && (data as any).context === 'delegate';\n}\n\nfunction isDeviceLinkingSSEEvent(p: ProgressPayload): p is DeviceLinkingSSEEvent {\n return DEVICE_LINKING_PHASES.has(phaseOf(p));\n}\n\nfunction isAccountRecoverySSEEvent(p: ProgressPayload): p is AccountRecoverySSEEvent {\n return ACCOUNT_RECOVERY_PHASES.has(phaseOf(p));\n}\n\n/**\n * Strips out class functions as they cannot be sent over postMessage to iframe\n */\n function normalizeSignedTransactionObject(result: SignTransactionResult) {\n const arr = Array.isArray(result) ? result : [];\n const normalized = arr.map(entry => {\n if (entry?.signedTransaction) {\n const st = entry.signedTransaction as unknown;\n if (isPlainSignedTransactionLike(st)) {\n entry.signedTransaction = SignedTransaction.fromPlain({\n transaction: (st as { transaction: unknown }).transaction,\n signature: (st as { signature: unknown }).signature,\n borsh_bytes: extractBorshBytesFromPlainSignedTx(st),\n });\n }\n }\n return entry;\n });\n return normalized\n }\n\n/**\n * Strips out functions as they cannot be sent over postMessage to iframe\n */\nimport { stripFunctionsShallow } from '../validation';\n\nfunction removeFunctionsFromOptions(options?: object): object | undefined {\n return stripFunctionsShallow(options as Record<string, unknown>);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.js","names":["parsedOrigin: URL","IframeTransport","OverlayController","OnEventsProgressBus","defaultPhaseHeuristics","err: Error & { code?: string; details?: unknown }","full: ParentToChildEnvelope","isObject","isBoolean","toError","cancelEnvelope: ParentToChildEnvelope","RegistrationPhase","LoginPhase","ActionPhase","DeviceLinkingPhase","AccountRecoveryPhase","EmailRecoveryPhase","isPlainSignedTransactionLike","SignedTransaction","extractBorshBytesFromPlainSignedTx","stripFunctionsShallow"],"sources":["../../../../../../../../src/core/WalletIframe/client/router.ts"],"sourcesContent":["/*\n * WalletIframeRouter - Client-Side Communication Layer\n *\n * Owns all iframe overlay show/hide behavior for WebAuthn activation. It is the\n * single place that decides *how* the wallet iframe is displayed (fullscreen vs\n * anchored, sticky mode, force-fullscreen during registration, etc.).\n *\n * Responsibilities:\n * - Request/Response Correlation: Tracks pending requests with unique IDs.\n * - Progress Event Bridging: Receives PROGRESS from the wallet iframe and forwards\n * them to app `onEvent` handlers.\n * - Overlay Ownership:\n * - Delegates *when* to show/hide to OnEventsProgressBus (based on progress events).\n * - Executes *how* to show/hide via OverlayController (DOM / CSS / ARIA).\n * - Also reacts to wallet-host UI messages (e.g., WALLET_UI_CLOSED) and export flows.\n * - Timeout Handling: Manages request timeouts and cleanup.\n * - Message Serialization: Strips non-serializable functions from messages.\n * - Error Handling: Converts iframe errors to parent-appropriate errors.\n *\n * High-level flow:\n *\n * Step legend\n * -----------\n * (1) App calls a router RPC (executeAction, registerPasskey, etc).\n * (2) Router posts request to iframe and tracks a pending entry.\n * (3) Wallet iframe sends PROGRESS messages back to the router.\n * (4) Router forwards ProgressPayloads into OnEventsProgressBus.\n * (5) OnEventsProgressBus decides 'show' | 'hide' and calls router adapters.\n * (6) Router delegates to OverlayController to show|hide the iframe.\n * (7) Router receives final result, resolves the pending promise, unregisters,\n * and may hide the overlay if no other request still needs it.\n *\n * +-----------+ +--------------------+ +----------------------+ +----------------------+\n * | App | | WalletIframeRouter | | OnEventsProgressBus | | OverlayController |\n * +-----+-----+ +---------+----------+ +----------+-----------+ +----------+-----------+\n * | (1) RPC call (executeAction, etc.) | |\n * |---------------------->|---------------------------->| |\n * | | |\n * | (2) post(): send request to iframe |\n * | | |\n * | (3) PROGRESS from iframe via onPortMessage() |\n * |<----------------------------------------------------| |\n * | | |\n * | (4) ProgressPayload → heuristic |\n * | |---(5) 'show'|'hide' intent-->|\n * | | |\n * | (6) showFrameForActivation() | hideFrameForActivation() |\n * | | |\n * | | (6) show()|hide() |\n * | |----------------------------->|\n * | | |\n * | (7) PM_RESULT/ERROR → resolve pending, maybe hide overlay |\n * |<----------------------------------------------------| |\n *\n * Communication Flow (requests):\n * 1. Parent calls RPC method (e.g., registerPasskey).\n * 2. Router creates unique request ID and pending entry.\n * 3. Message sent to iframe via MessagePort.\n * 4. Progress events bridged back to parent callbacks and fed into OnEventsProgressBus.\n * 5. OnEventsProgressBus emits show/hide intents; router invokes OverlayController.\n * 6. Final result resolves the pending promise; router unregisters and may hide overlay.\n */\n\nimport {\n type ParentToChildEnvelope,\n type ChildToParentEnvelope,\n type ProgressPayload,\n type PreferencesChangedPayload,\n} from '../shared/messages';\nimport { SignedTransaction } from '../../NearClient';\nimport { OnEventsProgressBus, defaultPhaseHeuristics } from './on-events-progress-bus';\nimport type {\n ActionSSEEvent,\n ActionHooksOptions,\n AfterCall,\n AccountRecoverySSEEvent,\n DelegateActionSSEEvent,\n DeviceLinkingSSEEvent,\n EmailRecoverySSEEvent,\n LoginSSEvent,\n RegistrationSSEEvent,\n SendTransactionHooksOptions,\n SignAndSendTransactionHooksOptions,\n} from '../../types/sdkSentEvents';\nimport {\n RegistrationPhase,\n LoginPhase,\n ActionPhase,\n DeviceLinkingPhase,\n AccountRecoveryPhase,\n EmailRecoveryPhase,\n} from '../../types/sdkSentEvents';\nimport type {\n ActionResult,\n GetRecentLoginsResult,\n LoginAndCreateSessionResult,\n LoginSession,\n RegistrationResult,\n SignTransactionResult,\n} from '../../types/tatchi';\nimport {\n ActionArgs,\n TransactionInput,\n TxExecutionStatus\n} from '../../types';\nimport type { DelegateActionInput } from '../../types/delegate';\nimport { IframeTransport } from './IframeTransport';\nimport OverlayController, { type DOMRectLike } from './overlay-controller';\nimport { isObject, isPlainSignedTransactionLike, extractBorshBytesFromPlainSignedTx, isBoolean } from '../validation';\nimport type { WalletUIRegistry } from '../host/iframe-lit-element-registry';\nimport { toError } from '../../../utils/errors';\nimport {\n DeviceLinkingQRData,\n LinkDeviceResult,\n StartDevice2LinkingFlowArgs,\n StartDevice2LinkingFlowResults,\n} from '../../types/linkDevice'\nimport type { AuthenticatorOptions } from '../../types/authenticatorOptions';\nimport type { ConfirmationConfig } from '../../types/signer-worker';\nimport type { AccessKeyList } from '../../NearClient';\nimport type { SignNEP413MessageResult } from '../../TatchiPasskey/signNEP413';\nimport type { RecoveryResult } from '../../TatchiPasskey';\nimport { openOfflineExportWindow } from '../../OfflineExport/index.js';\nimport type { DerivedAddressRecord } from '../../IndexedDBManager';\nimport type { EmailRecoveryContracts } from '../../types/tatchi';\n\n// Simple, framework-agnostic service iframe client.\n// Responsibilities split:\n// - IframeTransport: low-level mount + load + CONNECT/READY handshake (MessagePort)\n// - WalletIframeRouter (this): request/response correlation, progress events,\n// overlay display, and high-level wallet RPC helpers\n\nexport interface WalletIframeRouterOptions {\n walletOrigin: string; // e.g., https://wallet.example.com\n servicePath?: string; // default '/wallet-service'\n connectTimeoutMs?: number; // default 8000\n requestTimeoutMs?: number; // default 20000\n theme?: 'dark' | 'light';\n // Enable verbose client-side logging for debugging\n debug?: boolean;\n // Test-only/diagnostic options (not part of the public API contract for apps)\n testOptions?: {\n // Optional identity/ownership tags for the iframe instance (useful for tests/tools)\n routerId?: string;\n ownerTag?: string; // e.g., 'app' | 'tests'\n // Lazy mounting: when false, do not auto-connect/mount during init(); connect on first use\n autoMount?: boolean;\n };\n // Optional config forwarded to wallet host\n nearRpcUrl?: string;\n nearNetwork?: 'testnet' | 'mainnet';\n contractId?: string;\n relayer?: {\n url: string;\n };\n vrfWorkerConfigs?: Record<string, unknown>;\n rpIdOverride?: string;\n authenticatorOptions?: AuthenticatorOptions;\n emailRecoveryContracts?: Partial<EmailRecoveryContracts>;\n // SDK asset base path for embedded bundles when mounting same‑origin via srcdoc\n // Must serve dist/esm under this base path. Defaults to '/sdk'.\n sdkBasePath?: string;\n // Optional: pre-register UI components in wallet host\n uiRegistry?: Record<string, unknown>;\n // Optional: explorer base URL for TxTree links\n nearExplorerUrl?: string;\n}\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (reason?: unknown) => void;\n timer: number | undefined;\n onProgress?: (payload: ProgressPayload) => void;\n onTimeout: () => Error;\n};\n\ntype PostResult<T> = {\n ok: boolean,\n result: T\n}\n\nexport class WalletIframeRouter {\n private opts: Required<WalletIframeRouterOptions>;\n // Low-level transport handling iframe mount + handshake\n private transport: IframeTransport;\n private port: MessagePort | null = null;\n private ready = false;\n // Deduplicate concurrent init() calls and avoid race conditions\n private initInFlight: Promise<void> | null = null;\n private pending = new Map<string, Pending>();\n private reqCounter = 0;\n private readyListeners: Set<() => void> = new Set();\n private vrfStatusListeners: Set<(status: { active: boolean; nearAccountId: string | null; sessionDuration?: number }) => void> = new Set();\n private preferencesChangedListeners: Set<(payload: PreferencesChangedPayload) => void> = new Set();\n // Coalesce duplicate Device2 start calls (e.g., React StrictMode double-effects)\n private device2StartPromise: Promise<{ qrData: DeviceLinkingQRData; qrCodeDataURL: string }> | null = null;\n private progressBus: OnEventsProgressBus;\n private debug = false;\n private readonly walletOriginUrl: URL;\n private readonly walletOriginOrigin: string;\n private overlay: OverlayController;\n // Force the overlay to remain fullscreen during critical flows (e.g., registration)\n // and ignore anchored rect updates from helper hooks.\n private overlayForceFullscreen = false;\n // Overlay register button window-message bridging (wallet-host UI → parent)\n private readonly registerOverlayResultListeners = new Set<(\n payload: { ok: boolean; result?: RegistrationResult; cancelled?: boolean; error?: string }\n ) => void>();\n private readonly registerOverlaySubmitListeners = new Set<() => void>();\n private windowMsgHandlerBound?: (ev: MessageEvent) => void;\n\n constructor(options: WalletIframeRouterOptions) {\n if (!options?.walletOrigin) {\n throw new Error('[WalletIframeRouter] walletOrigin is required when using the wallet iframe');\n }\n\n let parsedOrigin: URL;\n try {\n parsedOrigin = new URL(options.walletOrigin);\n } catch (err) {\n throw new Error(`[WalletIframeRouter] Invalid walletOrigin: ${options.walletOrigin}`);\n }\n\n if (typeof window !== 'undefined') {\n const parentOrigin = window.location.origin;\n if (parsedOrigin.origin === parentOrigin) {\n console.warn('[WalletIframeRouter] walletOrigin matches the host origin. Isolation safeguards rely on the parent; consider moving the wallet to a dedicated origin.');\n }\n }\n\n const defaultRouterId = `w3a-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const testOptions = {\n routerId: defaultRouterId,\n ownerTag: undefined as string | undefined,\n autoMount: true,\n ...(options?.testOptions || {}),\n };\n this.opts = {\n connectTimeoutMs: 8000,\n requestTimeoutMs: 20000,\n servicePath: '/wallet-service',\n sdkBasePath: '/sdk',\n testOptions,\n ...options,\n } as Required<WalletIframeRouterOptions>;\n this.walletOriginUrl = parsedOrigin;\n this.walletOriginOrigin = parsedOrigin.origin;\n this.debug = !!this.opts.debug;\n // Encapsulate iframe mount + handshake logic in transport\n this.transport = new IframeTransport({\n walletOrigin: this.opts.walletOrigin,\n servicePath: this.opts.servicePath,\n connectTimeoutMs: this.opts.connectTimeoutMs,\n testOptions: {\n routerId: this.opts.testOptions.routerId,\n ownerTag: this.opts.testOptions.ownerTag,\n },\n });\n\n // Centralize overlay sizing/visibility. The router is the single owner of\n // \"how\" the iframe is shown/hidden (fullscreen vs anchored, sticky, etc).\n this.overlay = new OverlayController({ ensureIframe: () => this.transport.ensureIframeMounted() });\n\n // Initialize progress router with overlay control and phase heuristics.\n // OnEventsProgressBus only decides *when* to show/hide based on events; it calls\n // these adapter functions, and the router delegates to OverlayController.\n this.progressBus = new OnEventsProgressBus(\n {\n show: () => this.showFrameForActivation(),\n hide: () => this.hideFrameForActivation()\n },\n defaultPhaseHeuristics,\n this.debug\n ? (msg: string, data?: Record<string, unknown>) => {\n console.debug('[WalletIframeRouter][OnEventsProgressBus]', msg, data || {});\n }\n : undefined\n );\n\n // Bridge wallet-host overlay UI messages into router callbacks\n this.windowMsgHandlerBound = (ev: MessageEvent) => {\n if (ev.origin !== this.walletOriginOrigin) return;\n const data = ev.data as unknown;\n if (!data || typeof data !== 'object') return;\n const type = (data as { type?: unknown }).type;\n if (type === 'REGISTER_BUTTON_SUBMIT') {\n // User clicked the register arrow inside the wallet-anchored UI\n // Force the overlay to fullscreen immediately so the TxConfirmer\n // can mount and capture activation in Safari/iOS/mobile.\n this.overlayForceFullscreen = true;\n this.overlay.setSticky(true);\n this.overlay.showFullscreen();\n for (const cb of Array.from(this.registerOverlaySubmitListeners)) {\n try { cb(); } catch {}\n }\n return;\n }\n if (type === 'REGISTER_BUTTON_RESULT') {\n const payload = (data as { payload?: unknown }).payload as\n | { ok?: boolean; result?: RegistrationResult; cancelled?: boolean; error?: string }\n | undefined;\n const ok = !!payload?.ok;\n for (const cb of Array.from(this.registerOverlayResultListeners)) {\n cb({ ok, result: payload?.result, cancelled: payload?.cancelled, error: payload?.error });\n }\n // Release overlay lock after result\n this.overlayForceFullscreen = false;\n this.overlay.setSticky(false);\n // Progress bus will hide after completion; hide defensively here\n this.hideFrameForActivation();\n if (ok) {\n const acct = payload?.result?.nearAccountId;\n void this.getLoginSession(acct)\n .then(({ login: st }) => {\n this.emitVrfStatusChanged({ active: !!st.vrfActive, nearAccountId: st.nearAccountId, sessionDuration: st.vrfSessionDuration });\n })\n .catch(() => {});\n }\n return;\n }\n };\n globalThis.addEventListener?.('message', this.windowMsgHandlerBound);\n }\n\n private attachExportUiClosedListener = (walletOrigin: string): (() => void) => {\n const onUiClosed = (ev: MessageEvent) => {\n if (ev.origin !== walletOrigin) return;\n const data = ev.data as unknown;\n if (!data || (data as any).type !== 'WALLET_UI_CLOSED') return;\n this.overlay.setSticky(false);\n this.hideFrameForActivation();\n globalThis.removeEventListener?.('message', onUiClosed);\n };\n globalThis.addEventListener?.('message', onUiClosed);\n return () => { globalThis.removeEventListener?.('message', onUiClosed) };\n }\n\n private attachExportUiFallbackListener = (walletOrigin: string, accountId: string): (() => void) => {\n const onFallback = async (ev: MessageEvent) => {\n if (ev.origin !== walletOrigin) return;\n const data = ev.data as any;\n if (!data || data.type !== 'OFFLINE_EXPORT_FALLBACK') return;\n globalThis.removeEventListener?.('message', onFallback);\n this.overlay.setSticky(false);\n this.hideFrameForActivation();\n await this.openOfflineExport({ accountId });\n };\n globalThis.addEventListener?.('message', onFallback);\n return () => { globalThis.removeEventListener?.('message', onFallback) };\n }\n\n /**\n * Subscribe to service-ready event. Returns an unsubscribe function.\n * If already ready, the listener is invoked on next microtask.\n */\n onReady(listener: () => void): () => void {\n if (this.ready) {\n Promise.resolve().then(() => { listener(); });\n return () => {};\n }\n this.readyListeners.add(listener);\n return () => { this.readyListeners.delete(listener); };\n }\n\n private emitReady(): void {\n if (!this.readyListeners.size) return;\n for (const cb of Array.from(this.readyListeners)) { cb(); }\n // Keep listeners registered; callers can unsubscribe if desired.\n }\n\n /**\n * Initialize the transport and configure the wallet host.\n * Safe to call multiple times; concurrent calls deduplicate via initInFlight.\n */\n async init(): Promise<void> {\n if (this.ready) return;\n if (this.initInFlight) { return this.initInFlight; }\n this.initInFlight = (async () => {\n // Respect autoMount=false by deferring connect until first use\n if (this.opts.testOptions.autoMount !== false) {\n this.port = await this.transport.connect();\n this.port.onmessage = (ev) => this.onPortMessage(ev);\n this.port.start?.();\n this.ready = true;\n }\n console.debug('[WalletIframeRouter] init: %s', this.ready ? 'connected' : 'deferred (autoMount=false)');\n await this.post({\n type: 'PM_SET_CONFIG',\n payload: {\n theme: this.opts.theme,\n nearRpcUrl: this.opts.nearRpcUrl,\n nearNetwork: this.opts.nearNetwork,\n // Align with PMSetConfigPayload which expects `contractId`\n // while keeping RouterOptions field name `contractId` for external API.\n contractId: this.opts.contractId,\n nearExplorerUrl: this.opts.nearExplorerUrl,\n relayer: this.opts.relayer,\n vrfWorkerConfigs: this.opts.vrfWorkerConfigs,\n rpIdOverride: this.opts.rpIdOverride,\n authenticatorOptions: this.opts.authenticatorOptions,\n emailRecoveryContracts: this.opts.emailRecoveryContracts,\n uiRegistry: this.opts.uiRegistry,\n // for embedded Lit components\n assetsBaseUrl: (() => {\n try {\n const base = new URL(this.opts.sdkBasePath, this.walletOriginUrl).toString();\n return base.endsWith('/') ? base : `${base}/`;\n } catch {\n const fallback = new URL('/sdk/', this.walletOriginUrl).toString();\n return fallback.endsWith('/') ? fallback : `${fallback}/`;\n }\n })(),\n }\n });\n this.emitReady();\n })();\n\n try {\n await this.initInFlight;\n } finally {\n this.initInFlight = null;\n }\n }\n\n isReady(): boolean { return this.ready; }\n\n // ===== UI registry/window-message helpers (generic mounting) =====\n registerUiTypes(registry: WalletUIRegistry): void {\n const iframe = this.transport.ensureIframeMounted();\n const w = iframe.contentWindow;\n if (!w) return;\n const target = this.walletOriginOrigin;\n this.postWindowMessage(w, { type: 'WALLET_UI_REGISTER_TYPES', payload: registry }, target);\n }\n\n mountUiComponent(params: { key: string; props?: Record<string, unknown>; targetSelector?: string; id?: string }): void {\n const iframe = this.transport.ensureIframeMounted();\n const w = iframe.contentWindow;\n if (!w) return;\n const target = this.walletOriginOrigin;\n this.postWindowMessage(w, { type: 'WALLET_UI_MOUNT', payload: params }, target);\n }\n\n updateUiComponent(params: { id: string; props?: Record<string, unknown> }): void {\n const iframe = this.transport.ensureIframeMounted();\n const w = iframe.contentWindow;\n if (!w) return;\n const target = this.walletOriginOrigin;\n this.postWindowMessage(w, { type: 'WALLET_UI_UPDATE', payload: params }, target);\n }\n\n unmountUiComponent(id: string): void {\n const iframe = this.transport.ensureIframeMounted();\n const w = iframe.contentWindow;\n if (!w) return;\n const target = this.walletOriginOrigin;\n this.postWindowMessage(w, { type: 'WALLET_UI_UNMOUNT', payload: { id } }, target);\n }\n\n // ===== Public RPC helpers =====\n\n // Subscribe to VRF status changes observed by this client\n onVrfStatusChanged(listener: (status: {\n active: boolean;\n nearAccountId: string | null;\n sessionDuration?: number\n }) => void): () => void {\n this.vrfStatusListeners.add(listener);\n return () => { this.vrfStatusListeners.delete(listener); };\n }\n\n // Subscribe to wallet-host preference changes (authoritative in wallet-iframe mode).\n onPreferencesChanged(listener: (payload: PreferencesChangedPayload) => void): () => void {\n this.preferencesChangedListeners.add(listener);\n return () => { this.preferencesChangedListeners.delete(listener); };\n }\n\n private emitVrfStatusChanged(status: {\n active: boolean;\n nearAccountId: string | null;\n sessionDuration?: number\n }): void {\n for (const cb of Array.from(this.vrfStatusListeners)) {\n try { cb(status); } catch {}\n }\n }\n\n private emitPreferencesChanged(payload: PreferencesChangedPayload): void {\n if (!this.preferencesChangedListeners.size) return;\n for (const cb of Array.from(this.preferencesChangedListeners)) {\n try { cb(payload); } catch {}\n }\n }\n\n // Overlay register button events (optional convenience API)\n onRegisterOverlayResult(listener: (payload: { ok: boolean; result?: RegistrationResult; cancelled?: boolean; error?: string }) => void): () => void {\n this.registerOverlayResultListeners.add(listener);\n return () => { this.registerOverlayResultListeners.delete(listener); };\n }\n\n onRegisterOverlaySubmit(listener: () => void): () => void {\n this.registerOverlaySubmitListeners.add(listener);\n return () => { this.registerOverlaySubmitListeners.delete(listener); };\n }\n\n // ===== TatchiPasskey RPCs =====\n\n async signTransactionsWithActions(payload: {\n nearAccountId: string;\n transactions: TransactionInput[];\n options?: {\n onEvent?: (ev: ActionSSEEvent) => void;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<SignTransactionResult[]>;\n // Allow minimal overrides (e.g., { uiMode: 'drawer' })\n confirmationConfig?: Partial<ConfirmationConfig>;\n confirmerText?: { title?: string; body?: string };\n }\n }): Promise<SignTransactionResult[]> {\n // Do not forward non-cloneable functions in options; host emits its own PROGRESS messages\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n }\n : undefined;\n const res = await this.post<SignTransactionResult>({\n type: 'PM_SIGN_TXS_WITH_ACTIONS',\n payload: {\n nearAccountId: payload.nearAccountId,\n transactions: payload.transactions,\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isActionSSEEvent) }\n });\n return normalizeSignedTransactionObject(res.result)\n }\n\n async signDelegateAction(payload: {\n nearAccountId: string;\n delegate: DelegateActionInput;\n options?: {\n onEvent?: (ev: ActionSSEEvent) => void;\n onError?: (error: Error) => void;\n afterCall?: AfterCall<any>;\n confirmationConfig?: Partial<ConfirmationConfig>;\n confirmerText?: { title?: string; body?: string };\n }\n }): Promise<unknown> {\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n }\n : undefined;\n const res = await this.post<unknown>({\n type: 'PM_SIGN_DELEGATE_ACTION',\n payload: {\n nearAccountId: payload.nearAccountId,\n delegate: payload.delegate,\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isActionSSEEvent) }\n });\n return res.result;\n }\n\n async registerPasskey(payload: {\n nearAccountId: string;\n confirmationConfig?: Partial<ConfirmationConfig>;\n options?: {\n onEvent?: (ev: RegistrationSSEEvent) => void;\n confirmerText?: { title?: string; body?: string };\n }\n }): Promise<RegistrationResult> {\n // Step 1: For registration, force fullscreen overlay (not anchored to CTA)\n // so the TxConfirmer (drawer/modal) has space to render and capture activation.\n // Lock overlay to fullscreen for the duration of registration\n this.overlayForceFullscreen = true;\n this.overlay.setSticky(true);\n this.overlay.showFullscreen();\n\n try {\n // Optional one-time confirmation override (non-persistent)\n if (payload.confirmationConfig) {\n const base = await this.getConfirmationConfig();\n await this.setConfirmationConfig({ ...base, ...payload.confirmationConfig });\n }\n\n // Step 2: Strip non-serializable functions from options (functions can't cross iframe boundary)\n const safeOptions = removeFunctionsFromOptions(payload.options);\n\n // Step 3: Send PM_REGISTER message to iframe and wait for response\n const res = await this.post<RegistrationResult>({\n type: 'PM_REGISTER',\n payload: {\n nearAccountId: payload.nearAccountId,\n options: safeOptions,\n ...(payload.confirmationConfig ? { confirmationConfig: payload.confirmationConfig as unknown as Record<string, unknown> } : {})\n },\n // Bridge progress events from iframe back to parent callback\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isRegistrationSSEEvent) }\n });\n\n // Step 4: Update VRF status after successful registration\n const { login: st } = await this.getLoginSession(payload.nearAccountId);\n this.emitVrfStatusChanged({\n active: !!st.vrfActive,\n nearAccountId: st.nearAccountId,\n sessionDuration: st.vrfSessionDuration\n });\n\n return res?.result;\n } finally {\n // Step 5: Always release overlay lock and hide when done (success or error)\n this.overlayForceFullscreen = false;\n this.overlay.setSticky(false);\n this.hideFrameForActivation();\n }\n }\n\n async loginAndCreateSession(payload: {\n nearAccountId: string;\n options?: {\n onEvent?: (ev: LoginSSEvent) => void;\n // Forward session config so host can mint JWT/cookie\n session?: {\n kind: 'jwt' | 'cookie';\n relayUrl?: string;\n route?: string;\n };\n // Warm signing session policy override during login\n signingSession?: {\n ttlMs?: number;\n remainingUses?: number;\n };\n }\n }): Promise<LoginAndCreateSessionResult> {\n this.showFrameForActivation();\n try {\n const safeOptions = removeFunctionsFromOptions(payload.options);\n const res = await this.post<LoginAndCreateSessionResult>({\n type: 'PM_LOGIN',\n payload: {\n nearAccountId: payload.nearAccountId,\n options: safeOptions\n },\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isLoginSSEEvent) }\n });\n const { login: st } = await this.getLoginSession(payload.nearAccountId);\n this.emitVrfStatusChanged({ active: !!st.vrfActive, nearAccountId: st.nearAccountId, sessionDuration: st.vrfSessionDuration });\n return res?.result;\n } finally {\n this.hideFrameForActivation();\n }\n }\n\n async getLoginSession(nearAccountId?: string): Promise<LoginSession> {\n const res = await this.post<LoginSession>({\n type: 'PM_GET_LOGIN_SESSION',\n payload: nearAccountId ? { nearAccountId } : undefined\n });\n return res.result;\n }\n\n async checkVrfStatus(): Promise<PostResult<{ active: boolean; nearAccountId: string | null; sessionDuration?: number }>> {\n const { login: st } = await this.getLoginSession();\n return {\n ok: true,\n result: {\n active: !!st.vrfActive,\n nearAccountId: st.nearAccountId,\n sessionDuration: st.vrfSessionDuration\n }\n };\n }\n\n async clearVrfSession(): Promise<PostResult<void>> {\n await this.post<void>({ type: 'PM_LOGOUT' });\n this.emitVrfStatusChanged({ active: false, nearAccountId: null });\n return { ok: true, result: undefined };\n }\n\n async signNep413Message(payload: {\n nearAccountId: string;\n message: string;\n recipient: string;\n state?: string;\n options?: {\n onEvent?: (ev: ActionSSEEvent) => void;\n confirmerText?: { title?: string; body?: string };\n confirmationConfig?: Partial<ConfirmationConfig>;\n }\n }): Promise<SignNEP413MessageResult> {\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n }\n : undefined;\n const res = await this.post<SignNEP413MessageResult>({\n type: 'PM_SIGN_NEP413',\n payload: {\n nearAccountId: payload.nearAccountId,\n params: {\n message: payload.message,\n recipient: payload.recipient,\n state: payload.state\n },\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: { onProgress: this.wrapOnEvent(payload.options?.onEvent, isActionSSEEvent) }\n });\n return res.result\n }\n\n async signTransactionWithKeyPair(payload: {\n signedTransaction: SignedTransaction;\n options?: {\n onEvent?: (ev: ActionSSEEvent) => void\n }\n }): Promise<ActionResult> {\n // Strip non-cloneable functions from options; host emits PROGRESS events\n const { options } = payload;\n const res = await this.post<ActionResult>( {\n type: 'PM_SEND_TRANSACTION',\n payload: {\n signedTransaction: payload.signedTransaction,\n options: options\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result;\n }\n\n async executeAction(payload: {\n nearAccountId: string;\n receiverId: string;\n actionArgs: ActionArgs | ActionArgs[];\n options?: ActionHooksOptions\n }): Promise<ActionResult> {\n // Strip non-cloneable functions from options; host emits PROGRESS events\n const { options } = payload;\n const safeOptions = options\n ? {\n waitUntil: options.waitUntil,\n confirmationConfig: options.confirmationConfig,\n ...(options.confirmerText ? { confirmerText: options.confirmerText } : {}),\n }\n : undefined;\n\n const res = await this.post<ActionResult>({\n type: 'PM_EXECUTE_ACTION',\n payload: {\n ...payload,\n options: safeOptions\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result;\n }\n\n async setConfirmBehavior(behavior: 'requireClick' | 'autoProceed'): Promise<void> {\n let { nearAccountId } = (await this.getLoginSession()).login;\n await this.post<void>({\n type: 'PM_SET_CONFIRM_BEHAVIOR',\n payload: { behavior, nearAccountId }\n });\n }\n\n async setConfirmationConfig(config: ConfirmationConfig): Promise<void> {\n let { nearAccountId } = (await this.getLoginSession()).login;\n await this.post<void>({\n type: 'PM_SET_CONFIRMATION_CONFIG',\n payload: { config, nearAccountId }\n });\n }\n\n async getConfirmationConfig(): Promise<ConfirmationConfig> {\n const res = await this.post<ConfirmationConfig>({ type: 'PM_GET_CONFIRMATION_CONFIG' });\n return res.result\n }\n\n async setTheme(theme: 'dark' | 'light'): Promise<void> {\n await this.post<void>({ type: 'PM_SET_THEME', payload: { theme } });\n }\n\n async prefetchBlockheight(): Promise<void> {\n await this.post<void>({ type: 'PM_PREFETCH_BLOCKHEIGHT' } );\n }\n\n async getRecentLogins(): Promise<GetRecentLoginsResult> {\n const res = await this.post<GetRecentLoginsResult>({ type: 'PM_GET_RECENT_LOGINS' } );\n return res.result;\n }\n\n // === Local persistence helpers (wallet-origin IndexedDB) ===\n\n async setDerivedAddress(payload: {\n nearAccountId: string;\n args: { contractId: string; path: string; address: string };\n }): Promise<void> {\n await this.post<void>({\n type: 'PM_SET_DERIVED_ADDRESS',\n payload,\n });\n }\n\n async getDerivedAddressRecord(payload: {\n nearAccountId: string;\n args: { contractId: string; path: string };\n }): Promise<DerivedAddressRecord | null> {\n const res = await this.post<DerivedAddressRecord | null>({\n type: 'PM_GET_DERIVED_ADDRESS_RECORD',\n payload,\n });\n return (res.result as DerivedAddressRecord | null) || null;\n }\n\n async getDerivedAddress(payload: {\n nearAccountId: string;\n args: { contractId: string; path: string };\n }): Promise<string | null> {\n const res = await this.post<string | null>({\n type: 'PM_GET_DERIVED_ADDRESS',\n payload,\n });\n return (res.result as string | null) || null;\n }\n\n async getRecoveryEmails(\n nearAccountId: string,\n ): Promise<Array<{ hashHex: string; email: string }>> {\n const res = await this.post<Array<{ hashHex: string; email: string }>>({\n type: 'PM_GET_RECOVERY_EMAILS',\n payload: { nearAccountId },\n });\n return (res.result as Array<{ hashHex: string; email: string }>) || [];\n }\n\n async setRecoveryEmails(payload: {\n nearAccountId: string;\n recoveryEmails: string[];\n options?: ActionHooksOptions;\n }): Promise<ActionResult> {\n const { options } = payload;\n const safeOptions = options\n ? {\n waitUntil: options.waitUntil,\n confirmationConfig: options.confirmationConfig,\n }\n : undefined;\n\n const res = await this.post<ActionResult>({\n type: 'PM_SET_RECOVERY_EMAILS',\n payload: {\n nearAccountId: payload.nearAccountId,\n recoveryEmails: payload.recoveryEmails,\n options: safeOptions,\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) },\n });\n return res.result;\n }\n\n // Bridge typed public onEvent callbacks to the transport's onProgress callback.\n // - onEvent: consumer's strongly-typed event handler (e.g., ActionSSEEvent)\n // - isExpectedEvent: runtime type guard that validates a ProgressPayload as that event type\n // Returns an onProgress handler that safely narrows before invoking onEvent.\n private wrapOnEvent<TEvent extends ProgressPayload>(\n onEvent: ((event: TEvent) => void) | undefined,\n isExpectedEvent: (progress: ProgressPayload) => progress is TEvent\n ): ((progress: ProgressPayload) => void) | undefined {\n if (!onEvent) return undefined;\n return (progress: ProgressPayload) => {\n try {\n if (isExpectedEvent(progress)) onEvent(progress);\n } catch {}\n };\n }\n\n async signAndSendTransactions(payload: {\n nearAccountId: string;\n transactions: TransactionInput[];\n options?: SignAndSendTransactionHooksOptions\n }): Promise<ActionResult[]> {\n\n const { options } = payload;\n // cannot send objects/functions through postMessage(), clean options first\n const safeOptions = options\n ? {\n waitUntil: options.waitUntil,\n executionWait: options.executionWait,\n confirmationConfig: options.confirmationConfig,\n ...(options.confirmerText ? { confirmerText: options.confirmerText } : {}),\n }\n : undefined;\n\n const res = await this.post<ActionResult[]>({\n type: 'PM_SIGN_AND_SEND_TXS',\n payload: {\n nearAccountId: payload.nearAccountId,\n transactions: payload.transactions,\n options: safeOptions\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result;\n }\n\n async hasPasskeyCredential(nearAccountId: string): Promise<boolean> {\n const res = await this.post<boolean>({\n type: 'PM_HAS_PASSKEY',\n payload: { nearAccountId }\n });\n return !!res?.result;\n }\n\n async viewAccessKeyList(accountId: string): Promise<AccessKeyList> {\n const res = await this.post<AccessKeyList>({\n type: 'PM_VIEW_ACCESS_KEYS',\n payload: { accountId }\n });\n return res.result\n }\n\n async deleteDeviceKey(\n accountId: string,\n publicKeyToDelete: string,\n options?: { onEvent?: (ev: ActionSSEEvent) => void }\n ) : Promise<ActionResult> {\n const res = await this.post<ActionResult>({\n type: 'PM_DELETE_DEVICE_KEY',\n payload: {\n accountId,\n publicKeyToDelete\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result\n }\n\n async sendTransaction(args: {\n signedTransaction: SignedTransaction;\n options?: SendTransactionHooksOptions;\n }): Promise<ActionResult> {\n // Strip non-cloneable functions from options; host emits PROGRESS events\n const { options } = args;\n const safeOptions = options\n ? { waitUntil: options.waitUntil }\n : undefined;\n\n const res = await this.post<ActionResult>({\n type: 'PM_SEND_TRANSACTION',\n payload: {\n signedTransaction: args.signedTransaction,\n options: safeOptions\n },\n options: { onProgress: this.wrapOnEvent(options?.onEvent, isActionSSEEvent) }\n });\n return res.result\n }\n\n async exportNearKeypairWithUI(\n nearAccountId: string,\n options?: { variant?: 'drawer' | 'modal'; theme?: 'dark' | 'light' }\n ): Promise<void> {\n try {\n // Make the wallet iframe visible while the export viewer is open.\n // Unlike request/response flows, the wallet host renders UI and manages\n // its own lifecycle; it will notify us when to hide via window message.\n this.showFrameForActivation();\n const walletOrigin = this.walletOriginOrigin;\n const detachClosed = this.attachExportUiClosedListener(walletOrigin);\n const detachFallback = this.attachExportUiFallbackListener(walletOrigin, nearAccountId);\n await this.post<void>({\n type: 'PM_EXPORT_NEAR_KEYPAIR_UI',\n payload: { nearAccountId, variant: options?.variant, theme: options?.theme },\n options: { sticky: true }\n });\n // Cleanup once posted (handlers will remove themselves on events)\n void detachClosed;\n void detachFallback;\n return;\n } catch (e) {\n // Fallback to offline-export route (new tab) if wallet host is unreachable or errors out\n await this.openOfflineExport({ accountId: nearAccountId });\n }\n }\n\n /**\n * Open the offline-export route as a full-screen overlay iframe and instruct it via postMessage\n * to begin the export flow for the given account. Cleans up when the viewer closes or on error.\n */\n async openOfflineExport({ accountId, timeoutMs = 20000 }: { accountId: string; timeoutMs?: number }): Promise<void> {\n const walletOrigin = this.opts.walletOrigin || window.location.origin;\n // Default: open a new tab/window for clarity\n openOfflineExportWindow({ walletOrigin, target: '_blank', accountId });\n return Promise.resolve();\n }\n\n // ===== Account Recovery (single-endpoint flow) =====\n async recoverAccountFlow(payload: {\n accountId?: string;\n onEvent?: (ev: AccountRecoverySSEEvent) => void\n }): Promise<RecoveryResult> {\n const res = await this.post<RecoveryResult>({\n type: 'PM_RECOVER_ACCOUNT_FLOW',\n payload: { accountId: payload.accountId },\n options: {\n onProgress: this.wrapOnEvent(payload.onEvent, isAccountRecoverySSEEvent)\n }\n });\n return res.result\n }\n\n // ===== Email Recovery (wallet-hosted) =====\n async startEmailRecovery(payload: {\n accountId: string;\n recoveryEmail: string;\n onEvent?: (ev: EmailRecoverySSEEvent) => void;\n options?: {\n confirmerText?: { title?: string; body?: string };\n confirmationConfig?: Partial<ConfirmationConfig>;\n }\n }): Promise<{ mailtoUrl: string; nearPublicKey: string }> {\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n }\n : undefined;\n const res = await this.post<{ mailtoUrl: string; nearPublicKey: string }>({\n type: 'PM_START_EMAIL_RECOVERY',\n payload: {\n accountId: payload.accountId,\n recoveryEmail: payload.recoveryEmail,\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: {\n onProgress: this.wrapOnEvent(payload.onEvent, isEmailRecoverySSEEvent)\n }\n });\n return res.result;\n }\n\n async finalizeEmailRecovery(payload: {\n accountId: string;\n nearPublicKey?: string;\n onEvent?: (ev: EmailRecoverySSEEvent) => void\n }): Promise<void> {\n await this.post<void>({\n type: 'PM_FINALIZE_EMAIL_RECOVERY',\n payload: { accountId: payload.accountId, nearPublicKey: payload.nearPublicKey },\n options: {\n onProgress: this.wrapOnEvent(payload.onEvent, isEmailRecoverySSEEvent)\n }\n });\n }\n\n async stopEmailRecovery(payload?: { accountId?: string; nearPublicKey?: string }): Promise<void> {\n await this.post<void>({\n type: 'PM_STOP_EMAIL_RECOVERY',\n payload: { accountId: payload?.accountId, nearPublicKey: payload?.nearPublicKey },\n });\n }\n\n // ===== Device Linking (iframe-hosted) =====\n async linkDeviceWithScannedQRData(payload: {\n qrData: DeviceLinkingQRData;\n fundingAmount: string;\n options?: {\n onEvent?: (ev: DeviceLinkingSSEEvent) => void;\n confirmationConfig?: Partial<ConfirmationConfig>;\n confirmerText?: { title?: string; body?: string };\n }\n }): Promise<LinkDeviceResult> {\n // TouchID required within host\n this.showFrameForActivation();\n try {\n const safeOptions = payload.options\n ? {\n ...(payload.options.confirmationConfig\n ? { confirmationConfig: payload.options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n ...(payload.options.confirmerText ? { confirmerText: payload.options.confirmerText } : {}),\n }\n : undefined;\n const res = await this.post<LinkDeviceResult>({\n type: 'PM_LINK_DEVICE_WITH_SCANNED_QR_DATA',\n payload: {\n qrData: payload.qrData,\n fundingAmount: payload.fundingAmount,\n options: safeOptions && Object.keys(safeOptions).length > 0 ? safeOptions : undefined\n },\n options: {\n onProgress: this.wrapOnEvent(payload.options?.onEvent, isDeviceLinkingSSEEvent)\n }\n });\n return res.result\n } finally {\n this.hideFrameForActivation();\n }\n }\n\n async startDevice2LinkingFlow(payload?: StartDevice2LinkingFlowArgs): Promise<StartDevice2LinkingFlowResults> {\n if (this.device2StartPromise) {\n return this.device2StartPromise\n }\n const options = payload?.options;\n const safeOptions = options\n ? {\n ...(options.confirmationConfig\n ? { confirmationConfig: options.confirmationConfig as unknown as Record<string, unknown> }\n : {}),\n ...(options.confirmerText ? { confirmerText: options.confirmerText } : {}),\n }\n : undefined;\n const p = this.post<StartDevice2LinkingFlowResults>({\n type: 'PM_START_DEVICE2_LINKING_FLOW',\n payload: {\n ui: payload?.ui,\n cameraId: payload?.cameraId,\n options: safeOptions\n },\n options: {\n onProgress: this.wrapOnEvent(options?.onEvent, isDeviceLinkingSSEEvent),\n sticky: true\n }\n }).then((res) => res.result)\n .finally(() => { this.device2StartPromise = null; });\n\n this.device2StartPromise = p;\n return p;\n }\n\n async stopDevice2LinkingFlow(): Promise<void> {\n await this.post<void>({ type: 'PM_STOP_DEVICE2_LINKING_FLOW' });\n this.progressBus.clearAll();\n }\n\n // ===== Control APIs =====\n async cancelRequest(requestId: string): Promise<void> {\n // Best-effort cancel. Host will attempt to close open modals and mark the request as cancelled.\n await this.post<void>({ type: 'PM_CANCEL', payload: { requestId } }).catch(() => {});\n // Always clear local progress + hide overlay even if the host didn't receive the message\n this.progressBus.unregister(requestId);\n this.hideFrameForActivation();\n }\n\n async cancelAll(): Promise<void> {\n // Try to cancel all requests on the host, but don't depend on READY/port availability\n await this.post<void>({ type: 'PM_CANCEL', payload: {} }).catch(() => {});\n // Clear all local progress listeners and force-hide the overlay\n this.progressBus.clearAll();\n this.hideFrameForActivation();\n }\n\n private onPortMessage(e: MessageEvent<ChildToParentEnvelope>) {\n const msg = e.data as ChildToParentEnvelope;\n // Some wallet-host messages are push-style and are not correlated to a requestId.\n if (msg.type === 'PREFERENCES_CHANGED') {\n this.emitPreferencesChanged(msg.payload as PreferencesChangedPayload);\n return;\n }\n const requestId = msg.requestId;\n if (!requestId) return;\n\n // Bridge PROGRESS events to caller-provided onEvent callback via pending registry\n if (msg.type === 'PROGRESS') {\n const payload = (msg.payload as ProgressPayload);\n // Route via ProgressBus (handles overlay + sticky delivery)\n this.progressBus.dispatch({ requestId: requestId, payload: payload });\n // Refresh timeout for long-running operations whenever progress is received\n const pend = this.pending.get(requestId);\n if (pend) {\n if (pend.timer) window.clearTimeout(pend.timer);\n pend.timer = window.setTimeout(() => {\n const err = pend.onTimeout();\n pend.reject(err);\n }, this.opts.requestTimeoutMs);\n }\n return;\n }\n\n const pending = this.pending.get(requestId);\n // Hide overlay on completion only if no other requests still need it,\n // and this request wasn't marked sticky (UI-managed lifecycle).\n if (!this.progressBus.isSticky(requestId)) {\n if (!this.progressBus.wantsVisible()) {\n this.hideFrameForActivation();\n }\n }\n if (!pending) {\n // Even if no pending exists (e.g., early cancel or pre-resolved),\n // ensure any lingering progress subscriber is removed.\n if (this.debug) {\n console.debug('[WalletIframeRouter] Non-PROGRESS without pending → hide + unregister', {\n requestId,\n type: (msg as unknown as { type?: unknown })?.type || 'unknown'\n });\n }\n this.progressBus.unregister(requestId);\n return;\n }\n this.pending.delete(requestId);\n if (pending.timer) window.clearTimeout(pending.timer);\n\n if (msg.type === 'ERROR') {\n const err: Error & { code?: string; details?: unknown } = new Error(msg.payload?.message || 'Wallet error');\n err.code = msg.payload?.code;\n err.details = msg.payload?.details;\n // Deliver to pending promise if present\n pending.reject(err);\n // Also notify all progress subscribers for this requestId\n this.progressBus.dispatch({\n requestId: requestId,\n payload: {\n step: 0,\n phase: 'error',\n status: 'error',\n message: msg.payload?.message\n }\n });\n this.progressBus.unregister(requestId);\n return;\n }\n\n pending.resolve(msg.payload);\n if (!this.progressBus.isSticky(requestId)) {\n this.progressBus.unregister(requestId);\n }\n }\n\n /**\n * Post a typed envelope over the MessagePort with robust readiness handling.\n * This is the core method that handles all communication with the iframe.\n *\n * Flow:\n * 1. Ensure iframe is ready (lazy initialization)\n * 2. Generate unique request ID for correlation\n * 3. Set up timeout and progress handling\n * 4. Send message to iframe via MessagePort\n * 5. Wait for response (PM_RESULT or ERROR)\n * 6. Clean up on completion or timeout\n */\n private async post<T>(\n envelope: Omit<ParentToChildEnvelope, 'requestId'>,\n ): Promise<PostResult<T>> {\n\n // Step 1: Lazily initialize the iframe/client if not ready yet\n if (!this.ready || !this.port) {\n await this.init();\n }\n\n // Step 2: Generate unique request ID for correlation\n const requestId = `${Date.now()}-${++this.reqCounter}`;\n const full: ParentToChildEnvelope = { ...(envelope as ParentToChildEnvelope), requestId };\n const { options } = full;\n\n return new Promise<PostResult<T>>((resolve, reject) => {\n const onTimeout = () => {\n const pending = this.pending.get(requestId);\n if (pending?.timer !== undefined) window.clearTimeout(pending.timer);\n this.pending.delete(requestId);\n this.progressBus.unregister(requestId);\n this.overlay.setSticky(false);\n if (!this.progressBus.wantsVisible()) {\n this.hideFrameForActivation();\n }\n this.sendBestEffortCancel(requestId);\n return new Error(`Wallet request timeout for ${envelope.type}`);\n };\n\n // Step 3: Set up timeout handler for request\n const timer = window.setTimeout(() => {\n const err = onTimeout();\n reject(err);\n }, this.opts.requestTimeoutMs);\n\n // Step 4: Register pending request for correlation\n this.pending.set(requestId, {\n resolve: (v) => resolve(v as PostResult<T>),\n reject,\n timer,\n onProgress: options?.onProgress,\n onTimeout,\n });\n\n // Step 5: Register progress handler for real-time updates\n this.progressBus.register({\n requestId: requestId,\n sticky: !!options?.sticky, // Some flows need to persist after completion\n onProgress: (payload: ProgressPayload) => {\n // Bridge progress events from iframe back to parent callback\n try {\n options?.onProgress?.(payload);\n } catch {}\n },\n });\n\n try {\n // Step 6: Strip non-cloneable fields (functions) from envelope options before posting\n const wireOptions = (options && isObject(options))\n ? (() => {\n const stickyVal = (options as { sticky?: unknown }).sticky;\n return isBoolean(stickyVal) ? { sticky: stickyVal } : undefined;\n })()\n : undefined;\n const serializableFull = wireOptions ? { ...full, options: wireOptions } : { ...full, options: undefined };\n\n // Align overlay stickiness with request options (phase 2 will use intents)\n this.overlay.setSticky(!!(wireOptions && (wireOptions as { sticky?: boolean }).sticky));\n\n // Step 7: Apply overlay intent (conservative) if not already visible, then post\n if (!this.overlay.getState().visible) {\n const intent = this.computeOverlayIntent(serializableFull.type);\n if (intent.mode === 'fullscreen') {\n this.overlay.setSticky(!!(wireOptions && (wireOptions as { sticky?: boolean }).sticky));\n this.overlay.showFullscreen();\n }\n }\n\n // Send message to iframe via MessagePort\n this.port!.postMessage(serializableFull as ParentToChildEnvelope);\n } catch (err) {\n // Step 8: Handle send errors - clean up and reject\n this.pending.delete(requestId);\n window.clearTimeout(timer);\n this.progressBus.unregister(requestId);\n reject(toError(err));\n }\n });\n }\n\n /**\n * computeOverlayIntent - Preflight \"Show\" Decision\n *\n * This method makes the initial decision about whether to show the overlay\n * BEFORE sending the request to the iframe. It's a conservative preflight\n * check that ensures the iframe is visible in time for user activation.\n *\n * Key Responsibilities:\n * - Preflight Decision: Determines overlay visibility before request is sent\n * - User Activation Timing: Ensures iframe is visible when WebAuthn prompts appear\n * - Conservative Approach: Only shows overlay if not already visible\n * - Request Type Mapping: Maps message types to overlay requirements\n *\n * How it differs from other components:\n *\n * vs OnEventsProgressBus (lifecycle and close decision):\n * - computeOverlayIntent: \"SHOW\" decision - runs before sending request\n * - OnEventsProgressBus: \"CLOSE\" decision - runs during operation lifecycle\n * - OnEventsProgressBus drives ongoing UI phases and manages sticky behavior\n * - OnEventsProgressBus handles PM_RESULT/ERROR and decides when to hide overlay\n *\n * vs OverlayController (single executor):\n * - computeOverlayIntent: DECIDES what to do (show/hide decision logic)\n * - OverlayController: EXECUTES the decision (actual CSS manipulation)\n * - OverlayController receives commands from both intent and ProgressBus\n * - OverlayController keeps all style mutations in one place\n *\n * Architecture Flow:\n * 1. computeOverlayIntent() → decides to show overlay\n * 2. OverlayController.showFullscreen() → executes the decision\n * 3. Request sent to iframe → operation begins\n * 4. OnEventsProgressBus manages lifecycle → handles progress events\n * 5. OnEventsProgressBus decides to hide → when operation completes\n * 6. OverlayController.hide() → executes the hide decision\n *\n * Special Cases:\n * - Anchored flows (UI registry with viewportRect) are message-driven\n * - Parent sets bounds and sticky via registry messages\n * - computeOverlayIntent returns 'hidden' for these (don't pre-show)\n * - Some legacy paths still call showFrameForActivation() directly\n *\n * Future Evolution:\n * - If host always emits early PROGRESS for a type, this can be reduced\n * - Intent is to move toward OnEventsProgressBus-driven lifecycle management\n * - This provides predictable, glitch-free activation without hardcoding\n */\n private computeOverlayIntent(type: ParentToChildEnvelope['type']): { mode: 'hidden' | 'fullscreen' } {\n switch (type) {\n // Operations that require fullscreen overlay for WebAuthn activation\n case 'PM_EXPORT_NEAR_KEYPAIR_UI':\n case 'PM_REGISTER':\n case 'PM_LOGIN':\n case 'PM_LINK_DEVICE_WITH_SCANNED_QR_DATA':\n case 'PM_SIGN_AND_SEND_TXS':\n case 'PM_EXECUTE_ACTION':\n case 'PM_SEND_TRANSACTION':\n case 'PM_SIGN_TXS_WITH_ACTIONS':\n return { mode: 'fullscreen' };\n\n // All other operations (background/read-only) don't need overlay\n default:\n return { mode: 'hidden' };\n }\n }\n\n // Temporarily show the service iframe to capture user activation\n private showFrameForActivation(): void {\n // Ensure iframe exists so overlay can be applied immediately\n this.transport.ensureIframeMounted();\n if (this.overlayForceFullscreen) {\n this.overlay.showFullscreen();\n } else {\n // Prefer fullscreen by default\n this.overlay.showFullscreen();\n }\n }\n\n private hideFrameForActivation(): void {\n if (!this.overlay.getState().visible) return;\n this.overlay.hide();\n }\n\n private sendBestEffortCancel(targetRequestId?: string): void {\n const port = this.port;\n if (!port) return;\n const cancelEnvelope: ParentToChildEnvelope = {\n type: 'PM_CANCEL',\n requestId: `cancel-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n payload: targetRequestId ? { requestId: targetRequestId } : {}\n };\n port.postMessage(cancelEnvelope);\n }\n\n /**\n * Public toggle to surface the wallet iframe for user activation or hide it.\n * Useful when mounting inline UI components that require direct user clicks.\n */\n setOverlayVisible(visible: boolean): void {\n if (visible) {\n // Respect fullscreen lock when present\n if (this.overlayForceFullscreen) {\n this.overlay.showFullscreen();\n } else {\n this.showFrameForActivation();\n }\n } else {\n this.hideFrameForActivation();\n }\n }\n\n /** Public helper for tests/tools: get the underlying iframe element. */\n getIframeEl(): HTMLIFrameElement | null {\n return this.transport.getIframeEl();\n }\n\n /** Public helper for tests/tools: inspect current overlay state. */\n getOverlayState(): { visible: boolean; mode: 'hidden' | 'fullscreen' | 'anchored'; sticky: boolean; rect?: DOMRectLike } {\n return this.overlay.getState();\n }\n\n /**\n * Position and show the wallet iframe as an anchored overlay matching a DOMRect.\n * Accepts viewport-relative coordinates (from getBoundingClientRect()).\n *\n * Important: Some apps apply CSS transforms (or filters/perspective) on html/body,\n * which changes the containing block for position: fixed. In those cases a fixed\n * iframe will be offset by the page scroll. To avoid that mismatch, anchor the\n * overlay using absolute positioning in document coordinates.\n */\n setOverlayBounds(rect: { top: number; left: number; width: number; height: number }): void {\n if (this.overlayForceFullscreen) return; // ignore anchored bounds while locked to fullscreen\n this.transport.ensureIframeMounted();\n this.overlay.showAnchored(rect as DOMRectLike);\n }\n\n // setAnchoredOverlayBounds/clearAnchoredOverlay removed with Arrow overlay deprecation\n\n // Post a window message and surface errors in debug mode instead of silently swallowing them\n private postWindowMessage(w: Window, data: unknown, target: string): void {\n try {\n w.postMessage(data, target);\n } catch (err) {\n if (this.debug) {\n console.error('[WalletIframeRouter] window.postMessage failed', { error: err, data });\n }\n }\n }\n\n}\n\n// ===== Runtime type guards to safely bridge ProgressPayload → typed SSE events =====\nconst REGISTRATION_PHASES = new Set<string>(Object.values(RegistrationPhase) as string[]);\nconst LOGIN_PHASES = new Set<string>(Object.values(LoginPhase) as string[]);\nconst ACTION_PHASES = new Set<string>(Object.values(ActionPhase) as string[]);\nconst DEVICE_LINKING_PHASES = new Set<string>(Object.values(DeviceLinkingPhase) as string[]);\nconst ACCOUNT_RECOVERY_PHASES = new Set<string>(Object.values(AccountRecoveryPhase) as string[]);\nconst EMAIL_RECOVERY_PHASES = new Set<string>(Object.values(EmailRecoveryPhase) as string[]);\n\nfunction phaseOf(progress: ProgressPayload): string {\n return String((progress as { phase?: unknown })?.phase ?? '');\n}\n\nfunction isRegistrationSSEEvent(progress: ProgressPayload): progress is RegistrationSSEEvent {\n return REGISTRATION_PHASES.has(phaseOf(progress));\n}\n\nfunction isLoginSSEEvent(p: ProgressPayload): p is LoginSSEvent {\n return LOGIN_PHASES.has(phaseOf(p));\n}\n\nfunction isActionSSEEvent(p: ProgressPayload): p is ActionSSEEvent {\n return ACTION_PHASES.has(phaseOf(p));\n}\n\nexport function isDelegateSSEEvent(p: ProgressPayload): p is DelegateActionSSEEvent {\n if (!isActionSSEEvent(p)) return false;\n const data = (p as any).data;\n return !!data && typeof data === 'object' && (data as any).context === 'delegate';\n}\n\nfunction isDeviceLinkingSSEEvent(p: ProgressPayload): p is DeviceLinkingSSEEvent {\n return DEVICE_LINKING_PHASES.has(phaseOf(p));\n}\n\nfunction isAccountRecoverySSEEvent(p: ProgressPayload): p is AccountRecoverySSEEvent {\n return ACCOUNT_RECOVERY_PHASES.has(phaseOf(p));\n}\n\nfunction isEmailRecoverySSEEvent(p: ProgressPayload): p is EmailRecoverySSEEvent {\n return EMAIL_RECOVERY_PHASES.has(phaseOf(p));\n}\n\n/**\n * Strips out class functions as they cannot be sent over postMessage to iframe\n */\n function normalizeSignedTransactionObject(result: SignTransactionResult) {\n const arr = Array.isArray(result) ? result : [];\n const normalized = arr.map(entry => {\n if (entry?.signedTransaction) {\n const st = entry.signedTransaction as unknown;\n if (isPlainSignedTransactionLike(st)) {\n entry.signedTransaction = SignedTransaction.fromPlain({\n transaction: (st as { transaction: unknown }).transaction,\n signature: (st as { signature: unknown }).signature,\n borsh_bytes: extractBorshBytesFromPlainSignedTx(st),\n });\n }\n }\n return entry;\n });\n return normalized\n }\n\n/**\n * Strips out functions as they cannot be sent over postMessage to iframe\n */\nimport { stripFunctionsShallow } from '../validation';\n\nfunction removeFunctionsFromOptions(options?: object): object | undefined {\n return stripFunctionsShallow(options as Record<string, unknown>);\n}\n"],"mappings":"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"}
|
package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js
CHANGED
|
@@ -227,8 +227,8 @@ var DrawerTxConfirmerElement = class extends require_LitElementWithProps.LitElem
|
|
|
227
227
|
${this.vrfChallenge?.blockHeight ? lit.html`block ${this.vrfChallenge.blockHeight}` : ""}
|
|
228
228
|
</span>
|
|
229
229
|
</div>
|
|
230
|
-
${this.body && this.body.trim() ? lit.html`<div class="rpid-body">${this.body}</div>` : ""}
|
|
231
230
|
</div>
|
|
231
|
+
${this.body && this.body.trim() ? lit.html`<div class="confirmation-body">${this.body}</div>` : ""}
|
|
232
232
|
</div>
|
|
233
233
|
<div class="section responsive-card responsive-card-center">
|
|
234
234
|
<w3a-tx-confirm-content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer-drawer.js","names":["LitElementWithProps","TxConfirmContentElement","PadlockIconElement","DrawerElement","WalletIframeDomEvents","W3A_DRAWER_ID","ensureExternalStyles","W3A_DRAWER_TX_CONFIRMER_ID"],"sources":["../../../../../../../../../src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.ts"],"sourcesContent":["import { html, type PropertyValues } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport DrawerElement from '../Drawer';\nimport { W3A_DRAWER_ID } from '../tags';\nimport TxConfirmContentElement from './tx-confirm-content';\nimport PadlockIconElement from '../common/PadlockIcon';\nimport { ensureExternalStyles } from '../css/css-loader';\nimport { WalletIframeDomEvents } from '../../../WalletIframe/events';\nimport type { TransactionInputWasm, VRFChallenge } from '../../../types';\nimport type { ThemeName } from '../confirm-ui-types';\nimport type { ConfirmUIElement } from '../confirm-ui-types';\n\n/**\n * DrawerTxConfirmer: Drawer variant of the transaction confirmer\n */\nexport class DrawerTxConfirmerElement extends LitElementWithProps implements ConfirmUIElement {\n static requiredChildTags = ['w3a-tx-confirm-content', 'w3a-drawer'];\n static strictChildDefinitions = true;\n // Prevent bundlers from dropping nested custom element definitions used via templates\n static keepDefinitions = [TxConfirmContentElement, PadlockIconElement];\n static properties = {\n nearAccountId: { type: String, attribute: 'near-account-id' },\n txSigningRequests: { type: Array },\n vrfChallenge: { type: Object },\n theme: { type: String, reflect: true },\n loading: { type: Boolean },\n errorMessage: { type: String },\n body: { type: String },\n title: { type: String },\n confirmText: { type: String },\n cancelText: { type: String },\n // Two‑phase close: when true, host controls removal\n deferClose: { type: Boolean, attribute: 'defer-close' },\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n } as const;\n\n declare nearAccountId: string;\n declare txSigningRequests: TransactionInputWasm[];\n declare vrfChallenge?: Partial<VRFChallenge>;\n // Theme tokens now come from external CSS (tx-confirmer.css)\n // style injection has been removed to satisfy strict CSP.\n declare theme: ThemeName;\n declare loading: boolean;\n declare errorMessage?: string;\n declare body: string;\n declare title: string;\n declare confirmText: string;\n declare cancelText: string;\n declare deferClose: boolean;\n declare nearExplorerUrl?: string;\n declare intentDigest?: string;\n\n // Keep essential custom elements from being tree-shaken\n private _ensureDrawerDefinition = DrawerElement;\n private _drawerEl: any | null = null;\n private _open: boolean = false;\n\n private _onWindowMessage = (ev: MessageEvent) => {\n const data = (ev && ev.data) || {};\n if (!data || typeof (data as any).type !== 'string') return;\n if ((data as any).type === 'MODAL_TIMEOUT') {\n const msg = typeof (data as any).payload === 'string' && (data as any).payload\n ? (data as any).payload\n : 'Operation timed out';\n this.loading = false;\n this.errorMessage = msg;\n // Best-effort close and emit cancel so host resolves and cleans up\n this._drawerEl?.handleClose?.();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n if (this.loading) return;\n e.preventDefault();\n this._drawerEl?.handleClose();\n if (!this._drawerEl) {\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n }\n // Rely on drawer's `cancel` event -> onDrawerCancel to emit w3a:modal-cancel\n }\n };\n\n constructor() {\n super();\n this.nearAccountId = '';\n this.txSigningRequests = [];\n this.theme = 'dark';\n this.loading = false;\n this.body = '';\n this.title = '';\n this.confirmText = 'Next';\n this.cancelText = 'Cancel';\n this.deferClose = false;\n }\n\n protected getComponentPrefix(): string { return 'drawer-tx'; }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n // Light DOM root so tokens cascade without Shadow DOM boundaries\n const root = (this as unknown) as HTMLElement;\n // Preload tokens + styles on host\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css').catch(() => {});\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css').catch(() => {});\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css').catch(() => {});\n return root;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Ensure root token theme is applied immediately on mount\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme) {\n const current = docEl.getAttribute('data-w3a-theme');\n if (!current || current === 'dark' || current === 'light') {\n docEl.setAttribute('data-w3a-theme', this.theme);\n (this as any)._ownsThemeAttr = true;\n }\n }\n } catch {}\n // Also ensure tokens CSS on document root for host-scoped variables\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl) ensureExternalStyles(docEl, 'w3a-components.css', 'data-w3a-components-css').catch(() => {});\n } catch {}\n window.addEventListener('keydown', this._onKeyDown);\n window.addEventListener('message', this._onWindowMessage as EventListener);\n // Ensure immediate keyboard handling (e.g., ESC) by focusing host/iframe\n const hostEl = this as unknown as HTMLElement;\n if (hostEl.tabIndex === undefined || hostEl.tabIndex === null) {\n (hostEl as any).tabIndex = -1;\n }\n hostEl.focus({ preventScroll: true } as FocusOptions);\n if (typeof window.focus === 'function') { window.focus(); }\n }\n\n async firstUpdated(): Promise<void> {\n this._drawerEl = (this as unknown as HTMLElement).querySelector(W3A_DRAWER_ID) as any;\n // Ensure external styles are ready before opening (await Promise-based loader)\n const root = (this.renderRoot as unknown) as ShadowRoot | DocumentFragment | HTMLElement;\n await Promise.all([\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css'),\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'),\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'),\n // Preload drawer.css so fallback <link> is loaded before opening\n ensureExternalStyles(root, 'drawer.css', 'data-w3a-drawer-css'),\n ]);\n // Open after mount with double-rAF to let layout/styles settle\n await new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())));\n this._open = true;\n this.requestUpdate();\n }\n\n disconnectedCallback(): void {\n window.removeEventListener('keydown', this._onKeyDown);\n window.removeEventListener('message', this._onWindowMessage as EventListener);\n super.disconnectedCallback();\n }\n\n updated(changed: PropertyValues) {\n super.updated(changed);\n // Keep the iframe/root document's theme in sync so :root[data-w3a-theme] tokens apply\n if (changed.has('theme')) {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme && (this as any)._ownsThemeAttr) {\n docEl.setAttribute('data-w3a-theme', this.theme);\n }\n }\n }\n\n private onDrawerCancel = () => {\n if (this.loading) return;\n // Close drawer locally to ensure animation\n this._open = false;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n };\n\n private onContentConfirm = () => {\n if (this.loading) return;\n this.loading = true;\n this.requestUpdate();\n // Bridge semantic event to canonical event\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, {\n bubbles: true,\n composed: true,\n detail: { confirmed: true }\n }));\n };\n\n private onContentCancel = () => {\n if (this.loading) return;\n this._drawerEl?.handleClose();\n this._open = false; this.requestUpdate();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n };\n\n // Public method for two‑phase close from host/bootstrap\n close(_confirmed: boolean) {\n this.remove();\n }\n\n render() {\n return html`\n <w3a-drawer\n .open=${this._open}\n theme=${this.theme}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .height=${'auto'}\n .overpullPx=${160}\n .dragToClose=${true}\n .showCloseButton=${true}\n @lit-cancel=${this.onDrawerCancel}\n >\n <div class=\"drawer-tx-confirmer-root\">\n <div class=\"section responsive-card margin-left1\">\n <div class=\"drawer-header\">\n ${(() => {\n const isRegistration = (this.txSigningRequests?.length || 0) === 0;\n const fallback = isRegistration ? 'Register with Passkey' : 'Confirm with Passkey';\n const titleText = (this.title || '').trim();\n const heading = titleText || fallback;\n return html`<h2 class=\"drawer-title\">${heading}</h2>`;\n })()}\n </div>\n </div>\n\n <div class=\"section responsive-card margin-left1\">\n <div class=\"rpid-wrapper\">\n <div class=\"rpid\">\n <div class=\"secure-indicator\">\n <w3a-padlock-icon class=\"padlock-icon\"></w3a-padlock-icon>\n ${this.vrfChallenge?.rpId\n ? html`<span class=\"domain-text\">${this.vrfChallenge.rpId}</span>`\n : ''}\n </div>\n <span class=\"security-details\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"block-height-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"/>\n <path d=\"m3.3 7 8.7 5 8.7-5\"/>\n <path d=\"M12 22V12\"/>\n </svg>\n ${this.vrfChallenge?.blockHeight\n ? html`block ${this.vrfChallenge.blockHeight}`\n : ''}\n </span>\n </div>\n ${this.body && this.body.trim()\n ? html`<div class=\"rpid-body\">${this.body}</div>`\n : ''}\n </div>\n </div>\n <div class=\"section responsive-card responsive-card-center\">\n <w3a-tx-confirm-content\n .nearAccountId=${this.nearAccountId || ''}\n .txSigningRequests=${this.txSigningRequests || []}\n .intentDigest=${this.intentDigest}\n .vrfChallenge=${this.vrfChallenge}\n .theme=${this.theme}\n .nearExplorerUrl=${this.nearExplorerUrl}\n .showShadow=${false}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .title=${this.title}\n .confirmText=${this.confirmText}\n .cancelText=${this.cancelText}\n @lit-confirm=${this.onContentConfirm}\n @lit-cancel=${this.onContentCancel}\n ></w3a-tx-confirm-content>\n </div>\n\n </div>\n </w3a-drawer>\n `;\n }\n}\n\nimport { W3A_DRAWER_TX_CONFIRMER_ID } from '../tags';\n\n// Define canonical tag\nif (!customElements.get(W3A_DRAWER_TX_CONFIRMER_ID)) {\n customElements.define(W3A_DRAWER_TX_CONFIRMER_ID, DrawerTxConfirmerElement);\n}\n\nexport default DrawerTxConfirmerElement;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"viewer-drawer.js","names":["LitElementWithProps","TxConfirmContentElement","PadlockIconElement","DrawerElement","WalletIframeDomEvents","W3A_DRAWER_ID","ensureExternalStyles","W3A_DRAWER_TX_CONFIRMER_ID"],"sources":["../../../../../../../../../src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.ts"],"sourcesContent":["import { html, type PropertyValues } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\nimport DrawerElement from '../Drawer';\nimport { W3A_DRAWER_ID } from '../tags';\nimport TxConfirmContentElement from './tx-confirm-content';\nimport PadlockIconElement from '../common/PadlockIcon';\nimport { ensureExternalStyles } from '../css/css-loader';\nimport { WalletIframeDomEvents } from '../../../WalletIframe/events';\nimport type { TransactionInputWasm, VRFChallenge } from '../../../types';\nimport type { ThemeName } from '../confirm-ui-types';\nimport type { ConfirmUIElement } from '../confirm-ui-types';\n\n/**\n * DrawerTxConfirmer: Drawer variant of the transaction confirmer\n */\nexport class DrawerTxConfirmerElement extends LitElementWithProps implements ConfirmUIElement {\n static requiredChildTags = ['w3a-tx-confirm-content', 'w3a-drawer'];\n static strictChildDefinitions = true;\n // Prevent bundlers from dropping nested custom element definitions used via templates\n static keepDefinitions = [TxConfirmContentElement, PadlockIconElement];\n static properties = {\n nearAccountId: { type: String, attribute: 'near-account-id' },\n txSigningRequests: { type: Array },\n vrfChallenge: { type: Object },\n theme: { type: String, reflect: true },\n loading: { type: Boolean },\n errorMessage: { type: String },\n body: { type: String },\n title: { type: String },\n confirmText: { type: String },\n cancelText: { type: String },\n // Two‑phase close: when true, host controls removal\n deferClose: { type: Boolean, attribute: 'defer-close' },\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n } as const;\n\n declare nearAccountId: string;\n declare txSigningRequests: TransactionInputWasm[];\n declare vrfChallenge?: Partial<VRFChallenge>;\n // Theme tokens now come from external CSS (tx-confirmer.css)\n // style injection has been removed to satisfy strict CSP.\n declare theme: ThemeName;\n declare loading: boolean;\n declare errorMessage?: string;\n declare body: string;\n declare title: string;\n declare confirmText: string;\n declare cancelText: string;\n declare deferClose: boolean;\n declare nearExplorerUrl?: string;\n declare intentDigest?: string;\n\n // Keep essential custom elements from being tree-shaken\n private _ensureDrawerDefinition = DrawerElement;\n private _drawerEl: any | null = null;\n private _open: boolean = false;\n\n private _onWindowMessage = (ev: MessageEvent) => {\n const data = (ev && ev.data) || {};\n if (!data || typeof (data as any).type !== 'string') return;\n if ((data as any).type === 'MODAL_TIMEOUT') {\n const msg = typeof (data as any).payload === 'string' && (data as any).payload\n ? (data as any).payload\n : 'Operation timed out';\n this.loading = false;\n this.errorMessage = msg;\n // Best-effort close and emit cancel so host resolves and cleans up\n this._drawerEl?.handleClose?.();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n if (this.loading) return;\n e.preventDefault();\n this._drawerEl?.handleClose();\n if (!this._drawerEl) {\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n }\n // Rely on drawer's `cancel` event -> onDrawerCancel to emit w3a:modal-cancel\n }\n };\n\n constructor() {\n super();\n this.nearAccountId = '';\n this.txSigningRequests = [];\n this.theme = 'dark';\n this.loading = false;\n this.body = '';\n this.title = '';\n this.confirmText = 'Next';\n this.cancelText = 'Cancel';\n this.deferClose = false;\n }\n\n protected getComponentPrefix(): string { return 'drawer-tx'; }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n // Light DOM root so tokens cascade without Shadow DOM boundaries\n const root = (this as unknown) as HTMLElement;\n // Preload tokens + styles on host\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css').catch(() => {});\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css').catch(() => {});\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css').catch(() => {});\n return root;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Ensure root token theme is applied immediately on mount\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme) {\n const current = docEl.getAttribute('data-w3a-theme');\n if (!current || current === 'dark' || current === 'light') {\n docEl.setAttribute('data-w3a-theme', this.theme);\n (this as any)._ownsThemeAttr = true;\n }\n }\n } catch {}\n // Also ensure tokens CSS on document root for host-scoped variables\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl) ensureExternalStyles(docEl, 'w3a-components.css', 'data-w3a-components-css').catch(() => {});\n } catch {}\n window.addEventListener('keydown', this._onKeyDown);\n window.addEventListener('message', this._onWindowMessage as EventListener);\n // Ensure immediate keyboard handling (e.g., ESC) by focusing host/iframe\n const hostEl = this as unknown as HTMLElement;\n if (hostEl.tabIndex === undefined || hostEl.tabIndex === null) {\n (hostEl as any).tabIndex = -1;\n }\n hostEl.focus({ preventScroll: true } as FocusOptions);\n if (typeof window.focus === 'function') { window.focus(); }\n }\n\n async firstUpdated(): Promise<void> {\n this._drawerEl = (this as unknown as HTMLElement).querySelector(W3A_DRAWER_ID) as any;\n // Ensure external styles are ready before opening (await Promise-based loader)\n const root = (this.renderRoot as unknown) as ShadowRoot | DocumentFragment | HTMLElement;\n await Promise.all([\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css'),\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'),\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'),\n // Preload drawer.css so fallback <link> is loaded before opening\n ensureExternalStyles(root, 'drawer.css', 'data-w3a-drawer-css'),\n ]);\n // Open after mount with double-rAF to let layout/styles settle\n await new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())));\n this._open = true;\n this.requestUpdate();\n }\n\n disconnectedCallback(): void {\n window.removeEventListener('keydown', this._onKeyDown);\n window.removeEventListener('message', this._onWindowMessage as EventListener);\n super.disconnectedCallback();\n }\n\n updated(changed: PropertyValues) {\n super.updated(changed);\n // Keep the iframe/root document's theme in sync so :root[data-w3a-theme] tokens apply\n if (changed.has('theme')) {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme && (this as any)._ownsThemeAttr) {\n docEl.setAttribute('data-w3a-theme', this.theme);\n }\n }\n }\n\n private onDrawerCancel = () => {\n if (this.loading) return;\n // Close drawer locally to ensure animation\n this._open = false;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n };\n\n private onContentConfirm = () => {\n if (this.loading) return;\n this.loading = true;\n this.requestUpdate();\n // Bridge semantic event to canonical event\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, {\n bubbles: true,\n composed: true,\n detail: { confirmed: true }\n }));\n };\n\n private onContentCancel = () => {\n if (this.loading) return;\n this._drawerEl?.handleClose();\n this._open = false; this.requestUpdate();\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n };\n\n // Public method for two‑phase close from host/bootstrap\n close(_confirmed: boolean) {\n this.remove();\n }\n\n render() {\n return html`\n <w3a-drawer\n .open=${this._open}\n theme=${this.theme}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .height=${'auto'}\n .overpullPx=${160}\n .dragToClose=${true}\n .showCloseButton=${true}\n @lit-cancel=${this.onDrawerCancel}\n >\n <div class=\"drawer-tx-confirmer-root\">\n <div class=\"section responsive-card margin-left1\">\n <div class=\"drawer-header\">\n ${(() => {\n const isRegistration = (this.txSigningRequests?.length || 0) === 0;\n const fallback = isRegistration ? 'Register with Passkey' : 'Confirm with Passkey';\n const titleText = (this.title || '').trim();\n const heading = titleText || fallback;\n return html`<h2 class=\"drawer-title\">${heading}</h2>`;\n })()}\n </div>\n </div>\n\n <div class=\"section responsive-card margin-left1\">\n <div class=\"rpid-wrapper\">\n <div class=\"rpid\">\n <div class=\"secure-indicator\">\n <w3a-padlock-icon class=\"padlock-icon\"></w3a-padlock-icon>\n ${this.vrfChallenge?.rpId\n ? html`<span class=\"domain-text\">${this.vrfChallenge.rpId}</span>`\n : ''}\n </div>\n <span class=\"security-details\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"block-height-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"/>\n <path d=\"m3.3 7 8.7 5 8.7-5\"/>\n <path d=\"M12 22V12\"/>\n </svg>\n ${this.vrfChallenge?.blockHeight\n ? html`block ${this.vrfChallenge.blockHeight}`\n : ''}\n </span>\n </div>\n </div>\n ${\n this.body && this.body.trim()\n ? html`<div class=\"confirmation-body\">${this.body}</div>`\n : ''\n }\n </div>\n <div class=\"section responsive-card responsive-card-center\">\n <w3a-tx-confirm-content\n .nearAccountId=${this.nearAccountId || ''}\n .txSigningRequests=${this.txSigningRequests || []}\n .intentDigest=${this.intentDigest}\n .vrfChallenge=${this.vrfChallenge}\n .theme=${this.theme}\n .nearExplorerUrl=${this.nearExplorerUrl}\n .showShadow=${false}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .title=${this.title}\n .confirmText=${this.confirmText}\n .cancelText=${this.cancelText}\n @lit-confirm=${this.onContentConfirm}\n @lit-cancel=${this.onContentCancel}\n ></w3a-tx-confirm-content>\n </div>\n\n </div>\n </w3a-drawer>\n `;\n }\n}\n\nimport { W3A_DRAWER_TX_CONFIRMER_ID } from '../tags';\n\n// Define canonical tag\nif (!customElements.get(W3A_DRAWER_TX_CONFIRMER_ID)) {\n customElements.define(W3A_DRAWER_TX_CONFIRMER_ID, DrawerTxConfirmerElement);\n}\n\nexport default DrawerTxConfirmerElement;\n"],"mappings":"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"}
|