From 91784c9e8d6c0565d001f60d5969ea7618e4a61f Mon Sep 17 00:00:00 2001 From: eug-vs Date: Wed, 2 Dec 2020 03:09:53 +0300 Subject: feat: dynamically register handlers --- lib/scheduler.ts | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'lib/scheduler.ts') 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) => void; const CronJob = cron.CronJob; @@ -11,15 +13,21 @@ class Scheduler { job: cron.CronJob; jobs: cron.CronJob[]; Model: EventModel; + handlers: Record; constructor(model: EventModel, 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); } } } -- cgit v1.2.3