cozy-iiif
Version:
A developer-friendly collection of abstractions and utilities built on top of @iiif/presentation-3 and @iiif/parser
84 lines (59 loc) • 1.59 kB
text/typescript
import pThrottle from 'p-throttle';
interface ThrottleConfig {
limit: number;
interval: number;
}
interface ThrottledLoaderOpts {
callsPerSecond?: number;
}
const createThrottleManager = () => {
// Default config: 5 calls/second
let config: ThrottleConfig = {
limit: 5,
interval: 1000
};
let instance = pThrottle(config);
const getInstance = () => instance;
const setConfig = (updated: Partial<ThrottleConfig>) => {
config = {...config, ...updated };
instance = pThrottle(config);
}
const getConfig = () => ({ ...config });
return {
getInstance,
getConfig,
setConfig
};
}
// Singleton instance
const throttleManager = createThrottleManager();
const updateThrottleConfig = (opts?: Partial<ThrottleConfig>) => {
if (!opts) return;
const current = throttleManager.getConfig();
if (
(opts.limit && opts.limit !== current.limit) ||
(opts.interval && opts.interval !== current.interval)
) {
throttleManager.setConfig({ ...current, ...opts });
}
}
export const getThrottledLoader = (
opts?: ThrottledLoaderOpts
) => {
if (opts) {
const throttleOpts = {
limit: opts.callsPerSecond || 5,
interval: 1000
}
updateThrottleConfig(throttleOpts);
}
const throttle = throttleManager.getInstance();
const loadImage = throttle((url: string) => new Promise<HTMLImageElement>((resolve, reject) => {
const img = new Image();
img.crossOrigin = 'anonymous';
img.onload = () => resolve(img);
img.onerror = reject;
img.src = url;
}));
return { loadImage };
}