UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

356 lines 24.9 kB
"use strict"; /** * Scheduler - Stream coalgebra for managing async operations and animations * Following coalgebraic principles for time-evolving systems */ Object.defineProperty(exports, "__esModule", { value: true }); exports.throttle = exports.debounce = exports.animate = exports.idle = exports.nextFrame = exports.delay = exports.cancel = exports.schedule = exports.getGlobalScheduler = exports.scheduler = exports.Priority = void 0; const signal_1 = require("../core/signal"); // Task priority levels var Priority; (function (Priority) { Priority[Priority["IMMEDIATE"] = 0] = "IMMEDIATE"; Priority[Priority["HIGH"] = 1] = "HIGH"; Priority[Priority["NORMAL"] = 2] = "NORMAL"; Priority[Priority["LOW"] = 3] = "LOW"; Priority[Priority["IDLE"] = 4] = "IDLE"; })(Priority || (exports.Priority = Priority = {})); // Task queue implementation with priority class TaskQueue { constructor() { this.queues = new Map(); this.taskMap = new Map(); // Initialize priority queues Object.values(Priority).forEach((priority) => { if (typeof priority === 'number') { this.queues.set(priority, []); } }); } enqueue(task) { const queue = this.queues.get(task.priority); if (queue) { queue.push(task); this.taskMap.set(task.id, task); } } dequeue() { // Process tasks by priority (lower number = higher priority) for (const priority of [ Priority.IMMEDIATE, Priority.HIGH, Priority.NORMAL, Priority.LOW, Priority.IDLE, ]) { const queue = this.queues.get(priority); if (queue && queue.length > 0) { const task = queue.shift(); this.taskMap.delete(task.id); return task; } } return null; } remove(taskId) { const task = this.taskMap.get(taskId); if (!task) return false; const queue = this.queues.get(task.priority); if (queue) { const index = queue.findIndex((t) => t.id === taskId); if (index !== -1) { queue.splice(index, 1); this.taskMap.delete(taskId); return true; } } return false; } clear() { this.queues.forEach((queue) => (queue.length = 0)); this.taskMap.clear(); } get size() { return this.taskMap.size; } } // Main scheduler implementation const scheduler = () => { const taskQueue = new TaskQueue(); const delayedTasks = new Map(); // taskId -> timeoutId const repeatingTasks = new Map(); // taskId -> repeat info let isRunning = false; let animationFrameId = null; let completedCount = 0; let failedCount = 0; const stateSignal = (0, signal_1.signal)({ running: false, taskCount: 0, completedTasks: 0, failedTasks: 0, }); const updateState = () => { stateSignal._set({ running: isRunning, taskCount: taskQueue.size + delayedTasks.size, completedTasks: completedCount, failedTasks: failedCount, }); }; const processTask = async (task) => { try { await task.execute(); completedCount++; // Handle repeating tasks if (task.repeat) { const repeatInfo = repeatingTasks.get(task.id); if (repeatInfo) { if (typeof task.repeat === 'number') { repeatInfo.remaining--; if (repeatInfo.remaining <= 0) { repeatingTasks.delete(task.id); return; } } // Reschedule the task if (task.delay) { const timeoutId = window.setTimeout(() => { delayedTasks.delete(task.id); taskQueue.enqueue(task); updateState(); }, task.delay); delayedTasks.set(task.id, timeoutId); } else { taskQueue.enqueue(task); } } } } catch (error) { console.error(`Task ${task.id} failed:`, error); failedCount++; // Cancel task if it has a cancel handler if (task.cancel) { try { task.cancel(); } catch (cancelError) { console.error(`Task ${task.id} cancel failed:`, cancelError); } } } updateState(); }; const tick = () => { if (!isRunning) return; const task = taskQueue.dequeue(); if (task) { processTask(task); } updateState(); if (isRunning) { animationFrameId = requestAnimationFrame(tick); } }; const instance = { state: stateSignal, schedule: (task) => { const taskId = task.id || `task-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const taskWithId = { ...task, id: taskId }; // Handle repeating tasks if (task.repeat) { const remaining = typeof task.repeat === 'number' ? task.repeat : Infinity; repeatingTasks.set(taskId, { task: taskWithId, remaining }); } // Handle delayed tasks if (task.delay && task.delay > 0) { const timeoutId = window.setTimeout(() => { delayedTasks.delete(taskId); taskQueue.enqueue(taskWithId); updateState(); }, task.delay); delayedTasks.set(taskId, timeoutId); } else { taskQueue.enqueue(taskWithId); } updateState(); return taskId; }, cancel: (taskId) => { // Cancel delayed task const timeoutId = delayedTasks.get(taskId); if (timeoutId) { clearTimeout(timeoutId); delayedTasks.delete(taskId); repeatingTasks.delete(taskId); updateState(); return true; } // Cancel queued task const removed = taskQueue.remove(taskId); if (removed) { repeatingTasks.delete(taskId); updateState(); return true; } return false; }, start: () => { if (isRunning) return; isRunning = true; updateState(); tick(); }, stop: () => { if (!isRunning) return; isRunning = false; if (animationFrameId) { cancelAnimationFrame(animationFrameId); animationFrameId = null; } updateState(); }, clear: () => { // Cancel all delayed tasks delayedTasks.forEach((timeoutId) => clearTimeout(timeoutId)); delayedTasks.clear(); // Clear all queues taskQueue.clear(); repeatingTasks.clear(); // Reset counters completedCount = 0; failedCount = 0; updateState(); }, }; return instance; }; exports.scheduler = scheduler; // Global scheduler instance let globalScheduler = null; const getGlobalScheduler = () => { if (!globalScheduler) { globalScheduler = (0, exports.scheduler)(); globalScheduler.start(); // Auto-start global scheduler } return globalScheduler; }; exports.getGlobalScheduler = getGlobalScheduler; // Convenience functions using global scheduler const schedule = (task) => { const taskId = task.id || `task-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; return (0, exports.getGlobalScheduler)().schedule({ ...task, id: taskId }); }; exports.schedule = schedule; const cancel = (taskId) => { return (0, exports.getGlobalScheduler)().cancel(taskId); }; exports.cancel = cancel; const delay = (ms) => { return new Promise((resolve) => { (0, exports.schedule)({ priority: Priority.NORMAL, execute: resolve, delay: ms, }); }); }; exports.delay = delay; const nextFrame = () => { return new Promise((resolve) => { (0, exports.schedule)({ priority: Priority.HIGH, execute: resolve, }); }); }; exports.nextFrame = nextFrame; const idle = (callback) => { return (0, exports.schedule)({ priority: Priority.IDLE, execute: callback, }); }; exports.idle = idle; // Animation utilities const animate = (duration, callback, easing = (t) => t) => { const startTime = performance.now(); const taskId = (0, exports.schedule)({ priority: Priority.HIGH, repeat: true, execute: () => { const elapsed = performance.now() - startTime; const progress = Math.min(elapsed / duration, 1); const easedProgress = easing(progress); callback(easedProgress); if (progress >= 1) { (0, exports.cancel)(taskId); } }, }); return taskId; }; exports.animate = animate; // Debounce utility using scheduler const debounce = (fn, delay) => { let taskId = null; const debouncedFn = ((...args) => { if (taskId) { (0, exports.cancel)(taskId); } taskId = (0, exports.schedule)({ priority: Priority.NORMAL, delay, execute: () => fn(...args), }); }); debouncedFn.cancel = () => { if (taskId) { (0, exports.cancel)(taskId); taskId = null; } }; return debouncedFn; }; exports.debounce = debounce; // Throttle utility using scheduler const throttle = (fn, delay) => { let lastExecution = 0; let taskId = null; const throttledFn = ((...args) => { const now = performance.now(); const timeSinceLastExecution = now - lastExecution; if (timeSinceLastExecution >= delay) { lastExecution = now; fn(...args); } else if (!taskId) { const remainingDelay = delay - timeSinceLastExecution; taskId = (0, exports.schedule)({ priority: Priority.NORMAL, delay: remainingDelay, execute: () => { lastExecution = performance.now(); fn(...args); taskId = null; }, }); } }); throttledFn.cancel = () => { if (taskId) { (0, exports.cancel)(taskId); taskId = null; } }; return throttledFn; }; exports.throttle = throttle; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NoZWR1bGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDJDQUFnRDtBQUVoRCx1QkFBdUI7QUFDdkIsSUFBWSxRQU1YO0FBTkQsV0FBWSxRQUFRO0lBQ2xCLGlEQUFhLENBQUE7SUFDYix1Q0FBUSxDQUFBO0lBQ1IsMkNBQVUsQ0FBQTtJQUNWLHFDQUFPLENBQUE7SUFDUCx1Q0FBUSxDQUFBO0FBQ1YsQ0FBQyxFQU5XLFFBQVEsd0JBQVIsUUFBUSxRQU1uQjtBQThCRCwwQ0FBMEM7QUFDMUMsTUFBTSxTQUFTO0lBSWI7UUFIUSxXQUFNLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDMUMsWUFBTyxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRzdDLDZCQUE2QjtRQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzNDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVU7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxP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