@partylayer/provider 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/index.d.mts +83 -1
- package/dist/index.d.ts +83 -1
- package/dist/index.js +191 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +189 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -5
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/network.ts","../src/bridge.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 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 TIMEOUT: JSON_RPC_ERRORS.INVALID_INPUT,\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};\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 * CAIP-2 Network Identity Utilities\n *\n * All CIP-0103 network identifiers use CAIP-2 format: \"namespace:reference\"\n * e.g. \"canton:da-mainnet\", \"canton:da-devnet\"\n *\n * Reference: https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md\n */\n\nimport type { CIP0103Network } from '@partylayer/core';\n\n// ─── Well-known Canton CAIP-2 Network IDs ───────────────────────────────────\n\nexport const CANTON_NETWORKS: Record<string, string> = {\n mainnet: 'canton:da-mainnet',\n testnet: 'canton:da-testnet',\n devnet: 'canton:da-devnet',\n local: 'canton:da-local',\n};\n\n// ─── Reverse lookup ─────────────────────────────────────────────────────────\n\nconst CAIP2_TO_SHORT: Record<string, string> = Object.fromEntries(\n Object.entries(CANTON_NETWORKS).map(([short, full]) => [full, short]),\n);\n\n/**\n * Convert a legacy PartyLayer NetworkId (e.g. \"devnet\") or already-CAIP-2\n * string to a CIP-0103 Network object.\n *\n * @throws {Error} if the resulting network ID is not valid CAIP-2\n */\nexport function toCAIP2Network(networkId: string): CIP0103Network {\n let result: string;\n\n if (networkId.includes(':')) {\n // Already CAIP-2 format\n result = networkId;\n } else {\n // Map well-known short names\n const caip2 = CANTON_NETWORKS[networkId];\n result = caip2 ?? `canton:${networkId}`;\n }\n\n if (!isValidCAIP2(result)) {\n throw new Error(\n `Invalid CAIP-2 network identifier: \"${result}\". Expected format: \"namespace:reference\"`,\n );\n }\n\n return { networkId: result };\n}\n\n/**\n * Extract the short network name from a CAIP-2 ID.\n * Returns the original string if no reverse mapping exists.\n */\nexport function fromCAIP2Network(caip2: string): string {\n const short = CAIP2_TO_SHORT[caip2];\n if (short) return short;\n\n // Extract reference part after ':'\n const colonIndex = caip2.indexOf(':');\n return colonIndex >= 0 ? caip2.slice(colonIndex + 1) : caip2;\n}\n\n/**\n * Validate that a string conforms to CAIP-2 format.\n *\n * CAIP-2 format: namespace:reference\n * - namespace: [-a-z0-9]{3,8}\n * - reference: [-_a-zA-Z0-9]{1,32}\n */\nexport function isValidCAIP2(networkId: string): boolean {\n return /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$/.test(networkId);\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} 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;\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 requestMethod: String(p.requestMethod ?? 'GET') as 'GET' | 'POST' | 'PUT' | 'DELETE',\n resource: String(p.resource ?? ''),\n body: p.body ? String(p.body) : 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 } }).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 },\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}): 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 };\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';\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}\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"]}
|
|
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/network.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 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 TIMEOUT: JSON_RPC_ERRORS.INVALID_INPUT,\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};\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 * CAIP-2 Network Identity Utilities\n *\n * All CIP-0103 network identifiers use CAIP-2 format: \"namespace:reference\"\n * e.g. \"canton:da-mainnet\", \"canton:da-devnet\"\n *\n * Reference: https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md\n */\n\nimport type { CIP0103Network } from '@partylayer/core';\n\n// ─── Well-known Canton CAIP-2 Network IDs ───────────────────────────────────\n\nexport const CANTON_NETWORKS: Record<string, string> = {\n mainnet: 'canton:da-mainnet',\n testnet: 'canton:da-testnet',\n devnet: 'canton:da-devnet',\n local: 'canton:da-local',\n};\n\n// ─── Reverse lookup ─────────────────────────────────────────────────────────\n\nconst CAIP2_TO_SHORT: Record<string, string> = Object.fromEntries(\n Object.entries(CANTON_NETWORKS).map(([short, full]) => [full, short]),\n);\n\n/**\n * Convert a legacy PartyLayer NetworkId (e.g. \"devnet\") or already-CAIP-2\n * string to a CIP-0103 Network object.\n *\n * @throws {Error} if the resulting network ID is not valid CAIP-2\n */\nexport function toCAIP2Network(networkId: string): CIP0103Network {\n let result: string;\n\n if (networkId.includes(':')) {\n // Already CAIP-2 format\n result = networkId;\n } else {\n // Map well-known short names\n const caip2 = CANTON_NETWORKS[networkId];\n result = caip2 ?? `canton:${networkId}`;\n }\n\n if (!isValidCAIP2(result)) {\n throw new Error(\n `Invalid CAIP-2 network identifier: \"${result}\". Expected format: \"namespace:reference\"`,\n );\n }\n\n return { networkId: result };\n}\n\n/**\n * Extract the short network name from a CAIP-2 ID.\n * Returns the original string if no reverse mapping exists.\n */\nexport function fromCAIP2Network(caip2: string): string {\n const short = CAIP2_TO_SHORT[caip2];\n if (short) return short;\n\n // Extract reference part after ':'\n const colonIndex = caip2.indexOf(':');\n return colonIndex >= 0 ? caip2.slice(colonIndex + 1) : caip2;\n}\n\n/**\n * Validate that a string conforms to CAIP-2 format.\n *\n * CAIP-2 format: namespace:reference\n * - namespace: [-a-z0-9]{3,8}\n * - reference: [-_a-zA-Z0-9]{1,32}\n */\nexport function isValidCAIP2(networkId: string): boolean {\n return /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$/.test(networkId);\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} 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;\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 requestMethod: String(p.requestMethod ?? 'GET') as 'GET' | 'POST' | 'PUT' | 'DELETE',\n resource: String(p.resource ?? ''),\n body: p.body ? String(p.body) : 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 } }).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 },\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}): 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 };\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\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 return createExtensionChannelProvider({ target: announced.target });\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/** 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(d: DiscoveredProvider): Promise<string> {\n const sync = (d.provider as unknown as { id?: unknown }).id;\n if (typeof sync === 'string' && sync.length > 0) return sync;\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 pid;\n } catch {\n // timeout / throw / non-responsive → fall back to the path id\n }\n return d.id;\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 injected.forEach((d, i) => {\n const key = injectedKeys[i];\n if (seen.has(key)) return;\n seen.add(key);\n out.push(d);\n });\n\n // ANNOUNCE entries keyed by their own id (no status probe → offline-safe).\n for (const d of announcedResults) {\n if (seen.has(d.id)) continue;\n seen.add(d.id);\n out.push(d);\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.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CIP-0103 native Provider implementation for PartyLayer",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -33,13 +33,14 @@
|
|
|
33
33
|
"url": "https://github.com/PartyLayer/PartyLayer/issues"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@partylayer/core": "^0.
|
|
36
|
+
"@partylayer/core": "^0.4.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"
|
|
39
|
+
"@vitest/ui": "^1.2.0",
|
|
40
|
+
"jsdom": "^24.0.0",
|
|
40
41
|
"tsup": "^8.0.0",
|
|
41
|
-
"
|
|
42
|
-
"
|
|
42
|
+
"typescript": "^5.3.3",
|
|
43
|
+
"vitest": "^1.2.0"
|
|
43
44
|
},
|
|
44
45
|
"scripts": {
|
|
45
46
|
"build": "tsup",
|