import { hubConnection } from "signalr-no-jquery"; import { EIOT_APP_MANAGER_HUBNAME, EIOT_APP_MANAGER_URL } from "../lib-constants/env.const"; class EIoTAppManagerService { //#region Initializations //#region Variables private proxy: any; private connection: any; private connState: Array = [ "Connecting", "Connected", "Reconnecting", "Disconnecting", "Disconnected", ]; private currConnState = 4; //#endregion Variables //#region Initializations //#region Public Methods async getServiceStatus() { return this.currConnState; } async getSignalRConn():Promise { const state = await this.getServiceStatus(); if (state === 1) { return await new Promise((resolve, reject) => this.connection .start() .done((conn: any) => resolve(this.proxy)) .fail((err: any) => reject(err)) ); } else { return await this.tryToConn().then(async (data:any) => { console.log("Returned => ", data); if(data===true) { return await new Promise((resolve, reject) => this.connection .start() .done((conn: any) => resolve(this.proxy)) .fail((err: any) => reject(err)) ); } else { console.log('Unable to connect Application Manager, Connection time..'); return setTimeout(async () => { console.log('Retrieve to connect Application Manager..'); return await this.getSignalRConn(); }, 1000); } }) } } getConnProxy(): any { return new Promise((resolve, reject) => this.connection .start() .done((conn: any) => resolve(this.proxy)) .fail((err: any) => reject(err)) ); } async tryToConn() { this.connection = hubConnection( EIOT_APP_MANAGER_URL ); this.proxy = this.connection.createHubProxy( EIOT_APP_MANAGER_HUBNAME ); this.proxy.on("_a", () => undefined); this.connection.stateChanged((t: any, u: any) => { this.currConnState = t.newState; console.info( "Application Manager state changed from: '" + this.connState[t.oldState] + "' to '" + this.connState[t.newState] + "'" ); }); this.connection.disconnected(() => { console.log('Unable to connect to Application Manager.'); }); for (let index = 0; index < 20; index++) { console.log('Trying to connect Application Manager - '+(index + 1)+'/20'); let res: any = false; res = await new Promise((resolve, reject) => setTimeout(async () => { this.connection.start() .done((conn: any) => resolve(true)) .fail((err: any) => resolve(false)) }, 500) ); if (res == true) { return res; } else { if (index == 19) return res; continue; } } } //#endregion Public Methods } export const eiotAppManagerService = new EIoTAppManagerService()