const defaultInterval = 100; const defaultTimeout = 2000; type Handler = () => void const sleep = (ms: number): Promise => { return new Promise(resolve => setTimeout(resolve, ms)); } const eventually = async ( fn: Handler, timeout = defaultTimeout, interval = defaultInterval, ): Promise => { const start = Date.now(); const loop = async() => { try { await fn(); } catch (err) { if (Date.now() - start > timeout) { throw err; } await sleep(interval); await loop(); } }; await loop(); }; export default eventually;