@partylayer/adapter-bron 0.2.3 → 0.2.5

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 CantonConnect
3
+ Copyright (c) 2026 PartyLayer
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # @partylayer/adapter-bron
2
+
3
+ <div align="center">
4
+
5
+ **Bron Wallet adapter for PartyLayer**
6
+
7
+ [![npm version](https://img.shields.io/npm/v/@partylayer/adapter-bron.svg?style=flat-square)](https://www.npmjs.com/package/@partylayer/adapter-bron)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
9
+
10
+ </div>
11
+
12
+ ---
13
+
14
+ ## Overview
15
+
16
+ Adapter for the [Bron Wallet](https://www.canton.network/ecosystem/bron-wallet), an enterprise remote signer using OAuth2 authentication and API-based signing.
17
+
18
+ > **Note**: This adapter is included in `@partylayer/sdk` by default. You only need to install it separately if building a custom setup.
19
+
20
+ ---
21
+
22
+ ## Installation
23
+
24
+ ```bash
25
+ npm install @partylayer/adapter-bron
26
+ ```
27
+
28
+ ---
29
+
30
+ ## Usage with SDK
31
+
32
+ ```typescript
33
+ import { createPartyLayer } from '@partylayer/sdk';
34
+
35
+ const client = createPartyLayer({ network: 'devnet' });
36
+ await client.connect({ walletId: 'bron' });
37
+ ```
38
+
39
+ ---
40
+
41
+ ## Links
42
+
43
+ - [GitHub Repository](https://github.com/PartyLayer/PartyLayer)
44
+ - [Bron Developer Portal](https://developer.bron.org/)
45
+ - [Report Issues](https://github.com/PartyLayer/PartyLayer/issues)
46
+
47
+ ---
48
+
49
+ ## License
50
+
51
+ MIT
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _partylayer_core from '@partylayer/core';
2
- import { WalletAdapter, CapabilityKey, AdapterDetectResult, AdapterContext, AdapterConnectResult, SignMessageParams, SignTransactionParams } from '@partylayer/core';
2
+ import { WalletAdapter, CapabilityKey, AdapterDetectResult, AdapterContext, AdapterConnectResult, SignMessageParams, SignTransactionParams, LedgerApiParams, LedgerApiResult } from '@partylayer/core';
3
3
 
4
4
  /**
5
5
  * Bron OAuth2 Authentication Client
@@ -84,6 +84,13 @@ declare class BronAdapter implements WalletAdapter {
84
84
  restore(_ctx: AdapterContext, persisted: _partylayer_core.PersistedSession): Promise<_partylayer_core.Session | null>;
85
85
  signMessage(_ctx: AdapterContext, session: _partylayer_core.Session, params: SignMessageParams): Promise<_partylayer_core.SignedMessage>;
86
86
  signTransaction(_ctx: AdapterContext, session: _partylayer_core.Session, params: SignTransactionParams): Promise<_partylayer_core.SignedTransaction>;
87
+ /**
88
+ * Proxy a Canton Ledger API request through the Bron enterprise API.
89
+ *
90
+ * Bron acts as an authenticated HTTP proxy — it forwards the request
91
+ * to the Canton Ledger API using the enterprise session credentials.
92
+ */
93
+ ledgerApi(ctx: AdapterContext, session: _partylayer_core.Session, params: LedgerApiParams): Promise<LedgerApiResult>;
87
94
  }
88
95
 
89
96
  export { BronAdapter, type BronAdapterConfig, type BronApiConfig, type BronAuthConfig };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _partylayer_core from '@partylayer/core';
2
- import { WalletAdapter, CapabilityKey, AdapterDetectResult, AdapterContext, AdapterConnectResult, SignMessageParams, SignTransactionParams } from '@partylayer/core';
2
+ import { WalletAdapter, CapabilityKey, AdapterDetectResult, AdapterContext, AdapterConnectResult, SignMessageParams, SignTransactionParams, LedgerApiParams, LedgerApiResult } from '@partylayer/core';
3
3
 
4
4
  /**
5
5
  * Bron OAuth2 Authentication Client
@@ -84,6 +84,13 @@ declare class BronAdapter implements WalletAdapter {
84
84
  restore(_ctx: AdapterContext, persisted: _partylayer_core.PersistedSession): Promise<_partylayer_core.Session | null>;
85
85
  signMessage(_ctx: AdapterContext, session: _partylayer_core.Session, params: SignMessageParams): Promise<_partylayer_core.SignedMessage>;
86
86
  signTransaction(_ctx: AdapterContext, session: _partylayer_core.Session, params: SignTransactionParams): Promise<_partylayer_core.SignedTransaction>;
87
+ /**
88
+ * Proxy a Canton Ledger API request through the Bron enterprise API.
89
+ *
90
+ * Bron acts as an authenticated HTTP proxy — it forwards the request
91
+ * to the Canton Ledger API using the enterprise session credentials.
92
+ */
93
+ ledgerApi(ctx: AdapterContext, session: _partylayer_core.Session, params: LedgerApiParams): Promise<LedgerApiResult>;
87
94
  }
88
95
 
89
96
  export { BronAdapter, type BronAdapterConfig, type BronApiConfig, type BronAuthConfig };
package/dist/index.js CHANGED
@@ -255,6 +255,30 @@ var BronApiClient = class {
255
255
  error: data.error
256
256
  };
257
257
  }
258
+ /**
259
+ * Proxy a Canton Ledger API request through the Bron remote signer.
260
+ *
261
+ * Bron acts as an authenticated HTTP proxy — it forwards the request
262
+ * to the Canton Ledger API on behalf of the connected party and returns
263
+ * the raw JSON response.
264
+ */
265
+ async proxyLedgerApi(request) {
266
+ if (this.config.baseUrl.includes("mock") || this.config.baseUrl.includes("dev")) {
267
+ return { response: JSON.stringify({ activeContracts: [], nextPageToken: null }) };
268
+ }
269
+ const headers = await this.getHeaders();
270
+ const response = await fetch(`${this.config.baseUrl}/ledger-proxy`, {
271
+ method: "POST",
272
+ headers,
273
+ body: JSON.stringify(request)
274
+ });
275
+ if (!response.ok) {
276
+ const error = await response.text();
277
+ throw new Error(`Ledger API proxy failed: ${error}`);
278
+ }
279
+ const data = await response.json();
280
+ return { response: data.response };
281
+ }
258
282
  /**
259
283
  * Poll request status until complete
260
284
  */
@@ -308,7 +332,8 @@ var BronAdapter = class {
308
332
  "disconnect",
309
333
  "remoteSigner",
310
334
  "signMessage",
311
- "signTransaction"
335
+ "signTransaction",
336
+ "ledgerApi"
312
337
  // restore depends on session persistence
313
338
  ];
314
339
  }
@@ -472,6 +497,38 @@ var BronAdapter = class {
472
497
  });
473
498
  }
474
499
  }
500
+ /**
501
+ * Proxy a Canton Ledger API request through the Bron enterprise API.
502
+ *
503
+ * Bron acts as an authenticated HTTP proxy — it forwards the request
504
+ * to the Canton Ledger API using the enterprise session credentials.
505
+ */
506
+ async ledgerApi(ctx, session, params) {
507
+ try {
508
+ const sessionId = session.metadata?.sessionId;
509
+ if (typeof sessionId !== "string") {
510
+ throw new Error("No session ID");
511
+ }
512
+ ctx.logger.debug("Proxying ledger API request via Bron", {
513
+ sessionId,
514
+ requestMethod: params.requestMethod,
515
+ resource: params.resource
516
+ });
517
+ const result = await this.apiClient.proxyLedgerApi({
518
+ requestMethod: params.requestMethod,
519
+ resource: params.resource,
520
+ body: params.body,
521
+ sessionId
522
+ });
523
+ return { response: result.response };
524
+ } catch (err) {
525
+ throw core.mapUnknownErrorToPartyLayerError(err, {
526
+ walletId: this.walletId,
527
+ phase: "ledgerApi",
528
+ transport: "remote"
529
+ });
530
+ }
531
+ }
475
532
  };
476
533
 
477
534
  exports.BronAdapter = BronAdapter;
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 * 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} 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 'remoteSigner',\n 'signMessage',\n 'signTransaction',\n // restore depends on session persistence\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"]}
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 'remoteSigner',\n 'signMessage',\n 'signTransaction',\n 'ledgerApi',\n // restore depends on session persistence\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"]}
package/dist/index.mjs CHANGED
@@ -253,6 +253,30 @@ var BronApiClient = class {
253
253
  error: data.error
254
254
  };
255
255
  }
256
+ /**
257
+ * Proxy a Canton Ledger API request through the Bron remote signer.
258
+ *
259
+ * Bron acts as an authenticated HTTP proxy — it forwards the request
260
+ * to the Canton Ledger API on behalf of the connected party and returns
261
+ * the raw JSON response.
262
+ */
263
+ async proxyLedgerApi(request) {
264
+ if (this.config.baseUrl.includes("mock") || this.config.baseUrl.includes("dev")) {
265
+ return { response: JSON.stringify({ activeContracts: [], nextPageToken: null }) };
266
+ }
267
+ const headers = await this.getHeaders();
268
+ const response = await fetch(`${this.config.baseUrl}/ledger-proxy`, {
269
+ method: "POST",
270
+ headers,
271
+ body: JSON.stringify(request)
272
+ });
273
+ if (!response.ok) {
274
+ const error = await response.text();
275
+ throw new Error(`Ledger API proxy failed: ${error}`);
276
+ }
277
+ const data = await response.json();
278
+ return { response: data.response };
279
+ }
256
280
  /**
257
281
  * Poll request status until complete
258
282
  */
@@ -306,7 +330,8 @@ var BronAdapter = class {
306
330
  "disconnect",
307
331
  "remoteSigner",
308
332
  "signMessage",
309
- "signTransaction"
333
+ "signTransaction",
334
+ "ledgerApi"
310
335
  // restore depends on session persistence
311
336
  ];
312
337
  }
@@ -470,6 +495,38 @@ var BronAdapter = class {
470
495
  });
471
496
  }
472
497
  }
498
+ /**
499
+ * Proxy a Canton Ledger API request through the Bron enterprise API.
500
+ *
501
+ * Bron acts as an authenticated HTTP proxy — it forwards the request
502
+ * to the Canton Ledger API using the enterprise session credentials.
503
+ */
504
+ async ledgerApi(ctx, session, params) {
505
+ try {
506
+ const sessionId = session.metadata?.sessionId;
507
+ if (typeof sessionId !== "string") {
508
+ throw new Error("No session ID");
509
+ }
510
+ ctx.logger.debug("Proxying ledger API request via Bron", {
511
+ sessionId,
512
+ requestMethod: params.requestMethod,
513
+ resource: params.resource
514
+ });
515
+ const result = await this.apiClient.proxyLedgerApi({
516
+ requestMethod: params.requestMethod,
517
+ resource: params.resource,
518
+ body: params.body,
519
+ sessionId
520
+ });
521
+ return { response: result.response };
522
+ } catch (err) {
523
+ throw mapUnknownErrorToPartyLayerError(err, {
524
+ walletId: this.walletId,
525
+ phase: "ledgerApi",
526
+ transport: "remote"
527
+ });
528
+ }
529
+ }
473
530
  };
474
531
 
475
532
  export { BronAdapter };
@@ -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 * 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} 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 'remoteSigner',\n 'signMessage',\n 'signTransaction',\n // restore depends on session persistence\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"]}
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 'remoteSigner',\n 'signMessage',\n 'signTransaction',\n 'ledgerApi',\n // restore depends on session persistence\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@partylayer/adapter-bron",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "Bron Wallet adapter for PartyLayer",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -24,15 +24,15 @@
24
24
  "license": "MIT",
25
25
  "repository": {
26
26
  "type": "git",
27
- "url": "https://github.com/cayvox/PartyLayer.git",
27
+ "url": "https://github.com/PartyLayer/PartyLayer.git",
28
28
  "directory": "packages/adapters/bron"
29
29
  },
30
- "homepage": "https://github.com/cayvox/PartyLayer#readme",
30
+ "homepage": "https://github.com/PartyLayer/PartyLayer#readme",
31
31
  "bugs": {
32
- "url": "https://github.com/cayvox/PartyLayer/issues"
32
+ "url": "https://github.com/PartyLayer/PartyLayer/issues"
33
33
  },
34
34
  "dependencies": {
35
- "@partylayer/core": "0.2.3"
35
+ "@partylayer/core": "0.2.6"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^20.11.0",