UNPKG

viem

Version:

TypeScript Interface for Ethereum

49 lines 1.81 kB
import { withResolvers } from './withResolvers.js'; const schedulerCache = /*#__PURE__*/ new Map(); /** @internal */ export function createBatchScheduler({ fn, id, shouldSplitBatch, wait = 0, sort, }) { const exec = async () => { const scheduler = getScheduler(); flush(); const args = scheduler.map(({ args }) => args); if (args.length === 0) return; fn(args) .then((data) => { if (sort && Array.isArray(data)) data.sort(sort); for (let i = 0; i < scheduler.length; i++) { const { resolve } = scheduler[i]; resolve?.([data[i], data]); } }) .catch((err) => { for (let i = 0; i < scheduler.length; i++) { const { reject } = scheduler[i]; reject?.(err); } }); }; const flush = () => schedulerCache.delete(id); const getBatchedArgs = () => getScheduler().map(({ args }) => args); const getScheduler = () => schedulerCache.get(id) || []; const setScheduler = (item) => schedulerCache.set(id, [...getScheduler(), item]); return { flush, async schedule(args) { const { promise, resolve, reject } = withResolvers(); const split = shouldSplitBatch?.([...getBatchedArgs(), args]); if (split) exec(); const hasActiveScheduler = getScheduler().length > 0; if (hasActiveScheduler) { setScheduler({ args, resolve, reject }); return promise; } setScheduler({ args, resolve, reject }); setTimeout(exec, wait); return promise; }, }; } //# sourceMappingURL=createBatchScheduler.js.map