From e0b0a5e986bfd7002ebcb8dd2904feeac1ce8499 Mon Sep 17 00:00:00 2001 From: jebbs Date: Tue, 20 Apr 2021 12:00:59 +0800 Subject: [PATCH] add timeout for messaging --- src/background/actions.ts | 2 +- src/background/messaging.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/background/actions.ts b/src/background/actions.ts index 70d5226..270a60d 100644 --- a/src/background/actions.ts +++ b/src/background/actions.ts @@ -82,7 +82,7 @@ export async function ping(tab, count = 1) { let checker: ResponseChecker = (r, e, c) => r.result == "pong" ? r.result : undefined; - let pong = await sendMessage(tab, req, 'Check tab availability...', checker, 1000, count).catch(() => { }); + let pong = await sendMessage(tab, req, 'Check tab availability...', checker, 1000, 1000, count).catch(() => { }); return pong == "pong"; } diff --git a/src/background/messaging.ts b/src/background/messaging.ts index 06b7eaa..447ff8c 100644 --- a/src/background/messaging.ts +++ b/src/background/messaging.ts @@ -21,12 +21,14 @@ export type ResponseChecker = ResponseCheckerSync | ResponseCheckerAsync( tab: chrome.tabs.Tab, - req, + req: Request, log?: string, dataChecker?: ResponseChecker, + timeout?: number, interval?: number, limit?: number ) { + timeout = timeout || 10; interval = interval || 500; limit = isNaN(limit) ? 0 : limit; let count = 0; @@ -47,7 +49,9 @@ export function sendMessage( return; } count++; + let timeout = setTimeout(() => { reject(`${Actions[req.action]} requset timeout after ${timeout}s`) }, 10000); chrome.tabs.sendMessage(tab.id, req, async (r: Response) => { + clearTimeout(timeout); // check error but do nothing until dataChecker. let err = chrome.runtime.lastError; let [result, error] = await checkResponse(dataChecker, r, err, count);