({
now, setTimer, clearTimer, triggerApply,
}: SchedulerRunnerDeps)
| 171 | } |
| 172 | |
| 173 | export const createSchedulerRunner = ({ |
| 174 | now, setTimer, clearTimer, triggerApply, |
| 175 | }: SchedulerRunnerDeps): SchedulerRunner => { |
| 176 | let timer: NodeJS.Timeout | null = null; |
| 177 | let armedFor: string | null = null; |
| 178 | |
| 179 | return { |
| 180 | arm: ({targetTag, scheduledFor}) => { |
| 181 | if (timer) { clearTimer(timer); timer = null; } |
| 182 | armedFor = targetTag; |
| 183 | const delay = Math.max(0, new Date(scheduledFor).getTime() - now().getTime()); |
| 184 | timer = setTimer(() => { |
| 185 | timer = null; |
| 186 | const tag = armedFor; |
| 187 | armedFor = null; |
| 188 | if (!tag) return; |
| 189 | // Discard promise — apply pipeline owns its own error reporting. |
| 190 | void triggerApply(tag); |
| 191 | }, delay); |
| 192 | }, |
| 193 | cancel: () => { |
| 194 | if (timer) { clearTimer(timer); timer = null; } |
| 195 | armedFor = null; |
| 196 | }, |
| 197 | }; |
| 198 | }; |
no test coverage detected