@ngxs/websocket-plugin 3.7.3 → 3.7.4
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.
- package/bundles/ngxs-websocket-plugin.umd.js +45 -17
- package/bundles/ngxs-websocket-plugin.umd.js.map +1 -1
- package/bundles/ngxs-websocket-plugin.umd.min.js +2 -2
- package/bundles/ngxs-websocket-plugin.umd.min.js.map +1 -1
- package/esm2015/src/websocket-handler.js +36 -14
- package/esm5/src/websocket-handler.js +43 -14
- package/fesm2015/ngxs-websocket-plugin.js +35 -13
- package/fesm2015/ngxs-websocket-plugin.js.map +1 -1
- package/fesm5/ngxs-websocket-plugin.js +42 -13
- package/fesm5/ngxs-websocket-plugin.js.map +1 -1
- package/ngxs-websocket-plugin.metadata.json +1 -1
- package/package.json +4 -4
- package/src/websocket-handler.d.ts +5 -1
- package/tests/typings.d.ts +18 -0
- package/typings.d.ts +0 -0
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Injectable, Inject } from '@angular/core';
|
|
6
6
|
import { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';
|
|
7
|
+
import { Subscription } from 'rxjs';
|
|
7
8
|
import { WebSocketSubject } from 'rxjs/webSocket';
|
|
8
9
|
import { ConnectWebSocket, DisconnectWebSocket, SendWebSocketMessage, NGXS_WEBSOCKET_OPTIONS, WebsocketMessageError, WebSocketDisconnected, TypeKeyPropertyMissingError, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
|
|
9
10
|
export class WebSocketHandler {
|
|
@@ -44,33 +45,41 @@ export class WebSocketHandler {
|
|
|
44
45
|
}
|
|
45
46
|
};
|
|
46
47
|
this.typeKey = (/** @type {?} */ (this.options.typeKey));
|
|
48
|
+
this.subscription = new Subscription();
|
|
47
49
|
this.setupActionsListeners();
|
|
48
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* @return {?}
|
|
53
|
+
*/
|
|
54
|
+
ngOnDestroy() {
|
|
55
|
+
this.closeConnection();
|
|
56
|
+
this.subscription.unsubscribe();
|
|
57
|
+
}
|
|
49
58
|
/**
|
|
50
59
|
* @private
|
|
51
60
|
* @return {?}
|
|
52
61
|
*/
|
|
53
62
|
setupActionsListeners() {
|
|
54
|
-
this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
|
|
63
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
|
|
55
64
|
* @param {?} __0
|
|
56
65
|
* @return {?}
|
|
57
66
|
*/
|
|
58
67
|
({ payload }) => {
|
|
59
68
|
this.connect(payload);
|
|
60
|
-
}));
|
|
61
|
-
this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
|
|
69
|
+
})));
|
|
70
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
|
|
62
71
|
* @return {?}
|
|
63
72
|
*/
|
|
64
73
|
() => {
|
|
65
74
|
this.disconnect();
|
|
66
|
-
}));
|
|
67
|
-
this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
|
|
75
|
+
})));
|
|
76
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
|
|
68
77
|
* @param {?} __0
|
|
69
78
|
* @return {?}
|
|
70
79
|
*/
|
|
71
80
|
({ payload }) => {
|
|
72
81
|
this.send(payload);
|
|
73
|
-
}));
|
|
82
|
+
})));
|
|
74
83
|
}
|
|
75
84
|
/**
|
|
76
85
|
* @private
|
|
@@ -119,11 +128,7 @@ export class WebSocketHandler {
|
|
|
119
128
|
*/
|
|
120
129
|
disconnect() {
|
|
121
130
|
if (this.socket) {
|
|
122
|
-
|
|
123
|
-
// also it doesn't invoke the `onComplete` callback that we passed
|
|
124
|
-
// into `socket.subscribe(...)`
|
|
125
|
-
this.socket.complete();
|
|
126
|
-
this.socket = null;
|
|
131
|
+
this.closeConnection();
|
|
127
132
|
this.dispatchWebSocketDisconnected();
|
|
128
133
|
}
|
|
129
134
|
}
|
|
@@ -165,8 +170,7 @@ export class WebSocketHandler {
|
|
|
165
170
|
*/
|
|
166
171
|
updateConnection() {
|
|
167
172
|
if (this.socket) {
|
|
168
|
-
this.
|
|
169
|
-
this.socket = null;
|
|
173
|
+
this.closeConnection();
|
|
170
174
|
this.store.dispatch(new WebSocketConnectionUpdated());
|
|
171
175
|
}
|
|
172
176
|
}
|
|
@@ -178,6 +182,19 @@ export class WebSocketHandler {
|
|
|
178
182
|
dispatchWebSocketDisconnected() {
|
|
179
183
|
this.store.dispatch(new WebSocketDisconnected());
|
|
180
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* @private
|
|
187
|
+
* @return {?}
|
|
188
|
+
*/
|
|
189
|
+
closeConnection() {
|
|
190
|
+
// `socket.complete()` closes the connection
|
|
191
|
+
// also it doesn't invoke the `onComplete` callback that we passed
|
|
192
|
+
// into `socket.subscribe(...)`
|
|
193
|
+
if (this.socket !== null) {
|
|
194
|
+
this.socket.complete();
|
|
195
|
+
this.socket = null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
181
198
|
}
|
|
182
199
|
WebSocketHandler.decorators = [
|
|
183
200
|
{ type: Injectable }
|
|
@@ -204,6 +221,11 @@ if (false) {
|
|
|
204
221
|
* @private
|
|
205
222
|
*/
|
|
206
223
|
WebSocketHandler.prototype.typeKey;
|
|
224
|
+
/**
|
|
225
|
+
* @type {?}
|
|
226
|
+
* @private
|
|
227
|
+
*/
|
|
228
|
+
WebSocketHandler.prototype.subscription;
|
|
207
229
|
/**
|
|
208
230
|
* @type {?}
|
|
209
231
|
* @private
|
|
@@ -220,4 +242,4 @@ if (false) {
|
|
|
220
242
|
*/
|
|
221
243
|
WebSocketHandler.prototype.options;
|
|
222
244
|
}
|
|
223
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy93ZWJzb2NrZXQtcGx1Z2luLyIsInNvdXJjZXMiOlsic3JjL3dlYnNvY2tldC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0UsT0FBTyxFQUFFLGdCQUFnQixFQUEwQixNQUFNLGdCQUFnQixDQUFDO0FBRTFFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsRUFFdEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLGtCQUFrQixFQUNuQixNQUFNLFdBQVcsQ0FBQztBQUduQixNQUFNLE9BQU8sZ0JBQWdCOzs7Ozs7SUEwQjNCLFlBQ1UsS0FBWSxFQUNaLFFBQWlCLEVBQ2UsT0FBbUM7UUFGbkUsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDZSxZQUFPLEdBQVAsT0FBTyxDQUE0QjtRQTVCckUsV0FBTSxHQUFpQyxJQUFJLENBQUM7UUFFNUMsV0FBTSxHQUFnQztZQUM1QyxHQUFHLEVBQUUsbUJBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUM7WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTs7WUFFL0IsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQ25DLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVk7WUFDdkMsYUFBYSxFQUFFO2dCQUNiLElB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LGtDQUFvRDs7Ozs7SUFFcEQsa0NBbUJFOzs7OztJQUVGLG1DQUF3Qzs7Ozs7SUFHdEMsaUNBQW9COzs7OztJQUNwQixvQ0FBeUI7Ozs7O0lBQ3pCLG1DQUEyRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3Rpb25zLCBTdG9yZSwgZ2V0VmFsdWUsIG9mQWN0aW9uRGlzcGF0Y2hlZCB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcclxuXHJcbmltcG9ydCB7IFdlYlNvY2tldFN1YmplY3QsIFdlYlNvY2tldFN1YmplY3RDb25maWcgfSBmcm9tICdyeGpzL3dlYlNvY2tldCc7XHJcblxyXG5pbXBvcnQge1xyXG4gIENvbm5lY3RXZWJTb2NrZXQsXHJcbiAgRGlzY29ubmVjdFdlYlNvY2tldCxcclxuICBTZW5kV2ViU29ja2V0TWVzc2FnZSxcclxuICBOR1hTX1dFQlNPQ0tFVF9PUFRJT05TLFxyXG4gIE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zLFxyXG4gIFdlYnNvY2tldE1lc3NhZ2VFcnJvcixcclxuICBXZWJTb2NrZXREaXNjb25uZWN0ZWQsXHJcbiAgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yLFxyXG4gIFdlYlNvY2tldENvbm5lY3Rpb25VcGRhdGVkLFxyXG4gIFdlYlNvY2tldENvbm5lY3RlZFxyXG59IGZyb20gJy4vc3ltYm9scyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRIYW5kbGVyIHtcclxuICBwcml2YXRlIHNvY2tldDogV2ViU29ja2V0U3ViamVjdDxhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgY29uZmlnOiBXZWJTb2NrZXRTdWJqZWN0Q29uZmlnPGFueT4gPSB7XHJcbiAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwhLFxyXG4gICAgcHJvdG9jb2w6IHRoaXMub3B0aW9ucy5wcm90b2NvbCxcclxuICAgIC8vIERlZmF1bHQgYmluYXJ5IHR5cGUgaXMgYGJsb2JgIGZvciB0aGUgZ2xvYmFsIGBXZWJTb2NrZXRgXHJcbiAgICBiaW5hcnlUeXBlOiB0aGlzLm9wdGlvbnMuYmluYXJ5VHlwZSxcclxuICAgIHNlcmlhbGl6ZXI6IHRoaXMub3B0aW9ucy5zZXJpYWxpemVyLFxyXG4gICAgZGVzZXJpYWxpemVyOiB0aGlzLm9wdGlvbnMuZGVzZXJpYWxpemVyLFxyXG4gICAgY2xvc2VPYnNlcnZlcjoge1xyXG4gICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgLy8gQVRURU5USU9OIVxyXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvYmxvYi9tYXN0ZXIvc3JjL2ludGVybmFsL29ic2VydmFibGUvZG9tL1dlYlNvY2tldFN1YmplY3QudHMjTDM0MFxyXG4gICAgICAgIC8vIFJ4SlMgc29ja2V0IGVtaXRzIGBvbkNvbXBsZXRlYCBldmVudCBvbmx5IGlmIGBldmVudC53YXNDbGVhbmAgaXMgdHJ1dGh5XHJcbiAgICAgICAgLy8gYW5kIGRvZXNuJ3QgY29tcGxldGUgc29ja2V0IHN1YmplY3QgaWYgaXQncyBmYWxzeVxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb3Blbk9ic2VydmVyOiB7XHJcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldENvbm5lY3RlZCgpKVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgdHlwZUtleSA9IHRoaXMub3B0aW9ucy50eXBlS2V5ITtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZSxcclxuICAgIHByaXZhdGUgYWN0aW9ucyQ6IEFjdGlvbnMsXHJcbiAgICBASW5qZWN0KE5HWFNfV0VCU09DS0VUX09QVElPTlMpIHByaXZhdGUgb3B0aW9uczogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnNcclxuICApIHtcclxuICAgIHRoaXMuc2V0dXBBY3Rpb25zTGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwQWN0aW9uc0xpc3RlbmVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aW9ucyQucGlwZShvZkFjdGlvbkRpc3BhdGNoZWQoQ29ubmVjdFdlYlNvY2tldCkpLnN1YnNjcmliZSgoeyBwYXlsb2FkIH0pID0+IHtcclxuICAgICAgdGhpcy5jb25uZWN0KHBheWxvYWQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChEaXNjb25uZWN0V2ViU29ja2V0KSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKFNlbmRXZWJTb2NrZXRNZXNzYWdlKSkuc3Vic2NyaWJlKCh7IHBheWxvYWQgfSkgPT4ge1xyXG4gICAgICB0aGlzLnNlbmQocGF5bG9hZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29ubmVjdChvcHRpb25zPzogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnMpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQ29ubmVjdGlvbigpO1xyXG5cclxuICAgIC8vIFVzZXJzIGNhbiBwYXNzIHRoZSBvcHRpb25zIGluIHRoZSBjb25uZWN0IG1ldGhvZCBzb1xyXG4gICAgLy8gaWYgb3B0aW9ucyBhcmVuJ3QgYXZhaWxhYmxlIGF0IERJIGJvb3RzdHJhcCB0aGV5IGhhdmUgYWNjZXNzXHJcbiAgICAvLyB0byBwYXNzIHRoZW0gaGVyZVxyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5tZXJnZUNvbmZpZ1dpdGhPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldFN1YmplY3QodGhpcy5jb25maWcpO1xyXG5cclxuICAgIHRoaXMuc29ja2V0LnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB0eXBlID0gZ2V0VmFsdWUobWVzc2FnZSwgdGhpcy50eXBlS2V5KTtcclxuICAgICAgICBpZiAoIXR5cGUpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBUeXBlS2V5UHJvcGVydHlNaXNzaW5nRXJyb3IodGhpcy50eXBlS2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh7IC4uLm1lc3NhZ2UsIHR5cGUgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENsb3NlRXZlbnQpIHtcclxuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hXZWJTb2NrZXREaXNjb25uZWN0ZWQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2Vic29ja2V0TWVzc2FnZUVycm9yKGVycm9yKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzY29ubmVjdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNvY2tldCkge1xyXG4gICAgICAvLyBgc29ja2V0LmNvbXBsZXRlKClgIGNsb3NlcyB0aGUgY29ubmVjdGlvblxyXG4gICAgICAvLyBhbHNvIGl0IGRvZXNuJ3QgaW52b2tlIHRoZSBgb25Db21wbGV0ZWAgY2FsbGJhY2sgdGhhdCB3ZSBwYXNzZWRcclxuICAgICAgLy8gaW50byBgc29ja2V0LnN1YnNjcmliZSguLi4pYFxyXG4gICAgICB0aGlzLnNvY2tldC5jb21wbGV0ZSgpO1xyXG4gICAgICB0aGlzLnNvY2tldCA9IG51bGw7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hXZWJTb2NrZXREaXNjb25uZWN0ZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VuZChkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zb2NrZXQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBjb25uZWN0IHRvIHRoZSBzb2NrZXQgYmVmb3JlIHNlbmRpbmcgYW55IGRhdGEnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNvY2tldC5uZXh0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG9uJ3QgZW5sYXJnZSB0aGUgYGNvbm5lY3RgIG1ldGhvZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWVyZ2VDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zOiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLnVybCA9IG9wdGlvbnMudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zLnNlcmlhbGl6ZXIpIHtcclxuICAgICAgdGhpcy5jb25maWcuc2VyaWFsaXplciA9IG9wdGlvbnMuc2VyaWFsaXplcjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9ucy5kZXNlcmlhbGl6ZXIpIHtcclxuICAgICAgdGhpcy5jb25maWcuZGVzZXJpYWxpemVyID0gb3B0aW9ucy5kZXNlcmlhbGl6ZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUbyBlbnN1cmUgd2UgZG9uJ3QgaGF2ZSBhbnkgbWVtb3J5IGxlYWtzXHJcbiAgICogZS5nLiBpZiB0aGUgdXNlciBvY2Nhc2lvbmFsbHkgZGlzcGF0Y2hlZCBgQ29ubmVjdFdlYlNvY2tldGAgdHdpY2VcclxuICAgKiB0aGVuIHRoZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gd2lsbCBzdGlsbCBsaXZlIGluIHRoZSBtZW1vcnlcclxuICAgKiB0byBwcmV2ZW50IHN1Y2ggYmVoYXZpb3IgLSB3ZSBjbG9zZSB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBpZiBpdCBleGlzdHNcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUNvbm5lY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcclxuICAgICAgdGhpcy5zb2NrZXQuY29tcGxldGUoKTtcclxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xyXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgaW4gbWFueSBwbGFjZXMgc28gaXQncyBiZXR0ZXIgdG8gbW92ZSB0aGUgY29kZSBpbnRvIGZ1bmN0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkaXNwYXRjaFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpKTtcclxuICB9XHJcbn1cclxuIl19
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy93ZWJzb2NrZXQtcGx1Z2luLyIsInNvdXJjZXMiOlsic3JjL3dlYnNvY2tldC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQTBCLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUV0QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQiwwQkFBMEIsRUFDMUIsa0JBQWtCLEVBQ25CLE1BQU0sV0FBVyxDQUFDO0FBR25CLE1BQU0sT0FBTyxnQkFBZ0I7Ozs7OztJQTRCM0IsWUFDVSxLQUFZLEVBQ1osUUFBaUIsRUFDZSxPQUFtQztRQUZuRSxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNlLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBOUJyRSxXQUFNLEdBQWlDLElBQUksQ0FBQztRQUU1QyxXQUFNLEdBQWdDO1lBQzVDLEdBQUcsRUFBRSxtQkFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBQztZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFROztZQUUvQixVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQ25DLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbkMsWUFBWSxFQUFFLElBQUksQ0FB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NkI7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7Ozs7SUFFTyxlQUFlO1FBQ3JCLDRDQUE0QztRQUM1QyxrRUFBa0U7UUFDbEUsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQjtJQUNILENBQUM7OztZQXhKRixVQUFVOzs7O1lBbEJPLEtBQUs7WUFBZCxPQUFPOzRDQWtEWCxNQUFNLFNBQUMsc0JBQXNCOzs7Ozs7O0lBOUJoQyxrQ0FBb0Q7Ozs7O0lBRXBELGtDQW1CRTs7Ozs7SUFFRixtQ0FBd0M7Ozs7O0lBRXhDLHdDQUEwQzs7Ozs7SUFHeEMsaUNBQW9COzs7OztJQUNwQixvQ0FBeUI7Ozs7O0lBQ3pCLG1DQUEyRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGlvbnMsIFN0b3JlLCBnZXRWYWx1ZSwgb2ZBY3Rpb25EaXNwYXRjaGVkIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFdlYlNvY2tldFN1YmplY3QsIFdlYlNvY2tldFN1YmplY3RDb25maWcgfSBmcm9tICdyeGpzL3dlYlNvY2tldCc7XHJcblxyXG5pbXBvcnQge1xyXG4gIENvbm5lY3RXZWJTb2NrZXQsXHJcbiAgRGlzY29ubmVjdFdlYlNvY2tldCxcclxuICBTZW5kV2ViU29ja2V0TWVzc2FnZSxcclxuICBOR1hTX1dFQlNPQ0tFVF9PUFRJT05TLFxyXG4gIE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zLFxyXG4gIFdlYnNvY2tldE1lc3NhZ2VFcnJvcixcclxuICBXZWJTb2NrZXREaXNjb25uZWN0ZWQsXHJcbiAgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yLFxyXG4gIFdlYlNvY2tldENvbm5lY3Rpb25VcGRhdGVkLFxyXG4gIFdlYlNvY2tldENvbm5lY3RlZFxyXG59IGZyb20gJy4vc3ltYm9scyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRIYW5kbGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHNvY2tldDogV2ViU29ja2V0U3ViamVjdDxhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgY29uZmlnOiBXZWJTb2NrZXRTdWJqZWN0Q29uZmlnPGFueT4gPSB7XHJcbiAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwhLFxyXG4gICAgcHJvdG9jb2w6IHRoaXMub3B0aW9ucy5wcm90b2NvbCxcclxuICAgIC8vIERlZmF1bHQgYmluYXJ5IHR5cGUgaXMgYGJsb2JgIGZvciB0aGUgZ2xvYmFsIGBXZWJTb2NrZXRgXHJcbiAgICBiaW5hcnlUeXBlOiB0aGlzLm9wdGlvbnMuYmluYXJ5VHlwZSxcclxuICAgIHNlcmlhbGl6ZXI6IHRoaXMub3B0aW9ucy5zZXJpYWxpemVyLFxyXG4gICAgZGVzZXJpYWxpemVyOiB0aGlzLm9wdGlvbnMuZGVzZXJpYWxpemVyLFxyXG4gICAgY2xvc2VPYnNlcnZlcjoge1xyXG4gICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgLy8gQVRURU5USU9OIVxyXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvYmxvYi9tYXN0ZXIvc3JjL2ludGVybmFsL29ic2VydmFibGUvZG9tL1dlYlNvY2tldFN1YmplY3QudHMjTDM0MFxyXG4gICAgICAgIC8vIFJ4SlMgc29ja2V0IGVtaXRzIGBvbkNvbXBsZXRlYCBldmVudCBvbmx5IGlmIGBldmVudC53YXNDbGVhbmAgaXMgdHJ1dGh5XHJcbiAgICAgICAgLy8gYW5kIGRvZXNuJ3QgY29tcGxldGUgc29ja2V0IHN1YmplY3QgaWYgaXQncyBmYWxzeVxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb3Blbk9ic2VydmVyOiB7XHJcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldENvbm5lY3RlZCgpKVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgdHlwZUtleSA9IHRoaXMub3B0aW9ucy50eXBlS2V5ITtcclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXHJcbiAgICBwcml2YXRlIGFjdGlvbnMkOiBBY3Rpb25zLFxyXG4gICAgQEluamVjdChOR1hTX1dFQlNPQ0tFVF9PUFRJT05TKSBwcml2YXRlIG9wdGlvbnM6IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNldHVwQWN0aW9uc0xpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBBY3Rpb25zTGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICB0aGlzLmFjdGlvbnMkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKENvbm5lY3RXZWJTb2NrZXQpKS5zdWJzY3JpYmUoKHsgcGF5bG9hZCB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0KHBheWxvYWQpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXHJcbiAgICAgIHRoaXMuYWN0aW9ucyQucGlwZShvZkFjdGlvbkRpc3BhdGNoZWQoRGlzY29ubmVjdFdlYlNvY2tldCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgdGhpcy5hY3Rpb25zJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChTZW5kV2ViU29ja2V0TWVzc2FnZSkpLnN1YnNjcmliZSgoeyBwYXlsb2FkIH0pID0+IHtcclxuICAgICAgICB0aGlzLnNlbmQocGF5bG9hZCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25uZWN0KG9wdGlvbnM/OiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVDb25uZWN0aW9uKCk7XHJcblxyXG4gICAgLy8gVXNlcnMgY2FuIHBhc3MgdGhlIG9wdGlvbnMgaW4gdGhlIGNvbm5lY3QgbWV0aG9kIHNvXHJcbiAgICAvLyBpZiBvcHRpb25zIGFyZW4ndCBhdmFpbGFibGUgYXQgREkgYm9vdHN0cmFwIHRoZXkgaGF2ZSBhY2Nlc3NcclxuICAgIC8vIHRvIHBhc3MgdGhlbSBoZXJlXHJcbiAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICB0aGlzLm1lcmdlQ29uZmlnV2l0aE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0U3ViamVjdCh0aGlzLmNvbmZpZyk7XHJcblxyXG4gICAgdGhpcy5zb2NrZXQuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRWYWx1ZShtZXNzYWdlLCB0aGlzLnR5cGVLZXkpO1xyXG4gICAgICAgIGlmICghdHlwZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVLZXlQcm9wZXJ0eU1pc3NpbmdFcnJvcih0aGlzLnR5cGVLZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHsgLi4ubWVzc2FnZSwgdHlwZSB9KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2xvc2VFdmVudCkge1xyXG4gICAgICAgICAgdGhpcy5kaXNwYXRjaFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJzb2NrZXRNZXNzYWdlRXJyb3IoZXJyb3IpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hXZWJTb2NrZXREaXNjb25uZWN0ZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VuZChkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zb2NrZXQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBjb25uZWN0IHRvIHRoZSBzb2NrZXQgYmVmb3JlIHNlbmRpbmcgYW55IGRhdGEnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNvY2tldC5uZXh0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG9uJ3QgZW5sYXJnZSB0aGUgYGNvbm5lY3RgIG1ldGhvZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWVyZ2VDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zOiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLnVybCA9IG9wdGlvbnMudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zLnNlcmlhbGl6ZXIpIHtcclxuICAgICAgdGhpcy5jb25maWcuc2VyaWFsaXplciA9IG9wdGlvbnMuc2VyaWFsaXplcjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9ucy5kZXNlcmlhbGl6ZXIpIHtcclxuICAgICAgdGhpcy5jb25maWcuZGVzZXJpYWxpemVyID0gb3B0aW9ucy5kZXNlcmlhbGl6ZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUbyBlbnN1cmUgd2UgZG9uJ3QgaGF2ZSBhbnkgbWVtb3J5IGxlYWtzXHJcbiAgICogZS5nLiBpZiB0aGUgdXNlciBvY2Nhc2lvbmFsbHkgZGlzcGF0Y2hlZCBgQ29ubmVjdFdlYlNvY2tldGAgdHdpY2VcclxuICAgKiB0aGVuIHRoZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gd2lsbCBzdGlsbCBsaXZlIGluIHRoZSBtZW1vcnlcclxuICAgKiB0byBwcmV2ZW50IHN1Y2ggYmVoYXZpb3IgLSB3ZSBjbG9zZSB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBpZiBpdCBleGlzdHNcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUNvbm5lY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcclxuICAgICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcclxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIGluIG1hbnkgcGxhY2VzIHNvIGl0J3MgYmV0dGVyIHRvIG1vdmUgdGhlIGNvZGUgaW50byBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzcGF0Y2hXZWJTb2NrZXREaXNjb25uZWN0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXREaXNjb25uZWN0ZWQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlQ29ubmVjdGlvbigpOiB2b2lkIHtcclxuICAgIC8vIGBzb2NrZXQuY29tcGxldGUoKWAgY2xvc2VzIHRoZSBjb25uZWN0aW9uXHJcbiAgICAvLyBhbHNvIGl0IGRvZXNuJ3QgaW52b2tlIHRoZSBgb25Db21wbGV0ZWAgY2FsbGJhY2sgdGhhdCB3ZSBwYXNzZWRcclxuICAgIC8vIGludG8gYHNvY2tldC5zdWJzY3JpYmUoLi4uKWBcclxuICAgIGlmICh0aGlzLnNvY2tldCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNvY2tldC5jb21wbGV0ZSgpO1xyXG4gICAgICB0aGlzLnNvY2tldCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import * as tslib_1 from "tslib";
|
|
6
6
|
import { Injectable, Inject } from '@angular/core';
|
|
7
7
|
import { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';
|
|
8
|
+
import { Subscription } from 'rxjs';
|
|
8
9
|
import { WebSocketSubject } from 'rxjs/webSocket';
|
|
9
10
|
import { ConnectWebSocket, DisconnectWebSocket, SendWebSocketMessage, NGXS_WEBSOCKET_OPTIONS, WebsocketMessageError, WebSocketDisconnected, TypeKeyPropertyMissingError, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
|
|
10
11
|
var WebSocketHandler = /** @class */ (function () {
|
|
@@ -41,8 +42,19 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
41
42
|
}
|
|
42
43
|
};
|
|
43
44
|
this.typeKey = (/** @type {?} */ (this.options.typeKey));
|
|
45
|
+
this.subscription = new Subscription();
|
|
44
46
|
this.setupActionsListeners();
|
|
45
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* @return {?}
|
|
50
|
+
*/
|
|
51
|
+
WebSocketHandler.prototype.ngOnDestroy = /**
|
|
52
|
+
* @return {?}
|
|
53
|
+
*/
|
|
54
|
+
function () {
|
|
55
|
+
this.closeConnection();
|
|
56
|
+
this.subscription.unsubscribe();
|
|
57
|
+
};
|
|
46
58
|
/**
|
|
47
59
|
* @private
|
|
48
60
|
* @return {?}
|
|
@@ -53,28 +65,28 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
53
65
|
*/
|
|
54
66
|
function () {
|
|
55
67
|
var _this = this;
|
|
56
|
-
this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
|
|
68
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
|
|
57
69
|
* @param {?} __0
|
|
58
70
|
* @return {?}
|
|
59
71
|
*/
|
|
60
72
|
function (_a) {
|
|
61
73
|
var payload = _a.payload;
|
|
62
74
|
_this.connect(payload);
|
|
63
|
-
}));
|
|
64
|
-
this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
|
|
75
|
+
})));
|
|
76
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
|
|
65
77
|
* @return {?}
|
|
66
78
|
*/
|
|
67
79
|
function () {
|
|
68
80
|
_this.disconnect();
|
|
69
|
-
}));
|
|
70
|
-
this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
|
|
81
|
+
})));
|
|
82
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
|
|
71
83
|
* @param {?} __0
|
|
72
84
|
* @return {?}
|
|
73
85
|
*/
|
|
74
86
|
function (_a) {
|
|
75
87
|
var payload = _a.payload;
|
|
76
88
|
_this.send(payload);
|
|
77
|
-
}));
|
|
89
|
+
})));
|
|
78
90
|
};
|
|
79
91
|
/**
|
|
80
92
|
* @private
|
|
@@ -133,11 +145,7 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
133
145
|
*/
|
|
134
146
|
function () {
|
|
135
147
|
if (this.socket) {
|
|
136
|
-
|
|
137
|
-
// also it doesn't invoke the `onComplete` callback that we passed
|
|
138
|
-
// into `socket.subscribe(...)`
|
|
139
|
-
this.socket.complete();
|
|
140
|
-
this.socket = null;
|
|
148
|
+
this.closeConnection();
|
|
141
149
|
this.dispatchWebSocketDisconnected();
|
|
142
150
|
}
|
|
143
151
|
};
|
|
@@ -207,8 +215,7 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
207
215
|
*/
|
|
208
216
|
function () {
|
|
209
217
|
if (this.socket) {
|
|
210
|
-
this.
|
|
211
|
-
this.socket = null;
|
|
218
|
+
this.closeConnection();
|
|
212
219
|
this.store.dispatch(new WebSocketConnectionUpdated());
|
|
213
220
|
}
|
|
214
221
|
};
|
|
@@ -228,6 +235,23 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
228
235
|
function () {
|
|
229
236
|
this.store.dispatch(new WebSocketDisconnected());
|
|
230
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
|
+
};
|
|
231
255
|
WebSocketHandler.decorators = [
|
|
232
256
|
{ type: Injectable }
|
|
233
257
|
];
|
|
@@ -256,6 +280,11 @@ if (false) {
|
|
|
256
280
|
* @private
|
|
257
281
|
*/
|
|
258
282
|
WebSocketHandler.prototype.typeKey;
|
|
283
|
+
/**
|
|
284
|
+
* @type {?}
|
|
285
|
+
* @private
|
|
286
|
+
*/
|
|
287
|
+
WebSocketHandler.prototype.subscription;
|
|
259
288
|
/**
|
|
260
289
|
* @type {?}
|
|
261
290
|
* @private
|
|
@@ -272,4 +301,4 @@ if (false) {
|
|
|
272
301
|
*/
|
|
273
302
|
WebSocketHandler.prototype.options;
|
|
274
303
|
}
|
|
275
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy93ZWJzb2NrZXQtcGx1Z2luLyIsInNvdXJjZXMiOlsic3JjL3dlYnNvY2tldC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBRXRCLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQixrQkFBa0IsRUFDbkIsTUFBTSxXQUFXLENBQUM7QUFFbkI7SUEyQkUsMEJBQ1UsS0FBWSxFQUNaLFFBQWlCLEVBQ2UsT0FBbUM7UUFIN0UsaUJBTUM7UUFMUyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNlLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBNUJyRSxXQUFNLEdBQWlDLElBQUksQ0FBQztRQUU1QyxXQUFNLEdBQWdDO1lBQzVDLEdBQUcsRUFBRSxtQkFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBQztZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFROztZQUUvQixVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQ25DLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbkMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWTtZQUN2QyxhQUFhLEVBQUU7Z0JBQ2IsSUFBSTs7O2dCQUFF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QUFDOztnQkF0SUYsVUFBVTs7OztnQkFqQk8sS0FBSztnQkFBZCxPQUFPO2dEQStDWCxNQUFNLFNBQUMsc0JBQXNCOztJQXlHbEMsdUJBQUM7Q0FBQSxBQXZJRCxJQXVJQztTQXRJWSxnQkFBZ0I7Ozs7OztJQUMzQixrQ0FBb0Q7Ozs7O0lBRXBELGtDQW1CRTs7Ozs7SUFFRixtQ0FBd0M7Ozs7O0lBR3RDLGlDQUFvQjs7Ozs7SUFDcEIsb0NBQXlCOzs7OztJQUN6QixtQ0FBMkUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aW9ucywgU3RvcmUsIGdldFZhbHVlLCBvZkFjdGlvbkRpc3BhdGNoZWQgfSBmcm9tICdAbmd4cy9zdG9yZSc7XHJcblxyXG5pbXBvcnQgeyBXZWJTb2NrZXRTdWJqZWN0LCBXZWJTb2NrZXRTdWJqZWN0Q29uZmlnIH0gZnJvbSAncnhqcy93ZWJTb2NrZXQnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb25uZWN0V2ViU29ja2V0LFxyXG4gIERpc2Nvbm5lY3RXZWJTb2NrZXQsXHJcbiAgU2VuZFdlYlNvY2tldE1lc3NhZ2UsXHJcbiAgTkdYU19XRUJTT0NLRVRfT1BUSU9OUyxcclxuICBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyxcclxuICBXZWJzb2NrZXRNZXNzYWdlRXJyb3IsXHJcbiAgV2ViU29ja2V0RGlzY29ubmVjdGVkLFxyXG4gIFR5cGVLZXlQcm9wZXJ0eU1pc3NpbmdFcnJvcixcclxuICBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCxcclxuICBXZWJTb2NrZXRDb25uZWN0ZWRcclxufSBmcm9tICcuL3N5bWJvbHMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0SGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldFN1YmplY3Q8YW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGNvbmZpZzogV2ViU29ja2V0U3ViamVjdENvbmZpZzxhbnk+ID0ge1xyXG4gICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsISxcclxuICAgIHByb3RvY29sOiB0aGlzLm9wdGlvbnMucHJvdG9jb2wsXHJcbiAgICAvLyBEZWZhdWx0IGJpbmFyeSB0eXBlIGlzIGBibG9iYCBmb3IgdGhlIGdsb2JhbCBgV2ViU29ja2V0YFxyXG4gICAgYmluYXJ5VHlwZTogdGhpcy5vcHRpb25zLmJpbmFyeVR5cGUsXHJcbiAgICBzZXJpYWxpemVyOiB0aGlzLm9wdGlvbnMuc2VyaWFsaXplcixcclxuICAgIGRlc2VyaWFsaXplcjogdGhpcy5vcHRpb25zLmRlc2VyaWFsaXplcixcclxuICAgIGNsb3NlT2JzZXJ2ZXI6IHtcclxuICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgIC8vIEFUVEVOVElPTiFcclxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL2Jsb2IvbWFzdGVyL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmxlL2RvbS9XZWJTb2NrZXRTdWJqZWN0LnRzI0wzNDBcclxuICAgICAgICAvLyBSeEpTIHNvY2tldCBlbWl0cyBgb25Db21wbGV0ZWAgZXZlbnQgb25seSBpZiBgZXZlbnQud2FzQ2xlYW5gIGlzIHRydXRoeVxyXG4gICAgICAgIC8vIGFuZCBkb2Vzbid0IGNvbXBsZXRlIHNvY2tldCBzdWJqZWN0IGlmIGl0J3MgZmFsc3lcclxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9wZW5PYnNlcnZlcjoge1xyXG4gICAgICBuZXh0OiAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXRDb25uZWN0ZWQoKSlcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwcml2YXRlIHR5cGVLZXkgPSB0aGlzLm9wdGlvbnMudHlwZUtleSE7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXHJcbiAgICBwcml2YXRlIGFjdGlvbnMkOiBBY3Rpb25zLFxyXG4gICAgQEluamVjdChOR1hTX1dFQlNPQ0tFVF9PUFRJT05TKSBwcml2YXRlIG9wdGlvbnM6IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNldHVwQWN0aW9uc0xpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEFjdGlvbnNMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKENvbm5lY3RXZWJTb2NrZXQpKS5zdWJzY3JpYmUoKHsgcGF5bG9hZCB9KSA9PiB7XHJcbiAgICAgIHRoaXMuY29ubmVjdChwYXlsb2FkKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWN0aW9ucyQucGlwZShvZkFjdGlvbkRpc3BhdGNoZWQoRGlzY29ubmVjdFdlYlNvY2tldCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChTZW5kV2ViU29ja2V0TWVzc2FnZSkpLnN1YnNjcmliZSgoeyBwYXlsb2FkIH0pID0+IHtcclxuICAgICAgdGhpcy5zZW5kKHBheWxvYWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbm5lY3Qob3B0aW9ucz86IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcclxuXHJcbiAgICAvLyBVc2VycyBjYW4gcGFzcyB0aGUgb3B0aW9ucyBpbiB0aGUgY29ubmVjdCBtZXRob2Qgc29cclxuICAgIC8vIGlmIG9wdGlvbnMgYXJlbid0IGF2YWlsYWJsZSBhdCBESSBib290c3RyYXAgdGhleSBoYXZlIGFjY2Vzc1xyXG4gICAgLy8gdG8gcGFzcyB0aGVtIGhlcmVcclxuICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgIHRoaXMubWVyZ2VDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXRTdWJqZWN0KHRoaXMuY29uZmlnKTtcclxuXHJcbiAgICB0aGlzLnNvY2tldC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFZhbHVlKG1lc3NhZ2UsIHRoaXMudHlwZUtleSk7XHJcbiAgICAgICAgaWYgKCF0eXBlKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yKHRoaXMudHlwZUtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goeyAuLi5tZXNzYWdlLCB0eXBlIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDbG9zZUV2ZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYnNvY2tldE1lc3NhZ2VFcnJvcihlcnJvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcclxuICAgICAgLy8gYHNvY2tldC5jb21wbGV0ZSgpYCBjbG9zZXMgdGhlIGNvbm5lY3Rpb25cclxuICAgICAgLy8gYWxzbyBpdCBkb2Vzbid0IGludm9rZSB0aGUgYG9uQ29tcGxldGVgIGNhbGxiYWNrIHRoYXQgd2UgcGFzc2VkXHJcbiAgICAgIC8vIGludG8gYHNvY2tldC5zdWJzY3JpYmUoLi4uKWBcclxuICAgICAgdGhpcy5zb2NrZXQuY29tcGxldGUoKTtcclxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmQoZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc29ja2V0KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgY29ubmVjdCB0byB0aGUgc29ja2V0IGJlZm9yZSBzZW5kaW5nIGFueSBkYXRhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zb2NrZXQubmV4dChkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvbid0IGVubGFyZ2UgdGhlIGBjb25uZWN0YCBtZXRob2RcclxuICAgKi9cclxuICBwcml2YXRlIG1lcmdlQ29uZmlnV2l0aE9wdGlvbnMob3B0aW9uczogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnMpOiB2b2lkIHtcclxuICAgIGlmIChvcHRpb25zLnVybCkge1xyXG4gICAgICB0aGlzLmNvbmZpZy51cmwgPSBvcHRpb25zLnVybDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9ucy5zZXJpYWxpemVyKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLnNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZGVzZXJpYWxpemVyKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLmRlc2VyaWFsaXplciA9IG9wdGlvbnMuZGVzZXJpYWxpemVyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG8gZW5zdXJlIHdlIGRvbid0IGhhdmUgYW55IG1lbW9yeSBsZWFrc1xyXG4gICAqIGUuZy4gaWYgdGhlIHVzZXIgb2NjYXNpb25hbGx5IGRpc3BhdGNoZWQgYENvbm5lY3RXZWJTb2NrZXRgIHR3aWNlXHJcbiAgICogdGhlbiB0aGUgcHJldmlvdXMgc3Vic2NyaXB0aW9uIHdpbGwgc3RpbGwgbGl2ZSBpbiB0aGUgbWVtb3J5XHJcbiAgICogdG8gcHJldmVudCBzdWNoIGJlaGF2aW9yIC0gd2UgY2xvc2UgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24gaWYgaXQgZXhpc3RzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XHJcbiAgICAgIHRoaXMuc29ja2V0LmNvbXBsZXRlKCk7XHJcbiAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcclxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIGluIG1hbnkgcGxhY2VzIHNvIGl0J3MgYmV0dGVyIHRvIG1vdmUgdGhlIGNvZGUgaW50byBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzcGF0Y2hXZWJTb2NrZXREaXNjb25uZWN0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXREaXNjb25uZWN0ZWQoKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy93ZWJzb2NrZXQtcGx1Z2luLyIsInNvdXJjZXMiOlsic3JjL3dlYnNvY2tldC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLGdCQUFnQixFQUEwQixNQUFNLGdCQUFnQixDQUFDO0FBRTFFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsRUFFdEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLGtCQUFrQixFQUNuQixNQUFNLFdBQVcsQ0FBQztBQUVuQjtJQTZCRSwwQkFDVSxLQUFZLEVBQ1osUUFBaUIsRUFDZSxPQUFtQztRQUg3RSxpQkFNQztRQUxTLFVBQUssR0FBTCxLQUFLLENBQU87UUFDWixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2UsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUE5QnJFLFdBQU0sR0FBaUMsSUFBSSxDQUFDO1FBRTVDLFdBQU0sR0FBZ0M7WUFDNUMsR0FBRyxFQUFFLG1CQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDO1lBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7O1lBRS9CLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbkMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUNuQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FB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UUFBUSxDQUFDLElBQUksMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSyx3REFBNkI7Ozs7O0lBQXJDO1FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7Ozs7SUFFTywwQ0FBZTs7OztJQUF2QjtRQUNFLDRDQUE0QztRQUM1QyxrRUFBa0U7UUFDbEUsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQjtJQUNILENBQUM7O2dCQXhKRixVQUFVOzs7O2dCQWxCTyxLQUFLO2dCQUFkLE9BQU87Z0RBa0RYLE1BQU0sU0FBQyxzQkFBc0I7O0lBeUhsQyx1QkFBQztDQUFBLEFBekpELElBeUpDO1NBeEpZLGdCQUFnQjs7Ozs7O0lBQzNCLGtDQUFvRDs7Ozs7SUFFcEQsa0NBbUJFOzs7OztJQUVGLG1DQUF3Qzs7Ozs7SUFFeEMsd0NBQTBDOzs7OztJQUd4QyxpQ0FBb0I7Ozs7O0lBQ3BCLG9DQUF5Qjs7Ozs7SUFDekIsbUNBQTJFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aW9ucywgU3RvcmUsIGdldFZhbHVlLCBvZkFjdGlvbkRpc3BhdGNoZWQgfSBmcm9tICdAbmd4cy9zdG9yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgV2ViU29ja2V0U3ViamVjdCwgV2ViU29ja2V0U3ViamVjdENvbmZpZyB9IGZyb20gJ3J4anMvd2ViU29ja2V0JztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ29ubmVjdFdlYlNvY2tldCxcclxuICBEaXNjb25uZWN0V2ViU29ja2V0LFxyXG4gIFNlbmRXZWJTb2NrZXRNZXNzYWdlLFxyXG4gIE5HWFNfV0VCU09DS0VUX09QVElPTlMsXHJcbiAgTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnMsXHJcbiAgV2Vic29ja2V0TWVzc2FnZUVycm9yLFxyXG4gIFdlYlNvY2tldERpc2Nvbm5lY3RlZCxcclxuICBUeXBlS2V5UHJvcGVydHlNaXNzaW5nRXJyb3IsXHJcbiAgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQsXHJcbiAgV2ViU29ja2V0Q29ubmVjdGVkXHJcbn0gZnJvbSAnLi9zeW1ib2xzJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldEhhbmRsZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgc29ja2V0OiBXZWJTb2NrZXRTdWJqZWN0PGFueT4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBjb25maWc6IFdlYlNvY2tldFN1YmplY3RDb25maWc8YW55PiA9IHtcclxuICAgIHVybDogdGhpcy5vcHRpb25zLnVybCEsXHJcbiAgICBwcm90b2NvbDogdGhpcy5vcHRpb25zLnByb3RvY29sLFxyXG4gICAgLy8gRGVmYXVsdCBiaW5hcnkgdHlwZSBpcyBgYmxvYmAgZm9yIHRoZSBnbG9iYWwgYFdlYlNvY2tldGBcclxuICAgIGJpbmFyeVR5cGU6IHRoaXMub3B0aW9ucy5iaW5hcnlUeXBlLFxyXG4gICAgc2VyaWFsaXplcjogdGhpcy5vcHRpb25zLnNlcmlhbGl6ZXIsXHJcbiAgICBkZXNlcmlhbGl6ZXI6IHRoaXMub3B0aW9ucy5kZXNlcmlhbGl6ZXIsXHJcbiAgICBjbG9zZU9ic2VydmVyOiB7XHJcbiAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAvLyBBVFRFTlRJT04hXHJcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdGl2ZVgvcnhqcy9ibG9iL21hc3Rlci9zcmMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kb20vV2ViU29ja2V0U3ViamVjdC50cyNMMzQwXHJcbiAgICAgICAgLy8gUnhKUyBzb2NrZXQgZW1pdHMgYG9uQ29tcGxldGVgIGV2ZW50IG9ubHkgaWYgYGV2ZW50Lndhc0NsZWFuYCBpcyB0cnV0aHlcclxuICAgICAgICAvLyBhbmQgZG9lc24ndCBjb21wbGV0ZSBzb2NrZXQgc3ViamVjdCBpZiBpdCdzIGZhbHN5XHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvcGVuT2JzZXJ2ZXI6IHtcclxuICAgICAgbmV4dDogKCkgPT4gdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGVkKCkpXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSB0eXBlS2V5ID0gdGhpcy5vcHRpb25zLnR5cGVLZXkhO1xyXG5cclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZSxcclxuICAgIHByaXZhdGUgYWN0aW9ucyQ6IEFjdGlvbnMsXHJcbiAgICBASW5qZWN0KE5HWFNfV0VCU09DS0VUX09QVElPTlMpIHByaXZhdGUgb3B0aW9uczogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnNcclxuICApIHtcclxuICAgIHRoaXMuc2V0dXBBY3Rpb25zTGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEFjdGlvbnNMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXHJcbiAgICAgIHRoaXMuYWN0aW9ucyQucGlwZShvZkFjdGlvbkRpc3BhdGNoZWQoQ29ubmVjdFdlYlNvY2tldCkpLnN1YnNjcmliZSgoeyBwYXlsb2FkIH0pID0+IHtcclxuICAgICAgICB0aGlzLmNvbm5lY3QocGF5bG9hZCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgdGhpcy5hY3Rpb25zJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChEaXNjb25uZWN0V2ViU29ja2V0KSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICB0aGlzLmFjdGlvbnMkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKFNlbmRXZWJTb2NrZXRNZXNzYWdlKSkuc3Vic2NyaWJlKCh7IHBheWxvYWQgfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2VuZChwYXlsb2FkKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbm5lY3Qob3B0aW9ucz86IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcclxuXHJcbiAgICAvLyBVc2VycyBjYW4gcGFzcyB0aGUgb3B0aW9ucyBpbiB0aGUgY29ubmVjdCBtZXRob2Qgc29cclxuICAgIC8vIGlmIG9wdGlvbnMgYXJlbid0IGF2YWlsYWJsZSBhdCBESSBib290c3RyYXAgdGhleSBoYXZlIGFjY2Vzc1xyXG4gICAgLy8gdG8gcGFzcyB0aGVtIGhlcmVcclxuICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgIHRoaXMubWVyZ2VDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXRTdWJqZWN0KHRoaXMuY29uZmlnKTtcclxuXHJcbiAgICB0aGlzLnNvY2tldC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFZhbHVlKG1lc3NhZ2UsIHRoaXMudHlwZUtleSk7XHJcbiAgICAgICAgaWYgKCF0eXBlKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yKHRoaXMudHlwZUtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goeyAuLi5tZXNzYWdlLCB0eXBlIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDbG9zZUV2ZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYnNvY2tldE1lc3NhZ2VFcnJvcihlcnJvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcclxuICAgICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNvY2tldCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGNvbm5lY3QgdG8gdGhlIHNvY2tldCBiZWZvcmUgc2VuZGluZyBhbnkgZGF0YScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc29ja2V0Lm5leHQoZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEb24ndCBlbmxhcmdlIHRoZSBgY29ubmVjdGAgbWV0aG9kXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1dpdGhPcHRpb25zKG9wdGlvbnM6IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zKTogdm9pZCB7XHJcbiAgICBpZiAob3B0aW9ucy51cmwpIHtcclxuICAgICAgdGhpcy5jb25maWcudXJsID0gb3B0aW9ucy51cmw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuc2VyaWFsaXplcikge1xyXG4gICAgICB0aGlzLmNvbmZpZy5zZXJpYWxpemVyID0gb3B0aW9ucy5zZXJpYWxpemVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zLmRlc2VyaWFsaXplcikge1xyXG4gICAgICB0aGlzLmNvbmZpZy5kZXNlcmlhbGl6ZXIgPSBvcHRpb25zLmRlc2VyaWFsaXplcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvIGVuc3VyZSB3ZSBkb24ndCBoYXZlIGFueSBtZW1vcnkgbGVha3NcclxuICAgKiBlLmcuIGlmIHRoZSB1c2VyIG9jY2FzaW9uYWxseSBkaXNwYXRjaGVkIGBDb25uZWN0V2ViU29ja2V0YCB0d2ljZVxyXG4gICAqIHRoZW4gdGhlIHByZXZpb3VzIHN1YnNjcmlwdGlvbiB3aWxsIHN0aWxsIGxpdmUgaW4gdGhlIG1lbW9yeVxyXG4gICAqIHRvIHByZXZlbnQgc3VjaCBiZWhhdmlvciAtIHdlIGNsb3NlIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGlmIGl0IGV4aXN0c1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlQ29ubmVjdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNvY2tldCkge1xyXG4gICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xyXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgaW4gbWFueSBwbGFjZXMgc28gaXQncyBiZXR0ZXIgdG8gbW92ZSB0aGUgY29kZSBpbnRvIGZ1bmN0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkaXNwYXRjaFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gYHNvY2tldC5jb21wbGV0ZSgpYCBjbG9zZXMgdGhlIGNvbm5lY3Rpb25cclxuICAgIC8vIGFsc28gaXQgZG9lc24ndCBpbnZva2UgdGhlIGBvbkNvbXBsZXRlYCBjYWxsYmFjayB0aGF0IHdlIHBhc3NlZFxyXG4gICAgLy8gaW50byBgc29ja2V0LnN1YnNjcmliZSguLi4pYFxyXG4gICAgaWYgKHRoaXMuc29ja2V0ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc29ja2V0LmNvbXBsZXRlKCk7XHJcbiAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { InjectionToken, Injectable, Inject, APP_INITIALIZER, NgModule } from '@angular/core';
|
|
2
2
|
import { ofActionDispatched, getValue, Store, Actions } from '@ngxs/store';
|
|
3
|
+
import { Subscription } from 'rxjs';
|
|
3
4
|
import { WebSocketSubject } from 'rxjs/webSocket';
|
|
4
5
|
|
|
5
6
|
/**
|
|
@@ -240,33 +241,41 @@ class WebSocketHandler {
|
|
|
240
241
|
}
|
|
241
242
|
};
|
|
242
243
|
this.typeKey = (/** @type {?} */ (this.options.typeKey));
|
|
244
|
+
this.subscription = new Subscription();
|
|
243
245
|
this.setupActionsListeners();
|
|
244
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* @return {?}
|
|
249
|
+
*/
|
|
250
|
+
ngOnDestroy() {
|
|
251
|
+
this.closeConnection();
|
|
252
|
+
this.subscription.unsubscribe();
|
|
253
|
+
}
|
|
245
254
|
/**
|
|
246
255
|
* @private
|
|
247
256
|
* @return {?}
|
|
248
257
|
*/
|
|
249
258
|
setupActionsListeners() {
|
|
250
|
-
this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
|
|
259
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
|
|
251
260
|
* @param {?} __0
|
|
252
261
|
* @return {?}
|
|
253
262
|
*/
|
|
254
263
|
({ payload }) => {
|
|
255
264
|
this.connect(payload);
|
|
256
|
-
}));
|
|
257
|
-
this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
|
|
265
|
+
})));
|
|
266
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
|
|
258
267
|
* @return {?}
|
|
259
268
|
*/
|
|
260
269
|
() => {
|
|
261
270
|
this.disconnect();
|
|
262
|
-
}));
|
|
263
|
-
this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
|
|
271
|
+
})));
|
|
272
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
|
|
264
273
|
* @param {?} __0
|
|
265
274
|
* @return {?}
|
|
266
275
|
*/
|
|
267
276
|
({ payload }) => {
|
|
268
277
|
this.send(payload);
|
|
269
|
-
}));
|
|
278
|
+
})));
|
|
270
279
|
}
|
|
271
280
|
/**
|
|
272
281
|
* @private
|
|
@@ -315,11 +324,7 @@ class WebSocketHandler {
|
|
|
315
324
|
*/
|
|
316
325
|
disconnect() {
|
|
317
326
|
if (this.socket) {
|
|
318
|
-
|
|
319
|
-
// also it doesn't invoke the `onComplete` callback that we passed
|
|
320
|
-
// into `socket.subscribe(...)`
|
|
321
|
-
this.socket.complete();
|
|
322
|
-
this.socket = null;
|
|
327
|
+
this.closeConnection();
|
|
323
328
|
this.dispatchWebSocketDisconnected();
|
|
324
329
|
}
|
|
325
330
|
}
|
|
@@ -361,8 +366,7 @@ class WebSocketHandler {
|
|
|
361
366
|
*/
|
|
362
367
|
updateConnection() {
|
|
363
368
|
if (this.socket) {
|
|
364
|
-
this.
|
|
365
|
-
this.socket = null;
|
|
369
|
+
this.closeConnection();
|
|
366
370
|
this.store.dispatch(new WebSocketConnectionUpdated());
|
|
367
371
|
}
|
|
368
372
|
}
|
|
@@ -374,6 +378,19 @@ class WebSocketHandler {
|
|
|
374
378
|
dispatchWebSocketDisconnected() {
|
|
375
379
|
this.store.dispatch(new WebSocketDisconnected());
|
|
376
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* @private
|
|
383
|
+
* @return {?}
|
|
384
|
+
*/
|
|
385
|
+
closeConnection() {
|
|
386
|
+
// `socket.complete()` closes the connection
|
|
387
|
+
// also it doesn't invoke the `onComplete` callback that we passed
|
|
388
|
+
// into `socket.subscribe(...)`
|
|
389
|
+
if (this.socket !== null) {
|
|
390
|
+
this.socket.complete();
|
|
391
|
+
this.socket = null;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
377
394
|
}
|
|
378
395
|
WebSocketHandler.decorators = [
|
|
379
396
|
{ type: Injectable }
|
|
@@ -400,6 +417,11 @@ if (false) {
|
|
|
400
417
|
* @private
|
|
401
418
|
*/
|
|
402
419
|
WebSocketHandler.prototype.typeKey;
|
|
420
|
+
/**
|
|
421
|
+
* @type {?}
|
|
422
|
+
* @private
|
|
423
|
+
*/
|
|
424
|
+
WebSocketHandler.prototype.subscription;
|
|
403
425
|
/**
|
|
404
426
|
* @type {?}
|
|
405
427
|
* @private
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxs-websocket-plugin.js","sources":["ng://@ngxs/websocket-plugin/src/symbols.ts","ng://@ngxs/websocket-plugin/src/websocket-handler.ts","ng://@ngxs/websocket-plugin/src/websocket.module.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport const NGXS_WEBSOCKET_OPTIONS = new InjectionToken('NGXS_WEBSOCKET_OPTIONS');\r\n\r\nexport interface NgxsWebsocketPluginOptions {\r\n /**\r\n * URL of the websocket.\r\n */\r\n url?: string;\r\n\r\n /**\r\n * Either a single protocol string or an array of protocol strings.\r\n * These strings are used to indicate sub-protocols, so that a single server\r\n * can implement multiple WebSocket sub-protocols (for example, you might want one server to be able\r\n * to handle different types of interactions depending on the specified protocol).\r\n * If you don't specify a protocol string, an empty string is assumed.\r\n */\r\n protocol?: string | string[];\r\n\r\n /**\r\n * Sets the `binaryType` property of the underlying WebSocket.\r\n */\r\n binaryType?: 'blob' | 'arraybuffer';\r\n\r\n /**\r\n * The property name to distigunish this type for the store.\r\n * Default: 'type'\r\n */\r\n typeKey?: string;\r\n\r\n /**\r\n * Interval to try and reconnect.\r\n * Default: 5000\r\n */\r\n reconnectInterval?: number;\r\n\r\n /**\r\n * Number of reconnect attemps.\r\n * Default: 10\r\n */\r\n reconnectAttempts?: number;\r\n\r\n /**\r\n * Serializer to call before sending messages\r\n * Default: `json.stringify`\r\n */\r\n serializer?: (data: any) => string;\r\n\r\n /**\r\n * Deseralizer before publishing the message.\r\n */\r\n deserializer?: (e: MessageEvent) => any;\r\n}\r\n\r\nexport function noop(..._args: any[]) {\r\n return function() {};\r\n}\r\n\r\n/**\r\n * Action to connect to the websocket. Optionally pass a URL.\r\n */\r\nexport class ConnectWebSocket {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Connect';\r\n }\r\n constructor(public payload?: NgxsWebsocketPluginOptions) {}\r\n}\r\n\r\n/**\r\n * Action triggered when a error ocurrs\r\n */\r\nexport class WebsocketMessageError {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Message Error';\r\n }\r\n constructor(public payload: any) {}\r\n}\r\n\r\n/**\r\n * Action to disconnect the websocket.\r\n */\r\nexport class DisconnectWebSocket {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Disconnect';\r\n }\r\n}\r\n\r\n/**\r\n * Action triggered when websocket is connected\r\n */\r\nexport class WebSocketConnected {\r\n static get type() {\r\n return '[WebSocket] Connected';\r\n }\r\n}\r\n\r\n/**\r\n * Action triggered when websocket is disconnected\r\n */\r\nexport class WebSocketDisconnected {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Disconnected';\r\n }\r\n}\r\n\r\n/**\r\n * Action to send to the server.\r\n */\r\nexport class SendWebSocketMessage {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Send Message';\r\n }\r\n constructor(public payload: any) {}\r\n}\r\n\r\n/**\r\n * Action dispatched when the user tries to connect if the connection already exists.\r\n */\r\nexport class WebSocketConnectionUpdated {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Connection Updated';\r\n }\r\n}\r\n\r\n/**\r\n * This error is thrown where there is no `type` (or custom `typeKey`) property\r\n * on the message that came from the server side socket\r\n */\r\nexport class TypeKeyPropertyMissingError extends Error {\r\n constructor(typeKey: string) {\r\n super(`Property ${typeKey} is missing on the socket message`);\r\n }\r\n}\r\n","import { Injectable, Inject } from '@angular/core';\r\nimport { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';\r\n\r\nimport { WebSocketSubject, WebSocketSubjectConfig } from 'rxjs/webSocket';\r\n\r\nimport {\r\n ConnectWebSocket,\r\n DisconnectWebSocket,\r\n SendWebSocketMessage,\r\n NGXS_WEBSOCKET_OPTIONS,\r\n NgxsWebsocketPluginOptions,\r\n WebsocketMessageError,\r\n WebSocketDisconnected,\r\n TypeKeyPropertyMissingError,\r\n WebSocketConnectionUpdated,\r\n WebSocketConnected\r\n} from './symbols';\r\n\r\n@Injectable()\r\nexport class WebSocketHandler {\r\n private socket: WebSocketSubject<any> | null = null;\r\n\r\n private config: WebSocketSubjectConfig<any> = {\r\n url: this.options.url!,\r\n protocol: this.options.protocol,\r\n // Default binary type is `blob` for the global `WebSocket`\r\n binaryType: this.options.binaryType,\r\n serializer: this.options.serializer,\r\n deserializer: this.options.deserializer,\r\n closeObserver: {\r\n next: () => {\r\n // ATTENTION!\r\n // See https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L340\r\n // RxJS socket emits `onComplete` event only if `event.wasClean` is truthy\r\n // and doesn't complete socket subject if it's falsy\r\n this.disconnect();\r\n }\r\n },\r\n openObserver: {\r\n next: () => this.store.dispatch(new WebSocketConnected())\r\n }\r\n };\r\n\r\n private typeKey = this.options.typeKey!;\r\n\r\n constructor(\r\n private store: Store,\r\n private actions$: Actions,\r\n @Inject(NGXS_WEBSOCKET_OPTIONS) private options: NgxsWebsocketPluginOptions\r\n ) {\r\n this.setupActionsListeners();\r\n }\r\n\r\n private setupActionsListeners(): void {\r\n this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe(({ payload }) => {\r\n this.connect(payload);\r\n });\r\n\r\n this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe(() => {\r\n this.disconnect();\r\n });\r\n\r\n this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe(({ payload }) => {\r\n this.send(payload);\r\n });\r\n }\r\n\r\n private connect(options?: NgxsWebsocketPluginOptions): void {\r\n this.updateConnection();\r\n\r\n // Users can pass the options in the connect method so\r\n // if options aren't available at DI bootstrap they have access\r\n // to pass them here\r\n if (options) {\r\n this.mergeConfigWithOptions(options);\r\n }\r\n\r\n this.socket = new WebSocketSubject(this.config);\r\n\r\n this.socket.subscribe({\r\n next: (message: any) => {\r\n const type = getValue(message, this.typeKey);\r\n if (!type) {\r\n throw new TypeKeyPropertyMissingError(this.typeKey);\r\n }\r\n this.store.dispatch({ ...message, type });\r\n },\r\n error: (error: any) => {\r\n if (error instanceof CloseEvent) {\r\n this.dispatchWebSocketDisconnected();\r\n } else {\r\n this.store.dispatch(new WebsocketMessageError(error));\r\n }\r\n }\r\n });\r\n }\r\n\r\n private disconnect(): void {\r\n if (this.socket) {\r\n // `socket.complete()` closes the connection\r\n // also it doesn't invoke the `onComplete` callback that we passed\r\n // into `socket.subscribe(...)`\r\n this.socket.complete();\r\n this.socket = null;\r\n this.dispatchWebSocketDisconnected();\r\n }\r\n }\r\n\r\n private send(data: any): void {\r\n if (!this.socket) {\r\n throw new Error('You must connect to the socket before sending any data');\r\n }\r\n\r\n this.socket.next(data);\r\n }\r\n\r\n /**\r\n * Don't enlarge the `connect` method\r\n */\r\n private mergeConfigWithOptions(options: NgxsWebsocketPluginOptions): void {\r\n if (options.url) {\r\n this.config.url = options.url;\r\n }\r\n\r\n if (options.serializer) {\r\n this.config.serializer = options.serializer;\r\n }\r\n\r\n if (options.deserializer) {\r\n this.config.deserializer = options.deserializer;\r\n }\r\n }\r\n\r\n /**\r\n * To ensure we don't have any memory leaks\r\n * e.g. if the user occasionally dispatched `ConnectWebSocket` twice\r\n * then the previous subscription will still live in the memory\r\n * to prevent such behavior - we close the previous connection if it exists\r\n */\r\n private updateConnection(): void {\r\n if (this.socket) {\r\n this.socket.complete();\r\n this.socket = null;\r\n this.store.dispatch(new WebSocketConnectionUpdated());\r\n }\r\n }\r\n\r\n /**\r\n * Used in many places so it's better to move the code into function\r\n */\r\n private dispatchWebSocketDisconnected(): void {\r\n this.store.dispatch(new WebSocketDisconnected());\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders, APP_INITIALIZER, InjectionToken } from '@angular/core';\r\n\r\nimport { WebSocketHandler } from './websocket-handler';\r\nimport { NgxsWebsocketPluginOptions, NGXS_WEBSOCKET_OPTIONS, noop } from './symbols';\r\n\r\nexport function websocketOptionsFactory(options: NgxsWebsocketPluginOptions) {\r\n return {\r\n reconnectInterval: 5000,\r\n reconnectAttempts: 10,\r\n typeKey: 'type',\r\n deserializer(e: MessageEvent) {\r\n return JSON.parse(e.data);\r\n },\r\n serializer(value: any) {\r\n return JSON.stringify(value);\r\n },\r\n ...options\r\n };\r\n}\r\n\r\nexport const USER_OPTIONS = new InjectionToken('USER_OPTIONS');\r\n\r\n@NgModule()\r\nexport class NgxsWebsocketPluginModule {\r\n static forRoot(\r\n options?: NgxsWebsocketPluginOptions\r\n ): ModuleWithProviders<NgxsWebsocketPluginModule> {\r\n return {\r\n ngModule: NgxsWebsocketPluginModule,\r\n providers: [\r\n WebSocketHandler,\r\n {\r\n provide: USER_OPTIONS,\r\n useValue: options\r\n },\r\n {\r\n provide: NGXS_WEBSOCKET_OPTIONS,\r\n useFactory: websocketOptionsFactory,\r\n deps: [USER_OPTIONS]\r\n },\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: noop,\r\n deps: [WebSocketHandler],\r\n multi: true\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngxs-websocket-plugin.js","sources":["ng://@ngxs/websocket-plugin/src/symbols.ts","ng://@ngxs/websocket-plugin/src/websocket-handler.ts","ng://@ngxs/websocket-plugin/src/websocket.module.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport const NGXS_WEBSOCKET_OPTIONS = new InjectionToken('NGXS_WEBSOCKET_OPTIONS');\r\n\r\nexport interface NgxsWebsocketPluginOptions {\r\n /**\r\n * URL of the websocket.\r\n */\r\n url?: string;\r\n\r\n /**\r\n * Either a single protocol string or an array of protocol strings.\r\n * These strings are used to indicate sub-protocols, so that a single server\r\n * can implement multiple WebSocket sub-protocols (for example, you might want one server to be able\r\n * to handle different types of interactions depending on the specified protocol).\r\n * If you don't specify a protocol string, an empty string is assumed.\r\n */\r\n protocol?: string | string[];\r\n\r\n /**\r\n * Sets the `binaryType` property of the underlying WebSocket.\r\n */\r\n binaryType?: 'blob' | 'arraybuffer';\r\n\r\n /**\r\n * The property name to distigunish this type for the store.\r\n * Default: 'type'\r\n */\r\n typeKey?: string;\r\n\r\n /**\r\n * Interval to try and reconnect.\r\n * Default: 5000\r\n */\r\n reconnectInterval?: number;\r\n\r\n /**\r\n * Number of reconnect attemps.\r\n * Default: 10\r\n */\r\n reconnectAttempts?: number;\r\n\r\n /**\r\n * Serializer to call before sending messages\r\n * Default: `json.stringify`\r\n */\r\n serializer?: (data: any) => string;\r\n\r\n /**\r\n * Deseralizer before publishing the message.\r\n */\r\n deserializer?: (e: MessageEvent) => any;\r\n}\r\n\r\nexport function noop(..._args: any[]) {\r\n return function() {};\r\n}\r\n\r\n/**\r\n * Action to connect to the websocket. Optionally pass a URL.\r\n */\r\nexport class ConnectWebSocket {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Connect';\r\n }\r\n constructor(public payload?: NgxsWebsocketPluginOptions) {}\r\n}\r\n\r\n/**\r\n * Action triggered when a error ocurrs\r\n */\r\nexport class WebsocketMessageError {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Message Error';\r\n }\r\n constructor(public payload: any) {}\r\n}\r\n\r\n/**\r\n * Action to disconnect the websocket.\r\n */\r\nexport class DisconnectWebSocket {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Disconnect';\r\n }\r\n}\r\n\r\n/**\r\n * Action triggered when websocket is connected\r\n */\r\nexport class WebSocketConnected {\r\n static get type() {\r\n return '[WebSocket] Connected';\r\n }\r\n}\r\n\r\n/**\r\n * Action triggered when websocket is disconnected\r\n */\r\nexport class WebSocketDisconnected {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Disconnected';\r\n }\r\n}\r\n\r\n/**\r\n * Action to send to the server.\r\n */\r\nexport class SendWebSocketMessage {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Send Message';\r\n }\r\n constructor(public payload: any) {}\r\n}\r\n\r\n/**\r\n * Action dispatched when the user tries to connect if the connection already exists.\r\n */\r\nexport class WebSocketConnectionUpdated {\r\n static get type() {\r\n // NOTE: Not necessary to declare the type in this way in your code. See https://github.com/ngxs/store/pull/644#issuecomment-436003138\r\n return '[WebSocket] Connection Updated';\r\n }\r\n}\r\n\r\n/**\r\n * This error is thrown where there is no `type` (or custom `typeKey`) property\r\n * on the message that came from the server side socket\r\n */\r\nexport class TypeKeyPropertyMissingError extends Error {\r\n constructor(typeKey: string) {\r\n super(`Property ${typeKey} is missing on the socket message`);\r\n }\r\n}\r\n","import { Injectable, Inject, OnDestroy } from '@angular/core';\r\nimport { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { WebSocketSubject, WebSocketSubjectConfig } from 'rxjs/webSocket';\r\n\r\nimport {\r\n ConnectWebSocket,\r\n DisconnectWebSocket,\r\n SendWebSocketMessage,\r\n NGXS_WEBSOCKET_OPTIONS,\r\n NgxsWebsocketPluginOptions,\r\n WebsocketMessageError,\r\n WebSocketDisconnected,\r\n TypeKeyPropertyMissingError,\r\n WebSocketConnectionUpdated,\r\n WebSocketConnected\r\n} from './symbols';\r\n\r\n@Injectable()\r\nexport class WebSocketHandler implements OnDestroy {\r\n private socket: WebSocketSubject<any> | null = null;\r\n\r\n private config: WebSocketSubjectConfig<any> = {\r\n url: this.options.url!,\r\n protocol: this.options.protocol,\r\n // Default binary type is `blob` for the global `WebSocket`\r\n binaryType: this.options.binaryType,\r\n serializer: this.options.serializer,\r\n deserializer: this.options.deserializer,\r\n closeObserver: {\r\n next: () => {\r\n // ATTENTION!\r\n // See https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L340\r\n // RxJS socket emits `onComplete` event only if `event.wasClean` is truthy\r\n // and doesn't complete socket subject if it's falsy\r\n this.disconnect();\r\n }\r\n },\r\n openObserver: {\r\n next: () => this.store.dispatch(new WebSocketConnected())\r\n }\r\n };\r\n\r\n private typeKey = this.options.typeKey!;\r\n\r\n private subscription = new Subscription();\r\n\r\n constructor(\r\n private store: Store,\r\n private actions$: Actions,\r\n @Inject(NGXS_WEBSOCKET_OPTIONS) private options: NgxsWebsocketPluginOptions\r\n ) {\r\n this.setupActionsListeners();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.closeConnection();\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n private setupActionsListeners(): void {\r\n this.subscription.add(\r\n this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe(({ payload }) => {\r\n this.connect(payload);\r\n })\r\n );\r\n\r\n this.subscription.add(\r\n this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe(() => {\r\n this.disconnect();\r\n })\r\n );\r\n\r\n this.subscription.add(\r\n this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe(({ payload }) => {\r\n this.send(payload);\r\n })\r\n );\r\n }\r\n\r\n private connect(options?: NgxsWebsocketPluginOptions): void {\r\n this.updateConnection();\r\n\r\n // Users can pass the options in the connect method so\r\n // if options aren't available at DI bootstrap they have access\r\n // to pass them here\r\n if (options) {\r\n this.mergeConfigWithOptions(options);\r\n }\r\n\r\n this.socket = new WebSocketSubject(this.config);\r\n\r\n this.socket.subscribe({\r\n next: (message: any) => {\r\n const type = getValue(message, this.typeKey);\r\n if (!type) {\r\n throw new TypeKeyPropertyMissingError(this.typeKey);\r\n }\r\n this.store.dispatch({ ...message, type });\r\n },\r\n error: (error: any) => {\r\n if (error instanceof CloseEvent) {\r\n this.dispatchWebSocketDisconnected();\r\n } else {\r\n this.store.dispatch(new WebsocketMessageError(error));\r\n }\r\n }\r\n });\r\n }\r\n\r\n private disconnect(): void {\r\n if (this.socket) {\r\n this.closeConnection();\r\n this.dispatchWebSocketDisconnected();\r\n }\r\n }\r\n\r\n private send(data: any): void {\r\n if (!this.socket) {\r\n throw new Error('You must connect to the socket before sending any data');\r\n }\r\n\r\n this.socket.next(data);\r\n }\r\n\r\n /**\r\n * Don't enlarge the `connect` method\r\n */\r\n private mergeConfigWithOptions(options: NgxsWebsocketPluginOptions): void {\r\n if (options.url) {\r\n this.config.url = options.url;\r\n }\r\n\r\n if (options.serializer) {\r\n this.config.serializer = options.serializer;\r\n }\r\n\r\n if (options.deserializer) {\r\n this.config.deserializer = options.deserializer;\r\n }\r\n }\r\n\r\n /**\r\n * To ensure we don't have any memory leaks\r\n * e.g. if the user occasionally dispatched `ConnectWebSocket` twice\r\n * then the previous subscription will still live in the memory\r\n * to prevent such behavior - we close the previous connection if it exists\r\n */\r\n private updateConnection(): void {\r\n if (this.socket) {\r\n this.closeConnection();\r\n this.store.dispatch(new WebSocketConnectionUpdated());\r\n }\r\n }\r\n\r\n /**\r\n * Used in many places so it's better to move the code into function\r\n */\r\n private dispatchWebSocketDisconnected(): void {\r\n this.store.dispatch(new WebSocketDisconnected());\r\n }\r\n\r\n private closeConnection(): void {\r\n // `socket.complete()` closes the connection\r\n // also it doesn't invoke the `onComplete` callback that we passed\r\n // into `socket.subscribe(...)`\r\n if (this.socket !== null) {\r\n this.socket.complete();\r\n this.socket = null;\r\n }\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders, APP_INITIALIZER, InjectionToken } from '@angular/core';\r\n\r\nimport { WebSocketHandler } from './websocket-handler';\r\nimport { NgxsWebsocketPluginOptions, NGXS_WEBSOCKET_OPTIONS, noop } from './symbols';\r\n\r\nexport function websocketOptionsFactory(options: NgxsWebsocketPluginOptions) {\r\n return {\r\n reconnectInterval: 5000,\r\n reconnectAttempts: 10,\r\n typeKey: 'type',\r\n deserializer(e: MessageEvent) {\r\n return JSON.parse(e.data);\r\n },\r\n serializer(value: any) {\r\n return JSON.stringify(value);\r\n },\r\n ...options\r\n };\r\n}\r\n\r\nexport const USER_OPTIONS = new InjectionToken('USER_OPTIONS');\r\n\r\n@NgModule()\r\nexport class NgxsWebsocketPluginModule {\r\n static forRoot(\r\n options?: NgxsWebsocketPluginOptions\r\n ): ModuleWithProviders<NgxsWebsocketPluginModule> {\r\n return {\r\n ngModule: NgxsWebsocketPluginModule,\r\n providers: [\r\n WebSocketHandler,\r\n {\r\n provide: USER_OPTIONS,\r\n useValue: options\r\n },\r\n {\r\n provide: NGXS_WEBSOCKET_OPTIONS,\r\n useFactory: websocketOptionsFactory,\r\n deps: [USER_OPTIONS]\r\n },\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: noop,\r\n deps: [WebSocketHandler],\r\n multi: true\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __extends, __assign } from 'tslib';
|
|
2
2
|
import { InjectionToken, Injectable, Inject, APP_INITIALIZER, NgModule } from '@angular/core';
|
|
3
3
|
import { ofActionDispatched, getValue, Store, Actions } from '@ngxs/store';
|
|
4
|
+
import { Subscription } from 'rxjs';
|
|
4
5
|
import { WebSocketSubject } from 'rxjs/webSocket';
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -299,8 +300,19 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
299
300
|
}
|
|
300
301
|
};
|
|
301
302
|
this.typeKey = (/** @type {?} */ (this.options.typeKey));
|
|
303
|
+
this.subscription = new Subscription();
|
|
302
304
|
this.setupActionsListeners();
|
|
303
305
|
}
|
|
306
|
+
/**
|
|
307
|
+
* @return {?}
|
|
308
|
+
*/
|
|
309
|
+
WebSocketHandler.prototype.ngOnDestroy = /**
|
|
310
|
+
* @return {?}
|
|
311
|
+
*/
|
|
312
|
+
function () {
|
|
313
|
+
this.closeConnection();
|
|
314
|
+
this.subscription.unsubscribe();
|
|
315
|
+
};
|
|
304
316
|
/**
|
|
305
317
|
* @private
|
|
306
318
|
* @return {?}
|
|
@@ -311,28 +323,28 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
311
323
|
*/
|
|
312
324
|
function () {
|
|
313
325
|
var _this = this;
|
|
314
|
-
this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
|
|
326
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe((/**
|
|
315
327
|
* @param {?} __0
|
|
316
328
|
* @return {?}
|
|
317
329
|
*/
|
|
318
330
|
function (_a) {
|
|
319
331
|
var payload = _a.payload;
|
|
320
332
|
_this.connect(payload);
|
|
321
|
-
}));
|
|
322
|
-
this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
|
|
333
|
+
})));
|
|
334
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe((/**
|
|
323
335
|
* @return {?}
|
|
324
336
|
*/
|
|
325
337
|
function () {
|
|
326
338
|
_this.disconnect();
|
|
327
|
-
}));
|
|
328
|
-
this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
|
|
339
|
+
})));
|
|
340
|
+
this.subscription.add(this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe((/**
|
|
329
341
|
* @param {?} __0
|
|
330
342
|
* @return {?}
|
|
331
343
|
*/
|
|
332
344
|
function (_a) {
|
|
333
345
|
var payload = _a.payload;
|
|
334
346
|
_this.send(payload);
|
|
335
|
-
}));
|
|
347
|
+
})));
|
|
336
348
|
};
|
|
337
349
|
/**
|
|
338
350
|
* @private
|
|
@@ -391,11 +403,7 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
391
403
|
*/
|
|
392
404
|
function () {
|
|
393
405
|
if (this.socket) {
|
|
394
|
-
|
|
395
|
-
// also it doesn't invoke the `onComplete` callback that we passed
|
|
396
|
-
// into `socket.subscribe(...)`
|
|
397
|
-
this.socket.complete();
|
|
398
|
-
this.socket = null;
|
|
406
|
+
this.closeConnection();
|
|
399
407
|
this.dispatchWebSocketDisconnected();
|
|
400
408
|
}
|
|
401
409
|
};
|
|
@@ -465,8 +473,7 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
465
473
|
*/
|
|
466
474
|
function () {
|
|
467
475
|
if (this.socket) {
|
|
468
|
-
this.
|
|
469
|
-
this.socket = null;
|
|
476
|
+
this.closeConnection();
|
|
470
477
|
this.store.dispatch(new WebSocketConnectionUpdated());
|
|
471
478
|
}
|
|
472
479
|
};
|
|
@@ -486,6 +493,23 @@ var WebSocketHandler = /** @class */ (function () {
|
|
|
486
493
|
function () {
|
|
487
494
|
this.store.dispatch(new WebSocketDisconnected());
|
|
488
495
|
};
|
|
496
|
+
/**
|
|
497
|
+
* @private
|
|
498
|
+
* @return {?}
|
|
499
|
+
*/
|
|
500
|
+
WebSocketHandler.prototype.closeConnection = /**
|
|
501
|
+
* @private
|
|
502
|
+
* @return {?}
|
|
503
|
+
*/
|
|
504
|
+
function () {
|
|
505
|
+
// `socket.complete()` closes the connection
|
|
506
|
+
// also it doesn't invoke the `onComplete` callback that we passed
|
|
507
|
+
// into `socket.subscribe(...)`
|
|
508
|
+
if (this.socket !== null) {
|
|
509
|
+
this.socket.complete();
|
|
510
|
+
this.socket = null;
|
|
511
|
+
}
|
|
512
|
+
};
|
|
489
513
|
WebSocketHandler.decorators = [
|
|
490
514
|
{ type: Injectable }
|
|
491
515
|
];
|
|
@@ -513,6 +537,11 @@ if (false) {
|
|
|
513
537
|
* @private
|
|
514
538
|
*/
|
|
515
539
|
WebSocketHandler.prototype.typeKey;
|
|
540
|
+
/**
|
|
541
|
+
* @type {?}
|
|
542
|
+
* @private
|
|
543
|
+
*/
|
|
544
|
+
WebSocketHandler.prototype.subscription;
|
|
516
545
|
/**
|
|
517
546
|
* @type {?}
|
|
518
547
|
* @private
|