Skip to content

Commit 2c6ffe8

Browse files
committed
feat: use browser remapping to import registry
1 parent 48212eb commit 2c6ffe8

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

packages/sdk/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
]
3838
}
3939
},
40+
"browser": {
41+
"./dist/internal/registry.node.js": "./dist/internal/registry.browser.js"
42+
},
4043
"scripts": {
4144
"build": "tsc && resolve-tspaths",
4245
"clean": "rm -rf dist types tsconfig.tsbuildinfo",
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { DynamicHostedWalletProvider } from '@/wallet/providers/DynamicHostedWalletProvider.js'
2+
import type {
3+
DynamicOptions,
4+
HostedProviderFactory,
5+
HostedProviderType,
6+
} from '@/wallet/providers/hostedProvider.types.js'
7+
8+
export class HostedWalletProviderRegistry {
9+
private readonly registry = new Map<
10+
HostedProviderType,
11+
HostedProviderFactory<HostedProviderType>
12+
>()
13+
14+
public constructor() {
15+
this.register<'dynamic'>({
16+
type: 'dynamic',
17+
validateOptions(_options): _options is DynamicOptions {
18+
return true
19+
},
20+
create({ chainManager }) {
21+
return new DynamicHostedWalletProvider(chainManager)
22+
},
23+
})
24+
}
25+
26+
getFactory<TType extends HostedProviderType>(
27+
type: TType,
28+
): HostedProviderFactory<TType> {
29+
const factory = this.registry.get(type) as
30+
| HostedProviderFactory<TType>
31+
| undefined
32+
if (!factory) throw new Error(`Unknown hosted wallet provider: ${type}`)
33+
return factory
34+
}
35+
36+
private register<T extends HostedProviderType>(
37+
factory: HostedProviderFactory<T>,
38+
) {
39+
if (!this.registry.has(factory.type))
40+
this.registry.set(factory.type, factory)
41+
}
42+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import type {
2+
HostedProviderFactory,
3+
HostedProviderType,
4+
PrivyOptions,
5+
} from '@/wallet/providers/hostedProvider.types.js'
6+
import { PrivyHostedWalletProvider } from '@/wallet/providers/PrivyHostedWalletProvider.js'
7+
8+
export class HostedWalletProviderRegistry {
9+
private readonly registry = new Map<
10+
HostedProviderType,
11+
HostedProviderFactory<HostedProviderType>
12+
>()
13+
14+
public constructor() {
15+
this.register<'privy'>({
16+
type: 'privy',
17+
validateOptions(options): options is PrivyOptions {
18+
return Boolean((options as PrivyOptions)?.privyClient)
19+
},
20+
create({ chainManager }, options) {
21+
return new PrivyHostedWalletProvider(options.privyClient, chainManager)
22+
},
23+
})
24+
// Note: Dynamic provider is intentionally NOT registered in the Node registry
25+
}
26+
27+
getFactory<TType extends HostedProviderType>(
28+
type: TType,
29+
): HostedProviderFactory<TType> {
30+
const factory = this.registry.get(type) as
31+
| HostedProviderFactory<TType>
32+
| undefined
33+
if (!factory) throw new Error(`Unknown hosted wallet provider: ${type}`)
34+
return factory
35+
}
36+
37+
private register<T extends HostedProviderType>(
38+
factory: HostedProviderFactory<T>,
39+
) {
40+
if (!this.registry.has(factory.type))
41+
this.registry.set(factory.type, factory)
42+
}
43+
}

packages/sdk/src/verbs.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import type {
1414
import { WalletNamespace } from '@/wallet/WalletNamespace.js'
1515
import { WalletProvider } from '@/wallet/WalletProvider.js'
1616

17+
// Import node variant by default; frontend bundlers will remap to browser variant via package.json "browser" field
18+
import type { HostedWalletProviderRegistry } from './internal/registry.node.js'
19+
1720
/**
1821
* Main Verbs SDK class
1922
* @description Core implementation of the Verbs SDK

0 commit comments

Comments
 (0)