@oxog/delay
Version:
A comprehensive, zero-dependency delay/timeout utility library with advanced timing features
62 lines • 2.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.forDelay = forDelay;
exports.untilDelay = untilDelay;
exports.whileDelay = whileDelay;
const time_js_1 = require("../utils/time.js");
const delay_js_1 = require("./delay.js");
function forDelay(timeString, options) {
const ms = (0, time_js_1.parseTimeString)(timeString);
return (0, delay_js_1.createBasicDelay)(ms, options);
}
function untilDelay(target, options) {
if (typeof target === 'function') {
return conditionalDelay(target, options);
}
if (target instanceof Date) {
const ms = Math.max(0, target.getTime() - Date.now());
return (0, delay_js_1.createBasicDelay)(ms, options);
}
if (typeof target === 'string') {
const ms = (0, time_js_1.parseTimeUntil)(target);
return (0, delay_js_1.createBasicDelay)(ms, options);
}
throw new Error('Invalid target type for until delay');
}
function whileDelay(predicate, options) {
return conditionalDelay(() => !predicate(), options);
}
async function conditionalDelay(condition, options = {}) {
const checkInterval = 50; // Check every 50ms
const { signal } = options;
return new Promise((resolve, reject) => {
if (signal?.aborted) {
reject(new Error('Delay was aborted'));
return;
}
const check = () => {
if (signal?.aborted) {
reject(new Error('Delay was cancelled'));
return;
}
try {
if (condition()) {
resolve();
return;
}
}
catch (error) {
reject(error);
return;
}
setTimeout(check, checkInterval);
};
const handleAbort = () => {
reject(new Error('Delay was cancelled'));
};
signal?.addEventListener('abort', handleAbort);
// Start checking
check();
});
}
//# sourceMappingURL=parser.js.map