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.1 kB
Source Map (JSON)
{"version":3,"file":"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/ngx-gem-spaas-crossbar.ts"],"sourcesContent":["import {DateTime} from \"luxon\";\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 */\r\nexport class CrossbarConfigModel {\r\n xbarUrl: string = '';\r\n xbarTopics: string[] = [];\r\n xbarTopicsPrefix?: string = '';\r\n\r\n constructor(props: any) {\r\n this.xbarTopics = props.xbarTopics || [''];\r\n this.xbarTopicsPrefix = props.xbarTopicsPrefix || '';\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} from \"../_models/crossbar.model\";\r\nimport {Observable, Subject} 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 Subject<CrossbarResponseModel>();\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('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('wsAutobahn 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 let topics = this.crossbarConfig.xbarTopics || [];\r\n if (this.crossbarConfig.xbarTopicsPrefix) {\r\n topics = topics.map((t) => this.crossbarConfig.xbarTopicsPrefix + '.' + t);\r\n }\r\n topics.forEach((topic) =>\r\n session.subscribe(topic, (args: any, kwargs: any, details: any) => this.onChannelUpdate(args, kwargs, details))\r\n );\r\n this.newWsMessage(resp);\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('wsAutobahn closed');\r\n resp.data = 'disconnected';\r\n resp.type = 'disconnected';\r\n } else {\r\n console.log('wsAutobahn closed due to error');\r\n // CLOSE WAS TRIGGERED BY AN ERROR (WS ERROR ALWAYS CALLS WS CLOSE)\r\n if (this.crossbar.readyState !== 1) {\r\n // FAILED CONNECTION\r\n resp.data = 'Failed to connect. Is the server running and are you connected to the internet?';\r\n resp.type = 'error';\r\n } else {\r\n // OTHER ERROR\r\n resp.data = JSON.stringify(e);\r\n resp.type = 'error';\r\n }\r\n }\r\n this.newWsMessage(resp);\r\n };\r\n\r\n // ERROR EVENT\r\n this.crossbar.onerror = (e: any) => {\r\n // TESTING ONLY\r\n console.log(e);\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 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.crossbar) {\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 // console.log(msg);\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}\r\n","import {Component, HostListener, Input, OnDestroy, OnInit} from '@angular/core';\r\nimport {CrossbarService} from \"../_services/crossbar.service\";\r\nimport {BaseComponent} from \"ngx-gem-spaas\";\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})\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 @Input() fromBottomPx = 14;\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\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 (!this.crossbarService.crossbar || !this.crossbarService.crossbar.isConnected || !this.crossbarService.crossbar.isOpen) {\r\n this.crossbarService.startConnection();\r\n this.wsCrossbarSubscribe();\r\n } else {\r\n this.crossbarActive = true;\r\n }\r\n }\r\n\r\n private wsCrossbarSubscribe(): void {\r\n this.crossbarService.onNewWsMessage()\r\n .subscribe(\r\n (responseData) => {\r\n if (responseData.type === 'connected') {\r\n // DO NOTHING, JUST WS CONNECTING\r\n this.crossbarActive = true;\r\n } else if (responseData.type === 'error' || responseData.type === 'disconnected') {\r\n // DO NOTHING, ERROR OR DISCONNECT => XBAR RECONNECTS AUTOMATICALLY\r\n this.crossbarActive = false;\r\n }\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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"}