UNPKG

@curium.rocks/scripted-emitter

Version:

A emitter that uses a script to emit predefined events on a given timeline

167 lines 4.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ScriptedEmitter = void 0; const data_emitter_base_1 = require("@curium.rocks/data-emitter-base"); /** * */ class ScriptedEmitter extends data_emitter_base_1.BaseEmitter { /** * * @param {string} id * @param {string} name * @param {string} description * @param {IScript} script * @param {LoggerFacade?} loggerFacade */ constructor(id, name, description, script, loggerFacade) { super(id, name, description, loggerFacade); this.script = script; this.counter = 0; } /** * */ next() { const evt = this.script.events[this.counter % this.script.events.length]; this.timeoutHandler = setTimeout(() => { this.tick(evt); this.counter++; setImmediate(() => { this.next(); }); }, evt.delayToEventMs); } /** * Start executing the script timeline */ start() { this.next(); } /** * Stop executing the script timeline */ stop() { if (this.timeoutHandler != null) { clearTimeout(this.timeoutHandler); this.timeoutHandler = undefined; } } /** * Execute the event * @param {IScriptedEvent} evt */ tick(evt) { if (evt.dataEvent) { this.notifyDataListeners(evt.dataEvent); this.lastDataEvent = evt.dataEvent; } if (evt.statusEvent) { this.notifyStatusListeners(evt.statusEvent); this.lastStatusEvent = evt.statusEvent; } } /** * * @param {ICommand} command * @return {Promise<IExecutionResult>} */ sendCommand(command) { const payload = command.payload; if (payload.commandType == null) { return Promise.resolve({ actionId: command.actionId, success: false, failureReason: 'missing required property commandType' }); } if (payload.commandType === 'start') { this.start(); return Promise.resolve({ actionId: command.actionId, success: true }); } if (payload.commandType === 'stop') { this.stop(); return Promise.resolve({ actionId: command.actionId, success: true }); } if (payload.commandType === 'script') { if (payload.script == null) { return Promise.resolve({ actionId: command.actionId, success: false, failureReason: 'missing required property script' }); } const script = payload.script; if (script == null) { return Promise.resolve({ actionId: command.actionId, success: false, failureReason: 'failed to marshal property script to IScript' }); } this.script = script; return Promise.resolve({ actionId: command.actionId, success: true }); } return Promise.resolve({ actionId: command.actionId, success: false, failureReason: 'unknown command' }); } /** * @return {Promise<IStatusEvent>} */ probeStatus() { if (this.lastStatusEvent) return Promise.resolve(this.lastStatusEvent); return Promise.reject(new Error('No status available yet')); } /** * @return {Promise<IDataEvent>} */ probeCurrentData() { if (this.lastDataEvent) return Promise.resolve(this.lastDataEvent); return Promise.reject(new Error('No data available yet')); } /** * @return {unknown} */ getMetaData() { return { script: this.script }; } /** * * @return {unknown} */ getEmitterProperties() { return this.getMetaData(); } /** * @return {string} */ getType() { return ScriptedEmitter.TYPE; } /** * */ dispose() { super.dispose(); this.stop(); } } exports.ScriptedEmitter = ScriptedEmitter; ScriptedEmitter.TYPE = 'SCRIPTED-EMITTER'; //# sourceMappingURL=scriptedEmitter.js.map