UNPKG

ngx-gem-spaas

Version:

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

119 lines 16.6 kB
// @ts-ignore import * as autobahn from 'autobahn-browser'; import { Inject, Injectable, Optional } from '@angular/core'; import { CrossbarConfigModel, CrossbarResponseModel } from "../_models/crossbar.model"; import { Subject } from "rxjs"; import * as i0 from "@angular/core"; import * as i1 from "../_models/crossbar.model"; export class CrossbarService { constructor(crossbarConfig) { this.crossbarConfig = crossbarConfig; this.crossbarMsg$ = new Subject(); } // ******************************************************************************************************** // AUTOBAHN // ******************************************************************************************************** startConnection() { if (!this.crossbarConfig?.xbarUrl || !this.crossbarConfig?.xbarTopics?.length) { throw new Error('please provide a valid SpaasCrossbarConfigModel using the forRoot method of the SpaasCrossbarModule'); } // CONNECT this.crossbar = new autobahn.Connection({ url: this.crossbarConfig.xbarUrl, realm: 'realm1', headers: { 'Authorization': btoa('none:none') } }); this.crossbar.open(); // CONNECT EVENTS this.crossbar.onopen = (session) => { // console.log('wsAutobahn opened'); this.crossbarSession = session; const resp = new CrossbarResponseModel(); resp.data = 'websocket connected successfully'; resp.type = 'connected'; let topics = this.crossbarConfig.xbarTopics || []; if (this.crossbarConfig.xbarTopicsPrefix) { topics = topics.map((t) => this.crossbarConfig.xbarTopicsPrefix + '.' + t); } topics.forEach((topic) => session.subscribe(topic, (args, kwargs, details) => this.onChannelUpdate(args, kwargs, details))); this.newWsMessage(resp); }; // CLOSE EVENT this.crossbar.onclose = (e) => { const resp = new CrossbarResponseModel(); if (e.wasClean) { console.log('wsAutobahn closed'); resp.data = 'disconnected'; resp.type = 'disconnected'; } else { console.log('wsAutobahn closed due to error'); // CLOSE WAS TRIGGERED BY AN ERROR (WS ERROR ALWAYS CALLS WS CLOSE) if (this.crossbar.readyState !== 1) { // FAILED CONNECTION resp.data = 'Failed to connect. Is the server running and are you connected to the internet?'; resp.type = 'error'; } else { // OTHER ERROR resp.data = JSON.stringify(e); resp.type = 'error'; } } this.newWsMessage(resp); }; // ERROR EVENT this.crossbar.onerror = (e) => { // TESTING ONLY console.log(e); }; // HARD DISCONNECT FROM BROWSER return () => { if (this.crossbar) { this.crossbar.close(); } }; } onChannelUpdate(args, kwargs, details) { const data = args[0]; const resp = new CrossbarResponseModel(); resp.data = data?.data || data; resp.topic = details.topic ? details.topic.replace(this.crossbarConfig.xbarTopicsPrefix + '.', '') : ''; resp.type = data?.type || ''; this.newWsMessage(resp); } stopConnection() { if (this.crossbar) { this.crossbar.close(); } } sendMessage(topic, e, excludeMe = false) { if (this.crossbar) { this.crossbarSession.publish(this.crossbarConfig.xbarTopicsPrefix ? this.crossbarConfig.xbarTopicsPrefix + '.' + topic : topic, [e], null, { exclude_me: excludeMe }); } } // ******************************************************************************************************** // BROADCAST DATA // ******************************************************************************************************** newWsMessage(msg) { // console.log(msg); this.crossbarMsg$.next(msg); } onNewWsMessage() { return this.crossbarMsg$.asObservable(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CrossbarService, deps: [{ token: CrossbarConfigModel, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CrossbarService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CrossbarService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.CrossbarConfigModel, decorators: [{ type: Optional }, { type: Inject, args: [CrossbarConfigModel] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NiYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1nZW0tc3BhYXMvY3Jvc3NiYXIvc3JjL19zZXJ2aWNlcy9jcm9zc2Jhci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWE7QUFDYixPQUFPLEtBQUssUUFBUSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUUscUJBQXFCLEVBQW9CLE1BQU0sMkJBQTJCLENBQUM7QUFDeEcsT0FBTyxFQUFhLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQzs7O0FBS3pDLE1BQU0sT0FBTyxlQUFlO0lBTTFCLFlBQzRELGNBQW1DO1FBQW5DLG1CQUFjLEdBQWQsY0FBYyxDQUFxQjtRQUp2RixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUF5QixDQUFDO0lBTTVELENBQUM7SUFFRCwyR0FBMkc7SUFDM0csV0FBVztJQUNYLDJHQUEyRztJQUUzRyxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDOUUsTUFBTSxJQUFJLEtBQUssQ0FDYixxR0FBcUcsQ0FDdEcsQ0FBQztRQUNKLENBQUM7UUFDRCxVQUFVO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDdEMsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTztZQUNoQyxLQUFLLEVBQUUsUUFBUTtZQUNmLE9BQU8sRUFBRSxFQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUM7U0FDOUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxD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QUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQyxDQUFDOytHQXpIVSxlQUFlLGtCQU9KLG1CQUFtQjttSEFQOUIsZUFBZSxjQUZkLE1BQU07OzRGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRSSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1pZ25vcmVcclxuaW1wb3J0ICogYXMgYXV0b2JhaG4gZnJvbSAnYXV0b2JhaG4tYnJvd3Nlcic7XHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Q3Jvc3NiYXJDb25maWdNb2RlbCwgQ3Jvc3NiYXJSZXNwb25zZU1vZGVsLCBDcm9zc2JhclNlbmRNb2RlbH0gZnJvbSBcIi4uL19tb2RlbHMvY3Jvc3NiYXIubW9kZWxcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3Jvc3NiYXJTZXJ2aWNlIHtcclxuXHJcbiAgY3Jvc3NiYXI6IGFueTtcclxuICBwcml2YXRlIGNyb3NzYmFyTXNnJCA9IG5ldyBTdWJqZWN0PENyb3NzYmFyUmVzcG9uc2VNb2RlbD4oKTtcclxuICBwcml2YXRlIGNyb3NzYmFyU2Vzc2lvbjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ3Jvc3NiYXJDb25maWdNb2RlbCkgcHJpdmF0ZSByZWFkb25seSBjcm9zc2JhckNvbmZpZzogQ3Jvc3NiYXJDb25maWdNb2RlbCxcclxuICApIHtcclxuICB9XHJcblxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8gQVVUT0JBSE5cclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICBzdGFydENvbm5lY3Rpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuY3Jvc3NiYXJDb25maWc/LnhiYXJVcmwgfHwgIXRoaXMuY3Jvc3NiYXJDb25maWc/LnhiYXJUb3BpY3M/Lmxlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ3BsZWFzZSBwcm92aWRlIGEgdmFsaWQgU3BhYXNDcm9zc2JhckNvbmZpZ01vZGVsIHVzaW5nIHRoZSBmb3JSb290IG1ldGhvZCBvZiB0aGUgU3BhYXNDcm9zc2Jhck1vZHVsZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIC8vIENPTk5FQ1RcclxuICAgIHRoaXMuY3Jvc3NiYXIgPSBuZXcgYXV0b2JhaG4uQ29ubmVjdGlvbih7XHJcbiAgICAgIHVybDogdGhpcy5jcm9zc2JhckNvbmZpZy54YmFyVXJsLFxyXG4gICAgICByZWFsbTogJ3JlYWxtMScsXHJcbiAgICAgIGhlYWRlcnM6IHsnQXV0aG9yaXphdGlvbic6IGJ0b2EoJ25vbmU6bm9uZScpfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNyb3NzYmFyLm9wZW4oKTtcclxuXHJcbiAgICAvLyBDT05ORUNUIEVWRU5UU1xyXG4gICAgdGhpcy5jcm9zc2Jhci5vbm9wZW4gPSAoc2Vzc2lvbjogYW55KSA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCd3c0F1dG9iYWhuIG9wZW5lZCcpO1xyXG4gICAgICB0aGlzLmNyb3NzYmFyU2Vzc2lvbiA9IHNlc3Npb247XHJcbiAgICAgIGNvbnN0IHJlc3AgPSBuZXcgQ3Jvc3NiYXJSZXNwb25zZU1vZGVsKCk7XHJcbiAgICAgIHJlc3AuZGF0YSA9ICd3ZWJzb2NrZXQgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSc7XHJcbiAgICAgIHJlc3AudHlwZSA9ICdjb25uZWN0ZWQnO1xyXG4gICAgICBsZXQgdG9waWNzID0gdGhpcy5jcm9zc2JhckNvbmZpZy54YmFyVG9waWNzIHx8IFtdO1xyXG4gICAgICBpZiAodGhpcy5jcm9zc2JhckNvbmZpZy54YmFyVG9waWNzUHJlZml4KSB7XHJcbiAgICAgICAgdG9waWNzID0gdG9waWNzLm1hcCgodCkgPT4gdGhpcy5jcm9zc2JhckNvbmZpZy54YmFyVG9waWNzUHJlZml4ICsgJy4nICsgdCk7XHJcbiAgICAgIH1cclxuICAgICAgdG9waWNzLmZvckVhY2goKHRvcGljKSA9PlxyXG4gICAgICAgIHNlc3Npb24uc3Vic2NyaWJlKHRvcGljLCAoYXJnczogYW55LCBrd2FyZ3M6IGFueSwgZGV0YWlsczogYW55KSA9PiB0aGlzLm9uQ2hhbm5lbFVwZGF0ZShhcmdzLCBrd2FyZ3MsIGRldGFpbHMpKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm5ld1dzTWVzc2FnZShyZXNwKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQ0xPU0UgRVZFTlRcclxuICAgIHRoaXMuY3Jvc3NiYXIub25jbG9zZSA9IChlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcmVzcCA9IG5ldyBDcm9zc2JhclJlc3BvbnNlTW9kZWwoKTtcclxuICAgICAgaWYgKGUud2FzQ2xlYW4pIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnd3NBdXRvYmFobiBjbG9zZWQnKTtcclxuICAgICAgICByZXNwLmRhdGEgPSAnZGlzY29ubmVjdGVkJztcclxuICAgICAgICByZXNwLnR5cGUgPSAnZGlzY29ubmVjdGVkJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnd3NBdXRvYmFobiBjbG9zZWQgZHVlIHRvIGVycm9yJyk7XHJcbiAgICAgICAgLy8gQ0xPU0UgV0FTIFRSSUdHRVJFRCBCWSBBTiBFUlJPUiAoV1MgRVJST1IgQUxXQVlTIENBTExTIFdTIENMT1NFKVxyXG4gICAgICAgIGlmICh0aGlzLmNyb3NzYmFyLnJlYWR5U3RhdGUgIT09IDEpIHtcclxuICAgICAgICAgIC8vIEZBSUxFRCBDT05ORUNUSU9OXHJcbiAgICAgICAgICByZXNwLmRhdGEgPSAnRmFpbGVkIHRvIGNvbm5lY3QuIElzIHRoZSBzZXJ2ZXIgcnVubmluZyBhbmQgYXJlIHlvdSBjb25uZWN0ZWQgdG8gdGhlIGludGVybmV0Pyc7XHJcbiAgICAgICAgICByZXNwLnR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBPVEhFUiBFUlJPUlxyXG4gICAgICAgICAgcmVzcC5kYXRhID0gSlNPTi5zdHJpbmdpZnkoZSk7XHJcbiAgICAgICAgICByZXNwLnR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLm5ld1dzTWVzc2FnZShyZXNwKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gRVJST1IgRVZFTlRcclxuICAgIHRoaXMuY3Jvc3NiYXIub25lcnJvciA9IChlOiBhbnkpID0+IHtcclxuICAgICAgLy8gVEVTVElORyBPTkxZXHJcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBIQVJEIERJU0NPTk5FQ1QgRlJPTSBCUk9XU0VSXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jcm9zc2Jhcikge1xyXG4gICAgICAgIHRoaXMuY3Jvc3NiYXIuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uQ2hhbm5lbFVwZGF0ZShhcmdzOiBhbnlbXSwga3dhcmdzOiBhbnksIGRldGFpbHM6IGFueSkge1xyXG4gICAgY29uc3QgZGF0YSA9IGFyZ3NbMF07XHJcbiAgICBjb25zdCByZXNwID0gbmV3IENyb3NzYmFyUmVzcG9uc2VNb2RlbCgpO1xyXG4gICAgcmVzcC5kYXRhID0gZGF0YT8uZGF0YSB8fCBkYXRhO1xyXG4gICAgcmVzcC50b3BpYyA9IGRldGFpbHMudG9waWMgPyBkZXRhaWxzLnRvcGljLnJlcGxhY2UodGhpcy5jcm9zc2JhckNvbmZpZy54YmFyVG9waWNzUHJlZml4ICsgJy4nLCAnJykgOiAnJztcclxuICAgIHJlc3AudHlwZSA9IGRhdGE/LnR5cGUgfHwgJyc7XHJcbiAgICB0aGlzLm5ld1dzTWVzc2FnZShyZXNwKTtcclxuICB9XHJcblxyXG4gIHN0b3BDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3Jvc3NiYXIpIHtcclxuICAgICAgdGhpcy5jcm9zc2Jhci5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VuZE1lc3NhZ2UodG9waWM6IHN0cmluZywgZTogQ3Jvc3NiYXJTZW5kTW9kZWwsIGV4Y2x1ZGVNZSA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jcm9zc2Jhcikge1xyXG4gICAgICB0aGlzLmNyb3NzYmFyU2Vzc2lvbi5wdWJsaXNoKFxyXG4gICAgICAgIHRoaXMuY3Jvc3NiYXJDb25maWcueGJhclRvcGljc1ByZWZpeCA/IHRoaXMuY3Jvc3NiYXJDb25maWcueGJhclRvcGljc1ByZWZpeCArICcuJyArIHRvcGljIDogdG9waWMsXHJcbiAgICAgICAgW2VdLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAge2V4Y2x1ZGVfbWU6IGV4Y2x1ZGVNZX1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8gQlJPQURDQVNUIERBVEFcclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICBwcml2YXRlIG5ld1dzTWVzc2FnZShtc2c6IENyb3NzYmFyUmVzcG9uc2VNb2RlbCkge1xyXG4gICAgLy8gY29uc29sZS5sb2cobXNnKTtcclxuICAgIHRoaXMuY3Jvc3NiYXJNc2ckLm5leHQobXNnKTtcclxuICB9XHJcblxyXG4gIG9uTmV3V3NNZXNzYWdlKCk6IE9ic2VydmFibGU8Q3Jvc3NiYXJSZXNwb25zZU1vZGVsPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jcm9zc2Jhck1zZyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=