I'm not sure if the Chrome extension runtime supports async / await syntax, but you can use a transporter (like Babel) to convert it, for example, to ES5. You can then define the wrapper function as follows:
function asChromeListener(listener) { return (message, sender, sendResponse) => { const returnValue = listener(message, sender); if (isPromise(returnValue)) { returnValue.then(sendResponse); return true; } else { if (typeof returnValue !== 'undefined') { sendResponse(returnValue); } return false; } }; } function isPromise(value) { return typeof value === 'object' && value !== null && 'then' in value && 'catch' in value; }
What you can use as:
chrome.runtime.onMessage.addListener(asChromeListener(async (message, sender) => { return await doMyAsyncWork(message); });
Since we use TypeScript , here is also a snippet that we actually use (with generic types).
export function asChromeListener<M, S, R extends Function>(listener: (message: M, sender: S) => any) { return (message: M, sender: S, sendResponse: R) => { const returnValue = listener(message, sender); if (isPromise(returnValue)) { returnValue.then(sendResponse); return true; } else { if (typeof returnValue !== 'undefined') { sendResponse(returnValue); } return false; } }; } function isPromise(value: any) { return typeof value === 'object' && value !== null && 'then' in value && 'catch' in value; }
source share