const { op_sleep_timeout } = Deno.core.ops;
const timeoutMap = new Map();
let nextTimeoutId = 1;
globalThis.setTimeout = function(callback, delay, ...args) {
const id = nextTimeoutId++;
const controller = { cancelled: false };
timeoutMap.set(id, controller);
(async () => {
try {
await op_sleep_timeout(delay);
const record = timeoutMap.get(id);
if (record && !record.cancelled) {
callback(...args);
}
} finally {
timeoutMap.delete(id);
}
})();
return id;
};
globalThis.clearTimeout = function(id) {
const record = timeoutMap.get(id);
if (record) {
record.cancelled = true;
timeoutMap.delete(id);
}
};