@curium.rocks/scripted-emitter
Version:
A emitter that uses a script to emit predefined events on a given timeline
167 lines • 4.59 kB
JavaScript
"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