2020-03-29 13:43:52 +00:00
|
|
|
import { TimeoutError } from '../error/TimeoutError';
|
2020-03-31 02:31:51 +00:00
|
|
|
import { PredicateC0 } from '.';
|
2020-03-29 13:43:52 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Resolve after a set amount of time.
|
|
|
|
*/
|
|
|
|
export function defer<T = undefined>(ms: number, val?: T): Promise<T> {
|
|
|
|
return new Promise((res, rej) => {
|
|
|
|
setTimeout(() => {
|
|
|
|
res(val);
|
|
|
|
}, ms);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reject after a set amount of time if the original promise has not yet resolved.
|
|
|
|
*/
|
|
|
|
export function timeout<T>(ms: number, oper: Promise<T>): Promise<T> {
|
|
|
|
const limit = new Promise<T>((res, rej) => {
|
|
|
|
setTimeout(() => {
|
|
|
|
rej(new TimeoutError());
|
|
|
|
}, ms);
|
|
|
|
});
|
|
|
|
|
|
|
|
return Promise.race([limit, oper]);
|
|
|
|
}
|
|
|
|
|
2020-03-31 02:31:51 +00:00
|
|
|
export async function waitFor(cb: PredicateC0, step: number, count: number): Promise<void> {
|
2020-03-29 13:43:52 +00:00
|
|
|
let accum = 0;
|
|
|
|
while (accum < count) {
|
|
|
|
await defer(step);
|
|
|
|
if (cb()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
accum += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
throw new TimeoutError();
|
|
|
|
}
|