diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 30a8ef9b..4eab3445 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -37,6 +37,9 @@ ] } }, + "browser": { + "./dist/internal/registry.node.js": "./dist/internal/registry.browser.js" + }, "scripts": { "build": "tsc && resolve-tspaths", "clean": "rm -rf dist types tsconfig.tsbuildinfo", diff --git a/packages/sdk/src/internal/registry.browser.ts b/packages/sdk/src/internal/registry.browser.ts new file mode 100644 index 00000000..b6e1e768 --- /dev/null +++ b/packages/sdk/src/internal/registry.browser.ts @@ -0,0 +1,42 @@ +import { DynamicHostedWalletProvider } from '@/wallet/providers/DynamicHostedWalletProvider.js' +import type { + DynamicOptions, + HostedProviderFactory, + HostedProviderType, +} from '@/wallet/providers/hostedProvider.types.js' + +export class HostedWalletProviderRegistry { + private readonly registry = new Map< + HostedProviderType, + HostedProviderFactory + >() + + public constructor() { + this.register<'dynamic'>({ + type: 'dynamic', + validateOptions(_options): _options is DynamicOptions { + return true + }, + create({ chainManager }) { + return new DynamicHostedWalletProvider(chainManager) + }, + }) + } + + getFactory( + type: TType, + ): HostedProviderFactory { + const factory = this.registry.get(type) as + | HostedProviderFactory + | undefined + if (!factory) throw new Error(`Unknown hosted wallet provider: ${type}`) + return factory + } + + private register( + factory: HostedProviderFactory, + ) { + if (!this.registry.has(factory.type)) + this.registry.set(factory.type, factory) + } +} diff --git a/packages/sdk/src/internal/registry.node.ts b/packages/sdk/src/internal/registry.node.ts new file mode 100644 index 00000000..b8197641 --- /dev/null +++ b/packages/sdk/src/internal/registry.node.ts @@ -0,0 +1,43 @@ +import type { + HostedProviderFactory, + HostedProviderType, + PrivyOptions, +} from '@/wallet/providers/hostedProvider.types.js' +import { PrivyHostedWalletProvider } from '@/wallet/providers/PrivyHostedWalletProvider.js' + +export class HostedWalletProviderRegistry { + private readonly registry = new Map< + HostedProviderType, + HostedProviderFactory + >() + + public constructor() { + this.register<'privy'>({ + type: 'privy', + validateOptions(options): options is PrivyOptions { + return Boolean((options as PrivyOptions)?.privyClient) + }, + create({ chainManager }, options) { + return new PrivyHostedWalletProvider(options.privyClient, chainManager) + }, + }) + // Note: Dynamic provider is intentionally NOT registered in the Node registry + } + + getFactory( + type: TType, + ): HostedProviderFactory { + const factory = this.registry.get(type) as + | HostedProviderFactory + | undefined + if (!factory) throw new Error(`Unknown hosted wallet provider: ${type}`) + return factory + } + + private register( + factory: HostedProviderFactory, + ) { + if (!this.registry.has(factory.type)) + this.registry.set(factory.type, factory) + } +} diff --git a/packages/sdk/src/verbs.ts b/packages/sdk/src/verbs.ts index e83f518c..2402ae4a 100644 --- a/packages/sdk/src/verbs.ts +++ b/packages/sdk/src/verbs.ts @@ -14,6 +14,9 @@ import type { import { WalletNamespace } from '@/wallet/WalletNamespace.js' import { WalletProvider } from '@/wallet/WalletProvider.js' +// Import node variant by default; frontend bundlers will remap to browser variant via package.json "browser" field +import type { HostedWalletProviderRegistry } from './internal/registry.node.js' + /** * Main Verbs SDK class * @description Core implementation of the Verbs SDK