code optimize
This commit is contained in:
@ -50,40 +50,18 @@ export function sendMessage<T>(
|
||||
chrome.tabs.sendMessage(tab.id, req, async (r: Response<T>) => {
|
||||
// check error but do nothing until dataChecker.
|
||||
let err = chrome.runtime.lastError;
|
||||
let result: T;
|
||||
// r could be undefined if the content script is interrupted.
|
||||
if (r) {
|
||||
result = r.result;
|
||||
|
||||
if (dataChecker) {
|
||||
let pms: T | Promise<T>;
|
||||
try {
|
||||
pms = dataChecker(r, err, count);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
// don't catch if it's not a Promise
|
||||
if (pms instanceof Promise) {
|
||||
let checkerError: any;
|
||||
pms = pms.catch(e => checkerError = e);
|
||||
result = await pms;
|
||||
if (checkerError) {
|
||||
reject(checkerError);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
result = pms;
|
||||
}
|
||||
}
|
||||
let [result, error] = await checkResponse(dataChecker, r, err, count);
|
||||
if (error) {
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
|
||||
let flag = result !== undefined && result !== null;
|
||||
let flag = result !== undefined;
|
||||
if (log) logger.info(log, flag ? '(OK)' : '(failed)');
|
||||
if (flag) {
|
||||
resolve(result);
|
||||
} else {
|
||||
setTimeout(() => {
|
||||
logger.debug('Invalid response', r, 'retry...');
|
||||
loop();
|
||||
}, interval);
|
||||
}
|
||||
@ -92,6 +70,39 @@ export function sendMessage<T>(
|
||||
});
|
||||
}
|
||||
|
||||
async function checkResponse<T>(
|
||||
dataChecker: ResponseChecker<T>,
|
||||
response: Response<T>,
|
||||
error: chrome.runtime.LastError,
|
||||
tryCount: number
|
||||
): Promise<[T, string]> {
|
||||
// response could be undefined if the content script is interrupted.
|
||||
// don't check, tell sendMessage to retry.
|
||||
if (!response) return [undefined, undefined];
|
||||
if (!dataChecker) {
|
||||
return [response.result, response.error];
|
||||
}
|
||||
let result: T;
|
||||
let pms: T | Promise<T>;
|
||||
try {
|
||||
pms = dataChecker(response, error, tryCount);
|
||||
} catch (err) {
|
||||
return [undefined, err];
|
||||
}
|
||||
// don't catch if it's not a Promise
|
||||
if (pms instanceof Promise) {
|
||||
let checkerError: any;
|
||||
pms = pms.catch(e => checkerError = e);
|
||||
result = await pms;
|
||||
if (checkerError) {
|
||||
return [undefined, checkerError];
|
||||
}
|
||||
} else {
|
||||
result = pms;
|
||||
}
|
||||
return [result, undefined];
|
||||
}
|
||||
|
||||
export type ActionSubscriberSync = (request: Request, sender: chrome.runtime.MessageSender, sendResponse: (response?: any) => void) => void;
|
||||
export type ActionSubscriberAsync = (request: Request, sender: chrome.runtime.MessageSender, sendResponse: (response?: any) => void) => Promise<void>;
|
||||
export type ActionSubscriber = ActionSubscriberSync | ActionSubscriberAsync;
|
||||
|
||||
Reference in New Issue
Block a user