@quadrel-enterprise-ui/framework 18.23.2 → 18.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
1
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { EventSourcePolyfill } from 'event-source-polyfill';
|
|
2
3
|
import { NEVER, Subject } from 'rxjs';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
/**
|
|
@@ -9,12 +10,15 @@ import * as i0 from "@angular/core";
|
|
|
9
10
|
* - **Real-Time Interaction**: Enables live updates without user actions or polling.
|
|
10
11
|
* - **Scalable and Flexible**: The system is flexible and easily expandable to handle new events.
|
|
11
12
|
* - **Consistency**: Ensures synchronization between server and client states for a consistent user experience.
|
|
13
|
+
* - **Authorization**: It uses the user's authentication (QdAuth) to secure the connection against the backend out-of-the-box. This requires a proper QdAuth setup. You can disable this feature when starting the connection.
|
|
12
14
|
*
|
|
13
15
|
* ### Usage
|
|
14
16
|
*
|
|
15
17
|
* ```ts
|
|
16
18
|
* // Start the connection to the events
|
|
17
19
|
* pushEventsService.connect('http://service-endpint/events');
|
|
20
|
+
* // or start without authentication in case you don't need:
|
|
21
|
+
* pushEventsService.connect('http://service-endpint/events', { disableAuthentication: true });
|
|
18
22
|
*
|
|
19
23
|
* // Subscribe to the event (Side Effect)
|
|
20
24
|
* const subscription = pushEventsService.observe('RESOURCE_UPDATED').subscribe(event => handleEvent(event));
|
|
@@ -27,37 +31,47 @@ import * as i0 from "@angular/core";
|
|
|
27
31
|
* ```
|
|
28
32
|
*/
|
|
29
33
|
export class QdPushEventsService {
|
|
34
|
+
authenticationService;
|
|
30
35
|
_eventSource;
|
|
31
36
|
_eventSubscriptionSubjects = new Map();
|
|
32
37
|
_listeners = [];
|
|
33
38
|
_heartbeatTimeout;
|
|
34
39
|
_reconnectDelayTime = 10000;
|
|
35
40
|
_heartbeatReconnectDelayTime = 100;
|
|
41
|
+
_accessTokenSub;
|
|
42
|
+
_options;
|
|
43
|
+
constructor(authenticationService) {
|
|
44
|
+
this.authenticationService = authenticationService;
|
|
45
|
+
}
|
|
36
46
|
/**
|
|
37
47
|
* Establishes an EventSource connection to the given URL.
|
|
38
48
|
* Automatically reconnects if heartbeat fails or is delayed.
|
|
39
49
|
* Subscribers are retained across reconnections.
|
|
40
50
|
*
|
|
41
51
|
* @param url The backend URL for the event stream.
|
|
52
|
+
* @param options Options for the connection
|
|
42
53
|
*/
|
|
43
|
-
connect(url) {
|
|
54
|
+
connect(url, options) {
|
|
44
55
|
if (this.isConnectedOrConnecting())
|
|
45
56
|
return;
|
|
46
|
-
if (!
|
|
47
|
-
this.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
if (!options?.disableAuthentication) {
|
|
58
|
+
if (!this.authenticationService) {
|
|
59
|
+
this.logError("Can't connect to SSE without QdAuth as the connection has to be secured. Please install QdAuth or disable authentication when connecting.");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (this._accessTokenSub)
|
|
63
|
+
this._accessTokenSub.unsubscribe();
|
|
64
|
+
this._accessTokenSub = this.authenticationService.accessToken$.subscribe((token) => {
|
|
65
|
+
this._options = { url, options };
|
|
66
|
+
this.connectEventSource(url, {
|
|
67
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
68
|
+
}, true);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
this._options = { url, options };
|
|
73
|
+
this.connectEventSource(url);
|
|
74
|
+
}
|
|
61
75
|
}
|
|
62
76
|
/**
|
|
63
77
|
* Closes the EventSource connection and clears all listeners.
|
|
@@ -106,10 +120,10 @@ export class QdPushEventsService {
|
|
|
106
120
|
(this._eventSource.readyState === EventSource.OPEN || this._eventSource.readyState === EventSource.CONNECTING));
|
|
107
121
|
}
|
|
108
122
|
reconnect() {
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
123
|
+
if (this.isConnectedOrConnecting())
|
|
124
|
+
return;
|
|
125
|
+
this.disconnect();
|
|
126
|
+
this.connect(this._options.url, this._options.options);
|
|
113
127
|
}
|
|
114
128
|
addEventListenerForEventName(eventName) {
|
|
115
129
|
const callback = (messageEvent) => {
|
|
@@ -141,7 +155,26 @@ export class QdPushEventsService {
|
|
|
141
155
|
logError(message, err) {
|
|
142
156
|
console.error(`QD-UI | QdPushEventsService - ${message}`, err);
|
|
143
157
|
}
|
|
144
|
-
|
|
158
|
+
connectEventSource(url, options = {}, reconnect) {
|
|
159
|
+
if (this._eventSource && this._eventSource.readyState !== EventSource.CLOSED)
|
|
160
|
+
this._eventSource.close();
|
|
161
|
+
if (!this._eventSource || this._eventSource.readyState === EventSource.CLOSED || reconnect)
|
|
162
|
+
this._eventSource = new EventSourcePolyfill(url, options);
|
|
163
|
+
this._eventSource.onerror = (err) => {
|
|
164
|
+
if (this._eventSource.readyState === EventSource.CLOSED)
|
|
165
|
+
this.reconnect();
|
|
166
|
+
this.logError('SSE connection error:', err);
|
|
167
|
+
};
|
|
168
|
+
this._eventSource.addEventListener('HEARTBEAT', (message) => {
|
|
169
|
+
if (this._heartbeatTimeout)
|
|
170
|
+
clearTimeout(this._heartbeatTimeout);
|
|
171
|
+
const interval = JSON.parse(message.data).interval;
|
|
172
|
+
this._heartbeatTimeout = setTimeout(() => this.reconnect(), interval + this._heartbeatReconnectDelayTime);
|
|
173
|
+
});
|
|
174
|
+
this._heartbeatTimeout = setTimeout(() => this.reconnect(), this._reconnectDelayTime);
|
|
175
|
+
this.addEventListenersForExistingSubscriptions();
|
|
176
|
+
}
|
|
177
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdPushEventsService, deps: [{ token: 'QdAuthenticationService', optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
145
178
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdPushEventsService, providedIn: 'root' });
|
|
146
179
|
}
|
|
147
180
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdPushEventsService, decorators: [{
|
|
@@ -149,5 +182,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
149
182
|
args: [{
|
|
150
183
|
providedIn: 'root'
|
|
151
184
|
}]
|
|
152
|
-
}]
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaC1ldmVudHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcWQtdWkvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL3B1c2gtZXZlbnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFJbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUlILE1BQU0sT0FBTyxtQkFBbUI7SUFDdEIsWUFBWSxDQUFlO0lBQzNCLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO0lBQ3RFLFVBQVUsR0FBZ0QsRUFBRSxDQUFDO0lBQzdELGlCQUFpQixDQUFpQztJQUNsRCxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDNUIsNEJBQTRCLEdBQUcsR0FBRyxDQUFDO0lBRTNDOzs7Ozs7T0FNRztJQUNILE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQUUsT0FBTztRQUUzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsTUFBTTtZQUMzRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBVSxFQUFRLEVBQUU7WUFDL0MsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFD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QUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxRQUFRLENBQUMsT0FBZSxFQUFFLEdBQVc7UUFDM0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakUsQ0FBQzt1R0FuSlUsbUJBQW1COzJHQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs7MkZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5FVkVSLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIEV2ZW50TmFtZSA9ICdSRVNPVVJDRV9DUkVBVEVEJyB8ICdSRVNPVVJDRV9VUERBVEVEJyB8ICdSRVNPVVJDRV9ERUxFVEVEJztcblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBoYW5kbGluZyByZWFsLXRpbWUgc2VydmVyLXNlbnQgZXZlbnRzLlxuICpcbiAqICMjIyBCZW5lZml0c1xuICpcbiAqIC0gKipSZWFsLVRpbWUgSW50ZXJhY3Rpb24qKjogRW5hYmxlcyBsaXZlIHVwZGF0ZXMgd2l0aG91dCB1c2VyIGFjdGlvbnMgb3IgcG9sbGluZy5cbiAqIC0gKipTY2FsYWJsZSBhbmQgRmxleGlibGUqKjogVGhlIHN5c3RlbSBpcyBmbGV4aWJsZSBhbmQgZWFzaWx5IGV4cGFuZGFibGUgdG8gaGFuZGxlIG5ldyBldmVudHMuXG4gKiAtICoqQ29uc2lzdGVuY3kqKjogRW5zdXJlcyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudCBzdGF0ZXMgZm9yIGEgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogYGBgdHNcbiAqIC8vIFN0YXJ0IHRoZSBjb25uZWN0aW9uIHRvIHRoZSBldmVudHNcbiAqIHB1c2hFdmVudHNTZXJ2aWNlLmNvbm5lY3QoJ2h0dHA6Ly9zZXJ2aWNlLWVuZHBpbnQvZXZlbnRzJyk7XG4gKlxuICogLy8gU3Vic2NyaWJlIHRvIHRoZSBldmVudCAoU2lkZSBFZmZlY3QpXG4gKiBjb25zdCBzdWJzY3JpcHRpb24gPSBwdXNoRXZlbnRzU2VydmljZS5vYnNlcnZlKCdSRVNPVVJDRV9VUERBVEVEJykuc3Vic2NyaWJlKGV2ZW50ID0+IGhhbmRsZUV2ZW50KGV2ZW50KSk7XG4gKlxuICogLy8gVW5zdWJzY3JpYmUgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAqIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICpcbiAqIC8vIERpc2Nvbm5lY3QgdGhlIGNvbm5lY3Rpb25cbiAqIHB1c2hFdmVudHNTZXJ2aWNlLmRpc2Nvbm5lY3QoKTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBRZFB1c2hFdmVudHNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfZXZlbnRTb3VyY2UhOiBFdmVudFNvdXJjZTtcbiAgcHJpdmF0ZSBfZXZlbnRTdWJzY3JpcHRpb25TdWJqZWN0cyA9IG5ldyBNYXA8c3RyaW5nLCBTdWJqZWN0PE1lc3NhZ2VFdmVudD4+KCk7XG4gIHByaXZhdGUgX2xpc3RlbmVyczogW3N0cmluZywgKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCkgPT4gdm9pZF1bXSA9IFtdO1xuICBwcml2YXRlIF9oZWFydGJlYXRUaW1lb3V0ITogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgX3JlY29ubmVjdERlbGF5VGltZSA9IDEwMDAwO1xuICBwcml2YXRlIF9oZWFydGJlYXRSZWNvbm5lY3REZWxheVRpbWUgPSAxMDA7XG5cbiAgLyoqXG4gICAqIEVzdGFibGlzaGVzIGFuIEV2ZW50U291cmNlIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIFVSTC5cbiAgICogQXV0b21hdGljYWxseSByZWNvbm5lY3RzIGlmIGhlYXJ0YmVhdCBmYWlscyBvciBpcyBkZWxheWVkLlxuICAgKiBTdWJzY3JpYmVycyBhcmUgcmV0YWluZWQgYWNyb3NzIHJlY29ubmVjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgVGhlIGJhY2tlbmQgVVJMIGZvciB0aGUgZXZlbnQgc3RyZWFtLlxuICAgKi9cbiAgY29ubmVjdCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkT3JDb25uZWN0aW5nKCkpIHJldHVybjtcblxuICAgIGlmICghdGhpcy5fZXZlbnRTb3VyY2UgfHwgdGhpcy5fZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PT0gRXZlbnRTb3VyY2UuQ0xPU0VEKVxuICAgICAgdGhpcy5fZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIHRoaXMuX2V2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyOiBFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX2V2ZW50U291cmNlLnJlYWR5U3RhdGUgPT09IEV2ZW50U291cmNlLkNMT1NFRCkgdGhpcy5yZWNvbm5lY3QoKTtcblxuICAgICAgdGhpcy5sb2dFcnJvcignU1NFIGNvbm5lY3Rpb24gZXJyb3I6JywgZXJyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignSEVBUlRCRUFUJywgbWVzc2FnZSA9PiB7XG4gICAgICBpZiAodGhpcy5faGVhcnRiZWF0VGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuX2hlYXJ0YmVhdFRpbWVvdXQpO1xuXG4gICAgICBjb25zdCBpbnRlcnZhbCA9IEpTT04ucGFyc2UobWVzc2FnZS5kYXRhKS5pbnRlcnZhbDtcblxuICAgICAgdGhpcy5faGVhcnRiZWF0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWNvbm5lY3QoKSwgaW50ZXJ2YWwgKyB0aGlzLl9oZWFydGJlYXRSZWNvbm5lY3REZWxheVRpbWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5faGVhcnRiZWF0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWNvbm5lY3QoKSwgdGhpcy5fcmVjb25uZWN0RGVsYXlUaW1lKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnNGb3JFeGlzdGluZ1N1YnNjcmlwdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIEV2ZW50U291cmNlIGNvbm5lY3Rpb24gYW5kIGNsZWFycyBhbGwgbGlzdGVuZXJzLlxuICAgKiBTdWJzY3JpYmVycyBhcmUgcHJlc2VydmVkIGZvciByZWNvbm5lY3Rpb24uXG4gICAqL1xuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIHRoaXMubG9nV2FybignTm8gYWN0aXZlIGNvbm5lY3Rpb24gdG8gZGlzY29ubmVjdC4nKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnNGcm9tRXZlbnRTb3VyY2UoKTtcblxuICAgIHRoaXMuX2V2ZW50U291cmNlLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWUuXG4gICAqIElmIG5vdCBjb25uZWN0ZWQsIHJldHVybnMgYE5FVkVSYCBhbmQgbG9ncyBhbiBlcnJvci5cbiAgICogQXV0b21hdGljYWxseSBhZGRzIGEgbGlzdGVuZXIgZm9yIHRoZSBldmVudCBpZiBuZWVkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudE5hbWUgVGhlIGV2ZW50IHR5cGUgKCdSRVNPVVJDRV9DUkVBVEVEJywgJ1JFU09VUkNFX1VQREFURUQnLCAnUkVTT1VSQ0VfREVMRVRFRCcpLlxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4gVGhlIGV2ZW50IHN0cmVhbS5cbiAgICovXG4gIG9ic2VydmUoZXZlbnROYW1lOiBFdmVudE5hbWUpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ0Nhbm5vdCBvYnNlcnZlIGV2ZW50cyB3aXRob3V0IGEgY29ubmVjdGlvbi4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuJyk7XG5cbiAgICAgIHJldHVybiBORVZFUjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuc2V0KGV2ZW50TmFtZSwgbmV3IFN1YmplY3Q8TWVzc2FnZUV2ZW50PigpKTtcblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyRm9yRXZlbnROYW1lKGV2ZW50TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuZ2V0KGV2ZW50TmFtZSkhLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBhbmQgY2xlYXJzIGFsbCBzdWJzY3JpcHRpb25zLlxuICAgKiBUaGUgRXZlbnRTb3VyY2UgY29ubmVjdGlvbiByZW1haW5zIG9wZW4uXG4gICAqL1xuICB1bm9ic2VydmVBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBbGxFdmVudExpc3RlbmVyc0Zyb21FdmVudFNvdXJjZSgpO1xuICAgIHRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIEV2ZW50U291cmNlIGlzIGNvbm5lY3RlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nLlxuICAgKi9cbiAgaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2V2ZW50U291cmNlICYmXG4gICAgICAodGhpcy5fZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PT0gRXZlbnRTb3VyY2UuT1BFTiB8fCB0aGlzLl9ldmVudFNvdXJjZS5yZWFkeVN0YXRlID09PSBFdmVudFNvdXJjZS5DT05ORUNUSU5HKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcoKSkge1xuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmNvbm5lY3QodGhpcy5fZXZlbnRTb3VyY2UudXJsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXJGb3JFdmVudE5hbWUoZXZlbnROYW1lOiBFdmVudE5hbWUpOiB2b2lkIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IChtZXNzYWdlRXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuZ2V0KGV2ZW50TmFtZSk7XG5cbiAgICAgIGlmIChzdWJqZWN0KSBzdWJqZWN0Lm5leHQobWVzc2FnZUV2ZW50KTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChbZXZlbnROYW1lLCBjYWxsYmFja10pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFdmVudExpc3RlbmVyc0ZvckV4aXN0aW5nU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudFN1YnNjcmlwdGlvblN1YmplY3RzLmZvckVhY2goKHN1YmplY3QsIGV2ZW50TmFtZSkgPT5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lclRvRXZlbnRTb3VyY2UoZXZlbnROYW1lIGFzIEV2ZW50TmFtZSwgKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PlxuICAgICAgICBzdWJqZWN0Lm5leHQobWVzc2FnZUV2ZW50KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXJUb0V2ZW50U291cmNlKGV2ZW50TmFtZTogRXZlbnROYW1lLCBjYWxsYmFjazogKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChbZXZlbnROYW1lLCBjYWxsYmFja10pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBbGxFdmVudExpc3RlbmVyc0Zyb21FdmVudFNvdXJjZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50U291cmNlKSB7XG4gICAgICB0aGlzLmxvZ1dhcm4oJ0Nhbm5vdCByZW1vdmUgbGlzdGVuZXJzOiBObyBhY3RpdmUgY29ubmVjdGlvbi4nKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKChbZXZlbnROYW1lLCBjYWxsYmFja10pID0+IHRoaXMuX2V2ZW50U291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjaykpO1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dXYXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUud2FybihgUUQtVUkgfCBRZFB1c2hFdmVudHNTZXJ2aWNlIC0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dFcnJvcihtZXNzYWdlOiBzdHJpbmcsIGVycj86IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihgUUQtVUkgfCBRZFB1c2hFdmVudHNTZXJ2aWNlIC0gJHttZXNzYWdlfWAsIGVycik7XG4gIH1cbn1cbiJdfQ==
|
|
185
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
186
|
+
type: Optional
|
|
187
|
+
}, {
|
|
188
|
+
type: Inject,
|
|
189
|
+
args: ['QdAuthenticationService']
|
|
190
|
+
}] }] });
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaC1ldmVudHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcWQtdWkvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL3B1c2gtZXZlbnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQzs7QUFJaEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUlILE1BQU0sT0FBTyxtQkFBbUI7SUFVOEM7SUFUcEUsWUFBWSxDQUFlO0lBQzNCLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO0lBQ3RFLFVBQVUsR0FBZ0QsRUFBRSxDQUFDO0lBQzdELGlCQUFpQixDQUFpQztJQUNsRCxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDNUIsNEJBQTRCLEdBQUcsR0FBRyxDQUFDO0lBQ25DLGVBQWUsQ0FBZ0I7SUFDL0IsUUFBUSxDQUFpRTtJQUVqRixZQUE0RSxxQkFBMEI7UUFBMUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFLO0lBQUcsQ0FBQztJQUUxRzs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLEdBQVcsRUFBRSxPQUE0QztRQUMvRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUFFLE9BQU87UUFFM0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FDWCwySUFBMkksQ0FDNUksQ0FBQztnQkFFRixPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUks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LFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVHLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFdEYsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLENBQUM7SUFDbkQsQ0FBQzt1R0FyTFUsbUJBQW1CLGtCQVVFLHlCQUF5QjsyR0FWOUMsbUJBQW1CLGNBRmxCLE1BQU07OzJGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVdjLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXZlbnRTb3VyY2VQb2x5ZmlsbCB9IGZyb20gJ2V2ZW50LXNvdXJjZS1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBORVZFUiwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIEV2ZW50TmFtZSA9ICdSRVNPVVJDRV9DUkVBVEVEJyB8ICdSRVNPVVJDRV9VUERBVEVEJyB8ICdSRVNPVVJDRV9ERUxFVEVEJztcblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBoYW5kbGluZyByZWFsLXRpbWUgc2VydmVyLXNlbnQgZXZlbnRzLlxuICpcbiAqICMjIyBCZW5lZml0c1xuICpcbiAqIC0gKipSZWFsLVRpbWUgSW50ZXJhY3Rpb24qKjogRW5hYmxlcyBsaXZlIHVwZGF0ZXMgd2l0aG91dCB1c2VyIGFjdGlvbnMgb3IgcG9sbGluZy5cbiAqIC0gKipTY2FsYWJsZSBhbmQgRmxleGlibGUqKjogVGhlIHN5c3RlbSBpcyBmbGV4aWJsZSBhbmQgZWFzaWx5IGV4cGFuZGFibGUgdG8gaGFuZGxlIG5ldyBldmVudHMuXG4gKiAtICoqQ29uc2lzdGVuY3kqKjogRW5zdXJlcyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudCBzdGF0ZXMgZm9yIGEgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UuXG4gKiAtICoqQXV0aG9yaXphdGlvbioqOiBJdCB1c2VzIHRoZSB1c2VyJ3MgYXV0aGVudGljYXRpb24gKFFkQXV0aCkgdG8gc2VjdXJlIHRoZSBjb25uZWN0aW9uIGFnYWluc3QgdGhlIGJhY2tlbmQgb3V0LW9mLXRoZS1ib3guIFRoaXMgcmVxdWlyZXMgYSBwcm9wZXIgUWRBdXRoIHNldHVwLiBZb3UgY2FuIGRpc2FibGUgdGhpcyBmZWF0dXJlIHdoZW4gc3RhcnRpbmcgdGhlIGNvbm5lY3Rpb24uXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogYGBgdHNcbiAqIC8vIFN0YXJ0IHRoZSBjb25uZWN0aW9uIHRvIHRoZSBldmVudHNcbiAqIHB1c2hFdmVudHNTZXJ2aWNlLmNvbm5lY3QoJ2h0dHA6Ly9zZXJ2aWNlLWVuZHBpbnQvZXZlbnRzJyk7XG4gKiAvLyBvciBzdGFydCB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIGluIGNhc2UgeW91IGRvbid0IG5lZWQ6XG4gKiBwdXNoRXZlbnRzU2VydmljZS5jb25uZWN0KCdodHRwOi8vc2VydmljZS1lbmRwaW50L2V2ZW50cycsIHsgZGlzYWJsZUF1dGhlbnRpY2F0aW9uOiB0cnVlIH0pO1xuICpcbiAqIC8vIFN1YnNjcmliZSB0byB0aGUgZXZlbnQgKFNpZGUgRWZmZWN0KVxuICogY29uc3Qgc3Vic2NyaXB0aW9uID0gcHVzaEV2ZW50c1NlcnZpY2Uub2JzZXJ2ZSgnUkVTT1VSQ0VfVVBEQVRFRCcpLnN1YnNjcmliZShldmVudCA9PiBoYW5kbGVFdmVudChldmVudCkpO1xuICpcbiAqIC8vIFVuc3Vic2NyaWJlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gKiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAqXG4gKiAvLyBEaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uXG4gKiBwdXNoRXZlbnRzU2VydmljZS5kaXNjb25uZWN0KCk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUWRQdXNoRXZlbnRzU2VydmljZSB7XG4gIHByaXZhdGUgX2V2ZW50U291cmNlITogRXZlbnRTb3VyY2U7XG4gIHByaXZhdGUgX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDxNZXNzYWdlRXZlbnQ+PigpO1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IFtzdHJpbmcsIChtZXNzYWdlOiBNZXNzYWdlRXZlbnQpID0+IHZvaWRdW10gPSBbXTtcbiAgcHJpdmF0ZSBfaGVhcnRiZWF0VGltZW91dCE6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIF9yZWNvbm5lY3REZWxheVRpbWUgPSAxMDAwMDtcbiAgcHJpdmF0ZSBfaGVhcnRiZWF0UmVjb25uZWN0RGVsYXlUaW1lID0gMTAwO1xuICBwcml2YXRlIF9hY2Nlc3NUb2tlblN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfb3B0aW9ucyE6IHsgdXJsOiBzdHJpbmc7IG9wdGlvbnM/OiB7IGRpc2FibGVBdXRoZW50aWNhdGlvbjogYm9vbGVhbiB9IH07XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdCgnUWRBdXRoZW50aWNhdGlvblNlcnZpY2UnKSBwcml2YXRlIHJlYWRvbmx5IGF1dGhlbnRpY2F0aW9uU2VydmljZTogYW55KSB7fVxuXG4gIC8qKlxuICAgKiBFc3RhYmxpc2hlcyBhbiBFdmVudFNvdXJjZSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBVUkwuXG4gICAqIEF1dG9tYXRpY2FsbHkgcmVjb25uZWN0cyBpZiBoZWFydGJlYXQgZmFpbHMgb3IgaXMgZGVsYXllZC5cbiAgICogU3Vic2NyaWJlcnMgYXJlIHJldGFpbmVkIGFjcm9zcyByZWNvbm5lY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIFRoZSBiYWNrZW5kIFVSTCBmb3IgdGhlIGV2ZW50IHN0cmVhbS5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIGNvbm5lY3QodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGRpc2FibGVBdXRoZW50aWNhdGlvbjogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcoKSkgcmV0dXJuO1xuXG4gICAgaWYgKCFvcHRpb25zPy5kaXNhYmxlQXV0aGVudGljYXRpb24pIHtcbiAgICAgIGlmICghdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dFcnJvcihcbiAgICAgICAgICBcIkNhbid0IGNvbm5lY3QgdG8gU1NFIHdpdGhvdXQgUWRBdXRoIGFzIHRoZSBjb25uZWN0aW9uIGhhcyB0byBiZSBzZWN1cmVkLiBQbGVhc2UgaW5zdGFsbCBRZEF1dGggb3IgZGlzYWJsZSBhdXRoZW50aWNhdGlvbiB3aGVuIGNvbm5lY3RpbmcuXCJcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9hY2Nlc3NUb2tlblN1YikgdGhpcy5fYWNjZXNzVG9rZW5TdWIudW5zdWJzY3JpYmUoKTtcblxuICAgICAgdGhpcy5fYWNjZXNzVG9rZW5TdWIgPSB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5hY2Nlc3NUb2tlbiQuc3Vic2NyaWJlKCh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB7IHVybCwgb3B0aW9ucyB9O1xuICAgICAgICB0aGlzLmNvbm5lY3RFdmVudFNvdXJjZShcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb3B0aW9ucyA9IHsgdXJsLCBvcHRpb25zIH07XG4gICAgICB0aGlzLmNvbm5lY3RFdmVudFNvdXJjZSh1cmwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIEV2ZW50U291cmNlIGNvbm5lY3Rpb24gYW5kIGNsZWFycyBhbGwgbGlzdGVuZXJzLlxuICAgKiBTdWJzY3JpYmVycyBhcmUgcHJlc2VydmVkIGZvciByZWNvbm5lY3Rpb24uXG4gICAqL1xuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIHRoaXMubG9nV2FybignTm8gYWN0aXZlIGNvbm5lY3Rpb24gdG8gZGlzY29ubmVjdC4nKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnNGcm9tRXZlbnRTb3VyY2UoKTtcblxuICAgIHRoaXMuX2V2ZW50U291cmNlLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWUuXG4gICAqIElmIG5vdCBjb25uZWN0ZWQsIHJldHVybnMgYE5FVkVSYCBhbmQgbG9ncyBhbiBlcnJvci5cbiAgICogQXV0b21hdGljYWxseSBhZGRzIGEgbGlzdGVuZXIgZm9yIHRoZSBldmVudCBpZiBuZWVkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudE5hbWUgVGhlIGV2ZW50IHR5cGUgKCdSRVNPVVJDRV9DUkVBVEVEJywgJ1JFU09VUkNFX1VQREFURUQnLCAnUkVTT1VSQ0VfREVMRVRFRCcpLlxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4gVGhlIGV2ZW50IHN0cmVhbS5cbiAgICovXG4gIG9ic2VydmUoZXZlbnROYW1lOiBFdmVudE5hbWUpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ0Nhbm5vdCBvYnNlcnZlIGV2ZW50cyB3aXRob3V0IGEgY29ubmVjdGlvbi4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuJyk7XG5cbiAgICAgIHJldHVybiBORVZFUjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuc2V0KGV2ZW50TmFtZSwgbmV3IFN1YmplY3Q8TWVzc2FnZUV2ZW50PigpKTtcblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyRm9yRXZlbnROYW1lKGV2ZW50TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuZ2V0KGV2ZW50TmFtZSkhLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBhbmQgY2xlYXJzIGFsbCBzdWJzY3JpcHRpb25zLlxuICAgKiBUaGUgRXZlbnRTb3VyY2UgY29ubmVjdGlvbiByZW1haW5zIG9wZW4uXG4gICAqL1xuICB1bm9ic2VydmVBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBbGxFdmVudExpc3RlbmVyc0Zyb21FdmVudFNvdXJjZSgpO1xuICAgIHRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIEV2ZW50U291cmNlIGlzIGNvbm5lY3RlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nLlxuICAgKi9cbiAgaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2V2ZW50U291cmNlICYmXG4gICAgICAodGhpcy5fZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PT0gRXZlbnRTb3VyY2UuT1BFTiB8fCB0aGlzLl9ldmVudFNvdXJjZS5yZWFkeVN0YXRlID09PSBFdmVudFNvdXJjZS5DT05ORUNUSU5HKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZE9yQ29ubmVjdGluZygpKSByZXR1cm47XG5cbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmNvbm5lY3QodGhpcy5fb3B0aW9ucy51cmwsIHRoaXMuX29wdGlvbnMub3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXJGb3JFdmVudE5hbWUoZXZlbnROYW1lOiBFdmVudE5hbWUpOiB2b2lkIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IChtZXNzYWdlRXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuX2V2ZW50U3Vic2NyaXB0aW9uU3ViamVjdHMuZ2V0KGV2ZW50TmFtZSk7XG5cbiAgICAgIGlmIChzdWJqZWN0KSBzdWJqZWN0Lm5leHQobWVzc2FnZUV2ZW50KTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChbZXZlbnROYW1lLCBjYWxsYmFja10pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFdmVudExpc3RlbmVyc0ZvckV4aXN0aW5nU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudFN1YnNjcmlwdGlvblN1YmplY3RzLmZvckVhY2goKHN1YmplY3QsIGV2ZW50TmFtZSkgPT5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lclRvRXZlbnRTb3VyY2UoZXZlbnROYW1lIGFzIEV2ZW50TmFtZSwgKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PlxuICAgICAgICBzdWJqZWN0Lm5leHQobWVzc2FnZUV2ZW50KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXJUb0V2ZW50U291cmNlKGV2ZW50TmFtZTogRXZlbnROYW1lLCBjYWxsYmFjazogKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChbZXZlbnROYW1lLCBjYWxsYmFja10pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBbGxFdmVudExpc3RlbmVyc0Zyb21FdmVudFNvdXJjZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50U291cmNlKSB7XG4gICAgICB0aGlzLmxvZ1dhcm4oJ0Nhbm5vdCByZW1vdmUgbGlzdGVuZXJzOiBObyBhY3RpdmUgY29ubmVjdGlvbi4nKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKChbZXZlbnROYW1lLCBjYWxsYmFja10pID0+IHRoaXMuX2V2ZW50U291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjaykpO1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dXYXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUud2FybihgUUQtVUkgfCBRZFB1c2hFdmVudHNTZXJ2aWNlIC0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dFcnJvcihtZXNzYWdlOiBzdHJpbmcsIGVycj86IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihgUUQtVUkgfCBRZFB1c2hFdmVudHNTZXJ2aWNlIC0gJHttZXNzYWdlfWAsIGVycik7XG4gIH1cblxuICBwcml2YXRlIGNvbm5lY3RFdmVudFNvdXJjZSh1cmw6IHN0cmluZywgb3B0aW9uczogdW5rbm93biA9IHt9LCByZWNvbm5lY3Q/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2V2ZW50U291cmNlICYmIHRoaXMuX2V2ZW50U291cmNlLnJlYWR5U3RhdGUgIT09IEV2ZW50U291cmNlLkNMT1NFRCkgdGhpcy5fZXZlbnRTb3VyY2UuY2xvc2UoKTtcblxuICAgIGlmICghdGhpcy5fZXZlbnRTb3VyY2UgfHwgdGhpcy5fZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PT0gRXZlbnRTb3VyY2UuQ0xPU0VEIHx8IHJlY29ubmVjdClcbiAgICAgIHRoaXMuX2V2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlUG9seWZpbGwodXJsLCBvcHRpb25zKTtcblxuICAgIHRoaXMuX2V2ZW50U291cmNlLm9uZXJyb3IgPSAoZXJyOiBFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX2V2ZW50U291cmNlLnJlYWR5U3RhdGUgPT09IEV2ZW50U291cmNlLkNMT1NFRCkgdGhpcy5yZWNvbm5lY3QoKTtcblxuICAgICAgdGhpcy5sb2dFcnJvcignU1NFIGNvbm5lY3Rpb24gZXJyb3I6JywgZXJyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignSEVBUlRCRUFUJywgKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2hlYXJ0YmVhdFRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLl9oZWFydGJlYXRUaW1lb3V0KTtcblxuICAgICAgY29uc3QgaW50ZXJ2YWwgPSBKU09OLnBhcnNlKG1lc3NhZ2UuZGF0YSkuaW50ZXJ2YWw7XG4gICAgICB0aGlzLl9oZWFydGJlYXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlY29ubmVjdCgpLCBpbnRlcnZhbCArIHRoaXMuX2hlYXJ0YmVhdFJlY29ubmVjdERlbGF5VGltZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9oZWFydGJlYXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlY29ubmVjdCgpLCB0aGlzLl9yZWNvbm5lY3REZWxheVRpbWUpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyc0ZvckV4aXN0aW5nU3Vic2NyaXB0aW9ucygpO1xuICB9XG59XG4iXX0=
|
|
@@ -21,6 +21,7 @@ import { ComponentPortal } from '@angular/cdk/portal';
|
|
|
21
21
|
import * as i1$5 from '@angular/cdk/overlay';
|
|
22
22
|
import { OverlayModule } from '@angular/cdk/overlay';
|
|
23
23
|
import isNumber from 'lodash/isNumber';
|
|
24
|
+
import { EventSourcePolyfill } from 'event-source-polyfill';
|
|
24
25
|
import * as i1$6 from '@angular/platform-browser';
|
|
25
26
|
import * as i4 from 'ngx-editor';
|
|
26
27
|
import { Editor, NgxEditorModule } from 'ngx-editor';
|
|
@@ -8109,12 +8110,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
8109
8110
|
* - **Real-Time Interaction**: Enables live updates without user actions or polling.
|
|
8110
8111
|
* - **Scalable and Flexible**: The system is flexible and easily expandable to handle new events.
|
|
8111
8112
|
* - **Consistency**: Ensures synchronization between server and client states for a consistent user experience.
|
|
8113
|
+
* - **Authorization**: It uses the user's authentication (QdAuth) to secure the connection against the backend out-of-the-box. This requires a proper QdAuth setup. You can disable this feature when starting the connection.
|
|
8112
8114
|
*
|
|
8113
8115
|
* ### Usage
|
|
8114
8116
|
*
|
|
8115
8117
|
* ```ts
|
|
8116
8118
|
* // Start the connection to the events
|
|
8117
8119
|
* pushEventsService.connect('http://service-endpint/events');
|
|
8120
|
+
* // or start without authentication in case you don't need:
|
|
8121
|
+
* pushEventsService.connect('http://service-endpint/events', { disableAuthentication: true });
|
|
8118
8122
|
*
|
|
8119
8123
|
* // Subscribe to the event (Side Effect)
|
|
8120
8124
|
* const subscription = pushEventsService.observe('RESOURCE_UPDATED').subscribe(event => handleEvent(event));
|
|
@@ -8127,37 +8131,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
8127
8131
|
* ```
|
|
8128
8132
|
*/
|
|
8129
8133
|
class QdPushEventsService {
|
|
8134
|
+
authenticationService;
|
|
8130
8135
|
_eventSource;
|
|
8131
8136
|
_eventSubscriptionSubjects = new Map();
|
|
8132
8137
|
_listeners = [];
|
|
8133
8138
|
_heartbeatTimeout;
|
|
8134
8139
|
_reconnectDelayTime = 10000;
|
|
8135
8140
|
_heartbeatReconnectDelayTime = 100;
|
|
8141
|
+
_accessTokenSub;
|
|
8142
|
+
_options;
|
|
8143
|
+
constructor(authenticationService) {
|
|
8144
|
+
this.authenticationService = authenticationService;
|
|
8145
|
+
}
|
|
8136
8146
|
/**
|
|
8137
8147
|
* Establishes an EventSource connection to the given URL.
|
|
8138
8148
|
* Automatically reconnects if heartbeat fails or is delayed.
|
|
8139
8149
|
* Subscribers are retained across reconnections.
|
|
8140
8150
|
*
|
|
8141
8151
|
* @param url The backend URL for the event stream.
|
|
8152
|
+
* @param options Options for the connection
|
|
8142
8153
|
*/
|
|
8143
|
-
connect(url) {
|
|
8154
|
+
connect(url, options) {
|
|
8144
8155
|
if (this.isConnectedOrConnecting())
|
|
8145
8156
|
return;
|
|
8146
|
-
if (!
|
|
8147
|
-
this.
|
|
8148
|
-
|
|
8149
|
-
|
|
8150
|
-
|
|
8151
|
-
this.
|
|
8152
|
-
|
|
8153
|
-
|
|
8154
|
-
|
|
8155
|
-
|
|
8156
|
-
|
|
8157
|
-
|
|
8158
|
-
|
|
8159
|
-
|
|
8160
|
-
|
|
8157
|
+
if (!options?.disableAuthentication) {
|
|
8158
|
+
if (!this.authenticationService) {
|
|
8159
|
+
this.logError("Can't connect to SSE without QdAuth as the connection has to be secured. Please install QdAuth or disable authentication when connecting.");
|
|
8160
|
+
return;
|
|
8161
|
+
}
|
|
8162
|
+
if (this._accessTokenSub)
|
|
8163
|
+
this._accessTokenSub.unsubscribe();
|
|
8164
|
+
this._accessTokenSub = this.authenticationService.accessToken$.subscribe((token) => {
|
|
8165
|
+
this._options = { url, options };
|
|
8166
|
+
this.connectEventSource(url, {
|
|
8167
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
8168
|
+
}, true);
|
|
8169
|
+
});
|
|
8170
|
+
}
|
|
8171
|
+
else {
|
|
8172
|
+
this._options = { url, options };
|
|
8173
|
+
this.connectEventSource(url);
|
|
8174
|
+
}
|
|
8161
8175
|
}
|
|
8162
8176
|
/**
|
|
8163
8177
|
* Closes the EventSource connection and clears all listeners.
|
|
@@ -8206,10 +8220,10 @@ class QdPushEventsService {
|
|
|
8206
8220
|
(this._eventSource.readyState === EventSource.OPEN || this._eventSource.readyState === EventSource.CONNECTING));
|
|
8207
8221
|
}
|
|
8208
8222
|
reconnect() {
|
|
8209
|
-
if (
|
|
8210
|
-
|
|
8211
|
-
|
|
8212
|
-
|
|
8223
|
+
if (this.isConnectedOrConnecting())
|
|
8224
|
+
return;
|
|
8225
|
+
this.disconnect();
|
|
8226
|
+
this.connect(this._options.url, this._options.options);
|
|
8213
8227
|
}
|
|
8214
8228
|
addEventListenerForEventName(eventName) {
|
|
8215
8229
|
const callback = (messageEvent) => {
|
|
@@ -8241,7 +8255,26 @@ class QdPushEventsService {
|
|
|
8241
8255
|
logError(message, err) {
|
|
8242
8256
|
console.error(`QD-UI | QdPushEventsService - ${message}`, err);
|
|
8243
8257
|
}
|
|
8244
|
-
|
|
8258
|
+
connectEventSource(url, options = {}, reconnect) {
|
|
8259
|
+
if (this._eventSource && this._eventSource.readyState !== EventSource.CLOSED)
|
|
8260
|
+
this._eventSource.close();
|
|
8261
|
+
if (!this._eventSource || this._eventSource.readyState === EventSource.CLOSED || reconnect)
|
|
8262
|
+
this._eventSource = new EventSourcePolyfill(url, options);
|
|
8263
|
+
this._eventSource.onerror = (err) => {
|
|
8264
|
+
if (this._eventSource.readyState === EventSource.CLOSED)
|
|
8265
|
+
this.reconnect();
|
|
8266
|
+
this.logError('SSE connection error:', err);
|
|
8267
|
+
};
|
|
8268
|
+
this._eventSource.addEventListener('HEARTBEAT', (message) => {
|
|
8269
|
+
if (this._heartbeatTimeout)
|
|
8270
|
+
clearTimeout(this._heartbeatTimeout);
|
|
8271
|
+
const interval = JSON.parse(message.data).interval;
|
|
8272
|
+
this._heartbeatTimeout = setTimeout(() => this.reconnect(), interval + this._heartbeatReconnectDelayTime);
|
|
8273
|
+
});
|
|
8274
|
+
this._heartbeatTimeout = setTimeout(() => this.reconnect(), this._reconnectDelayTime);
|
|
8275
|
+
this.addEventListenersForExistingSubscriptions();
|
|
8276
|
+
}
|
|
8277
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdPushEventsService, deps: [{ token: 'QdAuthenticationService', optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
8245
8278
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdPushEventsService, providedIn: 'root' });
|
|
8246
8279
|
}
|
|
8247
8280
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdPushEventsService, decorators: [{
|
|
@@ -8249,7 +8282,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
8249
8282
|
args: [{
|
|
8250
8283
|
providedIn: 'root'
|
|
8251
8284
|
}]
|
|
8252
|
-
}]
|
|
8285
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
8286
|
+
type: Optional
|
|
8287
|
+
}, {
|
|
8288
|
+
type: Inject,
|
|
8289
|
+
args: ['QdAuthenticationService']
|
|
8290
|
+
}] }] });
|
|
8253
8291
|
|
|
8254
8292
|
const QD_POPOVER_TOP_FIRST = new InjectionToken('QD_POPOVER_TOP_FIRST');
|
|
8255
8293
|
|