diff --git a/packages/std/src/set-interval/clock.ts b/packages/std/src/set-interval/clock.ts index e7813a7..a5dda40 100644 --- a/packages/std/src/set-interval/clock.ts +++ b/packages/std/src/set-interval/clock.ts @@ -6,21 +6,26 @@ export const setClockInterval = (func: (...args: any[]) => any, interval: number let clockTimer: ReturnType const timerId = Math.floor(Math.random() * 1e10) + // Normalize once so invalid/negative intervals don't leak into scheduling math. + const safeInterval = Number.isFinite(interval) ? Math.max(0, interval) : 0 const recurFunc = () => { func() - const realExecuteTime = new Date().getTime() - if (!start) { + const realExecuteTime = Date.now() + if (start == null) { start = realExecuteTime } - tick = tick || start + tick = tick ?? start + // Drift correction: keep long-term cadence close to target interval. const diff = realExecuteTime - tick - tick += interval + tick += safeInterval // Since setTimeout is not accurate, we need to adjust the interval + // Clamp negative delay to avoid Node/Electron TimeoutNegativeWarning. + const nextDelay = Math.max(0, safeInterval - diff) - clockTimer = setTimeout(recurFunc, interval - diff) + clockTimer = setTimeout(recurFunc, nextDelay) timerMap.set(timerId, clockTimer) }