Cooperative scheduler for the browser environment that provides time-slicing capabilities for JavaScript applications.
npx @tessl/cli install tessl/npm-scheduler@0.26.0Scheduler is a cooperative scheduling library for browser environments that provides time-slicing capabilities for JavaScript applications. It implements a priority-based task scheduler that can yield control back to the browser's main thread to maintain responsiveness during intensive computations.
npm install schedulerimport {
unstable_scheduleCallback,
unstable_cancelCallback,
unstable_runWithPriority,
unstable_ImmediatePriority,
unstable_UserBlockingPriority,
unstable_NormalPriority,
unstable_LowPriority,
unstable_IdlePriority
} from "scheduler";For CommonJS:
const {
unstable_scheduleCallback,
unstable_cancelCallback,
unstable_runWithPriority,
unstable_ImmediatePriority,
unstable_UserBlockingPriority,
unstable_NormalPriority,
unstable_LowPriority,
unstable_IdlePriority
} = require("scheduler");For testing environments:
import {
unstable_flushAll,
unstable_advanceTime,
reset
} from "scheduler/unstable_mock";For PostTask API environments:
import {
unstable_scheduleCallback,
unstable_cancelCallback,
unstable_runWithPriority,
unstable_getCurrentPriorityLevel,
unstable_next,
unstable_wrapCallback,
unstable_shouldYield,
unstable_requestPaint,
unstable_now,
unstable_forceFrameRate,
unstable_ImmediatePriority,
unstable_UserBlockingPriority,
unstable_NormalPriority,
unstable_LowPriority,
unstable_IdlePriority
} from "scheduler/unstable_post_task";Note: The PostTask implementation uses the browser's native scheduler.postTask() API when available and provides a more limited feature set compared to the main scheduler implementation. Profiling is not available (unstable_Profiling is null).
For React Native environments (imports from scheduler/index.native.js):
import {
unstable_scheduleCallback,
unstable_cancelCallback,
unstable_getCurrentPriorityLevel,
unstable_shouldYield,
unstable_requestPaint,
unstable_now,
unstable_ImmediatePriority,
unstable_UserBlockingPriority,
unstable_NormalPriority,
unstable_LowPriority,
unstable_IdlePriority
} from "scheduler";Note: In React Native, the following functions throw "Not implemented" errors:
unstable_next()unstable_runWithPriority()unstable_wrapCallback()unstable_forceFrameRate()Additionally, unstable_Profiling is null in React Native environments.
import {
unstable_scheduleCallback,
unstable_cancelCallback,
unstable_NormalPriority,
unstable_UserBlockingPriority
} from "scheduler";
// Schedule a task with normal priority
const task = unstable_scheduleCallback(unstable_NormalPriority, (didTimeout) => {
console.log("Task executed, timed out:", didTimeout);
// Return a continuation function if work is not complete
if (workRemaining) {
return (didTimeout) => {
// Continue work in next time slice
};
}
// Return null/undefined when work is complete
});
// Schedule high-priority task
const urgentTask = unstable_scheduleCallback(
unstable_UserBlockingPriority,
() => {
// Handle user interaction
updateUI();
}
);
// Cancel a task if needed
unstable_cancelCallback(task);Scheduler is built around several key components:
Essential functions for scheduling and managing tasks with priority-based execution.
function unstable_scheduleCallback(
priorityLevel: PriorityLevel,
callback: (didTimeout: boolean) => void | ((didTimeout: boolean) => void | null),
options?: { delay: number }
): Task;
function unstable_cancelCallback(task: Task): void;
function unstable_getCurrentPriorityLevel(): PriorityLevel;Functions for executing code with specific priority contexts and managing priority levels.
function unstable_runWithPriority<T>(
priorityLevel: PriorityLevel,
eventHandler: () => T
): T;
function unstable_next<T>(eventHandler: () => T): T;
function unstable_wrapCallback<T>(callback: T): T;Utilities for controlling when the scheduler yields control and managing frame rates.
function unstable_shouldYield(): boolean;
function unstable_now(): number;
function unstable_requestPaint(): void;
function unstable_forceFrameRate(fps: number): void;Mock scheduler functions specifically designed for testing environments and time control.
function unstable_flushAll(): void;
function unstable_flushExpired(): void;
function unstable_advanceTime(ms: number): void;
function reset(): void;Performance monitoring and event logging capabilities for development and debugging.
const unstable_Profiling: {
startLoggingProfilingEvents(): void;
stopLoggingProfilingEvents(): ArrayBuffer | null;
} | null;type PriorityLevel = 0 | 1 | 2 | 3 | 4 | 5;
interface Task {
id: number;
callback: ((didTimeout: boolean) => void | ((didTimeout: boolean) => void | null)) | null;
priorityLevel: PriorityLevel;
startTime: number;
expirationTime: number;
sortIndex: number;
isQueued?: boolean;
}
type Callback = (didTimeout: boolean) => void | Callback | null;const unstable_ImmediatePriority: 1; // Times out immediately
const unstable_UserBlockingPriority: 2; // Times out in 250ms
const unstable_NormalPriority: 3; // Times out in 5000ms (default)
const unstable_LowPriority: 4; // Times out in 10000ms
const unstable_IdlePriority: 5; // Never times out