add timeout for messaging

This commit is contained in:
2021-04-20 12:00:59 +08:00
parent 9cd25e3c1d
commit e0b0a5e986
2 changed files with 6 additions and 2 deletions

View File

@ -82,7 +82,7 @@ export async function ping(tab, count = 1) {
let checker: ResponseChecker<string> = (r, e, c) => let checker: ResponseChecker<string> = (r, e, c) =>
r.result == "pong" ? r.result : undefined; r.result == "pong" ? r.result : undefined;
let pong = await sendMessage<string>(tab, req, 'Check tab availability...', checker, 1000, count).catch(() => { }); let pong = await sendMessage<string>(tab, req, 'Check tab availability...', checker, 1000, 1000, count).catch(() => { });
return pong == "pong"; return pong == "pong";
} }

View File

@ -21,12 +21,14 @@ export type ResponseChecker<T> = ResponseCheckerSync<T> | ResponseCheckerAsync<T
*/ */
export function sendMessage<T>( export function sendMessage<T>(
tab: chrome.tabs.Tab, tab: chrome.tabs.Tab,
req, req: Request,
log?: string, log?: string,
dataChecker?: ResponseChecker<T>, dataChecker?: ResponseChecker<T>,
timeout?: number,
interval?: number, interval?: number,
limit?: number limit?: number
) { ) {
timeout = timeout || 10;
interval = interval || 500; interval = interval || 500;
limit = isNaN(limit) ? 0 : limit; limit = isNaN(limit) ? 0 : limit;
let count = 0; let count = 0;
@ -47,7 +49,9 @@ export function sendMessage<T>(
return; return;
} }
count++; count++;
let timeout = setTimeout(() => { reject(`${Actions[req.action]} requset timeout after ${timeout}s`) }, 10000);
chrome.tabs.sendMessage(tab.id, req, async (r: Response<T>) => { chrome.tabs.sendMessage(tab.id, req, async (r: Response<T>) => {
clearTimeout(timeout);
// check error but do nothing until dataChecker. // check error but do nothing until dataChecker.
let err = chrome.runtime.lastError; let err = chrome.runtime.lastError;
let [result, error] = await checkResponse(dataChecker, r, err, count); let [result, error] = await checkResponse(dataChecker, r, err, count);