import * as plugins from './smarttime.plugins'; import { CronJob } from './smarttime.classes.cronjob'; export class CronManager { public executionTimeout: plugins.smartdelay.Timeout; public status: 'started' | 'stopped' = 'stopped'; public cronjobs = new plugins.lik.ObjectMap(); constructor() {} public addCronjob(cronIdentifierArg: string, cronFunctionArg: () => any) { const newCronJob = new CronJob(this, cronIdentifierArg, cronFunctionArg); this.cronjobs.add(newCronJob); if (this.status === 'started') { newCronJob.start(); } return newCronJob; } public removeCronjob(cronjobArg: CronJob) { cronjobArg.stop(); this.cronjobs.remove(cronjobArg); } /** * starts the cronjob */ public start() { if (this.status !== 'started') { this.status = 'started'; for (const cronJob of this.cronjobs.getArray()) { cronJob.start(); } this.executionTimeout = new plugins.smartdelay.Timeout(0); // recursion const runCheckExecution = () => { console.log( `Next CronJob scheduled in ${this.executionTimeout.getTimeLeft()} milliseconds` ); this.executionTimeout.promise.then(() => { let timeToNextOverallExecution: number; for (const cronJob of this.cronjobs.getArray()) { const timeToNextJobExecution = cronJob.checkExecution(); if ( timeToNextJobExecution < timeToNextOverallExecution || !timeToNextOverallExecution ) { timeToNextOverallExecution = timeToNextJobExecution; } } this.executionTimeout = new plugins.smartdelay.Timeout(timeToNextOverallExecution); runCheckExecution(); }); }; runCheckExecution(); } } /** * stops all cronjobs */ public stop() { this.status = 'stopped'; this.executionTimeout.cancel(); for (const cron of this.cronjobs.getArray()) { cron.stop(); } } }