diff --git a/packages/mask/src/extension/background-script/HelperService/storage.ts b/packages/mask/background/services/helper/deprecated-storage.ts similarity index 100% rename from packages/mask/src/extension/background-script/HelperService/storage.ts rename to packages/mask/background/services/helper/deprecated-storage.ts diff --git a/packages/mask/background/services/helper/fetch.ts b/packages/mask/background/services/helper/fetch.ts index 54e31abc1701..99939116dae5 100644 --- a/packages/mask/background/services/helper/fetch.ts +++ b/packages/mask/background/services/helper/fetch.ts @@ -3,7 +3,8 @@ export async function fetch(url: string) { return res.blob() } -export async function fetchJSON(url: string): Promise { +/** @deprecated */ +export async function fetchJSON(url: string): Promise { const res = await globalThis.fetch(url) return res.json() } diff --git a/packages/mask/background/services/helper/index.ts b/packages/mask/background/services/helper/index.ts new file mode 100644 index 000000000000..6f4810cfab58 --- /dev/null +++ b/packages/mask/background/services/helper/index.ts @@ -0,0 +1,6 @@ +export { fetch, fetchJSON } from './fetch' +export { resolveTCOLink } from './short-link-resolver' +export { openPopupWindow, removePopupWindow } from './popup-opener' +export { __deprecated__getStorage, __deprecated__setStorage } from './deprecated-storage' +export { queryExtensionPermission, requestExtensionPermission } from './request-permission' +export { createPersonaPayload, queryExistedBinding, bindProof } from './nextID' diff --git a/packages/mask/src/extension/background-script/HelperService/nextId.ts b/packages/mask/background/services/helper/nextID.ts similarity index 100% rename from packages/mask/src/extension/background-script/HelperService/nextId.ts rename to packages/mask/background/services/helper/nextID.ts diff --git a/packages/mask/src/extension/background-script/HelperService/index.ts b/packages/mask/background/services/helper/popup-opener.ts similarity index 70% rename from packages/mask/src/extension/background-script/HelperService/index.ts rename to packages/mask/background/services/helper/popup-opener.ts index 3dbb1d6e3d54..606b0c6044bf 100644 --- a/packages/mask/src/extension/background-script/HelperService/index.ts +++ b/packages/mask/background/services/helper/popup-opener.ts @@ -1,22 +1,27 @@ import { PopupRoutes } from '@masknet/shared-base' import urlcat from 'urlcat' -import { currentPopupWindowId } from '../../../settings/settings' -import { isLocked } from '../../../plugins/Wallet/services' - -export { __deprecated__getStorage, __deprecated__setStorage } from './storage' -export { resolveTCOLink } from '../../../../shared' -export { fetch, fetchJSON } from '../../../../background/services/helper/fetch' -export { requestExtensionPermission, queryExtensionPermission } from './extensionPermission' -export { createPersonaPayload, queryExistedBinding, bindProof } from './nextId' -export { fromHex, toBase64URL } from '@masknet/shared-base' +import { MaskMessages } from '../../../shared' +let currentPopupWindowId = 0 +function isLocked() { + return new Promise((resolve) => { + const off = MaskMessages.events.wallet_is_locked.on(([type, value]) => { + if (type === 'request') return + off() + resolve(value) + // in case something went wrong + setTimeout(() => resolve(false), 200) + }) + MaskMessages.events.wallet_is_locked.sendToLocal(['request']) + }) +} export async function openPopupWindow(route?: PopupRoutes, params?: Record) { const windows = await browser.windows.getAll() - const popup = windows.find((win) => win && win.type === 'popup' && win.id === currentPopupWindowId.value) + const popup = windows.find((win) => win && win.type === 'popup' && win.id === currentPopupWindowId) // Focus on the pop-up window if it already exists if (popup) { - await browser.windows.update(currentPopupWindowId.value, { focused: true }) + await browser.windows.update(currentPopupWindowId, { focused: true }) } else { const locked = await isLocked() @@ -56,10 +61,10 @@ export async function openPopupWindow(route?: PopupRoutes, params?: Record { browser.windows.onRemoved.addListener(function listener(windowID: number) { diff --git a/packages/mask/shared/helpers/resolve-t.co.ts b/packages/mask/background/services/helper/short-link-resolver.ts similarity index 100% rename from packages/mask/shared/helpers/resolve-t.co.ts rename to packages/mask/background/services/helper/short-link-resolver.ts diff --git a/packages/mask/background/services/setup.ts b/packages/mask/background/services/setup.ts index 3c4ab57ae7e3..962f72e25936 100644 --- a/packages/mask/background/services/setup.ts +++ b/packages/mask/background/services/setup.ts @@ -13,6 +13,7 @@ const message = new WebExtensionMessage>({ domain: 'services // #region Setup services const _service: Record = { Crypto: setup('Crypto', () => import('./crypto')), + Helper: setup('Helper', () => import('./helper')), } const _service_generator: Record = {} diff --git a/packages/mask/background/services/types.ts b/packages/mask/background/services/types.ts index d5de9ea05a5b..203667189a7a 100644 --- a/packages/mask/background/services/types.ts +++ b/packages/mask/background/services/types.ts @@ -1,5 +1,7 @@ import type * as Crypto from './crypto' +import type * as Helper from './helper' export type Services = { Crypto: typeof Crypto + Helper: typeof Helper } export type GeneratorServices = {} diff --git a/packages/mask/shared/definitions/routes.ts b/packages/mask/shared/definitions/routes.ts new file mode 100644 index 000000000000..5683e2322ca5 --- /dev/null +++ b/packages/mask/shared/definitions/routes.ts @@ -0,0 +1,11 @@ +import { PopupRoutes } from '@masknet/shared-base' +export function getPopupRouteURLWithNoParam(kind: PopupRoutes) { + return browser.runtime.getURL(`/popups.html#${kind}`) +} +export function getPermissionRequestURL(permission: browser.permissions.Permissions) { + const { origins = [], permissions = [] } = permission + const params = new URLSearchParams() + for (const each of origins) params.append('origins', each) + for (const each of permissions) params.append('permissions', each) + return `${getPopupRouteURLWithNoParam(PopupRoutes.RequestPermission)}?${params.toString()}` +} diff --git a/packages/mask/shared/index.ts b/packages/mask/shared/index.ts index c2f14c48a9b4..b02aa56ca45f 100644 --- a/packages/mask/shared/index.ts +++ b/packages/mask/shared/index.ts @@ -2,4 +2,3 @@ export * from './messages' export * from './flags' export { InMemoryStorages, PersistentStorages } from './kv-storage' export * from './helpers/download' -export * from './helpers/resolve-t.co' diff --git a/packages/mask/src/extension/background-script/EthereumServices/providers/MaskWallet.ts b/packages/mask/src/extension/background-script/EthereumServices/providers/MaskWallet.ts index aef313682768..df91b1867565 100644 --- a/packages/mask/src/extension/background-script/EthereumServices/providers/MaskWallet.ts +++ b/packages/mask/src/extension/background-script/EthereumServices/providers/MaskWallet.ts @@ -4,7 +4,7 @@ import { PopupRoutes } from '@masknet/shared-base' import { ChainId, getChainIdFromNetworkType, getChainRPC, NetworkType, ProviderType } from '@masknet/web3-shared-evm' import { currentChainIdSettings } from '../../../../plugins/Wallet/settings' import { getWallets, selectAccountPrepare } from '../../../../plugins/Wallet/services' -import { openPopupWindow } from '../../HelperService' +import { openPopupWindow } from '../../../../../background/services/helper' // #region providers const providerPool = new Map() diff --git a/packages/mask/src/extension/background-script/EthereumServices/request.ts b/packages/mask/src/extension/background-script/EthereumServices/request.ts index 6fa0ea996c15..823bbac4c6ed 100644 --- a/packages/mask/src/extension/background-script/EthereumServices/request.ts +++ b/packages/mask/src/extension/background-script/EthereumServices/request.ts @@ -21,7 +21,7 @@ import { WalletRPC } from '../../../plugins/Wallet/messages' import { INTERNAL_nativeSend, INTERNAL_send } from './send' import { defer } from '@dimensiondev/kit' import { hasNativeAPI, nativeAPI } from '../../../../shared/native-rpc' -import { openPopupWindow } from '../HelperService' +import { openPopupWindow } from '../../../../background/services/helper' import Services from '../../service' import { toHex } from 'web3-utils' import { isLessThan } from '@masknet/web3-shared-base' diff --git a/packages/mask/src/extension/background-script/IdentityServices/sign.ts b/packages/mask/src/extension/background-script/IdentityServices/sign.ts index addd20e8d91a..ac60770dd619 100644 --- a/packages/mask/src/extension/background-script/IdentityServices/sign.ts +++ b/packages/mask/src/extension/background-script/IdentityServices/sign.ts @@ -11,7 +11,7 @@ import { import { MaskMessages } from '../../../utils' import { PersonaIdentifier, fromBase64URL, PopupRoutes } from '@masknet/shared-base' import { queryPersonasWithPrivateKey } from '../../../../background/database/persona/db' -import { openPopupWindow } from '../HelperService' +import { openPopupWindow } from '../../../../background/services/helper' import { delay } from '@dimensiondev/kit' export interface SignRequest { /** Use that who to sign this message. */ diff --git a/packages/mask/src/extension/background-script/WelcomeService.ts b/packages/mask/src/extension/background-script/WelcomeService.ts index f60257f3feb3..20e173baba5b 100644 --- a/packages/mask/src/extension/background-script/WelcomeService.ts +++ b/packages/mask/src/extension/background-script/WelcomeService.ts @@ -6,7 +6,7 @@ import { attachProfileDB, LinkedProfileDetails } from '../../../background/datab import { deriveLocalKeyFromECDHKey } from '../../utils/mnemonic-code/localKeyGenerate' import type { PersonaIdentifier, ProfileIdentifier, AESJsonWebKey } from '@masknet/shared-base' import { BackupOptions, generateBackupJSON } from './WelcomeServices/generateBackupJSON' -import { requestExtensionPermission } from './HelperService/extensionPermission' +import { requestExtensionPermission, openPopupWindow } from './../../../background/services/helper' import { saveFileFromBuffer } from '../../../shared' import { BackupJSONFileLatest, @@ -18,7 +18,6 @@ import { assertEnvironment, Environment } from '@dimensiondev/holoflows-kit' import { convertBackupFileToObject, extraPermissions, fixBackupFilePermission } from '../../utils' import { v4 as uuid } from 'uuid' import { getUnconfirmedBackup, restoreBackup, setUnconfirmedBackup } from './WelcomeServices/restoreBackup' -import { openPopupWindow } from './HelperService' import formatDateTime from 'date-fns/format' export { generateBackupJSON, generateBackupPreviewInfo } from './WelcomeServices/generateBackupJSON' diff --git a/packages/mask/src/extension/popups/RequestPermission/utils.ts b/packages/mask/src/extension/popups/RequestPermission/utils.ts deleted file mode 100644 index 6095b5b2adbf..000000000000 --- a/packages/mask/src/extension/popups/RequestPermission/utils.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PopupRoutes } from '@masknet/shared-base' -import { getRouteURLWithNoParam } from '../utils' - -export function constructRequestPermissionURL(permission: browser.permissions.Permissions) { - const { origins = [], permissions = [] } = permission - const params = new URLSearchParams() - for (const each of origins) params.append('origins', each) - for (const each of permissions) params.append('permissions', each) - return `${getRouteURLWithNoParam(PopupRoutes.RequestPermission)}?${params.toString()}` -} diff --git a/packages/mask/src/extension/popups/ThirdPartyRequestPermission/utils.ts b/packages/mask/src/extension/popups/ThirdPartyRequestPermission/utils.ts index ef4bf73b110d..c3e0ae9d4afb 100644 --- a/packages/mask/src/extension/popups/ThirdPartyRequestPermission/utils.ts +++ b/packages/mask/src/extension/popups/ThirdPartyRequestPermission/utils.ts @@ -1,5 +1,5 @@ import { PopupRoutes } from '@masknet/shared-base' -import { getRouteURLWithNoParam } from '../utils' +import { getPopupRouteURLWithNoParam } from '..' import type { ThirdPartyPluginPermission } from '../../background-script/ThirdPartyPlugin/types' export function constructThirdPartyRequestPermissionURL( @@ -9,5 +9,5 @@ export function constructThirdPartyRequestPermissionURL( const params = new URLSearchParams() params.set('plugin', pluginManifestURL) for (const x of permissions) params.append('permission', String(x)) - return getRouteURLWithNoParam(PopupRoutes.ThirdPartyRequestPermission) + '?' + params.toString() + return getPopupRouteURLWithNoParam(PopupRoutes.ThirdPartyRequestPermission) + '?' + params.toString() } diff --git a/packages/mask/src/extension/popups/index.tsx b/packages/mask/src/extension/popups/index.tsx index c98c50f8db8d..245ee93b0712 100644 --- a/packages/mask/src/extension/popups/index.tsx +++ b/packages/mask/src/extension/popups/index.tsx @@ -1,13 +1,11 @@ import type { MaskSDK_SNS_ContextIdentifier } from '../../plugins/External/sns-context' import { PopupRoutes } from '@masknet/shared-base' - -import { getRouteURLWithNoParam } from './utils' +import { getPopupRouteURLWithNoParam } from '../../../shared/definitions/routes' export function PermissionAwareRedirectOf(url: string, context: MaskSDK_SNS_ContextIdentifier) { return ( - getRouteURLWithNoParam(PopupRoutes.PermissionAwareRedirect) + + getPopupRouteURLWithNoParam(PopupRoutes.PermissionAwareRedirect) + `?url=${encodeURIComponent(url)}&context=${context}` ) } -export { constructRequestPermissionURL } from './RequestPermission/utils' -export { getRouteURLWithNoParam } from './utils' +export { getPermissionRequestURL, getPopupRouteURLWithNoParam } from '../../../shared/definitions/routes' diff --git a/packages/mask/src/extension/popups/utils/index.ts b/packages/mask/src/extension/popups/utils/index.ts deleted file mode 100644 index 86cec2aa3caa..000000000000 --- a/packages/mask/src/extension/popups/utils/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { PopupRoutes } from '@masknet/shared-base' -export function getRouteURLWithNoParam(kind: PopupRoutes) { - return browser.runtime.getURL(`/popups.html#${kind}`) -} diff --git a/packages/mask/src/extension/service.ts b/packages/mask/src/extension/service.ts index e3db8cef6552..75dd5978f845 100644 --- a/packages/mask/src/extension/service.ts +++ b/packages/mask/src/extension/service.ts @@ -28,7 +28,7 @@ export const Services = { Crypto: add(() => import('./background-script/CryptoService'), 'Crypto'), Identity: add(() => import('./background-script/IdentityService'), 'Identity'), Welcome: add(() => import('./background-script/WelcomeService'), 'Welcome'), - Helper: add(() => import('./background-script/HelperService'), 'Helper'), + Helper: add(() => import('../../background/services/helper'), 'Helper'), Ethereum: add(() => import('./background-script/EthereumService'), 'Ethereum'), SocialNetwork: add(() => import('./background-script/SocialNetworkService'), 'SocialNetwork'), Settings: add(() => import('./background-script/SettingsService'), 'Settings'), @@ -47,7 +47,7 @@ if (process.env.manifest === '2' && import.meta.webpackHot && isEnvironment(Envi './background-script/CryptoService', './background-script/IdentityService', './background-script/WelcomeService', - './background-script/HelperService', + '../../background/services/helper', './background-script/EthereumService', './background-script/SettingsService', './background-script/ThirdPartyPlugin', diff --git a/packages/mask/src/plugins/Profile/services.ts b/packages/mask/src/plugins/Profile/services.ts index cb7c4b367c93..810fd057564d 100644 --- a/packages/mask/src/plugins/Profile/services.ts +++ b/packages/mask/src/plugins/Profile/services.ts @@ -1,5 +1,4 @@ import urlcat from 'urlcat' -import { fetchJSON } from '../../extension/background-script/HelperService' interface NameInfo { rnsName: string @@ -10,6 +9,6 @@ interface NameInfo { export async function getRSS3AddressById(id: string) { if (!id) return '' const url = urlcat('https://rss3.domains/name/:id', { id }) - const rsp = await fetchJSON(url) + const rsp = (await (await fetch(url)).json()) as NameInfo return rsp.address } diff --git a/packages/mask/src/plugins/Wallet/Worker/index.ts b/packages/mask/src/plugins/Wallet/Worker/index.ts index 7b14854a29ae..8f0e2e900147 100644 --- a/packages/mask/src/plugins/Wallet/Worker/index.ts +++ b/packages/mask/src/plugins/Wallet/Worker/index.ts @@ -1,9 +1,20 @@ import type { Plugin } from '@masknet/plugin-infra' import { base } from '@masknet/plugin-wallet' +import { MaskMessages } from '../../../utils' import '../messages' +import { isLocked } from '../services' const worker: Plugin.Worker.Definition = { ...base, - init(signal) {}, + init(signal) { + MaskMessages.events.wallet_is_locked.on( + async ([type]) => { + if (type === 'request') { + MaskMessages.events.wallet_is_locked.sendToLocal(['response', await isLocked()]) + } + }, + { signal }, + ) + }, } export default worker diff --git a/packages/mask/src/plugins/Wallet/services/cloud.ts b/packages/mask/src/plugins/Wallet/services/cloud.ts index 2947e4d072a1..9ee06cc19fe0 100644 --- a/packages/mask/src/plugins/Wallet/services/cloud.ts +++ b/packages/mask/src/plugins/Wallet/services/cloud.ts @@ -1,7 +1,4 @@ -import { - __deprecated__getStorage, - __deprecated__setStorage, -} from '../../../extension/background-script/HelperService/storage' +import { __deprecated__getStorage, __deprecated__setStorage } from '../../../../background/services/helper' const HOST_MAP = { production: 'https://backup.mask.io/api', diff --git a/packages/mask/src/plugins/Wallet/services/rpc.ts b/packages/mask/src/plugins/Wallet/services/rpc.ts index fd5fa59bd146..682a332d2aa8 100644 --- a/packages/mask/src/plugins/Wallet/services/rpc.ts +++ b/packages/mask/src/plugins/Wallet/services/rpc.ts @@ -3,7 +3,7 @@ import { WalletMessages } from '@masknet/plugin-wallet' import type { JsonRpcPayload } from 'web3-core-helpers' import { createTransaction } from '../../../../background/database/utils/openDB' import { createWalletDBAccess } from '../database/Wallet.db' -import { openPopupWindow } from '../../../extension/background-script/HelperService' +import { openPopupWindow } from '../../../../background/services/helper' const MAX_UNCONFIRMED_REQUESTS_SIZE = 1 const MAIN_RECORD_ID = '0' diff --git a/packages/mask/src/settings/settings.ts b/packages/mask/src/settings/settings.ts index ae35a9857532..05fe1fafef62 100644 --- a/packages/mask/src/settings/settings.ts +++ b/packages/mask/src/settings/settings.ts @@ -90,10 +90,6 @@ export const currentPersonaIdentifier = createGlobalSettings('currentPer primary: () => 'DO NOT DISPLAY IT IN UI', }) -export const currentPopupWindowId = createGlobalSettings('currentPopupWindowId', 0, { - primary: () => 'DO NOT DISPLAY IT IN UI', -}) - try { // Migrate language settings const lng: string = languageSettings.value diff --git a/packages/shared-base/src/Messages/Mask.ts b/packages/shared-base/src/Messages/Mask.ts index 46bd027f32ac..8b48ee0f613b 100644 --- a/packages/shared-base/src/Messages/Mask.ts +++ b/packages/shared-base/src/Messages/Mask.ts @@ -66,6 +66,8 @@ export interface MaskEvents extends MaskSettingsEvents, MaskMobileOnlyEvents, Ma maskSDKHotModuleReload: void __kv_backend_persistent__: [string, unknown] __kv_backend_in_memory__: [string, unknown] + /** @deprecated do not use it in new code. */ + wallet_is_locked: ['request'] | ['response', boolean] } export interface UpdateEvent {