aboutsummaryrefslogtreecommitdiff
path: root/lib/scheduler.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/scheduler.ts')
-rw-r--r--lib/scheduler.ts27
1 files changed, 19 insertions, 8 deletions
diff --git a/lib/scheduler.ts b/lib/scheduler.ts
index 1d52c35..064daa8 100644
--- a/lib/scheduler.ts
+++ b/lib/scheduler.ts
@@ -1,6 +1,8 @@
import cron from 'cron';
import Bluebird from 'bluebird';
-import { EventModel } from './event.model';
+import { EventModel, Event } from './event.model';
+
+export type Handler = (event: Event<any>) => void;
const CronJob = cron.CronJob;
@@ -11,15 +13,21 @@ class Scheduler {
job: cron.CronJob;
jobs: cron.CronJob[];
Model: EventModel<any>;
+ handlers: Record<string, Handler>;
constructor(model: EventModel<any>, pollingInterval = defaultPollingInterval) {
this.Model = model;
this.jobs = [];
+ this.handlers = {};
this.job = new CronJob(pollingInterval, () => this.updateJobs());
this.startPolling();
}
+ registerHandler(name: string, handler: Handler) {
+ this.handlers[name] = handler;
+ }
+
startPolling() {
this.job.start();
}
@@ -61,16 +69,19 @@ class Scheduler {
async run(id: string) {
const event = await this.Model.findById(id);
- // TODO: handle the case when event is deleted
- if (!event) return;
+ if (!event) return console.log('WARNING: locked event does not exist');
try {
- event.start();
- // TODO: put actual handler here
- await new Promise(res => setTimeout(res, 5000));
- return event.complete();
+ const handleEvent = this.handlers[event.type];
+
+ if (handleEvent) {
+ event.start();
+ await handleEvent(event);
+ return event.complete();
+ } else throw new Error('No handler found')
+
} catch (error) {
- event.fail(error);
+ return event.fail(error);
}
}
}