@ngxs/websocket-plugin 3.7.3-dev.master-5175b98 → 3.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,304 +1,275 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { Injectable, Inject } from '@angular/core';
7
- import { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';
8
- import { Subscription } from 'rxjs';
9
- import { WebSocketSubject } from 'rxjs/webSocket';
10
- import { ConnectWebSocket, DisconnectWebSocket, SendWebSocketMessage, NGXS_WEBSOCKET_OPTIONS, WebsocketMessageError, WebSocketDisconnected, TypeKeyPropertyMissingError, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
11
- var WebSocketHandler = /** @class */ (function () {
12
- function WebSocketHandler(store, actions$, options) {
13
- var _this = this;
14
- this.store = store;
15
- this.actions$ = actions$;
16
- this.options = options;
17
- this.socket = null;
18
- this.config = {
19
- url: (/** @type {?} */ (this.options.url)),
20
- protocol: this.options.protocol,
21
- // Default binary type is `blob` for the global `WebSocket`
22
- binaryType: this.options.binaryType,
23
- serializer: this.options.serializer,
24
- deserializer: this.options.deserializer,
25
- closeObserver: {
26
- next: (/**
27
- * @return {?}
28
- */
29
- function () {
30
- // ATTENTION!
31
- // See https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L340
32
- // RxJS socket emits `onComplete` event only if `event.wasClean` is truthy
33
- // and doesn't complete socket subject if it's falsy
34
- _this.disconnect();
35
- })
36
- },
37
- openObserver: {
38
- next: (/**
39
- * @return {?}
40
- */
41
- function () { return _this.store.dispatch(new WebSocketConnected()); })
42
- }
43
- };
44
- this.typeKey = (/** @type {?} */ (this.options.typeKey));
45
- this.subscription = new Subscription();
46
- this.setupActionsListeners();
47
- }
48
- /**
49
- * @return {?}
50
- */
51
- WebSocketHandler.prototype.ngOnDestroy = /**
52
- * @return {?}
53
- */
54
- function () {
55
- this.closeConnection();
56
- this.subscription.unsubscribe();
57
- };
58
- /**
59
- * @private
60
- * @return {?}
61
- */
62
- WebSocketHandler.prototype.setupActionsListeners = /**
63
- * @private
64
- * @return {?}
65
- */
66
- function () {
67
- var _this = this;
68
- this.subscription.add(this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
69
- * @param {?} __0
70
- * @return {?}
71
- */
72
- function (_a) {
73
- var payload = _a.payload;
74
- _this.connect(payload);
75
- })));
76
- this.subscription.add(this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
77
- * @return {?}
78
- */
79
- function () {
80
- _this.disconnect();
81
- })));
82
- this.subscription.add(this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
83
- * @param {?} __0
84
- * @return {?}
85
- */
86
- function (_a) {
87
- var payload = _a.payload;
88
- _this.send(payload);
89
- })));
90
- };
91
- /**
92
- * @private
93
- * @param {?=} options
94
- * @return {?}
95
- */
96
- WebSocketHandler.prototype.connect = /**
97
- * @private
98
- * @param {?=} options
99
- * @return {?}
100
- */
101
- function (options) {
102
- var _this = this;
103
- this.updateConnection();
104
- // Users can pass the options in the connect method so
105
- // if options aren't available at DI bootstrap they have access
106
- // to pass them here
107
- if (options) {
108
- this.mergeConfigWithOptions(options);
109
- }
110
- this.socket = new WebSocketSubject(this.config);
111
- this.socket.subscribe({
112
- next: (/**
113
- * @param {?} message
114
- * @return {?}
115
- */
116
- function (message) {
117
- /** @type {?} */
118
- var type = getValue(message, _this.typeKey);
119
- if (!type) {
120
- throw new TypeKeyPropertyMissingError(_this.typeKey);
121
- }
122
- _this.store.dispatch(tslib_1.__assign({}, message, { type: type }));
123
- }),
124
- error: (/**
125
- * @param {?} error
126
- * @return {?}
127
- */
128
- function (error) {
129
- if (error instanceof CloseEvent) {
130
- _this.dispatchWebSocketDisconnected();
131
- }
132
- else {
133
- _this.store.dispatch(new WebsocketMessageError(error));
134
- }
135
- })
136
- });
137
- };
138
- /**
139
- * @private
140
- * @return {?}
141
- */
142
- WebSocketHandler.prototype.disconnect = /**
143
- * @private
144
- * @return {?}
145
- */
146
- function () {
147
- if (this.socket) {
148
- this.closeConnection();
149
- this.dispatchWebSocketDisconnected();
150
- }
151
- };
152
- /**
153
- * @private
154
- * @param {?} data
155
- * @return {?}
156
- */
157
- WebSocketHandler.prototype.send = /**
158
- * @private
159
- * @param {?} data
160
- * @return {?}
161
- */
162
- function (data) {
163
- if (!this.socket) {
164
- throw new Error('You must connect to the socket before sending any data');
165
- }
166
- this.socket.next(data);
167
- };
168
- /**
169
- * Don't enlarge the `connect` method
170
- */
171
- /**
172
- * Don't enlarge the `connect` method
173
- * @private
174
- * @param {?} options
175
- * @return {?}
176
- */
177
- WebSocketHandler.prototype.mergeConfigWithOptions = /**
178
- * Don't enlarge the `connect` method
179
- * @private
180
- * @param {?} options
181
- * @return {?}
182
- */
183
- function (options) {
184
- if (options.url) {
185
- this.config.url = options.url;
186
- }
187
- if (options.serializer) {
188
- this.config.serializer = options.serializer;
189
- }
190
- if (options.deserializer) {
191
- this.config.deserializer = options.deserializer;
192
- }
193
- };
194
- /**
195
- * To ensure we don't have any memory leaks
196
- * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
197
- * then the previous subscription will still live in the memory
198
- * to prevent such behavior - we close the previous connection if it exists
199
- */
200
- /**
201
- * To ensure we don't have any memory leaks
202
- * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
203
- * then the previous subscription will still live in the memory
204
- * to prevent such behavior - we close the previous connection if it exists
205
- * @private
206
- * @return {?}
207
- */
208
- WebSocketHandler.prototype.updateConnection = /**
209
- * To ensure we don't have any memory leaks
210
- * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
211
- * then the previous subscription will still live in the memory
212
- * to prevent such behavior - we close the previous connection if it exists
213
- * @private
214
- * @return {?}
215
- */
216
- function () {
217
- if (this.socket) {
218
- this.closeConnection();
219
- this.store.dispatch(new WebSocketConnectionUpdated());
220
- }
221
- };
222
- /**
223
- * Used in many places so it's better to move the code into function
224
- */
225
- /**
226
- * Used in many places so it's better to move the code into function
227
- * @private
228
- * @return {?}
229
- */
230
- WebSocketHandler.prototype.dispatchWebSocketDisconnected = /**
231
- * Used in many places so it's better to move the code into function
232
- * @private
233
- * @return {?}
234
- */
235
- function () {
236
- this.store.dispatch(new WebSocketDisconnected());
237
- };
238
- /**
239
- * @private
240
- * @return {?}
241
- */
242
- WebSocketHandler.prototype.closeConnection = /**
243
- * @private
244
- * @return {?}
245
- */
246
- function () {
247
- // `socket.complete()` closes the connection
248
- // also it doesn't invoke the `onComplete` callback that we passed
249
- // into `socket.subscribe(...)`
250
- if (this.socket !== null) {
251
- this.socket.complete();
252
- this.socket = null;
253
- }
254
- };
255
- WebSocketHandler.decorators = [
256
- { type: Injectable }
257
- ];
258
- /** @nocollapse */
259
- WebSocketHandler.ctorParameters = function () { return [
260
- { type: Store },
261
- { type: Actions },
262
- { type: undefined, decorators: [{ type: Inject, args: [NGXS_WEBSOCKET_OPTIONS,] }] }
263
- ]; };
264
- return WebSocketHandler;
265
- }());
266
- export { WebSocketHandler };
267
- if (false) {
268
- /**
269
- * @type {?}
270
- * @private
271
- */
272
- WebSocketHandler.prototype.socket;
273
- /**
274
- * @type {?}
275
- * @private
276
- */
277
- WebSocketHandler.prototype.config;
278
- /**
279
- * @type {?}
280
- * @private
281
- */
282
- WebSocketHandler.prototype.typeKey;
283
- /**
284
- * @type {?}
285
- * @private
286
- */
287
- WebSocketHandler.prototype.subscription;
288
- /**
289
- * @type {?}
290
- * @private
291
- */
292
- WebSocketHandler.prototype.store;
293
- /**
294
- * @type {?}
295
- * @private
296
- */
297
- WebSocketHandler.prototype.actions$;
298
- /**
299
- * @type {?}
300
- * @private
301
- */
302
- WebSocketHandler.prototype.options;
303
- }
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy93ZWJzb2NrZXQtcGx1Z2luLyIsInNvdXJjZXMiOlsic3JjL3dlYnNvY2tldC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLGdCQUFnQixFQUEwQixNQUFNLGdCQUFnQixDQUFDO0FBRTFFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsRUFFdEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLGtCQUFrQixFQUNuQixNQUFNLFdBQVcsQ0FBQztBQUVuQjtJQTZCRSwwQkFDVSxLQUFZLEVBQ1osUUFBaUIsRUFDZSxPQUFtQztRQUg3RSxpQkFNQztRQUxTLFVBQUssR0FBTCxLQUFLLENBQU87UUFDWixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2UsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUE5QnJFLFdBQU0sR0FBaUMsSUFBSSxDQUFDO1FBRTVDLFdBQU0sR0FBZ0M7WUFDNUMsR0FBRyxFQUFFLG1CQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDO1lBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7O1lBRS9CLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbkMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUNuQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FB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UUFBUSxDQUFDLElBQUksMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSyx3REFBNkI7Ozs7O0lBQXJDO1FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7Ozs7SUFFTywwQ0FBZTs7OztJQUF2QjtRQUNFLDRDQUE0QztRQUM1QyxrRUFBa0U7UUFDbEUsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQjtJQUNILENBQUM7O2dCQXhKRixVQUFVOzs7O2dCQWxCTyxLQUFLO2dCQUFkLE9BQU87Z0RBa0RYLE1BQU0sU0FBQyxzQkFBc0I7O0lBeUhsQyx1QkFBQztDQUFBLEFBekpELElBeUpDO1NBeEpZLGdCQUFnQjs7Ozs7O0lBQzNCLGtDQUFvRDs7Ozs7SUFFcEQsa0NBbUJFOzs7OztJQUVGLG1DQUF3Qzs7Ozs7SUFFeEMsd0NBQTBDOzs7OztJQUd4QyxpQ0FBb0I7Ozs7O0lBQ3BCLG9DQUF5Qjs7Ozs7SUFDekIsbUNBQTJFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbnMsIFN0b3JlLCBnZXRWYWx1ZSwgb2ZBY3Rpb25EaXNwYXRjaGVkIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFdlYlNvY2tldFN1YmplY3QsIFdlYlNvY2tldFN1YmplY3RDb25maWcgfSBmcm9tICdyeGpzL3dlYlNvY2tldCc7XG5cbmltcG9ydCB7XG4gIENvbm5lY3RXZWJTb2NrZXQsXG4gIERpc2Nvbm5lY3RXZWJTb2NrZXQsXG4gIFNlbmRXZWJTb2NrZXRNZXNzYWdlLFxuICBOR1hTX1dFQlNPQ0tFVF9PUFRJT05TLFxuICBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyxcbiAgV2Vic29ja2V0TWVzc2FnZUVycm9yLFxuICBXZWJTb2NrZXREaXNjb25uZWN0ZWQsXG4gIFR5cGVLZXlQcm9wZXJ0eU1pc3NpbmdFcnJvcixcbiAgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQsXG4gIFdlYlNvY2tldENvbm5lY3RlZFxufSBmcm9tICcuL3N5bWJvbHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0SGFuZGxlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc29ja2V0OiBXZWJTb2NrZXRTdWJqZWN0PGFueT4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGNvbmZpZzogV2ViU29ja2V0U3ViamVjdENvbmZpZzxhbnk+ID0ge1xuICAgIHVybDogdGhpcy5vcHRpb25zLnVybCEsXG4gICAgcHJvdG9jb2w6IHRoaXMub3B0aW9ucy5wcm90b2NvbCxcbiAgICAvLyBEZWZhdWx0IGJpbmFyeSB0eXBlIGlzIGBibG9iYCBmb3IgdGhlIGdsb2JhbCBgV2ViU29ja2V0YFxuICAgIGJpbmFyeVR5cGU6IHRoaXMub3B0aW9ucy5iaW5hcnlUeXBlLFxuICAgIHNlcmlhbGl6ZXI6IHRoaXMub3B0aW9ucy5zZXJpYWxpemVyLFxuICAgIGRlc2VyaWFsaXplcjogdGhpcy5vcHRpb25zLmRlc2VyaWFsaXplcixcbiAgICBjbG9zZU9ic2VydmVyOiB7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIC8vIEFUVEVOVElPTiFcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdGl2ZVgvcnhqcy9ibG9iL21hc3Rlci9zcmMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kb20vV2ViU29ja2V0U3ViamVjdC50cyNMMzQwXG4gICAgICAgIC8vIFJ4SlMgc29ja2V0IGVtaXRzIGBvbkNvbXBsZXRlYCBldmVudCBvbmx5IGlmIGBldmVudC53YXNDbGVhbmAgaXMgdHJ1dGh5XG4gICAgICAgIC8vIGFuZCBkb2Vzbid0IGNvbXBsZXRlIHNvY2tldCBzdWJqZWN0IGlmIGl0J3MgZmFsc3lcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvcGVuT2JzZXJ2ZXI6IHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldENvbm5lY3RlZCgpKVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHR5cGVLZXkgPSB0aGlzLm9wdGlvbnMudHlwZUtleSE7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXG4gICAgcHJpdmF0ZSBhY3Rpb25zJDogQWN0aW9ucyxcbiAgICBASW5qZWN0KE5HWFNfV0VCU09DS0VUX09QVElPTlMpIHByaXZhdGUgb3B0aW9uczogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnNcbiAgKSB7XG4gICAgdGhpcy5zZXR1cEFjdGlvbnNMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBBY3Rpb25zTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuYWN0aW9ucyQucGlwZShvZkFjdGlvbkRpc3BhdGNoZWQoQ29ubmVjdFdlYlNvY2tldCkpLnN1YnNjcmliZSgoeyBwYXlsb2FkIH0pID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0KHBheWxvYWQpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5hY3Rpb25zJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChEaXNjb25uZWN0V2ViU29ja2V0KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmFjdGlvbnMkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKFNlbmRXZWJTb2NrZXRNZXNzYWdlKSkuc3Vic2NyaWJlKCh7IHBheWxvYWQgfSkgPT4ge1xuICAgICAgICB0aGlzLnNlbmQocGF5bG9hZCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbm5lY3Qob3B0aW9ucz86IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb25uZWN0aW9uKCk7XG5cbiAgICAvLyBVc2VycyBjYW4gcGFzcyB0aGUgb3B0aW9ucyBpbiB0aGUgY29ubmVjdCBtZXRob2Qgc29cbiAgICAvLyBpZiBvcHRpb25zIGFyZW4ndCBhdmFpbGFibGUgYXQgREkgYm9vdHN0cmFwIHRoZXkgaGF2ZSBhY2Nlc3NcbiAgICAvLyB0byBwYXNzIHRoZW0gaGVyZVxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICB0aGlzLm1lcmdlQ29uZmlnV2l0aE9wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0U3ViamVjdCh0aGlzLmNvbmZpZyk7XG5cbiAgICB0aGlzLnNvY2tldC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKG1lc3NhZ2U6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gZ2V0VmFsdWUobWVzc2FnZSwgdGhpcy50eXBlS2V5KTtcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVLZXlQcm9wZXJ0eU1pc3NpbmdFcnJvcih0aGlzLnR5cGVLZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goeyAuLi5tZXNzYWdlLCB0eXBlIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDbG9zZUV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYnNvY2tldE1lc3NhZ2VFcnJvcihlcnJvcikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgdGhpcy5kaXNwYXRjaFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VuZChkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGNvbm5lY3QgdG8gdGhlIHNvY2tldCBiZWZvcmUgc2VuZGluZyBhbnkgZGF0YScpO1xuICAgIH1cblxuICAgIHRoaXMuc29ja2V0Lm5leHQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogRG9uJ3QgZW5sYXJnZSB0aGUgYGNvbm5lY3RgIG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1dpdGhPcHRpb25zKG9wdGlvbnM6IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICB0aGlzLmNvbmZpZy51cmwgPSBvcHRpb25zLnVybDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zZXJpYWxpemVyKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zZXJpYWxpemVyID0gb3B0aW9ucy5zZXJpYWxpemVyO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRlc2VyaWFsaXplcikge1xuICAgICAgdGhpcy5jb25maWcuZGVzZXJpYWxpemVyID0gb3B0aW9ucy5kZXNlcmlhbGl6ZXI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvIGVuc3VyZSB3ZSBkb24ndCBoYXZlIGFueSBtZW1vcnkgbGVha3NcbiAgICogZS5nLiBpZiB0aGUgdXNlciBvY2Nhc2lvbmFsbHkgZGlzcGF0Y2hlZCBgQ29ubmVjdFdlYlNvY2tldGAgdHdpY2VcbiAgICogdGhlbiB0aGUgcHJldmlvdXMgc3Vic2NyaXB0aW9uIHdpbGwgc3RpbGwgbGl2ZSBpbiB0aGUgbWVtb3J5XG4gICAqIHRvIHByZXZlbnQgc3VjaCBiZWhhdmlvciAtIHdlIGNsb3NlIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGlmIGl0IGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDb25uZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldENvbm5lY3Rpb25VcGRhdGVkKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGluIG1hbnkgcGxhY2VzIHNvIGl0J3MgYmV0dGVyIHRvIG1vdmUgdGhlIGNvZGUgaW50byBmdW5jdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXREaXNjb25uZWN0ZWQoKSk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlQ29ubmVjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBgc29ja2V0LmNvbXBsZXRlKClgIGNsb3NlcyB0aGUgY29ubmVjdGlvblxuICAgIC8vIGFsc28gaXQgZG9lc24ndCBpbnZva2UgdGhlIGBvbkNvbXBsZXRlYCBjYWxsYmFjayB0aGF0IHdlIHBhc3NlZFxuICAgIC8vIGludG8gYHNvY2tldC5zdWJzY3JpYmUoLi4uKWBcbiAgICBpZiAodGhpcy5zb2NrZXQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc29ja2V0LmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { Injectable, Inject } from '@angular/core';
7
+ import { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';
8
+ import { WebSocketSubject } from 'rxjs/webSocket';
9
+ import { ConnectWebSocket, DisconnectWebSocket, SendWebSocketMessage, NGXS_WEBSOCKET_OPTIONS, WebsocketMessageError, WebSocketDisconnected, TypeKeyPropertyMissingError, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
10
+ var WebSocketHandler = /** @class */ (function () {
11
+ function WebSocketHandler(store, actions$, options) {
12
+ var _this = this;
13
+ this.store = store;
14
+ this.actions$ = actions$;
15
+ this.options = options;
16
+ this.socket = null;
17
+ this.config = {
18
+ url: (/** @type {?} */ (this.options.url)),
19
+ protocol: this.options.protocol,
20
+ // Default binary type is `blob` for the global `WebSocket`
21
+ binaryType: this.options.binaryType,
22
+ serializer: this.options.serializer,
23
+ deserializer: this.options.deserializer,
24
+ closeObserver: {
25
+ next: (/**
26
+ * @return {?}
27
+ */
28
+ function () {
29
+ // ATTENTION!
30
+ // See https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L340
31
+ // RxJS socket emits `onComplete` event only if `event.wasClean` is truthy
32
+ // and doesn't complete socket subject if it's falsy
33
+ _this.disconnect();
34
+ })
35
+ },
36
+ openObserver: {
37
+ next: (/**
38
+ * @return {?}
39
+ */
40
+ function () { return _this.store.dispatch(new WebSocketConnected()); })
41
+ }
42
+ };
43
+ this.typeKey = (/** @type {?} */ (this.options.typeKey));
44
+ this.setupActionsListeners();
45
+ }
46
+ /**
47
+ * @private
48
+ * @return {?}
49
+ */
50
+ WebSocketHandler.prototype.setupActionsListeners = /**
51
+ * @private
52
+ * @return {?}
53
+ */
54
+ function () {
55
+ var _this = this;
56
+ this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
57
+ * @param {?} __0
58
+ * @return {?}
59
+ */
60
+ function (_a) {
61
+ var payload = _a.payload;
62
+ _this.connect(payload);
63
+ }));
64
+ this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
65
+ * @return {?}
66
+ */
67
+ function () {
68
+ _this.disconnect();
69
+ }));
70
+ this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
71
+ * @param {?} __0
72
+ * @return {?}
73
+ */
74
+ function (_a) {
75
+ var payload = _a.payload;
76
+ _this.send(payload);
77
+ }));
78
+ };
79
+ /**
80
+ * @private
81
+ * @param {?=} options
82
+ * @return {?}
83
+ */
84
+ WebSocketHandler.prototype.connect = /**
85
+ * @private
86
+ * @param {?=} options
87
+ * @return {?}
88
+ */
89
+ function (options) {
90
+ var _this = this;
91
+ this.updateConnection();
92
+ // Users can pass the options in the connect method so
93
+ // if options aren't available at DI bootstrap they have access
94
+ // to pass them here
95
+ if (options) {
96
+ this.mergeConfigWithOptions(options);
97
+ }
98
+ this.socket = new WebSocketSubject(this.config);
99
+ this.socket.subscribe({
100
+ next: (/**
101
+ * @param {?} message
102
+ * @return {?}
103
+ */
104
+ function (message) {
105
+ /** @type {?} */
106
+ var type = getValue(message, _this.typeKey);
107
+ if (!type) {
108
+ throw new TypeKeyPropertyMissingError(_this.typeKey);
109
+ }
110
+ _this.store.dispatch(tslib_1.__assign({}, message, { type: type }));
111
+ }),
112
+ error: (/**
113
+ * @param {?} error
114
+ * @return {?}
115
+ */
116
+ function (error) {
117
+ if (error instanceof CloseEvent) {
118
+ _this.dispatchWebSocketDisconnected();
119
+ }
120
+ else {
121
+ _this.store.dispatch(new WebsocketMessageError(error));
122
+ }
123
+ })
124
+ });
125
+ };
126
+ /**
127
+ * @private
128
+ * @return {?}
129
+ */
130
+ WebSocketHandler.prototype.disconnect = /**
131
+ * @private
132
+ * @return {?}
133
+ */
134
+ function () {
135
+ if (this.socket) {
136
+ // `socket.complete()` closes the connection
137
+ // also it doesn't invoke the `onComplete` callback that we passed
138
+ // into `socket.subscribe(...)`
139
+ this.socket.complete();
140
+ this.socket = null;
141
+ this.dispatchWebSocketDisconnected();
142
+ }
143
+ };
144
+ /**
145
+ * @private
146
+ * @param {?} data
147
+ * @return {?}
148
+ */
149
+ WebSocketHandler.prototype.send = /**
150
+ * @private
151
+ * @param {?} data
152
+ * @return {?}
153
+ */
154
+ function (data) {
155
+ if (!this.socket) {
156
+ throw new Error('You must connect to the socket before sending any data');
157
+ }
158
+ this.socket.next(data);
159
+ };
160
+ /**
161
+ * Don't enlarge the `connect` method
162
+ */
163
+ /**
164
+ * Don't enlarge the `connect` method
165
+ * @private
166
+ * @param {?} options
167
+ * @return {?}
168
+ */
169
+ WebSocketHandler.prototype.mergeConfigWithOptions = /**
170
+ * Don't enlarge the `connect` method
171
+ * @private
172
+ * @param {?} options
173
+ * @return {?}
174
+ */
175
+ function (options) {
176
+ if (options.url) {
177
+ this.config.url = options.url;
178
+ }
179
+ if (options.serializer) {
180
+ this.config.serializer = options.serializer;
181
+ }
182
+ if (options.deserializer) {
183
+ this.config.deserializer = options.deserializer;
184
+ }
185
+ };
186
+ /**
187
+ * To ensure we don't have any memory leaks
188
+ * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
189
+ * then the previous subscription will still live in the memory
190
+ * to prevent such behavior - we close the previous connection if it exists
191
+ */
192
+ /**
193
+ * To ensure we don't have any memory leaks
194
+ * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
195
+ * then the previous subscription will still live in the memory
196
+ * to prevent such behavior - we close the previous connection if it exists
197
+ * @private
198
+ * @return {?}
199
+ */
200
+ WebSocketHandler.prototype.updateConnection = /**
201
+ * To ensure we don't have any memory leaks
202
+ * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
203
+ * then the previous subscription will still live in the memory
204
+ * to prevent such behavior - we close the previous connection if it exists
205
+ * @private
206
+ * @return {?}
207
+ */
208
+ function () {
209
+ if (this.socket) {
210
+ this.socket.complete();
211
+ this.socket = null;
212
+ this.store.dispatch(new WebSocketConnectionUpdated());
213
+ }
214
+ };
215
+ /**
216
+ * Used in many places so it's better to move the code into function
217
+ */
218
+ /**
219
+ * Used in many places so it's better to move the code into function
220
+ * @private
221
+ * @return {?}
222
+ */
223
+ WebSocketHandler.prototype.dispatchWebSocketDisconnected = /**
224
+ * Used in many places so it's better to move the code into function
225
+ * @private
226
+ * @return {?}
227
+ */
228
+ function () {
229
+ this.store.dispatch(new WebSocketDisconnected());
230
+ };
231
+ WebSocketHandler.decorators = [
232
+ { type: Injectable }
233
+ ];
234
+ /** @nocollapse */
235
+ WebSocketHandler.ctorParameters = function () { return [
236
+ { type: Store },
237
+ { type: Actions },
238
+ { type: undefined, decorators: [{ type: Inject, args: [NGXS_WEBSOCKET_OPTIONS,] }] }
239
+ ]; };
240
+ return WebSocketHandler;
241
+ }());
242
+ export { WebSocketHandler };
243
+ if (false) {
244
+ /**
245
+ * @type {?}
246
+ * @private
247
+ */
248
+ WebSocketHandler.prototype.socket;
249
+ /**
250
+ * @type {?}
251
+ * @private
252
+ */
253
+ WebSocketHandler.prototype.config;
254
+ /**
255
+ * @type {?}
256
+ * @private
257
+ */
258
+ WebSocketHandler.prototype.typeKey;
259
+ /**
260
+ * @type {?}
261
+ * @private
262
+ */
263
+ WebSocketHandler.prototype.store;
264
+ /**
265
+ * @type {?}
266
+ * @private
267
+ */
268
+ WebSocketHandler.prototype.actions$;
269
+ /**
270
+ * @type {?}
271
+ * @private
272
+ */
273
+ WebSocketHandler.prototype.options;
274
+ }
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy93ZWJzb2NrZXQtcGx1Z2luLyIsInNvdXJjZXMiOlsic3JjL3dlYnNvY2tldC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBRXRCLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQixrQkFBa0IsRUFDbkIsTUFBTSxXQUFXLENBQUM7QUFFbkI7SUEyQkUsMEJBQ1UsS0FBWSxFQUNaLFFBQWlCLEVBQ2UsT0FBbUM7UUFIN0UsaUJBTUM7UUFMUyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNlLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBNUJyRSxXQUFNLEdBQWlDLElBQUksQ0FBQztRQUU1QyxXQUFNLEdBQWdDO1lBQzVDLEdBQUcsRUFBRSxtQkFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBQztZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFROztZQUUvQixVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQ25DLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbkMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWTtZQUN2QyxhQUFhLEVBQUU7Z0JBQ2IsSUFBSTs7O2dCQUFF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QUFDOztnQkF0SUYsVUFBVTs7OztnQkFqQk8sS0FBSztnQkFBZCxPQUFPO2dEQStDWCxNQUFNLFNBQUMsc0JBQXNCOztJQXlHbEMsdUJBQUM7Q0FBQSxBQXZJRCxJQXVJQztTQXRJWSxnQkFBZ0I7Ozs7OztJQUMzQixrQ0FBb0Q7Ozs7O0lBRXBELGtDQW1CRTs7Ozs7SUFFRixtQ0FBd0M7Ozs7O0lBR3RDLGlDQUFvQjs7Ozs7SUFDcEIsb0NBQXlCOzs7OztJQUN6QixtQ0FBMkUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aW9ucywgU3RvcmUsIGdldFZhbHVlLCBvZkFjdGlvbkRpc3BhdGNoZWQgfSBmcm9tICdAbmd4cy9zdG9yZSc7XHJcblxyXG5pbXBvcnQgeyBXZWJTb2NrZXRTdWJqZWN0LCBXZWJTb2NrZXRTdWJqZWN0Q29uZmlnIH0gZnJvbSAncnhqcy93ZWJTb2NrZXQnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb25uZWN0V2ViU29ja2V0LFxyXG4gIERpc2Nvbm5lY3RXZWJTb2NrZXQsXHJcbiAgU2VuZFdlYlNvY2tldE1lc3NhZ2UsXHJcbiAgTkdYU19XRUJTT0NLRVRfT1BUSU9OUyxcclxuICBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyxcclxuICBXZWJzb2NrZXRNZXNzYWdlRXJyb3IsXHJcbiAgV2ViU29ja2V0RGlzY29ubmVjdGVkLFxyXG4gIFR5cGVLZXlQcm9wZXJ0eU1pc3NpbmdFcnJvcixcclxuICBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCxcclxuICBXZWJTb2NrZXRDb25uZWN0ZWRcclxufSBmcm9tICcuL3N5bWJvbHMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0SGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldFN1YmplY3Q8YW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGNvbmZpZzogV2ViU29ja2V0U3ViamVjdENvbmZpZzxhbnk+ID0ge1xyXG4gICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsISxcclxuICAgIHByb3RvY29sOiB0aGlzLm9wdGlvbnMucHJvdG9jb2wsXHJcbiAgICAvLyBEZWZhdWx0IGJpbmFyeSB0eXBlIGlzIGBibG9iYCBmb3IgdGhlIGdsb2JhbCBgV2ViU29ja2V0YFxyXG4gICAgYmluYXJ5VHlwZTogdGhpcy5vcHRpb25zLmJpbmFyeVR5cGUsXHJcbiAgICBzZXJpYWxpemVyOiB0aGlzLm9wdGlvbnMuc2VyaWFsaXplcixcclxuICAgIGRlc2VyaWFsaXplcjogdGhpcy5vcHRpb25zLmRlc2VyaWFsaXplcixcclxuICAgIGNsb3NlT2JzZXJ2ZXI6IHtcclxuICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgIC8vIEFUVEVOVElPTiFcclxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL2Jsb2IvbWFzdGVyL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmxlL2RvbS9XZWJTb2NrZXRTdWJqZWN0LnRzI0wzNDBcclxuICAgICAgICAvLyBSeEpTIHNvY2tldCBlbWl0cyBgb25Db21wbGV0ZWAgZXZlbnQgb25seSBpZiBgZXZlbnQud2FzQ2xlYW5gIGlzIHRydXRoeVxyXG4gICAgICAgIC8vIGFuZCBkb2Vzbid0IGNvbXBsZXRlIHNvY2tldCBzdWJqZWN0IGlmIGl0J3MgZmFsc3lcclxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9wZW5PYnNlcnZlcjoge1xyXG4gICAgICBuZXh0OiAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXRDb25uZWN0ZWQoKSlcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwcml2YXRlIHR5cGVLZXkgPSB0aGlzLm9wdGlvbnMudHlwZUtleSE7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXHJcbiAgICBwcml2YXRlIGFjdGlvbnMkOiBBY3Rpb25zLFxyXG4gICAgQEluamVjdChOR1hTX1dFQlNPQ0tFVF9PUFRJT05TKSBwcml2YXRlIG9wdGlvbnM6IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNldHVwQWN0aW9uc0xpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEFjdGlvbnNMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKENvbm5lY3RXZWJTb2NrZXQpKS5zdWJzY3JpYmUoKHsgcGF5bG9hZCB9KSA9PiB7XHJcbiAgICAgIHRoaXMuY29ubmVjdChwYXlsb2FkKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWN0aW9ucyQucGlwZShvZkFjdGlvbkRpc3BhdGNoZWQoRGlzY29ubmVjdFdlYlNvY2tldCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChTZW5kV2ViU29ja2V0TWVzc2FnZSkpLnN1YnNjcmliZSgoeyBwYXlsb2FkIH0pID0+IHtcclxuICAgICAgdGhpcy5zZW5kKHBheWxvYWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbm5lY3Qob3B0aW9ucz86IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcclxuXHJcbiAgICAvLyBVc2VycyBjYW4gcGFzcyB0aGUgb3B0aW9ucyBpbiB0aGUgY29ubmVjdCBtZXRob2Qgc29cclxuICAgIC8vIGlmIG9wdGlvbnMgYXJlbid0IGF2YWlsYWJsZSBhdCBESSBib290c3RyYXAgdGhleSBoYXZlIGFjY2Vzc1xyXG4gICAgLy8gdG8gcGFzcyB0aGVtIGhlcmVcclxuICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgIHRoaXMubWVyZ2VDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXRTdWJqZWN0KHRoaXMuY29uZmlnKTtcclxuXHJcbiAgICB0aGlzLnNvY2tldC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFZhbHVlKG1lc3NhZ2UsIHRoaXMudHlwZUtleSk7XHJcbiAgICAgICAgaWYgKCF0eXBlKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yKHRoaXMudHlwZUtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goeyAuLi5tZXNzYWdlLCB0eXBlIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDbG9zZUV2ZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYnNvY2tldE1lc3NhZ2VFcnJvcihlcnJvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcclxuICAgICAgLy8gYHNvY2tldC5jb21wbGV0ZSgpYCBjbG9zZXMgdGhlIGNvbm5lY3Rpb25cclxuICAgICAgLy8gYWxzbyBpdCBkb2Vzbid0IGludm9rZSB0aGUgYG9uQ29tcGxldGVgIGNhbGxiYWNrIHRoYXQgd2UgcGFzc2VkXHJcbiAgICAgIC8vIGludG8gYHNvY2tldC5zdWJzY3JpYmUoLi4uKWBcclxuICAgICAgdGhpcy5zb2NrZXQuY29tcGxldGUoKTtcclxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmQoZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc29ja2V0KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgY29ubmVjdCB0byB0aGUgc29ja2V0IGJlZm9yZSBzZW5kaW5nIGFueSBkYXRhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zb2NrZXQubmV4dChkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvbid0IGVubGFyZ2UgdGhlIGBjb25uZWN0YCBtZXRob2RcclxuICAgKi9cclxuICBwcml2YXRlIG1lcmdlQ29uZmlnV2l0aE9wdGlvbnMob3B0aW9uczogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnMpOiB2b2lkIHtcclxuICAgIGlmIChvcHRpb25zLnVybCkge1xyXG4gICAgICB0aGlzLmNvbmZpZy51cmwgPSBvcHRpb25zLnVybDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9ucy5zZXJpYWxpemVyKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLnNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZGVzZXJpYWxpemVyKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLmRlc2VyaWFsaXplciA9IG9wdGlvbnMuZGVzZXJpYWxpemVyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG8gZW5zdXJlIHdlIGRvbid0IGhhdmUgYW55IG1lbW9yeSBsZWFrc1xyXG4gICAqIGUuZy4gaWYgdGhlIHVzZXIgb2NjYXNpb25hbGx5IGRpc3BhdGNoZWQgYENvbm5lY3RXZWJTb2NrZXRgIHR3aWNlXHJcbiAgICogdGhlbiB0aGUgcHJldmlvdXMgc3Vic2NyaXB0aW9uIHdpbGwgc3RpbGwgbGl2ZSBpbiB0aGUgbWVtb3J5XHJcbiAgICogdG8gcHJldmVudCBzdWNoIGJlaGF2aW9yIC0gd2UgY2xvc2UgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24gaWYgaXQgZXhpc3RzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XHJcbiAgICAgIHRoaXMuc29ja2V0LmNvbXBsZXRlKCk7XHJcbiAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcclxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIGluIG1hbnkgcGxhY2VzIHNvIGl0J3MgYmV0dGVyIHRvIG1vdmUgdGhlIGNvZGUgaW50byBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzcGF0Y2hXZWJTb2NrZXREaXNjb25uZWN0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXREaXNjb25uZWN0ZWQoKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==