UNPKG

@engie-group/ngx-gem-spaas

Version:

This library contains services, components, images and styles to provide a unified look and way-of-working throughout GEM SPaaS.

1 lines 18.3 kB
{"version":3,"file":"engie-group-ngx-gem-spaas-crossbar.mjs","sources":["../../../projects/ngx-gem-spaas/crossbar/src/_models/crossbar.model.ts","../../../projects/ngx-gem-spaas/crossbar/src/_services/crossbar.service.ts","../../../projects/ngx-gem-spaas/crossbar/src/crossbar-state/crossbar-state.component.ts","../../../projects/ngx-gem-spaas/crossbar/src/crossbar-state/crossbar-state.component.html","../../../projects/ngx-gem-spaas/crossbar/src/crossbar.module.ts","../../../projects/ngx-gem-spaas/crossbar/src/public-api.ts","../../../projects/ngx-gem-spaas/crossbar/src/engie-group-ngx-gem-spaas-crossbar.ts"],"sourcesContent":["import {DateTime} from \"luxon\";\r\n\r\nexport enum CrossbarStates {\r\n open = 'open',\r\n closed = 'closed',\r\n}\r\n\r\nexport class CrossbarResponseModel {\r\n data: any;\r\n received: string;\r\n topic: string = '';\r\n type: string = '';\r\n\r\n constructor(ts: string = '', topic: string = '') {\r\n this.received = ts || DateTime.now().toISO();\r\n this.topic = topic;\r\n }\r\n\r\n}\r\n\r\nexport class CrossbarSendModel {\r\n data: any;\r\n type: string = '';\r\n}\r\n\r\n/**\r\n * Crossbar configuration object to be provided via \"forRoot\" method.\r\n *\r\n * @property {string} xbarUrl the URL of your crossbar websocket server\r\n * @property {string[]} xbarTopics the list of topics to listen to on the crossbar websocket server\r\n * @property {string} xbarTopicsPrefix prefix to be added to all topics, usually indicating the environment.\r\n * For example, on the Cylon xbar server, prefixes 'cb.preprod' and 'cb.prod' are used. Leave empty if none.\r\n * @property {string} xbarUidPwd to provide a user-id and password for the xbar basic auth (in the form of \"ui:pwd\") [optional]\r\n */\r\nexport class CrossbarConfigModel {\r\n xbarTopics: string[] = [];\r\n xbarTopicsPrefix?: string = '';\r\n xbarUidPwd?: string = '';\r\n xbarUrl: string = '';\r\n\r\n constructor(props: any) {\r\n this.xbarTopics = props.xbarTopics || [];\r\n this.xbarTopicsPrefix = props.xbarTopicsPrefix || '';\r\n this.xbarUidPwd = props.xbarUidPwd || '';\r\n this.xbarUrl = props.xbarUrl || '';\r\n }\r\n\r\n\r\n}\r\n","// @ts-ignore\r\nimport * as autobahn from 'autobahn-browser';\r\nimport {Inject, Injectable, Optional} from '@angular/core';\r\nimport {CrossbarConfigModel, CrossbarResponseModel, CrossbarSendModel, CrossbarStates} from \"../_models/crossbar.model\";\r\nimport {Observable, ReplaySubject} from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CrossbarService {\r\n\r\n crossbar: any;\r\n private crossbarMsg$ = new ReplaySubject<CrossbarResponseModel>(1);\r\n private crossbarState$ = new ReplaySubject<CrossbarStates>(1);\r\n private crossbarSession: any;\r\n\r\n constructor(\r\n @Optional() @Inject(CrossbarConfigModel) private readonly crossbarConfig: CrossbarConfigModel,\r\n ) {\r\n }\r\n\r\n // ********************************************************************************************************\r\n // AUTOBAHN\r\n // ********************************************************************************************************\r\n\r\n startConnection() {\r\n if (!this.crossbarConfig?.xbarUrl || !this.crossbarConfig?.xbarTopics?.length) {\r\n throw new Error(\r\n 'please provide a valid SpaasCrossbarConfigModel using the forRoot method of the SpaasCrossbarModule'\r\n );\r\n }\r\n // CONNECT\r\n this.crossbar = new autobahn.Connection({\r\n url: this.crossbarConfig.xbarUrl,\r\n realm: 'realm1',\r\n headers: {'Authorization': btoa(this.crossbarConfig.xbarUidPwd || 'none:none')}\r\n });\r\n this.crossbar.open();\r\n\r\n // CONNECT EVENTS\r\n this.crossbar.onopen = (session: any) => {\r\n // console.log('crossbar websocket opened');\r\n this.crossbarSession = session;\r\n const resp = new CrossbarResponseModel();\r\n resp.data = 'websocket connected successfully';\r\n resp.type = 'connected';\r\n this.crossbarConfig.xbarTopics.forEach((topic) =>\r\n this.subscribeToTopic(topic)\r\n );\r\n this.newWsMessage(resp);\r\n this.newWsState(CrossbarStates.open);\r\n };\r\n\r\n // CLOSE EVENT\r\n this.crossbar.onclose = (e: any) => {\r\n const resp = new CrossbarResponseModel();\r\n if (e.wasClean) {\r\n console.log('crossbar websocket closed');\r\n resp.data = 'websocket disconnected';\r\n resp.type = 'disconnected';\r\n } else {\r\n console.log('crossbar websocket closed due to error');\r\n // CLOSE WAS TRIGGERED BY AN ERROR (WS ERROR ALWAYS CALLS WS CLOSE)\r\n resp.data = JSON.stringify(e);\r\n resp.type = 'error';\r\n }\r\n this.newWsMessage(resp);\r\n this.newWsState(CrossbarStates.closed);\r\n };\r\n\r\n // HARD DISCONNECT FROM BROWSER\r\n return () => {\r\n if (this.crossbar) {\r\n this.crossbar.close();\r\n }\r\n };\r\n\r\n }\r\n\r\n subscribeToTopic(\r\n topic: string,\r\n ) {\r\n if (this.crossbarSession) {\r\n const topicString = this.crossbarConfig.xbarTopicsPrefix ? this.crossbarConfig.xbarTopicsPrefix + '.' + topic : topic;\r\n this.crossbarSession.subscribe(\r\n topicString,\r\n (args: any, kwargs: any, details: any) => this.onChannelUpdate(args, kwargs, details),\r\n );\r\n }\r\n }\r\n\r\n private onChannelUpdate(args: any[], kwargs: any, details: any) {\r\n const data = args[0];\r\n const resp = new CrossbarResponseModel();\r\n resp.data = data?.data || data;\r\n resp.topic = details.topic ? details.topic.replace(this.crossbarConfig.xbarTopicsPrefix + '.', '') : '';\r\n resp.type = data?.type || '';\r\n this.newWsMessage(resp);\r\n }\r\n\r\n stopConnection(): void {\r\n if (this.crossbar) {\r\n this.crossbar.close();\r\n }\r\n }\r\n\r\n sendMessage(topic: string, e: CrossbarSendModel, excludeMe = false): void {\r\n if (this.crossbarSession) {\r\n this.crossbarSession.publish(\r\n this.crossbarConfig.xbarTopicsPrefix ? this.crossbarConfig.xbarTopicsPrefix + '.' + topic : topic,\r\n [e],\r\n null,\r\n {exclude_me: excludeMe}\r\n );\r\n }\r\n }\r\n\r\n // ********************************************************************************************************\r\n // BROADCAST DATA\r\n // ********************************************************************************************************\r\n\r\n private newWsMessage(msg: CrossbarResponseModel) {\r\n this.crossbarMsg$.next(msg);\r\n }\r\n\r\n onNewWsMessage(): Observable<CrossbarResponseModel> {\r\n return this.crossbarMsg$.asObservable();\r\n }\r\n\r\n private newWsState(state: CrossbarStates) {\r\n this.crossbarState$.next(state);\r\n }\r\n\r\n onNewWsState(): Observable<CrossbarStates> {\r\n return this.crossbarState$.asObservable();\r\n }\r\n\r\n}\r\n","import {Component, HostListener, input, OnDestroy, OnInit, output} from '@angular/core';\r\nimport {CrossbarService} from \"../_services/crossbar.service\";\r\nimport {BaseComponent} from \"@engie-group/ngx-gem-spaas\";\r\nimport {CrossbarStates} from \"../_models/crossbar.model\";\r\n\r\n@Component({\r\n selector: 'spaas-crossbar',\r\n styleUrls: ['./crossbar-state.component.scss'],\r\n templateUrl: './crossbar-state.component.html',\r\n standalone: false\r\n})\r\n\r\n/**\r\n * This component creates the connection to the crossbar websocket server and\r\n * shows a state indicator in the bottom left corner of your app.\r\n * */\r\nexport class CrossbarStateComponent extends BaseComponent implements OnInit, OnDestroy {\r\n\r\n fromBottomPx = input(14);\r\n crossbarState = output<CrossbarStates>()\r\n\r\n crossbarActive = false;\r\n\r\n constructor(\r\n private crossbarService: CrossbarService,\r\n ) {\r\n super();\r\n }\r\n\r\n @HostListener('window:focus', ['$event']) onFocus(): void {\r\n // ALSO CHECK IF TAB IS VISIBLE\r\n if (document.visibilityState !== 'hidden') {\r\n this.crossbarConnect();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.crossbarConnect();\r\n }\r\n\r\n override ngOnDestroy() {\r\n this.crossbarService.stopConnection();\r\n super.ngOnDestroy();\r\n }\r\n\r\n\r\n // ********************************************************************************************************\r\n // LOADING DATA\r\n // ********************************************************************************************************\r\n\r\n private crossbarConnect(): void {\r\n if (\r\n !this.crossbarService.crossbar ||\r\n !this.crossbarService.crossbar.isConnected ||\r\n !this.crossbarService.crossbar.isOpen\r\n ) {\r\n this.wsCrossbarStateSubscribe();\r\n this.crossbarService.startConnection();\r\n } else {\r\n this.crossbarActive = true;\r\n }\r\n }\r\n\r\n private wsCrossbarStateSubscribe(): void {\r\n this.crossbarService.onNewWsState()\r\n .subscribe(\r\n (state) => {\r\n this.crossbarActive = state === CrossbarStates.open;\r\n this.crossbarState.emit(state);\r\n }\r\n );\r\n }\r\n\r\n // ********************************************************************************************************\r\n // CHANGING DATA\r\n // ********************************************************************************************************\r\n\r\n // ********************************************************************************************************\r\n // UI\r\n // ********************************************************************************************************\r\n\r\n // EVENT LISTENERS\r\n\r\n // MISCELLANEOUS\r\n\r\n}\r\n","<div [class.nok]=\"!crossbarActive\"\r\n [class.ok]=\"crossbarActive\"\r\n [style.bottom.px]=\"fromBottomPx()\"\r\n class=\"ws-state\"\r\n matTooltip=\"{{crossbarActive ? 'live update OK' : 'live update NOK'}}\">\r\n</div>\r\n","import {ModuleWithProviders, NgModule} from \"@angular/core\";\r\nimport {CrossbarStateComponent} from \"./crossbar-state/crossbar-state.component\";\r\nimport {MatTooltipModule} from \"@angular/material/tooltip\";\r\nimport {CrossbarConfigModel} from \"./_models/crossbar.model\";\r\nimport {CommonModule} from \"@angular/common\";\r\n\r\n@NgModule({\r\n declarations: [\r\n CrossbarStateComponent,\r\n ],\r\n exports: [\r\n CrossbarStateComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatTooltipModule,\r\n ],\r\n providers: []\r\n})\r\nexport class SpaasCrossbarModule {\r\n static forRoot(config: CrossbarConfigModel): ModuleWithProviders<SpaasCrossbarModule> {\r\n return {\r\n ngModule: SpaasCrossbarModule,\r\n providers: [{provide: CrossbarConfigModel, useValue: config}]\r\n };\r\n }\r\n}\r\n","// MODULE\r\nexport * from './crossbar.module';\r\n\r\n// COMPONENTS\r\nexport * from './crossbar-state/crossbar-state.component';\r\n\r\n// SERVICES\r\nexport * from './_services/crossbar.service';\r\n\r\n// MODELS AND CONSTANTS\r\nexport * from './_models/crossbar.model';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CrossbarService"],"mappings":"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"}