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
JavaScript
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