@elderbyte/ngx-starter 17.6.4 → 17.7.1

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.
Files changed (23) hide show
  1. package/esm2022/lib/features/event-source/fetch/public_api.mjs +3 -0
  2. package/esm2022/lib/features/event-source/fetch/reactive-fetch-event-source.mjs +217 -0
  3. package/esm2022/lib/features/event-source/fetch/reactive-fetch-event-source.service.mjs +53 -0
  4. package/esm2022/lib/features/event-source/public_api.mjs +3 -3
  5. package/esm2022/lib/features/event-source/standard/elder-event-source.service.mjs +56 -0
  6. package/esm2022/lib/features/event-source/standard/public_api.mjs +3 -0
  7. package/esm2022/lib/features/event-source/standard/reactive-event-source.mjs +198 -0
  8. package/esm2022/lib/features/kafent/sse/kafent-event-stream-sse.service.mjs +2 -2
  9. package/esm2022/lib/features/kafent/sse/kafent-topic-sse.mjs +1 -1
  10. package/fesm2022/elderbyte-ngx-starter.mjs +266 -3
  11. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  12. package/lib/features/event-source/fetch/public_api.d.ts +2 -0
  13. package/lib/features/event-source/fetch/reactive-fetch-event-source.d.ts +109 -0
  14. package/lib/features/event-source/fetch/reactive-fetch-event-source.service.d.ts +39 -0
  15. package/lib/features/event-source/public_api.d.ts +2 -2
  16. package/lib/features/event-source/standard/public_api.d.ts +2 -0
  17. package/lib/features/kafent/sse/kafent-event-stream-sse.service.d.ts +1 -1
  18. package/lib/features/kafent/sse/kafent-topic-sse.d.ts +1 -1
  19. package/package.json +3 -2
  20. package/esm2022/lib/features/event-source/elder-event-source.service.mjs +0 -56
  21. package/esm2022/lib/features/event-source/reactive-event-source.mjs +0 -198
  22. /package/lib/features/event-source/{elder-event-source.service.d.ts → standard/elder-event-source.service.d.ts} +0 -0
  23. /package/lib/features/event-source/{reactive-event-source.d.ts → standard/reactive-event-source.d.ts} +0 -0
@@ -0,0 +1,2 @@
1
+ export * from './reactive-fetch-event-source';
2
+ export * from './reactive-fetch-event-source.service';
@@ -0,0 +1,109 @@
1
+ import { Observable } from 'rxjs';
2
+ export declare enum ReactiveEventSourceState {
3
+ IDLE = "IDLE",
4
+ CONNECTING = "CONNECTING",
5
+ OPEN = "OPEN",
6
+ CLOSED = "CLOSED",
7
+ ERROR = "ERROR"
8
+ }
9
+ export declare class ReactiveSSeMessage<T = string> {
10
+ readonly id: string;
11
+ readonly event: string;
12
+ readonly data: T;
13
+ readonly retry?: number;
14
+ constructor(id: string, event: string, data: T, retry?: number);
15
+ }
16
+ export interface EventSourceRequestInit {
17
+ request: RequestInfo;
18
+ method?: string;
19
+ headers?: Record<string, string>;
20
+ }
21
+ export declare class ReactiveFetchEventSource<T = any> {
22
+ private readonly requestInitProvider;
23
+ /***************************************************************************
24
+ * *
25
+ * Fields *
26
+ * *
27
+ **************************************************************************/
28
+ private readonly log;
29
+ private _closed;
30
+ private readonly abortController;
31
+ private readonly state$;
32
+ private _unsubscribeSub;
33
+ private readonly eventTopics;
34
+ /***************************************************************************
35
+ * *
36
+ * Static Builder *
37
+ * *
38
+ **************************************************************************/
39
+ static staticRequest<T>(requestInit: EventSourceRequestInit): ReactiveFetchEventSource<T>;
40
+ static dynamicRequest<T>(requestInitProvider: () => EventSourceRequestInit): ReactiveFetchEventSource<T>;
41
+ /***************************************************************************
42
+ * *
43
+ * Constructor *
44
+ * *
45
+ **************************************************************************/
46
+ private constructor();
47
+ /***************************************************************************
48
+ * *
49
+ * Properties *
50
+ * *
51
+ **************************************************************************/
52
+ get closed(): boolean;
53
+ /***************************************************************************
54
+ * *
55
+ * Public API *
56
+ * *
57
+ **************************************************************************/
58
+ /**
59
+ * Open the event source.
60
+ *
61
+ * Note: The connection is opened automatically upon object creation.
62
+ * This method should only be used if this reactive-event-source has
63
+ * been closed explicitly.
64
+ */
65
+ open(): void;
66
+ /**
67
+ * Get an event stream for the given event type.
68
+ * @param eventTypeRaw The event type. Defaults to 'message'.
69
+ */
70
+ events(eventTypeRaw?: string): Observable<ReactiveSSeMessage>;
71
+ /**
72
+ * Get an event stream of messages parsed from json.
73
+ * (event.data must be in json format)
74
+ *
75
+ * @param eventType The event type. Defaults to 'message'.
76
+ */
77
+ eventsJson(eventType?: string): Observable<T>;
78
+ /**
79
+ * Close this event source. It won't reconnect.
80
+ */
81
+ close(): void;
82
+ /**
83
+ * Keeps this reactive event source open until the given observable emits an event.
84
+ * @param unsubscribe
85
+ */
86
+ openUntil(unsubscribe: Observable<any>): this;
87
+ /***************************************************************************
88
+ * *
89
+ * Private methods *
90
+ * *
91
+ **************************************************************************/
92
+ private cleanUpOpenUntil;
93
+ /**
94
+ * Close the current event source
95
+ */
96
+ private closeCurrent;
97
+ /**
98
+ * Reconnects this event source, unless closed is true;
99
+ */
100
+ private reconnect;
101
+ private openEventSource;
102
+ private handleOnOpen;
103
+ private handleOnError;
104
+ private tryReconnect;
105
+ private handleOnMessage;
106
+ private handleOnClose;
107
+ private updateState;
108
+ private eventTypeOrDefault;
109
+ }
@@ -0,0 +1,39 @@
1
+ import { EventSourceRequestInit, ReactiveFetchEventSource } from './reactive-fetch-event-source';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Angular reactive EventSource integration
5
+ */
6
+ export declare class ReactiveFetchEventSourceService {
7
+ /***************************************************************************
8
+ * *
9
+ * Fields *
10
+ * *
11
+ **************************************************************************/
12
+ private readonly log;
13
+ /***************************************************************************
14
+ * *
15
+ * Constructor *
16
+ * *
17
+ **************************************************************************/
18
+ constructor();
19
+ /***************************************************************************
20
+ * *
21
+ * Public API *
22
+ * *
23
+ **************************************************************************/
24
+ /**
25
+ * Creates an reactive, automatic reconnecting event source.
26
+ *
27
+ * @param requestInit The request to the event source
28
+ */
29
+ reactiveEventSource<T = any>(requestInit: EventSourceRequestInit): ReactiveFetchEventSource<T>;
30
+ /**
31
+ * Creates an reactive, automatic reconnecting event source. Each time the event source
32
+ * reconnects, the url provider is invoked.
33
+ *
34
+ * @param requestInitProvider The request provider of the event source
35
+ */
36
+ reactiveEventSourceDynamic<T = any>(requestInitProvider: () => EventSourceRequestInit): ReactiveFetchEventSource<T>;
37
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReactiveFetchEventSourceService, never>;
38
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReactiveFetchEventSourceService>;
39
+ }
@@ -1,2 +1,2 @@
1
- export * from './reactive-event-source';
2
- export * from './elder-event-source.service';
1
+ export * from './standard/public_api';
2
+ export * from './fetch/public_api';
@@ -0,0 +1,2 @@
1
+ export * from './reactive-event-source';
2
+ export * from './elder-event-source.service';
@@ -3,7 +3,7 @@ import { KafentEvent } from '../kafent-event';
3
3
  import { Observable } from 'rxjs';
4
4
  import { KafentTokenProvider } from '../access-token-provider';
5
5
  import { KafentConfig } from '../kafent-config';
6
- import { ElderEventSourceService } from '../../event-source/elder-event-source.service';
6
+ import { ElderEventSourceService } from '../../event-source/standard/elder-event-source.service';
7
7
  import { KafentLiveEventRequest } from '../kafent-live-event-request';
8
8
  import { KafentEventStream } from '../kafent-event-stream';
9
9
  import * as i0 from "@angular/core";
@@ -1,6 +1,6 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { KafentEvent } from '../kafent-event';
3
- import { ReactiveEventSource } from '../../event-source/reactive-event-source';
3
+ import { ReactiveEventSource } from '../../event-source/standard/reactive-event-source';
4
4
  export declare class KafentTopicSse {
5
5
  private readonly topic;
6
6
  /***************************************************************************
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elderbyte/ngx-starter",
3
- "version": "17.6.4",
3
+ "version": "17.7.1",
4
4
  "peerDependencies": {
5
5
  "@angular/core": "^17.0.0 || ^18.0.0",
6
6
  "@angular/common": "^17.0.0 || ^18.0.0",
@@ -25,7 +25,8 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "tslib": "^2.3.0",
28
- "streamsaver": "^2.0.5"
28
+ "streamsaver": "^2.0.5",
29
+ "@microsoft/fetch-event-source": "^2.0.1"
29
30
  },
30
31
  "module": "fesm2022/elderbyte-ngx-starter.mjs",
31
32
  "typings": "index.d.ts",
@@ -1,56 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { LoggerFactory } from '@elderbyte/ts-logger';
3
- import { ReactiveEventSource } from './reactive-event-source';
4
- import * as i0 from "@angular/core";
5
- /**
6
- * Angular reactive EventSource integration
7
- */
8
- export class ElderEventSourceService {
9
- /***************************************************************************
10
- * *
11
- * Constructor *
12
- * *
13
- **************************************************************************/
14
- constructor(zone) {
15
- this.zone = zone;
16
- /***************************************************************************
17
- * *
18
- * Fields *
19
- * *
20
- **************************************************************************/
21
- this.logger = LoggerFactory.getLogger('ElderEventSourceService');
22
- }
23
- /***************************************************************************
24
- * *
25
- * Public API *
26
- * *
27
- **************************************************************************/
28
- /**
29
- * Creates an reactive, automatic reconnecting event source.
30
- *
31
- * @param eventSourceUrl The url to the event source
32
- * @param eventSourceInitDict Additional configuration to use when connecting. (optional)
33
- */
34
- reactiveEventSource(eventSourceUrl, eventSourceInitDict) {
35
- return ReactiveEventSource.staticUrl(this.zone, eventSourceUrl, eventSourceInitDict);
36
- }
37
- /**
38
- * Creates an reactive, automatic reconnecting event source. Each time the event source
39
- * reconnects, the url provider is invoked.
40
- *
41
- * @param eventSourceUrlProvider The url provider of the event source
42
- * @param eventSourceInitDict Additional configuration to use when connecting. (optional)
43
- */
44
- reactiveEventSourceDynamic(eventSourceUrlProvider, eventSourceInitDict) {
45
- return ReactiveEventSource.dynamicUrl(this.zone, eventSourceUrlProvider, eventSourceInitDict);
46
- }
47
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ElderEventSourceService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
48
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ElderEventSourceService, providedIn: 'root' }); }
49
- }
50
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ElderEventSourceService, decorators: [{
51
- type: Injectable,
52
- args: [{
53
- providedIn: 'root'
54
- }]
55
- }], ctorParameters: () => [{ type: i0.NgZone }] });
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItZXZlbnQtc291cmNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9mZWF0dXJlcy9ldmVudC1zb3VyY2UvZWxkZXItZXZlbnQtc291cmNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7O0FBRTVEOztHQUVHO0FBSUgsTUFBTSxPQUFPLHVCQUF1QjtJQVVsQzs7OztnRkFJNEU7SUFFNUUsWUFDVSxJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtRQWZ0Qjs7OztvRkFJNEU7UUFFM0QsV0FBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQVV6RSxDQUFDO0lBRUw7Ozs7Z0ZBSTRFO0lBRTVFOzs7OztPQUtHO0lBQ0ksbUJBQW1CLENBQVUsY0FBc0IsRUFDdEIsbUJBQXFDO1FBRXZFLE9BQU8sbUJBQW1CLENBQUMsU0FBUyxDQUNsQyxJQUFJLENBQUMsSUFBSSxFQUNULGNBQWMsRUFDZCxtQkFBbUIsQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEIsQ0FDL0Isc0JBQW9DLEVBQ3BDLG1CQUFxQztRQUVyQyxPQUFPLG1CQUFtQixDQUFDLFVBQVUsQ0FDbkMsSUFBSSxDQUFDLElBQUksRUFDVCxzQkFBc0IsRUFDdEIsbUJBQW1CLENBQ3BCLENBQUM7SUFDSixDQUFDOzhHQTFEVSx1QkFBdUI7a0hBQXZCLHVCQUF1QixjQUZ0QixNQUFNOzsyRkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJGYWN0b3J5fSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcic7XG5pbXBvcnQge1JlYWN0aXZlRXZlbnRTb3VyY2V9IGZyb20gJy4vcmVhY3RpdmUtZXZlbnQtc291cmNlJztcblxuLyoqXG4gKiBBbmd1bGFyIHJlYWN0aXZlIEV2ZW50U291cmNlIGludGVncmF0aW9uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEVsZGVyRXZlbnRTb3VyY2VTZXJ2aWNlIHtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKCdFbGRlckV2ZW50U291cmNlU2VydmljZScpO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgem9uZTogTmdab25lXG4gICkgeyB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFB1YmxpYyBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gcmVhY3RpdmUsIGF1dG9tYXRpYyByZWNvbm5lY3RpbmcgZXZlbnQgc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRTb3VyY2VVcmwgVGhlIHVybCB0byB0aGUgZXZlbnQgc291cmNlXG4gICAqIEBwYXJhbSBldmVudFNvdXJjZUluaXREaWN0IEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nLiAob3B0aW9uYWwpXG4gICAqL1xuICBwdWJsaWMgcmVhY3RpdmVFdmVudFNvdXJjZTxUID0gYW55PihldmVudFNvdXJjZVVybDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZUluaXREaWN0PzogRXZlbnRTb3VyY2VJbml0XG4gICk6IFJlYWN0aXZlRXZlbnRTb3VyY2U8VD4ge1xuICAgIHJldHVybiBSZWFjdGl2ZUV2ZW50U291cmNlLnN0YXRpY1VybChcbiAgICAgIHRoaXMuem9uZSxcbiAgICAgIGV2ZW50U291cmNlVXJsLFxuICAgICAgZXZlbnRTb3VyY2VJbml0RGljdCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gcmVhY3RpdmUsIGF1dG9tYXRpYyByZWNvbm5lY3RpbmcgZXZlbnQgc291cmNlLiBFYWNoIHRpbWUgdGhlIGV2ZW50IHNvdXJjZVxuICAgKiByZWNvbm5lY3RzLCB0aGUgdXJsIHByb3ZpZGVyIGlzIGludm9rZWQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFNvdXJjZVVybFByb3ZpZGVyIFRoZSB1cmwgcHJvdmlkZXIgb2YgdGhlIGV2ZW50IHNvdXJjZVxuICAgKiBAcGFyYW0gZXZlbnRTb3VyY2VJbml0RGljdCBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gY29ubmVjdGluZy4gKG9wdGlvbmFsKVxuICAgKi9cbiAgcHVibGljIHJlYWN0aXZlRXZlbnRTb3VyY2VEeW5hbWljPFQgPSBhbnk+KFxuICAgIGV2ZW50U291cmNlVXJsUHJvdmlkZXI6ICgpID0+IHN0cmluZyxcbiAgICBldmVudFNvdXJjZUluaXREaWN0PzogRXZlbnRTb3VyY2VJbml0XG4gICk6IFJlYWN0aXZlRXZlbnRTb3VyY2U8VD4ge1xuICAgIHJldHVybiBSZWFjdGl2ZUV2ZW50U291cmNlLmR5bmFtaWNVcmwoXG4gICAgICB0aGlzLnpvbmUsXG4gICAgICBldmVudFNvdXJjZVVybFByb3ZpZGVyLFxuICAgICAgZXZlbnRTb3VyY2VJbml0RGljdCxcbiAgICApO1xuICB9XG5cbn1cbiJdfQ==
@@ -1,198 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import { LoggerFactory } from '@elderbyte/ts-logger';
3
- import { map } from 'rxjs/operators';
4
- /**
5
- * This class provides a reactive wrapper around an event source.
6
- *
7
- * It supports event type filtering out of the box and manages the registrations.
8
- *
9
- * Additionally, it also handles reconnects since the default reconect handling by browsers
10
- * is not working in a lot of cases (5xx errors etc).
11
- *
12
- */
13
- export class ReactiveEventSource {
14
- /***************************************************************************
15
- * *
16
- * Static Builder *
17
- * *
18
- **************************************************************************/
19
- static staticUrl(zone, eventSourceUrl, eventSourceInitDict) {
20
- if (!eventSourceUrl) {
21
- throw new Error('You must provide a event source url!');
22
- }
23
- return new ReactiveEventSource(zone, () => eventSourceUrl, eventSourceInitDict);
24
- }
25
- static dynamicUrl(zone, eventSourceUrlProvider, eventSourceInitDict) {
26
- return new ReactiveEventSource(zone, eventSourceUrlProvider, eventSourceInitDict);
27
- }
28
- /***************************************************************************
29
- * *
30
- * Constructor *
31
- * *
32
- **************************************************************************/
33
- constructor(zone, eventSourceUrlProvider, eventSourceInitDict) {
34
- this.zone = zone;
35
- this.eventSourceUrlProvider = eventSourceUrlProvider;
36
- this.eventSourceInitDict = eventSourceInitDict;
37
- /***************************************************************************
38
- * *
39
- * Fields *
40
- * *
41
- **************************************************************************/
42
- this.logger = LoggerFactory.getLogger('ReactiveEventSource');
43
- this.eventTopics = new Map();
44
- this.currentListeners = new Set();
45
- if (!eventSourceUrlProvider) {
46
- throw new Error('You must provide a event source url provider!');
47
- }
48
- this.open();
49
- }
50
- /***************************************************************************
51
- * *
52
- * Properties *
53
- * *
54
- **************************************************************************/
55
- get closed() {
56
- return this._closed;
57
- }
58
- /***************************************************************************
59
- * *
60
- * Public API *
61
- * *
62
- **************************************************************************/
63
- /**
64
- * Open the event source.
65
- *
66
- * Note: The connection is opened automatically upon object creation.
67
- * This method should only be used if this reactive-event-source has
68
- * been closed explicitly.
69
- */
70
- open() {
71
- this._closed = false;
72
- this.reconnect();
73
- }
74
- /**
75
- * Get an event stream for the given event type.
76
- * @param eventType The event type. Defaults to 'message'.
77
- */
78
- events(eventType = 'message') {
79
- if (!this.eventTopics.has(eventType)) {
80
- this.eventTopics.set(eventType, new Subject());
81
- this.ensureRegistrations();
82
- }
83
- const eventSubj = this.eventTopics.get(eventType);
84
- return eventSubj.asObservable();
85
- }
86
- /**
87
- * Get an event stream of messages parsed from json.
88
- * (event.data must be in json format)
89
- *
90
- * @param eventType The event type. Defaults to 'message'.
91
- */
92
- eventsJson(eventType = 'message') {
93
- return this.events(eventType).pipe(map(event => JSON.parse(event.data)));
94
- }
95
- /**
96
- * Close this event source. It wont reconnect.
97
- */
98
- close() {
99
- this._closed = true;
100
- this.closeCurrent();
101
- this.logger.debug('Closing the event-source.');
102
- }
103
- /**
104
- * Keeps this reactive event source open until the given observable emits an event.
105
- * @param unsubscribe
106
- */
107
- openUntil(unsubscribe) {
108
- this.cleanUpOpenUntil();
109
- this._unsubscribeSub = unsubscribe
110
- .subscribe(() => this.close());
111
- return this;
112
- }
113
- /***************************************************************************
114
- * *
115
- * Private methods *
116
- * *
117
- **************************************************************************/
118
- cleanUpOpenUntil() {
119
- if (this._unsubscribeSub) {
120
- this._unsubscribeSub.unsubscribe();
121
- this._unsubscribeSub = null;
122
- }
123
- }
124
- /**
125
- * Reconnects this event source, unless closed is true;
126
- */
127
- reconnect() {
128
- if (this._closed) {
129
- return;
130
- }
131
- this.closeCurrent();
132
- const eventSourceUrl = this.eventSourceUrlProvider();
133
- try {
134
- this.currentSource = new EventSource(eventSourceUrl, this.eventSourceInitDict);
135
- this.ensureRegistrations();
136
- this.currentSource.onopen = (event) => {
137
- this.logger.debug('EventSource connection opened to: ' + eventSourceUrl +
138
- ', state: ' + this.readyStateAsString(this.currentSource), event);
139
- };
140
- this.currentSource.onerror = (error) => {
141
- this.logger.trace('There was an SSE error, current state: ' + this.readyStateAsString(this.currentSource), error);
142
- if (!this.closed) {
143
- // There was an error - try reconnecting
144
- this.logger.debug('Attempting to reconnect event-source at' + eventSourceUrl + '...');
145
- setTimeout(() => this.reconnect(), 3000); // Delay the reconnect
146
- }
147
- else {
148
- this.logger.debug('There was an error in the sse connection (closed).', error);
149
- }
150
- };
151
- }
152
- catch (err) {
153
- this.logger.error('Failed to create EventSource for ' + eventSourceUrl, err);
154
- setTimeout(() => this.reconnect(), 3000); // Delay the reconnect
155
- }
156
- }
157
- ensureRegistrations() {
158
- if (this.currentSource) {
159
- this.eventTopics.forEach((subject, type) => {
160
- if (!this.currentListeners.has(type)) {
161
- this.currentSource.addEventListener(type, msg => subject.next(msg), false);
162
- this.currentListeners.add(type);
163
- this.logger.debug('Listening to event type: ' + type);
164
- }
165
- });
166
- }
167
- }
168
- /**
169
- * Close the current event source
170
- */
171
- closeCurrent() {
172
- this.currentListeners.clear();
173
- if (!this.currentClosed) {
174
- // Close Event Source if not already closed.
175
- this.logger.debug('Closing the event-source.');
176
- this.currentSource.close();
177
- this.currentSource = null;
178
- }
179
- }
180
- get currentClosed() {
181
- return !this.currentSource || this.currentSource.readyState === this.currentSource.CLOSED;
182
- }
183
- readyStateAsString(source) {
184
- if (source.readyState === source.OPEN) {
185
- return 'OPEN';
186
- }
187
- else if (source.readyState === source.CLOSED) {
188
- return 'CLOSED';
189
- }
190
- else if (source.readyState === source.CONNECTING) {
191
- return 'CONNECTING';
192
- }
193
- else {
194
- return 'UNKNOWN';
195
- }
196
- }
197
- }
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3RpdmUtZXZlbnQtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvZmVhdHVyZXMvZXZlbnQtc291cmNlL3JlYWN0aXZlLWV2ZW50LXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRXZELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sbUJBQW1CO0lBbUI5Qjs7OztnRkFJNEU7SUFFckUsTUFBTSxDQUFDLFNBQVMsQ0FDckIsSUFBWSxFQUNaLGNBQXNCLEVBQ3RCLG1CQUFxQztRQUdyQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUN6RDtRQUNELE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVNLE1BQU0sQ0FBQyxVQUFVLENBQ3RCLElBQVksRUFDWixzQkFBb0MsRUFDcEMsbUJBQXFDO1FBRXJDLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRTVFLFlBQ21CLElBQVksRUFDckIsc0JBQW9DLEVBQ3BDLG1CQUFxQztRQUY1QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ3JCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBYztRQUNwQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQWtCO1FBcEQvQzs7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QUNqQjthQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ2xELE9BQU8sWUFBWSxDQUFDO1NBQ3JCO2FBQU07WUFDTCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Tmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TG9nZ2VyRmFjdG9yeX0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgcmVhY3RpdmUgd3JhcHBlciBhcm91bmQgYW4gZXZlbnQgc291cmNlLlxuICpcbiAqIEl0IHN1cHBvcnRzIGV2ZW50IHR5cGUgZmlsdGVyaW5nIG91dCBvZiB0aGUgYm94IGFuZCBtYW5hZ2VzIHRoZSByZWdpc3RyYXRpb25zLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgaXQgYWxzbyBoYW5kbGVzIHJlY29ubmVjdHMgc2luY2UgdGhlIGRlZmF1bHQgcmVjb25lY3QgaGFuZGxpbmcgYnkgYnJvd3NlcnNcbiAqIGlzIG5vdCB3b3JraW5nIGluIGEgbG90IG9mIGNhc2VzICg1eHggZXJyb3JzIGV0YykuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgUmVhY3RpdmVFdmVudFNvdXJjZTxUID0gYW55PiB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcignUmVhY3RpdmVFdmVudFNvdXJjZScpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRUb3BpY3MgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDxNZXNzYWdlRXZlbnQ+PigpO1xuXG4gIHByaXZhdGUgY3VycmVudFNvdXJjZTogRXZlbnRTb3VyY2U7XG4gIHByaXZhdGUgY3VycmVudExpc3RlbmVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgX2Nsb3NlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBTdGF0aWMgQnVpbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBzdGF0aWMgc3RhdGljVXJsPFQ+KFxuICAgIHpvbmU6IE5nWm9uZSxcbiAgICBldmVudFNvdXJjZVVybDogc3RyaW5nLFxuICAgIGV2ZW50U291cmNlSW5pdERpY3Q/OiBFdmVudFNvdXJjZUluaXRcbiAgKTogUmVhY3RpdmVFdmVudFNvdXJjZTxUPiB7XG5cbiAgICBpZiAoIWV2ZW50U291cmNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBldmVudCBzb3VyY2UgdXJsIScpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJlYWN0aXZlRXZlbnRTb3VyY2Uoem9uZSwgKCkgPT4gZXZlbnRTb3VyY2VVcmwsIGV2ZW50U291cmNlSW5pdERpY3QpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkeW5hbWljVXJsPFQ+KFxuICAgIHpvbmU6IE5nWm9uZSxcbiAgICBldmVudFNvdXJjZVVybFByb3ZpZGVyOiAoKSA9PiBzdHJpbmcsXG4gICAgZXZlbnRTb3VyY2VJbml0RGljdD86IEV2ZW50U291cmNlSW5pdFxuICApOiBSZWFjdGl2ZUV2ZW50U291cmNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IFJlYWN0aXZlRXZlbnRTb3VyY2Uoem9uZSwgZXZlbnRTb3VyY2VVcmxQcm92aWRlciwgZXZlbnRTb3VyY2VJbml0RGljdCk7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgZXZlbnRTb3VyY2VVcmxQcm92aWRlcjogKCkgPT4gc3RyaW5nLFxuICAgIHByaXZhdGUgZXZlbnRTb3VyY2VJbml0RGljdD86IEV2ZW50U291cmNlSW5pdFxuICApIHtcbiAgICBpZiAoIWV2ZW50U291cmNlVXJsUHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIGV2ZW50IHNvdXJjZSB1cmwgcHJvdmlkZXIhJyk7XG4gICAgfVxuICAgIHRoaXMub3BlbigpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIGdldCBjbG9zZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb3NlZDtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBldmVudCBzb3VyY2UuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBhdXRvbWF0aWNhbGx5IHVwb24gb2JqZWN0IGNyZWF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoaXMgcmVhY3RpdmUtZXZlbnQtc291cmNlIGhhc1xuICAgKiBiZWVuIGNsb3NlZCBleHBsaWNpdGx5LlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gZXZlbnQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cbiAgICogQHBhcmFtIGV2ZW50VHlwZSBUaGUgZXZlbnQgdHlwZS4gRGVmYXVsdHMgdG8gJ21lc3NhZ2UnLlxuICAgKi9cbiAgcHVibGljIGV2ZW50cyhldmVudFR5cGU6IHN0cmluZyA9ICdtZXNzYWdlJyk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgaWYgKCF0aGlzLmV2ZW50VG9waWNzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICB0aGlzLmV2ZW50VG9waWNzLnNldChldmVudFR5cGUsIG5ldyBTdWJqZWN0PE1lc3NhZ2VFdmVudD4oKSk7XG4gICAgICB0aGlzLmVuc3VyZVJlZ2lzdHJhdGlvbnMoKTtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRTdWJqID0gdGhpcy5ldmVudFRvcGljcy5nZXQoZXZlbnRUeXBlKTtcbiAgICByZXR1cm4gZXZlbnRTdWJqLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBldmVudCBzdHJlYW0gb2YgbWVzc2FnZXMgcGFyc2VkIGZyb20ganNvbi5cbiAgICogKGV2ZW50LmRhdGEgbXVzdCBiZSBpbiBqc29uIGZvcm1hdClcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50VHlwZSBUaGUgZXZlbnQgdHlwZS4gRGVmYXVsdHMgdG8gJ21lc3NhZ2UnLlxuICAgKi9cbiAgcHVibGljIGV2ZW50c0pzb24oZXZlbnRUeXBlOiBzdHJpbmcgPSAnbWVzc2FnZScpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMoZXZlbnRUeXBlKS5waXBlKFxuICAgICAgbWFwKGV2ZW50ID0+IEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGlzIGV2ZW50IHNvdXJjZS4gSXQgd29udCByZWNvbm5lY3QuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlQ3VycmVudCgpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDbG9zaW5nIHRoZSBldmVudC1zb3VyY2UuJyk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcHMgdGhpcyByZWFjdGl2ZSBldmVudCBzb3VyY2Ugb3BlbiB1bnRpbCB0aGUgZ2l2ZW4gb2JzZXJ2YWJsZSBlbWl0cyBhbiBldmVudC5cbiAgICogQHBhcmFtIHVuc3Vic2NyaWJlXG4gICAqL1xuICBwdWJsaWMgb3BlblVudGlsKHVuc3Vic2NyaWJlOiBPYnNlcnZhYmxlPGFueT4pOiB0aGlzIHtcbiAgICB0aGlzLmNsZWFuVXBPcGVuVW50aWwoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZVN1YiA9IHVuc3Vic2NyaWJlXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB0aGlzLmNsb3NlKClcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNsZWFuVXBPcGVuVW50aWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Vuc3Vic2NyaWJlU3ViKSB7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fdW5zdWJzY3JpYmVTdWIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbm5lY3RzIHRoaXMgZXZlbnQgc291cmNlLCB1bmxlc3MgY2xvc2VkIGlzIHRydWU7XG4gICAqL1xuICBwcml2YXRlIHJlY29ubmVjdCgpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9jbG9zZWQpIHsgcmV0dXJuOyB9XG5cbiAgICB0aGlzLmNsb3NlQ3VycmVudCgpO1xuXG4gICAgY29uc3QgZXZlbnRTb3VyY2VVcmwgPSB0aGlzLmV2ZW50U291cmNlVXJsUHJvdmlkZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmN1cnJlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoZXZlbnRTb3VyY2VVcmwsIHRoaXMuZXZlbnRTb3VyY2VJbml0RGljdCk7XG5cbiAgICAgIHRoaXMuZW5zdXJlUmVnaXN0cmF0aW9ucygpO1xuXG4gICAgICB0aGlzLmN1cnJlbnRTb3VyY2Uub25vcGVuID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFdmVudFNvdXJjZSBjb25uZWN0aW9uIG9wZW5lZCB0bzogJyArIGV2ZW50U291cmNlVXJsICtcbiAgICAgICAgICAnLCBzdGF0ZTogJyArIHRoaXMucmVhZHlTdGF0ZUFzU3RyaW5nKHRoaXMuY3VycmVudFNvdXJjZSksIGV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY3VycmVudFNvdXJjZS5vbmVycm9yID0gKGVycm9yKSA9PiB7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoJ1RoZXJlIHdhcyBhbiBTU0UgZXJyb3IsIGN1cnJlbnQgc3RhdGU6ICcgKyB0aGlzLnJlYWR5U3RhdGVBc1N0cmluZyh0aGlzLmN1cnJlbnRTb3VyY2UpLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciAtIHRyeSByZWNvbm5lY3RpbmdcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQXR0ZW1wdGluZyB0byByZWNvbm5lY3QgZXZlbnQtc291cmNlIGF0JyArIGV2ZW50U291cmNlVXJsICsgJy4uLicpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWNvbm5lY3QoKSwgMzAwMCk7IC8vIERlbGF5IHRoZSByZWNvbm5lY3RcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnVGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBzc2UgY29ubmVjdGlvbiAoY2xvc2VkKS4nLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIEV2ZW50U291cmNlIGZvciAnICsgZXZlbnRTb3VyY2VVcmwsIGVycik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVjb25uZWN0KCksIDMwMDApOyAvLyBEZWxheSB0aGUgcmVjb25uZWN0XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVSZWdpc3RyYXRpb25zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTb3VyY2UpIHtcbiAgICAgIHRoaXMuZXZlbnRUb3BpY3MuZm9yRWFjaCgoc3ViamVjdCwgdHlwZSkgPT4ge1xuXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50TGlzdGVuZXJzLmhhcyh0eXBlKSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG1zZyA9PiBzdWJqZWN0Lm5leHQobXNnIGFzIE1lc3NhZ2VFdmVudCksXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50TGlzdGVuZXJzLmFkZCh0eXBlKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTGlzdGVuaW5nIHRvIGV2ZW50IHR5cGU6ICcgKyB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjdXJyZW50IGV2ZW50IHNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSBjbG9zZUN1cnJlbnQoKTogdm9pZCB7XG5cbiAgICB0aGlzLmN1cnJlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcblxuICAgIGlmICghdGhpcy5jdXJyZW50Q2xvc2VkKSB7XG4gICAgICAvLyBDbG9zZSBFdmVudCBTb3VyY2UgaWYgbm90IGFscmVhZHkgY2xvc2VkLlxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0Nsb3NpbmcgdGhlIGV2ZW50LXNvdXJjZS4nKTtcbiAgICAgIHRoaXMuY3VycmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgdGhpcy5jdXJyZW50U291cmNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBjdXJyZW50Q2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jdXJyZW50U291cmNlIHx8IHRoaXMuY3VycmVudFNvdXJjZS5yZWFkeVN0YXRlID09PSB0aGlzLmN1cnJlbnRTb3VyY2UuQ0xPU0VEO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkeVN0YXRlQXNTdHJpbmcoc291cmNlOiBFdmVudFNvdXJjZSk6IHN0cmluZyB7XG4gICAgaWYgKHNvdXJjZS5yZWFkeVN0YXRlID09PSBzb3VyY2UuT1BFTikge1xuICAgICAgcmV0dXJuICdPUEVOJztcbiAgICB9IGVsc2UgaWYgKHNvdXJjZS5yZWFkeVN0YXRlID09PSBzb3VyY2UuQ0xPU0VEKSB7XG4gICAgICByZXR1cm4gJ0NMT1NFRCc7XG4gICAgfSBlbHNlIGlmIChzb3VyY2UucmVhZHlTdGF0ZSA9PT0gc291cmNlLkNPTk5FQ1RJTkcpIHtcbiAgICAgIHJldHVybiAnQ09OTkVDVElORyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuICB9XG59XG4iXX0=