@partylayer/provider 0.5.1 → 0.5.2
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/index.d.mts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +48 -25
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +48 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event-bus.ts","../src/errors.ts","../src/error-map.ts","../src/method-router.ts","../src/async-wallet.ts","../src/provider.ts","../src/bridge.ts","../src/extension-channel.ts","../src/discovery.ts"],"names":["CIP0103_EVENTS","match"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * CIP-0103 Event Bus\n *\n * Minimal, spec-compliant event emitter.\n * - on() and removeListener() return the Provider (for chaining)\n * - emit() returns boolean (true if any listener was called)\n * - Listener errors are swallowed to prevent one handler from\n * breaking others\n */\n\nimport type { CIP0103Provider, CIP0103EventListener } from '@partylayer/core';\n\nexport class CIP0103EventBus {\n private listeners = new Map<string, Set<CIP0103EventListener>>();\n private owner: CIP0103Provider | null = null;\n\n /** Set the owning Provider instance (for chaining returns) */\n setOwner(owner: CIP0103Provider): void {\n this.owner = owner;\n }\n\n on<T = unknown>(\n event: string,\n listener: CIP0103EventListener<T>,\n ): CIP0103Provider {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener as CIP0103EventListener);\n return this.owner!;\n }\n\n emit<T = unknown>(event: string, ...args: T[]): boolean {\n const set = this.listeners.get(event);\n if (!set || set.size === 0) return false;\n\n for (const fn of set) {\n try {\n (fn as CIP0103EventListener<T>)(...args);\n } catch {\n // Swallow listener errors per spec behavior\n }\n }\n return true;\n }\n\n removeListener<T = unknown>(\n event: string,\n listenerToRemove: CIP0103EventListener<T>,\n ): CIP0103Provider {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listenerToRemove as CIP0103EventListener);\n if (set.size === 0) this.listeners.delete(event);\n }\n return this.owner!;\n }\n\n /** Remove all listeners, optionally scoped to a single event */\n removeAllListeners(event?: string): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /** Number of listeners for a given event */\n listenerCount(event: string): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","/**\n * CIP-0103 / EIP-1193 / EIP-1474 Error Model\n *\n * All errors on the Provider surface MUST be ProviderRpcError instances\n * with numeric codes. No PartyLayer string-based ErrorCode is ever exposed.\n *\n * Reference: https://eips.ethereum.org/EIPS/eip-1193\n * Reference: https://eips.ethereum.org/EIPS/eip-1474\n */\n\n// ─── ProviderRpcError ────────────────────────────────────────────────────────\n\nexport class ProviderRpcError extends Error {\n public readonly code: number;\n public readonly data?: unknown;\n\n constructor(message: string, code: number, data?: unknown) {\n super(message);\n this.name = 'ProviderRpcError';\n this.code = code;\n this.data = data;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ProviderRpcError);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n data: this.data,\n };\n }\n}\n\n// ─── EIP-1193 Standard Error Codes ──────────────────────────────────────────\n\nexport const RPC_ERRORS = {\n /** User rejected the request */\n USER_REJECTED: 4001,\n /** The requested method/account is not authorized */\n UNAUTHORIZED: 4100,\n /** Provider does not support the requested method */\n UNSUPPORTED_METHOD: 4200,\n /** Provider is disconnected from all chains */\n DISCONNECTED: 4900,\n /** Provider is not connected to the requested chain */\n CHAIN_DISCONNECTED: 4901,\n} as const;\n\n// ─── EIP-1474 JSON-RPC Error Codes ─────────────────────────────────────────\n\nexport const JSON_RPC_ERRORS = {\n /** Invalid JSON (parse error) */\n PARSE_ERROR: -32700,\n /** Invalid request object */\n INVALID_REQUEST: -32600,\n /** Method not found */\n METHOD_NOT_FOUND: -32601,\n /** Invalid method parameters */\n INVALID_PARAMS: -32602,\n /** Internal JSON-RPC error */\n INTERNAL_ERROR: -32603,\n /** Invalid input / missing or invalid parameters */\n INVALID_INPUT: -32000,\n /** Resource not found */\n RESOURCE_NOT_FOUND: -32001,\n /** Resource unavailable */\n RESOURCE_UNAVAILABLE: -32002,\n /** Transaction rejected */\n TRANSACTION_REJECTED: -32003,\n /** Method not supported */\n METHOD_NOT_SUPPORTED: -32004,\n /** Rate limit exceeded */\n RATE_LIMIT_EXCEEDED: -32005,\n} as const;\n\n// ─── Convenience Constructors ───────────────────────────────────────────────\n\nexport function userRejected(\n message = 'User Rejected Request',\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, RPC_ERRORS.USER_REJECTED, data);\n}\n\nexport function unauthorized(\n message = 'Unauthorized',\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, RPC_ERRORS.UNAUTHORIZED, data);\n}\n\nexport function unsupportedMethod(method: string): ProviderRpcError {\n return new ProviderRpcError(\n `Unsupported Method: \"${method}\"`,\n RPC_ERRORS.UNSUPPORTED_METHOD,\n { method },\n );\n}\n\nexport function disconnected(\n message = 'Disconnected',\n): ProviderRpcError {\n return new ProviderRpcError(message, RPC_ERRORS.DISCONNECTED);\n}\n\nexport function chainDisconnected(\n message = 'Chain Disconnected',\n): ProviderRpcError {\n return new ProviderRpcError(message, RPC_ERRORS.CHAIN_DISCONNECTED);\n}\n\nexport function internalError(\n message: string,\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.INTERNAL_ERROR, data);\n}\n\nexport function invalidParams(\n message: string,\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.INVALID_PARAMS, data);\n}\n\nexport function methodNotFound(method: string): ProviderRpcError {\n return new ProviderRpcError(\n `Method not found: \"${method}\"`,\n JSON_RPC_ERRORS.METHOD_NOT_FOUND,\n { method },\n );\n}\n\nexport function resourceNotFound(\n message: string,\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.RESOURCE_NOT_FOUND, data);\n}\n\nexport function resourceUnavailable(\n message: string,\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.RESOURCE_UNAVAILABLE, data);\n}\n\nexport function transactionRejected(\n message = 'Transaction rejected',\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.TRANSACTION_REJECTED, data);\n}\n","/**\n * Bidirectional error mapping between PartyLayer ErrorCode and CIP-0103 numeric codes\n *\n * This module ensures no PartyLayer internals leak through the Provider surface,\n * and provides a reverse path for the bridge.\n */\n\nimport { PartyLayerError, type ErrorCode } from '@partylayer/core';\nimport { ProviderRpcError, RPC_ERRORS, JSON_RPC_ERRORS } from './errors';\n\n// ─── PartyLayer ErrorCode → CIP-0103 numeric code ──────────────────────────\n\nconst ERROR_CODE_TO_RPC: Record<ErrorCode, number> = {\n USER_REJECTED: RPC_ERRORS.USER_REJECTED,\n WALLET_NOT_FOUND: JSON_RPC_ERRORS.RESOURCE_NOT_FOUND,\n // Client-side config gap (the walletId refers to an unwired discovery adapter),\n // not a missing resource → INVALID_PARAMS, distinct from WALLET_NOT_FOUND.\n ADAPTER_NOT_REGISTERED: JSON_RPC_ERRORS.INVALID_PARAMS,\n WALLET_NOT_INSTALLED: JSON_RPC_ERRORS.RESOURCE_UNAVAILABLE,\n ORIGIN_NOT_ALLOWED: RPC_ERRORS.UNAUTHORIZED,\n SESSION_EXPIRED: RPC_ERRORS.DISCONNECTED,\n CAPABILITY_NOT_SUPPORTED: RPC_ERRORS.UNSUPPORTED_METHOD,\n TRANSPORT_ERROR: JSON_RPC_ERRORS.INTERNAL_ERROR,\n REGISTRY_FETCH_FAILED: JSON_RPC_ERRORS.RESOURCE_UNAVAILABLE,\n REGISTRY_VERIFICATION_FAILED: JSON_RPC_ERRORS.INTERNAL_ERROR,\n REGISTRY_SCHEMA_INVALID: JSON_RPC_ERRORS.INTERNAL_ERROR,\n INTERNAL_ERROR: JSON_RPC_ERRORS.INTERNAL_ERROR,\n NETWORK_MISMATCH: JSON_RPC_ERRORS.INVALID_INPUT,\n TIMEOUT: JSON_RPC_ERRORS.INVALID_INPUT,\n // Traffic allowance exhausted maps to the spec's limit-exceeded code. CIP-0103's\n // own table lists -32005 as the limit exceeded semantic; it was defined but unused\n // until now, so no proprietary code is introduced.\n INSUFFICIENT_TRAFFIC: JSON_RPC_ERRORS.RATE_LIMIT_EXCEEDED,\n};\n\n// ─── CIP-0103 numeric code → PartyLayer ErrorCode (best-effort reverse) ────\n\nconst RPC_TO_ERROR_CODE: Partial<Record<number, ErrorCode>> = {\n [RPC_ERRORS.USER_REJECTED]: 'USER_REJECTED',\n [RPC_ERRORS.UNAUTHORIZED]: 'ORIGIN_NOT_ALLOWED',\n [RPC_ERRORS.UNSUPPORTED_METHOD]: 'CAPABILITY_NOT_SUPPORTED',\n [RPC_ERRORS.DISCONNECTED]: 'SESSION_EXPIRED',\n [RPC_ERRORS.CHAIN_DISCONNECTED]: 'TRANSPORT_ERROR',\n [JSON_RPC_ERRORS.INTERNAL_ERROR]: 'INTERNAL_ERROR',\n [JSON_RPC_ERRORS.METHOD_NOT_FOUND]: 'CAPABILITY_NOT_SUPPORTED',\n [JSON_RPC_ERRORS.RESOURCE_NOT_FOUND]: 'WALLET_NOT_FOUND',\n [JSON_RPC_ERRORS.RESOURCE_UNAVAILABLE]: 'WALLET_NOT_INSTALLED',\n [JSON_RPC_ERRORS.TRANSACTION_REJECTED]: 'USER_REJECTED',\n [JSON_RPC_ERRORS.INVALID_INPUT]: 'TIMEOUT',\n [JSON_RPC_ERRORS.RATE_LIMIT_EXCEEDED]: 'INSUFFICIENT_TRAFFIC',\n};\n\n/**\n * Convert any error into a ProviderRpcError for the CIP-0103 surface.\n *\n * This is the single normalization point — every error that escapes\n * the Provider MUST pass through this function.\n */\nexport function toProviderRpcError(err: unknown): ProviderRpcError {\n // Already a ProviderRpcError — pass through\n if (err instanceof ProviderRpcError) {\n return err;\n }\n\n // PartyLayerError — map code\n if (err instanceof PartyLayerError) {\n const code = ERROR_CODE_TO_RPC[err.code] ?? JSON_RPC_ERRORS.INTERNAL_ERROR;\n return new ProviderRpcError(err.message, code, {\n originalCode: err.code,\n details: err.details,\n });\n }\n\n // RPC-shaped error from a wallet provider (has numeric code)\n if (isRpcShaped(err)) {\n return new ProviderRpcError(err.message, err.code, err.data);\n }\n\n // Standard Error\n if (err instanceof Error) {\n return new ProviderRpcError(err.message, JSON_RPC_ERRORS.INTERNAL_ERROR);\n }\n\n // Unknown\n return new ProviderRpcError(String(err), JSON_RPC_ERRORS.INTERNAL_ERROR);\n}\n\n/**\n * Convert ProviderRpcError back to a PartyLayerError.\n *\n * Used by the bridge path when errors from the Provider surface\n * need to flow back into the PartyLayerClient world.\n */\nexport function toPartyLayerError(err: ProviderRpcError): PartyLayerError {\n const code = RPC_TO_ERROR_CODE[err.code] ?? 'INTERNAL_ERROR';\n return new PartyLayerError(err.message, code, {\n details: { rpcCode: err.code, data: err.data },\n });\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction isRpcShaped(\n err: unknown,\n): err is { message: string; code: number; data?: unknown } {\n if (typeof err !== 'object' || err === null) return false;\n const e = err as Record<string, unknown>;\n return typeof e.message === 'string' && typeof e.code === 'number';\n}\n","/**\n * CIP-0103 Method Router\n *\n * Routes request({ method, params }) calls to the correct handler function.\n * By default, all 10 mandatory CIP-0103 methods are registered as passthrough\n * handlers that delegate to the native wallet Provider.\n *\n * Forward-compatible: unknown methods are passed through to the wallet provider\n * rather than rejected, allowing support for future CIP extensions.\n */\n\nimport type {\n CIP0103Provider,\n CIP0103RequestPayload,\n CIP0103RequestParams,\n} from '@partylayer/core';\nimport { unsupportedMethod, disconnected } from './errors';\nimport { toProviderRpcError } from './error-map';\n\nexport type MethodHandler<T = unknown> = (\n walletProvider: CIP0103Provider,\n params?: CIP0103RequestParams,\n) => Promise<T>;\n\nexport class MethodRouter {\n private handlers = new Map<string, MethodHandler>();\n private walletProvider: CIP0103Provider | null = null;\n\n constructor() {\n this.registerDefaults();\n }\n\n /** Set / swap the underlying native wallet provider */\n setWalletProvider(provider: CIP0103Provider | null): void {\n this.walletProvider = provider;\n }\n\n /** Get the current wallet provider */\n getWalletProvider(): CIP0103Provider | null {\n return this.walletProvider;\n }\n\n /** Register (or override) a handler for a method name */\n register<T>(method: string, handler: MethodHandler<T>): void {\n this.handlers.set(method, handler as MethodHandler);\n }\n\n /** Route a request to the appropriate handler */\n async route<T>(payload: CIP0103RequestPayload): Promise<T> {\n const { method, params } = payload;\n\n const handler = this.handlers.get(method);\n\n if (!handler) {\n // Forward-compatible: pass unknown methods through to the wallet provider\n if (this.walletProvider) {\n try {\n return await this.walletProvider.request<T>(payload);\n } catch (err) {\n throw toProviderRpcError(err);\n }\n }\n throw unsupportedMethod(method);\n }\n\n // connect and isConnected can operate without a wallet provider\n if (!this.walletProvider && method !== 'connect' && method !== 'isConnected') {\n throw disconnected('No wallet provider connected');\n }\n\n try {\n return (await handler(this.walletProvider!, params)) as T;\n } catch (err) {\n throw toProviderRpcError(err);\n }\n }\n\n /** Check whether a handler is registered for a given method */\n hasHandler(method: string): boolean {\n return this.handlers.has(method);\n }\n\n // ─── Default passthrough handlers ───────────────────────────────────────\n\n private registerDefaults(): void {\n const passthrough = (method: string): MethodHandler => {\n return async (wp, params) => {\n return wp.request({ method, params });\n };\n };\n\n this.register('connect', passthrough('connect'));\n this.register('disconnect', passthrough('disconnect'));\n this.register('isConnected', passthrough('isConnected'));\n this.register('status', passthrough('status'));\n this.register('getActiveNetwork', passthrough('getActiveNetwork'));\n this.register('listAccounts', passthrough('listAccounts'));\n this.register('getPrimaryAccount', passthrough('getPrimaryAccount'));\n this.register('signMessage', passthrough('signMessage'));\n this.register('prepareExecute', passthrough('prepareExecute'));\n this.register('ledgerApi', passthrough('ledgerApi'));\n }\n}\n","/**\n * Async Wallet Handling\n *\n * CIP-0103 async wallet extensions allow methods like `connect` and\n * `prepareExecute` to return a `{ userUrl }` instead of completing\n * synchronously. The user must visit the URL (e.g., mobile wallet\n * approval screen), and the wallet provider emits an event when the\n * operation completes.\n *\n * This module provides helpers that abstract the wait-for-event pattern\n * so the Provider implementation can offer a unified surface to dApps.\n */\n\nimport type {\n CIP0103Provider,\n CIP0103ConnectResult,\n CIP0103TxChangedEvent,\n CIP0103TxStatus,\n} from '@partylayer/core';\nimport { CIP0103_EVENTS } from '@partylayer/core';\nimport { ProviderRpcError, JSON_RPC_ERRORS } from './errors';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface AsyncConnectOptions {\n /** Timeout for waiting for the async connect event (ms) */\n timeoutMs?: number;\n /** Callback when userUrl is available (for UI to redirect / show QR) */\n onUserUrl?: (url: string) => void;\n}\n\nexport interface AsyncPrepareExecuteOptions {\n timeoutMs?: number;\n onUserUrl?: (url: string) => void;\n}\n\n// ─── Async Connect ──────────────────────────────────────────────────────────\n\n/**\n * Handle an async connect flow:\n *\n * 1. If connectResult is already isConnected (sync wallet), return immediately.\n * 2. If connectResult has userUrl, invoke onUserUrl callback for UI.\n * 3. Wait for 'connected' event from the wallet provider.\n * 4. Return the final ConnectResult.\n */\nexport async function handleAsyncConnect(\n walletProvider: CIP0103Provider,\n connectResult: CIP0103ConnectResult,\n options: AsyncConnectOptions = {},\n): Promise<CIP0103ConnectResult> {\n // Sync wallet — already connected\n if (connectResult.isConnected && !connectResult.userUrl) {\n return connectResult;\n }\n\n // Notify UI of the userUrl\n if (connectResult.userUrl) {\n options.onUserUrl?.(connectResult.userUrl);\n }\n\n const timeoutMs = options.timeoutMs ?? 300_000; // 5-minute default\n\n return new Promise<CIP0103ConnectResult>((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n walletProvider.removeListener(CIP0103_EVENTS.CONNECTED, onConnected);\n reject(\n new ProviderRpcError(\n 'Async connect timed out',\n JSON_RPC_ERRORS.INVALID_INPUT,\n { timeoutMs },\n ),\n );\n }\n }, timeoutMs);\n\n const onConnected = (result: CIP0103ConnectResult) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n walletProvider.removeListener(CIP0103_EVENTS.CONNECTED, onConnected);\n resolve(result);\n }\n };\n\n walletProvider.on(CIP0103_EVENTS.CONNECTED, onConnected);\n });\n}\n\n// ─── Async PrepareExecute ───────────────────────────────────────────────────\n\nconst TERMINAL_TX_STATUSES: CIP0103TxStatus[] = ['executed', 'failed'];\n\n/**\n * Handle an async prepareExecute flow:\n *\n * 1. If result has userUrl, invoke onUserUrl callback for UI.\n * 2. Wait for 'txChanged' event with matching commandId.\n * 3. Return when txChanged reaches a terminal state (executed / failed).\n */\nexport async function handleAsyncPrepareExecute(\n walletProvider: CIP0103Provider,\n commandId: string,\n userUrl: string | undefined,\n options: AsyncPrepareExecuteOptions = {},\n): Promise<CIP0103TxChangedEvent> {\n if (userUrl) {\n options.onUserUrl?.(userUrl);\n }\n\n const timeoutMs = options.timeoutMs ?? 300_000;\n\n return new Promise<CIP0103TxChangedEvent>((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n walletProvider.removeListener(CIP0103_EVENTS.TX_CHANGED, onTxChanged);\n reject(\n new ProviderRpcError(\n 'Async prepareExecute timed out',\n JSON_RPC_ERRORS.INVALID_INPUT,\n { commandId, timeoutMs },\n ),\n );\n }\n }, timeoutMs);\n\n const onTxChanged = (event: CIP0103TxChangedEvent) => {\n // Ignore events for other commands\n if (event.commandId !== commandId) return;\n\n if (TERMINAL_TX_STATUSES.includes(event.status)) {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n walletProvider.removeListener(\n CIP0103_EVENTS.TX_CHANGED,\n onTxChanged,\n );\n\n if (event.status === 'failed') {\n reject(\n new ProviderRpcError(\n 'Transaction failed',\n JSON_RPC_ERRORS.TRANSACTION_REJECTED,\n { commandId },\n ),\n );\n } else {\n resolve(event);\n }\n }\n }\n };\n\n walletProvider.on(CIP0103_EVENTS.TX_CHANGED, onTxChanged);\n });\n}\n","/**\n * PartyLayerProvider — CIP-0103 Native Provider Implementation\n *\n * This is the core Provider class. It wraps a single native CIP-0103\n * wallet provider and adds:\n *\n * - Method routing with orchestrated overrides (connect, disconnect, etc.)\n * - Event forwarding from the native wallet to the dApp\n * - Async wallet support (userUrl flows)\n * - Error normalization to ProviderRpcError\n * - Forward compatibility for unknown methods and events\n *\n * IMPORTANT: No wallet-specific logic lives here. The Provider is purely\n * a router and normalizer.\n */\n\nimport type {\n CIP0103Provider,\n CIP0103RequestPayload,\n CIP0103EventListener,\n CIP0103ConnectResult,\n CIP0103StatusEvent,\n} from '@partylayer/core';\nimport { CIP0103_EVENTS } from '@partylayer/core';\nimport { CIP0103EventBus } from './event-bus';\nimport { MethodRouter } from './method-router';\nimport { handleAsyncConnect } from './async-wallet';\nimport type { DiscoveredProvider } from './discovery';\n\n// ─── Configuration ──────────────────────────────────────────────────────────\n\nexport interface PartyLayerProviderOptions {\n /** Discovered wallet provider to wrap */\n walletProvider?: DiscoveredProvider;\n /** Timeout for async operations (ms). Default 300_000 (5 min). */\n asyncTimeoutMs?: number;\n /** Callback when a userUrl is available (for async wallets) */\n onUserUrl?: (url: string) => void;\n}\n\n// ─── Provider ───────────────────────────────────────────────────────────────\n\nexport class PartyLayerProvider implements CIP0103Provider {\n private readonly eventBus: CIP0103EventBus;\n private readonly router: MethodRouter;\n private readonly options: PartyLayerProviderOptions;\n private nativeProvider: CIP0103Provider | null;\n private connected = false;\n\n /** Event forwarders from the native provider, keyed by event name */\n private nativeForwarders = new Map<string, CIP0103EventListener>();\n\n constructor(options: PartyLayerProviderOptions = {}) {\n this.options = options;\n this.eventBus = new CIP0103EventBus();\n this.eventBus.setOwner(this);\n this.router = new MethodRouter();\n\n this.nativeProvider = options.walletProvider?.provider ?? null;\n\n if (this.nativeProvider) {\n this.router.setWalletProvider(this.nativeProvider);\n this.forwardNativeEvents();\n }\n\n // Override default passthrough handlers with orchestrated versions\n this.registerOrchestratedMethods();\n }\n\n // ─── CIP-0103 Provider Interface ─────────────────────────────────────────\n\n async request<T = unknown>(args: CIP0103RequestPayload): Promise<T> {\n return this.router.route<T>(args);\n }\n\n on<T = unknown>(\n event: string,\n listener: CIP0103EventListener<T>,\n ): this {\n this.eventBus.on(event, listener);\n return this;\n }\n\n emit<T = unknown>(event: string, ...args: T[]): boolean {\n return this.eventBus.emit(event, ...args);\n }\n\n removeListener<T = unknown>(\n event: string,\n listenerToRemove: CIP0103EventListener<T>,\n ): this {\n this.eventBus.removeListener(event, listenerToRemove);\n return this;\n }\n\n // ─── Public Management ────────────────────────────────────────────────────\n\n /** Whether the provider is currently in a connected state */\n get isConnected(): boolean {\n return this.connected;\n }\n\n /** Switch the underlying wallet provider (e.g. user selects a different wallet) */\n setWalletProvider(discovered: DiscoveredProvider): void {\n this.unforwardNativeEvents();\n\n this.nativeProvider = discovered.provider;\n this.router.setWalletProvider(this.nativeProvider);\n this.forwardNativeEvents();\n }\n\n /** Get the currently attached native provider (if any) */\n getNativeProvider(): CIP0103Provider | null {\n return this.nativeProvider;\n }\n\n /** Tear down: unsubscribe all events and release the native provider */\n destroy(): void {\n this.unforwardNativeEvents();\n this.eventBus.removeAllListeners();\n this.nativeProvider = null;\n this.router.setWalletProvider(null);\n this.connected = false;\n }\n\n // ─── Orchestrated Method Overrides ────────────────────────────────────────\n\n private registerOrchestratedMethods(): void {\n // connect: handle async wallets, emit statusChanged\n this.router.register<CIP0103ConnectResult>(\n 'connect',\n async (wp, params) => {\n const result = await wp.request<CIP0103ConnectResult>({\n method: 'connect',\n params,\n });\n\n // Handle async wallet flow (userUrl returned, not yet connected)\n if (result.userUrl && !result.isConnected) {\n const final = await handleAsyncConnect(wp, result, {\n timeoutMs: this.options.asyncTimeoutMs,\n onUserUrl: this.options.onUserUrl,\n });\n this.connected = final.isConnected;\n this.emitStatusChanged();\n return final;\n }\n\n this.connected = result.isConnected;\n this.emitStatusChanged();\n return result;\n },\n );\n\n // disconnect: update state, emit statusChanged\n this.router.register<void>('disconnect', async (wp, params) => {\n await wp.request<void>({ method: 'disconnect', params });\n this.connected = false;\n this.emitStatusChanged();\n });\n\n // isConnected: can work without a wallet provider\n this.router.register<CIP0103ConnectResult>(\n 'isConnected',\n async (wp, params) => {\n if (!wp) {\n return {\n isConnected: false,\n reason: 'No wallet provider connected',\n };\n }\n return wp.request<CIP0103ConnectResult>({\n method: 'isConnected',\n params,\n });\n },\n );\n\n // prepareExecute: the wallet provider MUST emit txChanged per spec.\n // We forward those events through our event bus (via forwardNativeEvents).\n // This handler just passes through to the wallet.\n this.router.register('prepareExecute', async (wp, params) => {\n return wp.request({ method: 'prepareExecute', params });\n });\n }\n\n // ─── Native Event Forwarding ──────────────────────────────────────────────\n\n private forwardNativeEvents(): void {\n if (!this.nativeProvider) return;\n\n const eventsToForward = [\n CIP0103_EVENTS.STATUS_CHANGED,\n CIP0103_EVENTS.ACCOUNTS_CHANGED,\n CIP0103_EVENTS.TX_CHANGED,\n CIP0103_EVENTS.CONNECTED,\n ];\n\n for (const event of eventsToForward) {\n const forwarder: CIP0103EventListener = (...args: unknown[]) => {\n this.eventBus.emit(event, ...args);\n };\n this.nativeForwarders.set(event, forwarder);\n this.nativeProvider.on(event, forwarder);\n }\n }\n\n private unforwardNativeEvents(): void {\n if (!this.nativeProvider) return;\n for (const [event, forwarder] of this.nativeForwarders) {\n this.nativeProvider.removeListener(event, forwarder);\n }\n this.nativeForwarders.clear();\n }\n\n // ─── Helpers ──────────────────────────────────────────────────────────────\n\n /** Emit statusChanged by querying the current wallet provider status */\n private async emitStatusChanged(): Promise<void> {\n if (!this.nativeProvider) return;\n try {\n const status = await this.nativeProvider.request<CIP0103StatusEvent>({\n method: 'status',\n });\n this.eventBus.emit(CIP0103_EVENTS.STATUS_CHANGED, status);\n } catch {\n // Best-effort: status emission should not break the connect flow\n }\n }\n}\n","/**\n * PartyLayerClient → CIP-0103 Provider Bridge\n *\n * Creates a CIP-0103-compliant Provider backed by an existing\n * PartyLayerClient instance. This is the backward-compatibility path:\n * existing dApps using PartyLayerClient can obtain a standard Provider\n * without rewiring their wallet adapter stack.\n *\n * Usage:\n * const provider = createProviderBridge(client);\n * // or (added to PartyLayerClient):\n * const provider = client.asProvider();\n */\n\nimport type {\n CIP0103Provider,\n CIP0103RequestPayload,\n CIP0103RequestParams,\n CIP0103EventListener,\n CIP0103ConnectResult,\n CIP0103StatusEvent,\n CIP0103Account,\n CIP0103Network,\n CIP0103TxChangedEvent,\n CIP0103TxStatus,\n CIP0103LedgerApiResponse,\n LedgerApiMethod,\n} from '@partylayer/core';\nimport { CIP0103_EVENTS } from '@partylayer/core';\nimport { CIP0103EventBus } from './event-bus';\nimport { unsupportedMethod, disconnected } from './errors';\nimport { toProviderRpcError } from './error-map';\nimport { toCAIP2Network } from './network';\n\n/** Injected at build time by tsup from package.json version */\ndeclare const __PROVIDER_VERSION__: string;\nconst PROVIDER_VERSION = typeof __PROVIDER_VERSION__ !== 'undefined'\n ? __PROVIDER_VERSION__\n : '0.1.0';\n\n// ─── Bridge Client Interface ────────────────────────────────────────────────\n\n/**\n * Minimal interface for the PartyLayerClient consumed by the bridge.\n * Using an interface avoids importing the full SDK (prevents circular deps).\n */\nexport interface BridgeableClient {\n connect(options?: unknown): Promise<{\n sessionId: unknown;\n walletId: unknown;\n partyId: unknown;\n network: string;\n expiresAt?: number;\n capabilitiesSnapshot?: string[];\n }>;\n disconnect(): Promise<void>;\n getActiveSession(): Promise<{\n sessionId: unknown;\n walletId: unknown;\n partyId: unknown;\n network: string;\n expiresAt?: number;\n capabilitiesSnapshot?: string[];\n } | null>;\n signMessage(params: {\n message: string;\n nonce?: string;\n domain?: string;\n }): Promise<{ signature: unknown }>;\n signTransaction(params: { tx: unknown }): Promise<{\n transactionHash: unknown;\n signedTx?: unknown;\n partyId?: unknown;\n }>;\n submitTransaction(params: {\n signedTx: unknown;\n }): Promise<{\n transactionHash: unknown;\n submittedAt?: number;\n commandId?: string;\n updateId?: string;\n }>;\n ledgerApi?(params: {\n requestMethod: string;\n resource: string;\n body?: string | Record<string, unknown>;\n }): Promise<{ response: string }>;\n getRegistryStatus(): unknown;\n on(event: string, handler: (event: unknown) => void | Promise<void>): () => void;\n}\n\n// ─── Bridge Factory ─────────────────────────────────────────────────────────\n\n/**\n * Create a CIP-0103 Provider backed by a PartyLayerClient.\n *\n * All `request()` calls are mapped to PartyLayerClient methods.\n * PartyLayer events are forwarded as CIP-0103 events.\n */\nexport function createProviderBridge(client: BridgeableClient): CIP0103Provider {\n const eventBus = new CIP0103EventBus();\n // Track commandIds that already emitted 'pending' to avoid double-emission\n const pendingEmitted = new Set<string>();\n\n const bridge: CIP0103Provider = {\n async request<T>(args: CIP0103RequestPayload): Promise<T> {\n return handleRequest(client, args, eventBus, pendingEmitted) as Promise<T>;\n },\n on<T>(event: string, listener: CIP0103EventListener<T>): CIP0103Provider {\n eventBus.on(event, listener);\n return bridge;\n },\n emit<T>(event: string, ...args: T[]): boolean {\n return eventBus.emit(event, ...args);\n },\n removeListener<T>(\n event: string,\n listener: CIP0103EventListener<T>,\n ): CIP0103Provider {\n eventBus.removeListener(event, listener);\n return bridge;\n },\n };\n\n eventBus.setOwner(bridge);\n wireEvents(client, eventBus, pendingEmitted);\n\n return bridge;\n}\n\n// ─── Request Handler ────────────────────────────────────────────────────────\n\nasync function handleRequest(\n client: BridgeableClient,\n args: CIP0103RequestPayload,\n eventBus: CIP0103EventBus,\n pendingEmitted: Set<string>,\n): Promise<unknown> {\n const { method, params } = args;\n\n try {\n switch (method) {\n case 'connect': {\n await client.connect();\n return {\n isConnected: true,\n } satisfies CIP0103ConnectResult;\n }\n\n case 'disconnect': {\n await client.disconnect();\n return undefined;\n }\n\n case 'isConnected': {\n const session = await client.getActiveSession();\n return {\n isConnected: session !== null,\n reason: session ? undefined : 'No active session',\n } satisfies CIP0103ConnectResult;\n }\n\n case 'status': {\n const session = await client.getActiveSession();\n return {\n connection: {\n isConnected: session !== null,\n },\n provider: {\n id: 'partylayer',\n version: PROVIDER_VERSION,\n providerType: 'browser',\n },\n network: session\n ? toCAIP2Network(session.network)\n : undefined,\n session: session\n ? {\n accessToken: '',\n userId: String(session.partyId),\n }\n : undefined,\n } satisfies CIP0103StatusEvent;\n }\n\n case 'getActiveNetwork': {\n const session = await client.getActiveSession();\n return toCAIP2Network(\n session?.network ?? 'devnet',\n ) satisfies CIP0103Network;\n }\n\n case 'listAccounts': {\n const session = await client.getActiveSession();\n if (!session) return [] as CIP0103Account[];\n return [\n sessionToAccount(session),\n ] satisfies CIP0103Account[];\n }\n\n case 'getPrimaryAccount': {\n const session = await client.getActiveSession();\n if (!session) throw disconnected('No active session');\n return sessionToAccount(session) satisfies CIP0103Account;\n }\n\n case 'signMessage': {\n const p = normalizeParams(params);\n const result = await client.signMessage({\n message: String(p.message ?? ''),\n nonce: p.nonce ? String(p.nonce) : undefined,\n domain: p.domain ? String(p.domain) : undefined,\n });\n return String(result.signature);\n }\n\n case 'prepareExecute': {\n const p = normalizeParams(params);\n const cmdId = `cmd_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n\n // 1. Emit 'pending'\n pendingEmitted.add(cmdId);\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'pending',\n commandId: cmdId,\n } as CIP0103TxChangedEvent);\n\n // 2. Sign transaction\n try {\n const signResult = await client.signTransaction({ tx: p });\n\n // 3. Emit 'signed' with signature metadata\n const session = await client.getActiveSession();\n const partyId = String(signResult.partyId ?? session?.partyId ?? 'unknown');\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'signed',\n commandId: cmdId,\n payload: {\n signature: String(signResult.transactionHash),\n signedBy: partyId,\n party: partyId,\n },\n } as CIP0103TxChangedEvent);\n\n // 4. Submit transaction\n try {\n const receipt = await client.submitTransaction({\n signedTx: signResult.signedTx ?? signResult.transactionHash,\n });\n\n // 5. Emit 'executed' with real receipt data\n pendingEmitted.delete(cmdId);\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'executed',\n commandId: cmdId,\n payload: {\n updateId: receipt.updateId ?? receipt.commandId ?? String(receipt.transactionHash),\n completionOffset: 0,\n },\n } as CIP0103TxChangedEvent);\n } catch (submitErr) {\n pendingEmitted.delete(cmdId);\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'failed',\n commandId: cmdId,\n } as CIP0103TxChangedEvent);\n throw submitErr;\n }\n } catch (signErr) {\n // Only emit 'failed' if not already emitted by submit catch above\n if (pendingEmitted.has(cmdId)) {\n pendingEmitted.delete(cmdId);\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'failed',\n commandId: cmdId,\n } as CIP0103TxChangedEvent);\n }\n throw signErr;\n }\n\n return undefined;\n }\n\n case 'ledgerApi': {\n if (!client.ledgerApi) {\n throw unsupportedMethod('ledgerApi');\n }\n const p = normalizeParams(params);\n const result = await client.ledgerApi({\n // Forward the verb case AND the body type (string OR object) UNCHANGED;\n // the active wallet's adapter normalizes to its required shape\n // (lower+object for CIP-0103, string for Loop/Bron). Do NOT String()\n // the body — that would turn an object into \"[object Object]\".\n requestMethod: String(p.requestMethod ?? 'get') as LedgerApiMethod,\n resource: String(p.resource ?? ''),\n body: (p.body ?? undefined) as string | Record<string, unknown> | undefined,\n });\n return result satisfies CIP0103LedgerApiResponse;\n }\n\n default:\n throw unsupportedMethod(method);\n }\n } catch (err) {\n throw toProviderRpcError(err);\n }\n}\n\n// ─── Event Wiring ───────────────────────────────────────────────────────────\n\n/**\n * Wire PartyLayer SDK events to CIP-0103 events.\n *\n * Direction: PartyLayerClient → CIP-0103 Provider (one-way only).\n * The bridge does NOT inject CIP-0103 events back into the client,\n * preventing circular event loops.\n */\nfunction wireEvents(\n client: BridgeableClient,\n eventBus: CIP0103EventBus,\n pendingEmitted: Set<string>,\n): void {\n // session:connected → statusChanged + accountsChanged\n client.on('session:connected', (event: unknown) => {\n const e = event as { type: string; session: BridgeableClient extends { getActiveSession(): Promise<infer S> } ? NonNullable<S> : never };\n if (!e || typeof e !== 'object' || !('session' in e)) return;\n const session = (e as { session: { partyId: unknown; network: string; expiresAt?: number; hasPreapproval?: boolean; utilityPreapprovalAdmins?: string[] } }).session;\n\n eventBus.emit(CIP0103_EVENTS.STATUS_CHANGED, {\n connection: { isConnected: true },\n provider: {\n id: 'partylayer',\n version: PROVIDER_VERSION,\n providerType: 'browser',\n },\n network: toCAIP2Network(session.network),\n session: {\n accessToken: '',\n userId: String(session.partyId),\n },\n } satisfies CIP0103StatusEvent);\n\n eventBus.emit(CIP0103_EVENTS.ACCOUNTS_CHANGED, [\n {\n primary: true,\n partyId: String(session.partyId),\n status: 'allocated' as const,\n hint: '',\n publicKey: '',\n namespace: '',\n networkId: toCAIP2Network(session.network).networkId,\n signingProviderId: '',\n // Fund-safety passthrough, present only when the wallet reported it.\n hasPreapproval: session.hasPreapproval,\n utilityPreapprovalAdmins: session.utilityPreapprovalAdmins,\n },\n ] satisfies CIP0103Account[]);\n\n // Emit CIP-0103 'connected' event (async wallet completion signal)\n eventBus.emit(CIP0103_EVENTS.CONNECTED, {\n isConnected: true,\n } satisfies CIP0103ConnectResult);\n });\n\n // session:disconnected → statusChanged\n client.on('session:disconnected', () => {\n eventBus.emit(CIP0103_EVENTS.STATUS_CHANGED, {\n connection: { isConnected: false },\n provider: {\n id: 'partylayer',\n version: PROVIDER_VERSION,\n providerType: 'browser',\n },\n } satisfies CIP0103StatusEvent);\n });\n\n // tx:status → txChanged\n client.on('tx:status', (event: unknown) => {\n const e = event as {\n type: string;\n status: string;\n txId: unknown;\n raw?: unknown;\n };\n if (!e || typeof e !== 'object' || !('status' in e)) return;\n\n const statusMap: Record<string, CIP0103TxStatus> = {\n pending: 'pending',\n submitted: 'pending',\n signed: 'signed',\n committed: 'executed',\n rejected: 'failed',\n failed: 'failed',\n };\n\n const mappedStatus = statusMap[e.status] ?? 'pending';\n const commandId = String(e.txId);\n\n // Deduplicate: skip 'pending' if already emitted by prepareExecute handler\n if (mappedStatus === 'pending' && pendingEmitted.has(commandId)) {\n return;\n }\n\n // Clean up dedup tracking on terminal states\n if (mappedStatus === 'executed' || mappedStatus === 'failed') {\n pendingEmitted.delete(commandId);\n }\n\n // Build spec-compliant txChanged payload per CIP-0103 discriminated union\n let txEvent: CIP0103TxChangedEvent;\n switch (mappedStatus) {\n case 'signed':\n txEvent = {\n status: 'signed',\n commandId,\n payload: {\n signature: '',\n signedBy: '',\n party: '',\n },\n };\n break;\n case 'executed': {\n const raw = e.raw as { updateId?: string; commandId?: string } | undefined;\n txEvent = {\n status: 'executed',\n commandId,\n payload: {\n updateId: raw?.updateId ?? raw?.commandId ?? commandId,\n completionOffset: 0,\n },\n };\n break;\n }\n case 'failed':\n txEvent = { status: 'failed', commandId };\n break;\n default:\n txEvent = { status: 'pending', commandId };\n break;\n }\n\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, txEvent);\n });\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction normalizeParams(\n params?: CIP0103RequestParams,\n): Record<string, unknown> {\n if (!params) return {};\n if (Array.isArray(params)) return (params[0] as Record<string, unknown>) ?? {};\n return params;\n}\n\nfunction sessionToAccount(session: {\n partyId: unknown;\n network: string;\n hasPreapproval?: boolean;\n utilityPreapprovalAdmins?: string[];\n}): CIP0103Account {\n return {\n primary: true,\n partyId: String(session.partyId),\n status: 'allocated',\n hint: '',\n publicKey: '',\n namespace: '',\n networkId: toCAIP2Network(session.network).networkId,\n signingProviderId: '',\n // Fund-safety passthrough, present only when the wallet reported it.\n hasPreapproval: session.hasPreapproval,\n utilityPreapprovalAdmins: session.utilityPreapprovalAdmins,\n };\n}\n","/**\n * Extension target-channel CIP-0103 provider.\n *\n * Builds a working CIP-0103 provider for a wallet discovered via\n * `canton:announceProvider` (see discovery.ts). Announce wallets route requests\n * over the splice-wallet postMessage protocol — the dApp posts a\n * `SPLICE_WALLET_REQUEST` on `window` and the extension replies with a\n * `SPLICE_WALLET_RESPONSE`, correlated by JSON-RPC id and routed by `target`.\n *\n * This is a self-contained, dependency-free implementation of that wire\n * protocol. We deliberately do NOT depend on `@canton-network/dapp-sdk`'s\n * `ExtensionAdapter`: its single bundled entry statically imports\n * `@walletconnect/sign-client` (an optional peer used only by its\n * WalletConnectAdapter), which is not installed and breaks every downstream\n * webpack/Next build that pulls `@partylayer/provider` into its graph\n * (confirmed against the live demo's `next build`). The protocol constants and\n * message shapes below mirror `@canton-network/core-types` (`WalletEvent`,\n * `SpliceMessage`) verbatim, so behaviour matches the official adapter.\n */\n\nimport type {\n CIP0103Provider,\n CIP0103RequestPayload,\n} from '@partylayer/core';\nimport { CIP0103EventBus } from './event-bus';\nimport { ProviderRpcError, JSON_RPC_ERRORS } from './errors';\n\n// ─── Splice wallet postMessage protocol (mirrors @canton-network/core-types) ──\n\nconst SPLICE_WALLET_REQUEST = 'SPLICE_WALLET_REQUEST';\nconst SPLICE_WALLET_RESPONSE = 'SPLICE_WALLET_RESPONSE';\n\ninterface SpliceResponseMessage {\n type: typeof SPLICE_WALLET_RESPONSE;\n response: {\n jsonrpc: '2.0';\n id?: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n };\n}\n\nexport interface ExtensionChannelOptions {\n /** Routing key (announce `target`) included on every request message. */\n target?: string;\n /** Per-request timeout in ms. Default 30000. */\n timeoutMs?: number;\n}\n\nlet channelSeq = 0;\n\n/**\n * Create a CIP-0103 provider that talks the splice-wallet postMessage protocol\n * over the page `window`, routed by `target`.\n */\nexport function createExtensionChannelProvider(\n options: ExtensionChannelOptions = {},\n): CIP0103Provider {\n const target = options.target;\n const timeoutMs = options.timeoutMs ?? 30_000;\n const eventBus = new CIP0103EventBus();\n // Unique per-provider prefix so concurrent providers never match each other's\n // responses on the shared window message bus.\n const channelId = `pl-${++channelSeq}-${target ?? 'ext'}`;\n let requestSeq = 0;\n\n const pending = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n function onMessage(event: MessageEvent): void {\n // Only accept responses posted on the page's OWN window by the content\n // script — never cross-window or cross-origin messages.\n if (event.source !== window) return;\n const selfOrigin =\n typeof window !== 'undefined' ? window.location?.origin : undefined;\n if (selfOrigin && selfOrigin !== 'null' && event.origin !== selfOrigin) return;\n\n const data = event.data as Partial<SpliceResponseMessage> | undefined;\n if (!data || data.type !== SPLICE_WALLET_RESPONSE || !data.response) return;\n const { id, result, error } = data.response;\n if (id === undefined || id === null) return;\n const entry = pending.get(String(id));\n if (!entry) return; // not ours (different provider / stale)\n pending.delete(String(id));\n clearTimeout(entry.timer);\n if (error) {\n entry.reject(\n new ProviderRpcError(\n error.message || 'Wallet request failed',\n typeof error.code === 'number' ? error.code : JSON_RPC_ERRORS.INTERNAL_ERROR,\n error.data,\n ),\n );\n } else {\n entry.resolve(result);\n }\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', onMessage as EventListener);\n }\n\n function postTargetOrigin(): string {\n const origin = typeof window !== 'undefined' ? window.location?.origin : undefined;\n return origin && origin !== 'null' ? origin : '*';\n }\n\n const provider: CIP0103Provider = {\n request<T>(args: CIP0103RequestPayload): Promise<T> {\n if (typeof window === 'undefined') {\n return Promise.reject(\n new ProviderRpcError('No window: extension channel unavailable', JSON_RPC_ERRORS.INTERNAL_ERROR),\n );\n }\n const id = `${channelId}-${++requestSeq}`;\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n pending.delete(id);\n reject(\n new ProviderRpcError(\n `Wallet request \"${args.method}\" timed out after ${timeoutMs}ms`,\n JSON_RPC_ERRORS.INTERNAL_ERROR,\n ),\n );\n }, timeoutMs);\n pending.set(id, { resolve: resolve as (v: unknown) => void, reject, timer });\n\n const message = {\n type: SPLICE_WALLET_REQUEST,\n request: {\n jsonrpc: '2.0' as const,\n id,\n method: args.method,\n ...(args.params !== undefined ? { params: args.params } : {}),\n },\n ...(target ? { target } : {}),\n };\n window.postMessage(message, postTargetOrigin());\n });\n },\n on(event, listener) {\n eventBus.on(event, listener);\n return provider;\n },\n emit(event, ...args) {\n return eventBus.emit(event, ...args);\n },\n removeListener(event, listener) {\n eventBus.removeListener(event, listener);\n return provider;\n },\n };\n\n eventBus.setOwner(provider);\n return provider;\n}\n","/**\n * CIP-0103 Wallet Discovery\n *\n * Discovers CIP-0103-compliant wallet Providers from the global scope.\n * Wallet-agnostic: no hardcoded wallet logic, only duck-type checking\n * for the Provider interface shape.\n */\n\nimport type { CIP0103Provider } from '@partylayer/core';\nimport { createExtensionChannelProvider } from './extension-channel';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/** Metadata about a discovered CIP-0103 wallet provider */\nexport interface DiscoveredProvider {\n /** Identifier (e.g. \"canton.console\", \"consoleWallet\") */\n id: string;\n /** The native CIP-0103 Provider instance */\n provider: CIP0103Provider;\n /** How it was discovered */\n source: 'injected' | 'registry';\n /** Whether the provider supports async flows (userUrl) */\n isAsync?: boolean;\n /** Display name (if discoverable from status) */\n name?: string;\n /** Icon (data: URI or URL) — populated for announce-discovered wallets. */\n icon?: string;\n /**\n * Whether this entry's STABLE IDENTITY was resolved (additive; A2.1).\n *\n * - announce-discovered entries: always `true` — the announce `id` IS the\n * wallet's real extension id (canonical provider.md: announce is the\n * discovery path).\n * - injected (`window.canton` scan) entries: `true` only when a sync\n * `provider.id` or a `status().provider.id` probe yielded a real id;\n * `false` when discovery fell back to the path id (an identity-LESS bare\n * slot, e.g. Console's `{request,on,emit,removeListener,source}` with no id).\n *\n * LIVE INCIDENT (partylayer.xyz post-A2): an identity-less bare slot resolved\n * to the path id `'canton'`; downstream that synthesized a phantom \"Canton\n * Wallet\" (`browser:ext:canton`) picker entry whose provider was the slot\n * itself. Consumers MUST drop unresolved injected entries rather than list\n * them — correctness must not depend on probe timing.\n */\n identityResolved?: boolean;\n}\n\n// ─── Well-known injection paths ─────────────────────────────────────────────\n\n/**\n * Well-known window property paths where Canton wallet providers\n * may inject themselves.\n *\n * This list is intentionally kept small and generic. New wallets\n * that follow the `window.canton.<wallet>` convention are discovered\n * automatically via namespace scanning.\n */\nconst KNOWN_INJECTION_PATHS = [\n 'canton',\n 'cantonWallet',\n 'consoleWallet',\n 'splice',\n] as const;\n\n// ─── Duck-type check ────────────────────────────────────────────────────────\n\n/**\n * Check if an object implements the CIP-0103 Provider interface.\n *\n * This is a structural (duck-type) check — it verifies the presence of\n * the four required methods without checking implementation correctness.\n */\nexport function isCIP0103Provider(obj: unknown): obj is CIP0103Provider {\n if (typeof obj !== 'object' || obj === null) return false;\n const p = obj as Record<string, unknown>;\n return (\n typeof p.request === 'function' &&\n typeof p.on === 'function' &&\n typeof p.emit === 'function' &&\n typeof p.removeListener === 'function'\n );\n}\n\n// ─── Discovery ──────────────────────────────────────────────────────────────\n\n/**\n * Discover all injected CIP-0103 providers from the global scope.\n *\n * Scans well-known window paths and their sub-properties for objects\n * that implement the Provider interface.\n */\nexport function discoverInjectedProviders(): DiscoveredProvider[] {\n if (typeof window === 'undefined') return [];\n\n const discovered: DiscoveredProvider[] = [];\n const seen = new Set<CIP0103Provider>();\n const win = window as unknown as Record<string, unknown>;\n\n for (const path of KNOWN_INJECTION_PATHS) {\n const candidate = win[path];\n if (candidate === undefined || candidate === null) continue;\n\n // Direct provider at top level (e.g., window.consoleWallet)\n if (isCIP0103Provider(candidate) && !seen.has(candidate)) {\n seen.add(candidate);\n discovered.push({\n id: path,\n provider: candidate,\n source: 'injected',\n });\n continue;\n }\n\n // Namespace object containing sub-providers\n // (e.g., window.canton.console, window.canton.loop)\n if (typeof candidate === 'object') {\n for (const [key, value] of Object.entries(\n candidate as Record<string, unknown>,\n )) {\n if (isCIP0103Provider(value) && !seen.has(value)) {\n seen.add(value);\n discovered.push({\n id: `${path}.${key}`,\n provider: value,\n source: 'injected',\n });\n }\n }\n }\n }\n\n return discovered;\n}\n\n/**\n * Wait for a specific provider to be injected (with timeout).\n *\n * Extensions may inject their provider after page load. This function\n * polls at 100ms intervals until the provider appears or the timeout\n * expires.\n *\n * @param id - Provider id to match (exact or suffix match)\n * @param timeoutMs - Maximum wait time (default 3000ms)\n */\nexport function waitForProvider(\n id: string,\n timeoutMs = 3000,\n): Promise<DiscoveredProvider | null> {\n return new Promise((resolve) => {\n // Check immediately\n const match = findById(id);\n if (match) {\n resolve(match);\n return;\n }\n\n const start = Date.now();\n const interval = setInterval(() => {\n const match = findById(id);\n if (match) {\n clearInterval(interval);\n resolve(match);\n return;\n }\n if (Date.now() - start >= timeoutMs) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n });\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction findById(id: string): DiscoveredProvider | undefined {\n return discoverInjectedProviders().find(\n (p) => p.id === id || p.id.endsWith(`.${id}`),\n );\n}\n\n// ─── Announce-based discovery (canton:announceProvider) ──────────────────────\n//\n// Some Canton wallets (notably Send) do NOT reliably expose `window.canton`:\n// when another wallet (e.g. Console) owns the single `window.canton` slot, the\n// announce wallet is missed by the scan above. Instead they advertise via the\n// EIP-6963-style discovery handshake — the same protocol the official\n// `@canton-network/dapp-sdk` consumes:\n// 1. the dApp dispatches `canton:requestProvider` on `window`;\n// 2. each wallet replies with a `canton:announceProvider` CustomEvent whose\n// `detail` carries `{ id/providerId, name, icon, target }`;\n// 3. a working provider is built over the extension `target` channel.\n//\n// Step 3 (the postMessage handshake) is implemented natively in\n// extension-channel.ts (mirroring the splice-wallet protocol from\n// `@canton-network/core-types`). We do NOT depend on\n// `@canton-network/dapp-sdk`'s `ExtensionAdapter`: its single bundled entry\n// statically imports `@walletconnect/sign-client` (an uninstalled optional\n// peer), which breaks every downstream webpack/Next build that pulls\n// `@partylayer/provider` into its graph. The factory is injectable so apps can\n// substitute the official adapter (or tests a mock).\n\n/** Wire event names for the Canton EIP-6963-style provider handshake. */\nconst CANTON_REQUEST_PROVIDER_EVENT = 'canton:requestProvider';\nconst CANTON_ANNOUNCE_PROVIDER_EVENT = 'canton:announceProvider';\n\n/** Metadata carried by a `canton:announceProvider` event. */\nexport interface AnnouncedWallet {\n /** Stable provider id (extension id), e.g. \"ldmoh…\" for Send. */\n id: string;\n /** Display name. */\n name?: string;\n /** Icon (data: URI or URL). */\n icon?: string;\n /** Routing key for the extension postMessage channel. */\n target?: string;\n}\n\nexport interface AnnounceDiscoveryOptions {\n /** How long to collect announce replies after the request (ms). Default 300. */\n timeoutMs?: number;\n /**\n * Build a CIP-0103 provider from an announced wallet. Defaults to the\n * self-contained `createExtensionChannelProvider` (splice postMessage over\n * the `target` channel). Injectable so apps can substitute the official\n * `@canton-network/dapp-sdk` `ExtensionAdapter`, and tests a mock.\n */\n createProvider?: (\n announced: AnnouncedWallet,\n ) => CIP0103Provider | Promise<CIP0103Provider>;\n}\n\n/**\n * Default announce→provider factory: a self-contained CIP-0103 provider over\n * the splice-wallet postMessage `target` channel (no external dependency).\n */\nfunction defaultAnnounceProvider(announced: AnnouncedWallet): CIP0103Provider {\n // Canonical contract (provider.md): `target` defaults to `id` when omitted —\n // an announce with no explicit target still routes to the announcing wallet's\n // own channel, never a shared/last-one-wins slot.\n return createExtensionChannelProvider({ target: announced.target ?? announced.id });\n}\n\n/**\n * Discover wallets that advertise via `canton:announceProvider` (EIP-6963-style).\n *\n * Works regardless of who owns `window.canton` — this is how Send (and\n * Console-via-announce) are found. Each result is a working CIP-0103 provider.\n * Announce replies are deduped by id within a single call.\n */\nexport async function discoverAnnouncedProviders(\n options: AnnounceDiscoveryOptions = {},\n): Promise<DiscoveredProvider[]> {\n if (typeof window === 'undefined') return [];\n\n const timeoutMs = options.timeoutMs ?? 300;\n const make = options.createProvider ?? defaultAnnounceProvider;\n\n const announced = new Map<string, AnnouncedWallet>();\n const onAnnounce = (event: Event): void => {\n const detail = (event as CustomEvent).detail as\n | Record<string, unknown>\n | undefined;\n if (!detail) return;\n const rawId = detail.providerId ?? detail.id;\n if (typeof rawId !== 'string' || rawId.length === 0) return;\n if (announced.has(rawId)) return; // dedup announce replies by id\n announced.set(rawId, {\n id: rawId,\n name: typeof detail.name === 'string' ? detail.name : undefined,\n icon: typeof detail.icon === 'string' ? detail.icon : undefined,\n target: typeof detail.target === 'string' ? detail.target : undefined,\n });\n };\n\n window.addEventListener(\n CANTON_ANNOUNCE_PROVIDER_EVENT,\n onAnnounce as EventListener,\n );\n try {\n window.dispatchEvent(new CustomEvent(CANTON_REQUEST_PROVIDER_EVENT));\n await new Promise<void>((resolve) => setTimeout(resolve, timeoutMs));\n } finally {\n window.removeEventListener(\n CANTON_ANNOUNCE_PROVIDER_EVENT,\n onAnnounce as EventListener,\n );\n }\n\n const results: DiscoveredProvider[] = [];\n for (const wallet of announced.values()) {\n let provider: CIP0103Provider;\n try {\n provider = await make(wallet);\n } catch {\n continue; // a wallet whose provider cannot be built is skipped, not fatal\n }\n if (!isCIP0103Provider(provider)) continue;\n results.push({\n id: wallet.id,\n provider,\n source: 'injected',\n name: wallet.name,\n icon: wallet.icon,\n });\n }\n return results;\n}\n\n/** Options for {@link subscribeAnnouncedProviders}. */\nexport interface AnnounceSubscribeOptions {\n /** Build a CIP-0103 provider from an announce. Defaults to the channel provider. */\n createProvider?: (\n announced: AnnouncedWallet,\n ) => CIP0103Provider | Promise<CIP0103Provider>;\n /** Dispatch `canton:requestProvider` on subscribe to elicit replies (default true). */\n requestOnSubscribe?: boolean;\n}\n\n/**\n * PERSISTENT (EIP-6963-style) announce subscription. Mounts a `window` listener\n * for `canton:announceProvider` that stays up until the returned unsubscribe runs.\n * Unlike {@link discoverAnnouncedProviders} (a one-shot snapshot that stops\n * listening after `timeoutMs`), this captures announces that arrive AT ANY TIME —\n * both LATE (slow/late extension injection, after the request window) and announces\n * fired on inject BEFORE this subscription. Dispatches `canton:requestProvider`\n * once on subscribe (unless disabled) to elicit replies. Calls `onProvider` once\n * per newly-announced id (deduped) whose provider builds + passes the CIP-0103\n * shape check.\n *\n * The caller MUST call the returned unsubscribe to remove the listener (no leak).\n */\nexport function subscribeAnnouncedProviders(\n onProvider: (provider: DiscoveredProvider) => void,\n options: AnnounceSubscribeOptions = {},\n): () => void {\n if (typeof window === 'undefined') return () => {};\n const make = options.createProvider ?? defaultAnnounceProvider;\n const seen = new Set<string>();\n\n const onAnnounce = (event: Event): void => {\n const detail = (event as CustomEvent).detail as\n | Record<string, unknown>\n | undefined;\n if (!detail) return;\n const rawId = detail.providerId ?? detail.id;\n if (typeof rawId !== 'string' || rawId.length === 0) return;\n if (seen.has(rawId)) return; // dedup announce replies by id\n seen.add(rawId);\n const wallet: AnnouncedWallet = {\n id: rawId,\n name: typeof detail.name === 'string' ? detail.name : undefined,\n icon: typeof detail.icon === 'string' ? detail.icon : undefined,\n target: typeof detail.target === 'string' ? detail.target : undefined,\n };\n // Build the provider off the event tick; a wallet whose provider can't be\n // built (or isn't CIP-0103) is skipped, not fatal — mirrors discoverAnnouncedProviders.\n void Promise.resolve()\n .then(() => make(wallet))\n .then((provider) => {\n if (!isCIP0103Provider(provider)) return;\n onProvider({\n id: wallet.id,\n provider,\n source: 'injected',\n name: wallet.name,\n icon: wallet.icon,\n });\n })\n .catch(() => {\n /* unbuildable provider — skip */\n });\n };\n\n window.addEventListener(\n CANTON_ANNOUNCE_PROVIDER_EVENT,\n onAnnounce as EventListener,\n );\n if (options.requestOnSubscribe !== false) {\n window.dispatchEvent(new CustomEvent(CANTON_REQUEST_PROVIDER_EVENT));\n }\n return () =>\n window.removeEventListener(\n CANTON_ANNOUNCE_PROVIDER_EVENT,\n onAnnounce as EventListener,\n );\n}\n\n/** Options for {@link waitForAnnouncedProvider}. */\nexport interface WaitForAnnouncedOptions extends AnnounceSubscribeOptions {\n /** Max wait before resolving null (default 3000ms). Resolves EARLY on a match. */\n timeoutMs?: number;\n}\n\n/**\n * Resolve the FIRST announced provider matching `predicate` the MOMENT it arrives,\n * or `null` after `timeoutMs`. Built on {@link subscribeAnnouncedProviders}, so a\n * LATE announce within the bound is captured (vs a fixed window that returns its\n * snapshot at a fixed time and misses anything later). Auto-unsubscribes on\n * resolve/timeout — no lingering listener.\n */\nexport function waitForAnnouncedProvider(\n predicate: (provider: DiscoveredProvider) => boolean,\n options: WaitForAnnouncedOptions = {},\n): Promise<DiscoveredProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n const timeoutMs = options.timeoutMs ?? 3000;\n return new Promise<DiscoveredProvider | null>((resolve) => {\n // const holder so the mutual references (finish ↔ unsubscribe/timer) don't\n // need `let`-assigned-once locals (prefer-const).\n const h: { done: boolean; unsubscribe: () => void; timer?: ReturnType<typeof setTimeout> } = {\n done: false,\n unsubscribe: () => {},\n };\n const finish = (value: DiscoveredProvider | null): void => {\n if (h.done) return;\n h.done = true;\n if (h.timer) clearTimeout(h.timer);\n h.unsubscribe();\n resolve(value);\n };\n h.unsubscribe = subscribeAnnouncedProviders((p) => {\n if (predicate(p)) finish(p);\n }, { createProvider: options.createProvider, requestOnSubscribe: options.requestOnSubscribe });\n h.timer = setTimeout(() => finish(null), timeoutMs);\n });\n}\n\n/** Max time to spend on the read-only status() id-probe for ONE injected provider. */\nconst INJECTED_ID_PROBE_TIMEOUT_MS = 1500;\n\nfunction raceTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error('id-probe timeout')), ms),\n ),\n ]);\n}\n\n/**\n * Resolve the stable dedup id for an INJECTED (window.canton scan) entry.\n *\n * Live reality: Console's `window.canton` has NO top-level `id` — its stable id\n * is only available via `status().provider.id` (== its announce id/target). So:\n * 1. use a sync top-level `provider.id` if a provider ever exposes one;\n * 2. else a READ-ONLY `status()` probe reading `result.provider.id` (Console\n * → \"lpnf…\", no popup / no signing UI), capped so a non-responsive\n * injected provider can NEVER block discovery;\n * 3. else fall back to the discovery-path id.\n */\nasync function resolveInjectedKey(\n d: DiscoveredProvider,\n): Promise<{ key: string; resolved: boolean }> {\n const sync = (d.provider as unknown as { id?: unknown }).id;\n if (typeof sync === 'string' && sync.length > 0) return { key: sync, resolved: true };\n\n try {\n const status = await raceTimeout(\n d.provider.request<{ provider?: { id?: unknown } }>({ method: 'status' }),\n INJECTED_ID_PROBE_TIMEOUT_MS,\n );\n const pid = status?.provider?.id;\n if (typeof pid === 'string' && pid.length > 0) return { key: pid, resolved: true };\n } catch {\n // timeout / throw / non-responsive → fall back to the path id (UNRESOLVED)\n }\n // A2.1: identity-less bare slot — keyed by the path id, but NOT a real identity.\n return { key: d.id, resolved: false };\n}\n\n/**\n * Discover ALL CIP-0103 wallets: the synchronous `window.canton` scan PLUS the\n * `canton:announceProvider` handshake, MERGED and deduped by stable provider id.\n *\n * Dedup keys:\n * - INJECTED entries: resolved via {@link resolveInjectedKey} (sync id →\n * capped read-only status() probe → path id). Resolved in PARALLEL.\n * - ANNOUNCE entries: their `d.id` (== announce id == target == the wallet's\n * `provider.id`). NOT status-probed — an offline announce wallet (e.g. Send)\n * would otherwise hang up to the channel timeout.\n *\n * INJECTED entries are processed FIRST so the direct `window.canton` provider\n * wins over the announce postMessage shim for a wallet reachable both ways\n * (e.g. Console announces AND owns `window.canton` → appears exactly once).\n *\n * Backward-compatible superset of `discoverInjectedProviders()` (left unchanged).\n */\nexport async function discoverProviders(\n options: AnnounceDiscoveryOptions = {},\n): Promise<DiscoveredProvider[]> {\n const injected = discoverInjectedProviders();\n const announcedResults = await discoverAnnouncedProviders(options);\n\n // Resolve injected keys in parallel; each probe is independently capped.\n const injectedKeys = await Promise.all(injected.map(resolveInjectedKey));\n\n const out: DiscoveredProvider[] = [];\n const seen = new Set<string>();\n\n // INJECTED first — the direct window.canton provider wins on duplicate ids.\n // A2.1: tag identityResolved so consumers can drop identity-less bare slots\n // (which keyed to the path id) instead of synthesizing a phantom entry.\n injected.forEach((d, i) => {\n const { key, resolved } = injectedKeys[i];\n if (seen.has(key)) return;\n seen.add(key);\n // A2.1: when identity RESOLVED, the entry's `id` IS that real provider id —\n // so the SDK identity-bridge matches the right wallet (e.g. Console's bare\n // slot status() → \"lpnf…\" → bridges to console) instead of the discovery\n // PATH id (\"canton\") which matches nothing and synthesized the phantom.\n // When UNRESOLVED it keeps the path id and is flagged so consumers drop it.\n out.push({ ...d, id: resolved ? key : d.id, identityResolved: resolved });\n });\n\n // ANNOUNCE entries keyed by their own id (no status probe → offline-safe).\n // The announce id IS the wallet's real identity (provider.md), so resolved.\n for (const d of announcedResults) {\n if (seen.has(d.id)) continue;\n seen.add(d.id);\n out.push({ ...d, identityResolved: true });\n }\n\n return out;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/event-bus.ts","../src/errors.ts","../src/error-map.ts","../src/method-router.ts","../src/async-wallet.ts","../src/provider.ts","../src/bridge.ts","../src/extension-channel.ts","../src/discovery.ts"],"names":["CIP0103_EVENTS","match"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * CIP-0103 Event Bus\n *\n * Minimal, spec-compliant event emitter.\n * - on() and removeListener() return the Provider (for chaining)\n * - emit() returns boolean (true if any listener was called)\n * - Listener errors are swallowed to prevent one handler from\n * breaking others\n */\n\nimport type { CIP0103Provider, CIP0103EventListener } from '@partylayer/core';\n\nexport class CIP0103EventBus {\n private listeners = new Map<string, Set<CIP0103EventListener>>();\n private owner: CIP0103Provider | null = null;\n\n /** Set the owning Provider instance (for chaining returns) */\n setOwner(owner: CIP0103Provider): void {\n this.owner = owner;\n }\n\n on<T = unknown>(\n event: string,\n listener: CIP0103EventListener<T>,\n ): CIP0103Provider {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener as CIP0103EventListener);\n return this.owner!;\n }\n\n emit<T = unknown>(event: string, ...args: T[]): boolean {\n const set = this.listeners.get(event);\n if (!set || set.size === 0) return false;\n\n for (const fn of set) {\n try {\n (fn as CIP0103EventListener<T>)(...args);\n } catch {\n // Swallow listener errors per spec behavior\n }\n }\n return true;\n }\n\n removeListener<T = unknown>(\n event: string,\n listenerToRemove: CIP0103EventListener<T>,\n ): CIP0103Provider {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listenerToRemove as CIP0103EventListener);\n if (set.size === 0) this.listeners.delete(event);\n }\n return this.owner!;\n }\n\n /** Remove all listeners, optionally scoped to a single event */\n removeAllListeners(event?: string): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /** Number of listeners for a given event */\n listenerCount(event: string): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","/**\n * CIP-0103 / EIP-1193 / EIP-1474 Error Model\n *\n * All errors on the Provider surface MUST be ProviderRpcError instances\n * with numeric codes. No PartyLayer string-based ErrorCode is ever exposed.\n *\n * Reference: https://eips.ethereum.org/EIPS/eip-1193\n * Reference: https://eips.ethereum.org/EIPS/eip-1474\n */\n\n// ─── ProviderRpcError ────────────────────────────────────────────────────────\n\nexport class ProviderRpcError extends Error {\n public readonly code: number;\n public readonly data?: unknown;\n\n constructor(message: string, code: number, data?: unknown) {\n super(message);\n this.name = 'ProviderRpcError';\n this.code = code;\n this.data = data;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ProviderRpcError);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n data: this.data,\n };\n }\n}\n\n// ─── EIP-1193 Standard Error Codes ──────────────────────────────────────────\n\nexport const RPC_ERRORS = {\n /** User rejected the request */\n USER_REJECTED: 4001,\n /** The requested method/account is not authorized */\n UNAUTHORIZED: 4100,\n /** Provider does not support the requested method */\n UNSUPPORTED_METHOD: 4200,\n /** Provider is disconnected from all chains */\n DISCONNECTED: 4900,\n /** Provider is not connected to the requested chain */\n CHAIN_DISCONNECTED: 4901,\n} as const;\n\n// ─── EIP-1474 JSON-RPC Error Codes ─────────────────────────────────────────\n\nexport const JSON_RPC_ERRORS = {\n /** Invalid JSON (parse error) */\n PARSE_ERROR: -32700,\n /** Invalid request object */\n INVALID_REQUEST: -32600,\n /** Method not found */\n METHOD_NOT_FOUND: -32601,\n /** Invalid method parameters */\n INVALID_PARAMS: -32602,\n /** Internal JSON-RPC error */\n INTERNAL_ERROR: -32603,\n /** Invalid input / missing or invalid parameters */\n INVALID_INPUT: -32000,\n /** Resource not found */\n RESOURCE_NOT_FOUND: -32001,\n /** Resource unavailable */\n RESOURCE_UNAVAILABLE: -32002,\n /** Transaction rejected */\n TRANSACTION_REJECTED: -32003,\n /** Method not supported */\n METHOD_NOT_SUPPORTED: -32004,\n /** Rate limit exceeded */\n RATE_LIMIT_EXCEEDED: -32005,\n} as const;\n\n// ─── Convenience Constructors ───────────────────────────────────────────────\n\nexport function userRejected(\n message = 'User Rejected Request',\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, RPC_ERRORS.USER_REJECTED, data);\n}\n\nexport function unauthorized(\n message = 'Unauthorized',\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, RPC_ERRORS.UNAUTHORIZED, data);\n}\n\nexport function unsupportedMethod(method: string): ProviderRpcError {\n return new ProviderRpcError(\n `Unsupported Method: \"${method}\"`,\n RPC_ERRORS.UNSUPPORTED_METHOD,\n { method },\n );\n}\n\nexport function disconnected(\n message = 'Disconnected',\n): ProviderRpcError {\n return new ProviderRpcError(message, RPC_ERRORS.DISCONNECTED);\n}\n\nexport function chainDisconnected(\n message = 'Chain Disconnected',\n): ProviderRpcError {\n return new ProviderRpcError(message, RPC_ERRORS.CHAIN_DISCONNECTED);\n}\n\nexport function internalError(\n message: string,\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.INTERNAL_ERROR, data);\n}\n\nexport function invalidParams(\n message: string,\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.INVALID_PARAMS, data);\n}\n\nexport function methodNotFound(method: string): ProviderRpcError {\n return new ProviderRpcError(\n `Method not found: \"${method}\"`,\n JSON_RPC_ERRORS.METHOD_NOT_FOUND,\n { method },\n );\n}\n\nexport function resourceNotFound(\n message: string,\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.RESOURCE_NOT_FOUND, data);\n}\n\nexport function resourceUnavailable(\n message: string,\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.RESOURCE_UNAVAILABLE, data);\n}\n\nexport function transactionRejected(\n message = 'Transaction rejected',\n data?: unknown,\n): ProviderRpcError {\n return new ProviderRpcError(message, JSON_RPC_ERRORS.TRANSACTION_REJECTED, data);\n}\n","/**\n * Bidirectional error mapping between PartyLayer ErrorCode and CIP-0103 numeric codes\n *\n * This module ensures no PartyLayer internals leak through the Provider surface,\n * and provides a reverse path for the bridge.\n */\n\nimport { PartyLayerError, type ErrorCode } from '@partylayer/core';\nimport { ProviderRpcError, RPC_ERRORS, JSON_RPC_ERRORS } from './errors';\n\n// ─── PartyLayer ErrorCode → CIP-0103 numeric code ──────────────────────────\n\n// SYNCHRONIZER_ERROR is intentionally absent from this map. CIP-0103 defines no\n// dedicated synchronizer code, so per the kit level, no wire mapping policy it is not\n// mapped here and falls through to the INTERNAL_ERROR default in toProviderRpcError\n// below. The map is Partial for that reason alone; no existing entry changes.\nconst ERROR_CODE_TO_RPC: Partial<Record<ErrorCode, number>> = {\n USER_REJECTED: RPC_ERRORS.USER_REJECTED,\n WALLET_NOT_FOUND: JSON_RPC_ERRORS.RESOURCE_NOT_FOUND,\n // Client-side config gap (the walletId refers to an unwired discovery adapter),\n // not a missing resource → INVALID_PARAMS, distinct from WALLET_NOT_FOUND.\n ADAPTER_NOT_REGISTERED: JSON_RPC_ERRORS.INVALID_PARAMS,\n WALLET_NOT_INSTALLED: JSON_RPC_ERRORS.RESOURCE_UNAVAILABLE,\n ORIGIN_NOT_ALLOWED: RPC_ERRORS.UNAUTHORIZED,\n SESSION_EXPIRED: RPC_ERRORS.DISCONNECTED,\n CAPABILITY_NOT_SUPPORTED: RPC_ERRORS.UNSUPPORTED_METHOD,\n TRANSPORT_ERROR: JSON_RPC_ERRORS.INTERNAL_ERROR,\n REGISTRY_FETCH_FAILED: JSON_RPC_ERRORS.RESOURCE_UNAVAILABLE,\n REGISTRY_VERIFICATION_FAILED: JSON_RPC_ERRORS.INTERNAL_ERROR,\n REGISTRY_SCHEMA_INVALID: JSON_RPC_ERRORS.INTERNAL_ERROR,\n INTERNAL_ERROR: JSON_RPC_ERRORS.INTERNAL_ERROR,\n NETWORK_MISMATCH: JSON_RPC_ERRORS.INVALID_INPUT,\n TIMEOUT: JSON_RPC_ERRORS.INVALID_INPUT,\n // Traffic allowance exhausted maps to the spec's limit-exceeded code. CIP-0103's\n // own table lists -32005 as the limit exceeded semantic; it was defined but unused\n // until now, so no proprietary code is introduced.\n INSUFFICIENT_TRAFFIC: JSON_RPC_ERRORS.RATE_LIMIT_EXCEEDED,\n};\n\n// ─── CIP-0103 numeric code → PartyLayer ErrorCode (best-effort reverse) ────\n\nconst RPC_TO_ERROR_CODE: Partial<Record<number, ErrorCode>> = {\n [RPC_ERRORS.USER_REJECTED]: 'USER_REJECTED',\n [RPC_ERRORS.UNAUTHORIZED]: 'ORIGIN_NOT_ALLOWED',\n [RPC_ERRORS.UNSUPPORTED_METHOD]: 'CAPABILITY_NOT_SUPPORTED',\n [RPC_ERRORS.DISCONNECTED]: 'SESSION_EXPIRED',\n [RPC_ERRORS.CHAIN_DISCONNECTED]: 'TRANSPORT_ERROR',\n [JSON_RPC_ERRORS.INTERNAL_ERROR]: 'INTERNAL_ERROR',\n [JSON_RPC_ERRORS.METHOD_NOT_FOUND]: 'CAPABILITY_NOT_SUPPORTED',\n [JSON_RPC_ERRORS.RESOURCE_NOT_FOUND]: 'WALLET_NOT_FOUND',\n [JSON_RPC_ERRORS.RESOURCE_UNAVAILABLE]: 'WALLET_NOT_INSTALLED',\n [JSON_RPC_ERRORS.TRANSACTION_REJECTED]: 'USER_REJECTED',\n [JSON_RPC_ERRORS.INVALID_INPUT]: 'TIMEOUT',\n [JSON_RPC_ERRORS.RATE_LIMIT_EXCEEDED]: 'INSUFFICIENT_TRAFFIC',\n};\n\n/**\n * Convert any error into a ProviderRpcError for the CIP-0103 surface.\n *\n * This is the single normalization point — every error that escapes\n * the Provider MUST pass through this function.\n */\nexport function toProviderRpcError(err: unknown): ProviderRpcError {\n // Already a ProviderRpcError — pass through\n if (err instanceof ProviderRpcError) {\n return err;\n }\n\n // PartyLayerError — map code\n if (err instanceof PartyLayerError) {\n const code = ERROR_CODE_TO_RPC[err.code] ?? JSON_RPC_ERRORS.INTERNAL_ERROR;\n return new ProviderRpcError(err.message, code, {\n originalCode: err.code,\n details: err.details,\n });\n }\n\n // RPC-shaped error from a wallet provider (has numeric code)\n if (isRpcShaped(err)) {\n return new ProviderRpcError(err.message, err.code, err.data);\n }\n\n // Standard Error\n if (err instanceof Error) {\n return new ProviderRpcError(err.message, JSON_RPC_ERRORS.INTERNAL_ERROR);\n }\n\n // Unknown\n return new ProviderRpcError(String(err), JSON_RPC_ERRORS.INTERNAL_ERROR);\n}\n\n/**\n * Convert ProviderRpcError back to a PartyLayerError.\n *\n * Used by the bridge path when errors from the Provider surface\n * need to flow back into the PartyLayerClient world.\n */\nexport function toPartyLayerError(err: ProviderRpcError): PartyLayerError {\n const code = RPC_TO_ERROR_CODE[err.code] ?? 'INTERNAL_ERROR';\n return new PartyLayerError(err.message, code, {\n details: { rpcCode: err.code, data: err.data },\n });\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction isRpcShaped(\n err: unknown,\n): err is { message: string; code: number; data?: unknown } {\n if (typeof err !== 'object' || err === null) return false;\n const e = err as Record<string, unknown>;\n return typeof e.message === 'string' && typeof e.code === 'number';\n}\n","/**\n * CIP-0103 Method Router\n *\n * Routes request({ method, params }) calls to the correct handler function.\n * By default, all 10 mandatory CIP-0103 methods are registered as passthrough\n * handlers that delegate to the native wallet Provider.\n *\n * Forward-compatible: unknown methods are passed through to the wallet provider\n * rather than rejected, allowing support for future CIP extensions.\n */\n\nimport type {\n CIP0103Provider,\n CIP0103RequestPayload,\n CIP0103RequestParams,\n} from '@partylayer/core';\nimport { unsupportedMethod, disconnected } from './errors';\nimport { toProviderRpcError } from './error-map';\n\nexport type MethodHandler<T = unknown> = (\n walletProvider: CIP0103Provider,\n params?: CIP0103RequestParams,\n) => Promise<T>;\n\nexport class MethodRouter {\n private handlers = new Map<string, MethodHandler>();\n private walletProvider: CIP0103Provider | null = null;\n\n constructor() {\n this.registerDefaults();\n }\n\n /** Set / swap the underlying native wallet provider */\n setWalletProvider(provider: CIP0103Provider | null): void {\n this.walletProvider = provider;\n }\n\n /** Get the current wallet provider */\n getWalletProvider(): CIP0103Provider | null {\n return this.walletProvider;\n }\n\n /** Register (or override) a handler for a method name */\n register<T>(method: string, handler: MethodHandler<T>): void {\n this.handlers.set(method, handler as MethodHandler);\n }\n\n /** Route a request to the appropriate handler */\n async route<T>(payload: CIP0103RequestPayload): Promise<T> {\n const { method, params } = payload;\n\n const handler = this.handlers.get(method);\n\n if (!handler) {\n // Forward-compatible: pass unknown methods through to the wallet provider\n if (this.walletProvider) {\n try {\n return await this.walletProvider.request<T>(payload);\n } catch (err) {\n throw toProviderRpcError(err);\n }\n }\n throw unsupportedMethod(method);\n }\n\n // connect and isConnected can operate without a wallet provider\n if (!this.walletProvider && method !== 'connect' && method !== 'isConnected') {\n throw disconnected('No wallet provider connected');\n }\n\n try {\n return (await handler(this.walletProvider!, params)) as T;\n } catch (err) {\n throw toProviderRpcError(err);\n }\n }\n\n /** Check whether a handler is registered for a given method */\n hasHandler(method: string): boolean {\n return this.handlers.has(method);\n }\n\n // ─── Default passthrough handlers ───────────────────────────────────────\n\n private registerDefaults(): void {\n const passthrough = (method: string): MethodHandler => {\n return async (wp, params) => {\n return wp.request({ method, params });\n };\n };\n\n this.register('connect', passthrough('connect'));\n this.register('disconnect', passthrough('disconnect'));\n this.register('isConnected', passthrough('isConnected'));\n this.register('status', passthrough('status'));\n this.register('getActiveNetwork', passthrough('getActiveNetwork'));\n this.register('listAccounts', passthrough('listAccounts'));\n this.register('getPrimaryAccount', passthrough('getPrimaryAccount'));\n this.register('signMessage', passthrough('signMessage'));\n this.register('prepareExecute', passthrough('prepareExecute'));\n this.register('ledgerApi', passthrough('ledgerApi'));\n }\n}\n","/**\n * Async Wallet Handling\n *\n * CIP-0103 async wallet extensions allow methods like `connect` and\n * `prepareExecute` to return a `{ userUrl }` instead of completing\n * synchronously. The user must visit the URL (e.g., mobile wallet\n * approval screen), and the wallet provider emits an event when the\n * operation completes.\n *\n * This module provides helpers that abstract the wait-for-event pattern\n * so the Provider implementation can offer a unified surface to dApps.\n */\n\nimport type {\n CIP0103Provider,\n CIP0103ConnectResult,\n CIP0103TxChangedEvent,\n CIP0103TxStatus,\n} from '@partylayer/core';\nimport { CIP0103_EVENTS } from '@partylayer/core';\nimport { ProviderRpcError, JSON_RPC_ERRORS } from './errors';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface AsyncConnectOptions {\n /** Timeout for waiting for the async connect event (ms) */\n timeoutMs?: number;\n /** Callback when userUrl is available (for UI to redirect / show QR) */\n onUserUrl?: (url: string) => void;\n}\n\nexport interface AsyncPrepareExecuteOptions {\n timeoutMs?: number;\n onUserUrl?: (url: string) => void;\n}\n\n// ─── Async Connect ──────────────────────────────────────────────────────────\n\n/**\n * Handle an async connect flow:\n *\n * 1. If connectResult is already isConnected (sync wallet), return immediately.\n * 2. If connectResult has userUrl, invoke onUserUrl callback for UI.\n * 3. Wait for 'connected' event from the wallet provider.\n * 4. Return the final ConnectResult.\n */\nexport async function handleAsyncConnect(\n walletProvider: CIP0103Provider,\n connectResult: CIP0103ConnectResult,\n options: AsyncConnectOptions = {},\n): Promise<CIP0103ConnectResult> {\n // Sync wallet — already connected\n if (connectResult.isConnected && !connectResult.userUrl) {\n return connectResult;\n }\n\n // Notify UI of the userUrl\n if (connectResult.userUrl) {\n options.onUserUrl?.(connectResult.userUrl);\n }\n\n const timeoutMs = options.timeoutMs ?? 300_000; // 5-minute default\n\n return new Promise<CIP0103ConnectResult>((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n walletProvider.removeListener(CIP0103_EVENTS.CONNECTED, onConnected);\n reject(\n new ProviderRpcError(\n 'Async connect timed out',\n JSON_RPC_ERRORS.INVALID_INPUT,\n { timeoutMs },\n ),\n );\n }\n }, timeoutMs);\n\n const onConnected = (result: CIP0103ConnectResult) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n walletProvider.removeListener(CIP0103_EVENTS.CONNECTED, onConnected);\n resolve(result);\n }\n };\n\n walletProvider.on(CIP0103_EVENTS.CONNECTED, onConnected);\n });\n}\n\n// ─── Async PrepareExecute ───────────────────────────────────────────────────\n\nconst TERMINAL_TX_STATUSES: CIP0103TxStatus[] = ['executed', 'failed'];\n\n/**\n * Handle an async prepareExecute flow:\n *\n * 1. If result has userUrl, invoke onUserUrl callback for UI.\n * 2. Wait for 'txChanged' event with matching commandId.\n * 3. Return when txChanged reaches a terminal state (executed / failed).\n */\nexport async function handleAsyncPrepareExecute(\n walletProvider: CIP0103Provider,\n commandId: string,\n userUrl: string | undefined,\n options: AsyncPrepareExecuteOptions = {},\n): Promise<CIP0103TxChangedEvent> {\n if (userUrl) {\n options.onUserUrl?.(userUrl);\n }\n\n const timeoutMs = options.timeoutMs ?? 300_000;\n\n return new Promise<CIP0103TxChangedEvent>((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n walletProvider.removeListener(CIP0103_EVENTS.TX_CHANGED, onTxChanged);\n reject(\n new ProviderRpcError(\n 'Async prepareExecute timed out',\n JSON_RPC_ERRORS.INVALID_INPUT,\n { commandId, timeoutMs },\n ),\n );\n }\n }, timeoutMs);\n\n const onTxChanged = (event: CIP0103TxChangedEvent) => {\n // Ignore events for other commands\n if (event.commandId !== commandId) return;\n\n if (TERMINAL_TX_STATUSES.includes(event.status)) {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n walletProvider.removeListener(\n CIP0103_EVENTS.TX_CHANGED,\n onTxChanged,\n );\n\n if (event.status === 'failed') {\n reject(\n new ProviderRpcError(\n 'Transaction failed',\n JSON_RPC_ERRORS.TRANSACTION_REJECTED,\n { commandId },\n ),\n );\n } else {\n resolve(event);\n }\n }\n }\n };\n\n walletProvider.on(CIP0103_EVENTS.TX_CHANGED, onTxChanged);\n });\n}\n","/**\n * PartyLayerProvider — CIP-0103 Native Provider Implementation\n *\n * This is the core Provider class. It wraps a single native CIP-0103\n * wallet provider and adds:\n *\n * - Method routing with orchestrated overrides (connect, disconnect, etc.)\n * - Event forwarding from the native wallet to the dApp\n * - Async wallet support (userUrl flows)\n * - Error normalization to ProviderRpcError\n * - Forward compatibility for unknown methods and events\n *\n * IMPORTANT: No wallet-specific logic lives here. The Provider is purely\n * a router and normalizer.\n */\n\nimport type {\n CIP0103Provider,\n CIP0103RequestPayload,\n CIP0103EventListener,\n CIP0103ConnectResult,\n CIP0103StatusEvent,\n} from '@partylayer/core';\nimport { CIP0103_EVENTS } from '@partylayer/core';\nimport { CIP0103EventBus } from './event-bus';\nimport { MethodRouter } from './method-router';\nimport { handleAsyncConnect } from './async-wallet';\nimport type { DiscoveredProvider } from './discovery';\n\n// ─── Configuration ──────────────────────────────────────────────────────────\n\nexport interface PartyLayerProviderOptions {\n /** Discovered wallet provider to wrap */\n walletProvider?: DiscoveredProvider;\n /** Timeout for async operations (ms). Default 300_000 (5 min). */\n asyncTimeoutMs?: number;\n /** Callback when a userUrl is available (for async wallets) */\n onUserUrl?: (url: string) => void;\n}\n\n// ─── Provider ───────────────────────────────────────────────────────────────\n\nexport class PartyLayerProvider implements CIP0103Provider {\n private readonly eventBus: CIP0103EventBus;\n private readonly router: MethodRouter;\n private readonly options: PartyLayerProviderOptions;\n private nativeProvider: CIP0103Provider | null;\n private connected = false;\n\n /** Event forwarders from the native provider, keyed by event name */\n private nativeForwarders = new Map<string, CIP0103EventListener>();\n\n constructor(options: PartyLayerProviderOptions = {}) {\n this.options = options;\n this.eventBus = new CIP0103EventBus();\n this.eventBus.setOwner(this);\n this.router = new MethodRouter();\n\n this.nativeProvider = options.walletProvider?.provider ?? null;\n\n if (this.nativeProvider) {\n this.router.setWalletProvider(this.nativeProvider);\n this.forwardNativeEvents();\n }\n\n // Override default passthrough handlers with orchestrated versions\n this.registerOrchestratedMethods();\n }\n\n // ─── CIP-0103 Provider Interface ─────────────────────────────────────────\n\n async request<T = unknown>(args: CIP0103RequestPayload): Promise<T> {\n return this.router.route<T>(args);\n }\n\n on<T = unknown>(\n event: string,\n listener: CIP0103EventListener<T>,\n ): this {\n this.eventBus.on(event, listener);\n return this;\n }\n\n emit<T = unknown>(event: string, ...args: T[]): boolean {\n return this.eventBus.emit(event, ...args);\n }\n\n removeListener<T = unknown>(\n event: string,\n listenerToRemove: CIP0103EventListener<T>,\n ): this {\n this.eventBus.removeListener(event, listenerToRemove);\n return this;\n }\n\n // ─── Public Management ────────────────────────────────────────────────────\n\n /** Whether the provider is currently in a connected state */\n get isConnected(): boolean {\n return this.connected;\n }\n\n /** Switch the underlying wallet provider (e.g. user selects a different wallet) */\n setWalletProvider(discovered: DiscoveredProvider): void {\n this.unforwardNativeEvents();\n\n this.nativeProvider = discovered.provider;\n this.router.setWalletProvider(this.nativeProvider);\n this.forwardNativeEvents();\n }\n\n /** Get the currently attached native provider (if any) */\n getNativeProvider(): CIP0103Provider | null {\n return this.nativeProvider;\n }\n\n /** Tear down: unsubscribe all events and release the native provider */\n destroy(): void {\n this.unforwardNativeEvents();\n this.eventBus.removeAllListeners();\n this.nativeProvider = null;\n this.router.setWalletProvider(null);\n this.connected = false;\n }\n\n // ─── Orchestrated Method Overrides ────────────────────────────────────────\n\n private registerOrchestratedMethods(): void {\n // connect: handle async wallets, emit statusChanged\n this.router.register<CIP0103ConnectResult>(\n 'connect',\n async (wp, params) => {\n const result = await wp.request<CIP0103ConnectResult>({\n method: 'connect',\n params,\n });\n\n // Handle async wallet flow (userUrl returned, not yet connected)\n if (result.userUrl && !result.isConnected) {\n const final = await handleAsyncConnect(wp, result, {\n timeoutMs: this.options.asyncTimeoutMs,\n onUserUrl: this.options.onUserUrl,\n });\n this.connected = final.isConnected;\n this.emitStatusChanged();\n return final;\n }\n\n this.connected = result.isConnected;\n this.emitStatusChanged();\n return result;\n },\n );\n\n // disconnect: update state, emit statusChanged\n this.router.register<void>('disconnect', async (wp, params) => {\n await wp.request<void>({ method: 'disconnect', params });\n this.connected = false;\n this.emitStatusChanged();\n });\n\n // isConnected: can work without a wallet provider\n this.router.register<CIP0103ConnectResult>(\n 'isConnected',\n async (wp, params) => {\n if (!wp) {\n return {\n isConnected: false,\n reason: 'No wallet provider connected',\n };\n }\n return wp.request<CIP0103ConnectResult>({\n method: 'isConnected',\n params,\n });\n },\n );\n\n // prepareExecute: the wallet provider MUST emit txChanged per spec.\n // We forward those events through our event bus (via forwardNativeEvents).\n // This handler just passes through to the wallet.\n this.router.register('prepareExecute', async (wp, params) => {\n return wp.request({ method: 'prepareExecute', params });\n });\n }\n\n // ─── Native Event Forwarding ──────────────────────────────────────────────\n\n private forwardNativeEvents(): void {\n if (!this.nativeProvider) return;\n\n const eventsToForward = [\n CIP0103_EVENTS.STATUS_CHANGED,\n CIP0103_EVENTS.ACCOUNTS_CHANGED,\n CIP0103_EVENTS.TX_CHANGED,\n CIP0103_EVENTS.CONNECTED,\n ];\n\n for (const event of eventsToForward) {\n const forwarder: CIP0103EventListener = (...args: unknown[]) => {\n this.eventBus.emit(event, ...args);\n };\n this.nativeForwarders.set(event, forwarder);\n this.nativeProvider.on(event, forwarder);\n }\n }\n\n private unforwardNativeEvents(): void {\n if (!this.nativeProvider) return;\n for (const [event, forwarder] of this.nativeForwarders) {\n this.nativeProvider.removeListener(event, forwarder);\n }\n this.nativeForwarders.clear();\n }\n\n // ─── Helpers ──────────────────────────────────────────────────────────────\n\n /** Emit statusChanged by querying the current wallet provider status */\n private async emitStatusChanged(): Promise<void> {\n if (!this.nativeProvider) return;\n try {\n const status = await this.nativeProvider.request<CIP0103StatusEvent>({\n method: 'status',\n });\n this.eventBus.emit(CIP0103_EVENTS.STATUS_CHANGED, status);\n } catch {\n // Best-effort: status emission should not break the connect flow\n }\n }\n}\n","/**\n * PartyLayerClient → CIP-0103 Provider Bridge\n *\n * Creates a CIP-0103-compliant Provider backed by an existing\n * PartyLayerClient instance. This is the backward-compatibility path:\n * existing dApps using PartyLayerClient can obtain a standard Provider\n * without rewiring their wallet adapter stack.\n *\n * Usage:\n * const provider = createProviderBridge(client);\n * // or (added to PartyLayerClient):\n * const provider = client.asProvider();\n */\n\nimport type {\n CIP0103Provider,\n CIP0103RequestPayload,\n CIP0103RequestParams,\n CIP0103EventListener,\n CIP0103ConnectResult,\n CIP0103StatusEvent,\n CIP0103Account,\n CIP0103Network,\n CIP0103TxChangedEvent,\n CIP0103TxStatus,\n CIP0103LedgerApiResponse,\n LedgerApiMethod,\n} from '@partylayer/core';\nimport { CIP0103_EVENTS } from '@partylayer/core';\nimport { CIP0103EventBus } from './event-bus';\nimport { unsupportedMethod, disconnected } from './errors';\nimport { toProviderRpcError } from './error-map';\nimport { toCAIP2Network } from './network';\n\n/** Injected at build time by tsup from package.json version */\ndeclare const __PROVIDER_VERSION__: string;\nconst PROVIDER_VERSION = typeof __PROVIDER_VERSION__ !== 'undefined'\n ? __PROVIDER_VERSION__\n : '0.1.0';\n\n// ─── Bridge Client Interface ────────────────────────────────────────────────\n\n/**\n * Minimal interface for the PartyLayerClient consumed by the bridge.\n * Using an interface avoids importing the full SDK (prevents circular deps).\n */\nexport interface BridgeableClient {\n connect(options?: unknown): Promise<{\n sessionId: unknown;\n walletId: unknown;\n partyId: unknown;\n network: string;\n expiresAt?: number;\n capabilitiesSnapshot?: string[];\n }>;\n disconnect(): Promise<void>;\n getActiveSession(): Promise<{\n sessionId: unknown;\n walletId: unknown;\n partyId: unknown;\n network: string;\n expiresAt?: number;\n capabilitiesSnapshot?: string[];\n } | null>;\n signMessage(params: {\n message: string;\n nonce?: string;\n domain?: string;\n }): Promise<{ signature: unknown }>;\n signTransaction(params: { tx: unknown }): Promise<{\n transactionHash: unknown;\n signedTx?: unknown;\n partyId?: unknown;\n }>;\n submitTransaction(params: {\n signedTx: unknown;\n }): Promise<{\n transactionHash: unknown;\n submittedAt?: number;\n commandId?: string;\n updateId?: string;\n }>;\n ledgerApi?(params: {\n requestMethod: string;\n resource: string;\n body?: string | Record<string, unknown>;\n }): Promise<{ response: string }>;\n getRegistryStatus(): unknown;\n on(event: string, handler: (event: unknown) => void | Promise<void>): () => void;\n}\n\n// ─── Bridge Factory ─────────────────────────────────────────────────────────\n\n/**\n * Create a CIP-0103 Provider backed by a PartyLayerClient.\n *\n * All `request()` calls are mapped to PartyLayerClient methods.\n * PartyLayer events are forwarded as CIP-0103 events.\n */\nexport function createProviderBridge(client: BridgeableClient): CIP0103Provider {\n const eventBus = new CIP0103EventBus();\n // Track commandIds that already emitted 'pending' to avoid double-emission\n const pendingEmitted = new Set<string>();\n\n const bridge: CIP0103Provider = {\n async request<T>(args: CIP0103RequestPayload): Promise<T> {\n return handleRequest(client, args, eventBus, pendingEmitted) as Promise<T>;\n },\n on<T>(event: string, listener: CIP0103EventListener<T>): CIP0103Provider {\n eventBus.on(event, listener);\n return bridge;\n },\n emit<T>(event: string, ...args: T[]): boolean {\n return eventBus.emit(event, ...args);\n },\n removeListener<T>(\n event: string,\n listener: CIP0103EventListener<T>,\n ): CIP0103Provider {\n eventBus.removeListener(event, listener);\n return bridge;\n },\n };\n\n eventBus.setOwner(bridge);\n wireEvents(client, eventBus, pendingEmitted);\n\n return bridge;\n}\n\n// ─── Request Handler ────────────────────────────────────────────────────────\n\nasync function handleRequest(\n client: BridgeableClient,\n args: CIP0103RequestPayload,\n eventBus: CIP0103EventBus,\n pendingEmitted: Set<string>,\n): Promise<unknown> {\n const { method, params } = args;\n\n try {\n switch (method) {\n case 'connect': {\n await client.connect();\n return {\n isConnected: true,\n } satisfies CIP0103ConnectResult;\n }\n\n case 'disconnect': {\n await client.disconnect();\n return undefined;\n }\n\n case 'isConnected': {\n const session = await client.getActiveSession();\n return {\n isConnected: session !== null,\n reason: session ? undefined : 'No active session',\n } satisfies CIP0103ConnectResult;\n }\n\n case 'status': {\n const session = await client.getActiveSession();\n return {\n connection: {\n isConnected: session !== null,\n },\n provider: {\n id: 'partylayer',\n version: PROVIDER_VERSION,\n providerType: 'browser',\n },\n network: session\n ? toCAIP2Network(session.network)\n : undefined,\n session: session\n ? {\n accessToken: '',\n userId: String(session.partyId),\n }\n : undefined,\n } satisfies CIP0103StatusEvent;\n }\n\n case 'getActiveNetwork': {\n const session = await client.getActiveSession();\n return toCAIP2Network(\n session?.network ?? 'devnet',\n ) satisfies CIP0103Network;\n }\n\n case 'listAccounts': {\n const session = await client.getActiveSession();\n if (!session) return [] as CIP0103Account[];\n return [\n sessionToAccount(session),\n ] satisfies CIP0103Account[];\n }\n\n case 'getPrimaryAccount': {\n const session = await client.getActiveSession();\n if (!session) throw disconnected('No active session');\n return sessionToAccount(session) satisfies CIP0103Account;\n }\n\n case 'signMessage': {\n const p = normalizeParams(params);\n const result = await client.signMessage({\n message: String(p.message ?? ''),\n nonce: p.nonce ? String(p.nonce) : undefined,\n domain: p.domain ? String(p.domain) : undefined,\n });\n return String(result.signature);\n }\n\n case 'prepareExecute': {\n const p = normalizeParams(params);\n const cmdId = `cmd_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n\n // 1. Emit 'pending'\n pendingEmitted.add(cmdId);\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'pending',\n commandId: cmdId,\n } as CIP0103TxChangedEvent);\n\n // 2. Sign transaction\n try {\n const signResult = await client.signTransaction({ tx: p });\n\n // 3. Emit 'signed' with signature metadata\n const session = await client.getActiveSession();\n const partyId = String(signResult.partyId ?? session?.partyId ?? 'unknown');\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'signed',\n commandId: cmdId,\n payload: {\n signature: String(signResult.transactionHash),\n signedBy: partyId,\n party: partyId,\n },\n } as CIP0103TxChangedEvent);\n\n // 4. Submit transaction\n try {\n const receipt = await client.submitTransaction({\n signedTx: signResult.signedTx ?? signResult.transactionHash,\n });\n\n // 5. Emit 'executed' with real receipt data\n pendingEmitted.delete(cmdId);\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'executed',\n commandId: cmdId,\n payload: {\n updateId: receipt.updateId ?? receipt.commandId ?? String(receipt.transactionHash),\n completionOffset: 0,\n },\n } as CIP0103TxChangedEvent);\n } catch (submitErr) {\n pendingEmitted.delete(cmdId);\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'failed',\n commandId: cmdId,\n } as CIP0103TxChangedEvent);\n throw submitErr;\n }\n } catch (signErr) {\n // Only emit 'failed' if not already emitted by submit catch above\n if (pendingEmitted.has(cmdId)) {\n pendingEmitted.delete(cmdId);\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, {\n status: 'failed',\n commandId: cmdId,\n } as CIP0103TxChangedEvent);\n }\n throw signErr;\n }\n\n return undefined;\n }\n\n case 'ledgerApi': {\n if (!client.ledgerApi) {\n throw unsupportedMethod('ledgerApi');\n }\n const p = normalizeParams(params);\n const result = await client.ledgerApi({\n // Forward the verb case AND the body type (string OR object) UNCHANGED;\n // the active wallet's adapter normalizes to its required shape\n // (lower+object for CIP-0103, string for Loop/Bron). Do NOT String()\n // the body — that would turn an object into \"[object Object]\".\n requestMethod: String(p.requestMethod ?? 'get') as LedgerApiMethod,\n resource: String(p.resource ?? ''),\n body: (p.body ?? undefined) as string | Record<string, unknown> | undefined,\n });\n return result satisfies CIP0103LedgerApiResponse;\n }\n\n default:\n throw unsupportedMethod(method);\n }\n } catch (err) {\n throw toProviderRpcError(err);\n }\n}\n\n// ─── Event Wiring ───────────────────────────────────────────────────────────\n\n/**\n * Wire PartyLayer SDK events to CIP-0103 events.\n *\n * Direction: PartyLayerClient → CIP-0103 Provider (one-way only).\n * The bridge does NOT inject CIP-0103 events back into the client,\n * preventing circular event loops.\n */\nfunction wireEvents(\n client: BridgeableClient,\n eventBus: CIP0103EventBus,\n pendingEmitted: Set<string>,\n): void {\n // session:connected → statusChanged + accountsChanged\n client.on('session:connected', (event: unknown) => {\n const e = event as { type: string; session: BridgeableClient extends { getActiveSession(): Promise<infer S> } ? NonNullable<S> : never };\n if (!e || typeof e !== 'object' || !('session' in e)) return;\n const session = (e as { session: { partyId: unknown; network: string; expiresAt?: number; hasPreapproval?: boolean; utilityPreapprovalAdmins?: string[] } }).session;\n\n eventBus.emit(CIP0103_EVENTS.STATUS_CHANGED, {\n connection: { isConnected: true },\n provider: {\n id: 'partylayer',\n version: PROVIDER_VERSION,\n providerType: 'browser',\n },\n network: toCAIP2Network(session.network),\n session: {\n accessToken: '',\n userId: String(session.partyId),\n },\n } satisfies CIP0103StatusEvent);\n\n eventBus.emit(CIP0103_EVENTS.ACCOUNTS_CHANGED, [\n {\n primary: true,\n partyId: String(session.partyId),\n status: 'allocated' as const,\n hint: '',\n publicKey: '',\n namespace: '',\n networkId: toCAIP2Network(session.network).networkId,\n signingProviderId: '',\n // Fund-safety passthrough, present only when the wallet reported it.\n hasPreapproval: session.hasPreapproval,\n utilityPreapprovalAdmins: session.utilityPreapprovalAdmins,\n },\n ] satisfies CIP0103Account[]);\n\n // Emit CIP-0103 'connected' event (async wallet completion signal)\n eventBus.emit(CIP0103_EVENTS.CONNECTED, {\n isConnected: true,\n } satisfies CIP0103ConnectResult);\n });\n\n // session:disconnected → statusChanged\n client.on('session:disconnected', () => {\n eventBus.emit(CIP0103_EVENTS.STATUS_CHANGED, {\n connection: { isConnected: false },\n provider: {\n id: 'partylayer',\n version: PROVIDER_VERSION,\n providerType: 'browser',\n },\n } satisfies CIP0103StatusEvent);\n });\n\n // tx:status → txChanged\n client.on('tx:status', (event: unknown) => {\n const e = event as {\n type: string;\n status: string;\n txId: unknown;\n raw?: unknown;\n };\n if (!e || typeof e !== 'object' || !('status' in e)) return;\n\n const statusMap: Record<string, CIP0103TxStatus> = {\n pending: 'pending',\n submitted: 'pending',\n signed: 'signed',\n committed: 'executed',\n rejected: 'failed',\n failed: 'failed',\n };\n\n const mappedStatus = statusMap[e.status] ?? 'pending';\n const commandId = String(e.txId);\n\n // Deduplicate: skip 'pending' if already emitted by prepareExecute handler\n if (mappedStatus === 'pending' && pendingEmitted.has(commandId)) {\n return;\n }\n\n // Clean up dedup tracking on terminal states\n if (mappedStatus === 'executed' || mappedStatus === 'failed') {\n pendingEmitted.delete(commandId);\n }\n\n // Build spec-compliant txChanged payload per CIP-0103 discriminated union\n let txEvent: CIP0103TxChangedEvent;\n switch (mappedStatus) {\n case 'signed':\n txEvent = {\n status: 'signed',\n commandId,\n payload: {\n signature: '',\n signedBy: '',\n party: '',\n },\n };\n break;\n case 'executed': {\n const raw = e.raw as { updateId?: string; commandId?: string } | undefined;\n txEvent = {\n status: 'executed',\n commandId,\n payload: {\n updateId: raw?.updateId ?? raw?.commandId ?? commandId,\n completionOffset: 0,\n },\n };\n break;\n }\n case 'failed':\n txEvent = { status: 'failed', commandId };\n break;\n default:\n txEvent = { status: 'pending', commandId };\n break;\n }\n\n eventBus.emit<CIP0103TxChangedEvent>(CIP0103_EVENTS.TX_CHANGED, txEvent);\n });\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction normalizeParams(\n params?: CIP0103RequestParams,\n): Record<string, unknown> {\n if (!params) return {};\n if (Array.isArray(params)) return (params[0] as Record<string, unknown>) ?? {};\n return params;\n}\n\nfunction sessionToAccount(session: {\n partyId: unknown;\n network: string;\n hasPreapproval?: boolean;\n utilityPreapprovalAdmins?: string[];\n}): CIP0103Account {\n return {\n primary: true,\n partyId: String(session.partyId),\n status: 'allocated',\n hint: '',\n publicKey: '',\n namespace: '',\n networkId: toCAIP2Network(session.network).networkId,\n signingProviderId: '',\n // Fund-safety passthrough, present only when the wallet reported it.\n hasPreapproval: session.hasPreapproval,\n utilityPreapprovalAdmins: session.utilityPreapprovalAdmins,\n };\n}\n","/**\n * Extension target-channel CIP-0103 provider.\n *\n * Builds a working CIP-0103 provider for a wallet discovered via\n * `canton:announceProvider` (see discovery.ts). Announce wallets route requests\n * over the splice-wallet postMessage protocol — the dApp posts a\n * `SPLICE_WALLET_REQUEST` on `window` and the extension replies with a\n * `SPLICE_WALLET_RESPONSE`, correlated by JSON-RPC id and routed by `target`.\n *\n * This is a self-contained, dependency-free implementation of that wire\n * protocol. We deliberately do NOT depend on `@canton-network/dapp-sdk`'s\n * `ExtensionAdapter`: its single bundled entry statically imports\n * `@walletconnect/sign-client` (an optional peer used only by its\n * WalletConnectAdapter), which is not installed and breaks every downstream\n * webpack/Next build that pulls `@partylayer/provider` into its graph\n * (confirmed against the live demo's `next build`). The protocol constants and\n * message shapes below mirror `@canton-network/core-types` (`WalletEvent`,\n * `SpliceMessage`) verbatim, so behaviour matches the official adapter.\n */\n\nimport type {\n CIP0103Provider,\n CIP0103RequestPayload,\n} from '@partylayer/core';\nimport { CIP0103EventBus } from './event-bus';\nimport { ProviderRpcError, JSON_RPC_ERRORS } from './errors';\n\n// ─── Splice wallet postMessage protocol (mirrors @canton-network/core-types) ──\n\nconst SPLICE_WALLET_REQUEST = 'SPLICE_WALLET_REQUEST';\nconst SPLICE_WALLET_RESPONSE = 'SPLICE_WALLET_RESPONSE';\n\ninterface SpliceResponseMessage {\n type: typeof SPLICE_WALLET_RESPONSE;\n response: {\n jsonrpc: '2.0';\n id?: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n };\n}\n\nexport interface ExtensionChannelOptions {\n /** Routing key (announce `target`) included on every request message. */\n target?: string;\n /** Per-request timeout in ms. Default 30000. */\n timeoutMs?: number;\n}\n\nlet channelSeq = 0;\n\n/**\n * Create a CIP-0103 provider that talks the splice-wallet postMessage protocol\n * over the page `window`, routed by `target`.\n */\nexport function createExtensionChannelProvider(\n options: ExtensionChannelOptions = {},\n): CIP0103Provider {\n const target = options.target;\n const timeoutMs = options.timeoutMs ?? 30_000;\n const eventBus = new CIP0103EventBus();\n // Unique per-provider prefix so concurrent providers never match each other's\n // responses on the shared window message bus.\n const channelId = `pl-${++channelSeq}-${target ?? 'ext'}`;\n let requestSeq = 0;\n\n const pending = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n function onMessage(event: MessageEvent): void {\n // Only accept responses posted on the page's OWN window by the content\n // script — never cross-window or cross-origin messages.\n if (event.source !== window) return;\n const selfOrigin =\n typeof window !== 'undefined' ? window.location?.origin : undefined;\n if (selfOrigin && selfOrigin !== 'null' && event.origin !== selfOrigin) return;\n\n const data = event.data as Partial<SpliceResponseMessage> | undefined;\n if (!data || data.type !== SPLICE_WALLET_RESPONSE || !data.response) return;\n const { id, result, error } = data.response;\n if (id === undefined || id === null) return;\n const entry = pending.get(String(id));\n if (!entry) return; // not ours (different provider / stale)\n pending.delete(String(id));\n clearTimeout(entry.timer);\n if (error) {\n entry.reject(\n new ProviderRpcError(\n error.message || 'Wallet request failed',\n typeof error.code === 'number' ? error.code : JSON_RPC_ERRORS.INTERNAL_ERROR,\n error.data,\n ),\n );\n } else {\n entry.resolve(result);\n }\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', onMessage as EventListener);\n }\n\n function postTargetOrigin(): string {\n const origin = typeof window !== 'undefined' ? window.location?.origin : undefined;\n return origin && origin !== 'null' ? origin : '*';\n }\n\n const provider: CIP0103Provider = {\n request<T>(args: CIP0103RequestPayload): Promise<T> {\n if (typeof window === 'undefined') {\n return Promise.reject(\n new ProviderRpcError('No window: extension channel unavailable', JSON_RPC_ERRORS.INTERNAL_ERROR),\n );\n }\n const id = `${channelId}-${++requestSeq}`;\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n pending.delete(id);\n reject(\n new ProviderRpcError(\n `Wallet request \"${args.method}\" timed out after ${timeoutMs}ms`,\n JSON_RPC_ERRORS.INTERNAL_ERROR,\n ),\n );\n }, timeoutMs);\n pending.set(id, { resolve: resolve as (v: unknown) => void, reject, timer });\n\n const message = {\n type: SPLICE_WALLET_REQUEST,\n request: {\n jsonrpc: '2.0' as const,\n id,\n method: args.method,\n ...(args.params !== undefined ? { params: args.params } : {}),\n },\n ...(target ? { target } : {}),\n };\n window.postMessage(message, postTargetOrigin());\n });\n },\n on(event, listener) {\n eventBus.on(event, listener);\n return provider;\n },\n emit(event, ...args) {\n return eventBus.emit(event, ...args);\n },\n removeListener(event, listener) {\n eventBus.removeListener(event, listener);\n return provider;\n },\n };\n\n eventBus.setOwner(provider);\n return provider;\n}\n","/**\n * CIP-0103 Wallet Discovery\n *\n * Discovers CIP-0103-compliant wallet Providers from the global scope.\n * Wallet-agnostic: no hardcoded wallet logic, only duck-type checking\n * for the Provider interface shape.\n */\n\nimport type { CIP0103Provider } from '@partylayer/core';\nimport { createExtensionChannelProvider } from './extension-channel';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/** Metadata about a discovered CIP-0103 wallet provider */\nexport interface DiscoveredProvider {\n /** Identifier (e.g. \"canton.console\", \"consoleWallet\") */\n id: string;\n /** The native CIP-0103 Provider instance */\n provider: CIP0103Provider;\n /** How it was discovered */\n source: 'injected' | 'registry';\n /** Whether the provider supports async flows (userUrl) */\n isAsync?: boolean;\n /** Display name (if discoverable from status) */\n name?: string;\n /** Icon (data: URI or URL) — populated for announce-discovered wallets. */\n icon?: string;\n /**\n * Whether this entry's STABLE IDENTITY was resolved (additive; A2.1).\n *\n * - announce-discovered entries: always `true` — the announce `id` IS the\n * wallet's real extension id (canonical provider.md: announce is the\n * discovery path).\n * - injected (`window.canton` scan) entries: `true` only when a sync\n * `provider.id` or a `status().provider.id` probe yielded a real id;\n * `false` when discovery fell back to the path id (an identity-LESS bare\n * slot, e.g. Console's `{request,on,emit,removeListener,source}` with no id).\n *\n * LIVE INCIDENT (partylayer.xyz post-A2): an identity-less bare slot resolved\n * to the path id `'canton'`; downstream that synthesized a phantom \"Canton\n * Wallet\" (`browser:ext:canton`) picker entry whose provider was the slot\n * itself. Consumers MUST drop unresolved injected entries rather than list\n * them — correctness must not depend on probe timing.\n */\n identityResolved?: boolean;\n}\n\n// ─── Well-known injection paths ─────────────────────────────────────────────\n\n/**\n * Well-known window property paths where Canton wallet providers\n * may inject themselves.\n *\n * This list is intentionally kept small and generic. New wallets\n * that follow the `window.canton.<wallet>` convention are discovered\n * automatically via namespace scanning.\n */\nconst KNOWN_INJECTION_PATHS = [\n 'canton',\n 'cantonWallet',\n 'consoleWallet',\n 'splice',\n] as const;\n\n// ─── Duck-type check ────────────────────────────────────────────────────────\n\n/**\n * Check if an object implements the CIP-0103 Provider interface.\n *\n * This is a structural (duck-type) check — it verifies the presence of\n * the four required methods without checking implementation correctness.\n */\nexport function isCIP0103Provider(obj: unknown): obj is CIP0103Provider {\n if (typeof obj !== 'object' || obj === null) return false;\n const p = obj as Record<string, unknown>;\n return (\n typeof p.request === 'function' &&\n typeof p.on === 'function' &&\n typeof p.emit === 'function' &&\n typeof p.removeListener === 'function'\n );\n}\n\n// ─── Discovery ──────────────────────────────────────────────────────────────\n\n/**\n * Discover all injected CIP-0103 providers from the global scope.\n *\n * Scans well-known window paths and their sub-properties for objects\n * that implement the Provider interface.\n */\nexport function discoverInjectedProviders(\n extraPaths?: readonly string[],\n): DiscoveredProvider[] {\n if (typeof window === 'undefined') return [];\n\n const discovered: DiscoveredProvider[] = [];\n const seen = new Set<CIP0103Provider>();\n const win = window as unknown as Record<string, unknown>;\n\n // Built-in paths plus any extra globals the caller supplies (deduped). With no\n // extras this is byte-identical to the built-in scan.\n const paths =\n extraPaths && extraPaths.length > 0\n ? [...new Set<string>([...KNOWN_INJECTION_PATHS, ...extraPaths])]\n : KNOWN_INJECTION_PATHS;\n\n for (const path of paths) {\n const candidate = win[path];\n if (candidate === undefined || candidate === null) continue;\n\n // Direct provider at top level (e.g., window.consoleWallet)\n if (isCIP0103Provider(candidate) && !seen.has(candidate)) {\n seen.add(candidate);\n discovered.push({\n id: path,\n provider: candidate,\n source: 'injected',\n });\n continue;\n }\n\n // Namespace object containing sub-providers\n // (e.g., window.canton.console, window.canton.loop)\n if (typeof candidate === 'object') {\n for (const [key, value] of Object.entries(\n candidate as Record<string, unknown>,\n )) {\n if (isCIP0103Provider(value) && !seen.has(value)) {\n seen.add(value);\n discovered.push({\n id: `${path}.${key}`,\n provider: value,\n source: 'injected',\n });\n }\n }\n }\n }\n\n return discovered;\n}\n\n/**\n * Wait for a specific provider to be injected (with timeout).\n *\n * Extensions may inject their provider after page load. This function\n * polls at 100ms intervals until the provider appears or the timeout\n * expires.\n *\n * @param id - Provider id to match (exact or suffix match)\n * @param timeoutMs - Maximum wait time (default 3000ms)\n */\nexport function waitForProvider(\n id: string,\n timeoutMs = 3000,\n): Promise<DiscoveredProvider | null> {\n return new Promise((resolve) => {\n // Check immediately\n const match = findById(id);\n if (match) {\n resolve(match);\n return;\n }\n\n const start = Date.now();\n const interval = setInterval(() => {\n const match = findById(id);\n if (match) {\n clearInterval(interval);\n resolve(match);\n return;\n }\n if (Date.now() - start >= timeoutMs) {\n clearInterval(interval);\n resolve(null);\n }\n }, 100);\n });\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction findById(id: string): DiscoveredProvider | undefined {\n return discoverInjectedProviders().find(\n (p) => p.id === id || p.id.endsWith(`.${id}`),\n );\n}\n\n// ─── Announce-based discovery (canton:announceProvider) ──────────────────────\n//\n// Some Canton wallets (notably Send) do NOT reliably expose `window.canton`:\n// when another wallet (e.g. Console) owns the single `window.canton` slot, the\n// announce wallet is missed by the scan above. Instead they advertise via the\n// EIP-6963-style discovery handshake — the same protocol the official\n// `@canton-network/dapp-sdk` consumes:\n// 1. the dApp dispatches `canton:requestProvider` on `window`;\n// 2. each wallet replies with a `canton:announceProvider` CustomEvent whose\n// `detail` carries `{ id/providerId, name, icon, target }`;\n// 3. a working provider is built over the extension `target` channel.\n//\n// Step 3 (the postMessage handshake) is implemented natively in\n// extension-channel.ts (mirroring the splice-wallet protocol from\n// `@canton-network/core-types`). We do NOT depend on\n// `@canton-network/dapp-sdk`'s `ExtensionAdapter`: its single bundled entry\n// statically imports `@walletconnect/sign-client` (an uninstalled optional\n// peer), which breaks every downstream webpack/Next build that pulls\n// `@partylayer/provider` into its graph. The factory is injectable so apps can\n// substitute the official adapter (or tests a mock).\n\n/** Wire event names for the Canton EIP-6963-style provider handshake. */\nconst CANTON_REQUEST_PROVIDER_EVENT = 'canton:requestProvider';\nconst CANTON_ANNOUNCE_PROVIDER_EVENT = 'canton:announceProvider';\n\n/** Metadata carried by a `canton:announceProvider` event. */\nexport interface AnnouncedWallet {\n /** Stable provider id (extension id), e.g. \"ldmoh…\" for Send. */\n id: string;\n /** Display name. */\n name?: string;\n /** Icon (data: URI or URL). */\n icon?: string;\n /** Routing key for the extension postMessage channel. */\n target?: string;\n}\n\nexport interface AnnounceDiscoveryOptions {\n /** How long to collect announce replies after the request (ms). Default 300. */\n timeoutMs?: number;\n /**\n * Build a CIP-0103 provider from an announced wallet. Defaults to the\n * self-contained `createExtensionChannelProvider` (splice postMessage over\n * the `target` channel). Injectable so apps can substitute the official\n * `@canton-network/dapp-sdk` `ExtensionAdapter`, and tests a mock.\n */\n createProvider?: (\n announced: AnnouncedWallet,\n ) => CIP0103Provider | Promise<CIP0103Provider>;\n /**\n * Extra window global paths to scan for an injected provider, on top of the\n * built-in list. The SDK passes the window globals that announce-transport\n * registry entries declare, so a wallet at its own dedicated global is found.\n * Deduplicated against the built-in paths; an unknown path is simply absent.\n */\n injectionPaths?: readonly string[];\n}\n\n/**\n * Default announce→provider factory: a self-contained CIP-0103 provider over\n * the splice-wallet postMessage `target` channel (no external dependency).\n */\nfunction defaultAnnounceProvider(announced: AnnouncedWallet): CIP0103Provider {\n // Canonical contract (provider.md): `target` defaults to `id` when omitted —\n // an announce with no explicit target still routes to the announcing wallet's\n // own channel, never a shared/last-one-wins slot.\n return createExtensionChannelProvider({ target: announced.target ?? announced.id });\n}\n\n/** First non-empty string among the candidates, else undefined. */\nfunction firstNonEmptyString(...vals: unknown[]): string | undefined {\n for (const v of vals) {\n if (typeof v === 'string' && v.length > 0) return v;\n }\n return undefined;\n}\n\n// Dev-only dedup for the unusable-announce diagnostic: warn once per distinct\n// offending event shape, so a wallet that re-announces on a timer cannot flood a\n// developer console. Module-scoped so it spans every discovery cycle on the page.\nconst warnedAnnounceShapes = new Set<string>();\n\n/** Stable fingerprint of an unreadable announce detail, for once-per-shape warns. */\nfunction announceShapeKey(\n detail: Record<string, unknown>,\n info: Record<string, unknown> | undefined,\n): string {\n const top = Object.keys(detail).sort().join(',');\n const inner = info ? Object.keys(info).sort().join(',') : '';\n return `${top}|${inner}`;\n}\n\n/**\n * Read the announced wallet from a `canton:announceProvider` detail. The id is\n * the first non-empty string among providerId, id, info.uuid, info.rdns, in that\n * order, used as BOTH the dedup key and the channel target, so an announce whose\n * identity cannot be read as a non-empty string is never trusted. Name and icon\n * may come from the top level or from an `info` object. Returns undefined for an\n * unreadable announce and, in development only, warns once per distinct offending\n * event shape. Never throws and never blocks discovery.\n */\nfunction readAnnouncedWallet(\n detail: Record<string, unknown> | undefined,\n): AnnouncedWallet | undefined {\n if (!detail) return undefined;\n const info =\n typeof detail.info === 'object' && detail.info !== null\n ? (detail.info as Record<string, unknown>)\n : undefined;\n const id = firstNonEmptyString(detail.providerId, detail.id, info?.uuid, info?.rdns);\n if (id === undefined) {\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production') {\n const key = announceShapeKey(detail, info);\n if (!warnedAnnounceShapes.has(key)) {\n warnedAnnounceShapes.add(key);\n // eslint-disable-next-line no-console\n console.warn(\n '[PartyLayer] Ignored a canton:announceProvider event: no readable provider id ' +\n '(expected a non-empty string at detail.providerId, detail.id, or detail.info.uuid). ' +\n 'See https://partylayer.xyz/docs/generic-bridge',\n );\n }\n }\n return undefined;\n }\n return {\n id,\n name: firstNonEmptyString(detail.name, info?.name),\n icon: firstNonEmptyString(detail.icon, info?.icon),\n target: firstNonEmptyString(detail.target),\n };\n}\n\n/**\n * Discover wallets that advertise via `canton:announceProvider` (EIP-6963-style).\n *\n * Works regardless of who owns `window.canton` — this is how Send (and\n * Console-via-announce) are found. Each result is a working CIP-0103 provider.\n * Announce replies are deduped by id within a single call.\n */\nexport async function discoverAnnouncedProviders(\n options: AnnounceDiscoveryOptions = {},\n): Promise<DiscoveredProvider[]> {\n if (typeof window === 'undefined') return [];\n\n const timeoutMs = options.timeoutMs ?? 300;\n const make = options.createProvider ?? defaultAnnounceProvider;\n\n const announced = new Map<string, AnnouncedWallet>();\n const onAnnounce = (event: Event): void => {\n const detail = (event as CustomEvent).detail as\n | Record<string, unknown>\n | undefined;\n const wallet = readAnnouncedWallet(detail);\n if (!wallet) return;\n if (announced.has(wallet.id)) return; // dedup announce replies by id\n announced.set(wallet.id, wallet);\n };\n\n window.addEventListener(\n CANTON_ANNOUNCE_PROVIDER_EVENT,\n onAnnounce as EventListener,\n );\n try {\n window.dispatchEvent(new CustomEvent(CANTON_REQUEST_PROVIDER_EVENT));\n await new Promise<void>((resolve) => setTimeout(resolve, timeoutMs));\n } finally {\n window.removeEventListener(\n CANTON_ANNOUNCE_PROVIDER_EVENT,\n onAnnounce as EventListener,\n );\n }\n\n const results: DiscoveredProvider[] = [];\n for (const wallet of announced.values()) {\n let provider: CIP0103Provider;\n try {\n provider = await make(wallet);\n } catch {\n continue; // a wallet whose provider cannot be built is skipped, not fatal\n }\n if (!isCIP0103Provider(provider)) continue;\n results.push({\n id: wallet.id,\n provider,\n source: 'injected',\n name: wallet.name,\n icon: wallet.icon,\n });\n }\n return results;\n}\n\n/** Options for {@link subscribeAnnouncedProviders}. */\nexport interface AnnounceSubscribeOptions {\n /** Build a CIP-0103 provider from an announce. Defaults to the channel provider. */\n createProvider?: (\n announced: AnnouncedWallet,\n ) => CIP0103Provider | Promise<CIP0103Provider>;\n /** Dispatch `canton:requestProvider` on subscribe to elicit replies (default true). */\n requestOnSubscribe?: boolean;\n}\n\n/**\n * PERSISTENT (EIP-6963-style) announce subscription. Mounts a `window` listener\n * for `canton:announceProvider` that stays up until the returned unsubscribe runs.\n * Unlike {@link discoverAnnouncedProviders} (a one-shot snapshot that stops\n * listening after `timeoutMs`), this captures announces that arrive AT ANY TIME —\n * both LATE (slow/late extension injection, after the request window) and announces\n * fired on inject BEFORE this subscription. Dispatches `canton:requestProvider`\n * once on subscribe (unless disabled) to elicit replies. Calls `onProvider` once\n * per newly-announced id (deduped) whose provider builds + passes the CIP-0103\n * shape check.\n *\n * The caller MUST call the returned unsubscribe to remove the listener (no leak).\n */\nexport function subscribeAnnouncedProviders(\n onProvider: (provider: DiscoveredProvider) => void,\n options: AnnounceSubscribeOptions = {},\n): () => void {\n if (typeof window === 'undefined') return () => {};\n const make = options.createProvider ?? defaultAnnounceProvider;\n const seen = new Set<string>();\n\n const onAnnounce = (event: Event): void => {\n const detail = (event as CustomEvent).detail as\n | Record<string, unknown>\n | undefined;\n const wallet = readAnnouncedWallet(detail);\n if (!wallet) return;\n if (seen.has(wallet.id)) return; // dedup announce replies by id\n seen.add(wallet.id);\n // Build the provider off the event tick; a wallet whose provider can't be\n // built (or isn't CIP-0103) is skipped, not fatal — mirrors discoverAnnouncedProviders.\n void Promise.resolve()\n .then(() => make(wallet))\n .then((provider) => {\n if (!isCIP0103Provider(provider)) return;\n onProvider({\n id: wallet.id,\n provider,\n source: 'injected',\n name: wallet.name,\n icon: wallet.icon,\n });\n })\n .catch(() => {\n /* unbuildable provider — skip */\n });\n };\n\n window.addEventListener(\n CANTON_ANNOUNCE_PROVIDER_EVENT,\n onAnnounce as EventListener,\n );\n if (options.requestOnSubscribe !== false) {\n window.dispatchEvent(new CustomEvent(CANTON_REQUEST_PROVIDER_EVENT));\n }\n return () =>\n window.removeEventListener(\n CANTON_ANNOUNCE_PROVIDER_EVENT,\n onAnnounce as EventListener,\n );\n}\n\n/** Options for {@link waitForAnnouncedProvider}. */\nexport interface WaitForAnnouncedOptions extends AnnounceSubscribeOptions {\n /** Max wait before resolving null (default 3000ms). Resolves EARLY on a match. */\n timeoutMs?: number;\n}\n\n/**\n * Resolve the FIRST announced provider matching `predicate` the MOMENT it arrives,\n * or `null` after `timeoutMs`. Built on {@link subscribeAnnouncedProviders}, so a\n * LATE announce within the bound is captured (vs a fixed window that returns its\n * snapshot at a fixed time and misses anything later). Auto-unsubscribes on\n * resolve/timeout — no lingering listener.\n */\nexport function waitForAnnouncedProvider(\n predicate: (provider: DiscoveredProvider) => boolean,\n options: WaitForAnnouncedOptions = {},\n): Promise<DiscoveredProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n const timeoutMs = options.timeoutMs ?? 3000;\n return new Promise<DiscoveredProvider | null>((resolve) => {\n // const holder so the mutual references (finish ↔ unsubscribe/timer) don't\n // need `let`-assigned-once locals (prefer-const).\n const h: { done: boolean; unsubscribe: () => void; timer?: ReturnType<typeof setTimeout> } = {\n done: false,\n unsubscribe: () => {},\n };\n const finish = (value: DiscoveredProvider | null): void => {\n if (h.done) return;\n h.done = true;\n if (h.timer) clearTimeout(h.timer);\n h.unsubscribe();\n resolve(value);\n };\n h.unsubscribe = subscribeAnnouncedProviders((p) => {\n if (predicate(p)) finish(p);\n }, { createProvider: options.createProvider, requestOnSubscribe: options.requestOnSubscribe });\n h.timer = setTimeout(() => finish(null), timeoutMs);\n });\n}\n\n/** Max time to spend on the read-only status() id-probe for ONE injected provider. */\nconst INJECTED_ID_PROBE_TIMEOUT_MS = 1500;\n\nfunction raceTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error('id-probe timeout')), ms),\n ),\n ]);\n}\n\n/**\n * Resolve the stable dedup id for an INJECTED (window.canton scan) entry.\n *\n * Live reality: Console's `window.canton` has NO top-level `id` — its stable id\n * is only available via `status().provider.id` (== its announce id/target). So:\n * 1. use a sync top-level `provider.id` if a provider ever exposes one;\n * 2. else a READ-ONLY `status()` probe reading `result.provider.id` (Console\n * → \"lpnf…\", no popup / no signing UI), capped so a non-responsive\n * injected provider can NEVER block discovery;\n * 3. else fall back to the discovery-path id.\n */\nasync function resolveInjectedKey(\n d: DiscoveredProvider,\n): Promise<{ key: string; resolved: boolean }> {\n const sync = (d.provider as unknown as { id?: unknown }).id;\n if (typeof sync === 'string' && sync.length > 0) return { key: sync, resolved: true };\n\n try {\n const status = await raceTimeout(\n d.provider.request<{ provider?: { id?: unknown } }>({ method: 'status' }),\n INJECTED_ID_PROBE_TIMEOUT_MS,\n );\n const pid = status?.provider?.id;\n if (typeof pid === 'string' && pid.length > 0) return { key: pid, resolved: true };\n } catch {\n // timeout / throw / non-responsive → fall back to the path id (UNRESOLVED)\n }\n // A2.1: identity-less bare slot — keyed by the path id, but NOT a real identity.\n return { key: d.id, resolved: false };\n}\n\n/**\n * Discover ALL CIP-0103 wallets: the synchronous `window.canton` scan PLUS the\n * `canton:announceProvider` handshake, MERGED and deduped by stable provider id.\n *\n * Dedup keys:\n * - INJECTED entries: resolved via {@link resolveInjectedKey} (sync id →\n * capped read-only status() probe → path id). Resolved in PARALLEL.\n * - ANNOUNCE entries: their `d.id` (== announce id == target == the wallet's\n * `provider.id`). NOT status-probed — an offline announce wallet (e.g. Send)\n * would otherwise hang up to the channel timeout.\n *\n * INJECTED entries are processed FIRST so the direct `window.canton` provider\n * wins over the announce postMessage shim for a wallet reachable both ways\n * (e.g. Console announces AND owns `window.canton` → appears exactly once).\n *\n * Backward-compatible superset of `discoverInjectedProviders()` (left unchanged).\n */\nexport async function discoverProviders(\n options: AnnounceDiscoveryOptions = {},\n): Promise<DiscoveredProvider[]> {\n const injected = discoverInjectedProviders(options.injectionPaths);\n const announcedResults = await discoverAnnouncedProviders(options);\n\n // Resolve injected keys in parallel; each probe is independently capped.\n const injectedKeys = await Promise.all(injected.map(resolveInjectedKey));\n\n const out: DiscoveredProvider[] = [];\n const seen = new Set<string>();\n\n // INJECTED first — the direct window.canton provider wins on duplicate ids.\n // A2.1: tag identityResolved so consumers can drop identity-less bare slots\n // (which keyed to the path id) instead of synthesizing a phantom entry.\n injected.forEach((d, i) => {\n const { key, resolved } = injectedKeys[i];\n if (seen.has(key)) return;\n seen.add(key);\n // A2.1: when identity RESOLVED, the entry's `id` IS that real provider id —\n // so the SDK identity-bridge matches the right wallet (e.g. Console's bare\n // slot status() → \"lpnf…\" → bridges to console) instead of the discovery\n // PATH id (\"canton\") which matches nothing and synthesized the phantom.\n // When UNRESOLVED it keeps the path id and is flagged so consumers drop it.\n out.push({ ...d, id: resolved ? key : d.id, identityResolved: resolved });\n });\n\n // ANNOUNCE entries keyed by their own id (no status probe → offline-safe).\n // The announce id IS the wallet's real identity (provider.md), so resolved.\n for (const d of announcedResults) {\n if (seen.has(d.id)) continue;\n seen.add(d.id);\n out.push({ ...d, identityResolved: true });\n }\n\n return out;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@partylayer/provider",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"description": "CIP-0103 native Provider implementation for PartyLayer",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"url": "https://github.com/PartyLayer/PartyLayer/issues"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@partylayer/core": "^0.
|
|
37
|
+
"@partylayer/core": "^0.13.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@vitest/ui": "^1.2.0",
|