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.

109 lines 14.9 kB
import { Inject, Injectable, Optional } from '@angular/core'; import * as signalr from '@microsoft/signalr'; import { ReplaySubject } from "rxjs"; import { SignalrConfigModel, SignalrResponseModel } from "../_models/signalr.model"; import * as i0 from "@angular/core"; import * as i1 from "ngx-gem-spaas"; import * as i2 from "../_models/signalr.model"; export class SignalrService { constructor(signalrConfig, oktaService) { this.signalrConfig = signalrConfig; this.oktaService = oktaService; this.signalrMsg$ = new ReplaySubject(1); this.signalrState$ = new ReplaySubject(1); if (!this.signalrConfig?.signalrUrl || !this.signalrConfig?.signalrEvents?.length) { throw new Error('please provide a valid SpaasSignalrConfigModel using the forRoot method of the SpaasSignalrModule'); } this.buildConnection(); } buildConnection() { this.signalrHubConnection = new signalr.HubConnectionBuilder() .withUrl(this.signalrConfig?.signalrUrl, { accessTokenFactory: () => this.oktaService.getCachedAccessToken(), // logger: new MyLogger(), withCredentials: false, }) .withAutomaticReconnect({ nextRetryDelayInMilliseconds(retryContext) { // divide by 30 seconds to increment more aggressively. Could be switched to 60 for less steep incrementing // floor at 2 seconds, cap at 2 minutes return Math.min(Math.max(Math.ceil(retryContext.elapsedMilliseconds / 30), 2000), 120000); } }) .build(); } startConnection() { this.signalrHubConnection.start() .then(() => { this.newState('signalr connected'); this.listenToMessages(); }) .catch((error) => { this.newState('signalr failed to connect: ' + error); }); } listenToMessages() { // state related events this.signalrHubConnection.onclose((error) => { const errStr = error ? ' with error: ' + error : ' intentionally'; this.newState('signalr closed' + errStr); }); this.signalrHubConnection.onreconnecting((error) => { const errStr = error ? '. Reason for disconnect: ' + error : ''; this.newState('signalr disconnected, starting reconnection process' + errStr); }); this.signalrHubConnection.onreconnected(() => { this.newState('signalr reconnected successfully'); }); // user provided events for (const t of this.signalrConfig?.signalrEvents) { this.signalrHubConnection.on(t, (msg) => { const resp = new SignalrResponseModel(); resp.type = t; resp.data = msg; this.signalrMsg$.next(resp); }); } } stopConnection() { this.signalrHubConnection.stop() .then(() => { // no need to do anything, the "onclose" will fire }) .catch((error) => { this.newState('signalr connection closing failed: ' + error); }); } sendMessage(msg) { this.signalrHubConnection.invoke(msg.type, msg.data); } // ******************************************************************************************************** // BROADCAST DATA // ******************************************************************************************************** onNewMessage() { return this.signalrMsg$.asObservable(); } newState(msg) { this.signalrState$.next({ state: this.signalrHubConnection?.state, message: msg || '', }); } onNewState() { return this.signalrState$.asObservable(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignalrService, deps: [{ token: SignalrConfigModel, optional: true }, { token: i1.OktaService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignalrService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignalrService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i2.SignalrConfigModel, decorators: [{ type: Optional }, { type: Inject, args: [SignalrConfigModel] }] }, { type: i1.OktaService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWdlbS1zcGFhcy9zaWduYWxyL3NyYy9fc2VydmljZXMvc2lnbmFsci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sRUFBYSxhQUFhLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFL0MsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG9CQUFvQixFQUFzQyxNQUFNLDBCQUEwQixDQUFDOzs7O0FBS3ZILE1BQU0sT0FBTyxjQUFjO0lBTXpCLFlBQzJELGFBQWlDLEVBQ2xGLFdBQXdCO1FBRHlCLGtCQUFhLEdBQWIsYUFBYSxDQUFvQjtRQUNsRixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUxsQyxnQkFBVyxHQUFHLElBQUksYUFBYSxDQUF1QixDQUFDLENBQUMsQ0FBQztRQUN6RCxrQkFBYSxHQUFHLElBQUksYUFBYSxDQUFvQixDQUFDLENBQUMsQ0FBQztRQU10RCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNsRixNQUFNLElBQUksS0FBSyxDQUNiLG1HQUFtRyxDQUNwRyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxPQUFPLENBQUMsb0JBQW9CLEVBQUU7YUFDM0QsT0FBTyxDQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUM5QjtZQUNFLGtCQUFrQixFQUFFLEdBQUcs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b0JBQW9CLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCwyR0FBMkc7SUFDM0csaUJBQWlCO0lBQ2pCLDJHQUEyRztJQUUzRyxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTyxRQUFRLENBQUMsR0FBUTtRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEtBQUs7WUFDdkMsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNDLENBQUM7K0dBeEdVLGNBQWMsa0JBT0gsa0JBQWtCO21IQVA3QixjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgc2lnbmFsciBmcm9tICdAbWljcm9zb2Z0L3NpZ25hbHInO1xyXG5pbXBvcnQge1JldHJ5Q29udGV4dH0gZnJvbSAnQG1pY3Jvc29mdC9zaWduYWxyJztcclxuaW1wb3J0IHtPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge09rdGFTZXJ2aWNlfSBmcm9tIFwibmd4LWdlbS1zcGFhc1wiO1xyXG5pbXBvcnQge1NpZ25hbHJDb25maWdNb2RlbCwgU2lnbmFsclJlc3BvbnNlTW9kZWwsIFNpZ25hbHJTZW5kTW9kZWwsIFNpZ25hbHJTdGF0ZU1vZGVsfSBmcm9tIFwiLi4vX21vZGVscy9zaWduYWxyLm1vZGVsXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaWduYWxyU2VydmljZSB7XHJcblxyXG4gIHNpZ25hbHJIdWJDb25uZWN0aW9uITogc2lnbmFsci5IdWJDb25uZWN0aW9uO1xyXG4gIHNpZ25hbHJNc2ckID0gbmV3IFJlcGxheVN1YmplY3Q8U2lnbmFsclJlc3BvbnNlTW9kZWw+KDEpO1xyXG4gIHNpZ25hbHJTdGF0ZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxTaWduYWxyU3RhdGVNb2RlbD4oMSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTaWduYWxyQ29uZmlnTW9kZWwpIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFsckNvbmZpZzogU2lnbmFsckNvbmZpZ01vZGVsLFxyXG4gICAgcHJpdmF0ZSBva3RhU2VydmljZTogT2t0YVNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICBpZiAoIXRoaXMuc2lnbmFsckNvbmZpZz8uc2lnbmFsclVybCB8fCAhdGhpcy5zaWduYWxyQ29uZmlnPy5zaWduYWxyRXZlbnRzPy5sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdwbGVhc2UgcHJvdmlkZSBhIHZhbGlkIFNwYWFzU2lnbmFsckNvbmZpZ01vZGVsIHVzaW5nIHRoZSBmb3JSb290IG1ldGhvZCBvZiB0aGUgU3BhYXNTaWduYWxyTW9kdWxlJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5idWlsZENvbm5lY3Rpb24oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaWduYWxySHViQ29ubmVjdGlvbiA9IG5ldyBzaWduYWxyLkh1YkNvbm5lY3Rpb25CdWlsZGVyKClcclxuICAgICAgLndpdGhVcmwoXHJcbiAgICAgICAgdGhpcy5zaWduYWxyQ29uZmlnPy5zaWduYWxyVXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGFjY2Vzc1Rva2VuRmFjdG9yeTogKCkgPT4gdGhpcy5va3RhU2VydmljZS5nZXRDYWNoZWRBY2Nlc3NUb2tlbigpLFxyXG4gICAgICAgICAgLy8gbG9nZ2VyOiBuZXcgTXlMb2dnZXIoKSxcclxuICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIC53aXRoQXV0b21hdGljUmVjb25uZWN0KHtcclxuICAgICAgICBuZXh0UmV0cnlEZWxheUluTWlsbGlzZWNvbmRzKHJldHJ5Q29udGV4dDogUmV0cnlDb250ZXh0KTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICAgICAgICAvLyBkaXZpZGUgYnkgMzAgc2Vjb25kcyB0byBpbmNyZW1lbnQgbW9yZSBhZ2dyZXNzaXZlbHkuIENvdWxkIGJlIHN3aXRjaGVkIHRvIDYwIGZvciBsZXNzIHN0ZWVwIGluY3JlbWVudGluZ1xyXG4gICAgICAgICAgLy8gZmxvb3IgYXQgMiBzZWNvbmRzLCBjYXAgYXQgMiBtaW51dGVzXHJcbiAgICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5jZWlsKHJldHJ5Q29udGV4dC5lbGFwc2VkTWlsbGlzZWNvbmRzIC8gMzApLCAyMDAwKSwgMTIwMDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5idWlsZCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaWduYWxySHViQ29ubmVjdGlvbi5zdGFydCgpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLm5ld1N0YXRlKCdzaWduYWxyIGNvbm5lY3RlZCcpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuVG9NZXNzYWdlcygpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgdGhpcy5uZXdTdGF0ZSgnc2lnbmFsciBmYWlsZWQgdG8gY29ubmVjdDogJyArIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RlblRvTWVzc2FnZXMoKTogdm9pZCB7XHJcbiAgICAvLyBzdGF0ZSByZWxhdGVkIGV2ZW50c1xyXG4gICAgdGhpcy5zaWduYWxySHViQ29ubmVjdGlvbi5vbmNsb3NlKChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zdCBlcnJTdHIgPSBlcnJvciA/ICcgd2l0aCBlcnJvcjogJyArIGVycm9yIDogJyBpbnRlbnRpb25hbGx5JztcclxuICAgICAgdGhpcy5uZXdTdGF0ZSgnc2lnbmFsciBjbG9zZWQnICsgZXJyU3RyKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zaWduYWxySHViQ29ubmVjdGlvbi5vbnJlY29ubmVjdGluZygoZXJyb3IpID0+IHtcclxuICAgICAgY29uc3QgZXJyU3RyID0gZXJyb3IgPyAnLiBSZWFzb24gZm9yIGRpc2Nvbm5lY3Q6ICcgKyBlcnJvciA6ICcnO1xyXG4gICAgICB0aGlzLm5ld1N0YXRlKCdzaWduYWxyIGRpc2Nvbm5lY3RlZCwgc3RhcnRpbmcgcmVjb25uZWN0aW9uIHByb2Nlc3MnICsgZXJyU3RyKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zaWduYWxySHViQ29ubmVjdGlvbi5vbnJlY29ubmVjdGVkKCgpID0+IHtcclxuICAgICAgdGhpcy5uZXdTdGF0ZSgnc2lnbmFsciByZWNvbm5lY3RlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgIH0pO1xyXG4gICAgLy8gdXNlciBwcm92aWRlZCBldmVudHNcclxuICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLnNpZ25hbHJDb25maWc/LnNpZ25hbHJFdmVudHMpIHtcclxuICAgICAgdGhpcy5zaWduYWxySHViQ29ubmVjdGlvbi5vbih0LCAobXNnOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByZXNwID0gbmV3IFNpZ25hbHJSZXNwb25zZU1vZGVsKCk7XHJcbiAgICAgICAgcmVzcC50eXBlID0gdDtcclxuICAgICAgICByZXNwLmRhdGEgPSBtc2c7XHJcbiAgICAgICAgdGhpcy5zaWduYWxyTXNnJC5uZXh0KHJlc3ApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0b3BDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaWduYWxySHViQ29ubmVjdGlvbi5zdG9wKClcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIC8vIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcsIHRoZSBcIm9uY2xvc2VcIiB3aWxsIGZpcmVcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgIHRoaXMubmV3U3RhdGUoJ3NpZ25hbHIgY29ubmVjdGlvbiBjbG9zaW5nIGZhaWxlZDogJyArIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZW5kTWVzc2FnZShtc2c6IFNpZ25hbHJTZW5kTW9kZWwpOiB2b2lkIHtcclxuICAgIHRoaXMuc2lnbmFsckh1YkNvbm5lY3Rpb24uaW52b2tlKG1zZy50eXBlLCBtc2cuZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vIEJST0FEQ0FTVCBEQVRBXHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgb25OZXdNZXNzYWdlKCk6IE9ic2VydmFibGU8U2lnbmFsclJlc3BvbnNlTW9kZWw+IHtcclxuICAgIHJldHVybiB0aGlzLnNpZ25hbHJNc2ckLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuZXdTdGF0ZShtc2c6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zaWduYWxyU3RhdGUkLm5leHQoe1xyXG4gICAgICBzdGF0ZTogdGhpcy5zaWduYWxySHViQ29ubmVjdGlvbj8uc3RhdGUsXHJcbiAgICAgIG1lc3NhZ2U6IG1zZyB8fCAnJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25OZXdTdGF0ZSgpOiBPYnNlcnZhYmxlPFNpZ25hbHJTdGF0ZU1vZGVsPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zaWduYWxyU3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19