From ea78b7f59e48e3bfbabc20fbc6b60a2d21d31482 Mon Sep 17 00:00:00 2001 From: Brett Jia Date: Fri, 12 Jan 2024 12:10:31 -0500 Subject: [PATCH] core: fix scheduler (#1259) --- plugins/core/src/builtins/scheduler.ts | 42 +++++++++++++++----------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/plugins/core/src/builtins/scheduler.ts b/plugins/core/src/builtins/scheduler.ts index fa5f9e8e7..fc077f832 100644 --- a/plugins/core/src/builtins/scheduler.ts +++ b/plugins/core/src/builtins/scheduler.ts @@ -47,37 +47,45 @@ export class Scheduler { const day = future.getDay(); if (!days[day]) continue; - + source.log.i(`event will fire at ${future.toLocaleString()}`); return future; } source.log.w('event will never fire'); } - const when = reschedule(); - if (!when) { - return { - removeListener() { - } - } - } - - const delay = when.getTime() - Date.now(); - source.log.i(`event will fire in ${Math.round(delay / 60 / 1000)} minutes.`); - - let timeout = setTimeout(() => { - reschedule(); + let timeout: NodeJS.Timeout = null; + let when: Date = null; + function timerCb() { + timeout = null; + const prevWhen = when; + setupTimer(); callback(ret, { eventId: undefined, eventInterface: 'Scheduler', eventTime: Date.now(), - }, when) - }, delay); + }, prevWhen) + } + + function setupTimer() { + when = reschedule(); + if (when) { + const delay = when.getTime() - Date.now(); + source.log.i(`event will fire in ${Math.round(delay / 60 / 1000)} minutes.`); + timeout = setTimeout(timerCb, delay); + } + } + + setupTimer(); return { removeListener() { - clearTimeout(timeout); + if (timeout) { + clearTimeout(timeout); + } + timeout = null; + when = null; } } }