@isaac-platform/isaac-integration-sdk
Version:
A Typescript SDK for integrating with ISAAC
60 lines (59 loc) • 2.02 kB
JavaScript
import { EventEmitter } from "events";
export class Heartbeat extends EventEmitter {
/**
* Creates ISAAC heartbeat handler.
* @param isaacConn {ISAACServer} - uses ISAAC request definitions.
*/
constructor(isaacConn) {
super();
this.isaacCore = isaacConn;
this.beating = false;
this.status = "uninitialized";
this.interval = 5000; //Default interval is 5 seconds.
}
/**
* Starts heartbeat process and updates status.
* @param interval {number} - (optional) override default 5000 ms interval
*/
start(interval) {
if (this.beating)
return; // Only one heartbeat running at a time.
this.intervalID = setInterval(this.beat.bind(this), interval || this.interval);
this.beating = true;
this.updateStatus("starting");
}
/**
* Stops heartbeat process and updates status.
*/
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
*/
updateStatus(state) {
if (this.status === state)
return;
this.status = state;
this.emit('heartbeatStatusChange', state);
console.log(`ISAAC Connection changed: ${state}`);
}
/**
* Makes async heartbeat PUT to ISAAC. Updates status to "connected" or "error" depending on acknowledgement from ISAAC.
* TODO: Implement ISAAC message bus.
*/
beat() {
this.isaacCore.isaacConn.putRequest(`subsystems/${this.isaacCore.isaacConn.subsystemID}/heartbeat`, {}).then((response) => {
console.log(response);
this.updateStatus("connected");
}).catch((error) => {
console.log(error);
this.updateStatus("error");
});
}
}