@partylayer/adapter-bron 0.2.10 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -371,6 +371,9 @@ var BronAdapter = class {
371
371
  partyId: session.partyId,
372
372
  session: {
373
373
  walletId: this.walletId,
374
+ // Bron's API session does not report the connected network → not
375
+ // wallet-reported, so network-mismatch detection is limited for this
376
+ // adapter (echoes the requested ctx.network).
374
377
  network: ctx.network,
375
378
  createdAt: Date.now(),
376
379
  expiresAt: session.expiresAt,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth.ts","../src/api.ts","../src/bron-adapter.ts"],"names":["error","toPartyId","toWalletId","mapUnknownErrorToPartyLayerError","UserRejectedError","toSignature","signedTx","toTransactionHash"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Bron OAuth2 Authentication Client\n * \n * Handles OAuth2 flows for Bron enterprise wallet.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n * - Bron ecosystem: https://www.canton.network/ecosystem/bron-wallet\n */\n\nimport type { StorageAdapter } from '@partylayer/core';\n\n/**\n * OAuth2 configuration\n */\nexport interface BronAuthConfig {\n /** Authorization server URL */\n authorizationUrl: string;\n /** Token endpoint URL */\n tokenUrl: string;\n /** Client ID */\n clientId: string;\n /** Client secret (for server-side flows) */\n clientSecret?: string;\n /** Redirect URI */\n redirectUri: string;\n /** Scopes */\n scopes?: string[];\n /** Use PKCE (recommended for browser) */\n usePKCE?: boolean;\n}\n\n/**\n * OAuth2 tokens\n */\nexport interface BronTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n tokenType: string;\n}\n\n/**\n * Bron OAuth2 client\n */\nexport class BronAuthClient {\n private config: BronAuthConfig;\n private storage?: StorageAdapter;\n private tokens: BronTokens | null = null; // In-memory by default\n\n constructor(config: BronAuthConfig, storage?: StorageAdapter) {\n this.config = config;\n this.storage = storage;\n }\n\n /**\n * Generate PKCE code verifier and challenge\n */\n private async generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n const verifier = this.generateRandomString(128);\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n return { verifier, challenge };\n }\n\n /**\n * Generate random string\n */\n private generateRandomString(length: number): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Start authorization flow\n */\n async startAuth(): Promise<string> {\n const state = this.generateRandomString(32);\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n state,\n scope: (this.config.scopes || ['openid', 'profile']).join(' '),\n });\n\n // Add PKCE if enabled\n if (this.config.usePKCE) {\n const pkce = await this.generatePKCE();\n params.set('code_challenge', pkce.challenge);\n params.set('code_challenge_method', 'S256');\n \n // Store verifier temporarily (in sessionStorage)\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('bron_pkce_verifier', pkce.verifier);\n sessionStorage.setItem('bron_auth_state', state);\n }\n } else {\n // Store state\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('bron_auth_state', state);\n }\n }\n\n const authUrl = `${this.config.authorizationUrl}?${params.toString()}`;\n return authUrl;\n }\n\n /**\n * Finish authorization flow with callback URL\n */\n async finishAuth(callbackUrl: string): Promise<BronTokens> {\n const url = new URL(callbackUrl);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n throw new Error(`OAuth error: ${error}`);\n }\n\n if (!code) {\n throw new Error('No authorization code in callback');\n }\n\n // Validate state\n if (typeof window !== 'undefined') {\n const storedState = sessionStorage.getItem('bron_auth_state');\n if (state !== storedState) {\n throw new Error('State mismatch');\n }\n }\n\n // Exchange code for tokens\n const tokenParams = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: this.config.redirectUri,\n client_id: this.config.clientId,\n });\n\n // Add PKCE verifier if used\n if (this.config.usePKCE && typeof window !== 'undefined') {\n const verifier = sessionStorage.getItem('bron_pkce_verifier');\n if (verifier) {\n tokenParams.set('code_verifier', verifier);\n sessionStorage.removeItem('bron_pkce_verifier');\n }\n }\n\n // Add client secret for server-side flow\n if (this.config.clientSecret) {\n tokenParams.set('client_secret', this.config.clientSecret);\n }\n\n // Request tokens\n const response = await fetch(this.config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: tokenParams.toString(),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const tokenData = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n token_type: string;\n };\n\n const tokens: BronTokens = {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n expiresAt: Date.now() + tokenData.expires_in * 1000,\n tokenType: tokenData.token_type || 'Bearer',\n };\n\n // Store tokens (in memory by default, or encrypted storage if configured)\n this.tokens = tokens;\n if (this.storage) {\n // Store encrypted (implementation depends on storage adapter)\n await this.storage.set('bron_tokens', JSON.stringify(tokens));\n }\n\n // Clean up session storage\n if (typeof window !== 'undefined') {\n sessionStorage.removeItem('bron_auth_state');\n }\n\n return tokens;\n }\n\n /**\n * Get current access token\n */\n async getAccessToken(): Promise<string | null> {\n // Check if token exists and is not expired\n if (this.tokens && Date.now() < this.tokens.expiresAt) {\n return this.tokens.accessToken;\n }\n\n // Try to load from storage\n if (this.storage) {\n const stored = await this.storage.get('bron_tokens');\n if (stored) {\n this.tokens = JSON.parse(stored) as BronTokens;\n if (Date.now() < this.tokens.expiresAt) {\n return this.tokens.accessToken;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Logout\n */\n async logout(): Promise<void> {\n this.tokens = null;\n if (this.storage) {\n await this.storage.remove('bron_tokens');\n }\n }\n}\n","/**\n * Bron API Client\n * \n * Typed client for Bron enterprise wallet API endpoints.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n */\n\nimport type { PartyId } from '@partylayer/core';\nimport { toPartyId } from '@partylayer/core';\n\n/**\n * Bron API configuration\n */\nexport interface BronApiConfig {\n /** Base API URL */\n baseUrl: string;\n /** Access token getter */\n getAccessToken: () => Promise<string | null>;\n}\n\n/**\n * Session/Party mapping\n */\nexport interface BronSession {\n sessionId: string;\n partyId: PartyId;\n expiresAt?: number;\n}\n\n/**\n * Signature request\n */\nexport interface BronSignRequest {\n message?: string;\n transaction?: unknown;\n sessionId: string;\n}\n\n/**\n * Signature response\n */\nexport interface BronSignResponse {\n requestId: string;\n status: 'pending' | 'approved' | 'denied';\n signature?: string;\n transactionHash?: string;\n}\n\n/**\n * Request status\n */\nexport interface BronRequestStatus {\n requestId: string;\n status: 'pending' | 'approved' | 'denied' | 'expired';\n signature?: string;\n transactionHash?: string;\n error?: {\n code: string;\n message: string;\n };\n}\n\n/**\n * Bron API client\n */\nexport class BronApiClient {\n private config: BronApiConfig;\n\n constructor(config: BronApiConfig) {\n this.config = config;\n }\n\n /**\n * Create authenticated request headers\n */\n private async getHeaders(): Promise<HeadersInit> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new Error('No access token available');\n }\n\n return {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Create session / get party mapping\n */\n async createSession(): Promise<BronSession> {\n // In mock mode, return mock data\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n sessionId: 'mock-session-' + Date.now(),\n partyId: toPartyId('mock-party-' + Date.now()),\n expiresAt: Date.now() + 3600000,\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/sessions`, {\n method: 'POST',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create session: ${error}`);\n }\n\n const data = (await response.json()) as {\n sessionId: string;\n partyId: string;\n expiresAt?: number;\n };\n\n return {\n sessionId: data.sessionId,\n partyId: toPartyId(data.partyId),\n expiresAt: data.expiresAt,\n };\n }\n\n /**\n * Request signature\n */\n async requestSignature(request: BronSignRequest): Promise<BronSignResponse> {\n // In mock mode, return mock response\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n requestId: 'mock-request-' + Date.now(),\n status: 'pending',\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/signatures`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to request signature: ${error}`);\n }\n\n const data = (await response.json()) as {\n requestId: string;\n status: string;\n signature?: string;\n transactionHash?: string;\n };\n\n return {\n requestId: data.requestId,\n status: data.status as 'pending' | 'approved' | 'denied',\n signature: data.signature,\n transactionHash: data.transactionHash,\n };\n }\n\n /**\n * Get request status\n */\n async getRequestStatus(requestId: string): Promise<BronRequestStatus> {\n // In mock mode, return approved status\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n requestId,\n status: 'approved',\n signature: 'mock-signature-' + requestId,\n transactionHash: 'mock-tx-hash',\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/signatures/${requestId}`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to get request status: ${error}`);\n }\n\n const data = (await response.json()) as {\n requestId: string;\n status: string;\n signature?: string;\n transactionHash?: string;\n error?: {\n code: string;\n message: string;\n };\n };\n\n return {\n requestId: data.requestId,\n status: data.status as 'pending' | 'approved' | 'denied' | 'expired',\n signature: data.signature,\n transactionHash: data.transactionHash,\n error: data.error,\n };\n }\n\n /**\n * Proxy a Canton Ledger API request through the Bron remote signer.\n *\n * Bron acts as an authenticated HTTP proxy — it forwards the request\n * to the Canton Ledger API on behalf of the connected party and returns\n * the raw JSON response.\n */\n async proxyLedgerApi(request: {\n requestMethod: string;\n resource: string;\n body?: string;\n sessionId: string;\n }): Promise<{ response: string }> {\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return { response: JSON.stringify({ activeContracts: [], nextPageToken: null }) };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/ledger-proxy`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ledger API proxy failed: ${error}`);\n }\n\n const data = (await response.json()) as { response: string };\n return { response: data.response };\n }\n\n /**\n * Poll request status until complete\n */\n async pollRequestStatus(\n requestId: string,\n timeoutMs: number = 60000,\n intervalMs: number = 2000\n ): Promise<BronRequestStatus> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n const status = await this.getRequestStatus(requestId);\n\n if (status.status === 'approved' || status.status === 'denied' || status.status === 'expired') {\n return status;\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n throw new Error('Polling timeout');\n }\n}\n","/**\n * Bron Wallet Adapter\n * \n * Enterprise remote signer adapter using OAuth2 + API client.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n * - Bron ecosystem: https://www.canton.network/ecosystem/bron-wallet\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletAdapter,\n AdapterContext,\n AdapterDetectResult,\n AdapterConnectResult,\n SignMessageParams,\n SignTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\nimport {\n toWalletId,\n toSignature,\n toTransactionHash,\n UserRejectedError,\n mapUnknownErrorToPartyLayerError,\n type CapabilityKey,\n} from '@partylayer/core';\nimport { BronAuthClient, type BronAuthConfig } from './auth';\nimport { BronApiClient, type BronApiConfig } from './api';\n\n// Re-export types for convenience\nexport type { BronAuthConfig } from './auth';\nexport type { BronApiConfig } from './api';\n\n/**\n * Bron adapter configuration\n */\nexport interface BronAdapterConfig {\n /** OAuth2 configuration */\n auth: BronAuthConfig;\n /** API configuration */\n api: BronApiConfig;\n /** Use mock API in development */\n useMockApi?: boolean;\n}\n\n/**\n * Bron Wallet Adapter\n */\nexport class BronAdapter implements WalletAdapter {\n readonly walletId = toWalletId('bron');\n readonly name = 'Bron';\n\n private authClient: BronAuthClient;\n private apiClient: BronApiClient;\n\n constructor(config: BronAdapterConfig) {\n // Initialize auth client\n // Tokens stored in memory by default (secure)\n // Can optionally use encrypted storage if provided\n this.authClient = new BronAuthClient(config.auth);\n\n // Initialize API client\n if (config.useMockApi || process.env.NODE_ENV === 'development') {\n // Use mock API client in development\n this.apiClient = this.createMockApiClient();\n } else {\n this.apiClient = new BronApiClient({\n baseUrl: config.api.baseUrl,\n getAccessToken: async () => {\n return await this.authClient.getAccessToken();\n },\n });\n }\n }\n\n /**\n * Create mock API client for development\n */\n private createMockApiClient(): BronApiClient {\n // Create a mock implementation that simulates API behavior\n const mockBaseUrl = 'https://api.bron.dev';\n return new BronApiClient({\n baseUrl: mockBaseUrl,\n getAccessToken: () => {\n // In mock mode, return a mock token\n return Promise.resolve('mock-bron-token');\n },\n });\n }\n\n getCapabilities(): CapabilityKey[] {\n return [\n 'connect',\n 'disconnect',\n 'restore',\n 'remoteSigner',\n 'signMessage',\n 'signTransaction',\n 'ledgerApi',\n ];\n }\n\n detectInstalled(): Promise<AdapterDetectResult> {\n // Bron is an enterprise remote signer - no \"installation\" required\n // Availability depends on OAuth2 configuration\n return Promise.resolve({\n installed: true,\n reason: 'Bron is a remote signer service',\n });\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: {\n timeoutMs?: number;\n requiredCapabilities?: CapabilityKey[];\n }\n ): Promise<AdapterConnectResult> {\n try {\n // Check if we have an access token\n let accessToken = await this.authClient.getAccessToken();\n\n // If no token, start OAuth flow\n if (!accessToken) {\n if (typeof window === 'undefined') {\n throw new Error('OAuth flow requires browser environment');\n }\n\n const authUrl = await this.authClient.startAuth();\n \n // Open auth URL (popup or redirect)\n const popup = window.open(\n authUrl,\n 'Bron Auth',\n 'width=500,height=600'\n );\n\n if (!popup) {\n throw new Error('Failed to open auth popup');\n }\n\n // Wait for callback (would be handled by finishAuth in real flow)\n // For now, simulate\n await new Promise((resolve) => setTimeout(resolve, 1000));\n \n // In production, finishAuth would be called with callback URL\n // For mock, we'll create a mock token\n if (process.env.NODE_ENV === 'development') {\n // Mock token for development\n accessToken = 'mock-token';\n } else {\n throw new Error('OAuth callback not implemented in adapter - handle in app');\n }\n }\n\n // Create session with Bron API\n const session = await this.apiClient.createSession();\n\n return {\n partyId: session.partyId,\n session: {\n walletId: this.walletId,\n network: ctx.network,\n createdAt: Date.now(),\n expiresAt: session.expiresAt,\n capabilitiesSnapshot: ['connect', 'signMessage', 'signTransaction', 'remoteSigner'],\n metadata: {\n sessionId: session.sessionId,\n },\n },\n capabilities: ['connect', 'signMessage', 'signTransaction', 'remoteSigner'],\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'remote',\n });\n }\n }\n\n async disconnect(\n _ctx: AdapterContext,\n _session: import('@partylayer/core').Session\n ): Promise<void> {\n await this.authClient.logout();\n }\n\n async restore(\n _ctx: AdapterContext,\n persisted: import('@partylayer/core').PersistedSession\n ): Promise<import('@partylayer/core').Session | null> {\n // Check if we have a session ID and access token\n const sessionId = persisted.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n return null;\n }\n\n const accessToken = await this.authClient.getAccessToken();\n if (!accessToken) {\n return null; // No token to restore\n }\n\n // Check expiration\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) {\n return null;\n }\n\n // Restore session\n return {\n ...persisted,\n walletId: this.walletId,\n };\n }\n\n async signMessage(\n _ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: SignMessageParams\n ): Promise<import('@partylayer/core').SignedMessage> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n // Request signature\n const signResponse = await this.apiClient.requestSignature({\n message: params.message,\n sessionId,\n });\n\n // If pending, poll for status\n if (signResponse.status === 'pending') {\n const status = await this.apiClient.pollRequestStatus(signResponse.requestId);\n \n if (status.status === 'denied') {\n throw new UserRejectedError('Signature request denied');\n }\n\n if (status.status === 'approved' && status.signature) {\n return {\n message: params.message,\n signature: toSignature(status.signature),\n partyId: session.partyId,\n };\n }\n\n throw new Error('Signature request failed');\n }\n\n if (signResponse.status === 'denied') {\n throw new UserRejectedError('Signature request denied');\n }\n\n if (!signResponse.signature) {\n throw new Error('No signature in response');\n }\n\n return {\n message: params.message,\n signature: toSignature(signResponse.signature),\n partyId: session.partyId,\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'remote',\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: SignTransactionParams\n ): Promise<import('@partylayer/core').SignedTransaction> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n // Request signature\n const signResponse = await this.apiClient.requestSignature({\n transaction: params.tx,\n sessionId,\n });\n\n // If pending, poll for status\n if (signResponse.status === 'pending') {\n const status = await this.apiClient.pollRequestStatus(signResponse.requestId);\n \n if (status.status === 'denied') {\n throw new UserRejectedError('Transaction signing denied');\n }\n\n if (status.status === 'approved' && status.signature) {\n const signedTx = typeof params.tx === 'object' && params.tx !== null\n ? { ...params.tx as Record<string, unknown>, signature: status.signature }\n : { tx: params.tx, signature: status.signature };\n return {\n signedTx,\n transactionHash: status.transactionHash\n ? toTransactionHash(status.transactionHash)\n : toTransactionHash('pending'),\n partyId: session.partyId,\n };\n }\n\n throw new Error('Transaction signing failed');\n }\n\n if (signResponse.status === 'denied') {\n throw new UserRejectedError('Transaction signing denied');\n }\n\n if (!signResponse.signature) {\n throw new Error('No signature in response');\n }\n\n const signedTx = typeof params.tx === 'object' && params.tx !== null\n ? { ...params.tx as Record<string, unknown>, signature: signResponse.signature }\n : { tx: params.tx, signature: signResponse.signature };\n return {\n signedTx,\n transactionHash: signResponse.transactionHash\n ? toTransactionHash(signResponse.transactionHash)\n : toTransactionHash('pending'),\n partyId: session.partyId,\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'signTransaction',\n transport: 'remote',\n });\n }\n }\n\n /**\n * Proxy a Canton Ledger API request through the Bron enterprise API.\n *\n * Bron acts as an authenticated HTTP proxy — it forwards the request\n * to the Canton Ledger API using the enterprise session credentials.\n */\n async ledgerApi(\n ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n ctx.logger.debug('Proxying ledger API request via Bron', {\n sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.apiClient.proxyLedgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n sessionId,\n });\n\n return { response: result.response };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'remote',\n });\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth.ts","../src/api.ts","../src/bron-adapter.ts"],"names":["error","toPartyId","toWalletId","mapUnknownErrorToPartyLayerError","UserRejectedError","toSignature","signedTx","toTransactionHash"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Bron OAuth2 Authentication Client\n * \n * Handles OAuth2 flows for Bron enterprise wallet.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n * - Bron ecosystem: https://www.canton.network/ecosystem/bron-wallet\n */\n\nimport type { StorageAdapter } from '@partylayer/core';\n\n/**\n * OAuth2 configuration\n */\nexport interface BronAuthConfig {\n /** Authorization server URL */\n authorizationUrl: string;\n /** Token endpoint URL */\n tokenUrl: string;\n /** Client ID */\n clientId: string;\n /** Client secret (for server-side flows) */\n clientSecret?: string;\n /** Redirect URI */\n redirectUri: string;\n /** Scopes */\n scopes?: string[];\n /** Use PKCE (recommended for browser) */\n usePKCE?: boolean;\n}\n\n/**\n * OAuth2 tokens\n */\nexport interface BronTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n tokenType: string;\n}\n\n/**\n * Bron OAuth2 client\n */\nexport class BronAuthClient {\n private config: BronAuthConfig;\n private storage?: StorageAdapter;\n private tokens: BronTokens | null = null; // In-memory by default\n\n constructor(config: BronAuthConfig, storage?: StorageAdapter) {\n this.config = config;\n this.storage = storage;\n }\n\n /**\n * Generate PKCE code verifier and challenge\n */\n private async generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n const verifier = this.generateRandomString(128);\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n return { verifier, challenge };\n }\n\n /**\n * Generate random string\n */\n private generateRandomString(length: number): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Start authorization flow\n */\n async startAuth(): Promise<string> {\n const state = this.generateRandomString(32);\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n state,\n scope: (this.config.scopes || ['openid', 'profile']).join(' '),\n });\n\n // Add PKCE if enabled\n if (this.config.usePKCE) {\n const pkce = await this.generatePKCE();\n params.set('code_challenge', pkce.challenge);\n params.set('code_challenge_method', 'S256');\n \n // Store verifier temporarily (in sessionStorage)\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('bron_pkce_verifier', pkce.verifier);\n sessionStorage.setItem('bron_auth_state', state);\n }\n } else {\n // Store state\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('bron_auth_state', state);\n }\n }\n\n const authUrl = `${this.config.authorizationUrl}?${params.toString()}`;\n return authUrl;\n }\n\n /**\n * Finish authorization flow with callback URL\n */\n async finishAuth(callbackUrl: string): Promise<BronTokens> {\n const url = new URL(callbackUrl);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n throw new Error(`OAuth error: ${error}`);\n }\n\n if (!code) {\n throw new Error('No authorization code in callback');\n }\n\n // Validate state\n if (typeof window !== 'undefined') {\n const storedState = sessionStorage.getItem('bron_auth_state');\n if (state !== storedState) {\n throw new Error('State mismatch');\n }\n }\n\n // Exchange code for tokens\n const tokenParams = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: this.config.redirectUri,\n client_id: this.config.clientId,\n });\n\n // Add PKCE verifier if used\n if (this.config.usePKCE && typeof window !== 'undefined') {\n const verifier = sessionStorage.getItem('bron_pkce_verifier');\n if (verifier) {\n tokenParams.set('code_verifier', verifier);\n sessionStorage.removeItem('bron_pkce_verifier');\n }\n }\n\n // Add client secret for server-side flow\n if (this.config.clientSecret) {\n tokenParams.set('client_secret', this.config.clientSecret);\n }\n\n // Request tokens\n const response = await fetch(this.config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: tokenParams.toString(),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const tokenData = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n token_type: string;\n };\n\n const tokens: BronTokens = {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n expiresAt: Date.now() + tokenData.expires_in * 1000,\n tokenType: tokenData.token_type || 'Bearer',\n };\n\n // Store tokens (in memory by default, or encrypted storage if configured)\n this.tokens = tokens;\n if (this.storage) {\n // Store encrypted (implementation depends on storage adapter)\n await this.storage.set('bron_tokens', JSON.stringify(tokens));\n }\n\n // Clean up session storage\n if (typeof window !== 'undefined') {\n sessionStorage.removeItem('bron_auth_state');\n }\n\n return tokens;\n }\n\n /**\n * Get current access token\n */\n async getAccessToken(): Promise<string | null> {\n // Check if token exists and is not expired\n if (this.tokens && Date.now() < this.tokens.expiresAt) {\n return this.tokens.accessToken;\n }\n\n // Try to load from storage\n if (this.storage) {\n const stored = await this.storage.get('bron_tokens');\n if (stored) {\n this.tokens = JSON.parse(stored) as BronTokens;\n if (Date.now() < this.tokens.expiresAt) {\n return this.tokens.accessToken;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Logout\n */\n async logout(): Promise<void> {\n this.tokens = null;\n if (this.storage) {\n await this.storage.remove('bron_tokens');\n }\n }\n}\n","/**\n * Bron API Client\n * \n * Typed client for Bron enterprise wallet API endpoints.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n */\n\nimport type { PartyId } from '@partylayer/core';\nimport { toPartyId } from '@partylayer/core';\n\n/**\n * Bron API configuration\n */\nexport interface BronApiConfig {\n /** Base API URL */\n baseUrl: string;\n /** Access token getter */\n getAccessToken: () => Promise<string | null>;\n}\n\n/**\n * Session/Party mapping\n */\nexport interface BronSession {\n sessionId: string;\n partyId: PartyId;\n expiresAt?: number;\n}\n\n/**\n * Signature request\n */\nexport interface BronSignRequest {\n message?: string;\n transaction?: unknown;\n sessionId: string;\n}\n\n/**\n * Signature response\n */\nexport interface BronSignResponse {\n requestId: string;\n status: 'pending' | 'approved' | 'denied';\n signature?: string;\n transactionHash?: string;\n}\n\n/**\n * Request status\n */\nexport interface BronRequestStatus {\n requestId: string;\n status: 'pending' | 'approved' | 'denied' | 'expired';\n signature?: string;\n transactionHash?: string;\n error?: {\n code: string;\n message: string;\n };\n}\n\n/**\n * Bron API client\n */\nexport class BronApiClient {\n private config: BronApiConfig;\n\n constructor(config: BronApiConfig) {\n this.config = config;\n }\n\n /**\n * Create authenticated request headers\n */\n private async getHeaders(): Promise<HeadersInit> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new Error('No access token available');\n }\n\n return {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Create session / get party mapping\n */\n async createSession(): Promise<BronSession> {\n // In mock mode, return mock data\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n sessionId: 'mock-session-' + Date.now(),\n partyId: toPartyId('mock-party-' + Date.now()),\n expiresAt: Date.now() + 3600000,\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/sessions`, {\n method: 'POST',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create session: ${error}`);\n }\n\n const data = (await response.json()) as {\n sessionId: string;\n partyId: string;\n expiresAt?: number;\n };\n\n return {\n sessionId: data.sessionId,\n partyId: toPartyId(data.partyId),\n expiresAt: data.expiresAt,\n };\n }\n\n /**\n * Request signature\n */\n async requestSignature(request: BronSignRequest): Promise<BronSignResponse> {\n // In mock mode, return mock response\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n requestId: 'mock-request-' + Date.now(),\n status: 'pending',\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/signatures`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to request signature: ${error}`);\n }\n\n const data = (await response.json()) as {\n requestId: string;\n status: string;\n signature?: string;\n transactionHash?: string;\n };\n\n return {\n requestId: data.requestId,\n status: data.status as 'pending' | 'approved' | 'denied',\n signature: data.signature,\n transactionHash: data.transactionHash,\n };\n }\n\n /**\n * Get request status\n */\n async getRequestStatus(requestId: string): Promise<BronRequestStatus> {\n // In mock mode, return approved status\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n requestId,\n status: 'approved',\n signature: 'mock-signature-' + requestId,\n transactionHash: 'mock-tx-hash',\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/signatures/${requestId}`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to get request status: ${error}`);\n }\n\n const data = (await response.json()) as {\n requestId: string;\n status: string;\n signature?: string;\n transactionHash?: string;\n error?: {\n code: string;\n message: string;\n };\n };\n\n return {\n requestId: data.requestId,\n status: data.status as 'pending' | 'approved' | 'denied' | 'expired',\n signature: data.signature,\n transactionHash: data.transactionHash,\n error: data.error,\n };\n }\n\n /**\n * Proxy a Canton Ledger API request through the Bron remote signer.\n *\n * Bron acts as an authenticated HTTP proxy — it forwards the request\n * to the Canton Ledger API on behalf of the connected party and returns\n * the raw JSON response.\n */\n async proxyLedgerApi(request: {\n requestMethod: string;\n resource: string;\n body?: string;\n sessionId: string;\n }): Promise<{ response: string }> {\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return { response: JSON.stringify({ activeContracts: [], nextPageToken: null }) };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/ledger-proxy`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ledger API proxy failed: ${error}`);\n }\n\n const data = (await response.json()) as { response: string };\n return { response: data.response };\n }\n\n /**\n * Poll request status until complete\n */\n async pollRequestStatus(\n requestId: string,\n timeoutMs: number = 60000,\n intervalMs: number = 2000\n ): Promise<BronRequestStatus> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n const status = await this.getRequestStatus(requestId);\n\n if (status.status === 'approved' || status.status === 'denied' || status.status === 'expired') {\n return status;\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n throw new Error('Polling timeout');\n }\n}\n","/**\n * Bron Wallet Adapter\n * \n * Enterprise remote signer adapter using OAuth2 + API client.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n * - Bron ecosystem: https://www.canton.network/ecosystem/bron-wallet\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletAdapter,\n AdapterContext,\n AdapterDetectResult,\n AdapterConnectResult,\n SignMessageParams,\n SignTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\nimport {\n toWalletId,\n toSignature,\n toTransactionHash,\n UserRejectedError,\n mapUnknownErrorToPartyLayerError,\n type CapabilityKey,\n} from '@partylayer/core';\nimport { BronAuthClient, type BronAuthConfig } from './auth';\nimport { BronApiClient, type BronApiConfig } from './api';\n\n// Re-export types for convenience\nexport type { BronAuthConfig } from './auth';\nexport type { BronApiConfig } from './api';\n\n/**\n * Bron adapter configuration\n */\nexport interface BronAdapterConfig {\n /** OAuth2 configuration */\n auth: BronAuthConfig;\n /** API configuration */\n api: BronApiConfig;\n /** Use mock API in development */\n useMockApi?: boolean;\n}\n\n/**\n * Bron Wallet Adapter\n */\nexport class BronAdapter implements WalletAdapter {\n readonly walletId = toWalletId('bron');\n readonly name = 'Bron';\n\n private authClient: BronAuthClient;\n private apiClient: BronApiClient;\n\n constructor(config: BronAdapterConfig) {\n // Initialize auth client\n // Tokens stored in memory by default (secure)\n // Can optionally use encrypted storage if provided\n this.authClient = new BronAuthClient(config.auth);\n\n // Initialize API client\n if (config.useMockApi || process.env.NODE_ENV === 'development') {\n // Use mock API client in development\n this.apiClient = this.createMockApiClient();\n } else {\n this.apiClient = new BronApiClient({\n baseUrl: config.api.baseUrl,\n getAccessToken: async () => {\n return await this.authClient.getAccessToken();\n },\n });\n }\n }\n\n /**\n * Create mock API client for development\n */\n private createMockApiClient(): BronApiClient {\n // Create a mock implementation that simulates API behavior\n const mockBaseUrl = 'https://api.bron.dev';\n return new BronApiClient({\n baseUrl: mockBaseUrl,\n getAccessToken: () => {\n // In mock mode, return a mock token\n return Promise.resolve('mock-bron-token');\n },\n });\n }\n\n getCapabilities(): CapabilityKey[] {\n return [\n 'connect',\n 'disconnect',\n 'restore',\n 'remoteSigner',\n 'signMessage',\n 'signTransaction',\n 'ledgerApi',\n ];\n }\n\n detectInstalled(): Promise<AdapterDetectResult> {\n // Bron is an enterprise remote signer - no \"installation\" required\n // Availability depends on OAuth2 configuration\n return Promise.resolve({\n installed: true,\n reason: 'Bron is a remote signer service',\n });\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: {\n timeoutMs?: number;\n requiredCapabilities?: CapabilityKey[];\n }\n ): Promise<AdapterConnectResult> {\n try {\n // Check if we have an access token\n let accessToken = await this.authClient.getAccessToken();\n\n // If no token, start OAuth flow\n if (!accessToken) {\n if (typeof window === 'undefined') {\n throw new Error('OAuth flow requires browser environment');\n }\n\n const authUrl = await this.authClient.startAuth();\n \n // Open auth URL (popup or redirect)\n const popup = window.open(\n authUrl,\n 'Bron Auth',\n 'width=500,height=600'\n );\n\n if (!popup) {\n throw new Error('Failed to open auth popup');\n }\n\n // Wait for callback (would be handled by finishAuth in real flow)\n // For now, simulate\n await new Promise((resolve) => setTimeout(resolve, 1000));\n \n // In production, finishAuth would be called with callback URL\n // For mock, we'll create a mock token\n if (process.env.NODE_ENV === 'development') {\n // Mock token for development\n accessToken = 'mock-token';\n } else {\n throw new Error('OAuth callback not implemented in adapter - handle in app');\n }\n }\n\n // Create session with Bron API\n const session = await this.apiClient.createSession();\n\n return {\n partyId: session.partyId,\n session: {\n walletId: this.walletId,\n // Bron's API session does not report the connected network → not\n // wallet-reported, so network-mismatch detection is limited for this\n // adapter (echoes the requested ctx.network).\n network: ctx.network,\n createdAt: Date.now(),\n expiresAt: session.expiresAt,\n capabilitiesSnapshot: ['connect', 'signMessage', 'signTransaction', 'remoteSigner'],\n metadata: {\n sessionId: session.sessionId,\n },\n },\n capabilities: ['connect', 'signMessage', 'signTransaction', 'remoteSigner'],\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'remote',\n });\n }\n }\n\n async disconnect(\n _ctx: AdapterContext,\n _session: import('@partylayer/core').Session\n ): Promise<void> {\n await this.authClient.logout();\n }\n\n async restore(\n _ctx: AdapterContext,\n persisted: import('@partylayer/core').PersistedSession\n ): Promise<import('@partylayer/core').Session | null> {\n // Check if we have a session ID and access token\n const sessionId = persisted.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n return null;\n }\n\n const accessToken = await this.authClient.getAccessToken();\n if (!accessToken) {\n return null; // No token to restore\n }\n\n // Check expiration\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) {\n return null;\n }\n\n // Restore session\n return {\n ...persisted,\n walletId: this.walletId,\n };\n }\n\n async signMessage(\n _ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: SignMessageParams\n ): Promise<import('@partylayer/core').SignedMessage> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n // Request signature\n const signResponse = await this.apiClient.requestSignature({\n message: params.message,\n sessionId,\n });\n\n // If pending, poll for status\n if (signResponse.status === 'pending') {\n const status = await this.apiClient.pollRequestStatus(signResponse.requestId);\n \n if (status.status === 'denied') {\n throw new UserRejectedError('Signature request denied');\n }\n\n if (status.status === 'approved' && status.signature) {\n return {\n message: params.message,\n signature: toSignature(status.signature),\n partyId: session.partyId,\n };\n }\n\n throw new Error('Signature request failed');\n }\n\n if (signResponse.status === 'denied') {\n throw new UserRejectedError('Signature request denied');\n }\n\n if (!signResponse.signature) {\n throw new Error('No signature in response');\n }\n\n return {\n message: params.message,\n signature: toSignature(signResponse.signature),\n partyId: session.partyId,\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'remote',\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: SignTransactionParams\n ): Promise<import('@partylayer/core').SignedTransaction> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n // Request signature\n const signResponse = await this.apiClient.requestSignature({\n transaction: params.tx,\n sessionId,\n });\n\n // If pending, poll for status\n if (signResponse.status === 'pending') {\n const status = await this.apiClient.pollRequestStatus(signResponse.requestId);\n \n if (status.status === 'denied') {\n throw new UserRejectedError('Transaction signing denied');\n }\n\n if (status.status === 'approved' && status.signature) {\n const signedTx = typeof params.tx === 'object' && params.tx !== null\n ? { ...params.tx as Record<string, unknown>, signature: status.signature }\n : { tx: params.tx, signature: status.signature };\n return {\n signedTx,\n transactionHash: status.transactionHash\n ? toTransactionHash(status.transactionHash)\n : toTransactionHash('pending'),\n partyId: session.partyId,\n };\n }\n\n throw new Error('Transaction signing failed');\n }\n\n if (signResponse.status === 'denied') {\n throw new UserRejectedError('Transaction signing denied');\n }\n\n if (!signResponse.signature) {\n throw new Error('No signature in response');\n }\n\n const signedTx = typeof params.tx === 'object' && params.tx !== null\n ? { ...params.tx as Record<string, unknown>, signature: signResponse.signature }\n : { tx: params.tx, signature: signResponse.signature };\n return {\n signedTx,\n transactionHash: signResponse.transactionHash\n ? toTransactionHash(signResponse.transactionHash)\n : toTransactionHash('pending'),\n partyId: session.partyId,\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'signTransaction',\n transport: 'remote',\n });\n }\n }\n\n /**\n * Proxy a Canton Ledger API request through the Bron enterprise API.\n *\n * Bron acts as an authenticated HTTP proxy — it forwards the request\n * to the Canton Ledger API using the enterprise session credentials.\n */\n async ledgerApi(\n ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n ctx.logger.debug('Proxying ledger API request via Bron', {\n sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.apiClient.proxyLedgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n sessionId,\n });\n\n return { response: result.response };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'remote',\n });\n }\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -369,6 +369,9 @@ var BronAdapter = class {
369
369
  partyId: session.partyId,
370
370
  session: {
371
371
  walletId: this.walletId,
372
+ // Bron's API session does not report the connected network → not
373
+ // wallet-reported, so network-mismatch detection is limited for this
374
+ // adapter (echoes the requested ctx.network).
372
375
  network: ctx.network,
373
376
  createdAt: Date.now(),
374
377
  expiresAt: session.expiresAt,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth.ts","../src/api.ts","../src/bron-adapter.ts"],"names":["error","signedTx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Bron OAuth2 Authentication Client\n * \n * Handles OAuth2 flows for Bron enterprise wallet.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n * - Bron ecosystem: https://www.canton.network/ecosystem/bron-wallet\n */\n\nimport type { StorageAdapter } from '@partylayer/core';\n\n/**\n * OAuth2 configuration\n */\nexport interface BronAuthConfig {\n /** Authorization server URL */\n authorizationUrl: string;\n /** Token endpoint URL */\n tokenUrl: string;\n /** Client ID */\n clientId: string;\n /** Client secret (for server-side flows) */\n clientSecret?: string;\n /** Redirect URI */\n redirectUri: string;\n /** Scopes */\n scopes?: string[];\n /** Use PKCE (recommended for browser) */\n usePKCE?: boolean;\n}\n\n/**\n * OAuth2 tokens\n */\nexport interface BronTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n tokenType: string;\n}\n\n/**\n * Bron OAuth2 client\n */\nexport class BronAuthClient {\n private config: BronAuthConfig;\n private storage?: StorageAdapter;\n private tokens: BronTokens | null = null; // In-memory by default\n\n constructor(config: BronAuthConfig, storage?: StorageAdapter) {\n this.config = config;\n this.storage = storage;\n }\n\n /**\n * Generate PKCE code verifier and challenge\n */\n private async generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n const verifier = this.generateRandomString(128);\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n return { verifier, challenge };\n }\n\n /**\n * Generate random string\n */\n private generateRandomString(length: number): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Start authorization flow\n */\n async startAuth(): Promise<string> {\n const state = this.generateRandomString(32);\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n state,\n scope: (this.config.scopes || ['openid', 'profile']).join(' '),\n });\n\n // Add PKCE if enabled\n if (this.config.usePKCE) {\n const pkce = await this.generatePKCE();\n params.set('code_challenge', pkce.challenge);\n params.set('code_challenge_method', 'S256');\n \n // Store verifier temporarily (in sessionStorage)\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('bron_pkce_verifier', pkce.verifier);\n sessionStorage.setItem('bron_auth_state', state);\n }\n } else {\n // Store state\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('bron_auth_state', state);\n }\n }\n\n const authUrl = `${this.config.authorizationUrl}?${params.toString()}`;\n return authUrl;\n }\n\n /**\n * Finish authorization flow with callback URL\n */\n async finishAuth(callbackUrl: string): Promise<BronTokens> {\n const url = new URL(callbackUrl);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n throw new Error(`OAuth error: ${error}`);\n }\n\n if (!code) {\n throw new Error('No authorization code in callback');\n }\n\n // Validate state\n if (typeof window !== 'undefined') {\n const storedState = sessionStorage.getItem('bron_auth_state');\n if (state !== storedState) {\n throw new Error('State mismatch');\n }\n }\n\n // Exchange code for tokens\n const tokenParams = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: this.config.redirectUri,\n client_id: this.config.clientId,\n });\n\n // Add PKCE verifier if used\n if (this.config.usePKCE && typeof window !== 'undefined') {\n const verifier = sessionStorage.getItem('bron_pkce_verifier');\n if (verifier) {\n tokenParams.set('code_verifier', verifier);\n sessionStorage.removeItem('bron_pkce_verifier');\n }\n }\n\n // Add client secret for server-side flow\n if (this.config.clientSecret) {\n tokenParams.set('client_secret', this.config.clientSecret);\n }\n\n // Request tokens\n const response = await fetch(this.config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: tokenParams.toString(),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const tokenData = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n token_type: string;\n };\n\n const tokens: BronTokens = {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n expiresAt: Date.now() + tokenData.expires_in * 1000,\n tokenType: tokenData.token_type || 'Bearer',\n };\n\n // Store tokens (in memory by default, or encrypted storage if configured)\n this.tokens = tokens;\n if (this.storage) {\n // Store encrypted (implementation depends on storage adapter)\n await this.storage.set('bron_tokens', JSON.stringify(tokens));\n }\n\n // Clean up session storage\n if (typeof window !== 'undefined') {\n sessionStorage.removeItem('bron_auth_state');\n }\n\n return tokens;\n }\n\n /**\n * Get current access token\n */\n async getAccessToken(): Promise<string | null> {\n // Check if token exists and is not expired\n if (this.tokens && Date.now() < this.tokens.expiresAt) {\n return this.tokens.accessToken;\n }\n\n // Try to load from storage\n if (this.storage) {\n const stored = await this.storage.get('bron_tokens');\n if (stored) {\n this.tokens = JSON.parse(stored) as BronTokens;\n if (Date.now() < this.tokens.expiresAt) {\n return this.tokens.accessToken;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Logout\n */\n async logout(): Promise<void> {\n this.tokens = null;\n if (this.storage) {\n await this.storage.remove('bron_tokens');\n }\n }\n}\n","/**\n * Bron API Client\n * \n * Typed client for Bron enterprise wallet API endpoints.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n */\n\nimport type { PartyId } from '@partylayer/core';\nimport { toPartyId } from '@partylayer/core';\n\n/**\n * Bron API configuration\n */\nexport interface BronApiConfig {\n /** Base API URL */\n baseUrl: string;\n /** Access token getter */\n getAccessToken: () => Promise<string | null>;\n}\n\n/**\n * Session/Party mapping\n */\nexport interface BronSession {\n sessionId: string;\n partyId: PartyId;\n expiresAt?: number;\n}\n\n/**\n * Signature request\n */\nexport interface BronSignRequest {\n message?: string;\n transaction?: unknown;\n sessionId: string;\n}\n\n/**\n * Signature response\n */\nexport interface BronSignResponse {\n requestId: string;\n status: 'pending' | 'approved' | 'denied';\n signature?: string;\n transactionHash?: string;\n}\n\n/**\n * Request status\n */\nexport interface BronRequestStatus {\n requestId: string;\n status: 'pending' | 'approved' | 'denied' | 'expired';\n signature?: string;\n transactionHash?: string;\n error?: {\n code: string;\n message: string;\n };\n}\n\n/**\n * Bron API client\n */\nexport class BronApiClient {\n private config: BronApiConfig;\n\n constructor(config: BronApiConfig) {\n this.config = config;\n }\n\n /**\n * Create authenticated request headers\n */\n private async getHeaders(): Promise<HeadersInit> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new Error('No access token available');\n }\n\n return {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Create session / get party mapping\n */\n async createSession(): Promise<BronSession> {\n // In mock mode, return mock data\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n sessionId: 'mock-session-' + Date.now(),\n partyId: toPartyId('mock-party-' + Date.now()),\n expiresAt: Date.now() + 3600000,\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/sessions`, {\n method: 'POST',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create session: ${error}`);\n }\n\n const data = (await response.json()) as {\n sessionId: string;\n partyId: string;\n expiresAt?: number;\n };\n\n return {\n sessionId: data.sessionId,\n partyId: toPartyId(data.partyId),\n expiresAt: data.expiresAt,\n };\n }\n\n /**\n * Request signature\n */\n async requestSignature(request: BronSignRequest): Promise<BronSignResponse> {\n // In mock mode, return mock response\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n requestId: 'mock-request-' + Date.now(),\n status: 'pending',\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/signatures`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to request signature: ${error}`);\n }\n\n const data = (await response.json()) as {\n requestId: string;\n status: string;\n signature?: string;\n transactionHash?: string;\n };\n\n return {\n requestId: data.requestId,\n status: data.status as 'pending' | 'approved' | 'denied',\n signature: data.signature,\n transactionHash: data.transactionHash,\n };\n }\n\n /**\n * Get request status\n */\n async getRequestStatus(requestId: string): Promise<BronRequestStatus> {\n // In mock mode, return approved status\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n requestId,\n status: 'approved',\n signature: 'mock-signature-' + requestId,\n transactionHash: 'mock-tx-hash',\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/signatures/${requestId}`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to get request status: ${error}`);\n }\n\n const data = (await response.json()) as {\n requestId: string;\n status: string;\n signature?: string;\n transactionHash?: string;\n error?: {\n code: string;\n message: string;\n };\n };\n\n return {\n requestId: data.requestId,\n status: data.status as 'pending' | 'approved' | 'denied' | 'expired',\n signature: data.signature,\n transactionHash: data.transactionHash,\n error: data.error,\n };\n }\n\n /**\n * Proxy a Canton Ledger API request through the Bron remote signer.\n *\n * Bron acts as an authenticated HTTP proxy — it forwards the request\n * to the Canton Ledger API on behalf of the connected party and returns\n * the raw JSON response.\n */\n async proxyLedgerApi(request: {\n requestMethod: string;\n resource: string;\n body?: string;\n sessionId: string;\n }): Promise<{ response: string }> {\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return { response: JSON.stringify({ activeContracts: [], nextPageToken: null }) };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/ledger-proxy`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ledger API proxy failed: ${error}`);\n }\n\n const data = (await response.json()) as { response: string };\n return { response: data.response };\n }\n\n /**\n * Poll request status until complete\n */\n async pollRequestStatus(\n requestId: string,\n timeoutMs: number = 60000,\n intervalMs: number = 2000\n ): Promise<BronRequestStatus> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n const status = await this.getRequestStatus(requestId);\n\n if (status.status === 'approved' || status.status === 'denied' || status.status === 'expired') {\n return status;\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n throw new Error('Polling timeout');\n }\n}\n","/**\n * Bron Wallet Adapter\n * \n * Enterprise remote signer adapter using OAuth2 + API client.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n * - Bron ecosystem: https://www.canton.network/ecosystem/bron-wallet\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletAdapter,\n AdapterContext,\n AdapterDetectResult,\n AdapterConnectResult,\n SignMessageParams,\n SignTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\nimport {\n toWalletId,\n toSignature,\n toTransactionHash,\n UserRejectedError,\n mapUnknownErrorToPartyLayerError,\n type CapabilityKey,\n} from '@partylayer/core';\nimport { BronAuthClient, type BronAuthConfig } from './auth';\nimport { BronApiClient, type BronApiConfig } from './api';\n\n// Re-export types for convenience\nexport type { BronAuthConfig } from './auth';\nexport type { BronApiConfig } from './api';\n\n/**\n * Bron adapter configuration\n */\nexport interface BronAdapterConfig {\n /** OAuth2 configuration */\n auth: BronAuthConfig;\n /** API configuration */\n api: BronApiConfig;\n /** Use mock API in development */\n useMockApi?: boolean;\n}\n\n/**\n * Bron Wallet Adapter\n */\nexport class BronAdapter implements WalletAdapter {\n readonly walletId = toWalletId('bron');\n readonly name = 'Bron';\n\n private authClient: BronAuthClient;\n private apiClient: BronApiClient;\n\n constructor(config: BronAdapterConfig) {\n // Initialize auth client\n // Tokens stored in memory by default (secure)\n // Can optionally use encrypted storage if provided\n this.authClient = new BronAuthClient(config.auth);\n\n // Initialize API client\n if (config.useMockApi || process.env.NODE_ENV === 'development') {\n // Use mock API client in development\n this.apiClient = this.createMockApiClient();\n } else {\n this.apiClient = new BronApiClient({\n baseUrl: config.api.baseUrl,\n getAccessToken: async () => {\n return await this.authClient.getAccessToken();\n },\n });\n }\n }\n\n /**\n * Create mock API client for development\n */\n private createMockApiClient(): BronApiClient {\n // Create a mock implementation that simulates API behavior\n const mockBaseUrl = 'https://api.bron.dev';\n return new BronApiClient({\n baseUrl: mockBaseUrl,\n getAccessToken: () => {\n // In mock mode, return a mock token\n return Promise.resolve('mock-bron-token');\n },\n });\n }\n\n getCapabilities(): CapabilityKey[] {\n return [\n 'connect',\n 'disconnect',\n 'restore',\n 'remoteSigner',\n 'signMessage',\n 'signTransaction',\n 'ledgerApi',\n ];\n }\n\n detectInstalled(): Promise<AdapterDetectResult> {\n // Bron is an enterprise remote signer - no \"installation\" required\n // Availability depends on OAuth2 configuration\n return Promise.resolve({\n installed: true,\n reason: 'Bron is a remote signer service',\n });\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: {\n timeoutMs?: number;\n requiredCapabilities?: CapabilityKey[];\n }\n ): Promise<AdapterConnectResult> {\n try {\n // Check if we have an access token\n let accessToken = await this.authClient.getAccessToken();\n\n // If no token, start OAuth flow\n if (!accessToken) {\n if (typeof window === 'undefined') {\n throw new Error('OAuth flow requires browser environment');\n }\n\n const authUrl = await this.authClient.startAuth();\n \n // Open auth URL (popup or redirect)\n const popup = window.open(\n authUrl,\n 'Bron Auth',\n 'width=500,height=600'\n );\n\n if (!popup) {\n throw new Error('Failed to open auth popup');\n }\n\n // Wait for callback (would be handled by finishAuth in real flow)\n // For now, simulate\n await new Promise((resolve) => setTimeout(resolve, 1000));\n \n // In production, finishAuth would be called with callback URL\n // For mock, we'll create a mock token\n if (process.env.NODE_ENV === 'development') {\n // Mock token for development\n accessToken = 'mock-token';\n } else {\n throw new Error('OAuth callback not implemented in adapter - handle in app');\n }\n }\n\n // Create session with Bron API\n const session = await this.apiClient.createSession();\n\n return {\n partyId: session.partyId,\n session: {\n walletId: this.walletId,\n network: ctx.network,\n createdAt: Date.now(),\n expiresAt: session.expiresAt,\n capabilitiesSnapshot: ['connect', 'signMessage', 'signTransaction', 'remoteSigner'],\n metadata: {\n sessionId: session.sessionId,\n },\n },\n capabilities: ['connect', 'signMessage', 'signTransaction', 'remoteSigner'],\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'remote',\n });\n }\n }\n\n async disconnect(\n _ctx: AdapterContext,\n _session: import('@partylayer/core').Session\n ): Promise<void> {\n await this.authClient.logout();\n }\n\n async restore(\n _ctx: AdapterContext,\n persisted: import('@partylayer/core').PersistedSession\n ): Promise<import('@partylayer/core').Session | null> {\n // Check if we have a session ID and access token\n const sessionId = persisted.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n return null;\n }\n\n const accessToken = await this.authClient.getAccessToken();\n if (!accessToken) {\n return null; // No token to restore\n }\n\n // Check expiration\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) {\n return null;\n }\n\n // Restore session\n return {\n ...persisted,\n walletId: this.walletId,\n };\n }\n\n async signMessage(\n _ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: SignMessageParams\n ): Promise<import('@partylayer/core').SignedMessage> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n // Request signature\n const signResponse = await this.apiClient.requestSignature({\n message: params.message,\n sessionId,\n });\n\n // If pending, poll for status\n if (signResponse.status === 'pending') {\n const status = await this.apiClient.pollRequestStatus(signResponse.requestId);\n \n if (status.status === 'denied') {\n throw new UserRejectedError('Signature request denied');\n }\n\n if (status.status === 'approved' && status.signature) {\n return {\n message: params.message,\n signature: toSignature(status.signature),\n partyId: session.partyId,\n };\n }\n\n throw new Error('Signature request failed');\n }\n\n if (signResponse.status === 'denied') {\n throw new UserRejectedError('Signature request denied');\n }\n\n if (!signResponse.signature) {\n throw new Error('No signature in response');\n }\n\n return {\n message: params.message,\n signature: toSignature(signResponse.signature),\n partyId: session.partyId,\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'remote',\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: SignTransactionParams\n ): Promise<import('@partylayer/core').SignedTransaction> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n // Request signature\n const signResponse = await this.apiClient.requestSignature({\n transaction: params.tx,\n sessionId,\n });\n\n // If pending, poll for status\n if (signResponse.status === 'pending') {\n const status = await this.apiClient.pollRequestStatus(signResponse.requestId);\n \n if (status.status === 'denied') {\n throw new UserRejectedError('Transaction signing denied');\n }\n\n if (status.status === 'approved' && status.signature) {\n const signedTx = typeof params.tx === 'object' && params.tx !== null\n ? { ...params.tx as Record<string, unknown>, signature: status.signature }\n : { tx: params.tx, signature: status.signature };\n return {\n signedTx,\n transactionHash: status.transactionHash\n ? toTransactionHash(status.transactionHash)\n : toTransactionHash('pending'),\n partyId: session.partyId,\n };\n }\n\n throw new Error('Transaction signing failed');\n }\n\n if (signResponse.status === 'denied') {\n throw new UserRejectedError('Transaction signing denied');\n }\n\n if (!signResponse.signature) {\n throw new Error('No signature in response');\n }\n\n const signedTx = typeof params.tx === 'object' && params.tx !== null\n ? { ...params.tx as Record<string, unknown>, signature: signResponse.signature }\n : { tx: params.tx, signature: signResponse.signature };\n return {\n signedTx,\n transactionHash: signResponse.transactionHash\n ? toTransactionHash(signResponse.transactionHash)\n : toTransactionHash('pending'),\n partyId: session.partyId,\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'signTransaction',\n transport: 'remote',\n });\n }\n }\n\n /**\n * Proxy a Canton Ledger API request through the Bron enterprise API.\n *\n * Bron acts as an authenticated HTTP proxy — it forwards the request\n * to the Canton Ledger API using the enterprise session credentials.\n */\n async ledgerApi(\n ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n ctx.logger.debug('Proxying ledger API request via Bron', {\n sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.apiClient.proxyLedgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n sessionId,\n });\n\n return { response: result.response };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'remote',\n });\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth.ts","../src/api.ts","../src/bron-adapter.ts"],"names":["error","signedTx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Bron OAuth2 Authentication Client\n * \n * Handles OAuth2 flows for Bron enterprise wallet.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n * - Bron ecosystem: https://www.canton.network/ecosystem/bron-wallet\n */\n\nimport type { StorageAdapter } from '@partylayer/core';\n\n/**\n * OAuth2 configuration\n */\nexport interface BronAuthConfig {\n /** Authorization server URL */\n authorizationUrl: string;\n /** Token endpoint URL */\n tokenUrl: string;\n /** Client ID */\n clientId: string;\n /** Client secret (for server-side flows) */\n clientSecret?: string;\n /** Redirect URI */\n redirectUri: string;\n /** Scopes */\n scopes?: string[];\n /** Use PKCE (recommended for browser) */\n usePKCE?: boolean;\n}\n\n/**\n * OAuth2 tokens\n */\nexport interface BronTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n tokenType: string;\n}\n\n/**\n * Bron OAuth2 client\n */\nexport class BronAuthClient {\n private config: BronAuthConfig;\n private storage?: StorageAdapter;\n private tokens: BronTokens | null = null; // In-memory by default\n\n constructor(config: BronAuthConfig, storage?: StorageAdapter) {\n this.config = config;\n this.storage = storage;\n }\n\n /**\n * Generate PKCE code verifier and challenge\n */\n private async generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n const verifier = this.generateRandomString(128);\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n return { verifier, challenge };\n }\n\n /**\n * Generate random string\n */\n private generateRandomString(length: number): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Start authorization flow\n */\n async startAuth(): Promise<string> {\n const state = this.generateRandomString(32);\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n state,\n scope: (this.config.scopes || ['openid', 'profile']).join(' '),\n });\n\n // Add PKCE if enabled\n if (this.config.usePKCE) {\n const pkce = await this.generatePKCE();\n params.set('code_challenge', pkce.challenge);\n params.set('code_challenge_method', 'S256');\n \n // Store verifier temporarily (in sessionStorage)\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('bron_pkce_verifier', pkce.verifier);\n sessionStorage.setItem('bron_auth_state', state);\n }\n } else {\n // Store state\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('bron_auth_state', state);\n }\n }\n\n const authUrl = `${this.config.authorizationUrl}?${params.toString()}`;\n return authUrl;\n }\n\n /**\n * Finish authorization flow with callback URL\n */\n async finishAuth(callbackUrl: string): Promise<BronTokens> {\n const url = new URL(callbackUrl);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n throw new Error(`OAuth error: ${error}`);\n }\n\n if (!code) {\n throw new Error('No authorization code in callback');\n }\n\n // Validate state\n if (typeof window !== 'undefined') {\n const storedState = sessionStorage.getItem('bron_auth_state');\n if (state !== storedState) {\n throw new Error('State mismatch');\n }\n }\n\n // Exchange code for tokens\n const tokenParams = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: this.config.redirectUri,\n client_id: this.config.clientId,\n });\n\n // Add PKCE verifier if used\n if (this.config.usePKCE && typeof window !== 'undefined') {\n const verifier = sessionStorage.getItem('bron_pkce_verifier');\n if (verifier) {\n tokenParams.set('code_verifier', verifier);\n sessionStorage.removeItem('bron_pkce_verifier');\n }\n }\n\n // Add client secret for server-side flow\n if (this.config.clientSecret) {\n tokenParams.set('client_secret', this.config.clientSecret);\n }\n\n // Request tokens\n const response = await fetch(this.config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: tokenParams.toString(),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const tokenData = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n token_type: string;\n };\n\n const tokens: BronTokens = {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n expiresAt: Date.now() + tokenData.expires_in * 1000,\n tokenType: tokenData.token_type || 'Bearer',\n };\n\n // Store tokens (in memory by default, or encrypted storage if configured)\n this.tokens = tokens;\n if (this.storage) {\n // Store encrypted (implementation depends on storage adapter)\n await this.storage.set('bron_tokens', JSON.stringify(tokens));\n }\n\n // Clean up session storage\n if (typeof window !== 'undefined') {\n sessionStorage.removeItem('bron_auth_state');\n }\n\n return tokens;\n }\n\n /**\n * Get current access token\n */\n async getAccessToken(): Promise<string | null> {\n // Check if token exists and is not expired\n if (this.tokens && Date.now() < this.tokens.expiresAt) {\n return this.tokens.accessToken;\n }\n\n // Try to load from storage\n if (this.storage) {\n const stored = await this.storage.get('bron_tokens');\n if (stored) {\n this.tokens = JSON.parse(stored) as BronTokens;\n if (Date.now() < this.tokens.expiresAt) {\n return this.tokens.accessToken;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Logout\n */\n async logout(): Promise<void> {\n this.tokens = null;\n if (this.storage) {\n await this.storage.remove('bron_tokens');\n }\n }\n}\n","/**\n * Bron API Client\n * \n * Typed client for Bron enterprise wallet API endpoints.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n */\n\nimport type { PartyId } from '@partylayer/core';\nimport { toPartyId } from '@partylayer/core';\n\n/**\n * Bron API configuration\n */\nexport interface BronApiConfig {\n /** Base API URL */\n baseUrl: string;\n /** Access token getter */\n getAccessToken: () => Promise<string | null>;\n}\n\n/**\n * Session/Party mapping\n */\nexport interface BronSession {\n sessionId: string;\n partyId: PartyId;\n expiresAt?: number;\n}\n\n/**\n * Signature request\n */\nexport interface BronSignRequest {\n message?: string;\n transaction?: unknown;\n sessionId: string;\n}\n\n/**\n * Signature response\n */\nexport interface BronSignResponse {\n requestId: string;\n status: 'pending' | 'approved' | 'denied';\n signature?: string;\n transactionHash?: string;\n}\n\n/**\n * Request status\n */\nexport interface BronRequestStatus {\n requestId: string;\n status: 'pending' | 'approved' | 'denied' | 'expired';\n signature?: string;\n transactionHash?: string;\n error?: {\n code: string;\n message: string;\n };\n}\n\n/**\n * Bron API client\n */\nexport class BronApiClient {\n private config: BronApiConfig;\n\n constructor(config: BronApiConfig) {\n this.config = config;\n }\n\n /**\n * Create authenticated request headers\n */\n private async getHeaders(): Promise<HeadersInit> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new Error('No access token available');\n }\n\n return {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Create session / get party mapping\n */\n async createSession(): Promise<BronSession> {\n // In mock mode, return mock data\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n sessionId: 'mock-session-' + Date.now(),\n partyId: toPartyId('mock-party-' + Date.now()),\n expiresAt: Date.now() + 3600000,\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/sessions`, {\n method: 'POST',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create session: ${error}`);\n }\n\n const data = (await response.json()) as {\n sessionId: string;\n partyId: string;\n expiresAt?: number;\n };\n\n return {\n sessionId: data.sessionId,\n partyId: toPartyId(data.partyId),\n expiresAt: data.expiresAt,\n };\n }\n\n /**\n * Request signature\n */\n async requestSignature(request: BronSignRequest): Promise<BronSignResponse> {\n // In mock mode, return mock response\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n requestId: 'mock-request-' + Date.now(),\n status: 'pending',\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/signatures`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to request signature: ${error}`);\n }\n\n const data = (await response.json()) as {\n requestId: string;\n status: string;\n signature?: string;\n transactionHash?: string;\n };\n\n return {\n requestId: data.requestId,\n status: data.status as 'pending' | 'approved' | 'denied',\n signature: data.signature,\n transactionHash: data.transactionHash,\n };\n }\n\n /**\n * Get request status\n */\n async getRequestStatus(requestId: string): Promise<BronRequestStatus> {\n // In mock mode, return approved status\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return {\n requestId,\n status: 'approved',\n signature: 'mock-signature-' + requestId,\n transactionHash: 'mock-tx-hash',\n };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/signatures/${requestId}`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to get request status: ${error}`);\n }\n\n const data = (await response.json()) as {\n requestId: string;\n status: string;\n signature?: string;\n transactionHash?: string;\n error?: {\n code: string;\n message: string;\n };\n };\n\n return {\n requestId: data.requestId,\n status: data.status as 'pending' | 'approved' | 'denied' | 'expired',\n signature: data.signature,\n transactionHash: data.transactionHash,\n error: data.error,\n };\n }\n\n /**\n * Proxy a Canton Ledger API request through the Bron remote signer.\n *\n * Bron acts as an authenticated HTTP proxy — it forwards the request\n * to the Canton Ledger API on behalf of the connected party and returns\n * the raw JSON response.\n */\n async proxyLedgerApi(request: {\n requestMethod: string;\n resource: string;\n body?: string;\n sessionId: string;\n }): Promise<{ response: string }> {\n if (this.config.baseUrl.includes('mock') || this.config.baseUrl.includes('dev')) {\n return { response: JSON.stringify({ activeContracts: [], nextPageToken: null }) };\n }\n\n const headers = await this.getHeaders();\n const response = await fetch(`${this.config.baseUrl}/ledger-proxy`, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ledger API proxy failed: ${error}`);\n }\n\n const data = (await response.json()) as { response: string };\n return { response: data.response };\n }\n\n /**\n * Poll request status until complete\n */\n async pollRequestStatus(\n requestId: string,\n timeoutMs: number = 60000,\n intervalMs: number = 2000\n ): Promise<BronRequestStatus> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n const status = await this.getRequestStatus(requestId);\n\n if (status.status === 'approved' || status.status === 'denied' || status.status === 'expired') {\n return status;\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n throw new Error('Polling timeout');\n }\n}\n","/**\n * Bron Wallet Adapter\n * \n * Enterprise remote signer adapter using OAuth2 + API client.\n * \n * References:\n * - Bron developer portal: https://developer.bron.org/\n * - Bron ecosystem: https://www.canton.network/ecosystem/bron-wallet\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletAdapter,\n AdapterContext,\n AdapterDetectResult,\n AdapterConnectResult,\n SignMessageParams,\n SignTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\nimport {\n toWalletId,\n toSignature,\n toTransactionHash,\n UserRejectedError,\n mapUnknownErrorToPartyLayerError,\n type CapabilityKey,\n} from '@partylayer/core';\nimport { BronAuthClient, type BronAuthConfig } from './auth';\nimport { BronApiClient, type BronApiConfig } from './api';\n\n// Re-export types for convenience\nexport type { BronAuthConfig } from './auth';\nexport type { BronApiConfig } from './api';\n\n/**\n * Bron adapter configuration\n */\nexport interface BronAdapterConfig {\n /** OAuth2 configuration */\n auth: BronAuthConfig;\n /** API configuration */\n api: BronApiConfig;\n /** Use mock API in development */\n useMockApi?: boolean;\n}\n\n/**\n * Bron Wallet Adapter\n */\nexport class BronAdapter implements WalletAdapter {\n readonly walletId = toWalletId('bron');\n readonly name = 'Bron';\n\n private authClient: BronAuthClient;\n private apiClient: BronApiClient;\n\n constructor(config: BronAdapterConfig) {\n // Initialize auth client\n // Tokens stored in memory by default (secure)\n // Can optionally use encrypted storage if provided\n this.authClient = new BronAuthClient(config.auth);\n\n // Initialize API client\n if (config.useMockApi || process.env.NODE_ENV === 'development') {\n // Use mock API client in development\n this.apiClient = this.createMockApiClient();\n } else {\n this.apiClient = new BronApiClient({\n baseUrl: config.api.baseUrl,\n getAccessToken: async () => {\n return await this.authClient.getAccessToken();\n },\n });\n }\n }\n\n /**\n * Create mock API client for development\n */\n private createMockApiClient(): BronApiClient {\n // Create a mock implementation that simulates API behavior\n const mockBaseUrl = 'https://api.bron.dev';\n return new BronApiClient({\n baseUrl: mockBaseUrl,\n getAccessToken: () => {\n // In mock mode, return a mock token\n return Promise.resolve('mock-bron-token');\n },\n });\n }\n\n getCapabilities(): CapabilityKey[] {\n return [\n 'connect',\n 'disconnect',\n 'restore',\n 'remoteSigner',\n 'signMessage',\n 'signTransaction',\n 'ledgerApi',\n ];\n }\n\n detectInstalled(): Promise<AdapterDetectResult> {\n // Bron is an enterprise remote signer - no \"installation\" required\n // Availability depends on OAuth2 configuration\n return Promise.resolve({\n installed: true,\n reason: 'Bron is a remote signer service',\n });\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: {\n timeoutMs?: number;\n requiredCapabilities?: CapabilityKey[];\n }\n ): Promise<AdapterConnectResult> {\n try {\n // Check if we have an access token\n let accessToken = await this.authClient.getAccessToken();\n\n // If no token, start OAuth flow\n if (!accessToken) {\n if (typeof window === 'undefined') {\n throw new Error('OAuth flow requires browser environment');\n }\n\n const authUrl = await this.authClient.startAuth();\n \n // Open auth URL (popup or redirect)\n const popup = window.open(\n authUrl,\n 'Bron Auth',\n 'width=500,height=600'\n );\n\n if (!popup) {\n throw new Error('Failed to open auth popup');\n }\n\n // Wait for callback (would be handled by finishAuth in real flow)\n // For now, simulate\n await new Promise((resolve) => setTimeout(resolve, 1000));\n \n // In production, finishAuth would be called with callback URL\n // For mock, we'll create a mock token\n if (process.env.NODE_ENV === 'development') {\n // Mock token for development\n accessToken = 'mock-token';\n } else {\n throw new Error('OAuth callback not implemented in adapter - handle in app');\n }\n }\n\n // Create session with Bron API\n const session = await this.apiClient.createSession();\n\n return {\n partyId: session.partyId,\n session: {\n walletId: this.walletId,\n // Bron's API session does not report the connected network → not\n // wallet-reported, so network-mismatch detection is limited for this\n // adapter (echoes the requested ctx.network).\n network: ctx.network,\n createdAt: Date.now(),\n expiresAt: session.expiresAt,\n capabilitiesSnapshot: ['connect', 'signMessage', 'signTransaction', 'remoteSigner'],\n metadata: {\n sessionId: session.sessionId,\n },\n },\n capabilities: ['connect', 'signMessage', 'signTransaction', 'remoteSigner'],\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'remote',\n });\n }\n }\n\n async disconnect(\n _ctx: AdapterContext,\n _session: import('@partylayer/core').Session\n ): Promise<void> {\n await this.authClient.logout();\n }\n\n async restore(\n _ctx: AdapterContext,\n persisted: import('@partylayer/core').PersistedSession\n ): Promise<import('@partylayer/core').Session | null> {\n // Check if we have a session ID and access token\n const sessionId = persisted.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n return null;\n }\n\n const accessToken = await this.authClient.getAccessToken();\n if (!accessToken) {\n return null; // No token to restore\n }\n\n // Check expiration\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) {\n return null;\n }\n\n // Restore session\n return {\n ...persisted,\n walletId: this.walletId,\n };\n }\n\n async signMessage(\n _ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: SignMessageParams\n ): Promise<import('@partylayer/core').SignedMessage> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n // Request signature\n const signResponse = await this.apiClient.requestSignature({\n message: params.message,\n sessionId,\n });\n\n // If pending, poll for status\n if (signResponse.status === 'pending') {\n const status = await this.apiClient.pollRequestStatus(signResponse.requestId);\n \n if (status.status === 'denied') {\n throw new UserRejectedError('Signature request denied');\n }\n\n if (status.status === 'approved' && status.signature) {\n return {\n message: params.message,\n signature: toSignature(status.signature),\n partyId: session.partyId,\n };\n }\n\n throw new Error('Signature request failed');\n }\n\n if (signResponse.status === 'denied') {\n throw new UserRejectedError('Signature request denied');\n }\n\n if (!signResponse.signature) {\n throw new Error('No signature in response');\n }\n\n return {\n message: params.message,\n signature: toSignature(signResponse.signature),\n partyId: session.partyId,\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'remote',\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: SignTransactionParams\n ): Promise<import('@partylayer/core').SignedTransaction> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n // Request signature\n const signResponse = await this.apiClient.requestSignature({\n transaction: params.tx,\n sessionId,\n });\n\n // If pending, poll for status\n if (signResponse.status === 'pending') {\n const status = await this.apiClient.pollRequestStatus(signResponse.requestId);\n \n if (status.status === 'denied') {\n throw new UserRejectedError('Transaction signing denied');\n }\n\n if (status.status === 'approved' && status.signature) {\n const signedTx = typeof params.tx === 'object' && params.tx !== null\n ? { ...params.tx as Record<string, unknown>, signature: status.signature }\n : { tx: params.tx, signature: status.signature };\n return {\n signedTx,\n transactionHash: status.transactionHash\n ? toTransactionHash(status.transactionHash)\n : toTransactionHash('pending'),\n partyId: session.partyId,\n };\n }\n\n throw new Error('Transaction signing failed');\n }\n\n if (signResponse.status === 'denied') {\n throw new UserRejectedError('Transaction signing denied');\n }\n\n if (!signResponse.signature) {\n throw new Error('No signature in response');\n }\n\n const signedTx = typeof params.tx === 'object' && params.tx !== null\n ? { ...params.tx as Record<string, unknown>, signature: signResponse.signature }\n : { tx: params.tx, signature: signResponse.signature };\n return {\n signedTx,\n transactionHash: signResponse.transactionHash\n ? toTransactionHash(signResponse.transactionHash)\n : toTransactionHash('pending'),\n partyId: session.partyId,\n };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'signTransaction',\n transport: 'remote',\n });\n }\n }\n\n /**\n * Proxy a Canton Ledger API request through the Bron enterprise API.\n *\n * Bron acts as an authenticated HTTP proxy — it forwards the request\n * to the Canton Ledger API using the enterprise session credentials.\n */\n async ledgerApi(\n ctx: AdapterContext,\n session: import('@partylayer/core').Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n const sessionId = session.metadata?.sessionId;\n if (typeof sessionId !== 'string') {\n throw new Error('No session ID');\n }\n\n ctx.logger.debug('Proxying ledger API request via Bron', {\n sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.apiClient.proxyLedgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n sessionId,\n });\n\n return { response: result.response };\n } catch (err) {\n throw mapUnknownErrorToPartyLayerError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'remote',\n });\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@partylayer/adapter-bron",
3
- "version": "0.2.10",
3
+ "version": "0.2.12",
4
4
  "description": "Bron Wallet adapter for PartyLayer",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -32,16 +32,18 @@
32
32
  "url": "https://github.com/PartyLayer/PartyLayer/issues"
33
33
  },
34
34
  "dependencies": {
35
- "@partylayer/core": "^0.3.0"
35
+ "@partylayer/core": "^0.5.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^20.11.0",
39
- "typescript": "^5.3.3"
39
+ "typescript": "^5.3.3",
40
+ "vitest": "^1.2.0"
40
41
  },
41
42
  "scripts": {
42
43
  "build": "tsup",
43
44
  "clean": "rm -rf dist",
44
45
  "lint": "eslint src --ext .ts",
45
- "typecheck": "tsc --noEmit"
46
+ "typecheck": "tsc --noEmit",
47
+ "test": "vitest run"
46
48
  }
47
49
  }