UNPKG

@isaac-platform/isaac-integration-sdk

Version:

A Typescript SDK for integrating with ISAAC

86 lines (85 loc) 2.89 kB
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); } }