@partylayer/sdk 0.3.4 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +25 -2
- package/dist/index.d.ts +25 -2
- package/dist/index.js +56 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +34 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -7
package/dist/index.d.mts
CHANGED
|
@@ -2,13 +2,14 @@ import * as _partylayer_core from '@partylayer/core';
|
|
|
2
2
|
import { WalletAdapter, NetworkId, StorageAdapter, CryptoAdapter, TelemetryAdapter, LoggerAdapter, WalletId, Session, SessionId, TransactionHash, TransactionStatus, WalletInfo, SignMessageParams, SignedMessage, SignTransactionParams, SignedTransaction, SubmitTransactionParams, TxReceipt, LedgerApiParams, LedgerApiResult } from '@partylayer/core';
|
|
3
3
|
export { AdapterConnectResult, AdapterContext, AdapterDetectResult, PartyLayerError as CantonConnectError, CapabilityKey, CapabilityNotSupportedError, ENABLEMENT_METRICS, ERROR_METRICS, ErrorCode, InternalError, LedgerApiParams, LedgerApiResult, METRICS, MetricName, MetricsPayload, NetworkId, OriginNotAllowedError, PartyId, PartyLayerError, REGISTRY_METRICS, RegistryFetchFailedError, RegistrySchemaInvalidError, RegistryVerificationFailedError, Session, SessionExpiredError, SessionId, SignMessageParams, SignTransactionParams, SignedMessage, SignedTransaction, SubmitTransactionParams, TimeoutError, TransactionStatus, TransportError, TxReceipt, UserRejectedError, WalletAdapter, WalletId, WalletInfo, WalletNotFoundError, WalletNotInstalledError, errorMetricName } from '@partylayer/core';
|
|
4
4
|
import { RegistryClient, RegistryStatus } from '@partylayer/registry-client';
|
|
5
|
-
export { RegistryStatus } from '@partylayer/registry-client';
|
|
5
|
+
export { Cip0103StatusForDetection, Cip0103Support, ProviderDetection, ProviderMatcher, RegistryStatus, deriveGenericWalletName, findMatchingWallet, findMatchingWalletInfo, isCip0103Native, matchesProviderDetection } from '@partylayer/registry-client';
|
|
6
6
|
export { CANTON_NETWORKS, CIP0103Account, CIP0103ConnectResult, CIP0103Event, CIP0103EventBus, CIP0103Method, CIP0103Network, CIP0103Provider, CIP0103StatusEvent, CIP0103TxChangedEvent, CIP0103TxStatus, CIP0103_EVENTS, CIP0103_MANDATORY_METHODS, CIP0103_METHODS, DiscoveredProvider, JSON_RPC_ERRORS, PartyLayerProvider, PartyLayerProviderOptions, ProviderRpcError, RPC_ERRORS, createProviderBridge, discoverInjectedProviders, fromCAIP2Network, isCIP0103Provider, isValidCAIP2, toCAIP2Network, waitForProvider } from '@partylayer/provider';
|
|
7
7
|
export { BronAdapter, BronAdapterConfig, BronApiConfig, BronAuthConfig } from '@partylayer/adapter-bron';
|
|
8
8
|
export { Cantor8Adapter } from '@partylayer/adapter-cantor8';
|
|
9
9
|
export { ConsoleAdapter } from '@partylayer/adapter-console';
|
|
10
10
|
export { LoopAdapter } from '@partylayer/adapter-loop';
|
|
11
11
|
export { NightlyAdapter } from '@partylayer/adapter-nightly';
|
|
12
|
+
export { SendAdapter } from '@partylayer/adapter-send';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Configuration types for PartyLayer SDK
|
|
@@ -276,6 +277,22 @@ declare class PartyLayerClient {
|
|
|
276
277
|
* In production, adapters would be auto-registered via registry.
|
|
277
278
|
*/
|
|
278
279
|
registerAdapter(adapter: WalletAdapter): void;
|
|
280
|
+
/**
|
|
281
|
+
* Look up a registered adapter by wallet id.
|
|
282
|
+
*
|
|
283
|
+
* Returns the adapter instance when one is registered for the given
|
|
284
|
+
* `walletId`, or `undefined` otherwise. Intended for UI integrations
|
|
285
|
+
* that need to call `adapter.detectInstalled()` directly to render a
|
|
286
|
+
* per-wallet readiness indicator (instead of duplicating
|
|
287
|
+
* transport-specific install detection logic in the picker). The
|
|
288
|
+
* returned adapter is the same instance used internally for connect /
|
|
289
|
+
* sign / submit flows; do not mutate it.
|
|
290
|
+
*
|
|
291
|
+
* Accepts both raw string ids and the branded `WalletId` form so
|
|
292
|
+
* consumers can pass `walletInfo.walletId` or a string literal
|
|
293
|
+
* interchangeably.
|
|
294
|
+
*/
|
|
295
|
+
getAdapter(walletId: string | WalletId): WalletAdapter | undefined;
|
|
279
296
|
/**
|
|
280
297
|
* List available wallets
|
|
281
298
|
*/
|
|
@@ -346,7 +363,10 @@ declare class PartyLayerClient {
|
|
|
346
363
|
*/
|
|
347
364
|
private persistSession;
|
|
348
365
|
/**
|
|
349
|
-
* Remove session from storage
|
|
366
|
+
* Remove session from storage.
|
|
367
|
+
*
|
|
368
|
+
* Accepts a sessionId for call-site symmetry, but since the SDK tracks one
|
|
369
|
+
* active session we always remove the single SESSION_STORAGE_KEY.
|
|
350
370
|
*/
|
|
351
371
|
private removeSession;
|
|
352
372
|
/**
|
|
@@ -403,6 +423,9 @@ declare function createPartyLayer(config: PartyLayerConfig): PartyLayerClient;
|
|
|
403
423
|
* - LoopAdapter: 5N Loop mobile/web wallet
|
|
404
424
|
* - Cantor8Adapter: Cantor8 wallet with deep link transport
|
|
405
425
|
* - NightlyAdapter: Nightly multichain wallet with Canton support
|
|
426
|
+
* - SendAdapter: Send Canton Wallet (passkey / WebAuthn-PRF, beta) — also
|
|
427
|
+
* injects at `window.canton`; the adapter's kernel.id guard keeps it
|
|
428
|
+
* and Console-spec wallets from claiming each other's provider.
|
|
406
429
|
*
|
|
407
430
|
* Note: ConsoleAdapter defaults to 'combined' mode which supports both browser
|
|
408
431
|
* extension and mobile wallet connect (QR code / deep link). To restrict to
|
package/dist/index.d.ts
CHANGED
|
@@ -2,13 +2,14 @@ import * as _partylayer_core from '@partylayer/core';
|
|
|
2
2
|
import { WalletAdapter, NetworkId, StorageAdapter, CryptoAdapter, TelemetryAdapter, LoggerAdapter, WalletId, Session, SessionId, TransactionHash, TransactionStatus, WalletInfo, SignMessageParams, SignedMessage, SignTransactionParams, SignedTransaction, SubmitTransactionParams, TxReceipt, LedgerApiParams, LedgerApiResult } from '@partylayer/core';
|
|
3
3
|
export { AdapterConnectResult, AdapterContext, AdapterDetectResult, PartyLayerError as CantonConnectError, CapabilityKey, CapabilityNotSupportedError, ENABLEMENT_METRICS, ERROR_METRICS, ErrorCode, InternalError, LedgerApiParams, LedgerApiResult, METRICS, MetricName, MetricsPayload, NetworkId, OriginNotAllowedError, PartyId, PartyLayerError, REGISTRY_METRICS, RegistryFetchFailedError, RegistrySchemaInvalidError, RegistryVerificationFailedError, Session, SessionExpiredError, SessionId, SignMessageParams, SignTransactionParams, SignedMessage, SignedTransaction, SubmitTransactionParams, TimeoutError, TransactionStatus, TransportError, TxReceipt, UserRejectedError, WalletAdapter, WalletId, WalletInfo, WalletNotFoundError, WalletNotInstalledError, errorMetricName } from '@partylayer/core';
|
|
4
4
|
import { RegistryClient, RegistryStatus } from '@partylayer/registry-client';
|
|
5
|
-
export { RegistryStatus } from '@partylayer/registry-client';
|
|
5
|
+
export { Cip0103StatusForDetection, Cip0103Support, ProviderDetection, ProviderMatcher, RegistryStatus, deriveGenericWalletName, findMatchingWallet, findMatchingWalletInfo, isCip0103Native, matchesProviderDetection } from '@partylayer/registry-client';
|
|
6
6
|
export { CANTON_NETWORKS, CIP0103Account, CIP0103ConnectResult, CIP0103Event, CIP0103EventBus, CIP0103Method, CIP0103Network, CIP0103Provider, CIP0103StatusEvent, CIP0103TxChangedEvent, CIP0103TxStatus, CIP0103_EVENTS, CIP0103_MANDATORY_METHODS, CIP0103_METHODS, DiscoveredProvider, JSON_RPC_ERRORS, PartyLayerProvider, PartyLayerProviderOptions, ProviderRpcError, RPC_ERRORS, createProviderBridge, discoverInjectedProviders, fromCAIP2Network, isCIP0103Provider, isValidCAIP2, toCAIP2Network, waitForProvider } from '@partylayer/provider';
|
|
7
7
|
export { BronAdapter, BronAdapterConfig, BronApiConfig, BronAuthConfig } from '@partylayer/adapter-bron';
|
|
8
8
|
export { Cantor8Adapter } from '@partylayer/adapter-cantor8';
|
|
9
9
|
export { ConsoleAdapter } from '@partylayer/adapter-console';
|
|
10
10
|
export { LoopAdapter } from '@partylayer/adapter-loop';
|
|
11
11
|
export { NightlyAdapter } from '@partylayer/adapter-nightly';
|
|
12
|
+
export { SendAdapter } from '@partylayer/adapter-send';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Configuration types for PartyLayer SDK
|
|
@@ -276,6 +277,22 @@ declare class PartyLayerClient {
|
|
|
276
277
|
* In production, adapters would be auto-registered via registry.
|
|
277
278
|
*/
|
|
278
279
|
registerAdapter(adapter: WalletAdapter): void;
|
|
280
|
+
/**
|
|
281
|
+
* Look up a registered adapter by wallet id.
|
|
282
|
+
*
|
|
283
|
+
* Returns the adapter instance when one is registered for the given
|
|
284
|
+
* `walletId`, or `undefined` otherwise. Intended for UI integrations
|
|
285
|
+
* that need to call `adapter.detectInstalled()` directly to render a
|
|
286
|
+
* per-wallet readiness indicator (instead of duplicating
|
|
287
|
+
* transport-specific install detection logic in the picker). The
|
|
288
|
+
* returned adapter is the same instance used internally for connect /
|
|
289
|
+
* sign / submit flows; do not mutate it.
|
|
290
|
+
*
|
|
291
|
+
* Accepts both raw string ids and the branded `WalletId` form so
|
|
292
|
+
* consumers can pass `walletInfo.walletId` or a string literal
|
|
293
|
+
* interchangeably.
|
|
294
|
+
*/
|
|
295
|
+
getAdapter(walletId: string | WalletId): WalletAdapter | undefined;
|
|
279
296
|
/**
|
|
280
297
|
* List available wallets
|
|
281
298
|
*/
|
|
@@ -346,7 +363,10 @@ declare class PartyLayerClient {
|
|
|
346
363
|
*/
|
|
347
364
|
private persistSession;
|
|
348
365
|
/**
|
|
349
|
-
* Remove session from storage
|
|
366
|
+
* Remove session from storage.
|
|
367
|
+
*
|
|
368
|
+
* Accepts a sessionId for call-site symmetry, but since the SDK tracks one
|
|
369
|
+
* active session we always remove the single SESSION_STORAGE_KEY.
|
|
350
370
|
*/
|
|
351
371
|
private removeSession;
|
|
352
372
|
/**
|
|
@@ -403,6 +423,9 @@ declare function createPartyLayer(config: PartyLayerConfig): PartyLayerClient;
|
|
|
403
423
|
* - LoopAdapter: 5N Loop mobile/web wallet
|
|
404
424
|
* - Cantor8Adapter: Cantor8 wallet with deep link transport
|
|
405
425
|
* - NightlyAdapter: Nightly multichain wallet with Canton support
|
|
426
|
+
* - SendAdapter: Send Canton Wallet (passkey / WebAuthn-PRF, beta) — also
|
|
427
|
+
* injects at `window.canton`; the adapter's kernel.id guard keeps it
|
|
428
|
+
* and Console-spec wallets from claiming each other's provider.
|
|
406
429
|
*
|
|
407
430
|
* Note: ConsoleAdapter defaults to 'combined' mode which supports both browser
|
|
408
431
|
* extension and mobile wallet connect (QR code / deep link). To restrict to
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ var adapterConsole = require('@partylayer/adapter-console');
|
|
|
6
6
|
var adapterLoop = require('@partylayer/adapter-loop');
|
|
7
7
|
var adapterCantor8 = require('@partylayer/adapter-cantor8');
|
|
8
8
|
var adapterNightly = require('@partylayer/adapter-nightly');
|
|
9
|
+
var adapterSend = require('@partylayer/adapter-send');
|
|
9
10
|
var adapterBron = require('@partylayer/adapter-bron');
|
|
10
11
|
var provider = require('@partylayer/provider');
|
|
11
12
|
|
|
@@ -175,8 +176,10 @@ function getBuiltinAdapters() {
|
|
|
175
176
|
// 5N Loop - QR code / popup
|
|
176
177
|
new adapterCantor8.Cantor8Adapter(),
|
|
177
178
|
// Cantor8 - deep link transport
|
|
178
|
-
new adapterNightly.NightlyAdapter()
|
|
179
|
+
new adapterNightly.NightlyAdapter(),
|
|
179
180
|
// Nightly - multichain wallet (injected)
|
|
181
|
+
new adapterSend.SendAdapter()
|
|
182
|
+
// Send - passkey-based, kernel.id-guarded window.canton
|
|
180
183
|
];
|
|
181
184
|
}
|
|
182
185
|
var SDK_VERSION = "0.3.0";
|
|
@@ -363,6 +366,7 @@ function createTelemetryAdapter(config) {
|
|
|
363
366
|
}
|
|
364
367
|
return config;
|
|
365
368
|
}
|
|
369
|
+
var SESSION_STORAGE_KEY = "active_session";
|
|
366
370
|
var PartyLayerClient = class {
|
|
367
371
|
config;
|
|
368
372
|
adapters = /* @__PURE__ */ new Map();
|
|
@@ -422,7 +426,7 @@ var PartyLayerClient = class {
|
|
|
422
426
|
}
|
|
423
427
|
/**
|
|
424
428
|
* Register a wallet adapter
|
|
425
|
-
*
|
|
429
|
+
*
|
|
426
430
|
* @internal
|
|
427
431
|
* This is used internally by the SDK to register adapters.
|
|
428
432
|
* In production, adapters would be auto-registered via registry.
|
|
@@ -430,6 +434,24 @@ var PartyLayerClient = class {
|
|
|
430
434
|
registerAdapter(adapter) {
|
|
431
435
|
this.adapters.set(adapter.walletId, adapter);
|
|
432
436
|
}
|
|
437
|
+
/**
|
|
438
|
+
* Look up a registered adapter by wallet id.
|
|
439
|
+
*
|
|
440
|
+
* Returns the adapter instance when one is registered for the given
|
|
441
|
+
* `walletId`, or `undefined` otherwise. Intended for UI integrations
|
|
442
|
+
* that need to call `adapter.detectInstalled()` directly to render a
|
|
443
|
+
* per-wallet readiness indicator (instead of duplicating
|
|
444
|
+
* transport-specific install detection logic in the picker). The
|
|
445
|
+
* returned adapter is the same instance used internally for connect /
|
|
446
|
+
* sign / submit flows; do not mutate it.
|
|
447
|
+
*
|
|
448
|
+
* Accepts both raw string ids and the branded `WalletId` form so
|
|
449
|
+
* consumers can pass `walletInfo.walletId` or a string literal
|
|
450
|
+
* interchangeably.
|
|
451
|
+
*/
|
|
452
|
+
getAdapter(walletId) {
|
|
453
|
+
return this.adapters.get(walletId);
|
|
454
|
+
}
|
|
433
455
|
/**
|
|
434
456
|
* List available wallets
|
|
435
457
|
*/
|
|
@@ -847,17 +869,20 @@ var PartyLayerClient = class {
|
|
|
847
869
|
try {
|
|
848
870
|
const data = JSON.stringify(session);
|
|
849
871
|
const encrypted = await this.crypto.encrypt(data, this.origin);
|
|
850
|
-
await this.storage.set(
|
|
872
|
+
await this.storage.set(SESSION_STORAGE_KEY, encrypted);
|
|
851
873
|
} catch (err) {
|
|
852
874
|
this.logger.warn("Failed to persist session", err);
|
|
853
875
|
}
|
|
854
876
|
}
|
|
855
877
|
/**
|
|
856
|
-
* Remove session from storage
|
|
878
|
+
* Remove session from storage.
|
|
879
|
+
*
|
|
880
|
+
* Accepts a sessionId for call-site symmetry, but since the SDK tracks one
|
|
881
|
+
* active session we always remove the single SESSION_STORAGE_KEY.
|
|
857
882
|
*/
|
|
858
|
-
async removeSession(
|
|
883
|
+
async removeSession(_sessionId) {
|
|
859
884
|
try {
|
|
860
|
-
await this.storage.remove(
|
|
885
|
+
await this.storage.remove(SESSION_STORAGE_KEY);
|
|
861
886
|
} catch (err) {
|
|
862
887
|
this.logger.warn("Failed to remove session", err);
|
|
863
888
|
}
|
|
@@ -868,7 +893,7 @@ var PartyLayerClient = class {
|
|
|
868
893
|
async restoreSession() {
|
|
869
894
|
this.telemetry?.increment?.(core.METRICS.RESTORE_ATTEMPTS);
|
|
870
895
|
try {
|
|
871
|
-
const encrypted = await this.storage.get(
|
|
896
|
+
const encrypted = await this.storage.get(SESSION_STORAGE_KEY);
|
|
872
897
|
if (!encrypted) {
|
|
873
898
|
return null;
|
|
874
899
|
}
|
|
@@ -1051,6 +1076,26 @@ Object.defineProperty(exports, "errorMetricName", {
|
|
|
1051
1076
|
enumerable: true,
|
|
1052
1077
|
get: function () { return core.errorMetricName; }
|
|
1053
1078
|
});
|
|
1079
|
+
Object.defineProperty(exports, "deriveGenericWalletName", {
|
|
1080
|
+
enumerable: true,
|
|
1081
|
+
get: function () { return registryClient.deriveGenericWalletName; }
|
|
1082
|
+
});
|
|
1083
|
+
Object.defineProperty(exports, "findMatchingWallet", {
|
|
1084
|
+
enumerable: true,
|
|
1085
|
+
get: function () { return registryClient.findMatchingWallet; }
|
|
1086
|
+
});
|
|
1087
|
+
Object.defineProperty(exports, "findMatchingWalletInfo", {
|
|
1088
|
+
enumerable: true,
|
|
1089
|
+
get: function () { return registryClient.findMatchingWalletInfo; }
|
|
1090
|
+
});
|
|
1091
|
+
Object.defineProperty(exports, "isCip0103Native", {
|
|
1092
|
+
enumerable: true,
|
|
1093
|
+
get: function () { return registryClient.isCip0103Native; }
|
|
1094
|
+
});
|
|
1095
|
+
Object.defineProperty(exports, "matchesProviderDetection", {
|
|
1096
|
+
enumerable: true,
|
|
1097
|
+
get: function () { return registryClient.matchesProviderDetection; }
|
|
1098
|
+
});
|
|
1054
1099
|
Object.defineProperty(exports, "ConsoleAdapter", {
|
|
1055
1100
|
enumerable: true,
|
|
1056
1101
|
get: function () { return adapterConsole.ConsoleAdapter; }
|
|
@@ -1067,6 +1112,10 @@ Object.defineProperty(exports, "NightlyAdapter", {
|
|
|
1067
1112
|
enumerable: true,
|
|
1068
1113
|
get: function () { return adapterNightly.NightlyAdapter; }
|
|
1069
1114
|
});
|
|
1115
|
+
Object.defineProperty(exports, "SendAdapter", {
|
|
1116
|
+
enumerable: true,
|
|
1117
|
+
get: function () { return adapterSend.SendAdapter; }
|
|
1118
|
+
});
|
|
1070
1119
|
Object.defineProperty(exports, "BronAdapter", {
|
|
1071
1120
|
enumerable: true,
|
|
1072
1121
|
get: function () { return adapterBron.BronAdapter; }
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/adapters.ts","../src/builtin-adapters.ts","../src/metrics-telemetry.ts","../src/client.ts"],"names":["ConsoleAdapter","LoopAdapter","Cantor8Adapter","NightlyAdapter","hashForPrivacy","createMetricsPayload","RegistryClient","mapUnknownErrorToPartyLayerError","METRICS","WalletNotFoundError","OriginNotAllowedError","capabilityGuard","installGuard","toSessionId","CapabilityNotSupportedError","createProviderBridge","errorMetricName"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration types for PartyLayer SDK\n */\n\nimport type { NetworkId, WalletId, WalletAdapter } from '@partylayer/core';\nimport type {\n StorageAdapter,\n CryptoAdapter,\n TelemetryAdapter,\n LoggerAdapter,\n} from '@partylayer/core';\n\n/**\n * Default registry URL for PartyLayer\n * This points to the official registry endpoint.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://registry.partylayer.xyz';\n\n/**\n * Telemetry configuration for opt-in metrics collection\n * \n * @since 0.3.0\n */\nexport interface TelemetryConfig {\n /** \n * Enable telemetry collection\n * @default false\n */\n enabled: boolean;\n \n /** \n * Metrics backend endpoint URL\n * If not provided, metrics are collected but not sent\n */\n endpoint?: string;\n \n /**\n * Sampling rate (0.0 to 1.0)\n * @default 1.0 (100% of events)\n */\n sampleRate?: number;\n \n /**\n * Application identifier (will be hashed for privacy)\n * Used to calculate Monthly Active dApps (MAD)\n */\n appId?: string;\n \n /**\n * Include hashed origin in metrics\n * @default false\n */\n includeOrigin?: boolean;\n \n /**\n * Number of events to buffer before sending\n * @default 10\n */\n batchSize?: number;\n \n /**\n * Interval to flush metrics in milliseconds\n * @default 30000 (30 seconds)\n */\n flushIntervalMs?: number;\n \n /**\n * Network to include in metrics\n * If not provided, uses the SDK's configured network\n */\n network?: NetworkId;\n}\n\n/**\n * Adapter class type (for instantiation)\n */\nexport type AdapterClass = new () => WalletAdapter;\n\n/**\n * PartyLayer configuration\n */\nexport interface PartyLayerConfig {\n /** \n * Registry URL (optional)\n * @default 'https://registry.partylayer.xyz/v1/wallets.json'\n */\n registryUrl?: string;\n /** Registry channel */\n channel?: 'stable' | 'beta';\n /** Default network */\n network: NetworkId;\n /** \n * Wallet adapters to register (OPTIONAL)\n * \n * By default, ALL built-in adapters are automatically registered:\n * - ConsoleAdapter (Console Wallet - browser extension)\n * - LoopAdapter (5N Loop - QR code / popup)\n * - Cantor8Adapter (Cantor8 - deep link transport)\n * \n * Note: BronAdapter requires OAuth config and is NOT included by default.\n * \n * Only provide this if you want to customize which adapters to use.\n * \n * @example\n * ```typescript\n * // Default: all adapters (recommended)\n * const client = createPartyLayer({\n * network: 'devnet',\n * app: { name: 'My dApp' },\n * // adapters not specified = all built-in adapters (Console, Loop, Cantor8)\n * });\n * \n * // Custom: only specific adapters\n * import { ConsoleAdapter } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [new ConsoleAdapter()], // Only Console Wallet\n * // ...\n * });\n * \n * // With Bron (enterprise wallet with OAuth)\n * import { BronAdapter, getBuiltinAdapters } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({ auth: {...}, api: {...} }),\n * ],\n * // ...\n * });\n * ```\n */\n adapters?: (WalletAdapter | AdapterClass)[];\n /** Storage adapter (default: browser localStorage-based encrypted) */\n storage?: StorageAdapter;\n /** Crypto adapter (default: WebCrypto) */\n crypto?: CryptoAdapter;\n /** Registry public keys for signature verification (ed25519) */\n registryPublicKeys?: string[];\n /** \n * Telemetry configuration or adapter\n * \n * Can be either:\n * - TelemetryConfig object for built-in metrics collection\n * - TelemetryAdapter instance for custom telemetry\n * \n * @default undefined (telemetry disabled)\n * @since 0.3.0 - Added TelemetryConfig support\n */\n telemetry?: TelemetryAdapter | TelemetryConfig;\n /** Logger adapter (optional) */\n logger?: LoggerAdapter;\n /** Application metadata */\n app: {\n /** Application name */\n name: string;\n /** Origin (for origin binding checks, defaults to window.location.origin) */\n origin?: string;\n };\n}\n\n/**\n * Connect options\n */\nexport interface ConnectOptions {\n /** Specific wallet ID to connect to */\n walletId?: WalletId;\n /** Prefer installed wallets */\n preferInstalled?: boolean;\n /** Allow only specific wallets */\n allowWallets?: WalletId[];\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Timeout in milliseconds */\n timeoutMs?: number;\n}\n\n/**\n * Wallet filter options\n */\nexport interface WalletFilter {\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Include experimental wallets */\n includeExperimental?: boolean;\n}\n","/**\n * Default adapter implementations\n */\n\nimport type {\n StorageAdapter,\n CryptoAdapter,\n LoggerAdapter,\n TelemetryAdapter,\n} from '@partylayer/core';\n\n/**\n * Default logger (console-based)\n */\nexport class DefaultLogger implements LoggerAdapter {\n debug(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.info) {\n console.info(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n error(message: string, error?: unknown, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.error) {\n console.error(`[PartyLayer] ${message}`, error, ...args);\n }\n }\n}\n\n/**\n * Default crypto adapter (Web Crypto API)\n */\nexport class DefaultCrypto implements CryptoAdapter {\n private async getKey(origin: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API not available');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(origin);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return crypto.subtle.importKey(\n 'raw',\n hash.slice(0, 32),\n { name: 'AES-GCM' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n async encrypt(data: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback to base64\n return btoa(data);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n const encoded = encoder.encode(data);\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n encoded\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...combined));\n } catch {\n return btoa(data);\n }\n }\n\n async decrypt(encrypted: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n return atob(encrypted);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const combined = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n data\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return atob(encrypted);\n }\n }\n\n async generateKey(): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n return Math.random().toString(36).substring(2, 15);\n }\n\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Default storage adapter (localStorage-based)\n */\nexport class DefaultStorage implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = 'partylayer_') {\n this.prefix = prefix;\n }\n\n async get(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(`${this.prefix}${key}`);\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.setItem(`${this.prefix}${key}`, value);\n } catch {\n // Ignore storage errors\n }\n }\n\n async remove(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(`${this.prefix}${key}`);\n } catch {\n // Ignore storage errors\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keys.push(key);\n }\n }\n\n for (const key of keys) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Default telemetry adapter (no-op)\n */\nexport class DefaultTelemetry implements TelemetryAdapter {\n track(_event: string, _properties?: Record<string, unknown>): void {\n // No-op\n }\n\n error(_error: Error, _properties?: Record<string, unknown>): void {\n // No-op\n }\n}\n","/**\n * Built-in wallet adapters\n *\n * These adapters are automatically registered when creating a PartyLayer client.\n * dApp developers don't need to install or configure these separately.\n */\n\nimport type { WalletAdapter } from '@partylayer/core';\nimport { ConsoleAdapter } from '@partylayer/adapter-console';\nimport { LoopAdapter } from '@partylayer/adapter-loop';\nimport { Cantor8Adapter } from '@partylayer/adapter-cantor8';\nimport { NightlyAdapter } from '@partylayer/adapter-nightly';\n\n// Note: BronAdapter requires OAuth config and is not included by default.\n// Import it separately: import { BronAdapter } from '@partylayer/adapter-bron';\n\n/**\n * Get all built-in adapters\n *\n * This function returns instances of all supported wallet adapters.\n * Called automatically by createPartyLayer() unless custom adapters are provided.\n *\n * Included adapters:\n * - ConsoleAdapter: Console Wallet browser extension + mobile (combined mode)\n * - LoopAdapter: 5N Loop mobile/web wallet\n * - Cantor8Adapter: Cantor8 wallet with deep link transport\n * - NightlyAdapter: Nightly multichain wallet with Canton support\n *\n * Note: ConsoleAdapter defaults to 'combined' mode which supports both browser\n * extension and mobile wallet connect (QR code / deep link). To restrict to\n * extension-only, pass { target: 'local' } to the constructor.\n *\n * Note: BronAdapter is NOT included by default because it requires OAuth configuration.\n * To use Bron, install @partylayer/adapter-bron and register it manually.\n */\nexport function getBuiltinAdapters(): WalletAdapter[] {\n return [\n new ConsoleAdapter(), // Console Wallet - extension + mobile (combined)\n new LoopAdapter(), // 5N Loop - QR code / popup\n new Cantor8Adapter(), // Cantor8 - deep link transport\n new NightlyAdapter(), // Nightly - multichain wallet (injected)\n ];\n}\n\n/**\n * Built-in adapter classes (for advanced usage)\n */\nexport { ConsoleAdapter, LoopAdapter, Cantor8Adapter, NightlyAdapter };\n\n/**\n * Re-export Console adapter types for convenience\n */\nexport type { ConsoleAdapterConfig, ConsoleConnectionTarget } from '@partylayer/adapter-console';\n\n/**\n * Re-export BronAdapter for convenience (requires config)\n *\n * @example\n * ```typescript\n * import { BronAdapter } from '@partylayer/sdk';\n *\n * const client = createPartyLayer({\n * // ... config\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({\n * auth: { clientId: '...', redirectUri: '...', ... },\n * api: { baseUrl: '...', getAccessToken: async () => '...' },\n * }),\n * ],\n * });\n * ```\n */\nexport { BronAdapter } from '@partylayer/adapter-bron';\nexport type { BronAdapterConfig, BronAuthConfig, BronApiConfig } from '@partylayer/adapter-bron';\n","/**\n * Metrics Telemetry Adapter\n * \n * A privacy-safe telemetry adapter that collects metrics for\n * ecosystem health monitoring and usage reporting.\n * \n * Features:\n * - Opt-in by default (disabled unless explicitly enabled)\n * - Privacy-safe payloads (no PII, hashed identifiers)\n * - Batched sending to reduce network overhead\n * - Configurable sampling rate\n * - Automatic flush on interval or batch size\n * \n * @since 0.3.0\n */\n\nimport type { TelemetryAdapter } from '@partylayer/core';\nimport {\n createMetricsPayload,\n hashForPrivacy,\n} from '@partylayer/core';\nimport type { TelemetryConfig } from './config';\n\n/** SDK Version - should match package.json */\nconst SDK_VERSION = '0.3.0';\n\n/**\n * Internal metric event for buffering\n */\ninterface MetricEvent {\n type: 'increment' | 'gauge';\n metric: string;\n value: number;\n timestamp: number;\n}\n\n/**\n * Metrics Telemetry Adapter\n * \n * Implements TelemetryAdapter interface with metrics-specific functionality.\n */\nexport class MetricsTelemetryAdapter implements TelemetryAdapter {\n private config: TelemetryConfig;\n private metrics: Map<string, number> = new Map();\n private buffer: MetricEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private appIdHash: string | null = null;\n private originHash: string | null = null;\n private initialized = false;\n \n constructor(config: TelemetryConfig) {\n this.config = {\n enabled: config.enabled ?? false,\n endpoint: config.endpoint,\n sampleRate: config.sampleRate ?? 1.0,\n appId: config.appId,\n includeOrigin: config.includeOrigin ?? false,\n batchSize: config.batchSize ?? 10,\n flushIntervalMs: config.flushIntervalMs ?? 30000,\n network: config.network,\n };\n \n // Initialize async hashing\n this.initialize();\n }\n \n /**\n * Initialize async components (hashing)\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n \n if (this.config.appId) {\n this.appIdHash = await hashForPrivacy(this.config.appId);\n }\n \n if (this.config.includeOrigin && typeof window !== 'undefined') {\n this.originHash = await hashForPrivacy(window.location.origin);\n }\n \n // Start flush timer\n if (this.config.enabled && this.config.flushIntervalMs) {\n this.flushTimer = setInterval(() => {\n this.flush().catch(console.error);\n }, this.config.flushIntervalMs);\n }\n \n this.initialized = true;\n }\n \n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n \n /**\n * Track a named event (TelemetryAdapter interface)\n */\n track(event: string, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n // Convert event to increment - bypass the increment sampling since we already checked\n const current = this.metrics.get(`event_${event}`) ?? 0;\n this.metrics.set(`event_${event}`, current + 1);\n this.bufferEvent({ type: 'increment', metric: `event_${event}`, value: 1, timestamp: Date.now() });\n \n // Track any numeric properties as gauges\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'number') {\n this.gauge(`${event}_${key}`, value);\n }\n }\n }\n }\n \n /**\n * Track an error (TelemetryAdapter interface)\n */\n error(error: Error, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Extract error code if available\n const code = (error as { code?: string }).code ?? 'UNKNOWN';\n this.increment(`error_${code}`);\n \n // Track properties\n if (properties) {\n this.track('error', properties);\n }\n }\n \n /**\n * Increment a metric counter\n */\n increment(metric: string, value: number = 1): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n const current = this.metrics.get(metric) ?? 0;\n this.metrics.set(metric, current + value);\n \n this.bufferEvent({\n type: 'increment',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Set a gauge metric value\n */\n gauge(metric: string, value: number): void {\n if (!this.config.enabled) return;\n \n this.metrics.set(metric, value);\n \n this.bufferEvent({\n type: 'gauge',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Buffer an event for batched sending\n */\n private bufferEvent(event: MetricEvent): void {\n this.buffer.push(event);\n \n // Flush if batch size reached\n if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n this.flush().catch(console.error);\n }\n }\n \n /**\n * Flush buffered metrics to backend\n */\n async flush(): Promise<void> {\n if (!this.config.enabled) return;\n if (this.metrics.size === 0) return;\n if (!this.config.endpoint) {\n // No endpoint configured - just clear the buffer\n this.buffer = [];\n return;\n }\n \n // Wait for initialization\n if (!this.initialized) {\n await this.initialize();\n }\n \n try {\n const payload = createMetricsPayload({\n sdkVersion: SDK_VERSION,\n network: this.config.network ?? 'unknown',\n metrics: Object.fromEntries(this.metrics),\n appIdHash: this.appIdHash ?? undefined,\n originHash: this.originHash ?? undefined,\n });\n \n await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n \n // Clear buffer on success\n this.buffer = [];\n // Note: We don't clear metrics - they accumulate until next flush\n // This allows calculating rates (e.g., errors per session)\n } catch (error) {\n // Silent fail - don't break the app for telemetry failures\n console.debug('[PartyLayer Telemetry] Flush failed:', error);\n }\n }\n \n /**\n * Get current metrics snapshot (for testing/debugging)\n */\n getMetrics(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n \n /**\n * Reset all metrics (for testing)\n */\n reset(): void {\n this.metrics.clear();\n this.buffer = [];\n }\n \n /**\n * Destroy the adapter (cleanup timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n \n // Final flush\n this.flush().catch(console.error);\n }\n}\n\n/**\n * Check if a value is a TelemetryConfig object\n */\nexport function isTelemetryConfig(value: unknown): value is TelemetryConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'enabled' in value &&\n typeof (value as TelemetryConfig).enabled === 'boolean'\n );\n}\n\n/**\n * Create a TelemetryAdapter from config\n * \n * If config is already a TelemetryAdapter, returns it.\n * If config is a TelemetryConfig, creates a MetricsTelemetryAdapter.\n */\nexport function createTelemetryAdapter(\n config: TelemetryAdapter | TelemetryConfig | undefined\n): TelemetryAdapter | undefined {\n if (!config) return undefined;\n \n if (isTelemetryConfig(config)) {\n return new MetricsTelemetryAdapter(config);\n }\n \n return config;\n}\n","/**\n * PartyLayer Client - Public API Implementation\n * \n * This is the main public API for PartyLayer SDK.\n * All dApps should use this API exclusively.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\nimport type {\n WalletId,\n SessionId,\n CapabilityKey,\n WalletInfo,\n Session,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n WalletAdapter,\n AdapterContext,\n} from '@partylayer/core';\nimport {\n toSessionId,\n WalletNotFoundError,\n CapabilityNotSupportedError,\n mapUnknownErrorToPartyLayerError,\n capabilityGuard,\n installGuard,\n} from '@partylayer/core';\nimport { RegistryClient } from '@partylayer/registry-client';\nimport type { RegistryStatus } from '@partylayer/registry-client';\nimport {\n DEFAULT_REGISTRY_URL,\n type PartyLayerConfig,\n type ConnectOptions,\n type WalletFilter,\n} from './config';\nimport type {\n PartyLayerEvent,\n EventHandler,\n} from './events';\nimport {\n DefaultLogger,\n DefaultCrypto,\n DefaultStorage,\n DefaultTelemetry,\n} from './adapters';\nimport { getBuiltinAdapters } from './builtin-adapters';\nimport { createTelemetryAdapter } from './metrics-telemetry';\nimport { METRICS, errorMetricName } from '@partylayer/core';\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SubmitTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\n\n/**\n * PartyLayer Client\n * \n * Main client interface for dApps to interact with Canton wallets.\n */\nexport class PartyLayerClient {\n private config: PartyLayerConfig;\n private adapters = new Map<WalletId, WalletAdapter>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private activeSession: Session | null = null;\n public readonly registryClient: RegistryClient; // Expose for React hooks\n private logger: import('@partylayer/core').LoggerAdapter;\n private crypto: import('@partylayer/core').CryptoAdapter;\n private storage: import('@partylayer/core').StorageAdapter;\n private telemetry?: import('@partylayer/core').TelemetryAdapter;\n private origin: string;\n\n constructor(config: PartyLayerConfig) {\n this.config = config;\n\n // Determine origin\n if (config.app.origin) {\n this.origin = config.app.origin;\n } else if (typeof window !== 'undefined') {\n this.origin = window.location.origin;\n } else {\n this.origin = 'unknown';\n }\n\n // Initialize service adapters\n this.logger = config.logger || new DefaultLogger();\n this.crypto = config.crypto || new DefaultCrypto();\n this.storage = config.storage || new DefaultStorage();\n \n // Initialize telemetry - supports both TelemetryAdapter and TelemetryConfig\n const telemetryAdapter = createTelemetryAdapter(config.telemetry);\n this.telemetry = telemetryAdapter || new DefaultTelemetry();\n\n // Register wallet adapters\n // If no adapters provided, use all built-in adapters (Console, Loop, etc.)\n const adaptersToRegister = config.adapters ?? getBuiltinAdapters();\n \n for (const adapterOrClass of adaptersToRegister) {\n let adapter: import('@partylayer/core').WalletAdapter;\n \n // Check if it's a class (function) or instance (object)\n if (typeof adapterOrClass === 'function') {\n // It's a class - instantiate it\n adapter = new (adapterOrClass as new () => import('@partylayer/core').WalletAdapter)();\n } else {\n // It's already an instance\n adapter = adapterOrClass;\n }\n \n this.adapters.set(adapter.walletId, adapter);\n this.logger.debug('Registered wallet adapter', {\n walletId: adapter.walletId,\n name: adapter.name,\n capabilities: adapter.getCapabilities(),\n });\n }\n\n // Initialize registry client with signature verification\n this.registryClient = new RegistryClient({\n registryUrl: config.registryUrl || DEFAULT_REGISTRY_URL,\n channel: config.channel || 'stable',\n registryPublicKeys: config.registryPublicKeys,\n storage: this.storage,\n });\n\n // Emit initial registry status\n this.updateRegistryStatus();\n\n // Restore session on init\n this.restoreSession().catch((err) => {\n this.emit('error', {\n type: 'error',\n error: mapUnknownErrorToPartyLayerError(err, {\n phase: 'restore',\n }),\n });\n });\n }\n\n /**\n * Register a wallet adapter\n * \n * @internal\n * This is used internally by the SDK to register adapters.\n * In production, adapters would be auto-registered via registry.\n */\n registerAdapter(adapter: WalletAdapter): void {\n this.adapters.set(adapter.walletId, adapter);\n }\n\n /**\n * List available wallets\n */\n async listWallets(filter?: WalletFilter): Promise<WalletInfo[]> {\n let registryWallets: WalletInfo[];\n\n try {\n // getWallets() already returns WalletInfo[]\n registryWallets = await this.registryClient.getWallets();\n\n // Update registry status after successful fetch\n this.updateRegistryStatus();\n } catch (err) {\n // Update registry status even on error (may have fallback info)\n this.updateRegistryStatus();\n\n this.logger.warn('Registry fetch failed, using registered adapters only', {\n error: err instanceof Error ? err.message : String(err),\n });\n\n registryWallets = [];\n }\n\n // Merge: include registered adapters that are NOT in the registry\n // (e.g. NightlyAdapter is builtin but may not have a registry entry yet)\n const registryIds = new Set(registryWallets.map((w) => String(w.walletId)));\n for (const [, adapter] of this.adapters) {\n if (registryIds.has(String(adapter.walletId))) continue;\n\n registryWallets.push({\n walletId: adapter.walletId,\n name: adapter.name,\n website: '',\n icons: {},\n capabilities: adapter.getCapabilities(),\n adapter: { packageName: 'builtin', versionRange: '*' },\n docs: [],\n networks: [this.config.network || 'devnet'],\n channel: 'stable',\n } as WalletInfo);\n }\n\n // Filter by capabilities\n if (filter?.requiredCapabilities) {\n return registryWallets.filter((walletInfo) =>\n filter.requiredCapabilities!.every((cap) =>\n walletInfo.capabilities.includes(cap as CapabilityKey)\n )\n );\n }\n\n // Filter experimental\n if (!filter?.includeExperimental) {\n return registryWallets.filter((walletInfo) => walletInfo.channel === 'stable');\n }\n\n return registryWallets;\n }\n\n /**\n * Connect to a wallet\n */\n async connect(options?: ConnectOptions): Promise<Session> {\n // Track connect attempt\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_ATTEMPTS);\n \n try {\n // Get available wallets\n const wallets = await this.listWallets({\n requiredCapabilities: options?.requiredCapabilities,\n includeExperimental: true,\n });\n\n // Filter by allowWallets\n let availableWallets = wallets;\n if (options?.allowWallets) {\n availableWallets = wallets.filter((w) =>\n options.allowWallets!.includes(w.walletId)\n );\n }\n\n // Select wallet\n let selectedWallet: WalletInfo;\n let isNativeWallet = false;\n if (options?.walletId) {\n const found = availableWallets.find(\n (w) => w.walletId === options.walletId\n );\n if (found) {\n selectedWallet = found;\n } else {\n // Fallback: check if a native CIP-0103 adapter is registered\n const nativeAdapter = this.adapters.get(options.walletId);\n if (nativeAdapter) {\n isNativeWallet = true;\n selectedWallet = {\n walletId: options.walletId,\n name: nativeAdapter.name,\n website: '',\n icons: {},\n capabilities: nativeAdapter.getCapabilities(),\n adapter: { packageName: 'native-cip0103', versionRange: '*' },\n docs: [],\n networks: [this.config.network],\n channel: 'stable' as const,\n metadata: { source: 'native-cip0103' },\n };\n } else {\n throw new WalletNotFoundError(String(options.walletId));\n }\n }\n } else if (availableWallets.length === 0) {\n throw new WalletNotFoundError('No wallets available');\n } else {\n selectedWallet = availableWallets[0];\n }\n\n // Get adapter\n const adapter = this.adapters.get(selectedWallet.walletId);\n if (!adapter) {\n throw new WalletNotFoundError(String(selectedWallet.walletId));\n }\n\n // Check origin allowlist (skip for native CIP-0103 wallets and\n // adapter-merged wallets that aren't in the registry)\n if (!isNativeWallet) {\n try {\n const walletEntry = await this.registryClient.getWalletEntry(String(selectedWallet.walletId));\n if (walletEntry.originAllowlist && walletEntry.originAllowlist.length > 0) {\n if (!walletEntry.originAllowlist.includes(this.origin)) {\n const { OriginNotAllowedError } = await import('@partylayer/core');\n throw new OriginNotAllowedError(\n this.origin,\n walletEntry.originAllowlist\n );\n }\n }\n } catch (e) {\n // Wallet not in registry (adapter-merged) — skip origin check\n if (!(e instanceof WalletNotFoundError)) {\n throw e;\n }\n }\n }\n\n // Check capabilities\n if (options?.requiredCapabilities) {\n capabilityGuard(adapter, options.requiredCapabilities as CapabilityKey[]);\n }\n\n // Check installation\n await installGuard(adapter);\n\n // Create adapter context\n const ctx = this.createAdapterContext();\n\n // Connect\n // Default timeout: 2 minutes for QR code/popup based wallets\n const timeoutMs = options?.timeoutMs || 120000;\n const connectPromise = adapter.connect(ctx, {\n timeoutMs,\n partyId: undefined,\n preferInstalled: options?.preferInstalled,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeoutMs}ms - user did not complete wallet connection`));\n }, timeoutMs);\n });\n\n const result = await Promise.race([connectPromise, timeoutPromise]);\n\n // Create session\n const session: Session = {\n sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),\n walletId: selectedWallet.walletId,\n partyId: result.partyId,\n network: this.config.network,\n createdAt: Date.now(),\n expiresAt: result.session.expiresAt,\n origin: this.origin,\n capabilitiesSnapshot: result.capabilities,\n metadata: result.session.metadata as Record<string, string> | undefined,\n };\n\n // Persist session\n await this.persistSession(session);\n\n // Set active session\n this.activeSession = session;\n\n // Update registry status (may have changed during fetch)\n this.updateRegistryStatus();\n\n // Track successful connection\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n this.telemetry?.increment?.(METRICS.SESSIONS_CREATED);\n\n // Emit event\n this.emit('session:connected', {\n type: 'session:connected',\n session,\n });\n\n return session;\n } catch (err) {\n const timeoutMs = options?.timeoutMs || 30000;\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect',\n walletId: options?.walletId ? String(options.walletId) : undefined,\n timeoutMs,\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n if (!this.activeSession) {\n return;\n }\n\n try {\n const adapter = this.adapters.get(this.activeSession.walletId);\n if (adapter) {\n const ctx = this.createAdapterContext();\n await adapter.disconnect(ctx, this.activeSession);\n }\n\n const sessionId = this.activeSession.sessionId;\n await this.removeSession(sessionId);\n\n this.activeSession = null;\n\n this.emit('session:disconnected', {\n type: 'session:disconnected',\n sessionId,\n });\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect', // Use connect as default phase\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Get active session\n */\n async getActiveSession(): Promise<Session | null> {\n if (this.activeSession) {\n // Check expiration\n if (this.activeSession.expiresAt && Date.now() >= this.activeSession.expiresAt) {\n await this.disconnect();\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: this.activeSession.sessionId,\n });\n return null;\n }\n return this.activeSession;\n }\n\n // Try to restore from storage\n return this.restoreSession();\n }\n\n /**\n * Sign a message\n */\n async signMessage(params: SignMessageParams): Promise<SignedMessage> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signMessage) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signMessage'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.signMessage(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signMessage',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<SignedTransaction> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.signTransaction(ctx, session, params);\n \n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'pending',\n raw: result.signedTx,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Submit a transaction\n */\n async submitTransaction(params: SubmitTransactionParams): Promise<TxReceipt> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.submitTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'submitTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.submitTransaction(ctx, session, params);\n\n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'submitted',\n raw: result,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'submitTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Proxy a JSON Ledger API request through the active wallet adapter\n */\n async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.ledgerApi) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'ledgerApi'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.ledgerApi(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'ledgerApi',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Subscribe to events\n */\n on<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n this.off(event, handler);\n };\n }\n\n /**\n * Unsubscribe from events\n */\n off<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Get a CIP-0103 Provider backed by this client.\n *\n * This bridge routes all request() calls through the existing\n * PartyLayerClient methods and maps events to CIP-0103 format.\n *\n * The bridge implements the full CIP-0103 specification:\n * - All 10 mandatory methods including `ledgerApi` (when adapter supports it)\n * - Full transaction lifecycle: pending -> signed -> executed/failed\n * - All CIP-0103 events: statusChanged, accountsChanged, txChanged, connected\n *\n * **Note:** Async wallets (userUrl pattern) are not supported through the\n * bridge. For async wallet support, use `PartyLayerProvider` directly.\n *\n * @returns CIP-0103 compliant Provider\n */\n asProvider(): import('@partylayer/core').CIP0103Provider {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createProviderBridge } = require('@partylayer/provider') as typeof import('@partylayer/provider');\n return createProviderBridge(this);\n }\n\n /**\n * Destroy client and cleanup\n */\n destroy(): void {\n // Flush and destroy telemetry if it supports it\n if (this.telemetry && 'destroy' in this.telemetry && typeof this.telemetry.destroy === 'function') {\n (this.telemetry as { destroy: () => void }).destroy();\n } else if (this.telemetry?.flush) {\n this.telemetry.flush().catch(() => {});\n }\n \n this.eventHandlers.clear();\n this.activeSession = null;\n }\n\n /**\n * Create adapter context\n */\n private createAdapterContext(): AdapterContext {\n return {\n appName: this.config.app.name,\n origin: this.origin,\n network: this.config.network,\n logger: this.logger,\n telemetry: this.telemetry,\n registry: {\n getWallet: async (walletId: WalletId) => {\n return this.registryClient.getWallet(String(walletId));\n },\n },\n crypto: this.crypto,\n storage: this.storage,\n timeout: (ms: number) => {\n return new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms);\n });\n },\n };\n }\n\n\n /**\n * Persist session to storage\n */\n private async persistSession(session: Session): Promise<void> {\n try {\n const data = JSON.stringify(session);\n const encrypted = await this.crypto.encrypt(data, this.origin);\n await this.storage.set(`session_${session.sessionId}`, encrypted);\n } catch (err) {\n this.logger.warn('Failed to persist session', err);\n }\n }\n\n /**\n * Remove session from storage\n */\n private async removeSession(sessionId: SessionId): Promise<void> {\n try {\n await this.storage.remove(`session_${sessionId}`);\n } catch (err) {\n this.logger.warn('Failed to remove session', err);\n }\n }\n\n /**\n * Restore session from storage\n */\n private async restoreSession(): Promise<Session | null> {\n // Track restore attempt\n this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);\n \n try {\n const encrypted = await this.storage.get('active_session');\n if (!encrypted) {\n return null;\n }\n\n const decrypted = await this.crypto.decrypt(encrypted, this.origin);\n const session = JSON.parse(decrypted) as Session;\n\n // Check expiration\n if (session.expiresAt && Date.now() >= session.expiresAt) {\n await this.removeSession(session.sessionId);\n return null;\n }\n\n // Check origin\n if (session.origin !== this.origin) {\n return null;\n }\n\n // Try to restore with adapter\n const adapter = this.adapters.get(session.walletId);\n if (adapter?.restore) {\n const ctx = this.createAdapterContext();\n const restored = await adapter.restore(ctx, {\n ...session,\n encrypted,\n });\n\n if (restored) {\n this.activeSession = restored;\n // Persist restored session (may have updated metadata)\n await this.persistSession(restored);\n \n // Track successful restore\n this.telemetry?.increment?.(METRICS.SESSIONS_RESTORED);\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n \n // Emit session:connected event with reason=\"restore\"\n this.emit('session:connected', {\n type: 'session:connected',\n session: restored,\n });\n return restored;\n } else {\n // Restore failed - clear session\n await this.removeSession(session.sessionId);\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: session.sessionId,\n });\n return null;\n }\n }\n\n // If restore not supported, use stored session as-is\n // (Some adapters don't support restore but session metadata is still valid)\n this.activeSession = session;\n return session;\n } catch (err) {\n this.logger.warn('Failed to restore session', err);\n return null;\n }\n }\n\n /**\n * Update registry status and emit event\n */\n private updateRegistryStatus(): void {\n const status = this.registryClient.getStatus();\n if (status) {\n // Track registry metrics\n if (status.source === 'network') {\n this.telemetry?.increment?.(METRICS.REGISTRY_FETCH);\n } else if (status.source === 'cache') {\n this.telemetry?.increment?.(METRICS.REGISTRY_CACHE_HIT);\n }\n if (status.stale) {\n this.telemetry?.increment?.(METRICS.REGISTRY_STALE);\n }\n \n this.emit('registry:status', {\n type: 'registry:status',\n status: {\n source: status.source,\n verified: status.verified,\n channel: status.channel,\n sequence: status.sequence,\n stale: status.stale,\n fetchedAt: status.fetchedAt,\n etag: status.etag,\n error: status.error,\n },\n });\n }\n }\n\n /**\n * Get registry status\n */\n getRegistryStatus(): RegistryStatus | null {\n return this.registryClient.getStatus();\n }\n\n /**\n * Emit event to handlers\n */\n private emit<T extends PartyLayerEvent>(\n event: T['type'],\n payload: T\n ): void {\n // Track error metrics\n if (event === 'error' && 'error' in payload) {\n const error = payload.error as { code?: string };\n if (error.code) {\n this.telemetry?.increment?.(errorMetricName(error.code));\n }\n }\n \n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (err) {\n this.logger.error('Error in event handler', err);\n }\n }\n }\n }\n}\n\n/**\n * Create PartyLayer client\n * \n * This is the main entry point for dApps.\n * \n * @example\n * ```typescript\n * const client = createPartyLayer({\n * registryUrl: 'https://registry.partylayer.xyz',\n * channel: 'stable',\n * network: 'devnet',\n * app: { name: 'My dApp' }\n * });\n * \n * const session = await client.connect();\n * ```\n */\nexport function createPartyLayer(\n config: PartyLayerConfig\n): PartyLayerClient {\n return new PartyLayerClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/adapters.ts","../src/builtin-adapters.ts","../src/metrics-telemetry.ts","../src/client.ts"],"names":["ConsoleAdapter","LoopAdapter","Cantor8Adapter","NightlyAdapter","SendAdapter","hashForPrivacy","createMetricsPayload","RegistryClient","mapUnknownErrorToPartyLayerError","METRICS","WalletNotFoundError","OriginNotAllowedError","capabilityGuard","installGuard","toSessionId","CapabilityNotSupportedError","createProviderBridge","errorMetricName"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration types for PartyLayer SDK\n */\n\nimport type { NetworkId, WalletId, WalletAdapter } from '@partylayer/core';\nimport type {\n StorageAdapter,\n CryptoAdapter,\n TelemetryAdapter,\n LoggerAdapter,\n} from '@partylayer/core';\n\n/**\n * Default registry URL for PartyLayer\n * This points to the official registry endpoint.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://registry.partylayer.xyz';\n\n/**\n * Telemetry configuration for opt-in metrics collection\n * \n * @since 0.3.0\n */\nexport interface TelemetryConfig {\n /** \n * Enable telemetry collection\n * @default false\n */\n enabled: boolean;\n \n /** \n * Metrics backend endpoint URL\n * If not provided, metrics are collected but not sent\n */\n endpoint?: string;\n \n /**\n * Sampling rate (0.0 to 1.0)\n * @default 1.0 (100% of events)\n */\n sampleRate?: number;\n \n /**\n * Application identifier (will be hashed for privacy)\n * Used to calculate Monthly Active dApps (MAD)\n */\n appId?: string;\n \n /**\n * Include hashed origin in metrics\n * @default false\n */\n includeOrigin?: boolean;\n \n /**\n * Number of events to buffer before sending\n * @default 10\n */\n batchSize?: number;\n \n /**\n * Interval to flush metrics in milliseconds\n * @default 30000 (30 seconds)\n */\n flushIntervalMs?: number;\n \n /**\n * Network to include in metrics\n * If not provided, uses the SDK's configured network\n */\n network?: NetworkId;\n}\n\n/**\n * Adapter class type (for instantiation)\n */\nexport type AdapterClass = new () => WalletAdapter;\n\n/**\n * PartyLayer configuration\n */\nexport interface PartyLayerConfig {\n /** \n * Registry URL (optional)\n * @default 'https://registry.partylayer.xyz/v1/wallets.json'\n */\n registryUrl?: string;\n /** Registry channel */\n channel?: 'stable' | 'beta';\n /** Default network */\n network: NetworkId;\n /** \n * Wallet adapters to register (OPTIONAL)\n * \n * By default, ALL built-in adapters are automatically registered:\n * - ConsoleAdapter (Console Wallet - browser extension)\n * - LoopAdapter (5N Loop - QR code / popup)\n * - Cantor8Adapter (Cantor8 - deep link transport)\n * \n * Note: BronAdapter requires OAuth config and is NOT included by default.\n * \n * Only provide this if you want to customize which adapters to use.\n * \n * @example\n * ```typescript\n * // Default: all adapters (recommended)\n * const client = createPartyLayer({\n * network: 'devnet',\n * app: { name: 'My dApp' },\n * // adapters not specified = all built-in adapters (Console, Loop, Cantor8)\n * });\n * \n * // Custom: only specific adapters\n * import { ConsoleAdapter } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [new ConsoleAdapter()], // Only Console Wallet\n * // ...\n * });\n * \n * // With Bron (enterprise wallet with OAuth)\n * import { BronAdapter, getBuiltinAdapters } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({ auth: {...}, api: {...} }),\n * ],\n * // ...\n * });\n * ```\n */\n adapters?: (WalletAdapter | AdapterClass)[];\n /** Storage adapter (default: browser localStorage-based encrypted) */\n storage?: StorageAdapter;\n /** Crypto adapter (default: WebCrypto) */\n crypto?: CryptoAdapter;\n /** Registry public keys for signature verification (ed25519) */\n registryPublicKeys?: string[];\n /** \n * Telemetry configuration or adapter\n * \n * Can be either:\n * - TelemetryConfig object for built-in metrics collection\n * - TelemetryAdapter instance for custom telemetry\n * \n * @default undefined (telemetry disabled)\n * @since 0.3.0 - Added TelemetryConfig support\n */\n telemetry?: TelemetryAdapter | TelemetryConfig;\n /** Logger adapter (optional) */\n logger?: LoggerAdapter;\n /** Application metadata */\n app: {\n /** Application name */\n name: string;\n /** Origin (for origin binding checks, defaults to window.location.origin) */\n origin?: string;\n };\n}\n\n/**\n * Connect options\n */\nexport interface ConnectOptions {\n /** Specific wallet ID to connect to */\n walletId?: WalletId;\n /** Prefer installed wallets */\n preferInstalled?: boolean;\n /** Allow only specific wallets */\n allowWallets?: WalletId[];\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Timeout in milliseconds */\n timeoutMs?: number;\n}\n\n/**\n * Wallet filter options\n */\nexport interface WalletFilter {\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Include experimental wallets */\n includeExperimental?: boolean;\n}\n","/**\n * Default adapter implementations\n */\n\nimport type {\n StorageAdapter,\n CryptoAdapter,\n LoggerAdapter,\n TelemetryAdapter,\n} from '@partylayer/core';\n\n/**\n * Default logger (console-based)\n */\nexport class DefaultLogger implements LoggerAdapter {\n debug(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.info) {\n console.info(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n error(message: string, error?: unknown, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.error) {\n console.error(`[PartyLayer] ${message}`, error, ...args);\n }\n }\n}\n\n/**\n * Default crypto adapter (Web Crypto API)\n */\nexport class DefaultCrypto implements CryptoAdapter {\n private async getKey(origin: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API not available');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(origin);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return crypto.subtle.importKey(\n 'raw',\n hash.slice(0, 32),\n { name: 'AES-GCM' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n async encrypt(data: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback to base64\n return btoa(data);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n const encoded = encoder.encode(data);\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n encoded\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...combined));\n } catch {\n return btoa(data);\n }\n }\n\n async decrypt(encrypted: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n return atob(encrypted);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const combined = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n data\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return atob(encrypted);\n }\n }\n\n async generateKey(): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n return Math.random().toString(36).substring(2, 15);\n }\n\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Default storage adapter (localStorage-based)\n */\nexport class DefaultStorage implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = 'partylayer_') {\n this.prefix = prefix;\n }\n\n async get(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(`${this.prefix}${key}`);\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.setItem(`${this.prefix}${key}`, value);\n } catch {\n // Ignore storage errors\n }\n }\n\n async remove(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(`${this.prefix}${key}`);\n } catch {\n // Ignore storage errors\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keys.push(key);\n }\n }\n\n for (const key of keys) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Default telemetry adapter (no-op)\n */\nexport class DefaultTelemetry implements TelemetryAdapter {\n track(_event: string, _properties?: Record<string, unknown>): void {\n // No-op\n }\n\n error(_error: Error, _properties?: Record<string, unknown>): void {\n // No-op\n }\n}\n","/**\n * Built-in wallet adapters\n *\n * These adapters are automatically registered when creating a PartyLayer client.\n * dApp developers don't need to install or configure these separately.\n */\n\nimport type { WalletAdapter } from '@partylayer/core';\nimport { ConsoleAdapter } from '@partylayer/adapter-console';\nimport { LoopAdapter } from '@partylayer/adapter-loop';\nimport { Cantor8Adapter } from '@partylayer/adapter-cantor8';\nimport { NightlyAdapter } from '@partylayer/adapter-nightly';\nimport { SendAdapter } from '@partylayer/adapter-send';\n\n// Note: BronAdapter requires OAuth config and is not included by default.\n// Import it separately: import { BronAdapter } from '@partylayer/adapter-bron';\n\n/**\n * Get all built-in adapters\n *\n * This function returns instances of all supported wallet adapters.\n * Called automatically by createPartyLayer() unless custom adapters are provided.\n *\n * Included adapters:\n * - ConsoleAdapter: Console Wallet browser extension + mobile (combined mode)\n * - LoopAdapter: 5N Loop mobile/web wallet\n * - Cantor8Adapter: Cantor8 wallet with deep link transport\n * - NightlyAdapter: Nightly multichain wallet with Canton support\n * - SendAdapter: Send Canton Wallet (passkey / WebAuthn-PRF, beta) — also\n * injects at `window.canton`; the adapter's kernel.id guard keeps it\n * and Console-spec wallets from claiming each other's provider.\n *\n * Note: ConsoleAdapter defaults to 'combined' mode which supports both browser\n * extension and mobile wallet connect (QR code / deep link). To restrict to\n * extension-only, pass { target: 'local' } to the constructor.\n *\n * Note: BronAdapter is NOT included by default because it requires OAuth configuration.\n * To use Bron, install @partylayer/adapter-bron and register it manually.\n */\nexport function getBuiltinAdapters(): WalletAdapter[] {\n return [\n new ConsoleAdapter(), // Console Wallet - extension + mobile (combined)\n new LoopAdapter(), // 5N Loop - QR code / popup\n new Cantor8Adapter(), // Cantor8 - deep link transport\n new NightlyAdapter(), // Nightly - multichain wallet (injected)\n new SendAdapter(), // Send - passkey-based, kernel.id-guarded window.canton\n ];\n}\n\n/**\n * Built-in adapter classes (for advanced usage)\n */\nexport { ConsoleAdapter, LoopAdapter, Cantor8Adapter, NightlyAdapter, SendAdapter };\n\n/**\n * Re-export Console adapter types for convenience\n */\nexport type { ConsoleAdapterConfig, ConsoleConnectionTarget } from '@partylayer/adapter-console';\n\n/**\n * Re-export BronAdapter for convenience (requires config)\n *\n * @example\n * ```typescript\n * import { BronAdapter } from '@partylayer/sdk';\n *\n * const client = createPartyLayer({\n * // ... config\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({\n * auth: { clientId: '...', redirectUri: '...', ... },\n * api: { baseUrl: '...', getAccessToken: async () => '...' },\n * }),\n * ],\n * });\n * ```\n */\nexport { BronAdapter } from '@partylayer/adapter-bron';\nexport type { BronAdapterConfig, BronAuthConfig, BronApiConfig } from '@partylayer/adapter-bron';\n","/**\n * Metrics Telemetry Adapter\n * \n * A privacy-safe telemetry adapter that collects metrics for\n * ecosystem health monitoring and usage reporting.\n * \n * Features:\n * - Opt-in by default (disabled unless explicitly enabled)\n * - Privacy-safe payloads (no PII, hashed identifiers)\n * - Batched sending to reduce network overhead\n * - Configurable sampling rate\n * - Automatic flush on interval or batch size\n * \n * @since 0.3.0\n */\n\nimport type { TelemetryAdapter } from '@partylayer/core';\nimport {\n createMetricsPayload,\n hashForPrivacy,\n} from '@partylayer/core';\nimport type { TelemetryConfig } from './config';\n\n/** SDK Version - should match package.json */\nconst SDK_VERSION = '0.3.0';\n\n/**\n * Internal metric event for buffering\n */\ninterface MetricEvent {\n type: 'increment' | 'gauge';\n metric: string;\n value: number;\n timestamp: number;\n}\n\n/**\n * Metrics Telemetry Adapter\n * \n * Implements TelemetryAdapter interface with metrics-specific functionality.\n */\nexport class MetricsTelemetryAdapter implements TelemetryAdapter {\n private config: TelemetryConfig;\n private metrics: Map<string, number> = new Map();\n private buffer: MetricEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private appIdHash: string | null = null;\n private originHash: string | null = null;\n private initialized = false;\n \n constructor(config: TelemetryConfig) {\n this.config = {\n enabled: config.enabled ?? false,\n endpoint: config.endpoint,\n sampleRate: config.sampleRate ?? 1.0,\n appId: config.appId,\n includeOrigin: config.includeOrigin ?? false,\n batchSize: config.batchSize ?? 10,\n flushIntervalMs: config.flushIntervalMs ?? 30000,\n network: config.network,\n };\n \n // Initialize async hashing\n this.initialize();\n }\n \n /**\n * Initialize async components (hashing)\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n \n if (this.config.appId) {\n this.appIdHash = await hashForPrivacy(this.config.appId);\n }\n \n if (this.config.includeOrigin && typeof window !== 'undefined') {\n this.originHash = await hashForPrivacy(window.location.origin);\n }\n \n // Start flush timer\n if (this.config.enabled && this.config.flushIntervalMs) {\n this.flushTimer = setInterval(() => {\n this.flush().catch(console.error);\n }, this.config.flushIntervalMs);\n }\n \n this.initialized = true;\n }\n \n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n \n /**\n * Track a named event (TelemetryAdapter interface)\n */\n track(event: string, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n // Convert event to increment - bypass the increment sampling since we already checked\n const current = this.metrics.get(`event_${event}`) ?? 0;\n this.metrics.set(`event_${event}`, current + 1);\n this.bufferEvent({ type: 'increment', metric: `event_${event}`, value: 1, timestamp: Date.now() });\n \n // Track any numeric properties as gauges\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'number') {\n this.gauge(`${event}_${key}`, value);\n }\n }\n }\n }\n \n /**\n * Track an error (TelemetryAdapter interface)\n */\n error(error: Error, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Extract error code if available\n const code = (error as { code?: string }).code ?? 'UNKNOWN';\n this.increment(`error_${code}`);\n \n // Track properties\n if (properties) {\n this.track('error', properties);\n }\n }\n \n /**\n * Increment a metric counter\n */\n increment(metric: string, value: number = 1): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n const current = this.metrics.get(metric) ?? 0;\n this.metrics.set(metric, current + value);\n \n this.bufferEvent({\n type: 'increment',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Set a gauge metric value\n */\n gauge(metric: string, value: number): void {\n if (!this.config.enabled) return;\n \n this.metrics.set(metric, value);\n \n this.bufferEvent({\n type: 'gauge',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Buffer an event for batched sending\n */\n private bufferEvent(event: MetricEvent): void {\n this.buffer.push(event);\n \n // Flush if batch size reached\n if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n this.flush().catch(console.error);\n }\n }\n \n /**\n * Flush buffered metrics to backend\n */\n async flush(): Promise<void> {\n if (!this.config.enabled) return;\n if (this.metrics.size === 0) return;\n if (!this.config.endpoint) {\n // No endpoint configured - just clear the buffer\n this.buffer = [];\n return;\n }\n \n // Wait for initialization\n if (!this.initialized) {\n await this.initialize();\n }\n \n try {\n const payload = createMetricsPayload({\n sdkVersion: SDK_VERSION,\n network: this.config.network ?? 'unknown',\n metrics: Object.fromEntries(this.metrics),\n appIdHash: this.appIdHash ?? undefined,\n originHash: this.originHash ?? undefined,\n });\n \n await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n \n // Clear buffer on success\n this.buffer = [];\n // Note: We don't clear metrics - they accumulate until next flush\n // This allows calculating rates (e.g., errors per session)\n } catch (error) {\n // Silent fail - don't break the app for telemetry failures\n console.debug('[PartyLayer Telemetry] Flush failed:', error);\n }\n }\n \n /**\n * Get current metrics snapshot (for testing/debugging)\n */\n getMetrics(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n \n /**\n * Reset all metrics (for testing)\n */\n reset(): void {\n this.metrics.clear();\n this.buffer = [];\n }\n \n /**\n * Destroy the adapter (cleanup timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n \n // Final flush\n this.flush().catch(console.error);\n }\n}\n\n/**\n * Check if a value is a TelemetryConfig object\n */\nexport function isTelemetryConfig(value: unknown): value is TelemetryConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'enabled' in value &&\n typeof (value as TelemetryConfig).enabled === 'boolean'\n );\n}\n\n/**\n * Create a TelemetryAdapter from config\n * \n * If config is already a TelemetryAdapter, returns it.\n * If config is a TelemetryConfig, creates a MetricsTelemetryAdapter.\n */\nexport function createTelemetryAdapter(\n config: TelemetryAdapter | TelemetryConfig | undefined\n): TelemetryAdapter | undefined {\n if (!config) return undefined;\n \n if (isTelemetryConfig(config)) {\n return new MetricsTelemetryAdapter(config);\n }\n \n return config;\n}\n","/**\n * PartyLayer Client - Public API Implementation\n * \n * This is the main public API for PartyLayer SDK.\n * All dApps should use this API exclusively.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\nimport type {\n WalletId,\n SessionId,\n CapabilityKey,\n WalletInfo,\n Session,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n WalletAdapter,\n AdapterContext,\n} from '@partylayer/core';\nimport {\n toSessionId,\n WalletNotFoundError,\n CapabilityNotSupportedError,\n mapUnknownErrorToPartyLayerError,\n capabilityGuard,\n installGuard,\n} from '@partylayer/core';\nimport { RegistryClient } from '@partylayer/registry-client';\nimport type { RegistryStatus } from '@partylayer/registry-client';\nimport {\n DEFAULT_REGISTRY_URL,\n type PartyLayerConfig,\n type ConnectOptions,\n type WalletFilter,\n} from './config';\nimport type {\n PartyLayerEvent,\n EventHandler,\n} from './events';\nimport {\n DefaultLogger,\n DefaultCrypto,\n DefaultStorage,\n DefaultTelemetry,\n} from './adapters';\nimport { getBuiltinAdapters } from './builtin-adapters';\nimport { createTelemetryAdapter } from './metrics-telemetry';\nimport { METRICS, errorMetricName } from '@partylayer/core';\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SubmitTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\n\n/**\n * Storage key used for the active session.\n *\n * SDK tracks a single active session at a time, so persist/restore/remove\n * all target the same key. Prior to this fix, persist wrote to\n * `session_<sessionId>` while restore read from `active_session`, which\n * meant sessions never survived a page reload.\n */\nconst SESSION_STORAGE_KEY = 'active_session';\n\n/**\n * PartyLayer Client\n * \n * Main client interface for dApps to interact with Canton wallets.\n */\nexport class PartyLayerClient {\n private config: PartyLayerConfig;\n private adapters = new Map<WalletId, WalletAdapter>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private activeSession: Session | null = null;\n public readonly registryClient: RegistryClient; // Expose for React hooks\n private logger: import('@partylayer/core').LoggerAdapter;\n private crypto: import('@partylayer/core').CryptoAdapter;\n private storage: import('@partylayer/core').StorageAdapter;\n private telemetry?: import('@partylayer/core').TelemetryAdapter;\n private origin: string;\n\n constructor(config: PartyLayerConfig) {\n this.config = config;\n\n // Determine origin\n if (config.app.origin) {\n this.origin = config.app.origin;\n } else if (typeof window !== 'undefined') {\n this.origin = window.location.origin;\n } else {\n this.origin = 'unknown';\n }\n\n // Initialize service adapters\n this.logger = config.logger || new DefaultLogger();\n this.crypto = config.crypto || new DefaultCrypto();\n this.storage = config.storage || new DefaultStorage();\n \n // Initialize telemetry - supports both TelemetryAdapter and TelemetryConfig\n const telemetryAdapter = createTelemetryAdapter(config.telemetry);\n this.telemetry = telemetryAdapter || new DefaultTelemetry();\n\n // Register wallet adapters\n // If no adapters provided, use all built-in adapters (Console, Loop, etc.)\n const adaptersToRegister = config.adapters ?? getBuiltinAdapters();\n \n for (const adapterOrClass of adaptersToRegister) {\n let adapter: import('@partylayer/core').WalletAdapter;\n \n // Check if it's a class (function) or instance (object)\n if (typeof adapterOrClass === 'function') {\n // It's a class - instantiate it\n adapter = new (adapterOrClass as new () => import('@partylayer/core').WalletAdapter)();\n } else {\n // It's already an instance\n adapter = adapterOrClass;\n }\n \n this.adapters.set(adapter.walletId, adapter);\n this.logger.debug('Registered wallet adapter', {\n walletId: adapter.walletId,\n name: adapter.name,\n capabilities: adapter.getCapabilities(),\n });\n }\n\n // Initialize registry client with signature verification\n this.registryClient = new RegistryClient({\n registryUrl: config.registryUrl || DEFAULT_REGISTRY_URL,\n channel: config.channel || 'stable',\n registryPublicKeys: config.registryPublicKeys,\n storage: this.storage,\n });\n\n // Emit initial registry status\n this.updateRegistryStatus();\n\n // Restore session on init\n this.restoreSession().catch((err) => {\n this.emit('error', {\n type: 'error',\n error: mapUnknownErrorToPartyLayerError(err, {\n phase: 'restore',\n }),\n });\n });\n }\n\n /**\n * Register a wallet adapter\n *\n * @internal\n * This is used internally by the SDK to register adapters.\n * In production, adapters would be auto-registered via registry.\n */\n registerAdapter(adapter: WalletAdapter): void {\n this.adapters.set(adapter.walletId, adapter);\n }\n\n /**\n * Look up a registered adapter by wallet id.\n *\n * Returns the adapter instance when one is registered for the given\n * `walletId`, or `undefined` otherwise. Intended for UI integrations\n * that need to call `adapter.detectInstalled()` directly to render a\n * per-wallet readiness indicator (instead of duplicating\n * transport-specific install detection logic in the picker). The\n * returned adapter is the same instance used internally for connect /\n * sign / submit flows; do not mutate it.\n *\n * Accepts both raw string ids and the branded `WalletId` form so\n * consumers can pass `walletInfo.walletId` or a string literal\n * interchangeably.\n */\n getAdapter(walletId: string | WalletId): WalletAdapter | undefined {\n return this.adapters.get(walletId as WalletId);\n }\n\n /**\n * List available wallets\n */\n async listWallets(filter?: WalletFilter): Promise<WalletInfo[]> {\n let registryWallets: WalletInfo[];\n\n try {\n // getWallets() already returns WalletInfo[]\n registryWallets = await this.registryClient.getWallets();\n\n // Update registry status after successful fetch\n this.updateRegistryStatus();\n } catch (err) {\n // Update registry status even on error (may have fallback info)\n this.updateRegistryStatus();\n\n this.logger.warn('Registry fetch failed, using registered adapters only', {\n error: err instanceof Error ? err.message : String(err),\n });\n\n registryWallets = [];\n }\n\n // Merge: include registered adapters that are NOT in the registry\n // (e.g. NightlyAdapter is builtin but may not have a registry entry yet)\n const registryIds = new Set(registryWallets.map((w) => String(w.walletId)));\n for (const [, adapter] of this.adapters) {\n if (registryIds.has(String(adapter.walletId))) continue;\n\n registryWallets.push({\n walletId: adapter.walletId,\n name: adapter.name,\n website: '',\n icons: {},\n capabilities: adapter.getCapabilities(),\n adapter: { packageName: 'builtin', versionRange: '*' },\n docs: [],\n networks: [this.config.network || 'devnet'],\n channel: 'stable',\n } as WalletInfo);\n }\n\n // Filter by capabilities\n if (filter?.requiredCapabilities) {\n return registryWallets.filter((walletInfo) =>\n filter.requiredCapabilities!.every((cap) =>\n walletInfo.capabilities.includes(cap as CapabilityKey)\n )\n );\n }\n\n // Filter experimental\n if (!filter?.includeExperimental) {\n return registryWallets.filter((walletInfo) => walletInfo.channel === 'stable');\n }\n\n return registryWallets;\n }\n\n /**\n * Connect to a wallet\n */\n async connect(options?: ConnectOptions): Promise<Session> {\n // Track connect attempt\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_ATTEMPTS);\n \n try {\n // Get available wallets\n const wallets = await this.listWallets({\n requiredCapabilities: options?.requiredCapabilities,\n includeExperimental: true,\n });\n\n // Filter by allowWallets\n let availableWallets = wallets;\n if (options?.allowWallets) {\n availableWallets = wallets.filter((w) =>\n options.allowWallets!.includes(w.walletId)\n );\n }\n\n // Select wallet\n let selectedWallet: WalletInfo;\n let isNativeWallet = false;\n if (options?.walletId) {\n const found = availableWallets.find(\n (w) => w.walletId === options.walletId\n );\n if (found) {\n selectedWallet = found;\n } else {\n // Fallback: check if a native CIP-0103 adapter is registered\n const nativeAdapter = this.adapters.get(options.walletId);\n if (nativeAdapter) {\n isNativeWallet = true;\n selectedWallet = {\n walletId: options.walletId,\n name: nativeAdapter.name,\n website: '',\n icons: {},\n capabilities: nativeAdapter.getCapabilities(),\n adapter: { packageName: 'native-cip0103', versionRange: '*' },\n docs: [],\n networks: [this.config.network],\n channel: 'stable' as const,\n metadata: { source: 'native-cip0103' },\n };\n } else {\n throw new WalletNotFoundError(String(options.walletId));\n }\n }\n } else if (availableWallets.length === 0) {\n throw new WalletNotFoundError('No wallets available');\n } else {\n selectedWallet = availableWallets[0];\n }\n\n // Get adapter\n const adapter = this.adapters.get(selectedWallet.walletId);\n if (!adapter) {\n throw new WalletNotFoundError(String(selectedWallet.walletId));\n }\n\n // Check origin allowlist (skip for native CIP-0103 wallets and\n // adapter-merged wallets that aren't in the registry)\n if (!isNativeWallet) {\n try {\n const walletEntry = await this.registryClient.getWalletEntry(String(selectedWallet.walletId));\n if (walletEntry.originAllowlist && walletEntry.originAllowlist.length > 0) {\n if (!walletEntry.originAllowlist.includes(this.origin)) {\n const { OriginNotAllowedError } = await import('@partylayer/core');\n throw new OriginNotAllowedError(\n this.origin,\n walletEntry.originAllowlist\n );\n }\n }\n } catch (e) {\n // Wallet not in registry (adapter-merged) — skip origin check\n if (!(e instanceof WalletNotFoundError)) {\n throw e;\n }\n }\n }\n\n // Check capabilities\n if (options?.requiredCapabilities) {\n capabilityGuard(adapter, options.requiredCapabilities as CapabilityKey[]);\n }\n\n // Check installation\n await installGuard(adapter);\n\n // Create adapter context\n const ctx = this.createAdapterContext();\n\n // Connect\n // Default timeout: 2 minutes for QR code/popup based wallets\n const timeoutMs = options?.timeoutMs || 120000;\n const connectPromise = adapter.connect(ctx, {\n timeoutMs,\n partyId: undefined,\n preferInstalled: options?.preferInstalled,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeoutMs}ms - user did not complete wallet connection`));\n }, timeoutMs);\n });\n\n const result = await Promise.race([connectPromise, timeoutPromise]);\n\n // Create session\n const session: Session = {\n sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),\n walletId: selectedWallet.walletId,\n partyId: result.partyId,\n network: this.config.network,\n createdAt: Date.now(),\n expiresAt: result.session.expiresAt,\n origin: this.origin,\n capabilitiesSnapshot: result.capabilities,\n metadata: result.session.metadata as Record<string, string> | undefined,\n };\n\n // Persist session\n await this.persistSession(session);\n\n // Set active session\n this.activeSession = session;\n\n // Update registry status (may have changed during fetch)\n this.updateRegistryStatus();\n\n // Track successful connection\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n this.telemetry?.increment?.(METRICS.SESSIONS_CREATED);\n\n // Emit event\n this.emit('session:connected', {\n type: 'session:connected',\n session,\n });\n\n return session;\n } catch (err) {\n const timeoutMs = options?.timeoutMs || 30000;\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect',\n walletId: options?.walletId ? String(options.walletId) : undefined,\n timeoutMs,\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n if (!this.activeSession) {\n return;\n }\n\n try {\n const adapter = this.adapters.get(this.activeSession.walletId);\n if (adapter) {\n const ctx = this.createAdapterContext();\n await adapter.disconnect(ctx, this.activeSession);\n }\n\n const sessionId = this.activeSession.sessionId;\n await this.removeSession(sessionId);\n\n this.activeSession = null;\n\n this.emit('session:disconnected', {\n type: 'session:disconnected',\n sessionId,\n });\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect', // Use connect as default phase\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Get active session\n */\n async getActiveSession(): Promise<Session | null> {\n if (this.activeSession) {\n // Check expiration\n if (this.activeSession.expiresAt && Date.now() >= this.activeSession.expiresAt) {\n await this.disconnect();\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: this.activeSession.sessionId,\n });\n return null;\n }\n return this.activeSession;\n }\n\n // Try to restore from storage\n return this.restoreSession();\n }\n\n /**\n * Sign a message\n */\n async signMessage(params: SignMessageParams): Promise<SignedMessage> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signMessage) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signMessage'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.signMessage(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signMessage',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<SignedTransaction> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.signTransaction(ctx, session, params);\n \n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'pending',\n raw: result.signedTx,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Submit a transaction\n */\n async submitTransaction(params: SubmitTransactionParams): Promise<TxReceipt> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.submitTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'submitTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.submitTransaction(ctx, session, params);\n\n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'submitted',\n raw: result,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'submitTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Proxy a JSON Ledger API request through the active wallet adapter\n */\n async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.ledgerApi) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'ledgerApi'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.ledgerApi(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'ledgerApi',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Subscribe to events\n */\n on<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n this.off(event, handler);\n };\n }\n\n /**\n * Unsubscribe from events\n */\n off<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Get a CIP-0103 Provider backed by this client.\n *\n * This bridge routes all request() calls through the existing\n * PartyLayerClient methods and maps events to CIP-0103 format.\n *\n * The bridge implements the full CIP-0103 specification:\n * - All 10 mandatory methods including `ledgerApi` (when adapter supports it)\n * - Full transaction lifecycle: pending -> signed -> executed/failed\n * - All CIP-0103 events: statusChanged, accountsChanged, txChanged, connected\n *\n * **Note:** Async wallets (userUrl pattern) are not supported through the\n * bridge. For async wallet support, use `PartyLayerProvider` directly.\n *\n * @returns CIP-0103 compliant Provider\n */\n asProvider(): import('@partylayer/core').CIP0103Provider {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createProviderBridge } = require('@partylayer/provider') as typeof import('@partylayer/provider');\n return createProviderBridge(this);\n }\n\n /**\n * Destroy client and cleanup\n */\n destroy(): void {\n // Flush and destroy telemetry if it supports it\n if (this.telemetry && 'destroy' in this.telemetry && typeof this.telemetry.destroy === 'function') {\n (this.telemetry as { destroy: () => void }).destroy();\n } else if (this.telemetry?.flush) {\n this.telemetry.flush().catch(() => {});\n }\n \n this.eventHandlers.clear();\n this.activeSession = null;\n }\n\n /**\n * Create adapter context\n */\n private createAdapterContext(): AdapterContext {\n return {\n appName: this.config.app.name,\n origin: this.origin,\n network: this.config.network,\n logger: this.logger,\n telemetry: this.telemetry,\n registry: {\n getWallet: async (walletId: WalletId) => {\n return this.registryClient.getWallet(String(walletId));\n },\n },\n crypto: this.crypto,\n storage: this.storage,\n timeout: (ms: number) => {\n return new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms);\n });\n },\n };\n }\n\n\n /**\n * Persist session to storage\n */\n private async persistSession(session: Session): Promise<void> {\n try {\n const data = JSON.stringify(session);\n const encrypted = await this.crypto.encrypt(data, this.origin);\n await this.storage.set(SESSION_STORAGE_KEY, encrypted);\n } catch (err) {\n this.logger.warn('Failed to persist session', err);\n }\n }\n\n /**\n * Remove session from storage.\n *\n * Accepts a sessionId for call-site symmetry, but since the SDK tracks one\n * active session we always remove the single SESSION_STORAGE_KEY.\n */\n private async removeSession(_sessionId: SessionId): Promise<void> {\n try {\n await this.storage.remove(SESSION_STORAGE_KEY);\n } catch (err) {\n this.logger.warn('Failed to remove session', err);\n }\n }\n\n /**\n * Restore session from storage\n */\n private async restoreSession(): Promise<Session | null> {\n // Track restore attempt\n this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);\n\n try {\n const encrypted = await this.storage.get(SESSION_STORAGE_KEY);\n if (!encrypted) {\n return null;\n }\n\n const decrypted = await this.crypto.decrypt(encrypted, this.origin);\n const session = JSON.parse(decrypted) as Session;\n\n // Check expiration\n if (session.expiresAt && Date.now() >= session.expiresAt) {\n await this.removeSession(session.sessionId);\n return null;\n }\n\n // Check origin\n if (session.origin !== this.origin) {\n return null;\n }\n\n // Try to restore with adapter\n const adapter = this.adapters.get(session.walletId);\n if (adapter?.restore) {\n const ctx = this.createAdapterContext();\n const restored = await adapter.restore(ctx, {\n ...session,\n encrypted,\n });\n\n if (restored) {\n this.activeSession = restored;\n // Persist restored session (may have updated metadata)\n await this.persistSession(restored);\n \n // Track successful restore\n this.telemetry?.increment?.(METRICS.SESSIONS_RESTORED);\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n \n // Emit session:connected event with reason=\"restore\"\n this.emit('session:connected', {\n type: 'session:connected',\n session: restored,\n });\n return restored;\n } else {\n // Restore failed - clear session\n await this.removeSession(session.sessionId);\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: session.sessionId,\n });\n return null;\n }\n }\n\n // If restore not supported, use stored session as-is\n // (Some adapters don't support restore but session metadata is still valid)\n this.activeSession = session;\n return session;\n } catch (err) {\n this.logger.warn('Failed to restore session', err);\n return null;\n }\n }\n\n /**\n * Update registry status and emit event\n */\n private updateRegistryStatus(): void {\n const status = this.registryClient.getStatus();\n if (status) {\n // Track registry metrics\n if (status.source === 'network') {\n this.telemetry?.increment?.(METRICS.REGISTRY_FETCH);\n } else if (status.source === 'cache') {\n this.telemetry?.increment?.(METRICS.REGISTRY_CACHE_HIT);\n }\n if (status.stale) {\n this.telemetry?.increment?.(METRICS.REGISTRY_STALE);\n }\n \n this.emit('registry:status', {\n type: 'registry:status',\n status: {\n source: status.source,\n verified: status.verified,\n channel: status.channel,\n sequence: status.sequence,\n stale: status.stale,\n fetchedAt: status.fetchedAt,\n etag: status.etag,\n error: status.error,\n },\n });\n }\n }\n\n /**\n * Get registry status\n */\n getRegistryStatus(): RegistryStatus | null {\n return this.registryClient.getStatus();\n }\n\n /**\n * Emit event to handlers\n */\n private emit<T extends PartyLayerEvent>(\n event: T['type'],\n payload: T\n ): void {\n // Track error metrics\n if (event === 'error' && 'error' in payload) {\n const error = payload.error as { code?: string };\n if (error.code) {\n this.telemetry?.increment?.(errorMetricName(error.code));\n }\n }\n \n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (err) {\n this.logger.error('Error in event handler', err);\n }\n }\n }\n }\n}\n\n/**\n * Create PartyLayer client\n * \n * This is the main entry point for dApps.\n * \n * @example\n * ```typescript\n * const client = createPartyLayer({\n * registryUrl: 'https://registry.partylayer.xyz',\n * channel: 'stable',\n * network: 'devnet',\n * app: { name: 'My dApp' }\n * });\n * \n * const session = await client.connect();\n * ```\n */\nexport function createPartyLayer(\n config: PartyLayerConfig\n): PartyLayerClient {\n return new PartyLayerClient(config);\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { hashForPrivacy, createMetricsPayload, mapUnknownErrorToPartyLayerError, METRICS, WalletNotFoundError, capabilityGuard, installGuard, toSessionId, CapabilityNotSupportedError, errorMetricName } from '@partylayer/core';
|
|
2
2
|
export { PartyLayerError as CantonConnectError, CapabilityNotSupportedError, ENABLEMENT_METRICS, ERROR_METRICS, InternalError, METRICS, OriginNotAllowedError, PartyLayerError, REGISTRY_METRICS, RegistryFetchFailedError, RegistrySchemaInvalidError, RegistryVerificationFailedError, SessionExpiredError, TimeoutError, TransportError, UserRejectedError, WalletNotFoundError, WalletNotInstalledError, errorMetricName } from '@partylayer/core';
|
|
3
3
|
import { RegistryClient } from '@partylayer/registry-client';
|
|
4
|
+
export { deriveGenericWalletName, findMatchingWallet, findMatchingWalletInfo, isCip0103Native, matchesProviderDetection } from '@partylayer/registry-client';
|
|
4
5
|
import { ConsoleAdapter } from '@partylayer/adapter-console';
|
|
5
6
|
export { ConsoleAdapter } from '@partylayer/adapter-console';
|
|
6
7
|
import { LoopAdapter } from '@partylayer/adapter-loop';
|
|
@@ -9,6 +10,8 @@ import { Cantor8Adapter } from '@partylayer/adapter-cantor8';
|
|
|
9
10
|
export { Cantor8Adapter } from '@partylayer/adapter-cantor8';
|
|
10
11
|
import { NightlyAdapter } from '@partylayer/adapter-nightly';
|
|
11
12
|
export { NightlyAdapter } from '@partylayer/adapter-nightly';
|
|
13
|
+
import { SendAdapter } from '@partylayer/adapter-send';
|
|
14
|
+
export { SendAdapter } from '@partylayer/adapter-send';
|
|
12
15
|
export { BronAdapter } from '@partylayer/adapter-bron';
|
|
13
16
|
export { CANTON_NETWORKS, CIP0103EventBus, CIP0103_EVENTS, CIP0103_MANDATORY_METHODS, CIP0103_METHODS, JSON_RPC_ERRORS, PartyLayerProvider, ProviderRpcError, RPC_ERRORS, createProviderBridge, discoverInjectedProviders, fromCAIP2Network, isCIP0103Provider, isValidCAIP2, toCAIP2Network, waitForProvider } from '@partylayer/provider';
|
|
14
17
|
|
|
@@ -178,8 +181,10 @@ function getBuiltinAdapters() {
|
|
|
178
181
|
// 5N Loop - QR code / popup
|
|
179
182
|
new Cantor8Adapter(),
|
|
180
183
|
// Cantor8 - deep link transport
|
|
181
|
-
new NightlyAdapter()
|
|
184
|
+
new NightlyAdapter(),
|
|
182
185
|
// Nightly - multichain wallet (injected)
|
|
186
|
+
new SendAdapter()
|
|
187
|
+
// Send - passkey-based, kernel.id-guarded window.canton
|
|
183
188
|
];
|
|
184
189
|
}
|
|
185
190
|
var SDK_VERSION = "0.3.0";
|
|
@@ -366,6 +371,7 @@ function createTelemetryAdapter(config) {
|
|
|
366
371
|
}
|
|
367
372
|
return config;
|
|
368
373
|
}
|
|
374
|
+
var SESSION_STORAGE_KEY = "active_session";
|
|
369
375
|
var PartyLayerClient = class {
|
|
370
376
|
config;
|
|
371
377
|
adapters = /* @__PURE__ */ new Map();
|
|
@@ -425,7 +431,7 @@ var PartyLayerClient = class {
|
|
|
425
431
|
}
|
|
426
432
|
/**
|
|
427
433
|
* Register a wallet adapter
|
|
428
|
-
*
|
|
434
|
+
*
|
|
429
435
|
* @internal
|
|
430
436
|
* This is used internally by the SDK to register adapters.
|
|
431
437
|
* In production, adapters would be auto-registered via registry.
|
|
@@ -433,6 +439,24 @@ var PartyLayerClient = class {
|
|
|
433
439
|
registerAdapter(adapter) {
|
|
434
440
|
this.adapters.set(adapter.walletId, adapter);
|
|
435
441
|
}
|
|
442
|
+
/**
|
|
443
|
+
* Look up a registered adapter by wallet id.
|
|
444
|
+
*
|
|
445
|
+
* Returns the adapter instance when one is registered for the given
|
|
446
|
+
* `walletId`, or `undefined` otherwise. Intended for UI integrations
|
|
447
|
+
* that need to call `adapter.detectInstalled()` directly to render a
|
|
448
|
+
* per-wallet readiness indicator (instead of duplicating
|
|
449
|
+
* transport-specific install detection logic in the picker). The
|
|
450
|
+
* returned adapter is the same instance used internally for connect /
|
|
451
|
+
* sign / submit flows; do not mutate it.
|
|
452
|
+
*
|
|
453
|
+
* Accepts both raw string ids and the branded `WalletId` form so
|
|
454
|
+
* consumers can pass `walletInfo.walletId` or a string literal
|
|
455
|
+
* interchangeably.
|
|
456
|
+
*/
|
|
457
|
+
getAdapter(walletId) {
|
|
458
|
+
return this.adapters.get(walletId);
|
|
459
|
+
}
|
|
436
460
|
/**
|
|
437
461
|
* List available wallets
|
|
438
462
|
*/
|
|
@@ -850,17 +874,20 @@ var PartyLayerClient = class {
|
|
|
850
874
|
try {
|
|
851
875
|
const data = JSON.stringify(session);
|
|
852
876
|
const encrypted = await this.crypto.encrypt(data, this.origin);
|
|
853
|
-
await this.storage.set(
|
|
877
|
+
await this.storage.set(SESSION_STORAGE_KEY, encrypted);
|
|
854
878
|
} catch (err) {
|
|
855
879
|
this.logger.warn("Failed to persist session", err);
|
|
856
880
|
}
|
|
857
881
|
}
|
|
858
882
|
/**
|
|
859
|
-
* Remove session from storage
|
|
883
|
+
* Remove session from storage.
|
|
884
|
+
*
|
|
885
|
+
* Accepts a sessionId for call-site symmetry, but since the SDK tracks one
|
|
886
|
+
* active session we always remove the single SESSION_STORAGE_KEY.
|
|
860
887
|
*/
|
|
861
|
-
async removeSession(
|
|
888
|
+
async removeSession(_sessionId) {
|
|
862
889
|
try {
|
|
863
|
-
await this.storage.remove(
|
|
890
|
+
await this.storage.remove(SESSION_STORAGE_KEY);
|
|
864
891
|
} catch (err) {
|
|
865
892
|
this.logger.warn("Failed to remove session", err);
|
|
866
893
|
}
|
|
@@ -871,7 +898,7 @@ var PartyLayerClient = class {
|
|
|
871
898
|
async restoreSession() {
|
|
872
899
|
this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);
|
|
873
900
|
try {
|
|
874
|
-
const encrypted = await this.storage.get(
|
|
901
|
+
const encrypted = await this.storage.get(SESSION_STORAGE_KEY);
|
|
875
902
|
if (!encrypted) {
|
|
876
903
|
return null;
|
|
877
904
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/adapters.ts","../src/builtin-adapters.ts","../src/metrics-telemetry.ts","../src/client.ts"],"names":["OriginNotAllowedError","createProviderBridge"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Configuration types for PartyLayer SDK\n */\n\nimport type { NetworkId, WalletId, WalletAdapter } from '@partylayer/core';\nimport type {\n StorageAdapter,\n CryptoAdapter,\n TelemetryAdapter,\n LoggerAdapter,\n} from '@partylayer/core';\n\n/**\n * Default registry URL for PartyLayer\n * This points to the official registry endpoint.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://registry.partylayer.xyz';\n\n/**\n * Telemetry configuration for opt-in metrics collection\n * \n * @since 0.3.0\n */\nexport interface TelemetryConfig {\n /** \n * Enable telemetry collection\n * @default false\n */\n enabled: boolean;\n \n /** \n * Metrics backend endpoint URL\n * If not provided, metrics are collected but not sent\n */\n endpoint?: string;\n \n /**\n * Sampling rate (0.0 to 1.0)\n * @default 1.0 (100% of events)\n */\n sampleRate?: number;\n \n /**\n * Application identifier (will be hashed for privacy)\n * Used to calculate Monthly Active dApps (MAD)\n */\n appId?: string;\n \n /**\n * Include hashed origin in metrics\n * @default false\n */\n includeOrigin?: boolean;\n \n /**\n * Number of events to buffer before sending\n * @default 10\n */\n batchSize?: number;\n \n /**\n * Interval to flush metrics in milliseconds\n * @default 30000 (30 seconds)\n */\n flushIntervalMs?: number;\n \n /**\n * Network to include in metrics\n * If not provided, uses the SDK's configured network\n */\n network?: NetworkId;\n}\n\n/**\n * Adapter class type (for instantiation)\n */\nexport type AdapterClass = new () => WalletAdapter;\n\n/**\n * PartyLayer configuration\n */\nexport interface PartyLayerConfig {\n /** \n * Registry URL (optional)\n * @default 'https://registry.partylayer.xyz/v1/wallets.json'\n */\n registryUrl?: string;\n /** Registry channel */\n channel?: 'stable' | 'beta';\n /** Default network */\n network: NetworkId;\n /** \n * Wallet adapters to register (OPTIONAL)\n * \n * By default, ALL built-in adapters are automatically registered:\n * - ConsoleAdapter (Console Wallet - browser extension)\n * - LoopAdapter (5N Loop - QR code / popup)\n * - Cantor8Adapter (Cantor8 - deep link transport)\n * \n * Note: BronAdapter requires OAuth config and is NOT included by default.\n * \n * Only provide this if you want to customize which adapters to use.\n * \n * @example\n * ```typescript\n * // Default: all adapters (recommended)\n * const client = createPartyLayer({\n * network: 'devnet',\n * app: { name: 'My dApp' },\n * // adapters not specified = all built-in adapters (Console, Loop, Cantor8)\n * });\n * \n * // Custom: only specific adapters\n * import { ConsoleAdapter } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [new ConsoleAdapter()], // Only Console Wallet\n * // ...\n * });\n * \n * // With Bron (enterprise wallet with OAuth)\n * import { BronAdapter, getBuiltinAdapters } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({ auth: {...}, api: {...} }),\n * ],\n * // ...\n * });\n * ```\n */\n adapters?: (WalletAdapter | AdapterClass)[];\n /** Storage adapter (default: browser localStorage-based encrypted) */\n storage?: StorageAdapter;\n /** Crypto adapter (default: WebCrypto) */\n crypto?: CryptoAdapter;\n /** Registry public keys for signature verification (ed25519) */\n registryPublicKeys?: string[];\n /** \n * Telemetry configuration or adapter\n * \n * Can be either:\n * - TelemetryConfig object for built-in metrics collection\n * - TelemetryAdapter instance for custom telemetry\n * \n * @default undefined (telemetry disabled)\n * @since 0.3.0 - Added TelemetryConfig support\n */\n telemetry?: TelemetryAdapter | TelemetryConfig;\n /** Logger adapter (optional) */\n logger?: LoggerAdapter;\n /** Application metadata */\n app: {\n /** Application name */\n name: string;\n /** Origin (for origin binding checks, defaults to window.location.origin) */\n origin?: string;\n };\n}\n\n/**\n * Connect options\n */\nexport interface ConnectOptions {\n /** Specific wallet ID to connect to */\n walletId?: WalletId;\n /** Prefer installed wallets */\n preferInstalled?: boolean;\n /** Allow only specific wallets */\n allowWallets?: WalletId[];\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Timeout in milliseconds */\n timeoutMs?: number;\n}\n\n/**\n * Wallet filter options\n */\nexport interface WalletFilter {\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Include experimental wallets */\n includeExperimental?: boolean;\n}\n","/**\n * Default adapter implementations\n */\n\nimport type {\n StorageAdapter,\n CryptoAdapter,\n LoggerAdapter,\n TelemetryAdapter,\n} from '@partylayer/core';\n\n/**\n * Default logger (console-based)\n */\nexport class DefaultLogger implements LoggerAdapter {\n debug(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.info) {\n console.info(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n error(message: string, error?: unknown, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.error) {\n console.error(`[PartyLayer] ${message}`, error, ...args);\n }\n }\n}\n\n/**\n * Default crypto adapter (Web Crypto API)\n */\nexport class DefaultCrypto implements CryptoAdapter {\n private async getKey(origin: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API not available');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(origin);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return crypto.subtle.importKey(\n 'raw',\n hash.slice(0, 32),\n { name: 'AES-GCM' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n async encrypt(data: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback to base64\n return btoa(data);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n const encoded = encoder.encode(data);\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n encoded\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...combined));\n } catch {\n return btoa(data);\n }\n }\n\n async decrypt(encrypted: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n return atob(encrypted);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const combined = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n data\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return atob(encrypted);\n }\n }\n\n async generateKey(): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n return Math.random().toString(36).substring(2, 15);\n }\n\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Default storage adapter (localStorage-based)\n */\nexport class DefaultStorage implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = 'partylayer_') {\n this.prefix = prefix;\n }\n\n async get(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(`${this.prefix}${key}`);\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.setItem(`${this.prefix}${key}`, value);\n } catch {\n // Ignore storage errors\n }\n }\n\n async remove(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(`${this.prefix}${key}`);\n } catch {\n // Ignore storage errors\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keys.push(key);\n }\n }\n\n for (const key of keys) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Default telemetry adapter (no-op)\n */\nexport class DefaultTelemetry implements TelemetryAdapter {\n track(_event: string, _properties?: Record<string, unknown>): void {\n // No-op\n }\n\n error(_error: Error, _properties?: Record<string, unknown>): void {\n // No-op\n }\n}\n","/**\n * Built-in wallet adapters\n *\n * These adapters are automatically registered when creating a PartyLayer client.\n * dApp developers don't need to install or configure these separately.\n */\n\nimport type { WalletAdapter } from '@partylayer/core';\nimport { ConsoleAdapter } from '@partylayer/adapter-console';\nimport { LoopAdapter } from '@partylayer/adapter-loop';\nimport { Cantor8Adapter } from '@partylayer/adapter-cantor8';\nimport { NightlyAdapter } from '@partylayer/adapter-nightly';\n\n// Note: BronAdapter requires OAuth config and is not included by default.\n// Import it separately: import { BronAdapter } from '@partylayer/adapter-bron';\n\n/**\n * Get all built-in adapters\n *\n * This function returns instances of all supported wallet adapters.\n * Called automatically by createPartyLayer() unless custom adapters are provided.\n *\n * Included adapters:\n * - ConsoleAdapter: Console Wallet browser extension + mobile (combined mode)\n * - LoopAdapter: 5N Loop mobile/web wallet\n * - Cantor8Adapter: Cantor8 wallet with deep link transport\n * - NightlyAdapter: Nightly multichain wallet with Canton support\n *\n * Note: ConsoleAdapter defaults to 'combined' mode which supports both browser\n * extension and mobile wallet connect (QR code / deep link). To restrict to\n * extension-only, pass { target: 'local' } to the constructor.\n *\n * Note: BronAdapter is NOT included by default because it requires OAuth configuration.\n * To use Bron, install @partylayer/adapter-bron and register it manually.\n */\nexport function getBuiltinAdapters(): WalletAdapter[] {\n return [\n new ConsoleAdapter(), // Console Wallet - extension + mobile (combined)\n new LoopAdapter(), // 5N Loop - QR code / popup\n new Cantor8Adapter(), // Cantor8 - deep link transport\n new NightlyAdapter(), // Nightly - multichain wallet (injected)\n ];\n}\n\n/**\n * Built-in adapter classes (for advanced usage)\n */\nexport { ConsoleAdapter, LoopAdapter, Cantor8Adapter, NightlyAdapter };\n\n/**\n * Re-export Console adapter types for convenience\n */\nexport type { ConsoleAdapterConfig, ConsoleConnectionTarget } from '@partylayer/adapter-console';\n\n/**\n * Re-export BronAdapter for convenience (requires config)\n *\n * @example\n * ```typescript\n * import { BronAdapter } from '@partylayer/sdk';\n *\n * const client = createPartyLayer({\n * // ... config\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({\n * auth: { clientId: '...', redirectUri: '...', ... },\n * api: { baseUrl: '...', getAccessToken: async () => '...' },\n * }),\n * ],\n * });\n * ```\n */\nexport { BronAdapter } from '@partylayer/adapter-bron';\nexport type { BronAdapterConfig, BronAuthConfig, BronApiConfig } from '@partylayer/adapter-bron';\n","/**\n * Metrics Telemetry Adapter\n * \n * A privacy-safe telemetry adapter that collects metrics for\n * ecosystem health monitoring and usage reporting.\n * \n * Features:\n * - Opt-in by default (disabled unless explicitly enabled)\n * - Privacy-safe payloads (no PII, hashed identifiers)\n * - Batched sending to reduce network overhead\n * - Configurable sampling rate\n * - Automatic flush on interval or batch size\n * \n * @since 0.3.0\n */\n\nimport type { TelemetryAdapter } from '@partylayer/core';\nimport {\n createMetricsPayload,\n hashForPrivacy,\n} from '@partylayer/core';\nimport type { TelemetryConfig } from './config';\n\n/** SDK Version - should match package.json */\nconst SDK_VERSION = '0.3.0';\n\n/**\n * Internal metric event for buffering\n */\ninterface MetricEvent {\n type: 'increment' | 'gauge';\n metric: string;\n value: number;\n timestamp: number;\n}\n\n/**\n * Metrics Telemetry Adapter\n * \n * Implements TelemetryAdapter interface with metrics-specific functionality.\n */\nexport class MetricsTelemetryAdapter implements TelemetryAdapter {\n private config: TelemetryConfig;\n private metrics: Map<string, number> = new Map();\n private buffer: MetricEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private appIdHash: string | null = null;\n private originHash: string | null = null;\n private initialized = false;\n \n constructor(config: TelemetryConfig) {\n this.config = {\n enabled: config.enabled ?? false,\n endpoint: config.endpoint,\n sampleRate: config.sampleRate ?? 1.0,\n appId: config.appId,\n includeOrigin: config.includeOrigin ?? false,\n batchSize: config.batchSize ?? 10,\n flushIntervalMs: config.flushIntervalMs ?? 30000,\n network: config.network,\n };\n \n // Initialize async hashing\n this.initialize();\n }\n \n /**\n * Initialize async components (hashing)\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n \n if (this.config.appId) {\n this.appIdHash = await hashForPrivacy(this.config.appId);\n }\n \n if (this.config.includeOrigin && typeof window !== 'undefined') {\n this.originHash = await hashForPrivacy(window.location.origin);\n }\n \n // Start flush timer\n if (this.config.enabled && this.config.flushIntervalMs) {\n this.flushTimer = setInterval(() => {\n this.flush().catch(console.error);\n }, this.config.flushIntervalMs);\n }\n \n this.initialized = true;\n }\n \n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n \n /**\n * Track a named event (TelemetryAdapter interface)\n */\n track(event: string, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n // Convert event to increment - bypass the increment sampling since we already checked\n const current = this.metrics.get(`event_${event}`) ?? 0;\n this.metrics.set(`event_${event}`, current + 1);\n this.bufferEvent({ type: 'increment', metric: `event_${event}`, value: 1, timestamp: Date.now() });\n \n // Track any numeric properties as gauges\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'number') {\n this.gauge(`${event}_${key}`, value);\n }\n }\n }\n }\n \n /**\n * Track an error (TelemetryAdapter interface)\n */\n error(error: Error, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Extract error code if available\n const code = (error as { code?: string }).code ?? 'UNKNOWN';\n this.increment(`error_${code}`);\n \n // Track properties\n if (properties) {\n this.track('error', properties);\n }\n }\n \n /**\n * Increment a metric counter\n */\n increment(metric: string, value: number = 1): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n const current = this.metrics.get(metric) ?? 0;\n this.metrics.set(metric, current + value);\n \n this.bufferEvent({\n type: 'increment',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Set a gauge metric value\n */\n gauge(metric: string, value: number): void {\n if (!this.config.enabled) return;\n \n this.metrics.set(metric, value);\n \n this.bufferEvent({\n type: 'gauge',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Buffer an event for batched sending\n */\n private bufferEvent(event: MetricEvent): void {\n this.buffer.push(event);\n \n // Flush if batch size reached\n if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n this.flush().catch(console.error);\n }\n }\n \n /**\n * Flush buffered metrics to backend\n */\n async flush(): Promise<void> {\n if (!this.config.enabled) return;\n if (this.metrics.size === 0) return;\n if (!this.config.endpoint) {\n // No endpoint configured - just clear the buffer\n this.buffer = [];\n return;\n }\n \n // Wait for initialization\n if (!this.initialized) {\n await this.initialize();\n }\n \n try {\n const payload = createMetricsPayload({\n sdkVersion: SDK_VERSION,\n network: this.config.network ?? 'unknown',\n metrics: Object.fromEntries(this.metrics),\n appIdHash: this.appIdHash ?? undefined,\n originHash: this.originHash ?? undefined,\n });\n \n await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n \n // Clear buffer on success\n this.buffer = [];\n // Note: We don't clear metrics - they accumulate until next flush\n // This allows calculating rates (e.g., errors per session)\n } catch (error) {\n // Silent fail - don't break the app for telemetry failures\n console.debug('[PartyLayer Telemetry] Flush failed:', error);\n }\n }\n \n /**\n * Get current metrics snapshot (for testing/debugging)\n */\n getMetrics(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n \n /**\n * Reset all metrics (for testing)\n */\n reset(): void {\n this.metrics.clear();\n this.buffer = [];\n }\n \n /**\n * Destroy the adapter (cleanup timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n \n // Final flush\n this.flush().catch(console.error);\n }\n}\n\n/**\n * Check if a value is a TelemetryConfig object\n */\nexport function isTelemetryConfig(value: unknown): value is TelemetryConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'enabled' in value &&\n typeof (value as TelemetryConfig).enabled === 'boolean'\n );\n}\n\n/**\n * Create a TelemetryAdapter from config\n * \n * If config is already a TelemetryAdapter, returns it.\n * If config is a TelemetryConfig, creates a MetricsTelemetryAdapter.\n */\nexport function createTelemetryAdapter(\n config: TelemetryAdapter | TelemetryConfig | undefined\n): TelemetryAdapter | undefined {\n if (!config) return undefined;\n \n if (isTelemetryConfig(config)) {\n return new MetricsTelemetryAdapter(config);\n }\n \n return config;\n}\n","/**\n * PartyLayer Client - Public API Implementation\n * \n * This is the main public API for PartyLayer SDK.\n * All dApps should use this API exclusively.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\nimport type {\n WalletId,\n SessionId,\n CapabilityKey,\n WalletInfo,\n Session,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n WalletAdapter,\n AdapterContext,\n} from '@partylayer/core';\nimport {\n toSessionId,\n WalletNotFoundError,\n CapabilityNotSupportedError,\n mapUnknownErrorToPartyLayerError,\n capabilityGuard,\n installGuard,\n} from '@partylayer/core';\nimport { RegistryClient } from '@partylayer/registry-client';\nimport type { RegistryStatus } from '@partylayer/registry-client';\nimport {\n DEFAULT_REGISTRY_URL,\n type PartyLayerConfig,\n type ConnectOptions,\n type WalletFilter,\n} from './config';\nimport type {\n PartyLayerEvent,\n EventHandler,\n} from './events';\nimport {\n DefaultLogger,\n DefaultCrypto,\n DefaultStorage,\n DefaultTelemetry,\n} from './adapters';\nimport { getBuiltinAdapters } from './builtin-adapters';\nimport { createTelemetryAdapter } from './metrics-telemetry';\nimport { METRICS, errorMetricName } from '@partylayer/core';\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SubmitTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\n\n/**\n * PartyLayer Client\n * \n * Main client interface for dApps to interact with Canton wallets.\n */\nexport class PartyLayerClient {\n private config: PartyLayerConfig;\n private adapters = new Map<WalletId, WalletAdapter>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private activeSession: Session | null = null;\n public readonly registryClient: RegistryClient; // Expose for React hooks\n private logger: import('@partylayer/core').LoggerAdapter;\n private crypto: import('@partylayer/core').CryptoAdapter;\n private storage: import('@partylayer/core').StorageAdapter;\n private telemetry?: import('@partylayer/core').TelemetryAdapter;\n private origin: string;\n\n constructor(config: PartyLayerConfig) {\n this.config = config;\n\n // Determine origin\n if (config.app.origin) {\n this.origin = config.app.origin;\n } else if (typeof window !== 'undefined') {\n this.origin = window.location.origin;\n } else {\n this.origin = 'unknown';\n }\n\n // Initialize service adapters\n this.logger = config.logger || new DefaultLogger();\n this.crypto = config.crypto || new DefaultCrypto();\n this.storage = config.storage || new DefaultStorage();\n \n // Initialize telemetry - supports both TelemetryAdapter and TelemetryConfig\n const telemetryAdapter = createTelemetryAdapter(config.telemetry);\n this.telemetry = telemetryAdapter || new DefaultTelemetry();\n\n // Register wallet adapters\n // If no adapters provided, use all built-in adapters (Console, Loop, etc.)\n const adaptersToRegister = config.adapters ?? getBuiltinAdapters();\n \n for (const adapterOrClass of adaptersToRegister) {\n let adapter: import('@partylayer/core').WalletAdapter;\n \n // Check if it's a class (function) or instance (object)\n if (typeof adapterOrClass === 'function') {\n // It's a class - instantiate it\n adapter = new (adapterOrClass as new () => import('@partylayer/core').WalletAdapter)();\n } else {\n // It's already an instance\n adapter = adapterOrClass;\n }\n \n this.adapters.set(adapter.walletId, adapter);\n this.logger.debug('Registered wallet adapter', {\n walletId: adapter.walletId,\n name: adapter.name,\n capabilities: adapter.getCapabilities(),\n });\n }\n\n // Initialize registry client with signature verification\n this.registryClient = new RegistryClient({\n registryUrl: config.registryUrl || DEFAULT_REGISTRY_URL,\n channel: config.channel || 'stable',\n registryPublicKeys: config.registryPublicKeys,\n storage: this.storage,\n });\n\n // Emit initial registry status\n this.updateRegistryStatus();\n\n // Restore session on init\n this.restoreSession().catch((err) => {\n this.emit('error', {\n type: 'error',\n error: mapUnknownErrorToPartyLayerError(err, {\n phase: 'restore',\n }),\n });\n });\n }\n\n /**\n * Register a wallet adapter\n * \n * @internal\n * This is used internally by the SDK to register adapters.\n * In production, adapters would be auto-registered via registry.\n */\n registerAdapter(adapter: WalletAdapter): void {\n this.adapters.set(adapter.walletId, adapter);\n }\n\n /**\n * List available wallets\n */\n async listWallets(filter?: WalletFilter): Promise<WalletInfo[]> {\n let registryWallets: WalletInfo[];\n\n try {\n // getWallets() already returns WalletInfo[]\n registryWallets = await this.registryClient.getWallets();\n\n // Update registry status after successful fetch\n this.updateRegistryStatus();\n } catch (err) {\n // Update registry status even on error (may have fallback info)\n this.updateRegistryStatus();\n\n this.logger.warn('Registry fetch failed, using registered adapters only', {\n error: err instanceof Error ? err.message : String(err),\n });\n\n registryWallets = [];\n }\n\n // Merge: include registered adapters that are NOT in the registry\n // (e.g. NightlyAdapter is builtin but may not have a registry entry yet)\n const registryIds = new Set(registryWallets.map((w) => String(w.walletId)));\n for (const [, adapter] of this.adapters) {\n if (registryIds.has(String(adapter.walletId))) continue;\n\n registryWallets.push({\n walletId: adapter.walletId,\n name: adapter.name,\n website: '',\n icons: {},\n capabilities: adapter.getCapabilities(),\n adapter: { packageName: 'builtin', versionRange: '*' },\n docs: [],\n networks: [this.config.network || 'devnet'],\n channel: 'stable',\n } as WalletInfo);\n }\n\n // Filter by capabilities\n if (filter?.requiredCapabilities) {\n return registryWallets.filter((walletInfo) =>\n filter.requiredCapabilities!.every((cap) =>\n walletInfo.capabilities.includes(cap as CapabilityKey)\n )\n );\n }\n\n // Filter experimental\n if (!filter?.includeExperimental) {\n return registryWallets.filter((walletInfo) => walletInfo.channel === 'stable');\n }\n\n return registryWallets;\n }\n\n /**\n * Connect to a wallet\n */\n async connect(options?: ConnectOptions): Promise<Session> {\n // Track connect attempt\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_ATTEMPTS);\n \n try {\n // Get available wallets\n const wallets = await this.listWallets({\n requiredCapabilities: options?.requiredCapabilities,\n includeExperimental: true,\n });\n\n // Filter by allowWallets\n let availableWallets = wallets;\n if (options?.allowWallets) {\n availableWallets = wallets.filter((w) =>\n options.allowWallets!.includes(w.walletId)\n );\n }\n\n // Select wallet\n let selectedWallet: WalletInfo;\n let isNativeWallet = false;\n if (options?.walletId) {\n const found = availableWallets.find(\n (w) => w.walletId === options.walletId\n );\n if (found) {\n selectedWallet = found;\n } else {\n // Fallback: check if a native CIP-0103 adapter is registered\n const nativeAdapter = this.adapters.get(options.walletId);\n if (nativeAdapter) {\n isNativeWallet = true;\n selectedWallet = {\n walletId: options.walletId,\n name: nativeAdapter.name,\n website: '',\n icons: {},\n capabilities: nativeAdapter.getCapabilities(),\n adapter: { packageName: 'native-cip0103', versionRange: '*' },\n docs: [],\n networks: [this.config.network],\n channel: 'stable' as const,\n metadata: { source: 'native-cip0103' },\n };\n } else {\n throw new WalletNotFoundError(String(options.walletId));\n }\n }\n } else if (availableWallets.length === 0) {\n throw new WalletNotFoundError('No wallets available');\n } else {\n selectedWallet = availableWallets[0];\n }\n\n // Get adapter\n const adapter = this.adapters.get(selectedWallet.walletId);\n if (!adapter) {\n throw new WalletNotFoundError(String(selectedWallet.walletId));\n }\n\n // Check origin allowlist (skip for native CIP-0103 wallets and\n // adapter-merged wallets that aren't in the registry)\n if (!isNativeWallet) {\n try {\n const walletEntry = await this.registryClient.getWalletEntry(String(selectedWallet.walletId));\n if (walletEntry.originAllowlist && walletEntry.originAllowlist.length > 0) {\n if (!walletEntry.originAllowlist.includes(this.origin)) {\n const { OriginNotAllowedError } = await import('@partylayer/core');\n throw new OriginNotAllowedError(\n this.origin,\n walletEntry.originAllowlist\n );\n }\n }\n } catch (e) {\n // Wallet not in registry (adapter-merged) — skip origin check\n if (!(e instanceof WalletNotFoundError)) {\n throw e;\n }\n }\n }\n\n // Check capabilities\n if (options?.requiredCapabilities) {\n capabilityGuard(adapter, options.requiredCapabilities as CapabilityKey[]);\n }\n\n // Check installation\n await installGuard(adapter);\n\n // Create adapter context\n const ctx = this.createAdapterContext();\n\n // Connect\n // Default timeout: 2 minutes for QR code/popup based wallets\n const timeoutMs = options?.timeoutMs || 120000;\n const connectPromise = adapter.connect(ctx, {\n timeoutMs,\n partyId: undefined,\n preferInstalled: options?.preferInstalled,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeoutMs}ms - user did not complete wallet connection`));\n }, timeoutMs);\n });\n\n const result = await Promise.race([connectPromise, timeoutPromise]);\n\n // Create session\n const session: Session = {\n sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),\n walletId: selectedWallet.walletId,\n partyId: result.partyId,\n network: this.config.network,\n createdAt: Date.now(),\n expiresAt: result.session.expiresAt,\n origin: this.origin,\n capabilitiesSnapshot: result.capabilities,\n metadata: result.session.metadata as Record<string, string> | undefined,\n };\n\n // Persist session\n await this.persistSession(session);\n\n // Set active session\n this.activeSession = session;\n\n // Update registry status (may have changed during fetch)\n this.updateRegistryStatus();\n\n // Track successful connection\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n this.telemetry?.increment?.(METRICS.SESSIONS_CREATED);\n\n // Emit event\n this.emit('session:connected', {\n type: 'session:connected',\n session,\n });\n\n return session;\n } catch (err) {\n const timeoutMs = options?.timeoutMs || 30000;\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect',\n walletId: options?.walletId ? String(options.walletId) : undefined,\n timeoutMs,\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n if (!this.activeSession) {\n return;\n }\n\n try {\n const adapter = this.adapters.get(this.activeSession.walletId);\n if (adapter) {\n const ctx = this.createAdapterContext();\n await adapter.disconnect(ctx, this.activeSession);\n }\n\n const sessionId = this.activeSession.sessionId;\n await this.removeSession(sessionId);\n\n this.activeSession = null;\n\n this.emit('session:disconnected', {\n type: 'session:disconnected',\n sessionId,\n });\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect', // Use connect as default phase\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Get active session\n */\n async getActiveSession(): Promise<Session | null> {\n if (this.activeSession) {\n // Check expiration\n if (this.activeSession.expiresAt && Date.now() >= this.activeSession.expiresAt) {\n await this.disconnect();\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: this.activeSession.sessionId,\n });\n return null;\n }\n return this.activeSession;\n }\n\n // Try to restore from storage\n return this.restoreSession();\n }\n\n /**\n * Sign a message\n */\n async signMessage(params: SignMessageParams): Promise<SignedMessage> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signMessage) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signMessage'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.signMessage(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signMessage',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<SignedTransaction> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.signTransaction(ctx, session, params);\n \n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'pending',\n raw: result.signedTx,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Submit a transaction\n */\n async submitTransaction(params: SubmitTransactionParams): Promise<TxReceipt> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.submitTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'submitTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.submitTransaction(ctx, session, params);\n\n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'submitted',\n raw: result,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'submitTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Proxy a JSON Ledger API request through the active wallet adapter\n */\n async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.ledgerApi) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'ledgerApi'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.ledgerApi(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'ledgerApi',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Subscribe to events\n */\n on<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n this.off(event, handler);\n };\n }\n\n /**\n * Unsubscribe from events\n */\n off<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Get a CIP-0103 Provider backed by this client.\n *\n * This bridge routes all request() calls through the existing\n * PartyLayerClient methods and maps events to CIP-0103 format.\n *\n * The bridge implements the full CIP-0103 specification:\n * - All 10 mandatory methods including `ledgerApi` (when adapter supports it)\n * - Full transaction lifecycle: pending -> signed -> executed/failed\n * - All CIP-0103 events: statusChanged, accountsChanged, txChanged, connected\n *\n * **Note:** Async wallets (userUrl pattern) are not supported through the\n * bridge. For async wallet support, use `PartyLayerProvider` directly.\n *\n * @returns CIP-0103 compliant Provider\n */\n asProvider(): import('@partylayer/core').CIP0103Provider {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createProviderBridge } = require('@partylayer/provider') as typeof import('@partylayer/provider');\n return createProviderBridge(this);\n }\n\n /**\n * Destroy client and cleanup\n */\n destroy(): void {\n // Flush and destroy telemetry if it supports it\n if (this.telemetry && 'destroy' in this.telemetry && typeof this.telemetry.destroy === 'function') {\n (this.telemetry as { destroy: () => void }).destroy();\n } else if (this.telemetry?.flush) {\n this.telemetry.flush().catch(() => {});\n }\n \n this.eventHandlers.clear();\n this.activeSession = null;\n }\n\n /**\n * Create adapter context\n */\n private createAdapterContext(): AdapterContext {\n return {\n appName: this.config.app.name,\n origin: this.origin,\n network: this.config.network,\n logger: this.logger,\n telemetry: this.telemetry,\n registry: {\n getWallet: async (walletId: WalletId) => {\n return this.registryClient.getWallet(String(walletId));\n },\n },\n crypto: this.crypto,\n storage: this.storage,\n timeout: (ms: number) => {\n return new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms);\n });\n },\n };\n }\n\n\n /**\n * Persist session to storage\n */\n private async persistSession(session: Session): Promise<void> {\n try {\n const data = JSON.stringify(session);\n const encrypted = await this.crypto.encrypt(data, this.origin);\n await this.storage.set(`session_${session.sessionId}`, encrypted);\n } catch (err) {\n this.logger.warn('Failed to persist session', err);\n }\n }\n\n /**\n * Remove session from storage\n */\n private async removeSession(sessionId: SessionId): Promise<void> {\n try {\n await this.storage.remove(`session_${sessionId}`);\n } catch (err) {\n this.logger.warn('Failed to remove session', err);\n }\n }\n\n /**\n * Restore session from storage\n */\n private async restoreSession(): Promise<Session | null> {\n // Track restore attempt\n this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);\n \n try {\n const encrypted = await this.storage.get('active_session');\n if (!encrypted) {\n return null;\n }\n\n const decrypted = await this.crypto.decrypt(encrypted, this.origin);\n const session = JSON.parse(decrypted) as Session;\n\n // Check expiration\n if (session.expiresAt && Date.now() >= session.expiresAt) {\n await this.removeSession(session.sessionId);\n return null;\n }\n\n // Check origin\n if (session.origin !== this.origin) {\n return null;\n }\n\n // Try to restore with adapter\n const adapter = this.adapters.get(session.walletId);\n if (adapter?.restore) {\n const ctx = this.createAdapterContext();\n const restored = await adapter.restore(ctx, {\n ...session,\n encrypted,\n });\n\n if (restored) {\n this.activeSession = restored;\n // Persist restored session (may have updated metadata)\n await this.persistSession(restored);\n \n // Track successful restore\n this.telemetry?.increment?.(METRICS.SESSIONS_RESTORED);\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n \n // Emit session:connected event with reason=\"restore\"\n this.emit('session:connected', {\n type: 'session:connected',\n session: restored,\n });\n return restored;\n } else {\n // Restore failed - clear session\n await this.removeSession(session.sessionId);\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: session.sessionId,\n });\n return null;\n }\n }\n\n // If restore not supported, use stored session as-is\n // (Some adapters don't support restore but session metadata is still valid)\n this.activeSession = session;\n return session;\n } catch (err) {\n this.logger.warn('Failed to restore session', err);\n return null;\n }\n }\n\n /**\n * Update registry status and emit event\n */\n private updateRegistryStatus(): void {\n const status = this.registryClient.getStatus();\n if (status) {\n // Track registry metrics\n if (status.source === 'network') {\n this.telemetry?.increment?.(METRICS.REGISTRY_FETCH);\n } else if (status.source === 'cache') {\n this.telemetry?.increment?.(METRICS.REGISTRY_CACHE_HIT);\n }\n if (status.stale) {\n this.telemetry?.increment?.(METRICS.REGISTRY_STALE);\n }\n \n this.emit('registry:status', {\n type: 'registry:status',\n status: {\n source: status.source,\n verified: status.verified,\n channel: status.channel,\n sequence: status.sequence,\n stale: status.stale,\n fetchedAt: status.fetchedAt,\n etag: status.etag,\n error: status.error,\n },\n });\n }\n }\n\n /**\n * Get registry status\n */\n getRegistryStatus(): RegistryStatus | null {\n return this.registryClient.getStatus();\n }\n\n /**\n * Emit event to handlers\n */\n private emit<T extends PartyLayerEvent>(\n event: T['type'],\n payload: T\n ): void {\n // Track error metrics\n if (event === 'error' && 'error' in payload) {\n const error = payload.error as { code?: string };\n if (error.code) {\n this.telemetry?.increment?.(errorMetricName(error.code));\n }\n }\n \n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (err) {\n this.logger.error('Error in event handler', err);\n }\n }\n }\n }\n}\n\n/**\n * Create PartyLayer client\n * \n * This is the main entry point for dApps.\n * \n * @example\n * ```typescript\n * const client = createPartyLayer({\n * registryUrl: 'https://registry.partylayer.xyz',\n * channel: 'stable',\n * network: 'devnet',\n * app: { name: 'My dApp' }\n * });\n * \n * const session = await client.connect();\n * ```\n */\nexport function createPartyLayer(\n config: PartyLayerConfig\n): PartyLayerClient {\n return new PartyLayerClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/adapters.ts","../src/builtin-adapters.ts","../src/metrics-telemetry.ts","../src/client.ts"],"names":["OriginNotAllowedError","createProviderBridge"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Configuration types for PartyLayer SDK\n */\n\nimport type { NetworkId, WalletId, WalletAdapter } from '@partylayer/core';\nimport type {\n StorageAdapter,\n CryptoAdapter,\n TelemetryAdapter,\n LoggerAdapter,\n} from '@partylayer/core';\n\n/**\n * Default registry URL for PartyLayer\n * This points to the official registry endpoint.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://registry.partylayer.xyz';\n\n/**\n * Telemetry configuration for opt-in metrics collection\n * \n * @since 0.3.0\n */\nexport interface TelemetryConfig {\n /** \n * Enable telemetry collection\n * @default false\n */\n enabled: boolean;\n \n /** \n * Metrics backend endpoint URL\n * If not provided, metrics are collected but not sent\n */\n endpoint?: string;\n \n /**\n * Sampling rate (0.0 to 1.0)\n * @default 1.0 (100% of events)\n */\n sampleRate?: number;\n \n /**\n * Application identifier (will be hashed for privacy)\n * Used to calculate Monthly Active dApps (MAD)\n */\n appId?: string;\n \n /**\n * Include hashed origin in metrics\n * @default false\n */\n includeOrigin?: boolean;\n \n /**\n * Number of events to buffer before sending\n * @default 10\n */\n batchSize?: number;\n \n /**\n * Interval to flush metrics in milliseconds\n * @default 30000 (30 seconds)\n */\n flushIntervalMs?: number;\n \n /**\n * Network to include in metrics\n * If not provided, uses the SDK's configured network\n */\n network?: NetworkId;\n}\n\n/**\n * Adapter class type (for instantiation)\n */\nexport type AdapterClass = new () => WalletAdapter;\n\n/**\n * PartyLayer configuration\n */\nexport interface PartyLayerConfig {\n /** \n * Registry URL (optional)\n * @default 'https://registry.partylayer.xyz/v1/wallets.json'\n */\n registryUrl?: string;\n /** Registry channel */\n channel?: 'stable' | 'beta';\n /** Default network */\n network: NetworkId;\n /** \n * Wallet adapters to register (OPTIONAL)\n * \n * By default, ALL built-in adapters are automatically registered:\n * - ConsoleAdapter (Console Wallet - browser extension)\n * - LoopAdapter (5N Loop - QR code / popup)\n * - Cantor8Adapter (Cantor8 - deep link transport)\n * \n * Note: BronAdapter requires OAuth config and is NOT included by default.\n * \n * Only provide this if you want to customize which adapters to use.\n * \n * @example\n * ```typescript\n * // Default: all adapters (recommended)\n * const client = createPartyLayer({\n * network: 'devnet',\n * app: { name: 'My dApp' },\n * // adapters not specified = all built-in adapters (Console, Loop, Cantor8)\n * });\n * \n * // Custom: only specific adapters\n * import { ConsoleAdapter } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [new ConsoleAdapter()], // Only Console Wallet\n * // ...\n * });\n * \n * // With Bron (enterprise wallet with OAuth)\n * import { BronAdapter, getBuiltinAdapters } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({ auth: {...}, api: {...} }),\n * ],\n * // ...\n * });\n * ```\n */\n adapters?: (WalletAdapter | AdapterClass)[];\n /** Storage adapter (default: browser localStorage-based encrypted) */\n storage?: StorageAdapter;\n /** Crypto adapter (default: WebCrypto) */\n crypto?: CryptoAdapter;\n /** Registry public keys for signature verification (ed25519) */\n registryPublicKeys?: string[];\n /** \n * Telemetry configuration or adapter\n * \n * Can be either:\n * - TelemetryConfig object for built-in metrics collection\n * - TelemetryAdapter instance for custom telemetry\n * \n * @default undefined (telemetry disabled)\n * @since 0.3.0 - Added TelemetryConfig support\n */\n telemetry?: TelemetryAdapter | TelemetryConfig;\n /** Logger adapter (optional) */\n logger?: LoggerAdapter;\n /** Application metadata */\n app: {\n /** Application name */\n name: string;\n /** Origin (for origin binding checks, defaults to window.location.origin) */\n origin?: string;\n };\n}\n\n/**\n * Connect options\n */\nexport interface ConnectOptions {\n /** Specific wallet ID to connect to */\n walletId?: WalletId;\n /** Prefer installed wallets */\n preferInstalled?: boolean;\n /** Allow only specific wallets */\n allowWallets?: WalletId[];\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Timeout in milliseconds */\n timeoutMs?: number;\n}\n\n/**\n * Wallet filter options\n */\nexport interface WalletFilter {\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Include experimental wallets */\n includeExperimental?: boolean;\n}\n","/**\n * Default adapter implementations\n */\n\nimport type {\n StorageAdapter,\n CryptoAdapter,\n LoggerAdapter,\n TelemetryAdapter,\n} from '@partylayer/core';\n\n/**\n * Default logger (console-based)\n */\nexport class DefaultLogger implements LoggerAdapter {\n debug(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.info) {\n console.info(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n error(message: string, error?: unknown, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.error) {\n console.error(`[PartyLayer] ${message}`, error, ...args);\n }\n }\n}\n\n/**\n * Default crypto adapter (Web Crypto API)\n */\nexport class DefaultCrypto implements CryptoAdapter {\n private async getKey(origin: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API not available');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(origin);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return crypto.subtle.importKey(\n 'raw',\n hash.slice(0, 32),\n { name: 'AES-GCM' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n async encrypt(data: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback to base64\n return btoa(data);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n const encoded = encoder.encode(data);\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n encoded\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...combined));\n } catch {\n return btoa(data);\n }\n }\n\n async decrypt(encrypted: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n return atob(encrypted);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const combined = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n data\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return atob(encrypted);\n }\n }\n\n async generateKey(): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n return Math.random().toString(36).substring(2, 15);\n }\n\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Default storage adapter (localStorage-based)\n */\nexport class DefaultStorage implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = 'partylayer_') {\n this.prefix = prefix;\n }\n\n async get(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(`${this.prefix}${key}`);\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.setItem(`${this.prefix}${key}`, value);\n } catch {\n // Ignore storage errors\n }\n }\n\n async remove(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(`${this.prefix}${key}`);\n } catch {\n // Ignore storage errors\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keys.push(key);\n }\n }\n\n for (const key of keys) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Default telemetry adapter (no-op)\n */\nexport class DefaultTelemetry implements TelemetryAdapter {\n track(_event: string, _properties?: Record<string, unknown>): void {\n // No-op\n }\n\n error(_error: Error, _properties?: Record<string, unknown>): void {\n // No-op\n }\n}\n","/**\n * Built-in wallet adapters\n *\n * These adapters are automatically registered when creating a PartyLayer client.\n * dApp developers don't need to install or configure these separately.\n */\n\nimport type { WalletAdapter } from '@partylayer/core';\nimport { ConsoleAdapter } from '@partylayer/adapter-console';\nimport { LoopAdapter } from '@partylayer/adapter-loop';\nimport { Cantor8Adapter } from '@partylayer/adapter-cantor8';\nimport { NightlyAdapter } from '@partylayer/adapter-nightly';\nimport { SendAdapter } from '@partylayer/adapter-send';\n\n// Note: BronAdapter requires OAuth config and is not included by default.\n// Import it separately: import { BronAdapter } from '@partylayer/adapter-bron';\n\n/**\n * Get all built-in adapters\n *\n * This function returns instances of all supported wallet adapters.\n * Called automatically by createPartyLayer() unless custom adapters are provided.\n *\n * Included adapters:\n * - ConsoleAdapter: Console Wallet browser extension + mobile (combined mode)\n * - LoopAdapter: 5N Loop mobile/web wallet\n * - Cantor8Adapter: Cantor8 wallet with deep link transport\n * - NightlyAdapter: Nightly multichain wallet with Canton support\n * - SendAdapter: Send Canton Wallet (passkey / WebAuthn-PRF, beta) — also\n * injects at `window.canton`; the adapter's kernel.id guard keeps it\n * and Console-spec wallets from claiming each other's provider.\n *\n * Note: ConsoleAdapter defaults to 'combined' mode which supports both browser\n * extension and mobile wallet connect (QR code / deep link). To restrict to\n * extension-only, pass { target: 'local' } to the constructor.\n *\n * Note: BronAdapter is NOT included by default because it requires OAuth configuration.\n * To use Bron, install @partylayer/adapter-bron and register it manually.\n */\nexport function getBuiltinAdapters(): WalletAdapter[] {\n return [\n new ConsoleAdapter(), // Console Wallet - extension + mobile (combined)\n new LoopAdapter(), // 5N Loop - QR code / popup\n new Cantor8Adapter(), // Cantor8 - deep link transport\n new NightlyAdapter(), // Nightly - multichain wallet (injected)\n new SendAdapter(), // Send - passkey-based, kernel.id-guarded window.canton\n ];\n}\n\n/**\n * Built-in adapter classes (for advanced usage)\n */\nexport { ConsoleAdapter, LoopAdapter, Cantor8Adapter, NightlyAdapter, SendAdapter };\n\n/**\n * Re-export Console adapter types for convenience\n */\nexport type { ConsoleAdapterConfig, ConsoleConnectionTarget } from '@partylayer/adapter-console';\n\n/**\n * Re-export BronAdapter for convenience (requires config)\n *\n * @example\n * ```typescript\n * import { BronAdapter } from '@partylayer/sdk';\n *\n * const client = createPartyLayer({\n * // ... config\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({\n * auth: { clientId: '...', redirectUri: '...', ... },\n * api: { baseUrl: '...', getAccessToken: async () => '...' },\n * }),\n * ],\n * });\n * ```\n */\nexport { BronAdapter } from '@partylayer/adapter-bron';\nexport type { BronAdapterConfig, BronAuthConfig, BronApiConfig } from '@partylayer/adapter-bron';\n","/**\n * Metrics Telemetry Adapter\n * \n * A privacy-safe telemetry adapter that collects metrics for\n * ecosystem health monitoring and usage reporting.\n * \n * Features:\n * - Opt-in by default (disabled unless explicitly enabled)\n * - Privacy-safe payloads (no PII, hashed identifiers)\n * - Batched sending to reduce network overhead\n * - Configurable sampling rate\n * - Automatic flush on interval or batch size\n * \n * @since 0.3.0\n */\n\nimport type { TelemetryAdapter } from '@partylayer/core';\nimport {\n createMetricsPayload,\n hashForPrivacy,\n} from '@partylayer/core';\nimport type { TelemetryConfig } from './config';\n\n/** SDK Version - should match package.json */\nconst SDK_VERSION = '0.3.0';\n\n/**\n * Internal metric event for buffering\n */\ninterface MetricEvent {\n type: 'increment' | 'gauge';\n metric: string;\n value: number;\n timestamp: number;\n}\n\n/**\n * Metrics Telemetry Adapter\n * \n * Implements TelemetryAdapter interface with metrics-specific functionality.\n */\nexport class MetricsTelemetryAdapter implements TelemetryAdapter {\n private config: TelemetryConfig;\n private metrics: Map<string, number> = new Map();\n private buffer: MetricEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private appIdHash: string | null = null;\n private originHash: string | null = null;\n private initialized = false;\n \n constructor(config: TelemetryConfig) {\n this.config = {\n enabled: config.enabled ?? false,\n endpoint: config.endpoint,\n sampleRate: config.sampleRate ?? 1.0,\n appId: config.appId,\n includeOrigin: config.includeOrigin ?? false,\n batchSize: config.batchSize ?? 10,\n flushIntervalMs: config.flushIntervalMs ?? 30000,\n network: config.network,\n };\n \n // Initialize async hashing\n this.initialize();\n }\n \n /**\n * Initialize async components (hashing)\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n \n if (this.config.appId) {\n this.appIdHash = await hashForPrivacy(this.config.appId);\n }\n \n if (this.config.includeOrigin && typeof window !== 'undefined') {\n this.originHash = await hashForPrivacy(window.location.origin);\n }\n \n // Start flush timer\n if (this.config.enabled && this.config.flushIntervalMs) {\n this.flushTimer = setInterval(() => {\n this.flush().catch(console.error);\n }, this.config.flushIntervalMs);\n }\n \n this.initialized = true;\n }\n \n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n \n /**\n * Track a named event (TelemetryAdapter interface)\n */\n track(event: string, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n // Convert event to increment - bypass the increment sampling since we already checked\n const current = this.metrics.get(`event_${event}`) ?? 0;\n this.metrics.set(`event_${event}`, current + 1);\n this.bufferEvent({ type: 'increment', metric: `event_${event}`, value: 1, timestamp: Date.now() });\n \n // Track any numeric properties as gauges\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'number') {\n this.gauge(`${event}_${key}`, value);\n }\n }\n }\n }\n \n /**\n * Track an error (TelemetryAdapter interface)\n */\n error(error: Error, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Extract error code if available\n const code = (error as { code?: string }).code ?? 'UNKNOWN';\n this.increment(`error_${code}`);\n \n // Track properties\n if (properties) {\n this.track('error', properties);\n }\n }\n \n /**\n * Increment a metric counter\n */\n increment(metric: string, value: number = 1): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n const current = this.metrics.get(metric) ?? 0;\n this.metrics.set(metric, current + value);\n \n this.bufferEvent({\n type: 'increment',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Set a gauge metric value\n */\n gauge(metric: string, value: number): void {\n if (!this.config.enabled) return;\n \n this.metrics.set(metric, value);\n \n this.bufferEvent({\n type: 'gauge',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Buffer an event for batched sending\n */\n private bufferEvent(event: MetricEvent): void {\n this.buffer.push(event);\n \n // Flush if batch size reached\n if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n this.flush().catch(console.error);\n }\n }\n \n /**\n * Flush buffered metrics to backend\n */\n async flush(): Promise<void> {\n if (!this.config.enabled) return;\n if (this.metrics.size === 0) return;\n if (!this.config.endpoint) {\n // No endpoint configured - just clear the buffer\n this.buffer = [];\n return;\n }\n \n // Wait for initialization\n if (!this.initialized) {\n await this.initialize();\n }\n \n try {\n const payload = createMetricsPayload({\n sdkVersion: SDK_VERSION,\n network: this.config.network ?? 'unknown',\n metrics: Object.fromEntries(this.metrics),\n appIdHash: this.appIdHash ?? undefined,\n originHash: this.originHash ?? undefined,\n });\n \n await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n \n // Clear buffer on success\n this.buffer = [];\n // Note: We don't clear metrics - they accumulate until next flush\n // This allows calculating rates (e.g., errors per session)\n } catch (error) {\n // Silent fail - don't break the app for telemetry failures\n console.debug('[PartyLayer Telemetry] Flush failed:', error);\n }\n }\n \n /**\n * Get current metrics snapshot (for testing/debugging)\n */\n getMetrics(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n \n /**\n * Reset all metrics (for testing)\n */\n reset(): void {\n this.metrics.clear();\n this.buffer = [];\n }\n \n /**\n * Destroy the adapter (cleanup timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n \n // Final flush\n this.flush().catch(console.error);\n }\n}\n\n/**\n * Check if a value is a TelemetryConfig object\n */\nexport function isTelemetryConfig(value: unknown): value is TelemetryConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'enabled' in value &&\n typeof (value as TelemetryConfig).enabled === 'boolean'\n );\n}\n\n/**\n * Create a TelemetryAdapter from config\n * \n * If config is already a TelemetryAdapter, returns it.\n * If config is a TelemetryConfig, creates a MetricsTelemetryAdapter.\n */\nexport function createTelemetryAdapter(\n config: TelemetryAdapter | TelemetryConfig | undefined\n): TelemetryAdapter | undefined {\n if (!config) return undefined;\n \n if (isTelemetryConfig(config)) {\n return new MetricsTelemetryAdapter(config);\n }\n \n return config;\n}\n","/**\n * PartyLayer Client - Public API Implementation\n * \n * This is the main public API for PartyLayer SDK.\n * All dApps should use this API exclusively.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\nimport type {\n WalletId,\n SessionId,\n CapabilityKey,\n WalletInfo,\n Session,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n WalletAdapter,\n AdapterContext,\n} from '@partylayer/core';\nimport {\n toSessionId,\n WalletNotFoundError,\n CapabilityNotSupportedError,\n mapUnknownErrorToPartyLayerError,\n capabilityGuard,\n installGuard,\n} from '@partylayer/core';\nimport { RegistryClient } from '@partylayer/registry-client';\nimport type { RegistryStatus } from '@partylayer/registry-client';\nimport {\n DEFAULT_REGISTRY_URL,\n type PartyLayerConfig,\n type ConnectOptions,\n type WalletFilter,\n} from './config';\nimport type {\n PartyLayerEvent,\n EventHandler,\n} from './events';\nimport {\n DefaultLogger,\n DefaultCrypto,\n DefaultStorage,\n DefaultTelemetry,\n} from './adapters';\nimport { getBuiltinAdapters } from './builtin-adapters';\nimport { createTelemetryAdapter } from './metrics-telemetry';\nimport { METRICS, errorMetricName } from '@partylayer/core';\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SubmitTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\n\n/**\n * Storage key used for the active session.\n *\n * SDK tracks a single active session at a time, so persist/restore/remove\n * all target the same key. Prior to this fix, persist wrote to\n * `session_<sessionId>` while restore read from `active_session`, which\n * meant sessions never survived a page reload.\n */\nconst SESSION_STORAGE_KEY = 'active_session';\n\n/**\n * PartyLayer Client\n * \n * Main client interface for dApps to interact with Canton wallets.\n */\nexport class PartyLayerClient {\n private config: PartyLayerConfig;\n private adapters = new Map<WalletId, WalletAdapter>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private activeSession: Session | null = null;\n public readonly registryClient: RegistryClient; // Expose for React hooks\n private logger: import('@partylayer/core').LoggerAdapter;\n private crypto: import('@partylayer/core').CryptoAdapter;\n private storage: import('@partylayer/core').StorageAdapter;\n private telemetry?: import('@partylayer/core').TelemetryAdapter;\n private origin: string;\n\n constructor(config: PartyLayerConfig) {\n this.config = config;\n\n // Determine origin\n if (config.app.origin) {\n this.origin = config.app.origin;\n } else if (typeof window !== 'undefined') {\n this.origin = window.location.origin;\n } else {\n this.origin = 'unknown';\n }\n\n // Initialize service adapters\n this.logger = config.logger || new DefaultLogger();\n this.crypto = config.crypto || new DefaultCrypto();\n this.storage = config.storage || new DefaultStorage();\n \n // Initialize telemetry - supports both TelemetryAdapter and TelemetryConfig\n const telemetryAdapter = createTelemetryAdapter(config.telemetry);\n this.telemetry = telemetryAdapter || new DefaultTelemetry();\n\n // Register wallet adapters\n // If no adapters provided, use all built-in adapters (Console, Loop, etc.)\n const adaptersToRegister = config.adapters ?? getBuiltinAdapters();\n \n for (const adapterOrClass of adaptersToRegister) {\n let adapter: import('@partylayer/core').WalletAdapter;\n \n // Check if it's a class (function) or instance (object)\n if (typeof adapterOrClass === 'function') {\n // It's a class - instantiate it\n adapter = new (adapterOrClass as new () => import('@partylayer/core').WalletAdapter)();\n } else {\n // It's already an instance\n adapter = adapterOrClass;\n }\n \n this.adapters.set(adapter.walletId, adapter);\n this.logger.debug('Registered wallet adapter', {\n walletId: adapter.walletId,\n name: adapter.name,\n capabilities: adapter.getCapabilities(),\n });\n }\n\n // Initialize registry client with signature verification\n this.registryClient = new RegistryClient({\n registryUrl: config.registryUrl || DEFAULT_REGISTRY_URL,\n channel: config.channel || 'stable',\n registryPublicKeys: config.registryPublicKeys,\n storage: this.storage,\n });\n\n // Emit initial registry status\n this.updateRegistryStatus();\n\n // Restore session on init\n this.restoreSession().catch((err) => {\n this.emit('error', {\n type: 'error',\n error: mapUnknownErrorToPartyLayerError(err, {\n phase: 'restore',\n }),\n });\n });\n }\n\n /**\n * Register a wallet adapter\n *\n * @internal\n * This is used internally by the SDK to register adapters.\n * In production, adapters would be auto-registered via registry.\n */\n registerAdapter(adapter: WalletAdapter): void {\n this.adapters.set(adapter.walletId, adapter);\n }\n\n /**\n * Look up a registered adapter by wallet id.\n *\n * Returns the adapter instance when one is registered for the given\n * `walletId`, or `undefined` otherwise. Intended for UI integrations\n * that need to call `adapter.detectInstalled()` directly to render a\n * per-wallet readiness indicator (instead of duplicating\n * transport-specific install detection logic in the picker). The\n * returned adapter is the same instance used internally for connect /\n * sign / submit flows; do not mutate it.\n *\n * Accepts both raw string ids and the branded `WalletId` form so\n * consumers can pass `walletInfo.walletId` or a string literal\n * interchangeably.\n */\n getAdapter(walletId: string | WalletId): WalletAdapter | undefined {\n return this.adapters.get(walletId as WalletId);\n }\n\n /**\n * List available wallets\n */\n async listWallets(filter?: WalletFilter): Promise<WalletInfo[]> {\n let registryWallets: WalletInfo[];\n\n try {\n // getWallets() already returns WalletInfo[]\n registryWallets = await this.registryClient.getWallets();\n\n // Update registry status after successful fetch\n this.updateRegistryStatus();\n } catch (err) {\n // Update registry status even on error (may have fallback info)\n this.updateRegistryStatus();\n\n this.logger.warn('Registry fetch failed, using registered adapters only', {\n error: err instanceof Error ? err.message : String(err),\n });\n\n registryWallets = [];\n }\n\n // Merge: include registered adapters that are NOT in the registry\n // (e.g. NightlyAdapter is builtin but may not have a registry entry yet)\n const registryIds = new Set(registryWallets.map((w) => String(w.walletId)));\n for (const [, adapter] of this.adapters) {\n if (registryIds.has(String(adapter.walletId))) continue;\n\n registryWallets.push({\n walletId: adapter.walletId,\n name: adapter.name,\n website: '',\n icons: {},\n capabilities: adapter.getCapabilities(),\n adapter: { packageName: 'builtin', versionRange: '*' },\n docs: [],\n networks: [this.config.network || 'devnet'],\n channel: 'stable',\n } as WalletInfo);\n }\n\n // Filter by capabilities\n if (filter?.requiredCapabilities) {\n return registryWallets.filter((walletInfo) =>\n filter.requiredCapabilities!.every((cap) =>\n walletInfo.capabilities.includes(cap as CapabilityKey)\n )\n );\n }\n\n // Filter experimental\n if (!filter?.includeExperimental) {\n return registryWallets.filter((walletInfo) => walletInfo.channel === 'stable');\n }\n\n return registryWallets;\n }\n\n /**\n * Connect to a wallet\n */\n async connect(options?: ConnectOptions): Promise<Session> {\n // Track connect attempt\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_ATTEMPTS);\n \n try {\n // Get available wallets\n const wallets = await this.listWallets({\n requiredCapabilities: options?.requiredCapabilities,\n includeExperimental: true,\n });\n\n // Filter by allowWallets\n let availableWallets = wallets;\n if (options?.allowWallets) {\n availableWallets = wallets.filter((w) =>\n options.allowWallets!.includes(w.walletId)\n );\n }\n\n // Select wallet\n let selectedWallet: WalletInfo;\n let isNativeWallet = false;\n if (options?.walletId) {\n const found = availableWallets.find(\n (w) => w.walletId === options.walletId\n );\n if (found) {\n selectedWallet = found;\n } else {\n // Fallback: check if a native CIP-0103 adapter is registered\n const nativeAdapter = this.adapters.get(options.walletId);\n if (nativeAdapter) {\n isNativeWallet = true;\n selectedWallet = {\n walletId: options.walletId,\n name: nativeAdapter.name,\n website: '',\n icons: {},\n capabilities: nativeAdapter.getCapabilities(),\n adapter: { packageName: 'native-cip0103', versionRange: '*' },\n docs: [],\n networks: [this.config.network],\n channel: 'stable' as const,\n metadata: { source: 'native-cip0103' },\n };\n } else {\n throw new WalletNotFoundError(String(options.walletId));\n }\n }\n } else if (availableWallets.length === 0) {\n throw new WalletNotFoundError('No wallets available');\n } else {\n selectedWallet = availableWallets[0];\n }\n\n // Get adapter\n const adapter = this.adapters.get(selectedWallet.walletId);\n if (!adapter) {\n throw new WalletNotFoundError(String(selectedWallet.walletId));\n }\n\n // Check origin allowlist (skip for native CIP-0103 wallets and\n // adapter-merged wallets that aren't in the registry)\n if (!isNativeWallet) {\n try {\n const walletEntry = await this.registryClient.getWalletEntry(String(selectedWallet.walletId));\n if (walletEntry.originAllowlist && walletEntry.originAllowlist.length > 0) {\n if (!walletEntry.originAllowlist.includes(this.origin)) {\n const { OriginNotAllowedError } = await import('@partylayer/core');\n throw new OriginNotAllowedError(\n this.origin,\n walletEntry.originAllowlist\n );\n }\n }\n } catch (e) {\n // Wallet not in registry (adapter-merged) — skip origin check\n if (!(e instanceof WalletNotFoundError)) {\n throw e;\n }\n }\n }\n\n // Check capabilities\n if (options?.requiredCapabilities) {\n capabilityGuard(adapter, options.requiredCapabilities as CapabilityKey[]);\n }\n\n // Check installation\n await installGuard(adapter);\n\n // Create adapter context\n const ctx = this.createAdapterContext();\n\n // Connect\n // Default timeout: 2 minutes for QR code/popup based wallets\n const timeoutMs = options?.timeoutMs || 120000;\n const connectPromise = adapter.connect(ctx, {\n timeoutMs,\n partyId: undefined,\n preferInstalled: options?.preferInstalled,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeoutMs}ms - user did not complete wallet connection`));\n }, timeoutMs);\n });\n\n const result = await Promise.race([connectPromise, timeoutPromise]);\n\n // Create session\n const session: Session = {\n sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),\n walletId: selectedWallet.walletId,\n partyId: result.partyId,\n network: this.config.network,\n createdAt: Date.now(),\n expiresAt: result.session.expiresAt,\n origin: this.origin,\n capabilitiesSnapshot: result.capabilities,\n metadata: result.session.metadata as Record<string, string> | undefined,\n };\n\n // Persist session\n await this.persistSession(session);\n\n // Set active session\n this.activeSession = session;\n\n // Update registry status (may have changed during fetch)\n this.updateRegistryStatus();\n\n // Track successful connection\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n this.telemetry?.increment?.(METRICS.SESSIONS_CREATED);\n\n // Emit event\n this.emit('session:connected', {\n type: 'session:connected',\n session,\n });\n\n return session;\n } catch (err) {\n const timeoutMs = options?.timeoutMs || 30000;\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect',\n walletId: options?.walletId ? String(options.walletId) : undefined,\n timeoutMs,\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n if (!this.activeSession) {\n return;\n }\n\n try {\n const adapter = this.adapters.get(this.activeSession.walletId);\n if (adapter) {\n const ctx = this.createAdapterContext();\n await adapter.disconnect(ctx, this.activeSession);\n }\n\n const sessionId = this.activeSession.sessionId;\n await this.removeSession(sessionId);\n\n this.activeSession = null;\n\n this.emit('session:disconnected', {\n type: 'session:disconnected',\n sessionId,\n });\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect', // Use connect as default phase\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Get active session\n */\n async getActiveSession(): Promise<Session | null> {\n if (this.activeSession) {\n // Check expiration\n if (this.activeSession.expiresAt && Date.now() >= this.activeSession.expiresAt) {\n await this.disconnect();\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: this.activeSession.sessionId,\n });\n return null;\n }\n return this.activeSession;\n }\n\n // Try to restore from storage\n return this.restoreSession();\n }\n\n /**\n * Sign a message\n */\n async signMessage(params: SignMessageParams): Promise<SignedMessage> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signMessage) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signMessage'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.signMessage(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signMessage',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<SignedTransaction> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.signTransaction(ctx, session, params);\n \n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'pending',\n raw: result.signedTx,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Submit a transaction\n */\n async submitTransaction(params: SubmitTransactionParams): Promise<TxReceipt> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.submitTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'submitTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.submitTransaction(ctx, session, params);\n\n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'submitted',\n raw: result,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'submitTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Proxy a JSON Ledger API request through the active wallet adapter\n */\n async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.ledgerApi) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'ledgerApi'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.ledgerApi(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'ledgerApi',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Subscribe to events\n */\n on<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n this.off(event, handler);\n };\n }\n\n /**\n * Unsubscribe from events\n */\n off<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Get a CIP-0103 Provider backed by this client.\n *\n * This bridge routes all request() calls through the existing\n * PartyLayerClient methods and maps events to CIP-0103 format.\n *\n * The bridge implements the full CIP-0103 specification:\n * - All 10 mandatory methods including `ledgerApi` (when adapter supports it)\n * - Full transaction lifecycle: pending -> signed -> executed/failed\n * - All CIP-0103 events: statusChanged, accountsChanged, txChanged, connected\n *\n * **Note:** Async wallets (userUrl pattern) are not supported through the\n * bridge. For async wallet support, use `PartyLayerProvider` directly.\n *\n * @returns CIP-0103 compliant Provider\n */\n asProvider(): import('@partylayer/core').CIP0103Provider {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createProviderBridge } = require('@partylayer/provider') as typeof import('@partylayer/provider');\n return createProviderBridge(this);\n }\n\n /**\n * Destroy client and cleanup\n */\n destroy(): void {\n // Flush and destroy telemetry if it supports it\n if (this.telemetry && 'destroy' in this.telemetry && typeof this.telemetry.destroy === 'function') {\n (this.telemetry as { destroy: () => void }).destroy();\n } else if (this.telemetry?.flush) {\n this.telemetry.flush().catch(() => {});\n }\n \n this.eventHandlers.clear();\n this.activeSession = null;\n }\n\n /**\n * Create adapter context\n */\n private createAdapterContext(): AdapterContext {\n return {\n appName: this.config.app.name,\n origin: this.origin,\n network: this.config.network,\n logger: this.logger,\n telemetry: this.telemetry,\n registry: {\n getWallet: async (walletId: WalletId) => {\n return this.registryClient.getWallet(String(walletId));\n },\n },\n crypto: this.crypto,\n storage: this.storage,\n timeout: (ms: number) => {\n return new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms);\n });\n },\n };\n }\n\n\n /**\n * Persist session to storage\n */\n private async persistSession(session: Session): Promise<void> {\n try {\n const data = JSON.stringify(session);\n const encrypted = await this.crypto.encrypt(data, this.origin);\n await this.storage.set(SESSION_STORAGE_KEY, encrypted);\n } catch (err) {\n this.logger.warn('Failed to persist session', err);\n }\n }\n\n /**\n * Remove session from storage.\n *\n * Accepts a sessionId for call-site symmetry, but since the SDK tracks one\n * active session we always remove the single SESSION_STORAGE_KEY.\n */\n private async removeSession(_sessionId: SessionId): Promise<void> {\n try {\n await this.storage.remove(SESSION_STORAGE_KEY);\n } catch (err) {\n this.logger.warn('Failed to remove session', err);\n }\n }\n\n /**\n * Restore session from storage\n */\n private async restoreSession(): Promise<Session | null> {\n // Track restore attempt\n this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);\n\n try {\n const encrypted = await this.storage.get(SESSION_STORAGE_KEY);\n if (!encrypted) {\n return null;\n }\n\n const decrypted = await this.crypto.decrypt(encrypted, this.origin);\n const session = JSON.parse(decrypted) as Session;\n\n // Check expiration\n if (session.expiresAt && Date.now() >= session.expiresAt) {\n await this.removeSession(session.sessionId);\n return null;\n }\n\n // Check origin\n if (session.origin !== this.origin) {\n return null;\n }\n\n // Try to restore with adapter\n const adapter = this.adapters.get(session.walletId);\n if (adapter?.restore) {\n const ctx = this.createAdapterContext();\n const restored = await adapter.restore(ctx, {\n ...session,\n encrypted,\n });\n\n if (restored) {\n this.activeSession = restored;\n // Persist restored session (may have updated metadata)\n await this.persistSession(restored);\n \n // Track successful restore\n this.telemetry?.increment?.(METRICS.SESSIONS_RESTORED);\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n \n // Emit session:connected event with reason=\"restore\"\n this.emit('session:connected', {\n type: 'session:connected',\n session: restored,\n });\n return restored;\n } else {\n // Restore failed - clear session\n await this.removeSession(session.sessionId);\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: session.sessionId,\n });\n return null;\n }\n }\n\n // If restore not supported, use stored session as-is\n // (Some adapters don't support restore but session metadata is still valid)\n this.activeSession = session;\n return session;\n } catch (err) {\n this.logger.warn('Failed to restore session', err);\n return null;\n }\n }\n\n /**\n * Update registry status and emit event\n */\n private updateRegistryStatus(): void {\n const status = this.registryClient.getStatus();\n if (status) {\n // Track registry metrics\n if (status.source === 'network') {\n this.telemetry?.increment?.(METRICS.REGISTRY_FETCH);\n } else if (status.source === 'cache') {\n this.telemetry?.increment?.(METRICS.REGISTRY_CACHE_HIT);\n }\n if (status.stale) {\n this.telemetry?.increment?.(METRICS.REGISTRY_STALE);\n }\n \n this.emit('registry:status', {\n type: 'registry:status',\n status: {\n source: status.source,\n verified: status.verified,\n channel: status.channel,\n sequence: status.sequence,\n stale: status.stale,\n fetchedAt: status.fetchedAt,\n etag: status.etag,\n error: status.error,\n },\n });\n }\n }\n\n /**\n * Get registry status\n */\n getRegistryStatus(): RegistryStatus | null {\n return this.registryClient.getStatus();\n }\n\n /**\n * Emit event to handlers\n */\n private emit<T extends PartyLayerEvent>(\n event: T['type'],\n payload: T\n ): void {\n // Track error metrics\n if (event === 'error' && 'error' in payload) {\n const error = payload.error as { code?: string };\n if (error.code) {\n this.telemetry?.increment?.(errorMetricName(error.code));\n }\n }\n \n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (err) {\n this.logger.error('Error in event handler', err);\n }\n }\n }\n }\n}\n\n/**\n * Create PartyLayer client\n * \n * This is the main entry point for dApps.\n * \n * @example\n * ```typescript\n * const client = createPartyLayer({\n * registryUrl: 'https://registry.partylayer.xyz',\n * channel: 'stable',\n * network: 'devnet',\n * app: { name: 'My dApp' }\n * });\n * \n * const session = await client.connect();\n * ```\n */\nexport function createPartyLayer(\n config: PartyLayerConfig\n): PartyLayerClient {\n return new PartyLayerClient(config);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@partylayer/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Main SDK for PartyLayer - Unified wallet integration for Canton Network",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -33,14 +33,15 @@
|
|
|
33
33
|
"url": "https://github.com/PartyLayer/PartyLayer/issues"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@partylayer/registry-client": "^0.2.8",
|
|
37
|
-
"@partylayer/adapter-console": "^0.3.3",
|
|
38
|
-
"@partylayer/adapter-cantor8": "^0.2.8",
|
|
39
|
-
"@partylayer/adapter-loop": "^0.3.3",
|
|
40
|
-
"@partylayer/adapter-bron": "^0.2.8",
|
|
41
36
|
"@partylayer/core": "^0.2.7",
|
|
37
|
+
"@partylayer/registry-client": "^0.3.0",
|
|
38
|
+
"@partylayer/adapter-console": "^0.3.3",
|
|
39
|
+
"@partylayer/adapter-loop": "^0.3.6",
|
|
40
|
+
"@partylayer/adapter-cantor8": "^0.2.9",
|
|
41
|
+
"@partylayer/adapter-bron": "^0.2.9",
|
|
42
|
+
"@partylayer/adapter-nightly": "^0.2.8",
|
|
42
43
|
"@partylayer/provider": "^0.1.6",
|
|
43
|
-
"@partylayer/adapter-
|
|
44
|
+
"@partylayer/adapter-send": "^1.0.0"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
47
|
"@types/node": "^20.11.0",
|