Spaces:
Sleeping
Sleeping
| ; | |
| // From https://github.com/sindresorhus/random-int/blob/c37741b56f76b9160b0b63dae4e9c64875128146/index.js#L13-L15 | |
| const randomInteger = (minimum, maximum) => Math.floor((Math.random() * (maximum - minimum + 1)) + minimum); | |
| const createAbortError = () => { | |
| const error = new Error('Delay aborted'); | |
| error.name = 'AbortError'; | |
| return error; | |
| }; | |
| const createDelay = ({clearTimeout: defaultClear, setTimeout: set, willResolve}) => (ms, {value, signal} = {}) => { | |
| if (signal && signal.aborted) { | |
| return Promise.reject(createAbortError()); | |
| } | |
| let timeoutId; | |
| let settle; | |
| let rejectFn; | |
| const clear = defaultClear || clearTimeout; | |
| const signalListener = () => { | |
| clear(timeoutId); | |
| rejectFn(createAbortError()); | |
| }; | |
| const cleanup = () => { | |
| if (signal) { | |
| signal.removeEventListener('abort', signalListener); | |
| } | |
| }; | |
| const delayPromise = new Promise((resolve, reject) => { | |
| settle = () => { | |
| cleanup(); | |
| if (willResolve) { | |
| resolve(value); | |
| } else { | |
| reject(value); | |
| } | |
| }; | |
| rejectFn = reject; | |
| timeoutId = (set || setTimeout)(settle, ms); | |
| }); | |
| if (signal) { | |
| signal.addEventListener('abort', signalListener, {once: true}); | |
| } | |
| delayPromise.clear = () => { | |
| clear(timeoutId); | |
| timeoutId = null; | |
| settle(); | |
| }; | |
| return delayPromise; | |
| }; | |
| const createWithTimers = clearAndSet => { | |
| const delay = createDelay({...clearAndSet, willResolve: true}); | |
| delay.reject = createDelay({...clearAndSet, willResolve: false}); | |
| delay.range = (minimum, maximum, options) => delay(randomInteger(minimum, maximum), options); | |
| return delay; | |
| }; | |
| const delay = createWithTimers(); | |
| delay.createWithTimers = createWithTimers; | |
| module.exports = delay; | |
| // TODO: Remove this for the next major release | |
| module.exports.default = delay; | |