Skip to content

Commit

Permalink
refactor: remove all type parameters from plugin interface & move dec…
Browse files Browse the repository at this point in the history
…lareWeb3 (#10767)

* refactor: remove all type parameters from plugin interface

* refactor: move declareWeb3 into contribution

* fix: markdownlint

* fix: type error

---------

Co-authored-by: Jack-Works <Jack-Works@users.noreply.github.com>
  • Loading branch information
Jack-Works and Jack-Works committed Sep 14, 2023
1 parent e963bbd commit c64590c
Show file tree
Hide file tree
Showing 58 changed files with 140 additions and 401 deletions.
2 changes: 1 addition & 1 deletion packages/app/src/background-worker/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ startPluginWorker({
addI18NResource(pluginID, resources) {
createI18NBundle(pluginID, resources)(i18NextInstance)
},
createContext(pluginID, signal) {
createContext(pluginID, def, signal) {
let storage: Plugin.Worker.DatabaseStorage<any> = undefined!
const context: Plugin.Worker.WorkerContext = {
createKVStorage(type, defaultValues) {
Expand Down
2 changes: 1 addition & 1 deletion packages/app/src/helpers/createSharedContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ async function reject(): Promise<never> {

const emptyValueRef = new ValueRefWithReady<any>()

export function createSharedContext(): Omit<Plugin.SiteAdaptor.SiteAdaptorContext, 'createKVStorage'> {
export function createSharedContext(): Omit<Plugin.SiteAdaptor.SiteAdaptorContext, 'createKVStorage' | 'setWeb3State'> {
return {
currentPersona: UNDEFINED,
wallets: EMPTY_ARRAY,
Expand Down
5 changes: 4 additions & 1 deletion packages/app/src/plugin-host/enable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@ startPluginSiteAdaptor(EnhanceableSite.App, {
addI18NResource(plugin, resource) {
createI18NBundle(plugin, resource)(i18NextInstance)
},
createContext(id, signal) {
createContext(id, def, signal) {
return {
createKVStorage(type, defaultValues) {
if (type === 'memory') return inMemoryStorage(id, defaultValues, signal)
else return indexedDBStorage(id, defaultValues, signal)
},
setWeb3State(state) {
def.Web3State = state
},
...createSharedContext(),
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ import { hasHostPermission } from '../../services/helper/request-permission.js'
const { signal } = hmr(import.meta.webpackHot)
startPluginWorker(createPluginHost(signal, createWorkerContext, getPluginMinimalModeEnabled, hasHostPermission))

function createWorkerContext(pluginID: string, signal: AbortSignal): Plugin.Worker.WorkerContext {
function createWorkerContext(
pluginID: string,
def: Plugin.Worker.Definition,
signal: AbortSignal,
): Plugin.Worker.WorkerContext {
let storage: Plugin.Worker.DatabaseStorage<any> = undefined!

return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import { memo, type PropsWithChildren, useCallback } from 'react'
import { Typography, Link as MaterialLink } from '@mui/material'
import type { RenderFragmentsContextType } from '@masknet/typed-message-react'
import { useActivatedPluginsSiteAdaptor } from '@masknet/plugin-infra/content-script'
import { useChainContext } from '@masknet/web3-hooks-base'
import type { NetworkPluginID } from '@masknet/shared-base'

export const Container = memo(function Container(props: PropsWithChildren<{}>) {
return (
Expand All @@ -24,7 +22,6 @@ export const Link = memo(function Anchor(props: RenderFragmentsContextType.LinkP
})

export function useTagEnhancer(kind: 'hash' | 'cash', content: string) {
const { chainId } = useChainContext<NetworkPluginID.PLUGIN_EVM>()
const plugin = useActivatedPluginsSiteAdaptor('any')
.filter((x) => x.enhanceTag)
.at(0)
Expand All @@ -37,7 +34,7 @@ export function useTagEnhancer(kind: 'hash' | 'cash', content: string) {
)
const onMouseEnter: React.EventHandler<React.MouseEvent<HTMLAnchorElement>> = useCallback(
(event) => {
const cancel = plugin?.enhanceTag?.onHover?.(kind, content, event, chainId)
const cancel = plugin?.enhanceTag?.onHover?.(kind, content, event)
event.currentTarget.addEventListener('mouseleave', () => cancel?.(), { once: true })
},
[plugin],
Expand Down
21 changes: 15 additions & 6 deletions packages/mask/shared/plugin-infra/host.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,18 @@ import type { Plugin } from '@masknet/plugin-infra'
import { type BooleanPreference, MaskMessages, createI18NBundle, i18NextInstance } from '@masknet/shared-base'
import { InMemoryStorages, PersistentStorages } from '../../shared/index.js'

export type PartialSharedUIContext = Pick<Plugin.Shared.SharedUIContext, 'createKVStorage'>
export const createPartialSharedUIContext = (id: string, signal: AbortSignal): PartialSharedUIContext => {
return { ...createSharedContext(id, signal) }
export type PartialSharedUIContext = Pick<Plugin.Shared.SharedUIContext, 'createKVStorage' | 'setWeb3State'>
export function createPartialSharedUIContext<Definition extends Plugin.GeneralUI.Definition>(
id: string,
definition: Definition,
signal: AbortSignal,
): PartialSharedUIContext {
return {
...createSharedContext(id, signal),
setWeb3State(state) {
definition.Web3State = state
},
}
}

export function createSharedContext(pluginID: string, signal: AbortSignal): Plugin.Shared.SharedContext {
Expand All @@ -19,12 +28,12 @@ export function createSharedContext(pluginID: string, signal: AbortSignal): Plug
}
}

export function createPluginHost<Context>(
export function createPluginHost<Definition, Context>(
signal: AbortSignal | undefined,
createContext: (plugin: string, signal: AbortSignal) => Context,
createContext: (plugin: string, definition: Definition, signal: AbortSignal) => Context,
getPluginMinimalModeEnabled: (id: string) => Promise<BooleanPreference>,
hasPermission: (host_permission: string[]) => Promise<boolean>,
): Plugin.__Host.Host<Context> {
): Plugin.__Host.Host<Definition, Context> {
const minimalMode: Plugin.__Host.EnabledStatusReporter = {
isEnabled: getPluginMinimalModeEnabled,
events: new Emitter(),
Expand Down
4 changes: 2 additions & 2 deletions packages/mask/src/extension/dashboard/load-dashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import { Modals } from '@masknet/shared'
startPluginDashboard(
createPluginHost(
undefined,
(id, signal) => ({
...createPartialSharedUIContext(id, signal),
(id, def, signal) => ({
...createPartialSharedUIContext(id, def, signal),
...RestPartOfPluginUIContextShared,
allPersonas: createSubscriptionFromAsync(
() => Services.Identity.queryOwnedPersonaInformation(true),
Expand Down
4 changes: 2 additions & 2 deletions packages/mask/src/extension/popups/normal-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ function startPluginHost() {
startPluginDashboard(
createPluginHost(
undefined,
(id, signal) => ({
...createPartialSharedUIContext(id, signal),
(id, def, signal) => ({
...createPartialSharedUIContext(id, def, signal),
...RestPartOfPluginUIContextShared,
allPersonas: allPersonaSub,
}),
Expand Down
4 changes: 2 additions & 2 deletions packages/mask/src/site-adaptor-infra/ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,9 +190,9 @@ export async function activateSiteAdaptorUIInner(ui_deferred: SiteAdaptorUI.Defe
ui.networkIdentifier,
createPluginHost(
signal,
(id, signal): Plugin.SiteAdaptor.SiteAdaptorContext => {
(id, def, signal): Plugin.SiteAdaptor.SiteAdaptorContext => {
return {
...createPartialSharedUIContext(id, signal),
...createPartialSharedUIContext(id, def, signal),
...SiteAdaptorContextRef.value,
}
},
Expand Down
1 change: 1 addition & 0 deletions packages/mask/src/utils/plugin-context-shared-ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export const RestPartOfPluginUIContextShared: Omit<
| 'currentPersonaIdentifier'
| 'allPersonas'
| 'getSearchedKeyword'
| 'setWeb3State'
> = {
currentPersona: createSubscriptionFromAsync(
Services.Settings.getCurrentPersonaIdentifier,
Expand Down
2 changes: 1 addition & 1 deletion packages/plugin-infra/src/dom/useSiteAdaptorContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useValueRef } from '@masknet/shared-base-ui'
import type { Plugin } from '../types.js'

export const SiteAdaptorContextRef = new ValueRefWithReady<
Omit<Plugin.SiteAdaptor.SiteAdaptorContext, 'createKVStorage'>
Omit<Plugin.SiteAdaptor.SiteAdaptorContext, 'createKVStorage' | 'setWeb3State'>
>()

export function useSiteAdaptorContext() {
Expand Down
2 changes: 1 addition & 1 deletion packages/plugin-infra/src/entry-dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ export {
startPluginDashboard,
useActivatedPluginDashboard,
useActivatedPluginsDashboard,
useIsMinimalModeDashBoard,
useIsMinimalModeDashboard,
} from './manager/dashboard.js'
6 changes: 4 additions & 2 deletions packages/plugin-infra/src/manager/dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ events.on(ALL_EVENTS, () => (activatedSub.value = [...activated.plugins]))
const minimalModeSub = new ValueRefWithReady<string[]>([], isEqual)
events.on('minimalModeChanged', () => (minimalModeSub.value = [...minimalMode]))

export function useIsMinimalModeDashBoard(pluginID: string) {
export function useIsMinimalModeDashboard(pluginID: string) {
return useValueRef(minimalModeSub).includes(pluginID)
}

Expand All @@ -26,6 +26,8 @@ export function useActivatedPluginDashboard(pluginID: string) {
return plugins.find((x) => x.ID === pluginID)
}

export function startPluginDashboard(host: Plugin.__Host.Host<Plugin.Dashboard.DashboardContext>) {
export function startPluginDashboard(
host: Plugin.__Host.Host<Plugin.Dashboard.Definition, Plugin.Dashboard.DashboardContext>,
) {
startDaemon(host)
}
20 changes: 11 additions & 9 deletions packages/plugin-infra/src/manager/manage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ export function createManager<
}
return value
})()
let _host: Plugin.__Host.Host<Context> = undefined!
let _host: Plugin.__Host.Host<T, Context> = undefined!
const events = new Emitter<{
activateChanged: [id: string, enabled: boolean]
minimalModeChanged: [id: string, enabled: boolean]
}>()

return {
configureHostHooks: (host: Plugin.__Host.Host<Context>) => (_host = host),
configureHostHooks: (host: Plugin.__Host.Host<T, Context>) => (_host = host),
activatePlugin,
stopPlugin,
isMinimalMode,
Expand Down Expand Up @@ -70,7 +70,7 @@ export function createManager<
result ? minimalModePluginIDs.add(id) : minimalModePluginIDs.delete(id)
}

function startDaemon(host: Plugin.__Host.Host<Context>, extraCheck?: (id: PluginID) => boolean) {
function startDaemon(host: Plugin.__Host.Host<T, Context>, extraCheck?: (id: PluginID) => boolean) {
_host = host
const { signal = new AbortController().signal, addI18NResource, minimalMode } = _host
const removeListener1 = minimalMode.events.on('enabled', (id) => updateCompositedMinimalMode(id))
Expand Down Expand Up @@ -137,14 +137,16 @@ export function createManager<
const activatedPlugin: ActivatedPluginInstance = {
instance: definition,
controller: abort,
context: _host.createContext(id, abort.signal),
context: _host.createContext(id, definition, abort.signal),
}
activated.set(id, activatedPlugin)
await timeout(
Promise.resolve(definition.init(activatedPlugin.controller.signal, activatedPlugin.context)),
1000,
`Plugin ${id} init() timed out.`,
).catch(console.error)
if (definition.init) {
await timeout(
Promise.resolve(definition.init(activatedPlugin.controller.signal, activatedPlugin.context)),
1000,
`Plugin ${id} init() timed out.`,
).catch(console.error)
}
events.emit('activateChanged', id, true)
}

Expand Down
2 changes: 1 addition & 1 deletion packages/plugin-infra/src/manager/site-adaptor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export function useActivatedPluginSiteAdaptor(pluginID: string, minimalModeEqual

export function startPluginSiteAdaptor(
currentNetwork: EnhanceableSite,
host: Plugin.__Host.Host<Plugin.SiteAdaptor.SiteAdaptorContext>,
host: Plugin.__Host.Host<Plugin.SiteAdaptor.Definition, Plugin.SiteAdaptor.SiteAdaptorContext>,
) {
startDaemon(host, (id) => {
const def = getPluginDefine(id)
Expand Down
28 changes: 4 additions & 24 deletions packages/plugin-infra/src/manager/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,27 +32,7 @@ export function getPluginDefine(id: PluginID | NetworkPluginID) {
return __registered.get(id as unknown as PluginID)
}

export function registerPlugin<
ChainId = unknown,
SchemaType = unknown,
ProviderType = unknown,
NetworkType = unknown,
MessageRequest = unknown,
MessageResponse = unknown,
Transaction = unknown,
TransactionParameter = unknown,
>(
def: Plugin.DeferredDefinition<
ChainId,
SchemaType,
ProviderType,
NetworkType,
MessageRequest,
MessageResponse,
Transaction,
TransactionParameter
>,
) {
export function registerPlugin(def: Plugin.DeferredDefinition) {
if (__registered.has(def.ID)) return
if (!__meetRegisterRequirement(def, env.channel)) return
__registered.set(def.ID, def as any)
Expand All @@ -66,13 +46,13 @@ function getRegisteredPlugin(ID: NetworkPluginID) {
return [...__registered.values()].find((x) => x.ID === pluginID)
}
const getRegisteredWeb3Chains_memo = memoize((ID: NetworkPluginID) => {
return getRegisteredPlugin(ID)?.declareWeb3Chains ?? []
return getRegisteredPlugin(ID)?.contribution?.web3?.chains ?? []
})
const getRegisteredWeb3Networks_memo = memoize((ID: NetworkPluginID) => {
return getRegisteredPlugin(ID)?.declareWeb3Networks ?? []
return getRegisteredPlugin(ID)?.contribution?.web3?.networks ?? []
})
const getRegisteredWeb3Providers_memo = memoize((ID: NetworkPluginID) => {
return getRegisteredPlugin(ID)?.declareWeb3Providers ?? []
return getRegisteredPlugin(ID)?.contribution?.web3?.providers ?? []
})

export function getRegisteredWeb3Chains<T extends NetworkPluginID>(ID: T) {
Expand Down
2 changes: 1 addition & 1 deletion packages/plugin-infra/src/manager/worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { createManager } from './manage.js'

const { startDaemon, activated } = createManager((def) => def.Worker)

export function startPluginWorker(host: Plugin.__Host.Host<Plugin.Worker.WorkerContext>) {
export function startPluginWorker(host: Plugin.__Host.Host<Plugin.Worker.Definition, Plugin.Worker.WorkerContext>) {
startDaemon(host)
}
export const activatedPluginsWorker = activated.plugins

0 comments on commit c64590c

Please sign in to comment.