diff --git a/src/index.test.ts b/src/index.test.ts index d8eab7b..75b7faf 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -5,8 +5,8 @@ import * as Exports from './index.js' it('should expose correct exports', () => { expect(Object.keys(Exports)).toMatchInlineSnapshot(` [ - "announceProvider", "createStore", + "announceProvider", "requestProviders", ] `) diff --git a/src/index.ts b/src/index.ts index 73d416b..8448289 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,14 @@ +export type { + DefaultRegister, + EIP1193Provider, + Rdns, + Register, + ResolvedRegister, +} from './register.js' + export { - type AnnounceProviderParameters, - type AnnounceProviderReturnType, - announceProvider, createStore, type Listener, - type RequestProvidersParameters, - type RequestProvidersReturnType, - requestProviders, type Store, } from './store.js' @@ -17,10 +19,11 @@ export type { EIP6963RequestProviderEvent, } from './types.js' -export type { - DefaultRegister, - EIP1193Provider, - Rdns, - Register, - ResolvedRegister, -} from './register.js' +export { + type AnnounceProviderParameters, + type AnnounceProviderReturnType, + announceProvider, + type RequestProvidersParameters, + type RequestProvidersReturnType, + requestProviders, +} from './utils.js' diff --git a/src/store.test.ts b/src/store.test.ts index a4c45fc..6a1ee7d 100644 --- a/src/store.test.ts +++ b/src/store.test.ts @@ -2,13 +2,9 @@ import type { EIP1193Provider } from 'viem' import { describe, expect, test } from 'vitest' -import { - type Listener, - announceProvider, - createStore, - requestProviders, -} from './store.js' +import { type Listener, createStore } from './store.js' import type { EIP6963ProviderDetail } from './types.js' +import { announceProvider } from './utils.js' const detail_1 = { info: { @@ -398,40 +394,3 @@ describe('createStore', () => { `) }) }) - -test('requestProviders', async () => { - const results: EIP6963ProviderDetail[] = [] - const unsubscribe = requestProviders((providerDetail) => { - results.push(providerDetail) - }) - - announceProvider(detail_1)() - await new Promise((resolve) => setTimeout(resolve, 1000)) - announceProvider(detail_2)() - - expect(results.length).toBe(2) - expect(results[0]).toMatchInlineSnapshot(` - { - "info": { - "icon": "https://example.io/icon.png", - "name": "Example Wallet", - "rdns": "org.example", - "uuid": "350670db-19fa-4704-a166-e52e178b59d2", - }, - "provider": "", - } - `) - expect(results[1]).toMatchInlineSnapshot(` - { - "info": { - "icon": "https://foo.io/icon.png", - "name": "Foo Wallet", - "rdns": "org.foo", - "uuid": "12345555-19fa-4704-a166-e52e178b59d2", - }, - "provider": "", - } - `) - - unsubscribe() -}) diff --git a/src/store.ts b/src/store.ts index 0cf6f67..87c2a43 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,11 +1,6 @@ -import type { EIP1193Provider, Rdns } from './register.js' -import type { - EIP6963AnnounceProviderEvent, - EIP6963ProviderDetail, -} from './types.js' - -//////////////////////////////////////////////////////////////////////////// -// MIPD Store +import type { Rdns } from './register.js' +import type { EIP6963ProviderDetail } from './types.js' +import { requestProviders } from './utils.js' export type Listener = ( providerDetails: readonly EIP6963ProviderDetail[], @@ -108,54 +103,3 @@ export function createStore(): Store { }, } } - -//////////////////////////////////////////////////////////////////////////// -// Announce Provider - -export type AnnounceProviderParameters = EIP6963ProviderDetail< - EIP1193Provider, - string -> -export type AnnounceProviderReturnType = () => void - -/** - * Announces an EIP-1193 Provider. - */ -export function announceProvider( - detail: AnnounceProviderParameters, -): AnnounceProviderReturnType { - const event: CustomEvent = new CustomEvent( - 'eip6963:announceProvider', - { detail: Object.freeze(detail) }, - ) - - window.dispatchEvent(event) - - const handler = () => window.dispatchEvent(event) - window.addEventListener('eip6963:requestProvider', handler) - return () => window.removeEventListener('eip6963:requestProvider', handler) -} - -//////////////////////////////////////////////////////////////////////////// -// Request Providers - -export type RequestProvidersParameters = ( - providerDetail: EIP6963ProviderDetail, -) => void -export type RequestProvidersReturnType = () => void - -/** - * Watches for EIP-1193 Providers to be announced. - */ -export function requestProviders( - listener: RequestProvidersParameters, -): RequestProvidersReturnType { - const handler = (event: EIP6963AnnounceProviderEvent) => - listener(event.detail) - - window.addEventListener('eip6963:announceProvider', handler) - - window.dispatchEvent(new CustomEvent('eip6963:requestProvider')) - - return () => window.removeEventListener('eip6963:announceProvider', handler) -} diff --git a/src/types.ts b/src/types.ts index 406c768..491db5c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -17,7 +17,7 @@ export interface EIP6963ProviderDetail< export interface EIP6963ProviderInfo { icon: string name: string - rdns?: TRdns + rdns: TRdns uuid: string } diff --git a/src/utils.test.ts b/src/utils.test.ts new file mode 100644 index 0000000..3fadb59 --- /dev/null +++ b/src/utils.test.ts @@ -0,0 +1,63 @@ +/** @vitest-environment jsdom */ +import type { EIP1193Provider } from 'viem' +import { expect, test } from 'vitest' + +import type { EIP6963ProviderDetail } from './types.js' +import { announceProvider, requestProviders } from './utils.js' + +const detail_1 = { + info: { + icon: 'https://example.io/icon.png', + name: 'Example Wallet', + rdns: 'org.example', + uuid: '350670db-19fa-4704-a166-e52e178b59d2', + }, + provider: '' as unknown as EIP1193Provider, +} as const satisfies EIP6963ProviderDetail + +const detail_2 = { + info: { + icon: 'https://foo.io/icon.png', + name: 'Foo Wallet', + rdns: 'org.foo', + uuid: '12345555-19fa-4704-a166-e52e178b59d2', + }, + provider: '' as unknown as EIP1193Provider, +} as const satisfies EIP6963ProviderDetail + +test('requestProviders', async () => { + const results: EIP6963ProviderDetail[] = [] + const unsubscribe = requestProviders((providerDetail) => { + results.push(providerDetail) + }) + + announceProvider(detail_1)() + await new Promise((resolve) => setTimeout(resolve, 1000)) + announceProvider(detail_2)() + + expect(results.length).toBe(2) + expect(results[0]).toMatchInlineSnapshot(` + { + "info": { + "icon": "https://example.io/icon.png", + "name": "Example Wallet", + "rdns": "org.example", + "uuid": "350670db-19fa-4704-a166-e52e178b59d2", + }, + "provider": "", + } + `) + expect(results[1]).toMatchInlineSnapshot(` + { + "info": { + "icon": "https://foo.io/icon.png", + "name": "Foo Wallet", + "rdns": "org.foo", + "uuid": "12345555-19fa-4704-a166-e52e178b59d2", + }, + "provider": "", + } + `) + + unsubscribe() +}) diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..10488a4 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,56 @@ +import type { EIP1193Provider } from './register.js' +import type { + EIP6963AnnounceProviderEvent, + EIP6963ProviderDetail, +} from './types.js' + +//////////////////////////////////////////////////////////////////////////// +// Announce Provider + +export type AnnounceProviderParameters = EIP6963ProviderDetail< + EIP1193Provider, + string +> +export type AnnounceProviderReturnType = () => void + +/** + * Announces an EIP-1193 Provider. + */ +export function announceProvider( + detail: AnnounceProviderParameters, +): AnnounceProviderReturnType { + const event: CustomEvent = new CustomEvent( + 'eip6963:announceProvider', + { detail: Object.freeze(detail) }, + ) + + window.dispatchEvent(event) + + const handler = () => window.dispatchEvent(event) + window.addEventListener('eip6963:requestProvider', handler) + return () => window.removeEventListener('eip6963:requestProvider', handler) +} + +//////////////////////////////////////////////////////////////////////////// +// Request Providers + +export type RequestProvidersParameters = ( + providerDetail: EIP6963ProviderDetail, +) => void +export type RequestProvidersReturnType = () => void + +/** + * Watches for EIP-1193 Providers to be announced. + */ +export function requestProviders( + listener: RequestProvidersParameters, +): RequestProvidersReturnType { + const handler = (event: EIP6963AnnounceProviderEvent) => + listener(event.detail) + + window.addEventListener('eip6963:announceProvider', handler) + + window.dispatchEvent(new CustomEvent('eip6963:requestProvider')) + + return () => window.removeEventListener('eip6963:announceProvider', handler) +}