@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 (!this._eventSource || this._eventSource.readyState === EventSource.CLOSED)
47
- this._eventSource = new EventSource(url);
48
- this._eventSource.onerror = (err) => {
49
- if (this._eventSource.readyState === EventSource.CLOSED)
50
- this.reconnect();
51
- this.logError('SSE connection error:', err);
52
- };
53
- this._eventSource.addEventListener('HEARTBEAT', message => {
54
- if (this._heartbeatTimeout)
55
- clearTimeout(this._heartbeatTimeout);
56
- const interval = JSON.parse(message.data).interval;
57
- this._heartbeatTimeout = setTimeout(() => this.reconnect(), interval + this._heartbeatReconnectDelayTime);
58
- });
59
- this._heartbeatTimeout = setTimeout(() => this.reconnect(), this._reconnectDelayTime);
60
- this.addEventListenersForExistingSubscriptions();
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 (!this.isConnectedOrConnecting()) {
110
- this.disconnect();
111
- this.connect(this._eventSource.url);
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
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdPushEventsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
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 (!this._eventSource || this._eventSource.readyState === EventSource.CLOSED)
8147
- this._eventSource = new EventSource(url);
8148
- this._eventSource.onerror = (err) => {
8149
- if (this._eventSource.readyState === EventSource.CLOSED)
8150
- this.reconnect();
8151
- this.logError('SSE connection error:', err);
8152
- };
8153
- this._eventSource.addEventListener('HEARTBEAT', message => {
8154
- if (this._heartbeatTimeout)
8155
- clearTimeout(this._heartbeatTimeout);
8156
- const interval = JSON.parse(message.data).interval;
8157
- this._heartbeatTimeout = setTimeout(() => this.reconnect(), interval + this._heartbeatReconnectDelayTime);
8158
- });
8159
- this._heartbeatTimeout = setTimeout(() => this.reconnect(), this._reconnectDelayTime);
8160
- this.addEventListenersForExistingSubscriptions();
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 (!this.isConnectedOrConnecting()) {
8210
- this.disconnect();
8211
- this.connect(this._eventSource.url);
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
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: QdPushEventsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
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