All files / elabox-system.lib.nodejs EboxEvent.ts

78.95% Statements 15/19
0% Branches 0/3
75% Functions 6/8
78.95% Lines 15/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 951x           1x                                             1x 1x 1x 1x 1x   1x                     3x                 1x               2x       2x         1x       1x                                   1x
import { SYSTEM_PACKAGE, 
    BROADCAST_ACTION, 
    SUBSCRIBE_ACTION, 
    ELASTATUS_ENV,
    STATUSCHANGED_ACTION
} from "./constants"
const socketio = require( "socket.io-client")
 
export interface EventData {
    id: string          // action id
    packageId?: string       // package id can be ela.system
    data?: any               // any data attached to event
} 
 
/**
 * Class that facilitates event communication. Uses PUBSUB design pattern.
 * By default it will registers to ela.system or system package upon class initialization.
 * To use any specific package service so you can listen to its actions, 
 * you must first need to register to that specific package.
 */
 class EboxEvent {
    socket : any
    connected : boolean
 
    /**
     * Constructor
     * @param eboxHost Url path of Elabox event server 
     */
    constructor(eboxHost:string) {
        this.socket = socketio(eboxHost, {transports: ['websocket']})
        this.connected = false
        this.socket.on("connect", () => {
            this.connected = true
            this.subscribe(SYSTEM_PACKAGE)
        })
        this.socket.on("disconnected", () => {
            this.connected
        })
    }
 
    /**
     * Listens to other socket events
     * @param evnt Which event we will listen to
     * @param callback Function to be called once the event is fired
     */
    on(evnt:string, callback : (...args:any) => void) {
        this.socket.on(evnt, callback)
    }
    
    /**
     * listen to any specfic action. But you need to subscribe to specific package for its services
     * @param action Action which will listen to
     * @param callback Function to be called once an action was triggered
     */
    onAction(action: string, callback: (...args:any) => void) {
        this.on(action, callback)
    }
 
    /** 
     * listen to specific package for any of its event
     * @param packageId Which package we will listen to.
     */
    subscribe(packageId:string, callback?: (response:any) => void) {
        let data = {
            id: SUBSCRIBE_ACTION,
            data: packageId
        }
        this.socket.emit(SYSTEM_PACKAGE, data)
    }
 
    // use to broadcast action to specific package. if no package was defined, use system package
    broadcast(data : EventData, callback? : (response:any) => void) {
        let bdata = {
            id: BROADCAST_ACTION,
            data: JSON.stringify(data)
        }
        this.socket.emit(SYSTEM_PACKAGE,  bdata)
    }
 
    /**
     * Use to get the current system status.
     * @param callback Function to be called once status was returned. 
     * Theres any changes this will also be called if listentoChanges is true
     * @param listenToChanges True if callback will also called when theres changes with system status. 
     * False if only check the current status
     */
    getStatus(callback: (status: string) => {}, listenToChanges = true) {
        this.on(ELASTATUS_ENV, callback)
        if (listenToChanges) {
            this.onAction(STATUSCHANGED_ACTION, callback)
        }
    } 
}
 
export default EboxEvent