@lodestar/utils
Version:
Utilities required across multiple lodestar packages
64 lines • 1.96 kB
JavaScript
import { ErrorAborted, TimeoutError } from "./errors.js";
/**
* Wait for a condition to be true
*/
export function waitFor(condition, opts = {}) {
return new Promise((resolve, reject) => {
const { interval = 10, timeout = Infinity, signal } = opts;
if (signal?.aborted) {
return reject(new ErrorAborted());
}
if (condition()) {
return resolve();
}
let onDone = () => { };
const timeoutId = setTimeout(() => {
onDone();
reject(new TimeoutError());
}, timeout);
const intervalId = setInterval(() => {
if (condition()) {
onDone();
resolve();
}
}, interval);
const onAbort = () => {
onDone();
reject(new ErrorAborted());
};
if (signal)
signal.addEventListener("abort", onAbort);
onDone = () => {
clearTimeout(timeoutId);
clearInterval(intervalId);
if (signal)
signal.removeEventListener("abort", onAbort);
};
});
}
/**
* Create a tracker which keeps track of the last time a function was called
*
* @param durationMs
* @returns
*/
export function createElapsedTimeTracker({ minElapsedTime }) {
// Initialized with undefined as the function has not been called yet
let lastTimeCalled = undefined;
function elapsedTimeTracker() {
const now = Date.now();
const msSinceLastCall = now - (lastTimeCalled ?? 0);
if (msSinceLastCall > minElapsedTime) {
// Do not reset timer if called before timer elapsed
lastTimeCalled = now;
return true;
}
return false;
}
return Object.assign(elapsedTimeTracker, {
get msSinceLastCall() {
return Date.now() - (lastTimeCalled ?? 0);
},
});
}
//# sourceMappingURL=waitFor.js.map