'use strict'; const STRATEGY = Symbol('strategy'); const STRATEGY_INSTANCE = Symbol('strategy_instance'); const loadSchedule = require('./load_schedule'); module.exports = class Schedule { constructor(agent) { this.agent = agent; this.logger = agent.getLogger('scheduleLogger'); this[STRATEGY] = new Map(); this[STRATEGY_INSTANCE] = new Map(); this.closed = false; } /** * register a custom Schedule Strategy * @param {String} type - strategy type * @param {Strategy} clz - Strategy class */ use(type, clz) { this[STRATEGY].set(type, clz); } /** * load all schedule jobs, then initialize and register speical strategy */ init() { const scheduleItems = loadSchedule(this.agent); for (const k of Object.keys(scheduleItems)) { const { key, schedule } = scheduleItems[k]; const type = schedule.type; if (schedule.disable) continue; // find speical Strategy const Strategy = this[STRATEGY].get(type); if (!Strategy) { const err = new Error(`schedule type [${type}] is not defined`); err.name = 'EggScheduleError'; throw err; } // Initialize strategy and register const instance = new Strategy(schedule, this.agent, key); this[STRATEGY_INSTANCE].set(key, instance); } } /** * job finish event handler * * @param {Object} info - { key, success, message } */ onJobFinish(info) { this.logger.debug(`[Job#${info.id}] ${info.key} finish event received by agent from worker#${info.workerId}`); const instance = this[STRATEGY_INSTANCE].get(info.key); /* istanbul ignore else */ if (instance) { instance.onJobFinish(info); } } /** * start schedule */ start() { this.closed = false; for (const instance of this[STRATEGY_INSTANCE].values()) { instance.start(); } } close() { this.closed = true; } };