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
JavaScript
// @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=