@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,3 @@
1
+ export * from './reactive-fetch-event-source';
2
+ export * from './reactive-fetch-event-source.service';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2ZlYXR1cmVzL2V2ZW50LXNvdXJjZS9mZXRjaC9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx1Q0FBdUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcmVhY3RpdmUtZmV0Y2gtZXZlbnQtc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhY3RpdmUtZmV0Y2gtZXZlbnQtc291cmNlLnNlcnZpY2UnO1xuXG5cbiJdfQ==
@@ -0,0 +1,217 @@
1
+ import { EventStreamContentType, fetchEventSource } from '@microsoft/fetch-event-source';
2
+ import { LoggerFactory } from '@elderbyte/ts-logger';
3
+ import { BehaviorSubject, Subject } from 'rxjs';
4
+ import { map } from 'rxjs/operators';
5
+ export var ReactiveEventSourceState;
6
+ (function (ReactiveEventSourceState) {
7
+ ReactiveEventSourceState["IDLE"] = "IDLE";
8
+ ReactiveEventSourceState["CONNECTING"] = "CONNECTING";
9
+ ReactiveEventSourceState["OPEN"] = "OPEN";
10
+ ReactiveEventSourceState["CLOSED"] = "CLOSED";
11
+ ReactiveEventSourceState["ERROR"] = "ERROR";
12
+ })(ReactiveEventSourceState || (ReactiveEventSourceState = {}));
13
+ export class ReactiveSSeMessage {
14
+ constructor(id, event, data, retry) {
15
+ this.id = id;
16
+ this.event = event;
17
+ this.data = data;
18
+ this.retry = retry;
19
+ }
20
+ }
21
+ export class ReactiveFetchEventSource {
22
+ /***************************************************************************
23
+ * *
24
+ * Static Builder *
25
+ * *
26
+ **************************************************************************/
27
+ static staticRequest(requestInit) {
28
+ if (!requestInit) {
29
+ throw new Error('You must provide a event source url!');
30
+ }
31
+ return new ReactiveFetchEventSource(() => requestInit);
32
+ }
33
+ static dynamicRequest(requestInitProvider) {
34
+ return new ReactiveFetchEventSource(requestInitProvider);
35
+ }
36
+ /***************************************************************************
37
+ * *
38
+ * Constructor *
39
+ * *
40
+ **************************************************************************/
41
+ constructor(requestInitProvider) {
42
+ this.requestInitProvider = requestInitProvider;
43
+ /***************************************************************************
44
+ * *
45
+ * Fields *
46
+ * *
47
+ **************************************************************************/
48
+ this.log = LoggerFactory.getLogger(this.constructor.name);
49
+ this.abortController = new AbortController();
50
+ this.state$ = new BehaviorSubject(ReactiveEventSourceState.IDLE);
51
+ this.eventTopics = new Map();
52
+ if (!requestInitProvider) {
53
+ throw new Error('You must provide a event source url provider!');
54
+ }
55
+ this.open();
56
+ }
57
+ /***************************************************************************
58
+ * *
59
+ * Properties *
60
+ * *
61
+ **************************************************************************/
62
+ get closed() {
63
+ return this._closed;
64
+ }
65
+ /***************************************************************************
66
+ * *
67
+ * Public API *
68
+ * *
69
+ **************************************************************************/
70
+ /**
71
+ * Open the event source.
72
+ *
73
+ * Note: The connection is opened automatically upon object creation.
74
+ * This method should only be used if this reactive-event-source has
75
+ * been closed explicitly.
76
+ */
77
+ open() {
78
+ this._closed = false;
79
+ this.reconnect();
80
+ }
81
+ /**
82
+ * Get an event stream for the given event type.
83
+ * @param eventTypeRaw The event type. Defaults to 'message'.
84
+ */
85
+ events(eventTypeRaw) {
86
+ const eventType = this.eventTypeOrDefault(eventTypeRaw);
87
+ if (!this.eventTopics.has(eventType)) {
88
+ this.eventTopics.set(eventType, new Subject());
89
+ }
90
+ const eventSubj = this.eventTopics.get(eventType);
91
+ return eventSubj.asObservable();
92
+ }
93
+ /**
94
+ * Get an event stream of messages parsed from json.
95
+ * (event.data must be in json format)
96
+ *
97
+ * @param eventType The event type. Defaults to 'message'.
98
+ */
99
+ eventsJson(eventType) {
100
+ return this.events(eventType).pipe(map(event => JSON.parse(event.data)));
101
+ }
102
+ /**
103
+ * Close this event source. It won't reconnect.
104
+ */
105
+ close() {
106
+ this._closed = true;
107
+ this.closeCurrent();
108
+ this.log.debug('Closing the event-source.');
109
+ }
110
+ /**
111
+ * Keeps this reactive event source open until the given observable emits an event.
112
+ * @param unsubscribe
113
+ */
114
+ openUntil(unsubscribe) {
115
+ this.cleanUpOpenUntil();
116
+ this._unsubscribeSub = unsubscribe
117
+ .subscribe(() => this.close());
118
+ return this;
119
+ }
120
+ /***************************************************************************
121
+ * *
122
+ * Private methods *
123
+ * *
124
+ **************************************************************************/
125
+ cleanUpOpenUntil() {
126
+ if (this._unsubscribeSub) {
127
+ this._unsubscribeSub.unsubscribe();
128
+ this._unsubscribeSub = null;
129
+ }
130
+ }
131
+ /**
132
+ * Close the current event source
133
+ */
134
+ closeCurrent(reason) {
135
+ this.log.debug('Closing the event-source, reason: ' + reason);
136
+ this.abortController.abort(reason);
137
+ }
138
+ /**
139
+ * Reconnects this event source, unless closed is true;
140
+ */
141
+ reconnect() {
142
+ if (this._closed) {
143
+ return;
144
+ }
145
+ this.updateState(ReactiveEventSourceState.CONNECTING);
146
+ this.closeCurrent('Reconnect');
147
+ this.openEventSource();
148
+ }
149
+ openEventSource() {
150
+ const requestInit = this.requestInitProvider();
151
+ fetchEventSource(requestInit.request, {
152
+ method: requestInit.method,
153
+ signal: this.abortController.signal,
154
+ headers: requestInit.headers,
155
+ keepalive: true,
156
+ openWhenHidden: false,
157
+ onopen: response => this.handleOnOpen(response),
158
+ onmessage: msg => this.handleOnMessage(msg),
159
+ onerror: err => this.handleOnError(err),
160
+ onclose: () => this.handleOnClose()
161
+ }).then(r => {
162
+ });
163
+ }
164
+ handleOnOpen(response) {
165
+ if (response.ok && response.headers.get('content-type') === EventStreamContentType) {
166
+ this.log.debug('EventSource connection sucessfully opened to: ' + response.url +
167
+ ', state: ' + response.status, response);
168
+ this.updateState(ReactiveEventSourceState.OPEN);
169
+ return; // everything's good
170
+ }
171
+ else if (response.status >= 400 && response.status < 500 && response.status !== 429) {
172
+ // client-side errors are usually non-retriable:
173
+ this.updateState(ReactiveEventSourceState.ERROR);
174
+ this.log.error('Failed to open Event Source due to Client Error ' + response.status, response);
175
+ }
176
+ else {
177
+ this.log.error('Failed to open Event Source due to Error ' + response.status, response);
178
+ this.updateState(ReactiveEventSourceState.ERROR);
179
+ this.tryReconnect(); // TODO Necessary if keep alive = true?
180
+ }
181
+ }
182
+ handleOnError(err) {
183
+ this.updateState(ReactiveEventSourceState.ERROR);
184
+ this.log.trace('There was an SSE error.', err);
185
+ if (!this.closed) {
186
+ // There was an error - try reconnecting
187
+ this.log.debug('Attempting to reconnect event-source ...');
188
+ this.tryReconnect(); // TODO Necessary if keep alive = true?
189
+ }
190
+ else {
191
+ this.log.debug('There was an error in the sse connection (closed).', err);
192
+ }
193
+ }
194
+ tryReconnect() {
195
+ if (!this._closed) {
196
+ setTimeout(() => this.reconnect(), 3000); // Delay the reconnect
197
+ }
198
+ }
199
+ handleOnMessage(msg) {
200
+ const eventType = this.eventTypeOrDefault(msg.event);
201
+ const topic = this.eventTopics.get(eventType);
202
+ if (topic) {
203
+ topic.next(new ReactiveSSeMessage(msg.id, eventType, msg.data, msg.retry));
204
+ }
205
+ }
206
+ handleOnClose() {
207
+ this.log.debug('EventSource has closed.');
208
+ this.updateState(ReactiveEventSourceState.CLOSED);
209
+ }
210
+ updateState(state) {
211
+ this.state$.next(state);
212
+ }
213
+ eventTypeOrDefault(type) {
214
+ return type ?? 'message';
215
+ }
216
+ }
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3RpdmUtZmV0Y2gtZXZlbnQtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvZmVhdHVyZXMvZXZlbnQtc291cmNlL2ZldGNoL3JlYWN0aXZlLWZldGNoLWV2ZW50LXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLHNCQUFzQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDM0csT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxlQUFlLEVBQWMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxNQUFNLENBQU4sSUFBWSx3QkFNWDtBQU5ELFdBQVksd0JBQXdCO0lBQ2xDLHlDQUFhLENBQUE7SUFDYixxREFBeUIsQ0FBQTtJQUN6Qix5Q0FBYSxDQUFBO0lBQ2IsNkNBQWlCLENBQUE7SUFDakIsMkNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBTlcsd0JBQXdCLEtBQXhCLHdCQUF3QixRQU1uQztBQUVELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFDa0IsRUFBVSxFQUNWLEtBQWEsRUFDYixJQUFPLEVBQ1AsS0FBYztRQUhkLE9BQUUsR0FBRixFQUFFLENBQVE7UUFDVixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsU0FBSSxHQUFKLElBQUksQ0FBRztRQUNQLFVBQUssR0FBTCxLQUFLLENBQVM7SUFDNUIsQ0FBQztDQUNOO0FBUUQsTUFBTSxPQUFPLHdCQUF3QjtJQWtCbkM7Ozs7Z0ZBSTRFO0lBRXJFLE1BQU0sQ0FBQyxhQUFhLENBQ3pCLFdBQW1DO1FBRW5DLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FB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LENBQUM7SUFDMUIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQWE7UUFDdEMsT0FBTyxJQUFJLElBQUksU0FBUyxDQUFDO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RXZlbnRTb3VyY2VNZXNzYWdlLCBFdmVudFN0cmVhbUNvbnRlbnRUeXBlLCBmZXRjaEV2ZW50U291cmNlfSBmcm9tICdAbWljcm9zb2Z0L2ZldGNoLWV2ZW50LXNvdXJjZSc7XG5pbXBvcnQge0xvZ2dlckZhY3Rvcnl9IGZyb20gJ0BlbGRlcmJ5dGUvdHMtbG9nZ2VyJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGVudW0gUmVhY3RpdmVFdmVudFNvdXJjZVN0YXRlIHtcbiAgSURMRSA9ICdJRExFJyxcbiAgQ09OTkVDVElORyA9ICdDT05ORUNUSU5HJyxcbiAgT1BFTiA9ICdPUEVOJyxcbiAgQ0xPU0VEID0gJ0NMT1NFRCcsXG4gIEVSUk9SID0gJ0VSUk9SJyxcbn1cblxuZXhwb3J0IGNsYXNzIFJlYWN0aXZlU1NlTWVzc2FnZTxUID0gc3RyaW5nPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBkYXRhOiBULFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeT86IG51bWJlcixcbiAgKSB7IH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFdmVudFNvdXJjZVJlcXVlc3RJbml0IHtcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIG1ldGhvZD86IHN0cmluZyxcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuZXhwb3J0IGNsYXNzIFJlYWN0aXZlRmV0Y2hFdmVudFNvdXJjZTxUID0gYW55PiB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICBwcml2YXRlIF9jbG9zZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWFjdGl2ZUV2ZW50U291cmNlU3RhdGU+KFJlYWN0aXZlRXZlbnRTb3VyY2VTdGF0ZS5JRExFKTtcbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmVTdWI6IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50VG9waWNzID0gbmV3IE1hcDxzdHJpbmcsIFN1YmplY3Q8UmVhY3RpdmVTU2VNZXNzYWdlPj4oKTtcblxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBTdGF0aWMgQnVpbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBzdGF0aWMgc3RhdGljUmVxdWVzdDxUPihcbiAgICByZXF1ZXN0SW5pdDogRXZlbnRTb3VyY2VSZXF1ZXN0SW5pdCxcbiAgKTogUmVhY3RpdmVGZXRjaEV2ZW50U291cmNlPFQ+IHtcbiAgICBpZiAoIXJlcXVlc3RJbml0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBldmVudCBzb3VyY2UgdXJsIScpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJlYWN0aXZlRmV0Y2hFdmVudFNvdXJjZSgoKSA9PiByZXF1ZXN0SW5pdCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGR5bmFtaWNSZXF1ZXN0PFQ+KFxuICAgIHJlcXVlc3RJbml0UHJvdmlkZXI6ICgpID0+IEV2ZW50U291cmNlUmVxdWVzdEluaXRcbiAgKTogUmVhY3RpdmVGZXRjaEV2ZW50U291cmNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IFJlYWN0aXZlRmV0Y2hFdmVudFNvdXJjZShyZXF1ZXN0SW5pdFByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0SW5pdFByb3ZpZGVyOiAoKSA9PiBFdmVudFNvdXJjZVJlcXVlc3RJbml0LFxuICApIHtcbiAgICBpZiAoIXJlcXVlc3RJbml0UHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIGV2ZW50IHNvdXJjZSB1cmwgcHJvdmlkZXIhJyk7XG4gICAgfVxuICAgIHRoaXMub3BlbigpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIGdldCBjbG9zZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb3NlZDtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBldmVudCBzb3VyY2UuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBhdXRvbWF0aWNhbGx5IHVwb24gb2JqZWN0IGNyZWF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoaXMgcmVhY3RpdmUtZXZlbnQtc291cmNlIGhhc1xuICAgKiBiZWVuIGNsb3NlZCBleHBsaWNpdGx5LlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gZXZlbnQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cbiAgICogQHBhcmFtIGV2ZW50VHlwZVJhdyBUaGUgZXZlbnQgdHlwZS4gRGVmYXVsdHMgdG8gJ21lc3NhZ2UnLlxuICAgKi9cbiAgcHVibGljIGV2ZW50cyhldmVudFR5cGVSYXc/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlYWN0aXZlU1NlTWVzc2FnZT4ge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9IHRoaXMuZXZlbnRUeXBlT3JEZWZhdWx0KGV2ZW50VHlwZVJhdyk7XG4gICAgaWYgKCF0aGlzLmV2ZW50VG9waWNzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICB0aGlzLmV2ZW50VG9waWNzLnNldChldmVudFR5cGUsIG5ldyBTdWJqZWN0PFJlYWN0aXZlU1NlTWVzc2FnZT4oKSk7XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50U3ViaiA9IHRoaXMuZXZlbnRUb3BpY3MuZ2V0KGV2ZW50VHlwZSk7XG4gICAgcmV0dXJuIGV2ZW50U3Viai5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gZXZlbnQgc3RyZWFtIG9mIG1lc3NhZ2VzIHBhcnNlZCBmcm9tIGpzb24uXG4gICAqIChldmVudC5kYXRhIG11c3QgYmUgaW4ganNvbiBmb3JtYXQpXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFR5cGUgVGhlIGV2ZW50IHR5cGUuIERlZmF1bHRzIHRvICdtZXNzYWdlJy5cbiAgICovXG4gIHB1YmxpYyBldmVudHNKc29uKGV2ZW50VHlwZT86IHN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cyhldmVudFR5cGUpLnBpcGUoXG4gICAgICBtYXAoZXZlbnQgPT4gSlNPTi5wYXJzZShldmVudC5kYXRhKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoaXMgZXZlbnQgc291cmNlLiBJdCB3b24ndCByZWNvbm5lY3QuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlQ3VycmVudCgpO1xuICAgIHRoaXMubG9nLmRlYnVnKCdDbG9zaW5nIHRoZSBldmVudC1zb3VyY2UuJyk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcHMgdGhpcyByZWFjdGl2ZSBldmVudCBzb3VyY2Ugb3BlbiB1bnRpbCB0aGUgZ2l2ZW4gb2JzZXJ2YWJsZSBlbWl0cyBhbiBldmVudC5cbiAgICogQHBhcmFtIHVuc3Vic2NyaWJlXG4gICAqL1xuICBwdWJsaWMgb3BlblVudGlsKHVuc3Vic2NyaWJlOiBPYnNlcnZhYmxlPGFueT4pOiB0aGlzIHtcbiAgICB0aGlzLmNsZWFuVXBPcGVuVW50aWwoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZVN1YiA9IHVuc3Vic2NyaWJlXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB0aGlzLmNsb3NlKClcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNsZWFuVXBPcGVuVW50aWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Vuc3Vic2NyaWJlU3ViKSB7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fdW5zdWJzY3JpYmVTdWIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgY3VycmVudCBldmVudCBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgY2xvc2VDdXJyZW50KHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9nLmRlYnVnKCdDbG9zaW5nIHRoZSBldmVudC1zb3VyY2UsIHJlYXNvbjogJyArIHJlYXNvbik7XG4gICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbm5lY3RzIHRoaXMgZXZlbnQgc291cmNlLCB1bmxlc3MgY2xvc2VkIGlzIHRydWU7XG4gICAqL1xuICBwcml2YXRlIHJlY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlU3RhdGUoUmVhY3RpdmVFdmVudFNvdXJjZVN0YXRlLkNPTk5FQ1RJTkcpO1xuICAgIHRoaXMuY2xvc2VDdXJyZW50KCdSZWNvbm5lY3QnKTtcbiAgICB0aGlzLm9wZW5FdmVudFNvdXJjZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRXZlbnRTb3VyY2UoKTogdm9pZCB7XG4gICAgY29uc3QgcmVxdWVzdEluaXQgPSB0aGlzLnJlcXVlc3RJbml0UHJvdmlkZXIoKTtcbiAgICBmZXRjaEV2ZW50U291cmNlKHJlcXVlc3RJbml0LnJlcXVlc3QsIHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdEluaXQubWV0aG9kLFxuICAgICAgc2lnbmFsOiB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SW5pdC5oZWFkZXJzLFxuICAgICAga2VlcGFsaXZlOiB0cnVlLFxuICAgICAgb3BlbldoZW5IaWRkZW46IGZhbHNlLFxuICAgICAgb25vcGVuOiByZXNwb25zZSA9PiB0aGlzLmhhbmRsZU9uT3BlbihyZXNwb25zZSksXG4gICAgICBvbm1lc3NhZ2U6IG1zZyA9PiB0aGlzLmhhbmRsZU9uTWVzc2FnZShtc2cpLFxuICAgICAgb25lcnJvcjogZXJyID0+IHRoaXMuaGFuZGxlT25FcnJvcihlcnIpLFxuICAgICAgb25jbG9zZTogKCkgPT4gdGhpcy5oYW5kbGVPbkNsb3NlKClcbiAgICB9KS50aGVuKHIgPT4ge1xuXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT25PcGVuKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZXNwb25zZS5vayAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgPT09IEV2ZW50U3RyZWFtQ29udGVudFR5cGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdFdmVudFNvdXJjZSBjb25uZWN0aW9uIHN1Y2Vzc2Z1bGx5IG9wZW5lZCB0bzogJyArIHJlc3BvbnNlLnVybCArXG4gICAgICAgICcsIHN0YXRlOiAnICsgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZSk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlKFJlYWN0aXZlRXZlbnRTb3VyY2VTdGF0ZS5PUEVOKTtcbiAgICAgIHJldHVybjsgLy8gZXZlcnl0aGluZydzIGdvb2RcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSA0MDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgNTAwICYmIHJlc3BvbnNlLnN0YXR1cyAhPT0gNDI5KSB7XG4gICAgICAvLyBjbGllbnQtc2lkZSBlcnJvcnMgYXJlIHVzdWFsbHkgbm9uLXJldHJpYWJsZTpcbiAgICAgIHRoaXMudXBkYXRlU3RhdGUoUmVhY3RpdmVFdmVudFNvdXJjZVN0YXRlLkVSUk9SKTtcbiAgICAgIHRoaXMubG9nLmVycm9yKCdGYWlsZWQgdG8gb3BlbiBFdmVudCBTb3VyY2UgZHVlIHRvIENsaWVudCBFcnJvciAnICsgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKCdGYWlsZWQgdG8gb3BlbiBFdmVudCBTb3VyY2UgZHVlIHRvIEVycm9yICcgKyByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGUoUmVhY3RpdmVFdmVudFNvdXJjZVN0YXRlLkVSUk9SKTtcbiAgICAgIHRoaXMudHJ5UmVjb25uZWN0KCk7IC8vIFRPRE8gTmVjZXNzYXJ5IGlmIGtlZXAgYWxpdmUgPSB0cnVlP1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT25FcnJvcihlcnI6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlU3RhdGUoUmVhY3RpdmVFdmVudFNvdXJjZVN0YXRlLkVSUk9SKTtcbiAgICB0aGlzLmxvZy50cmFjZSgnVGhlcmUgd2FzIGFuIFNTRSBlcnJvci4nLCBlcnIpO1xuICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciAtIHRyeSByZWNvbm5lY3RpbmdcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdBdHRlbXB0aW5nIHRvIHJlY29ubmVjdCBldmVudC1zb3VyY2UgLi4uJyk7XG4gICAgICB0aGlzLnRyeVJlY29ubmVjdCgpOyAvLyBUT0RPIE5lY2Vzc2FyeSBpZiBrZWVwIGFsaXZlID0gdHJ1ZT9cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ1RoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUgc3NlIGNvbm5lY3Rpb24gKGNsb3NlZCkuJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyeVJlY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2Nsb3NlZCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlY29ubmVjdCgpLCAzMDAwKTsgLy8gRGVsYXkgdGhlIHJlY29ubmVjdFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT25NZXNzYWdlKG1zZzogRXZlbnRTb3VyY2VNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRUeXBlID0gdGhpcy5ldmVudFR5cGVPckRlZmF1bHQobXNnLmV2ZW50KTtcbiAgICBjb25zdCB0b3BpYyA9IHRoaXMuZXZlbnRUb3BpY3MuZ2V0KGV2ZW50VHlwZSk7XG4gICAgaWYgKHRvcGljKSB7XG4gICAgICB0b3BpYy5uZXh0KG5ldyBSZWFjdGl2ZVNTZU1lc3NhZ2UoXG4gICAgICAgIG1zZy5pZCxcbiAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICBtc2cuZGF0YSxcbiAgICAgICAgbXNnLnJldHJ5XG4gICAgICApKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnRXZlbnRTb3VyY2UgaGFzIGNsb3NlZC4nKVxuICAgIHRoaXMudXBkYXRlU3RhdGUoUmVhY3RpdmVFdmVudFNvdXJjZVN0YXRlLkNMT1NFRCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXRlKHN0YXRlOiBSZWFjdGl2ZUV2ZW50U291cmNlU3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlJC5uZXh0KHN0YXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgZXZlbnRUeXBlT3JEZWZhdWx0KHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlID8/ICdtZXNzYWdlJztcbiAgfVxufVxuIl19
@@ -0,0 +1,53 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { LoggerFactory } from '@elderbyte/ts-logger';
3
+ import { ReactiveFetchEventSource } from './reactive-fetch-event-source';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Angular reactive EventSource integration
7
+ */
8
+ export class ReactiveFetchEventSourceService {
9
+ /***************************************************************************
10
+ * *
11
+ * Constructor *
12
+ * *
13
+ **************************************************************************/
14
+ constructor() {
15
+ /***************************************************************************
16
+ * *
17
+ * Fields *
18
+ * *
19
+ **************************************************************************/
20
+ this.log = LoggerFactory.getLogger(this.constructor.name);
21
+ }
22
+ /***************************************************************************
23
+ * *
24
+ * Public API *
25
+ * *
26
+ **************************************************************************/
27
+ /**
28
+ * Creates an reactive, automatic reconnecting event source.
29
+ *
30
+ * @param requestInit The request to the event source
31
+ */
32
+ reactiveEventSource(requestInit) {
33
+ return ReactiveFetchEventSource.staticRequest(requestInit);
34
+ }
35
+ /**
36
+ * Creates an reactive, automatic reconnecting event source. Each time the event source
37
+ * reconnects, the url provider is invoked.
38
+ *
39
+ * @param requestInitProvider The request provider of the event source
40
+ */
41
+ reactiveEventSourceDynamic(requestInitProvider) {
42
+ return ReactiveFetchEventSource.dynamicRequest(requestInitProvider);
43
+ }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ReactiveFetchEventSourceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
45
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ReactiveFetchEventSourceService, providedIn: 'root' }); }
46
+ }
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ReactiveFetchEventSourceService, decorators: [{
48
+ type: Injectable,
49
+ args: [{
50
+ providedIn: 'root'
51
+ }]
52
+ }], ctorParameters: () => [] });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3RpdmUtZmV0Y2gtZXZlbnQtc291cmNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9mZWF0dXJlcy9ldmVudC1zb3VyY2UvZmV0Y2gvcmVhY3RpdmUtZmV0Y2gtZXZlbnQtc291cmNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUF5Qix3QkFBd0IsRUFBQyxNQUFNLCtCQUErQixDQUFDOztBQUUvRjs7R0FFRztBQUlILE1BQU0sT0FBTywrQkFBK0I7SUFVMUM7Ozs7Z0ZBSTRFO0lBRTVFO1FBZEE7Ozs7b0ZBSTRFO1FBRTNELFFBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFRdEQsQ0FBQztJQUVqQjs7OztnRkFJNEU7SUFFNUU7Ozs7T0FJRztJQUNJLG1CQUFtQixDQUN4QixXQUFtQztRQUVuQyxPQUFPLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSwwQkFBMEIsQ0FDL0IsbUJBQWlEO1FBRWpELE9BQU8sd0JBQXdCLENBQUMsY0FBYyxDQUM1QyxtQkFBbUIsQ0FDcEIsQ0FBQztJQUNKLENBQUM7OEdBL0NVLCtCQUErQjtrSEFBL0IsK0JBQStCLGNBRjlCLE1BQU07OzJGQUVQLCtCQUErQjtrQkFIM0MsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xvZ2dlckZhY3Rvcnl9IGZyb20gJ0BlbGRlcmJ5dGUvdHMtbG9nZ2VyJztcbmltcG9ydCB7RXZlbnRTb3VyY2VSZXF1ZXN0SW5pdCwgUmVhY3RpdmVGZXRjaEV2ZW50U291cmNlfSBmcm9tICcuL3JlYWN0aXZlLWZldGNoLWV2ZW50LXNvdXJjZSc7XG5cbi8qKlxuICogQW5ndWxhciByZWFjdGl2ZSBFdmVudFNvdXJjZSBpbnRlZ3JhdGlvblxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSZWFjdGl2ZUZldGNoRXZlbnRTb3VyY2VTZXJ2aWNlIHtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIENvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHVibGljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiByZWFjdGl2ZSwgYXV0b21hdGljIHJlY29ubmVjdGluZyBldmVudCBzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0SW5pdCBUaGUgcmVxdWVzdCB0byB0aGUgZXZlbnQgc291cmNlXG4gICAqL1xuICBwdWJsaWMgcmVhY3RpdmVFdmVudFNvdXJjZTxUID0gYW55PihcbiAgICByZXF1ZXN0SW5pdDogRXZlbnRTb3VyY2VSZXF1ZXN0SW5pdFxuICApOiBSZWFjdGl2ZUZldGNoRXZlbnRTb3VyY2U8VD4ge1xuICAgIHJldHVybiBSZWFjdGl2ZUZldGNoRXZlbnRTb3VyY2Uuc3RhdGljUmVxdWVzdChyZXF1ZXN0SW5pdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiByZWFjdGl2ZSwgYXV0b21hdGljIHJlY29ubmVjdGluZyBldmVudCBzb3VyY2UuIEVhY2ggdGltZSB0aGUgZXZlbnQgc291cmNlXG4gICAqIHJlY29ubmVjdHMsIHRoZSB1cmwgcHJvdmlkZXIgaXMgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJbml0UHJvdmlkZXIgVGhlIHJlcXVlc3QgcHJvdmlkZXIgb2YgdGhlIGV2ZW50IHNvdXJjZVxuICAgKi9cbiAgcHVibGljIHJlYWN0aXZlRXZlbnRTb3VyY2VEeW5hbWljPFQgPSBhbnk+KFxuICAgIHJlcXVlc3RJbml0UHJvdmlkZXI6ICgpID0+IEV2ZW50U291cmNlUmVxdWVzdEluaXRcbiAgKTogUmVhY3RpdmVGZXRjaEV2ZW50U291cmNlPFQ+IHtcbiAgICByZXR1cm4gUmVhY3RpdmVGZXRjaEV2ZW50U291cmNlLmR5bmFtaWNSZXF1ZXN0KFxuICAgICAgcmVxdWVzdEluaXRQcm92aWRlclxuICAgICk7XG4gIH1cblxufVxuIl19
@@ -1,3 +1,3 @@
1
- export * from './reactive-event-source';
2
- export * from './elder-event-source.service';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2ZlYXR1cmVzL2V2ZW50LXNvdXJjZS9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcmVhY3RpdmUtZXZlbnQtc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vZWxkZXItZXZlbnQtc291cmNlLnNlcnZpY2UnO1xuXG4iXX0=
1
+ export * from './standard/public_api';
2
+ export * from './fetch/public_api';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2ZlYXR1cmVzL2V2ZW50LXNvdXJjZS9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc3RhbmRhcmQvcHVibGljX2FwaSc7XG5leHBvcnQgKiBmcm9tICcuL2ZldGNoL3B1YmxpY19hcGknO1xuXG4iXX0=
@@ -0,0 +1,56 @@
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(this.constructor.name);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItZXZlbnQtc291cmNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9mZWF0dXJlcy9ldmVudC1zb3VyY2Uvc3RhbmRhcmQvZWxkZXItZXZlbnQtc291cmNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7O0FBRTVEOztHQUVHO0FBSUgsTUFBTSxPQUFPLHVCQUF1QjtJQVVsQzs7OztnRkFJNEU7SUFFNUUsWUFDVSxJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtRQWZ0Qjs7OztvRkFJNEU7UUFFM0QsV0FBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQVVyRSxDQUFDO0lBRUw7Ozs7Z0ZBSTRFO0lBRTVFOzs7OztPQUtHO0lBQ0ksbUJBQW1CLENBQVUsY0FBc0IsRUFDdEIsbUJBQXFDO1FBRXZFLE9BQU8sbUJBQW1CLENBQUMsU0FBUyxDQUNsQyxJQUFJLENBQUMsSUFBSSxFQUNULGNBQWMsRUFDZCxtQkFBbUIsQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEIsQ0FDL0Isc0JBQW9DLEVBQ3BDLG1CQUFxQztRQUVyQyxPQUFPLG1CQUFtQixDQUFDLFVBQVUsQ0FDbkMsSUFBSSxDQUFDLElBQUksRUFDVCxzQkFBc0IsRUFDdEIsbUJBQW1CLENBQ3BCLENBQUM7SUFDSixDQUFDOzhHQTFEVSx1QkFBdUI7a0hBQXZCLHVCQUF1QixjQUZ0QixNQUFNOzsyRkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJGYWN0b3J5fSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcic7XG5pbXBvcnQge1JlYWN0aXZlRXZlbnRTb3VyY2V9IGZyb20gJy4vcmVhY3RpdmUtZXZlbnQtc291cmNlJztcblxuLyoqXG4gKiBBbmd1bGFyIHJlYWN0aXZlIEV2ZW50U291cmNlIGludGVncmF0aW9uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEVsZGVyRXZlbnRTb3VyY2VTZXJ2aWNlIHtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIENvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmVcbiAgKSB7IH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHVibGljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiByZWFjdGl2ZSwgYXV0b21hdGljIHJlY29ubmVjdGluZyBldmVudCBzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFNvdXJjZVVybCBUaGUgdXJsIHRvIHRoZSBldmVudCBzb3VyY2VcbiAgICogQHBhcmFtIGV2ZW50U291cmNlSW5pdERpY3QgQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcuIChvcHRpb25hbClcbiAgICovXG4gIHB1YmxpYyByZWFjdGl2ZUV2ZW50U291cmNlPFQgPSBhbnk+KGV2ZW50U291cmNlVXJsOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlSW5pdERpY3Q/OiBFdmVudFNvdXJjZUluaXRcbiAgKTogUmVhY3RpdmVFdmVudFNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIFJlYWN0aXZlRXZlbnRTb3VyY2Uuc3RhdGljVXJsKFxuICAgICAgdGhpcy56b25lLFxuICAgICAgZXZlbnRTb3VyY2VVcmwsXG4gICAgICBldmVudFNvdXJjZUluaXREaWN0LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiByZWFjdGl2ZSwgYXV0b21hdGljIHJlY29ubmVjdGluZyBldmVudCBzb3VyY2UuIEVhY2ggdGltZSB0aGUgZXZlbnQgc291cmNlXG4gICAqIHJlY29ubmVjdHMsIHRoZSB1cmwgcHJvdmlkZXIgaXMgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50U291cmNlVXJsUHJvdmlkZXIgVGhlIHVybCBwcm92aWRlciBvZiB0aGUgZXZlbnQgc291cmNlXG4gICAqIEBwYXJhbSBldmVudFNvdXJjZUluaXREaWN0IEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nLiAob3B0aW9uYWwpXG4gICAqL1xuICBwdWJsaWMgcmVhY3RpdmVFdmVudFNvdXJjZUR5bmFtaWM8VCA9IGFueT4oXG4gICAgZXZlbnRTb3VyY2VVcmxQcm92aWRlcjogKCkgPT4gc3RyaW5nLFxuICAgIGV2ZW50U291cmNlSW5pdERpY3Q/OiBFdmVudFNvdXJjZUluaXRcbiAgKTogUmVhY3RpdmVFdmVudFNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIFJlYWN0aXZlRXZlbnRTb3VyY2UuZHluYW1pY1VybChcbiAgICAgIHRoaXMuem9uZSxcbiAgICAgIGV2ZW50U291cmNlVXJsUHJvdmlkZXIsXG4gICAgICBldmVudFNvdXJjZUluaXREaWN0LFxuICAgICk7XG4gIH1cblxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export * from './reactive-event-source';
2
+ export * from './elder-event-source.service';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2ZlYXR1cmVzL2V2ZW50LXNvdXJjZS9zdGFuZGFyZC9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcmVhY3RpdmUtZXZlbnQtc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vZWxkZXItZXZlbnQtc291cmNlLnNlcnZpY2UnO1xuXG4iXX0=
@@ -0,0 +1,198 @@
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(this.constructor.name);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3RpdmUtZXZlbnQtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvZmVhdHVyZXMvZXZlbnQtc291cmNlL3N0YW5kYXJkL3JlYWN0aXZlLWV2ZW50LXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRXZELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sbUJBQW1CO0lBbUI5Qjs7OztnRkFJNEU7SUFFckUsTUFBTSxDQUFDLFNBQVMsQ0FDckIsSUFBWSxFQUNaLGNBQXNCLEVBQ3RCLG1CQUFxQztRQUdyQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUN6RDtRQUNELE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVNLE1BQU0sQ0FBQyxVQUFVLENBQ3RCLElBQVksRUFDWixzQkFBb0MsRUFDcEMsbUJBQXFDO1FBRXJDLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRTVFLFlBQ21CLElBQVksRUFDckIsc0JBQW9DLEVBQ3BDLG1CQUFxQztRQUY1QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ3JCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBYztRQUNwQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENB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QU0sRUFBRTtZQUM5QyxPQUFPLFFBQVEsQ0FBQztTQUNqQjthQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ2xELE9BQU8sWUFBWSxDQUFDO1NBQ3JCO2FBQU07WUFDTCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Tmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TG9nZ2VyRmFjdG9yeX0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgcmVhY3RpdmUgd3JhcHBlciBhcm91bmQgYW4gZXZlbnQgc291cmNlLlxuICpcbiAqIEl0IHN1cHBvcnRzIGV2ZW50IHR5cGUgZmlsdGVyaW5nIG91dCBvZiB0aGUgYm94IGFuZCBtYW5hZ2VzIHRoZSByZWdpc3RyYXRpb25zLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgaXQgYWxzbyBoYW5kbGVzIHJlY29ubmVjdHMgc2luY2UgdGhlIGRlZmF1bHQgcmVjb25lY3QgaGFuZGxpbmcgYnkgYnJvd3NlcnNcbiAqIGlzIG5vdCB3b3JraW5nIGluIGEgbG90IG9mIGNhc2VzICg1eHggZXJyb3JzIGV0YykuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgUmVhY3RpdmVFdmVudFNvdXJjZTxUID0gYW55PiB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRUb3BpY3MgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDxNZXNzYWdlRXZlbnQ+PigpO1xuXG4gIHByaXZhdGUgY3VycmVudFNvdXJjZTogRXZlbnRTb3VyY2U7XG4gIHByaXZhdGUgY3VycmVudExpc3RlbmVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgX2Nsb3NlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBTdGF0aWMgQnVpbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBzdGF0aWMgc3RhdGljVXJsPFQ+KFxuICAgIHpvbmU6IE5nWm9uZSxcbiAgICBldmVudFNvdXJjZVVybDogc3RyaW5nLFxuICAgIGV2ZW50U291cmNlSW5pdERpY3Q/OiBFdmVudFNvdXJjZUluaXRcbiAgKTogUmVhY3RpdmVFdmVudFNvdXJjZTxUPiB7XG5cbiAgICBpZiAoIWV2ZW50U291cmNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBldmVudCBzb3VyY2UgdXJsIScpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJlYWN0aXZlRXZlbnRTb3VyY2Uoem9uZSwgKCkgPT4gZXZlbnRTb3VyY2VVcmwsIGV2ZW50U291cmNlSW5pdERpY3QpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkeW5hbWljVXJsPFQ+KFxuICAgIHpvbmU6IE5nWm9uZSxcbiAgICBldmVudFNvdXJjZVVybFByb3ZpZGVyOiAoKSA9PiBzdHJpbmcsXG4gICAgZXZlbnRTb3VyY2VJbml0RGljdD86IEV2ZW50U291cmNlSW5pdFxuICApOiBSZWFjdGl2ZUV2ZW50U291cmNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IFJlYWN0aXZlRXZlbnRTb3VyY2Uoem9uZSwgZXZlbnRTb3VyY2VVcmxQcm92aWRlciwgZXZlbnRTb3VyY2VJbml0RGljdCk7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgZXZlbnRTb3VyY2VVcmxQcm92aWRlcjogKCkgPT4gc3RyaW5nLFxuICAgIHByaXZhdGUgZXZlbnRTb3VyY2VJbml0RGljdD86IEV2ZW50U291cmNlSW5pdFxuICApIHtcbiAgICBpZiAoIWV2ZW50U291cmNlVXJsUHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIGV2ZW50IHNvdXJjZSB1cmwgcHJvdmlkZXIhJyk7XG4gICAgfVxuICAgIHRoaXMub3BlbigpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIGdldCBjbG9zZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb3NlZDtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBldmVudCBzb3VyY2UuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBhdXRvbWF0aWNhbGx5IHVwb24gb2JqZWN0IGNyZWF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoaXMgcmVhY3RpdmUtZXZlbnQtc291cmNlIGhhc1xuICAgKiBiZWVuIGNsb3NlZCBleHBsaWNpdGx5LlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gZXZlbnQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cbiAgICogQHBhcmFtIGV2ZW50VHlwZSBUaGUgZXZlbnQgdHlwZS4gRGVmYXVsdHMgdG8gJ21lc3NhZ2UnLlxuICAgKi9cbiAgcHVibGljIGV2ZW50cyhldmVudFR5cGU6IHN0cmluZyA9ICdtZXNzYWdlJyk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgaWYgKCF0aGlzLmV2ZW50VG9waWNzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICB0aGlzLmV2ZW50VG9waWNzLnNldChldmVudFR5cGUsIG5ldyBTdWJqZWN0PE1lc3NhZ2VFdmVudD4oKSk7XG4gICAgICB0aGlzLmVuc3VyZVJlZ2lzdHJhdGlvbnMoKTtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRTdWJqID0gdGhpcy5ldmVudFRvcGljcy5nZXQoZXZlbnRUeXBlKTtcbiAgICByZXR1cm4gZXZlbnRTdWJqLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBldmVudCBzdHJlYW0gb2YgbWVzc2FnZXMgcGFyc2VkIGZyb20ganNvbi5cbiAgICogKGV2ZW50LmRhdGEgbXVzdCBiZSBpbiBqc29uIGZvcm1hdClcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50VHlwZSBUaGUgZXZlbnQgdHlwZS4gRGVmYXVsdHMgdG8gJ21lc3NhZ2UnLlxuICAgKi9cbiAgcHVibGljIGV2ZW50c0pzb24oZXZlbnRUeXBlOiBzdHJpbmcgPSAnbWVzc2FnZScpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMoZXZlbnRUeXBlKS5waXBlKFxuICAgICAgbWFwKGV2ZW50ID0+IEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGlzIGV2ZW50IHNvdXJjZS4gSXQgd29udCByZWNvbm5lY3QuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlQ3VycmVudCgpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDbG9zaW5nIHRoZSBldmVudC1zb3VyY2UuJyk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcHMgdGhpcyByZWFjdGl2ZSBldmVudCBzb3VyY2Ugb3BlbiB1bnRpbCB0aGUgZ2l2ZW4gb2JzZXJ2YWJsZSBlbWl0cyBhbiBldmVudC5cbiAgICogQHBhcmFtIHVuc3Vic2NyaWJlXG4gICAqL1xuICBwdWJsaWMgb3BlblVudGlsKHVuc3Vic2NyaWJlOiBPYnNlcnZhYmxlPGFueT4pOiB0aGlzIHtcbiAgICB0aGlzLmNsZWFuVXBPcGVuVW50aWwoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZVN1YiA9IHVuc3Vic2NyaWJlXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB0aGlzLmNsb3NlKClcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNsZWFuVXBPcGVuVW50aWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Vuc3Vic2NyaWJlU3ViKSB7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fdW5zdWJzY3JpYmVTdWIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbm5lY3RzIHRoaXMgZXZlbnQgc291cmNlLCB1bmxlc3MgY2xvc2VkIGlzIHRydWU7XG4gICAqL1xuICBwcml2YXRlIHJlY29ubmVjdCgpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9jbG9zZWQpIHsgcmV0dXJuOyB9XG5cbiAgICB0aGlzLmNsb3NlQ3VycmVudCgpO1xuXG4gICAgY29uc3QgZXZlbnRTb3VyY2VVcmwgPSB0aGlzLmV2ZW50U291cmNlVXJsUHJvdmlkZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmN1cnJlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoZXZlbnRTb3VyY2VVcmwsIHRoaXMuZXZlbnRTb3VyY2VJbml0RGljdCk7XG5cbiAgICAgIHRoaXMuZW5zdXJlUmVnaXN0cmF0aW9ucygpO1xuXG4gICAgICB0aGlzLmN1cnJlbnRTb3VyY2Uub25vcGVuID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFdmVudFNvdXJjZSBjb25uZWN0aW9uIG9wZW5lZCB0bzogJyArIGV2ZW50U291cmNlVXJsICtcbiAgICAgICAgICAnLCBzdGF0ZTogJyArIHRoaXMucmVhZHlTdGF0ZUFzU3RyaW5nKHRoaXMuY3VycmVudFNvdXJjZSksIGV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY3VycmVudFNvdXJjZS5vbmVycm9yID0gKGVycm9yKSA9PiB7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoJ1RoZXJlIHdhcyBhbiBTU0UgZXJyb3IsIGN1cnJlbnQgc3RhdGU6ICcgKyB0aGlzLnJlYWR5U3RhdGVBc1N0cmluZyh0aGlzLmN1cnJlbnRTb3VyY2UpLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciAtIHRyeSByZWNvbm5lY3RpbmdcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQXR0ZW1wdGluZyB0byByZWNvbm5lY3QgZXZlbnQtc291cmNlIGF0JyArIGV2ZW50U291cmNlVXJsICsgJy4uLicpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWNvbm5lY3QoKSwgMzAwMCk7IC8vIERlbGF5IHRoZSByZWNvbm5lY3RcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnVGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBzc2UgY29ubmVjdGlvbiAoY2xvc2VkKS4nLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIEV2ZW50U291cmNlIGZvciAnICsgZXZlbnRTb3VyY2VVcmwsIGVycik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVjb25uZWN0KCksIDMwMDApOyAvLyBEZWxheSB0aGUgcmVjb25uZWN0XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVSZWdpc3RyYXRpb25zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTb3VyY2UpIHtcbiAgICAgIHRoaXMuZXZlbnRUb3BpY3MuZm9yRWFjaCgoc3ViamVjdCwgdHlwZSkgPT4ge1xuXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50TGlzdGVuZXJzLmhhcyh0eXBlKSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG1zZyA9PiBzdWJqZWN0Lm5leHQobXNnIGFzIE1lc3NhZ2VFdmVudCksXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50TGlzdGVuZXJzLmFkZCh0eXBlKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTGlzdGVuaW5nIHRvIGV2ZW50IHR5cGU6ICcgKyB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjdXJyZW50IGV2ZW50IHNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSBjbG9zZUN1cnJlbnQoKTogdm9pZCB7XG5cbiAgICB0aGlzLmN1cnJlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcblxuICAgIGlmICghdGhpcy5jdXJyZW50Q2xvc2VkKSB7XG4gICAgICAvLyBDbG9zZSBFdmVudCBTb3VyY2UgaWYgbm90IGFscmVhZHkgY2xvc2VkLlxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0Nsb3NpbmcgdGhlIGV2ZW50LXNvdXJjZS4nKTtcbiAgICAgIHRoaXMuY3VycmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgdGhpcy5jdXJyZW50U291cmNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBjdXJyZW50Q2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jdXJyZW50U291cmNlIHx8IHRoaXMuY3VycmVudFNvdXJjZS5yZWFkeVN0YXRlID09PSB0aGlzLmN1cnJlbnRTb3VyY2UuQ0xPU0VEO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkeVN0YXRlQXNTdHJpbmcoc291cmNlOiBFdmVudFNvdXJjZSk6IHN0cmluZyB7XG4gICAgaWYgKHNvdXJjZS5yZWFkeVN0YXRlID09PSBzb3VyY2UuT1BFTikge1xuICAgICAgcmV0dXJuICdPUEVOJztcbiAgICB9IGVsc2UgaWYgKHNvdXJjZS5yZWFkeVN0YXRlID09PSBzb3VyY2UuQ0xPU0VEKSB7XG4gICAgICByZXR1cm4gJ0NMT1NFRCc7XG4gICAgfSBlbHNlIGlmIChzb3VyY2UucmVhZHlTdGF0ZSA9PT0gc291cmNlLkNPTk5FQ1RJTkcpIHtcbiAgICAgIHJldHVybiAnQ09OTkVDVElORyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuICB9XG59XG4iXX0=