timerjobs
Version:
TimerJobs is a simple way to create recurring tasks that can react to events.
80 lines • 2.68 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Emitter = void 0;
const eventemitter2_1 = require("eventemitter2");
class Emitter {
constructor(timer, options) {
var _a, _b;
this.timer = timer;
this.options = options;
this.emitter = (_b = (_a = options.emitter) !== null && _a !== void 0 ? _a : Emitter.emitter) !== null && _b !== void 0 ? _b : new eventemitter2_1.EventEmitter2({ wildcard: true, delimiter: options.delimiter });
this.setupListeners();
}
emit(action, { error = null, args = [] } = {}) {
if (this.shouldEmit(this.options.emitLevel, error)) {
const event = this.buildEvent(action, this.options.emitLevel, error);
if (error) {
args.unshift(error);
}
this.emitter.emit.call(this.emitter, event, ...args);
}
}
shouldEmit(level, error) {
return Boolean(level) || Boolean(error);
}
buildEvent(event, level, error) {
const actualLevel = !level && error ? 1 : level;
return event + this.getLevel(actualLevel);
}
get levels() {
const { delimiter, namespace, reference } = this.options;
const levels = {
1: '',
2: delimiter + namespace,
3: delimiter + reference,
4: delimiter + namespace + delimiter + reference,
};
return levels;
}
getLevel(level) {
return this.levels[level];
}
setupListeners() {
this.startSetup();
this.stopSetup();
this.restartSetup();
}
startSetup() {
const { startOn, startCallback } = this.options;
if (startOn) {
this.emitter.on(startOn, (...rest) => {
if (this.timer.isStopped) {
this.timer.start();
startCallback.apply(this.options.context, rest);
}
});
}
}
restartSetup() {
const { restartOn, restartCallback } = this.options;
if (restartOn) {
this.emitter.on(restartOn, (...rest) => {
if (this.timer.hasStarted) {
this.timer.restart();
restartCallback.apply(this.options.context, rest);
}
});
}
}
stopSetup() {
const { stopOn, stopCallback } = this.options;
if (stopOn) {
this.emitter.on(stopOn, (...rest) => {
this.timer.stop();
stopCallback.apply(this.options.context, rest);
});
}
}
}
exports.Emitter = Emitter;
//# sourceMappingURL=emitter.js.map