async function promiseFinally(fn, finalFn) { let result try { if (typeof fn === 'function') { result = await fn() } else { result = await fn } } finally { finalFn() } return result } export const timeout = function timeout(fn, ms, msg) { let timerId const warpPromise = promiseFinally(fn, () => clearTimeout(timerId)) const timerPromise = new Promise((resolve, reject) => { timerId = setTimeout(() => reject(new Error(msg)), ms) }) return Promise.race([warpPromise, timerPromise]) } export const waitFor = function waitFor(ms) { return new Promise(resolve => setTimeout(resolve, ms || 0)) }