diff --git a/packages/extension-base/src/background/handlers/Tabs.ts b/packages/extension-base/src/background/handlers/Tabs.ts index 6dd6b672bee..745fd59808a 100644 --- a/packages/extension-base/src/background/handlers/Tabs.ts +++ b/packages/extension-base/src/background/handlers/Tabs.ts @@ -176,8 +176,6 @@ export default class Tabs { return this.redirectIfPhishing(url); } - // Todo: MV3 fix connect dapps with chains requests - switch (type) { case 'pub(authorize.tab)': return this.authorize(url, request as RequestAuthorizeTab); diff --git a/packages/extension-base/src/koni/background/handlers/Tabs.ts b/packages/extension-base/src/koni/background/handlers/Tabs.ts index ed5f865a12c..8824e073218 100644 --- a/packages/extension-base/src/koni/background/handlers/Tabs.ts +++ b/packages/extension-base/src/koni/background/handlers/Tabs.ts @@ -1044,6 +1044,9 @@ export default class KoniTabs { return this.redirectIfPhishing(url); } + // Wait for account ready and chain ready + await Promise.all([this.#koniState.eventService.waitAccountReady, this.#koniState.eventService.waitChainReady]); + if (type !== 'pub(authorize.tabV2)' && !this.isEvmPublicRequest(type, request as RequestArguments)) { await this.#koniState.ensureUrlAuthorizedV2(url) .catch((e: Error) => { diff --git a/packages/extension-base/src/koni/background/handlers/index.ts b/packages/extension-base/src/koni/background/handlers/index.ts index 8a924120d77..3f69852ad82 100644 --- a/packages/extension-base/src/koni/background/handlers/index.ts +++ b/packages/extension-base/src/koni/background/handlers/index.ts @@ -19,26 +19,6 @@ export const tabs = new KoniTabs(state); export const mobile = new Mobile(state); export const nftHandler = new NftHandler(); -// Migration -// async function makeSureStateReady () { -// const poll = (resolve: (value: unknown) => void) => { -// if (state.isReady()) { -// resolve(true); -// } else { -// console.log('Waiting for State is ready...'); -// setTimeout(() => poll(resolve), 400); -// } -// }; -// -// return new Promise(poll); -// } - -// makeSureStateReady().then(() => { -// const migration = new Migration(state); -// -// migration.run().catch((err) => console.warn(err)); -// }).catch((e) => console.warn(e)); - export default function handlers ({ id, message, request }: TransportRequestMessage, port: chrome.runtime.Port, extensionPortName = PORT_EXTENSION): void { const isMobile = port.name === PORT_MOBILE; const isExtension = port.name === extensionPortName; @@ -48,8 +28,6 @@ export default function handlers ({ id, messa : (sender.tab && sender.tab.url) || sender.url || ''; const source = `${from}: ${id}: ${message}`; - // console.log(` [in] ${source}`); // :: ${JSON.stringify(request)}`); - const promise = isMobile ? mobile.handle(id, message, request, port) : isExtension diff --git a/packages/extension-koni/src/helper/ActionHandler.ts b/packages/extension-koni/src/helper/ActionHandler.ts index 96e863cc895..b665f944dd2 100644 --- a/packages/extension-koni/src/helper/ActionHandler.ts +++ b/packages/extension-koni/src/helper/ActionHandler.ts @@ -15,6 +15,7 @@ export class ActionHandler { // Common handlers private waitStartHandler = createPromiseHandler<() => void>(); private waitInstallHandler = createPromiseHandler<(details: chrome.runtime.InstalledDetails) => void>(); + private waitActiveHandler = createPromiseHandler(); // Port handlers private portHandler?: HandlerMethod; @@ -26,8 +27,8 @@ export class ActionHandler { private waitFirstTrigger = createPromiseHandler(); public waitFirstActiveMessage = this.waitFirstTrigger.promise; - private wakeUpHandler?: () => void; - private sleepHandler?: () => void; + private wakeUpHandler?: () => Promise; + private sleepHandler?: () => Promise; private isActive = false; private sleepTimeout?: NodeJS.Timeout; @@ -72,11 +73,11 @@ export class ActionHandler { }).catch(console.error); } - setWakeUpHandler (handler: () => void): void { + setWakeUpHandler (handler: () => Promise): void { this.wakeUpHandler = handler; } - setSleepHandler (handler: () => void): void { + setSleepHandler (handler: () => Promise): void { this.sleepHandler = handler; } @@ -84,8 +85,15 @@ export class ActionHandler { return `${port.sender?.documentId || 'extension-popup'}`; } - private _onPortMessage (port: chrome.runtime.Port, data: TransportRequestMessage, portId: string): void { - if (!this.connectionMap[portId] && data?.message && data.message !== 'pub(phishing.redirectIfDenied)') { + private async _onPortMessage (port: chrome.runtime.Port, data: TransportRequestMessage, portId: string) { + // message and disconnect handlers + if (!this.portHandler) { + this.portHandler = await this.waitPortHandler.promise; + } + + const requireActive = data.message !== 'pub(phishing.redirectIfDenied)'; + + if (!this.connectionMap[portId] && data?.message && requireActive) { this.connectionMap[portId] = port.name; if (!this.firstTrigger) { @@ -101,23 +109,15 @@ export class ActionHandler { if (!this.isActive) { this.isActive = true; - this.wakeUpHandler && this.wakeUpHandler(); + this.wakeUpHandler && await this.wakeUpHandler(); + this.waitActiveHandler.resolve(true); } } - // message and disconnect handlers - const handlerPromise = this.waitPortHandler.promise; - - if (this.portHandler) { - this.portHandler(data, port); - } else { - handlerPromise.then((handler) => { - handler(data, port); - }).catch(console.error); - } + this.portHandler(data, port); } - private _onPortDisconnect (port: chrome.runtime.Port, portId: string): void { + private _onPortDisconnect (port: chrome.runtime.Port, portId: string) { if (this.connectionMap[portId]) { delete this.connectionMap[portId]; @@ -125,8 +125,10 @@ export class ActionHandler { if (Object.keys(this.connectionMap).length === 0) { this.sleepTimeout && clearTimeout(this.sleepTimeout); this.sleepTimeout = setTimeout(() => { + // Reset active status this.isActive = false; - this.sleepHandler && this.sleepHandler(); + this.waitActiveHandler = createPromiseHandler(); + this.sleepHandler && this.sleepHandler().catch(console.error); }, SLEEP_TIMEOUT); } } @@ -137,7 +139,7 @@ export class ActionHandler { const portId = this._getPortId(port); port.onMessage.addListener((data: TransportRequestMessage) => { - this._onPortMessage(port, data, portId); + this._onPortMessage(port, data, portId).catch(console.error); }); port.onDisconnect.addListener(() => {