Skip to content

Commit

Permalink
refactor: move around modules
Browse files Browse the repository at this point in the history
  • Loading branch information
jxom committed Jul 3, 2023
1 parent 25b2bbd commit 0772c8b
Show file tree
Hide file tree
Showing 7 changed files with 142 additions and 117 deletions.
2 changes: 1 addition & 1 deletion src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import * as Exports from './index.js'
it('should expose correct exports', () => {
expect(Object.keys(Exports)).toMatchInlineSnapshot(`
[
"announceProvider",
"createStore",
"announceProvider",
"requestProviders",
]
`)
Expand Down
29 changes: 16 additions & 13 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -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'

Expand All @@ -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'
45 changes: 2 additions & 43 deletions src/store.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down Expand Up @@ -398,40 +394,3 @@ describe('createStore', () => {
`)
})
})

test('requestProviders', async () => {
const results: EIP6963ProviderDetail<EIP1193Provider>[] = []
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": "<EIP1193Provider_1>",
}
`)
expect(results[1]).toMatchInlineSnapshot(`
{
"info": {
"icon": "https://foo.io/icon.png",
"name": "Foo Wallet",
"rdns": "org.foo",
"uuid": "12345555-19fa-4704-a166-e52e178b59d2",
},
"provider": "<EIP1193Provider_2>",
}
`)

unsubscribe()
})
62 changes: 3 additions & 59 deletions src/store.ts
Original file line number Diff line number Diff line change
@@ -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[],
Expand Down Expand Up @@ -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<EIP6963ProviderDetail> = 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)
}
2 changes: 1 addition & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export interface EIP6963ProviderDetail<
export interface EIP6963ProviderInfo<TRdns extends string = Rdns> {
icon: string
name: string
rdns?: TRdns
rdns: TRdns
uuid: string
}

Expand Down
63 changes: 63 additions & 0 deletions src/utils.test.ts
Original file line number Diff line number Diff line change
@@ -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: '<EIP1193Provider_1>' 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: '<EIP1193Provider_2>' as unknown as EIP1193Provider,
} as const satisfies EIP6963ProviderDetail

test('requestProviders', async () => {
const results: EIP6963ProviderDetail<EIP1193Provider>[] = []
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": "<EIP1193Provider_1>",
}
`)
expect(results[1]).toMatchInlineSnapshot(`
{
"info": {
"icon": "https://foo.io/icon.png",
"name": "Foo Wallet",
"rdns": "org.foo",
"uuid": "12345555-19fa-4704-a166-e52e178b59d2",
},
"provider": "<EIP1193Provider_2>",
}
`)

unsubscribe()
})
56 changes: 56 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -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<EIP6963ProviderDetail> = 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)
}

0 comments on commit 0772c8b

Please sign in to comment.