@isaac-platform/isaac-integration-sdk
Version:
A Typescript SDK for integrating with ISAAC
86 lines (85 loc) • 2.89 kB
JavaScript
import { EventEmitter } from "events";
import isaacConnection from "./controller/isaac";
export class Heartbeat extends EventEmitter {
/**
* Creates ISAAC heartbeat handler.
*/
constructor() {
super();
/**
* var status represents the connection to ISAAC
* can be one of:
* - uninitialized
* - starting
* - connected
* - disconnected
* - error
*/
this.status = "uninitialized";
/**
* Starts heartbeat process and updates status.
* @param interval {number} - (optional) override default 5000 ms interval
*/
this.start = (interval) => {
if (this.beating)
return; // Only one heartbeat running at a time.
this.intervalID = setInterval(this.beat, interval || this.interval);
this.beating = true;
this.updateStatus("starting");
};
/**
* Stops heartbeat process and updates status.
*/
this.stop = () => {
if (!this.beating)
return; // Can't stop if not running.
clearInterval(this.intervalID);
this.beating = false;
this.updateStatus("disconnected");
};
/**
* Updates the connection status and emits on a change.
* @param state {string} - New state to define and announce
*/
this.updateStatus = (state) => {
if (this.status === state)
return;
this.status = state;
this.emit('statusChange', state);
};
/**
* Emits heartbeat messages.
* @param messages
*/
this.emitHeartbeatMessages = (messages) => {
for (let message of messages) {
this.emit(message.type, message);
}
};
/**
* Makes async heartbeat PUT to ISAAC. Updates status to "connected" or "error" depending on acknowledgement from ISAAC.
* TODO: Implement ISAAC message bus.
*/
this.beat = () => {
isaacConnection.putRequest(`subsystems/${isaacConnection.subsystemID}/heartbeat`, {}).then((response) => {
this.updateStatus("connected");
if (response.message && response.message.length > 0)
this.emitHeartbeatMessages(response.message);
}).catch((error) => {
this.updateStatus("error");
});
};
this.beating = false;
this.status = "uninitialized";
this.interval = 5000; //Default interval is 5 seconds.
}
emit(event, ...args) {
return super.emit(event, ...args);
}
on(event, listener) {
return super.on(event, listener);
}
off(event, listener) {
return super.off(event, listener);
}
}