UNPKG

@isaac-platform/isaac-integration-sdk

Version:

A Typescript SDK for integrating with ISAAC

60 lines (59 loc) 2.02 kB
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"); }); } }