@oxog/delay
Version:
A comprehensive, zero-dependency delay/timeout utility library with advanced timing features
142 lines • 5.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.nextFrame = nextFrame;
exports.nextFrames = nextFrames;
exports.idle = idle;
exports.waitForDOMReady = waitForDOMReady;
exports.waitForWindowLoad = waitForWindowLoad;
exports.waitForVisibilityChange = waitForVisibilityChange;
exports.createFrameBasedDelay = createFrameBasedDelay;
exports.createIdleDelay = createIdleDelay;
exports.isRequestAnimationFrameAvailable = isRequestAnimationFrameAvailable;
exports.isRequestIdleCallbackAvailable = isRequestIdleCallbackAvailable;
exports.getEnvironmentCapabilities = getEnvironmentCapabilities;
const index_js_1 = require("../types/index.js");
function nextFrame() {
if (typeof requestAnimationFrame === 'undefined') {
throw new index_js_1.DelayError('requestAnimationFrame is not available in this environment', index_js_1.DelayErrorCode.UNSUPPORTED_ENVIRONMENT, { feature: 'requestAnimationFrame' });
}
return new Promise((resolve) => {
requestAnimationFrame(resolve);
});
}
function nextFrames(count) {
if (count <= 0) {
throw new index_js_1.DelayError('Frame count must be positive', index_js_1.DelayErrorCode.INVALID_OPTIONS, { count });
}
if (count === 1) {
return nextFrame();
}
return new Promise((resolve) => {
let remaining = count;
const tick = (timestamp) => {
remaining--;
if (remaining <= 0) {
resolve(timestamp);
}
else {
requestAnimationFrame(tick);
}
};
requestAnimationFrame(tick);
});
}
function idle(options = {}) {
if (typeof requestIdleCallback === 'undefined') {
// Fallback for environments without requestIdleCallback
return new Promise((resolve) => {
setTimeout(() => {
resolve({
didTimeout: false,
timeRemaining() {
return 50; // Assume 50ms remaining
},
});
}, 0);
});
}
return new Promise((resolve, reject) => {
const id = requestIdleCallback(resolve, options);
// Optional timeout handling
if (options.timeout) {
setTimeout(() => {
if (typeof cancelIdleCallback !== 'undefined') {
cancelIdleCallback(id);
}
reject(new index_js_1.DelayError(`Idle callback timed out after ${options.timeout}ms`, index_js_1.DelayErrorCode.TIMEOUT, { timeout: options.timeout }));
}, options.timeout);
}
});
}
function waitForDOMReady() {
if (typeof document === 'undefined') {
throw new index_js_1.DelayError('DOM is not available in this environment', index_js_1.DelayErrorCode.UNSUPPORTED_ENVIRONMENT, { feature: 'document' });
}
if (document.readyState === 'complete' || document.readyState === 'interactive') {
return Promise.resolve();
}
return new Promise((resolve) => {
const handler = () => {
document.removeEventListener('DOMContentLoaded', handler);
resolve();
};
document.addEventListener('DOMContentLoaded', handler);
});
}
function waitForWindowLoad() {
if (typeof window === 'undefined') {
throw new index_js_1.DelayError('Window is not available in this environment', index_js_1.DelayErrorCode.UNSUPPORTED_ENVIRONMENT, { feature: 'window' });
}
if (document.readyState === 'complete') {
return Promise.resolve();
}
return new Promise((resolve) => {
const handler = () => {
window.removeEventListener('load', handler);
resolve();
};
window.addEventListener('load', handler);
});
}
function waitForVisibilityChange(visible) {
if (typeof document === 'undefined') {
throw new index_js_1.DelayError('Document is not available in this environment', index_js_1.DelayErrorCode.UNSUPPORTED_ENVIRONMENT, { feature: 'document' });
}
// Check current state
const isCurrentlyVisible = !document.hidden;
if (isCurrentlyVisible === visible) {
return Promise.resolve();
}
return new Promise((resolve) => {
const handler = () => {
const isVisible = !document.hidden;
if (isVisible === visible) {
document.removeEventListener('visibilitychange', handler);
resolve();
}
};
document.addEventListener('visibilitychange', handler);
});
}
function createFrameBasedDelay(frames) {
return nextFrames(frames);
}
function createIdleDelay(maxWait = 5000) {
return idle({ timeout: maxWait });
}
function isRequestAnimationFrameAvailable() {
return typeof requestAnimationFrame !== 'undefined';
}
function isRequestIdleCallbackAvailable() {
return typeof requestIdleCallback !== 'undefined';
}
function getEnvironmentCapabilities() {
return {
hasRequestAnimationFrame: isRequestAnimationFrameAvailable(),
hasRequestIdleCallback: isRequestIdleCallbackAvailable(),
hasPerformanceNow: typeof performance !== 'undefined' && !!performance.now,
hasDocument: typeof document !== 'undefined',
hasWindow: typeof window !== 'undefined',
};
}
//# sourceMappingURL=browser.js.map