/** * IframeConnectionHandler — wallet-side of the cross-origin iframe protocol. * * This mirrors {@link BackgroundConnectionHandler} from `@aztec/wallet-sdk/extension/handlers` * but uses `window.postMessage` instead of browser.runtime messaging. * * Message flow (wallet receives): * parent → DISCOVERY → show approval UI → send DISCOVERY_RESPONSE * parent → KEY_EXCHANGE_REQUEST → ECDH → send KEY_EXCHANGE_RESPONSE * parent → SECURE_MESSAGE → decrypt → Wallet → encrypt → SECURE_RESPONSE * parent → DISCONNECT → terminate session * * The wallet announces itself by posting WALLET_READY as soon as the handler starts, * so the dApp knows it can send a discovery request. */ import type { ChainInfo } from '@aztec/aztec.js/account'; import type { Wallet } from '@aztec/aztec.js/wallet'; import { type WalletSdkLogger } from '../../types.js'; /** * A pending discovery request from a dApp (before user approval). */ export interface PendingSession { /** Unique request identifier */ requestId: string; /** Application identifier */ appId: string; /** Origin URL of the requesting page */ origin: string; /** Approval status */ status: 'pending' | 'approved'; } /** * An active session (after key exchange). */ export interface ActiveSession { /** Session identifier (same as the discovery requestId) */ sessionId: string; /** AES-256-GCM shared key for this session */ sharedKey: CryptoKey; /** Verification hash for emoji display */ verificationHash: string; /** Origin URL of the connected dApp */ origin: string; /** Application identifier */ appId: string; } /** * Configuration for the iframe connection handler. */ export interface IframeConnectionConfig { /** Unique wallet identifier */ walletId: string; /** Display name for the wallet */ walletName: string; /** Wallet version string */ walletVersion: string; /** Optional wallet icon URL */ walletIcon?: string; /** Origins allowed to connect. If empty or undefined, all origins are allowed (dev mode). */ allowedOrigins?: string[]; /** Logger used for diagnostics. */ logger: WalletSdkLogger; } /** * Event callbacks for the iframe connection handler. */ export interface IframeConnectionCallbacks { /** Called when a new discovery request arrives — wallet can show approval UI */ onPendingDiscovery?: (session: PendingSession) => void; /** Called when a session is established (key exchange complete) */ onSessionEstablished?: (session: ActiveSession) => void; /** Called when a session is terminated */ onSessionTerminated?: (sessionId: string) => void; /** Called when a key exchange completes — show verificationHash as emojis to the user */ onVerificationHash?: (verificationHash: string) => void; /** * Resolves the Wallet instance to use for a given dApp and chain. * Called when an encrypted message arrives and needs to be dispatched. */ getWallet: (appId: string, chainInfo: ChainInfo) => Promise; } /** * Handles the wallet side of the cross-origin iframe protocol. * * Manages the full lifecycle: discovery, ECDH key exchange, encrypted message * dispatch to a {@link Wallet} instance, and session termination. * * @example * ```typescript * const handler = new IframeConnectionHandler( * { walletId: 'my-wallet', walletName: 'My Wallet', walletVersion: '1.0.0', logger: console }, * { * onPendingDiscovery: (session) => showApprovalUI(session), * getWallet: (appId, chainInfo) => createWalletForApp(appId, chainInfo), * }, * ); * handler.start(); * ``` */ export declare class IframeConnectionHandler { private config; private callbacks; private pendingSessions; private activeSessions; private log; constructor(config: IframeConnectionConfig, callbacks: IframeConnectionCallbacks); start(): void; stop(): void; approveDiscovery(requestId: string): void; rejectDiscovery(requestId: string): void; terminateSession(sessionId: string): void; getPendingSessions(): PendingSession[]; private handleMessage; private handleMessageAsync; private handlePing; private handleDiscoveryRequest; private handleKeyExchangeRequest; private handleSecureMessage; private postToParent; private postToOrigin; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZyYW1lX2Nvbm5lY3Rpb25faGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmcmFtZS9oYW5kbGVycy9pZnJhbWVfY29ubmVjdGlvbl9oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFjckQsT0FBTyxFQUE4RCxLQUFLLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxIOztHQUVHO0FBQ0gsTUFBTSxXQUFXLGNBQWM7SUFDN0IsZ0NBQWdDO0lBQ2hDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsNkJBQTZCO0lBQzdCLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDZCx3Q0FBd0M7SUFDeEMsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLHNCQUFzQjtJQUN0QixNQUFNLEVBQUUsU0FBUyxHQUFHLFVBQVUsQ0FBQztDQUNoQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLGFBQWE7SUFDNUIsMkRBQTJEO0lBQzNELFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsOENBQThDO0lBQzlDLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDckIsMENBQTBDO0lBQzFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztJQUN6Qix1Q0FBdUM7SUFDdkMsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLDZCQUE2QjtJQUM3QixLQUFLLEVBQUUsTUFBTSxDQUFDO0NBQ2Y7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxzQkFBc0I7SUFDckMsK0JBQStCO0lBQy9CLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDakIsa0NBQWtDO0lBQ2xDLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsNEJBQTRCO0lBQzVCLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDdEIsK0JBQStCO0lBQy9CLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNwQiw2RkFBNkY7SUFDN0YsY0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDMUIsbUNBQW1DO0lBQ25DLE1BQU0sRUFBRSxlQUFlLENBQUM7Q0FDekI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyx5QkFBeUI7SUFDeEMsa0ZBQWdGO0lBQ2hGLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsY0FBYyxLQUFLLElBQUksQ0FBQztJQUN2RCxtRUFBbUU7SUFDbkUsb0JBQW9CLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxhQUFhLEtBQUssSUFBSSxDQUFDO0lBQ3hELDBDQUEwQztJQUMxQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUM7SUFDbEQsMkZBQXlGO0lBQ3pGLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQ3hEOzs7T0FHRztJQUNILFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDckU7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxxQkFBYSx1QkFBdUI7SUFNaEMsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsU0FBUztJQU5uQixPQUFPLENBQUMsZUFBZSxDQUFxQztJQUM1RCxPQUFPLENBQUMsY0FBYyxDQUFvQztJQUMxRCxPQUFPLENBQUMsR0FBRyxDQUFrQjtJQUU3QixZQUNVLE1BQU0sRUFBRSxzQkFBc0IsRUFDOUIsU0FBUyxFQUFFLHlCQUF5QixFQUc3QztJQUVELEtBQUssSUFBSSxJQUFJLENBSVo7SUFFRCxJQUFJLElBQUksSUFBSSxDQUVYO0lBRUQsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBa0J4QztJQUVELGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFdkM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FVeEM7SUFFRCxrQkFBa0IsSUFBSSxjQUFjLEVBQUUsQ0FFckM7SUFFRCxPQUFPLENBQUMsYUFBYSxDQUVuQjtZQUVZLGtCQUFrQjtJQStCaEMsT0FBTyxDQUFDLFVBQVU7SUFRbEIsT0FBTyxDQUFDLHNCQUFzQjtZQVNoQix3QkFBd0I7WUE2Q3hCLG1CQUFtQjtJQXNEakMsT0FBTyxDQUFDLFlBQVk7SUFNcEIsT0FBTyxDQUFDLFlBQVk7Q0FLckIifQ==