@ngxs/websocket-plugin 3.8.1-dev.master-5828e37 → 3.8.1-dev.master-98beeea

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.
@@ -0,0 +1,3 @@
1
+ export { NgxsWebsocketPluginModule, withNgxsWebSocketPlugin } from './websocket.module';
2
+ export { NGXS_WEBSOCKET_OPTIONS, ConnectWebSocket, WebsocketMessageError, DisconnectWebSocket, WebSocketDisconnected, SendWebSocketMessage, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEYsT0FBTyxFQUNMLHNCQUFzQixFQUV0QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLDBCQUEwQixFQUMxQixrQkFBa0IsRUFDbkIsTUFBTSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBOZ3hzV2Vic29ja2V0UGx1Z2luTW9kdWxlLCB3aXRoTmd4c1dlYlNvY2tldFBsdWdpbiB9IGZyb20gJy4vd2Vic29ja2V0Lm1vZHVsZSc7XG5leHBvcnQge1xuICBOR1hTX1dFQlNPQ0tFVF9PUFRJT05TLFxuICBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucyxcbiAgQ29ubmVjdFdlYlNvY2tldCxcbiAgV2Vic29ja2V0TWVzc2FnZUVycm9yLFxuICBEaXNjb25uZWN0V2ViU29ja2V0LFxuICBXZWJTb2NrZXREaXNjb25uZWN0ZWQsXG4gIFNlbmRXZWJTb2NrZXRNZXNzYWdlLFxuICBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCxcbiAgV2ViU29ja2V0Q29ubmVjdGVkXG59IGZyb20gJy4vc3ltYm9scyc7XG4iXX0=
@@ -0,0 +1,142 @@
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';
3
+ import { Subscription } from 'rxjs';
4
+ import { WebSocketSubject } from 'rxjs/webSocket';
5
+ import { ConnectWebSocket, DisconnectWebSocket, SendWebSocketMessage, NGXS_WEBSOCKET_OPTIONS, WebsocketMessageError, WebSocketDisconnected, TypeKeyPropertyMissingError, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ngxs/store";
8
+ export class WebSocketHandler {
9
+ constructor(store, actions$, options) {
10
+ this.store = store;
11
+ this.actions$ = actions$;
12
+ this.options = options;
13
+ this.socket = null;
14
+ this.config = {
15
+ url: this.options.url,
16
+ protocol: this.options.protocol,
17
+ // Default binary type is `blob` for the global `WebSocket`
18
+ binaryType: this.options.binaryType,
19
+ serializer: this.options.serializer,
20
+ deserializer: this.options.deserializer,
21
+ closeObserver: {
22
+ next: () => {
23
+ // ATTENTION!
24
+ // See https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L340
25
+ // RxJS socket emits `onComplete` event only if `event.wasClean` is truthy
26
+ // and doesn't complete socket subject if it's falsy
27
+ this.disconnect();
28
+ }
29
+ },
30
+ openObserver: {
31
+ next: () => this.store.dispatch(new WebSocketConnected())
32
+ }
33
+ };
34
+ this.typeKey = this.options.typeKey;
35
+ this.subscription = new Subscription();
36
+ this.setupActionsListeners();
37
+ }
38
+ ngOnDestroy() {
39
+ this.closeConnection();
40
+ this.subscription.unsubscribe();
41
+ }
42
+ setupActionsListeners() {
43
+ this.subscription.add(this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe(({ payload }) => {
44
+ this.connect(payload);
45
+ }));
46
+ this.subscription.add(this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe(() => {
47
+ this.disconnect();
48
+ }));
49
+ this.subscription.add(this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe(({ payload }) => {
50
+ this.send(payload);
51
+ }));
52
+ }
53
+ connect(options) {
54
+ this.updateConnection();
55
+ // Users can pass the options in the connect method so
56
+ // if options aren't available at DI bootstrap they have access
57
+ // to pass them here
58
+ if (options) {
59
+ this.mergeConfigWithOptions(options);
60
+ }
61
+ this.socket = new WebSocketSubject(this.config);
62
+ this.socket.subscribe({
63
+ next: (message) => {
64
+ const type = getValue(message, this.typeKey);
65
+ if (!type) {
66
+ throw new TypeKeyPropertyMissingError(this.typeKey);
67
+ }
68
+ this.store.dispatch({ ...message, type });
69
+ },
70
+ error: (error) => {
71
+ if (error instanceof CloseEvent) {
72
+ this.dispatchWebSocketDisconnected();
73
+ }
74
+ else {
75
+ this.store.dispatch(new WebsocketMessageError(error));
76
+ }
77
+ }
78
+ });
79
+ }
80
+ disconnect() {
81
+ if (this.socket) {
82
+ this.closeConnection();
83
+ this.dispatchWebSocketDisconnected();
84
+ }
85
+ }
86
+ send(data) {
87
+ if (!this.socket) {
88
+ throw new Error('You must connect to the socket before sending any data');
89
+ }
90
+ this.socket.next(data);
91
+ }
92
+ /**
93
+ * Don't enlarge the `connect` method
94
+ */
95
+ mergeConfigWithOptions(options) {
96
+ if (options.url) {
97
+ this.config.url = options.url;
98
+ }
99
+ if (options.serializer) {
100
+ this.config.serializer = options.serializer;
101
+ }
102
+ if (options.deserializer) {
103
+ this.config.deserializer = options.deserializer;
104
+ }
105
+ }
106
+ /**
107
+ * To ensure we don't have any memory leaks
108
+ * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
109
+ * then the previous subscription will still live in the memory
110
+ * to prevent such behavior - we close the previous connection if it exists
111
+ */
112
+ updateConnection() {
113
+ if (this.socket) {
114
+ this.closeConnection();
115
+ this.store.dispatch(new WebSocketConnectionUpdated());
116
+ }
117
+ }
118
+ /**
119
+ * Used in many places so it's better to move the code into function
120
+ */
121
+ dispatchWebSocketDisconnected() {
122
+ this.store.dispatch(new WebSocketDisconnected());
123
+ }
124
+ closeConnection() {
125
+ // `socket.complete()` closes the connection
126
+ // also it doesn't invoke the `onComplete` callback that we passed
127
+ // into `socket.subscribe(...)`
128
+ if (this.socket !== null) {
129
+ this.socket.complete();
130
+ this.socket = null;
131
+ }
132
+ }
133
+ }
134
+ /** @nocollapse */ WebSocketHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, deps: [{ token: i1.Store }, { token: i1.Actions }, { token: NGXS_WEBSOCKET_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
135
+ /** @nocollapse */ WebSocketHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler });
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, decorators: [{
137
+ type: Injectable
138
+ }], ctorParameters: function () { return [{ type: i1.Store }, { type: i1.Actions }, { type: undefined, decorators: [{
139
+ type: Inject,
140
+ args: [NGXS_WEBSOCKET_OPTIONS]
141
+ }] }]; } });
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy93ZWJzb2NrZXQtcGx1Z2luL3NyYy93ZWJzb2NrZXQtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQTBCLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUV0QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQiwwQkFBMEIsRUFDMUIsa0JBQWtCLEVBQ25CLE1BQU0sV0FBVyxDQUFDOzs7QUFHbkIsTUFBTSxPQUFPLGdCQUFnQjtJQTRCM0IsWUFDVSxLQUFZLEVBQ1osUUFBaUIsRUFDZSxPQUFtQztRQUZuRSxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNlLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBOUJyRSxXQUFNLEdBQWlDLElBQUksQ0FBQztRQUU1QyxXQUFNLEdBQWdDO1lBQzVDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUk7WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUMvQiwyREFBMkQ7WUFDM0QsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQ25DLFlBQVksRUFBRSxJQUFJ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QyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLGVBQWU7UUFDckIsNENBQTRDO1FBQzVDLGtFQUFrRTtRQUNsRSwrQkFBK0I7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7Z0lBdkpVLGdCQUFnQiw4REErQmpCLHNCQUFzQjtvSUEvQnJCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVOzswQkFnQ04sTUFBTTsyQkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9ucywgU3RvcmUsIGdldFZhbHVlLCBvZkFjdGlvbkRpc3BhdGNoZWQgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgV2ViU29ja2V0U3ViamVjdCwgV2ViU29ja2V0U3ViamVjdENvbmZpZyB9IGZyb20gJ3J4anMvd2ViU29ja2V0JztcblxuaW1wb3J0IHtcbiAgQ29ubmVjdFdlYlNvY2tldCxcbiAgRGlzY29ubmVjdFdlYlNvY2tldCxcbiAgU2VuZFdlYlNvY2tldE1lc3NhZ2UsXG4gIE5HWFNfV0VCU09DS0VUX09QVElPTlMsXG4gIE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zLFxuICBXZWJzb2NrZXRNZXNzYWdlRXJyb3IsXG4gIFdlYlNvY2tldERpc2Nvbm5lY3RlZCxcbiAgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yLFxuICBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCxcbiAgV2ViU29ja2V0Q29ubmVjdGVkXG59IGZyb20gJy4vc3ltYm9scyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRIYW5kbGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldFN1YmplY3Q8YW55PiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uZmlnOiBXZWJTb2NrZXRTdWJqZWN0Q29uZmlnPGFueT4gPSB7XG4gICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsISxcbiAgICBwcm90b2NvbDogdGhpcy5vcHRpb25zLnByb3RvY29sLFxuICAgIC8vIERlZmF1bHQgYmluYXJ5IHR5cGUgaXMgYGJsb2JgIGZvciB0aGUgZ2xvYmFsIGBXZWJTb2NrZXRgXG4gICAgYmluYXJ5VHlwZTogdGhpcy5vcHRpb25zLmJpbmFyeVR5cGUsXG4gICAgc2VyaWFsaXplcjogdGhpcy5vcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgZGVzZXJpYWxpemVyOiB0aGlzLm9wdGlvbnMuZGVzZXJpYWxpemVyLFxuICAgIGNsb3NlT2JzZXJ2ZXI6IHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgLy8gQVRURU5USU9OIVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL2Jsb2IvbWFzdGVyL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmxlL2RvbS9XZWJTb2NrZXRTdWJqZWN0LnRzI0wzNDBcbiAgICAgICAgLy8gUnhKUyBzb2NrZXQgZW1pdHMgYG9uQ29tcGxldGVgIGV2ZW50IG9ubHkgaWYgYGV2ZW50Lndhc0NsZWFuYCBpcyB0cnV0aHlcbiAgICAgICAgLy8gYW5kIGRvZXNuJ3QgY29tcGxldGUgc29ja2V0IHN1YmplY3QgaWYgaXQncyBmYWxzeVxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9wZW5PYnNlcnZlcjoge1xuICAgICAgbmV4dDogKCkgPT4gdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGVkKCkpXG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgdHlwZUtleSA9IHRoaXMub3B0aW9ucy50eXBlS2V5ITtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZSxcbiAgICBwcml2YXRlIGFjdGlvbnMkOiBBY3Rpb25zLFxuICAgIEBJbmplY3QoTkdYU19XRUJTT0NLRVRfT1BUSU9OUykgcHJpdmF0ZSBvcHRpb25zOiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLnNldHVwQWN0aW9uc0xpc3RlbmVycygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEFjdGlvbnNMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5hY3Rpb25zJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChDb25uZWN0V2ViU29ja2V0KSkuc3Vic2NyaWJlKCh7IHBheWxvYWQgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3QocGF5bG9hZCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmFjdGlvbnMkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKERpc2Nvbm5lY3RXZWJTb2NrZXQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuYWN0aW9ucyQucGlwZShvZkFjdGlvbkRpc3BhdGNoZWQoU2VuZFdlYlNvY2tldE1lc3NhZ2UpKS5zdWJzY3JpYmUoKHsgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgIHRoaXMuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29ubmVjdChvcHRpb25zPzogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcblxuICAgIC8vIFVzZXJzIGNhbiBwYXNzIHRoZSBvcHRpb25zIGluIHRoZSBjb25uZWN0IG1ldGhvZCBzb1xuICAgIC8vIGlmIG9wdGlvbnMgYXJlbid0IGF2YWlsYWJsZSBhdCBESSBib290c3RyYXAgdGhleSBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHBhc3MgdGhlbSBoZXJlXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMubWVyZ2VDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXRTdWJqZWN0KHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMuc29ja2V0LnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRWYWx1ZShtZXNzYWdlLCB0aGlzLnR5cGVLZXkpO1xuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yKHRoaXMudHlwZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh7IC4uLm1lc3NhZ2UsIHR5cGUgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENsb3NlRXZlbnQpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2Vic29ja2V0TWVzc2FnZUVycm9yKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZW5kKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgY29ubmVjdCB0byB0aGUgc29ja2V0IGJlZm9yZSBzZW5kaW5nIGFueSBkYXRhJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zb2NrZXQubmV4dChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb24ndCBlbmxhcmdlIHRoZSBgY29ubmVjdGAgbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIG1lcmdlQ29uZmlnV2l0aE9wdGlvbnMob3B0aW9uczogTmd4c1dlYnNvY2tldFBsdWdpbk9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgIHRoaXMuY29uZmlnLnVybCA9IG9wdGlvbnMudXJsO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNlcmlhbGl6ZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLnNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXI7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGVzZXJpYWxpemVyKSB7XG4gICAgICB0aGlzLmNvbmZpZy5kZXNlcmlhbGl6ZXIgPSBvcHRpb25zLmRlc2VyaWFsaXplcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG8gZW5zdXJlIHdlIGRvbid0IGhhdmUgYW55IG1lbW9yeSBsZWFrc1xuICAgKiBlLmcuIGlmIHRoZSB1c2VyIG9jY2FzaW9uYWxseSBkaXNwYXRjaGVkIGBDb25uZWN0V2ViU29ja2V0YCB0d2ljZVxuICAgKiB0aGVuIHRoZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gd2lsbCBzdGlsbCBsaXZlIGluIHRoZSBtZW1vcnlcbiAgICogdG8gcHJldmVudCBzdWNoIGJlaGF2aW9yIC0gd2UgY2xvc2UgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24gaWYgaXQgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbm5lY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgaW4gbWFueSBwbGFjZXMgc28gaXQncyBiZXR0ZXIgdG8gbW92ZSB0aGUgY29kZSBpbnRvIGZ1bmN0aW9uXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoV2ViU29ja2V0RGlzY29ubmVjdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VDb25uZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIGBzb2NrZXQuY29tcGxldGUoKWAgY2xvc2VzIHRoZSBjb25uZWN0aW9uXG4gICAgLy8gYWxzbyBpdCBkb2Vzbid0IGludm9rZSB0aGUgYG9uQ29tcGxldGVgIGNhbGxiYWNrIHRoYXQgd2UgcGFzc2VkXG4gICAgLy8gaW50byBgc29ja2V0LnN1YnNjcmliZSguLi4pYFxuICAgIGlmICh0aGlzLnNvY2tldCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zb2NrZXQuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,67 @@
1
+ import { NgModule, APP_INITIALIZER, InjectionToken, makeEnvironmentProviders } from '@angular/core';
2
+ import { WebSocketHandler } from './websocket-handler';
3
+ import { NGXS_WEBSOCKET_OPTIONS, noop } from './symbols';
4
+ import * as i0 from "@angular/core";
5
+ export function websocketOptionsFactory(options) {
6
+ return {
7
+ reconnectInterval: 5000,
8
+ reconnectAttempts: 10,
9
+ typeKey: 'type',
10
+ deserializer(e) {
11
+ return JSON.parse(e.data);
12
+ },
13
+ serializer(value) {
14
+ return JSON.stringify(value);
15
+ },
16
+ ...options
17
+ };
18
+ }
19
+ export const USER_OPTIONS = new InjectionToken('USER_OPTIONS');
20
+ export class NgxsWebsocketPluginModule {
21
+ static forRoot(options) {
22
+ return {
23
+ ngModule: NgxsWebsocketPluginModule,
24
+ providers: [
25
+ WebSocketHandler,
26
+ {
27
+ provide: USER_OPTIONS,
28
+ useValue: options
29
+ },
30
+ {
31
+ provide: NGXS_WEBSOCKET_OPTIONS,
32
+ useFactory: websocketOptionsFactory,
33
+ deps: [USER_OPTIONS]
34
+ },
35
+ {
36
+ provide: APP_INITIALIZER,
37
+ useFactory: noop,
38
+ deps: [WebSocketHandler],
39
+ multi: true
40
+ }
41
+ ]
42
+ };
43
+ }
44
+ }
45
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
46
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule });
47
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule });
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule, decorators: [{
49
+ type: NgModule
50
+ }] });
51
+ export function withNgxsWebSocketPlugin(options) {
52
+ return makeEnvironmentProviders([
53
+ { provide: USER_OPTIONS, useValue: options },
54
+ {
55
+ provide: NGXS_WEBSOCKET_OPTIONS,
56
+ useFactory: websocketOptionsFactory,
57
+ deps: [USER_OPTIONS]
58
+ },
59
+ {
60
+ provide: APP_INITIALIZER,
61
+ useFactory: noop,
62
+ deps: [WebSocketHandler],
63
+ multi: true
64
+ }
65
+ ]);
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3dlYnNvY2tldC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFFBQVEsRUFFUixlQUFlLEVBQ2YsY0FBYyxFQUVkLHdCQUF3QixFQUN6QixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQThCLHNCQUFzQixFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFFckYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQW1DO0lBQ3pFLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsT0FBTyxFQUFFLE1BQU07UUFDZixZQUFZLENBQUMsQ0FBZTtZQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxVQUFVLENBQUMsS0FBVTtZQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRy9ELE1BQU0sT0FBTyx5QkFBeUI7SUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FDWixPQUFvQztRQUVwQyxPQUFPO1lBQ0wsUUFBUSxFQUFFLHlCQUF5QjtZQUNuQyxTQUFTLEVBQUU7Z0JBQ1QsZ0JBQWdCO2dCQUNoQjtvQkFDRSxPQUFPLEVBQUUsWUFBWTtvQkFDckIsUUFBUSxFQUFFLE9BQU87aUJBQ2xCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxzQkFBc0I7b0JBQy9CLFVBQVUsRUFBRSx1QkFBdUI7b0JBQ25DLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDckI7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLGVBQWU7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDeEIsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDOzt5SUF6QlUseUJBQXlCOzBJQUF6Qix5QkFBeUI7MElBQXpCLHlCQUF5QjsyRkFBekIseUJBQXlCO2tCQURyQyxRQUFROztBQTZCVCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE9BQW9DO0lBRXBDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7UUFDNUM7WUFDRSxPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLFVBQVUsRUFBRSx1QkFBdUI7WUFDbkMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDO1NBQ3JCO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsSUFBSTtZQUNoQixJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN4QixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE5nTW9kdWxlLFxuICBNb2R1bGVXaXRoUHJvdmlkZXJzLFxuICBBUFBfSU5JVElBTElaRVIsXG4gIEluamVjdGlvblRva2VuLFxuICBFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBXZWJTb2NrZXRIYW5kbGVyIH0gZnJvbSAnLi93ZWJzb2NrZXQtaGFuZGxlcic7XG5pbXBvcnQgeyBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucywgTkdYU19XRUJTT0NLRVRfT1BUSU9OUywgbm9vcCB9IGZyb20gJy4vc3ltYm9scyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3ZWJzb2NrZXRPcHRpb25zRmFjdG9yeShvcHRpb25zOiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIHJlY29ubmVjdEludGVydmFsOiA1MDAwLFxuICAgIHJlY29ubmVjdEF0dGVtcHRzOiAxMCxcbiAgICB0eXBlS2V5OiAndHlwZScsXG4gICAgZGVzZXJpYWxpemVyKGU6IE1lc3NhZ2VFdmVudCkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZXIodmFsdWU6IGFueSkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFVTRVJfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignVVNFUl9PUFRJT05TJyk7XG5cbkBOZ01vZHVsZSgpXG5leHBvcnQgY2xhc3MgTmd4c1dlYnNvY2tldFBsdWdpbk1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIG9wdGlvbnM/OiBOZ3hzV2Vic29ja2V0UGx1Z2luT3B0aW9uc1xuICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE5neHNXZWJzb2NrZXRQbHVnaW5Nb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neHNXZWJzb2NrZXRQbHVnaW5Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgV2ViU29ja2V0SGFuZGxlcixcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFVTRVJfT1BUSU9OUyxcbiAgICAgICAgICB1c2VWYWx1ZTogb3B0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTkdYU19XRUJTT0NLRVRfT1BUSU9OUyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiB3ZWJzb2NrZXRPcHRpb25zRmFjdG9yeSxcbiAgICAgICAgICBkZXBzOiBbVVNFUl9PUFRJT05TXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IG5vb3AsXG4gICAgICAgICAgZGVwczogW1dlYlNvY2tldEhhbmRsZXJdLFxuICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTmd4c1dlYlNvY2tldFBsdWdpbihcbiAgb3B0aW9ucz86IE5neHNXZWJzb2NrZXRQbHVnaW5PcHRpb25zXG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHsgcHJvdmlkZTogVVNFUl9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HWFNfV0VCU09DS0VUX09QVElPTlMsXG4gICAgICB1c2VGYWN0b3J5OiB3ZWJzb2NrZXRPcHRpb25zRmFjdG9yeSxcbiAgICAgIGRlcHM6IFtVU0VSX09QVElPTlNdXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICB1c2VGYWN0b3J5OiBub29wLFxuICAgICAgZGVwczogW1dlYlNvY2tldEhhbmRsZXJdLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0pO1xufVxuIl19
@@ -0,0 +1,276 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, Injectable, Inject, APP_INITIALIZER, NgModule, makeEnvironmentProviders } from '@angular/core';
3
+ import * as i1 from '@ngxs/store';
4
+ import { ofActionDispatched, getValue } from '@ngxs/store';
5
+ import { Subscription } from 'rxjs';
6
+ import { WebSocketSubject } from 'rxjs/webSocket';
7
+
8
+ const NGXS_WEBSOCKET_OPTIONS = new InjectionToken('NGXS_WEBSOCKET_OPTIONS');
9
+ function noop(..._args) {
10
+ return function () { };
11
+ }
12
+ /**
13
+ * Action to connect to the websocket. Optionally pass a URL.
14
+ */
15
+ class ConnectWebSocket {
16
+ constructor(payload) {
17
+ this.payload = payload;
18
+ }
19
+ }
20
+ ConnectWebSocket.type = '[WebSocket] Connect';
21
+ /**
22
+ * Action triggered when a error ocurrs
23
+ */
24
+ class WebsocketMessageError {
25
+ constructor(payload) {
26
+ this.payload = payload;
27
+ }
28
+ }
29
+ WebsocketMessageError.type = '[WebSocket] Message Error';
30
+ /**
31
+ * Action to disconnect the websocket.
32
+ */
33
+ class DisconnectWebSocket {
34
+ }
35
+ DisconnectWebSocket.type = '[WebSocket] Disconnect';
36
+ /**
37
+ * Action triggered when websocket is connected
38
+ */
39
+ class WebSocketConnected {
40
+ }
41
+ WebSocketConnected.type = '[WebSocket] Connected';
42
+ /**
43
+ * Action triggered when websocket is disconnected
44
+ */
45
+ class WebSocketDisconnected {
46
+ }
47
+ WebSocketDisconnected.type = '[WebSocket] Disconnected';
48
+ /**
49
+ * Action to send to the server.
50
+ */
51
+ class SendWebSocketMessage {
52
+ constructor(payload) {
53
+ this.payload = payload;
54
+ }
55
+ }
56
+ SendWebSocketMessage.type = '[WebSocket] Send Message';
57
+ /**
58
+ * Action dispatched when the user tries to connect if the connection already exists.
59
+ */
60
+ class WebSocketConnectionUpdated {
61
+ }
62
+ WebSocketConnectionUpdated.type = '[WebSocket] Connection Updated';
63
+ /**
64
+ * This error is thrown where there is no `type` (or custom `typeKey`) property
65
+ * on the message that came from the server side socket
66
+ */
67
+ class TypeKeyPropertyMissingError extends Error {
68
+ constructor(typeKey) {
69
+ super(`Property ${typeKey} is missing on the socket message`);
70
+ }
71
+ }
72
+
73
+ class WebSocketHandler {
74
+ constructor(store, actions$, options) {
75
+ this.store = store;
76
+ this.actions$ = actions$;
77
+ this.options = options;
78
+ this.socket = null;
79
+ this.config = {
80
+ url: this.options.url,
81
+ protocol: this.options.protocol,
82
+ // Default binary type is `blob` for the global `WebSocket`
83
+ binaryType: this.options.binaryType,
84
+ serializer: this.options.serializer,
85
+ deserializer: this.options.deserializer,
86
+ closeObserver: {
87
+ next: () => {
88
+ // ATTENTION!
89
+ // See https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L340
90
+ // RxJS socket emits `onComplete` event only if `event.wasClean` is truthy
91
+ // and doesn't complete socket subject if it's falsy
92
+ this.disconnect();
93
+ }
94
+ },
95
+ openObserver: {
96
+ next: () => this.store.dispatch(new WebSocketConnected())
97
+ }
98
+ };
99
+ this.typeKey = this.options.typeKey;
100
+ this.subscription = new Subscription();
101
+ this.setupActionsListeners();
102
+ }
103
+ ngOnDestroy() {
104
+ this.closeConnection();
105
+ this.subscription.unsubscribe();
106
+ }
107
+ setupActionsListeners() {
108
+ this.subscription.add(this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe(({ payload }) => {
109
+ this.connect(payload);
110
+ }));
111
+ this.subscription.add(this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe(() => {
112
+ this.disconnect();
113
+ }));
114
+ this.subscription.add(this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe(({ payload }) => {
115
+ this.send(payload);
116
+ }));
117
+ }
118
+ connect(options) {
119
+ this.updateConnection();
120
+ // Users can pass the options in the connect method so
121
+ // if options aren't available at DI bootstrap they have access
122
+ // to pass them here
123
+ if (options) {
124
+ this.mergeConfigWithOptions(options);
125
+ }
126
+ this.socket = new WebSocketSubject(this.config);
127
+ this.socket.subscribe({
128
+ next: (message) => {
129
+ const type = getValue(message, this.typeKey);
130
+ if (!type) {
131
+ throw new TypeKeyPropertyMissingError(this.typeKey);
132
+ }
133
+ this.store.dispatch(Object.assign(Object.assign({}, message), { type }));
134
+ },
135
+ error: (error) => {
136
+ if (error instanceof CloseEvent) {
137
+ this.dispatchWebSocketDisconnected();
138
+ }
139
+ else {
140
+ this.store.dispatch(new WebsocketMessageError(error));
141
+ }
142
+ }
143
+ });
144
+ }
145
+ disconnect() {
146
+ if (this.socket) {
147
+ this.closeConnection();
148
+ this.dispatchWebSocketDisconnected();
149
+ }
150
+ }
151
+ send(data) {
152
+ if (!this.socket) {
153
+ throw new Error('You must connect to the socket before sending any data');
154
+ }
155
+ this.socket.next(data);
156
+ }
157
+ /**
158
+ * Don't enlarge the `connect` method
159
+ */
160
+ mergeConfigWithOptions(options) {
161
+ if (options.url) {
162
+ this.config.url = options.url;
163
+ }
164
+ if (options.serializer) {
165
+ this.config.serializer = options.serializer;
166
+ }
167
+ if (options.deserializer) {
168
+ this.config.deserializer = options.deserializer;
169
+ }
170
+ }
171
+ /**
172
+ * To ensure we don't have any memory leaks
173
+ * e.g. if the user occasionally dispatched `ConnectWebSocket` twice
174
+ * then the previous subscription will still live in the memory
175
+ * to prevent such behavior - we close the previous connection if it exists
176
+ */
177
+ updateConnection() {
178
+ if (this.socket) {
179
+ this.closeConnection();
180
+ this.store.dispatch(new WebSocketConnectionUpdated());
181
+ }
182
+ }
183
+ /**
184
+ * Used in many places so it's better to move the code into function
185
+ */
186
+ dispatchWebSocketDisconnected() {
187
+ this.store.dispatch(new WebSocketDisconnected());
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
+ }
198
+ }
199
+ /** @nocollapse */ WebSocketHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, deps: [{ token: i1.Store }, { token: i1.Actions }, { token: NGXS_WEBSOCKET_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
200
+ /** @nocollapse */ WebSocketHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler });
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, decorators: [{
202
+ type: Injectable
203
+ }], ctorParameters: function () {
204
+ return [{ type: i1.Store }, { type: i1.Actions }, { type: undefined, decorators: [{
205
+ type: Inject,
206
+ args: [NGXS_WEBSOCKET_OPTIONS]
207
+ }] }];
208
+ } });
209
+
210
+ function websocketOptionsFactory(options) {
211
+ return Object.assign({ reconnectInterval: 5000, reconnectAttempts: 10, typeKey: 'type', deserializer(e) {
212
+ return JSON.parse(e.data);
213
+ },
214
+ serializer(value) {
215
+ return JSON.stringify(value);
216
+ } }, options);
217
+ }
218
+ const USER_OPTIONS = new InjectionToken('USER_OPTIONS');
219
+ class NgxsWebsocketPluginModule {
220
+ static forRoot(options) {
221
+ return {
222
+ ngModule: NgxsWebsocketPluginModule,
223
+ providers: [
224
+ WebSocketHandler,
225
+ {
226
+ provide: USER_OPTIONS,
227
+ useValue: options
228
+ },
229
+ {
230
+ provide: NGXS_WEBSOCKET_OPTIONS,
231
+ useFactory: websocketOptionsFactory,
232
+ deps: [USER_OPTIONS]
233
+ },
234
+ {
235
+ provide: APP_INITIALIZER,
236
+ useFactory: noop,
237
+ deps: [WebSocketHandler],
238
+ multi: true
239
+ }
240
+ ]
241
+ };
242
+ }
243
+ }
244
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
245
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule });
246
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule });
247
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule, decorators: [{
248
+ type: NgModule
249
+ }] });
250
+ function withNgxsWebSocketPlugin(options) {
251
+ return makeEnvironmentProviders([
252
+ { provide: USER_OPTIONS, useValue: options },
253
+ {
254
+ provide: NGXS_WEBSOCKET_OPTIONS,
255
+ useFactory: websocketOptionsFactory,
256
+ deps: [USER_OPTIONS]
257
+ },
258
+ {
259
+ provide: APP_INITIALIZER,
260
+ useFactory: noop,
261
+ deps: [WebSocketHandler],
262
+ multi: true
263
+ }
264
+ ]);
265
+ }
266
+
267
+ /**
268
+ * The public api for consumers of @ngxs/websocket-plugin
269
+ */
270
+
271
+ /**
272
+ * Generated bundle index. Do not edit.
273
+ */
274
+
275
+ export { ConnectWebSocket, DisconnectWebSocket, NGXS_WEBSOCKET_OPTIONS, NgxsWebsocketPluginModule, SendWebSocketMessage, WebSocketConnected, WebSocketConnectionUpdated, WebSocketDisconnected, WebsocketMessageError, withNgxsWebSocketPlugin };
276
+ //# sourceMappingURL=ngxs-websocket-plugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngxs-websocket-plugin.mjs","sources":["../../../packages/websocket-plugin/src/symbols.ts","../../../packages/websocket-plugin/src/websocket-handler.ts","../../../packages/websocket-plugin/src/websocket.module.ts","../../../packages/websocket-plugin/index.ts","../../../packages/websocket-plugin/ngxs-websocket-plugin.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const NGXS_WEBSOCKET_OPTIONS = new InjectionToken('NGXS_WEBSOCKET_OPTIONS');\n\nexport interface NgxsWebsocketPluginOptions {\n /**\n * URL of the websocket.\n */\n url?: string;\n\n /**\n * Either a single protocol string or an array of protocol strings.\n * These strings are used to indicate sub-protocols, so that a single server\n * can implement multiple WebSocket sub-protocols (for example, you might want one server to be able\n * to handle different types of interactions depending on the specified protocol).\n * If you don't specify a protocol string, an empty string is assumed.\n */\n protocol?: string | string[];\n\n /**\n * Sets the `binaryType` property of the underlying WebSocket.\n */\n binaryType?: 'blob' | 'arraybuffer';\n\n /**\n * The property name to distigunish this type for the store.\n * Default: 'type'\n */\n typeKey?: string;\n\n /**\n * Interval to try and reconnect.\n * Default: 5000\n */\n reconnectInterval?: number;\n\n /**\n * Number of reconnect attemps.\n * Default: 10\n */\n reconnectAttempts?: number;\n\n /**\n * Serializer to call before sending messages\n * Default: `json.stringify`\n */\n serializer?: (data: any) => string;\n\n /**\n * Deseralizer before publishing the message.\n */\n deserializer?: (e: MessageEvent) => any;\n}\n\nexport function noop(..._args: any[]) {\n return function () {};\n}\n\n/**\n * Action to connect to the websocket. Optionally pass a URL.\n */\nexport class ConnectWebSocket {\n static readonly type = '[WebSocket] Connect';\n\n constructor(public payload?: NgxsWebsocketPluginOptions) {}\n}\n\n/**\n * Action triggered when a error ocurrs\n */\nexport class WebsocketMessageError {\n static readonly type = '[WebSocket] Message Error';\n\n constructor(public payload: any) {}\n}\n\n/**\n * Action to disconnect the websocket.\n */\nexport class DisconnectWebSocket {\n static readonly type = '[WebSocket] Disconnect';\n}\n\n/**\n * Action triggered when websocket is connected\n */\nexport class WebSocketConnected {\n static readonly type = '[WebSocket] Connected';\n}\n\n/**\n * Action triggered when websocket is disconnected\n */\nexport class WebSocketDisconnected {\n static readonly type = '[WebSocket] Disconnected';\n}\n\n/**\n * Action to send to the server.\n */\nexport class SendWebSocketMessage {\n static readonly type = '[WebSocket] Send Message';\n\n constructor(public payload: any) {}\n}\n\n/**\n * Action dispatched when the user tries to connect if the connection already exists.\n */\nexport class WebSocketConnectionUpdated {\n static readonly type = '[WebSocket] Connection Updated';\n}\n\n/**\n * This error is thrown where there is no `type` (or custom `typeKey`) property\n * on the message that came from the server side socket\n */\nexport class TypeKeyPropertyMissingError extends Error {\n constructor(typeKey: string) {\n super(`Property ${typeKey} is missing on the socket message`);\n }\n}\n","import { Injectable, Inject, OnDestroy } from '@angular/core';\nimport { Actions, Store, getValue, ofActionDispatched } from '@ngxs/store';\nimport { Subscription } from 'rxjs';\n\nimport { WebSocketSubject, WebSocketSubjectConfig } from 'rxjs/webSocket';\n\nimport {\n ConnectWebSocket,\n DisconnectWebSocket,\n SendWebSocketMessage,\n NGXS_WEBSOCKET_OPTIONS,\n NgxsWebsocketPluginOptions,\n WebsocketMessageError,\n WebSocketDisconnected,\n TypeKeyPropertyMissingError,\n WebSocketConnectionUpdated,\n WebSocketConnected\n} from './symbols';\n\n@Injectable()\nexport class WebSocketHandler implements OnDestroy {\n private socket: WebSocketSubject<any> | null = null;\n\n private config: WebSocketSubjectConfig<any> = {\n url: this.options.url!,\n protocol: this.options.protocol,\n // Default binary type is `blob` for the global `WebSocket`\n binaryType: this.options.binaryType,\n serializer: this.options.serializer,\n deserializer: this.options.deserializer,\n closeObserver: {\n next: () => {\n // ATTENTION!\n // See https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L340\n // RxJS socket emits `onComplete` event only if `event.wasClean` is truthy\n // and doesn't complete socket subject if it's falsy\n this.disconnect();\n }\n },\n openObserver: {\n next: () => this.store.dispatch(new WebSocketConnected())\n }\n };\n\n private typeKey = this.options.typeKey!;\n\n private subscription = new Subscription();\n\n constructor(\n private store: Store,\n private actions$: Actions,\n @Inject(NGXS_WEBSOCKET_OPTIONS) private options: NgxsWebsocketPluginOptions\n ) {\n this.setupActionsListeners();\n }\n\n ngOnDestroy(): void {\n this.closeConnection();\n this.subscription.unsubscribe();\n }\n\n private setupActionsListeners(): void {\n this.subscription.add(\n this.actions$.pipe(ofActionDispatched(ConnectWebSocket)).subscribe(({ payload }) => {\n this.connect(payload);\n })\n );\n\n this.subscription.add(\n this.actions$.pipe(ofActionDispatched(DisconnectWebSocket)).subscribe(() => {\n this.disconnect();\n })\n );\n\n this.subscription.add(\n this.actions$.pipe(ofActionDispatched(SendWebSocketMessage)).subscribe(({ payload }) => {\n this.send(payload);\n })\n );\n }\n\n private connect(options?: NgxsWebsocketPluginOptions): void {\n this.updateConnection();\n\n // Users can pass the options in the connect method so\n // if options aren't available at DI bootstrap they have access\n // to pass them here\n if (options) {\n this.mergeConfigWithOptions(options);\n }\n\n this.socket = new WebSocketSubject(this.config);\n\n this.socket.subscribe({\n next: (message: any) => {\n const type = getValue(message, this.typeKey);\n if (!type) {\n throw new TypeKeyPropertyMissingError(this.typeKey);\n }\n this.store.dispatch({ ...message, type });\n },\n error: (error: any) => {\n if (error instanceof CloseEvent) {\n this.dispatchWebSocketDisconnected();\n } else {\n this.store.dispatch(new WebsocketMessageError(error));\n }\n }\n });\n }\n\n private disconnect(): void {\n if (this.socket) {\n this.closeConnection();\n this.dispatchWebSocketDisconnected();\n }\n }\n\n private send(data: any): void {\n if (!this.socket) {\n throw new Error('You must connect to the socket before sending any data');\n }\n\n this.socket.next(data);\n }\n\n /**\n * Don't enlarge the `connect` method\n */\n private mergeConfigWithOptions(options: NgxsWebsocketPluginOptions): void {\n if (options.url) {\n this.config.url = options.url;\n }\n\n if (options.serializer) {\n this.config.serializer = options.serializer;\n }\n\n if (options.deserializer) {\n this.config.deserializer = options.deserializer;\n }\n }\n\n /**\n * To ensure we don't have any memory leaks\n * e.g. if the user occasionally dispatched `ConnectWebSocket` twice\n * then the previous subscription will still live in the memory\n * to prevent such behavior - we close the previous connection if it exists\n */\n private updateConnection(): void {\n if (this.socket) {\n this.closeConnection();\n this.store.dispatch(new WebSocketConnectionUpdated());\n }\n }\n\n /**\n * Used in many places so it's better to move the code into function\n */\n private dispatchWebSocketDisconnected(): void {\n this.store.dispatch(new WebSocketDisconnected());\n }\n\n private closeConnection(): void {\n // `socket.complete()` closes the connection\n // also it doesn't invoke the `onComplete` callback that we passed\n // into `socket.subscribe(...)`\n if (this.socket !== null) {\n this.socket.complete();\n this.socket = null;\n }\n }\n}\n","import {\n NgModule,\n ModuleWithProviders,\n APP_INITIALIZER,\n InjectionToken,\n EnvironmentProviders,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { WebSocketHandler } from './websocket-handler';\nimport { NgxsWebsocketPluginOptions, NGXS_WEBSOCKET_OPTIONS, noop } from './symbols';\n\nexport function websocketOptionsFactory(options: NgxsWebsocketPluginOptions) {\n return {\n reconnectInterval: 5000,\n reconnectAttempts: 10,\n typeKey: 'type',\n deserializer(e: MessageEvent) {\n return JSON.parse(e.data);\n },\n serializer(value: any) {\n return JSON.stringify(value);\n },\n ...options\n };\n}\n\nexport const USER_OPTIONS = new InjectionToken('USER_OPTIONS');\n\n@NgModule()\nexport class NgxsWebsocketPluginModule {\n static forRoot(\n options?: NgxsWebsocketPluginOptions\n ): ModuleWithProviders<NgxsWebsocketPluginModule> {\n return {\n ngModule: NgxsWebsocketPluginModule,\n providers: [\n WebSocketHandler,\n {\n provide: USER_OPTIONS,\n useValue: options\n },\n {\n provide: NGXS_WEBSOCKET_OPTIONS,\n useFactory: websocketOptionsFactory,\n deps: [USER_OPTIONS]\n },\n {\n provide: APP_INITIALIZER,\n useFactory: noop,\n deps: [WebSocketHandler],\n multi: true\n }\n ]\n };\n }\n}\n\nexport function withNgxsWebSocketPlugin(\n options?: NgxsWebsocketPluginOptions\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: USER_OPTIONS, useValue: options },\n {\n provide: NGXS_WEBSOCKET_OPTIONS,\n useFactory: websocketOptionsFactory,\n deps: [USER_OPTIONS]\n },\n {\n provide: APP_INITIALIZER,\n useFactory: noop,\n deps: [WebSocketHandler],\n multi: true\n }\n ]);\n}\n","/**\n * The public api for consumers of @ngxs/websocket-plugin\n */\nexport * from './src/public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, Inject, APP_INITIALIZER, NgModule } from '@angular/core';
2
+ import { InjectionToken, Injectable, Inject, APP_INITIALIZER, NgModule, makeEnvironmentProviders } from '@angular/core';
3
3
  import * as i1 from '@ngxs/store';
4
4
  import { ofActionDispatched, getValue } from '@ngxs/store';
5
5
  import { Subscription } from 'rxjs';
@@ -130,7 +130,7 @@ class WebSocketHandler {
130
130
  if (!type) {
131
131
  throw new TypeKeyPropertyMissingError(this.typeKey);
132
132
  }
133
- this.store.dispatch(Object.assign(Object.assign({}, message), { type }));
133
+ this.store.dispatch({ ...message, type });
134
134
  },
135
135
  error: (error) => {
136
136
  if (error instanceof CloseEvent) {
@@ -196,9 +196,9 @@ class WebSocketHandler {
196
196
  }
197
197
  }
198
198
  }
199
- /** @nocollapse */ WebSocketHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: WebSocketHandler, deps: [{ token: i1.Store }, { token: i1.Actions }, { token: NGXS_WEBSOCKET_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
200
- /** @nocollapse */ WebSocketHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: WebSocketHandler });
201
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: WebSocketHandler, decorators: [{
199
+ /** @nocollapse */ WebSocketHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, deps: [{ token: i1.Store }, { token: i1.Actions }, { token: NGXS_WEBSOCKET_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
200
+ /** @nocollapse */ WebSocketHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler });
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: WebSocketHandler, decorators: [{
202
202
  type: Injectable
203
203
  }], ctorParameters: function () { return [{ type: i1.Store }, { type: i1.Actions }, { type: undefined, decorators: [{
204
204
  type: Inject,
@@ -206,12 +206,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
206
206
  }] }]; } });
207
207
 
208
208
  function websocketOptionsFactory(options) {
209
- return Object.assign({ reconnectInterval: 5000, reconnectAttempts: 10, typeKey: 'type', deserializer(e) {
209
+ return {
210
+ reconnectInterval: 5000,
211
+ reconnectAttempts: 10,
212
+ typeKey: 'type',
213
+ deserializer(e) {
210
214
  return JSON.parse(e.data);
211
215
  },
212
216
  serializer(value) {
213
217
  return JSON.stringify(value);
214
- } }, options);
218
+ },
219
+ ...options
220
+ };
215
221
  }
216
222
  const USER_OPTIONS = new InjectionToken('USER_OPTIONS');
217
223
  class NgxsWebsocketPluginModule {
@@ -239,12 +245,28 @@ class NgxsWebsocketPluginModule {
239
245
  };
240
246
  }
241
247
  }
242
- /** @nocollapse */ NgxsWebsocketPluginModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NgxsWebsocketPluginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
243
- /** @nocollapse */ NgxsWebsocketPluginModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NgxsWebsocketPluginModule });
244
- /** @nocollapse */ NgxsWebsocketPluginModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NgxsWebsocketPluginModule });
245
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NgxsWebsocketPluginModule, decorators: [{
248
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
249
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule });
250
+ /** @nocollapse */ NgxsWebsocketPluginModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule });
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsWebsocketPluginModule, decorators: [{
246
252
  type: NgModule
247
253
  }] });
254
+ function withNgxsWebSocketPlugin(options) {
255
+ return makeEnvironmentProviders([
256
+ { provide: USER_OPTIONS, useValue: options },
257
+ {
258
+ provide: NGXS_WEBSOCKET_OPTIONS,
259
+ useFactory: websocketOptionsFactory,
260
+ deps: [USER_OPTIONS]
261
+ },
262
+ {
263
+ provide: APP_INITIALIZER,
264
+ useFactory: noop,
265
+ deps: [WebSocketHandler],
266
+ multi: true
267
+ }
268
+ ]);
269
+ }
248
270
 
249
271
  /**
250
272
  * The public api for consumers of @ngxs/websocket-plugin
@@ -254,5 +276,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
254
276
  * Generated bundle index. Do not edit.
255
277
  */
256
278
 
257
- export { ConnectWebSocket, DisconnectWebSocket, NGXS_WEBSOCKET_OPTIONS, NgxsWebsocketPluginModule, SendWebSocketMessage, WebSocketConnected, WebSocketConnectionUpdated, WebSocketDisconnected, WebsocketMessageError };
258
- //# sourceMappingURL=ngxs-websocket-plugin.js.map
279
+ export { ConnectWebSocket, DisconnectWebSocket, NGXS_WEBSOCKET_OPTIONS, NgxsWebsocketPluginModule, SendWebSocketMessage, WebSocketConnected, WebSocketConnectionUpdated, WebSocketDisconnected, WebsocketMessageError, withNgxsWebSocketPlugin };
280
+ //# sourceMappingURL=ngxs-websocket-plugin.mjs.map