@cantonconnect/core 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/adapters.ts","../src/session.ts","../src/transport/deeplink.ts","../src/transport/popup.ts","../src/transport/postmessage.ts","../src/transport/mock.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core types for CantonConnect SDK\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\n/**\n * Branded string types for type safety\n */\nexport type WalletId = string & { readonly __brand: 'WalletId' };\nexport type PartyId = string & { readonly __brand: 'PartyId' };\nexport type SessionId = string & { readonly __brand: 'SessionId' };\nexport type TransactionHash = string & { readonly __brand: 'TransactionHash' };\nexport type Signature = string & { readonly __brand: 'Signature' };\n\n/**\n * Network identifier\n * Standard networks: \"devnet\" | \"testnet\" | \"mainnet\"\n * Custom networks allowed as string\n */\nexport type NetworkId = 'devnet' | 'testnet' | 'mainnet' | string;\n\n/**\n * Capability keys that wallets can support\n * Based on OpenRPC dApp API capabilities\n */\nexport type CapabilityKey =\n | 'connect'\n | 'disconnect'\n | 'restore'\n | 'signMessage'\n | 'signTransaction'\n | 'submitTransaction'\n | 'events'\n | 'deeplink'\n | 'popup'\n | 'injected'\n | 'remoteSigner';\n\n/**\n * Wallet installation hints for detection\n */\nexport interface InstallHints {\n /** Window property name (e.g., \"consoleWallet\") */\n injectedKey?: string;\n /** Browser extension ID */\n extensionId?: string;\n /** Deep link scheme (e.g., \"loop://\") */\n deepLinkScheme?: string;\n /** Script tag identifier */\n scriptTag?: string;\n}\n\n/**\n * Wallet adapter metadata\n */\nexport interface AdapterMetadata {\n /** NPM package name */\n packageName: string;\n /** Version range (semver) */\n versionRange: string;\n}\n\n/**\n * Wallet information from registry\n */\nexport interface WalletInfo {\n /** Wallet identifier */\n walletId: WalletId;\n /** Display name */\n name: string;\n /** Website URL */\n website: string;\n /** Icon URLs (different sizes) */\n icons: {\n sm?: string;\n md?: string;\n lg?: string;\n };\n /** Category (e.g., \"browser\", \"mobile\", \"hardware\") */\n category?: string;\n /** Supported capabilities */\n capabilities: CapabilityKey[];\n /** Installation detection hints */\n installHints?: InstallHints;\n /** Adapter package information */\n adapter: AdapterMetadata;\n /** Documentation URLs */\n docs: string[];\n /** Minimum SDK version required */\n minSdkVersion?: string;\n /** Supported networks */\n networks: NetworkId[];\n /** Registry channel */\n channel: 'stable' | 'beta';\n /** Additional metadata (e.g., originAllowlist) */\n metadata?: Record<string, string>;\n}\n\n/**\n * Session information\n * Sessions are origin-bound and encrypted in storage\n */\nexport interface Session {\n /** Unique session ID */\n sessionId: SessionId;\n /** Wallet identifier */\n walletId: WalletId;\n /** Connected party ID */\n partyId: PartyId;\n /** Current network */\n network: NetworkId;\n /** Session creation timestamp */\n createdAt: number;\n /** Session expiration timestamp (if applicable) */\n expiresAt?: number;\n /** Origin of the dApp that created the session */\n origin: string;\n /** Capabilities available in this session */\n capabilitiesSnapshot: CapabilityKey[];\n /** Additional metadata (encrypted in storage) */\n metadata?: Record<string, string>;\n}\n\n/**\n * Persisted session (for restoration)\n */\nexport interface PersistedSession extends Session {\n /** Encrypted session data */\n encrypted: string;\n}\n\n/**\n * Signed message result\n */\nexport interface SignedMessage {\n /** Signature */\n signature: Signature;\n /** Party ID that signed */\n partyId: PartyId;\n /** Original message */\n message: string;\n /** Nonce used (if provided) */\n nonce?: string;\n /** Domain used (if provided) */\n domain?: string;\n}\n\n/**\n * Signed transaction result\n */\nexport interface SignedTransaction {\n /** Signed transaction data */\n signedTx: unknown;\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Party ID that signed */\n partyId: PartyId;\n}\n\n/**\n * Transaction receipt\n */\nexport interface TxReceipt {\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Submission timestamp */\n submittedAt: number;\n /** Command ID (if available) */\n commandId?: string;\n /** Update ID (if available) */\n updateId?: string;\n}\n\n/**\n * Transaction status\n */\nexport type TransactionStatus =\n | 'pending'\n | 'submitted'\n | 'committed'\n | 'rejected'\n | 'failed';\n\n/**\n * Transaction status update\n */\nexport interface TxStatusUpdate {\n /** Session ID */\n sessionId: SessionId;\n /** Transaction ID */\n txId: TransactionHash;\n /** Current status */\n status: TransactionStatus;\n /** Raw transaction data (if available) */\n raw?: unknown;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Helper to create branded WalletId\n */\nexport function toWalletId(id: string): WalletId {\n return id as WalletId;\n}\n\n/**\n * Helper to create branded PartyId\n */\nexport function toPartyId(id: string): PartyId {\n return id as PartyId;\n}\n\n/**\n * Helper to create branded SessionId\n */\nexport function toSessionId(id: string): SessionId {\n return id as SessionId;\n}\n\n/**\n * Helper to create branded TransactionHash\n */\nexport function toTransactionHash(hash: string): TransactionHash {\n return hash as TransactionHash;\n}\n\n/**\n * Helper to create branded Signature\n */\nexport function toSignature(sig: string): Signature {\n return sig as Signature;\n}\n","/**\n * Error taxonomy for CantonConnect SDK\n * \n * All errors extend CantonConnectError with stable error codes.\n * Error codes are string literals for telemetry and UI message mapping.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\n/**\n * Error code union - stable string literals for telemetry and UI\n */\nexport type ErrorCode =\n | 'WALLET_NOT_FOUND'\n | 'WALLET_NOT_INSTALLED'\n | 'USER_REJECTED'\n | 'ORIGIN_NOT_ALLOWED'\n | 'SESSION_EXPIRED'\n | 'CAPABILITY_NOT_SUPPORTED'\n | 'TRANSPORT_ERROR'\n | 'REGISTRY_FETCH_FAILED'\n | 'REGISTRY_VERIFICATION_FAILED'\n | 'REGISTRY_SCHEMA_INVALID'\n | 'INTERNAL_ERROR'\n | 'TIMEOUT';\n\n/**\n * Error mapping context\n */\nexport interface ErrorMappingContext {\n /** Wallet ID (if applicable) */\n walletId?: string;\n /** Operation phase */\n phase: 'connect' | 'restore' | 'signMessage' | 'signTransaction' | 'submitTransaction';\n /** Transport type */\n transport?: 'injected' | 'popup' | 'deeplink' | 'remote';\n /** Timeout in milliseconds (for timeout errors) */\n timeoutMs?: number;\n /** Additional context */\n details?: Record<string, unknown>;\n}\n\n/**\n * Base error class for all CantonConnect errors\n */\nexport class CantonConnectError extends Error {\n public readonly code: ErrorCode;\n public readonly cause?: unknown;\n public readonly details?: Record<string, unknown>;\n public readonly isOperational: boolean;\n\n constructor(\n message: string,\n code: ErrorCode,\n options?: {\n cause?: unknown;\n details?: Record<string, unknown>;\n isOperational?: boolean;\n }\n ) {\n super(message);\n this.name = 'CantonConnectError';\n this.code = code;\n this.cause = options?.cause;\n this.details = options?.details;\n this.isOperational = options?.isOperational ?? true;\n\n // Maintains proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CantonConnectError);\n }\n }\n\n /**\n * Serialize error to JSON for telemetry/logging\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n isOperational: this.isOperational,\n details: this.details,\n cause: this.cause instanceof Error\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : this.cause,\n };\n }\n}\n\n/**\n * Wallet not found error\n */\nexport class WalletNotFoundError extends CantonConnectError {\n constructor(walletId: string) {\n super(`Wallet \"${walletId}\" not found`, 'WALLET_NOT_FOUND', {\n details: { walletId },\n });\n this.name = 'WalletNotFoundError';\n }\n}\n\n/**\n * Wallet not installed error\n */\nexport class WalletNotInstalledError extends CantonConnectError {\n constructor(walletId: string, reason?: string) {\n super(\n `Wallet \"${walletId}\" is not installed${reason ? `: ${reason}` : ''}`,\n 'WALLET_NOT_INSTALLED',\n {\n details: { walletId, reason },\n }\n );\n this.name = 'WalletNotInstalledError';\n }\n}\n\n/**\n * User rejected error\n */\nexport class UserRejectedError extends CantonConnectError {\n constructor(operation: string, details?: Record<string, unknown>) {\n super(`User rejected ${operation}`, 'USER_REJECTED', {\n details: { operation, ...details },\n });\n this.name = 'UserRejectedError';\n }\n}\n\n/**\n * Origin not allowed error\n */\nexport class OriginNotAllowedError extends CantonConnectError {\n constructor(origin: string, allowedOrigins?: string[]) {\n super(\n `Origin \"${origin}\" is not allowed`,\n 'ORIGIN_NOT_ALLOWED',\n {\n details: { origin, allowedOrigins },\n }\n );\n this.name = 'OriginNotAllowedError';\n }\n}\n\n/**\n * Session expired error\n */\nexport class SessionExpiredError extends CantonConnectError {\n constructor(sessionId: string) {\n super(`Session \"${sessionId}\" has expired`, 'SESSION_EXPIRED', {\n details: { sessionId },\n });\n this.name = 'SessionExpiredError';\n }\n}\n\n/**\n * Capability not supported error\n */\nexport class CapabilityNotSupportedError extends CantonConnectError {\n constructor(walletId: string, capability: string) {\n super(\n `Wallet \"${walletId}\" does not support capability \"${capability}\"`,\n 'CAPABILITY_NOT_SUPPORTED',\n {\n details: { walletId, capability },\n }\n );\n this.name = 'CapabilityNotSupportedError';\n }\n}\n\n/**\n * Transport error\n */\nexport class TransportError extends CantonConnectError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'TRANSPORT_ERROR', {\n cause,\n details,\n });\n this.name = 'TransportError';\n }\n}\n\n/**\n * Registry fetch failed error\n */\nexport class RegistryFetchFailedError extends CantonConnectError {\n constructor(url: string, cause?: unknown) {\n super(`Failed to fetch registry from \"${url}\"`, 'REGISTRY_FETCH_FAILED', {\n cause,\n details: { url },\n });\n this.name = 'RegistryFetchFailedError';\n }\n}\n\n/**\n * Registry verification failed error\n */\nexport class RegistryVerificationFailedError extends CantonConnectError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry verification failed: ${reason}`, 'REGISTRY_VERIFICATION_FAILED', {\n details: { reason, ...details },\n });\n this.name = 'RegistryVerificationFailedError';\n }\n}\n\n/**\n * Registry schema invalid error\n */\nexport class RegistrySchemaInvalidError extends CantonConnectError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry schema invalid: ${reason}`, 'REGISTRY_SCHEMA_INVALID', {\n details: { reason, ...details },\n });\n this.name = 'RegistrySchemaInvalidError';\n }\n}\n\n/**\n * Internal error (non-operational)\n */\nexport class InternalError extends CantonConnectError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'INTERNAL_ERROR', {\n cause,\n details,\n isOperational: false,\n });\n this.name = 'InternalError';\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends CantonConnectError {\n constructor(operation: string, timeoutMs: number) {\n super(\n `Operation \"${operation}\" timed out after ${timeoutMs}ms`,\n 'TIMEOUT',\n {\n details: { operation, timeoutMs },\n }\n );\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Map unknown errors to CantonConnectError\n * \n * This is the single error mapping strategy used by all adapters.\n * It normalizes errors from various sources (wallet SDKs, network, etc.)\n * into typed CantonConnectError instances.\n */\nexport function mapUnknownErrorToCantonConnectError(\n err: unknown,\n context: ErrorMappingContext\n): CantonConnectError {\n // Already a CantonConnectError\n if (err instanceof CantonConnectError) {\n return err;\n }\n\n // Standard Error\n if (err instanceof Error) {\n const message = err.message.toLowerCase();\n\n // User rejection patterns\n if (\n message.includes('rejected') ||\n message.includes('denied') ||\n message.includes('cancelled') ||\n message.includes('canceled') ||\n err.name === 'UserRejectedError'\n ) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n originalMessage: err.message,\n });\n }\n\n // Timeout patterns\n if (\n message.includes('timeout') ||\n message.includes('timed out') ||\n err.name === 'TimeoutError'\n ) {\n // Try to get timeout from context, or extract from error message, or default to 0\n let timeoutMs = context.timeoutMs ?? 0;\n if (timeoutMs === 0) {\n // Try to extract from message like \"timed out after 30000ms\" or \"timeout after 30s\"\n const msMatch = err.message.match(/(\\d+)\\s*ms/i);\n const secMatch = err.message.match(/(\\d+)\\s*(?:sec|second)/i);\n if (msMatch) {\n timeoutMs = parseInt(msMatch[1], 10);\n } else if (secMatch) {\n timeoutMs = parseInt(secMatch[1], 10) * 1000;\n }\n }\n return new TimeoutError(context.phase, timeoutMs);\n }\n\n // Network/transport errors\n if (\n message.includes('network') ||\n message.includes('fetch') ||\n message.includes('connection') ||\n err.name === 'NetworkError' ||\n err.name === 'TypeError'\n ) {\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Generic transport error\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n originalError: err.name,\n });\n }\n\n // String errors\n if (typeof err === 'string') {\n return new TransportError(err, undefined, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Unknown error type\n return new InternalError(\n `Unknown error in ${context.phase}`,\n err,\n {\n walletId: context.walletId,\n transport: context.transport,\n errorType: typeof err,\n }\n );\n}\n","/**\n * Wallet adapter interface contract\n * \n * All wallet adapters must implement this interface.\n * Adapters are responsible for:\n * - Detecting wallet installation\n * - Establishing connections\n * - Signing messages/transactions\n * - Emitting events\n * \n * References:\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletId,\n PartyId,\n NetworkId,\n CapabilityKey,\n Session,\n PersistedSession,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n} from './types';\nimport {\n CapabilityNotSupportedError,\n WalletNotInstalledError,\n} from './errors';\n\n/**\n * Adapter detection result\n */\nexport interface AdapterDetectResult {\n /** Whether wallet is installed */\n installed: boolean;\n /** Reason if not installed */\n reason?: string;\n}\n\n/**\n * Adapter connection result\n */\nexport interface AdapterConnectResult {\n /** Connected party ID */\n partyId: PartyId;\n /** Partial session data (SDK will complete it) */\n session: Partial<Session>;\n /** Capabilities available in this session */\n capabilities: CapabilityKey[];\n}\n\n/**\n * Sign message parameters\n */\nexport interface SignMessageParams {\n /** Message to sign */\n message: string;\n /** Optional nonce */\n nonce?: string;\n /** Optional domain */\n domain?: string;\n}\n\n/**\n * Sign transaction parameters\n */\nexport interface SignTransactionParams {\n /** Transaction to sign (type kept as unknown for wallet-specific formats) */\n tx: unknown;\n}\n\n/**\n * Submit transaction parameters\n */\nexport interface SubmitTransactionParams {\n /** Signed transaction */\n signedTx: unknown;\n}\n\n/**\n * Logger interface\n */\nexport interface LoggerAdapter {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, error?: unknown, ...args: unknown[]): void;\n}\n\n/**\n * Telemetry interface\n */\nexport interface TelemetryAdapter {\n track(event: string, properties?: Record<string, unknown>): void;\n error(error: Error, properties?: Record<string, unknown>): void;\n}\n\n/**\n * Crypto interface\n */\nexport interface CryptoAdapter {\n encrypt(data: string, key: string): Promise<string>;\n decrypt(encrypted: string, key: string): Promise<string>;\n generateKey(): Promise<string>;\n}\n\n/**\n * Storage interface\n */\nexport interface StorageAdapter {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n remove(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\n/**\n * Registry client interface (for adapters to query wallet info)\n */\nexport interface RegistryClientAdapter {\n getWallet(walletId: WalletId): Promise<unknown>;\n}\n\n/**\n * Adapter context provided to all adapter methods\n */\nexport interface AdapterContext {\n /** Application name */\n appName: string;\n /** Origin (for origin binding) */\n origin: string;\n /** Network */\n network: NetworkId;\n /** Logger */\n logger: LoggerAdapter;\n /** Telemetry (optional) */\n telemetry?: TelemetryAdapter;\n /** Registry client */\n registry: RegistryClientAdapter;\n /** Crypto adapter */\n crypto: CryptoAdapter;\n /** Storage adapter */\n storage: StorageAdapter;\n /** Timeout helper */\n timeout: (ms: number) => Promise<never>;\n /** Abort signal (for cancellation) */\n abortSignal?: AbortSignal;\n}\n\n/**\n * Adapter event names\n */\nexport type AdapterEventName =\n | 'connect'\n | 'disconnect'\n | 'sessionExpired'\n | 'txStatus'\n | 'error';\n\n/**\n * Wallet adapter interface\n * \n * All wallet adapters must implement this interface.\n * Optional methods (marked with ?) should only be implemented\n * if the wallet supports that capability.\n */\nexport interface WalletAdapter {\n /** Wallet identifier */\n readonly walletId: WalletId;\n /** Wallet display name */\n readonly name: string;\n\n /**\n * Get supported capabilities\n */\n getCapabilities(): CapabilityKey[];\n\n /**\n * Detect if wallet is installed\n */\n detectInstalled(): Promise<AdapterDetectResult>;\n\n /**\n * Connect to wallet\n * @param ctx Adapter context\n * @param opts Connection options (optional)\n */\n connect(\n ctx: AdapterContext,\n opts?: {\n timeoutMs?: number;\n partyId?: PartyId;\n }\n ): Promise<AdapterConnectResult>;\n\n /**\n * Disconnect from wallet\n * @param ctx Adapter context\n * @param session Session to disconnect\n */\n disconnect(ctx: AdapterContext, session: Session): Promise<void>;\n\n /**\n * Restore session (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param persisted Persisted session data\n */\n restore?(\n ctx: AdapterContext,\n persisted: PersistedSession\n ): Promise<Session | null>;\n\n /**\n * Sign message (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign message parameters\n */\n signMessage?(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams\n ): Promise<SignedMessage>;\n\n /**\n * Sign transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign transaction parameters\n */\n signTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SignTransactionParams\n ): Promise<SignedTransaction>;\n\n /**\n * Submit transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Submit transaction parameters\n */\n submitTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams\n ): Promise<TxReceipt>;\n\n /**\n * Subscribe to adapter events (optional)\n * @param event Event name\n * @param handler Event handler\n * @returns Unsubscribe function\n */\n on?(\n event: AdapterEventName,\n handler: (payload: unknown) => void\n ): () => void;\n}\n\n/**\n * Check if adapter supports required capabilities\n * Throws CapabilityNotSupportedError if not supported\n */\nexport function capabilityGuard(\n adapter: WalletAdapter,\n requiredCapabilities: CapabilityKey[]\n): void {\n const supported = adapter.getCapabilities();\n const missing = requiredCapabilities.filter((cap) => !supported.includes(cap));\n\n if (missing.length > 0) {\n throw new CapabilityNotSupportedError(\n adapter.walletId,\n missing.join(', ')\n );\n }\n}\n\n/**\n * Check if wallet is installed\n * Throws WalletNotInstalledError if not installed\n */\nexport async function installGuard(\n adapter: WalletAdapter\n): Promise<void> {\n const detect = await adapter.detectInstalled();\n if (!detect.installed) {\n throw new WalletNotInstalledError(adapter.walletId, detect.reason);\n }\n}\n","/**\n * Session management utilities\n */\n\nimport type { Session, SessionId } from './types';\nimport { toSessionId } from './types';\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): SessionId {\n return toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`);\n}\n\n/**\n * Validate session structure\n */\nexport function validateSession(session: unknown): session is Session {\n if (typeof session !== 'object' || session === null) {\n return false;\n }\n\n const s = session as Record<string, unknown>;\n\n return (\n typeof s.sessionId === 'string' &&\n typeof s.walletId === 'string' &&\n typeof s.partyId === 'string' &&\n typeof s.network === 'string' &&\n typeof s.createdAt === 'number' &&\n typeof s.origin === 'string' &&\n Array.isArray(s.capabilitiesSnapshot)\n );\n}\n\n/**\n * Check if session is expired\n */\nexport function isSessionExpired(session: Session): boolean {\n if (!session.expiresAt) {\n return false; // No expiration\n }\n\n return Date.now() >= session.expiresAt;\n}\n\n/**\n * Create a session with default values\n */\nexport function createSession(\n walletId: string,\n partyId: string,\n network: string,\n origin: string,\n capabilities: string[] = [],\n expiresInMs?: number\n): Session {\n const now = Date.now();\n return {\n sessionId: generateSessionId(),\n walletId: walletId as import('./types').WalletId,\n partyId: partyId as import('./types').PartyId,\n network,\n createdAt: now,\n expiresAt: expiresInMs ? now + expiresInMs : undefined,\n origin,\n capabilitiesSnapshot: capabilities as import('./types').CapabilityKey[],\n };\n}\n","/**\n * Deep Link Transport\n * \n * Opens a deep link URL (mobile) and awaits callback via redirect or postMessage.\n * \n * Security:\n * - State parameter (nonce) for CSRF protection\n * - Origin validation\n * - Timeout enforcement\n * - Callback origin allowlist\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Deep link transport implementation\n */\nexport class DeepLinkTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build deep link URL with query parameters\n */\n private buildDeepLinkUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate callback origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Wait for callback via postMessage or redirect\n */\n private async waitForCallback<T extends { state: string }>(\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const redirectHandler = () => {\n // Check URL hash/fragment for callback data\n if (typeof window !== 'undefined') {\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const callbackState = params.get('state');\n if (callbackState === state) {\n const data: T = {} as T;\n params.forEach((value, key) => {\n (data as Record<string, unknown>)[key] = value;\n });\n cleanup();\n resolve(data);\n }\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('hashchange', redirectHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n window.addEventListener('hashchange', redirectHandler);\n // Also check current hash immediately\n redirectHandler();\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link (mobile) or window (desktop fallback)\n if (typeof window !== 'undefined') {\n // Try to open deep link\n window.location.href = deepLinkUrl;\n\n // Fallback: open in new window if deep link fails\n // (This is a simulation - real mobile apps would handle the deep link)\n const fallbackWindow = window.open(deepLinkUrl, '_blank');\n if (!fallbackWindow) {\n throw new Error('Failed to open deep link');\n }\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000; // Default 60s\n const response = await this.waitForCallback<ConnectResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link\n if (typeof window !== 'undefined') {\n window.location.href = deepLinkUrl;\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Popup Transport\n * \n * Opens a centered popup window and establishes a postMessage channel.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n * - Popup window management\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Popup transport implementation\n */\nexport class PopupTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Open popup window\n */\n private openPopup(url: string, _options: TransportOptions): Window | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n return window.open(\n url,\n 'CantonConnect',\n `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`\n );\n }\n\n /**\n * Wait for postMessage callback\n */\n private async waitForCallback<T extends { state: string }>(\n popup: Window,\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n popup.close();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n cleanup();\n reject(new Error('Popup closed by user'));\n }\n }, 500);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n popup.close();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n clearInterval(checkClosed);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<ConnectResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * PostMessage Transport\n * \n * Establishes a postMessage channel with an existing window/iframe.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * PostMessage transport implementation\n */\nexport class PostMessageTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Send message and wait for response\n */\n private async sendAndWait<T extends { state: string }>(\n target: Window,\n targetOrigin: string,\n message: ConnectRequest | SignRequest,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === message.state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n target.postMessage(message, targetOrigin);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window (could be parent, opener, or specific iframe)\n // For now, assume we're communicating with parent/opener\n const target = window.opener || window.parent;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<ConnectResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window\n const target = window.opener || window.parent;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<SignResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Mock Transport\n * \n * For testing and development. Simulates transport behavior without real network calls.\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n JobStatus,\n} from './types';\nimport { toPartyId } from '../types';\n\n/**\n * Mock transport implementation\n */\nexport class MockTransport implements Transport {\n private mockResponses: Map<string, ConnectResponse | SignResponse> = new Map();\n private mockJobs: Map<string, JobStatus> = new Map();\n\n /**\n * Set mock response for a state\n */\n setMockResponse(state: string, response: ConnectResponse | SignResponse): void {\n this.mockResponses.set(state, response);\n }\n\n /**\n * Set mock job status\n */\n setMockJob(jobId: string, status: JobStatus): void {\n this.mockJobs.set(jobId, status);\n }\n\n /**\n * Clear all mocks\n */\n clearMocks(): void {\n this.mockResponses.clear();\n this.mockJobs.clear();\n }\n\n /**\n * Open a connection request (mock)\n */\n async openConnectRequest(\n _url: string,\n request: ConnectRequest,\n _options: TransportOptions\n ): Promise<ConnectResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && 'partyId' in mockResponse) {\n return mockResponse as ConnectResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n partyId: toPartyId('mock-party-' + Date.now()),\n sessionToken: 'mock-token',\n expiresAt: Date.now() + 3600000, // 1 hour\n capabilities: request.requestedCapabilities || ['connect', 'signMessage'],\n });\n }, 100); // Simulate async delay\n });\n }\n\n /**\n * Open a sign request (mock)\n */\n async openSignRequest(\n _url: string,\n request: SignRequest,\n _options: TransportOptions\n ): Promise<SignResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && ('signature' in mockResponse || 'jobId' in mockResponse)) {\n return mockResponse as SignResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n signature: 'mock-signature-' + Date.now(),\n transactionHash: request.transaction ? 'mock-tx-hash' : undefined,\n });\n }, 100);\n });\n }\n\n /**\n * Poll job status (mock)\n */\n async pollJobStatus(\n jobId: string,\n _statusUrl: string,\n _options: TransportOptions\n ): Promise<JobStatus> {\n // Check for mock job\n const mockJob = this.mockJobs.get(jobId);\n if (mockJob) {\n return mockJob;\n }\n\n // Default mock: approved immediately\n return {\n jobId,\n status: 'approved',\n result: {\n signature: 'mock-signature',\n transactionHash: 'mock-tx-hash',\n },\n };\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@cantonconnect/core",
3
+ "version": "0.2.0",
4
+ "description": "Core types, errors, and abstractions for CantonConnect",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "keywords": [
19
+ "canton",
20
+ "wallet",
21
+ "sdk"
22
+ ],
23
+ "author": "CantonConnect Contributors",
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/cantonconnect/wallet-sdk.git",
28
+ "directory": "packages/core"
29
+ },
30
+ "homepage": "https://github.com/cantonconnect/wallet-sdk#readme",
31
+ "bugs": {
32
+ "url": "https://github.com/cantonconnect/wallet-sdk/issues"
33
+ },
34
+ "devDependencies": {
35
+ "typescript": "^5.3.3",
36
+ "vitest": "^1.2.0",
37
+ "@vitest/ui": "^1.2.0"
38
+ },
39
+ "scripts": {
40
+ "build": "tsup",
41
+ "clean": "rm -rf dist",
42
+ "lint": "eslint src --ext .ts",
43
+ "typecheck": "tsc --noEmit",
44
+ "test": "vitest"
45
+ }
46
+ }