@ngxs/websocket-plugin 18.1.6 → 19.0.0

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.
@@ -198,10 +198,10 @@ class WebSocketHandler {
198
198
  this._socket = null;
199
199
  this._socketClosed$.next();
200
200
  }
201
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: WebSocketHandler, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
202
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: WebSocketHandler, providedIn: 'root' }); }
201
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: WebSocketHandler, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
202
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: WebSocketHandler, providedIn: 'root' }); }
203
203
  }
204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: WebSocketHandler, decorators: [{
204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: WebSocketHandler, decorators: [{
205
205
  type: Injectable,
206
206
  args: [{ providedIn: 'root' }]
207
207
  }], ctorParameters: () => [] });
@@ -244,11 +244,11 @@ class NgxsWebSocketPluginModule {
244
244
  providers: ɵgetProviders(options)
245
245
  };
246
246
  }
247
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsWebSocketPluginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
248
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: NgxsWebSocketPluginModule }); }
249
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsWebSocketPluginModule }); }
247
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: NgxsWebSocketPluginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
248
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: NgxsWebSocketPluginModule }); }
249
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: NgxsWebSocketPluginModule }); }
250
250
  }
251
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsWebSocketPluginModule, decorators: [{
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: NgxsWebSocketPluginModule, decorators: [{
252
252
  type: NgModule
253
253
  }] });
254
254
  function withNgxsWebSocketPlugin(options) {
@@ -1 +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/providers.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\ndeclare const ngDevMode: boolean;\n\nexport const NGXS_WEBSOCKET_OPTIONS = new InjectionToken<NgxsWebSocketPluginOptions>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'NGXS_WEBSOCKET_OPTIONS' : ''\n);\n\nexport const USER_OPTIONS = new InjectionToken(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'USER_OPTIONS' : ''\n);\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\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, NgZone, inject, DestroyRef } from '@angular/core';\nimport { Actions, Store, ofActionDispatched } from '@ngxs/store';\nimport { getValue } from '@ngxs/store/plugins';\nimport { ReplaySubject, Subject, fromEvent, takeUntil } from 'rxjs';\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({ providedIn: 'root' })\nexport class WebSocketHandler {\n private _store = inject(Store);\n private _ngZone = inject(NgZone);\n private _actions$ = inject(Actions);\n private _options = inject(NGXS_WEBSOCKET_OPTIONS);\n\n private _socket: WebSocket | null = null;\n\n private readonly _socketClosed$ = new Subject<void>();\n\n private readonly _typeKey = this._options.typeKey!;\n\n private readonly _destroy$ = new ReplaySubject<void>(1);\n\n constructor() {\n this._setupActionsListeners();\n\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => {\n this._closeConnection(/* forcelyCloseSocket */ true);\n this._destroy$.next();\n });\n }\n\n private _setupActionsListeners(): void {\n this._actions$\n .pipe(ofActionDispatched(ConnectWebSocket), takeUntil(this._destroy$))\n .subscribe(({ payload }) => {\n this.connect(payload);\n });\n\n this._actions$\n .pipe(ofActionDispatched(DisconnectWebSocket), takeUntil(this._destroy$))\n .subscribe(() => {\n this._disconnect(/* forcelyCloseSocket */ true);\n });\n\n this._actions$\n .pipe(ofActionDispatched(SendWebSocketMessage), takeUntil(this._destroy$))\n .subscribe(({ payload }) => {\n this.send(payload);\n });\n }\n\n private connect(options?: NgxsWebSocketPluginOptions): void {\n if (this._socket) {\n this._closeConnection(/* forcelyCloseSocket */ true);\n this._store.dispatch(new WebSocketConnectionUpdated());\n }\n\n // TODO(arturovt): we should not override default config values because this breaks support for having multiple socket connections.\n if (options) {\n if (options.serializer) {\n this._options.serializer = options.serializer;\n }\n\n if (options.deserializer) {\n this._options.deserializer = options.deserializer;\n }\n }\n\n this._ngZone.runOutsideAngular(() => {\n // We either use options provided in the `ConnectWebSocket` action\n // or fallback to default config values.\n const url = options?.url || this._options.url!;\n const protocol = options?.protocol || this._options.protocol;\n const binaryType = options?.binaryType || this._options.binaryType;\n\n const socket = (this._socket = protocol\n ? new WebSocket(url, protocol)\n : new WebSocket(url));\n\n if (binaryType) {\n socket.binaryType = binaryType;\n }\n\n fromEvent(socket, 'open')\n .pipe(takeUntil(this._socketClosed$))\n .subscribe(() => this._store.dispatch(new WebSocketConnected()));\n\n fromEvent<MessageEvent>(socket, 'message')\n .pipe(takeUntil(this._socketClosed$))\n .subscribe(event => {\n const message = this._options.deserializer!(event);\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\n fromEvent(socket, 'error')\n .pipe(takeUntil(this._socketClosed$))\n .subscribe(error => {\n // The error event indicates that an error has occurred during the\n // WebSocket communication, and it is often appropriate to close the\n // WebSocket connection when such an error occurs.\n // We need to call `_disconnect()` after the error event has been fired.\n // This ensures that the WebSocket connection is properly closed to prevent\n // potential resource leaks.\n this._disconnect(/* forcelyCloseSocket */ true);\n this._store.dispatch(new WebSocketMessageError(error));\n });\n\n fromEvent<CloseEvent>(socket, 'close')\n .pipe(takeUntil(this._socketClosed$))\n .subscribe(event => {\n if (event.wasClean) {\n // It is not necessary to call `socket.close()` after the `close` event\n // has been fired. In fact, calling `socket.close()` within the `close`\n // event handler or immediately after the event has been fired can lead\n // to unexpected behavior.\n this._disconnect(/* forcelyCloseSocket */ false);\n } else {\n // If the WebSocket `close` event has been fired and its `wasClean`\n // property is falsy, it indicates that the WebSocket connection was\n // closed in an unexpected or abnormal manner.\n // We should call `socket.close()` in this scenario, we can ensure that\n // the WebSocket connection is properly closed.\n this._disconnect(/* forcelyCloseSocket */ true);\n this._store.dispatch(new WebSocketMessageError(event));\n }\n });\n });\n }\n\n private _disconnect(forcelyCloseSocket: boolean): void {\n if (this._socket) {\n this._closeConnection(forcelyCloseSocket);\n this._store.dispatch(new WebSocketDisconnected());\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 try {\n this._socket.send(this._options.serializer!(data));\n } catch (error) {\n this._store.dispatch(new WebSocketMessageError(error));\n }\n }\n\n private _closeConnection(forcelyCloseSocket: boolean): void {\n if (forcelyCloseSocket) {\n this._socket?.close();\n }\n this._socket = null;\n this._socketClosed$.next();\n }\n}\n","import { APP_INITIALIZER } from '@angular/core';\n\nimport { WebSocketHandler } from './websocket-handler';\nimport { USER_OPTIONS, NGXS_WEBSOCKET_OPTIONS, NgxsWebSocketPluginOptions } 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 function ɵgetProviders(options?: NgxsWebSocketPluginOptions) {\n return [\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: () => () => {},\n deps: [WebSocketHandler],\n multi: true\n }\n ];\n}\n","import {\n NgModule,\n ModuleWithProviders,\n EnvironmentProviders,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { ɵgetProviders } from './providers';\nimport { NgxsWebSocketPluginOptions } from './symbols';\n\n@NgModule()\nexport class NgxsWebSocketPluginModule {\n static forRoot(\n options?: NgxsWebSocketPluginOptions\n ): ModuleWithProviders<NgxsWebSocketPluginModule> {\n return {\n ngModule: NgxsWebSocketPluginModule,\n providers: ɵgetProviders(options)\n };\n }\n}\n\nexport function withNgxsWebSocketPlugin(\n options?: NgxsWebSocketPluginOptions\n): EnvironmentProviders {\n return makeEnvironmentProviders(ɵgetProviders(options));\n}\n","/**\n * The public api for consumers of @ngxs/websocket-plugin\n */\nexport * from './src/public_api';\n\n/**\n * The private api for consumers of @ngxs/websocket-plugin\n */\nexport * from './src/private_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
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/providers.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\ndeclare const ngDevMode: boolean;\n\nexport const NGXS_WEBSOCKET_OPTIONS = new InjectionToken<NgxsWebSocketPluginOptions>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'NGXS_WEBSOCKET_OPTIONS' : ''\n);\n\nexport const USER_OPTIONS = new InjectionToken(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'USER_OPTIONS' : ''\n);\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\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, NgZone, inject, DestroyRef } from '@angular/core';\nimport { Actions, Store, ofActionDispatched } from '@ngxs/store';\nimport { getValue } from '@ngxs/store/plugins';\nimport { ReplaySubject, Subject, fromEvent, takeUntil } from 'rxjs';\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({ providedIn: 'root' })\nexport class WebSocketHandler {\n private _store = inject(Store);\n private _ngZone = inject(NgZone);\n private _actions$ = inject(Actions);\n private _options = inject(NGXS_WEBSOCKET_OPTIONS);\n\n private _socket: WebSocket | null = null;\n\n private readonly _socketClosed$ = new Subject<void>();\n\n private readonly _typeKey = this._options.typeKey!;\n\n private readonly _destroy$ = new ReplaySubject<void>(1);\n\n constructor() {\n this._setupActionsListeners();\n\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => {\n this._closeConnection(/* forcelyCloseSocket */ true);\n this._destroy$.next();\n });\n }\n\n private _setupActionsListeners(): void {\n this._actions$\n .pipe(ofActionDispatched(ConnectWebSocket), takeUntil(this._destroy$))\n .subscribe(({ payload }) => {\n this.connect(payload);\n });\n\n this._actions$\n .pipe(ofActionDispatched(DisconnectWebSocket), takeUntil(this._destroy$))\n .subscribe(() => {\n this._disconnect(/* forcelyCloseSocket */ true);\n });\n\n this._actions$\n .pipe(ofActionDispatched(SendWebSocketMessage), takeUntil(this._destroy$))\n .subscribe(({ payload }) => {\n this.send(payload);\n });\n }\n\n private connect(options?: NgxsWebSocketPluginOptions): void {\n if (this._socket) {\n this._closeConnection(/* forcelyCloseSocket */ true);\n this._store.dispatch(new WebSocketConnectionUpdated());\n }\n\n // TODO(arturovt): we should not override default config values because this breaks support for having multiple socket connections.\n if (options) {\n if (options.serializer) {\n this._options.serializer = options.serializer;\n }\n\n if (options.deserializer) {\n this._options.deserializer = options.deserializer;\n }\n }\n\n this._ngZone.runOutsideAngular(() => {\n // We either use options provided in the `ConnectWebSocket` action\n // or fallback to default config values.\n const url = options?.url || this._options.url!;\n const protocol = options?.protocol || this._options.protocol;\n const binaryType = options?.binaryType || this._options.binaryType;\n\n const socket = (this._socket = protocol\n ? new WebSocket(url, protocol)\n : new WebSocket(url));\n\n if (binaryType) {\n socket.binaryType = binaryType;\n }\n\n fromEvent(socket, 'open')\n .pipe(takeUntil(this._socketClosed$))\n .subscribe(() => this._store.dispatch(new WebSocketConnected()));\n\n fromEvent<MessageEvent>(socket, 'message')\n .pipe(takeUntil(this._socketClosed$))\n .subscribe(event => {\n const message = this._options.deserializer!(event);\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\n fromEvent(socket, 'error')\n .pipe(takeUntil(this._socketClosed$))\n .subscribe(error => {\n // The error event indicates that an error has occurred during the\n // WebSocket communication, and it is often appropriate to close the\n // WebSocket connection when such an error occurs.\n // We need to call `_disconnect()` after the error event has been fired.\n // This ensures that the WebSocket connection is properly closed to prevent\n // potential resource leaks.\n this._disconnect(/* forcelyCloseSocket */ true);\n this._store.dispatch(new WebSocketMessageError(error));\n });\n\n fromEvent<CloseEvent>(socket, 'close')\n .pipe(takeUntil(this._socketClosed$))\n .subscribe(event => {\n if (event.wasClean) {\n // It is not necessary to call `socket.close()` after the `close` event\n // has been fired. In fact, calling `socket.close()` within the `close`\n // event handler or immediately after the event has been fired can lead\n // to unexpected behavior.\n this._disconnect(/* forcelyCloseSocket */ false);\n } else {\n // If the WebSocket `close` event has been fired and its `wasClean`\n // property is falsy, it indicates that the WebSocket connection was\n // closed in an unexpected or abnormal manner.\n // We should call `socket.close()` in this scenario, we can ensure that\n // the WebSocket connection is properly closed.\n this._disconnect(/* forcelyCloseSocket */ true);\n this._store.dispatch(new WebSocketMessageError(event));\n }\n });\n });\n }\n\n private _disconnect(forcelyCloseSocket: boolean): void {\n if (this._socket) {\n this._closeConnection(forcelyCloseSocket);\n this._store.dispatch(new WebSocketDisconnected());\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 try {\n this._socket.send(this._options.serializer!(data));\n } catch (error) {\n this._store.dispatch(new WebSocketMessageError(error));\n }\n }\n\n private _closeConnection(forcelyCloseSocket: boolean): void {\n if (forcelyCloseSocket) {\n this._socket?.close();\n }\n this._socket = null;\n this._socketClosed$.next();\n }\n}\n","import { APP_INITIALIZER } from '@angular/core';\n\nimport { WebSocketHandler } from './websocket-handler';\nimport { USER_OPTIONS, NGXS_WEBSOCKET_OPTIONS, NgxsWebSocketPluginOptions } 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 function ɵgetProviders(options?: NgxsWebSocketPluginOptions) {\n return [\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: () => () => {},\n deps: [WebSocketHandler],\n multi: true\n }\n ];\n}\n","import {\n NgModule,\n ModuleWithProviders,\n EnvironmentProviders,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { ɵgetProviders } from './providers';\nimport { NgxsWebSocketPluginOptions } from './symbols';\n\n@NgModule()\nexport class NgxsWebSocketPluginModule {\n static forRoot(\n options?: NgxsWebSocketPluginOptions\n ): ModuleWithProviders<NgxsWebSocketPluginModule> {\n return {\n ngModule: NgxsWebSocketPluginModule,\n providers: ɵgetProviders(options)\n };\n }\n}\n\nexport function withNgxsWebSocketPlugin(\n options?: NgxsWebSocketPluginOptions\n): EnvironmentProviders {\n return makeEnvironmentProviders(ɵgetProviders(options));\n}\n","/**\n * The public api for consumers of @ngxs/websocket-plugin\n */\nexport * from './src/public_api';\n\n/**\n * The private api for consumers of @ngxs/websocket-plugin\n */\nexport * from './src/private_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@ngxs/websocket-plugin",
3
3
  "description": "WebSocket plugin for @ngxs/store",
4
- "version": "18.1.6",
4
+ "version": "19.0.0",
5
5
  "sideEffects": true,
6
6
  "peerDependencies": {
7
- "@ngxs/store": "^18.1.6 || ^18.1.6-dev",
8
- "@angular/core": ">=16.0.0 <19.0.0",
7
+ "@ngxs/store": "^19.0.0 || ^19.0.0-dev",
8
+ "@angular/core": ">=19.0.0 <20.0.0",
9
9
  "rxjs": ">=6.5.5"
10
10
  },
11
11
  "module": "fesm2022/ngxs-websocket-plugin.mjs",
@@ -16,8 +16,6 @@
16
16
  },
17
17
  ".": {
18
18
  "types": "./index.d.ts",
19
- "esm2022": "./esm2022/ngxs-websocket-plugin.mjs",
20
- "esm": "./esm2022/ngxs-websocket-plugin.mjs",
21
19
  "default": "./fesm2022/ngxs-websocket-plugin.mjs"
22
20
  }
23
21
  },
package/esm2022/index.mjs DELETED
@@ -1,9 +0,0 @@
1
- /**
2
- * The public api for consumers of @ngxs/websocket-plugin
3
- */
4
- export * from './src/public_api';
5
- /**
6
- * The private api for consumers of @ngxs/websocket-plugin
7
- */
8
- export * from './src/private_api';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy93ZWJzb2NrZXQtcGx1Z2luL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQzs7R0FFRztBQUNILGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBwdWJsaWMgYXBpIGZvciBjb25zdW1lcnMgb2YgQG5neHMvd2Vic29ja2V0LXBsdWdpblxuICovXG5leHBvcnQgKiBmcm9tICcuL3NyYy9wdWJsaWNfYXBpJztcblxuLyoqXG4gKiBUaGUgcHJpdmF0ZSBhcGkgZm9yIGNvbnN1bWVycyBvZiBAbmd4cy93ZWJzb2NrZXQtcGx1Z2luXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vc3JjL3ByaXZhdGVfYXBpJztcbiJdfQ==
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4cy13ZWJzb2NrZXQtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvd2Vic29ja2V0LXBsdWdpbi9uZ3hzLXdlYnNvY2tldC1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -1,2 +0,0 @@
1
- export { NGXS_WEBSOCKET_OPTIONS as ɵNGXS_WEBSOCKET_OPTIONS } from './symbols';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZV9hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy93ZWJzb2NrZXQtcGx1Z2luL3NyYy9wcml2YXRlX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLElBQUksdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBOR1hTX1dFQlNPQ0tFVF9PUFRJT05TIGFzIMm1TkdYU19XRUJTT0NLRVRfT1BUSU9OUyB9IGZyb20gJy4vc3ltYm9scyc7XG4iXX0=
@@ -1,34 +0,0 @@
1
- import { APP_INITIALIZER } from '@angular/core';
2
- import { WebSocketHandler } from './websocket-handler';
3
- import { USER_OPTIONS, NGXS_WEBSOCKET_OPTIONS } from './symbols';
4
- export function ɵwebsocketOptionsFactory(options) {
5
- return {
6
- reconnectInterval: 5000,
7
- reconnectAttempts: 10,
8
- typeKey: 'type',
9
- deserializer(e) {
10
- return JSON.parse(e.data);
11
- },
12
- serializer(value) {
13
- return JSON.stringify(value);
14
- },
15
- ...options
16
- };
17
- }
18
- export function ɵgetProviders(options) {
19
- return [
20
- { provide: USER_OPTIONS, useValue: options },
21
- {
22
- provide: NGXS_WEBSOCKET_OPTIONS,
23
- useFactory: ɵwebsocketOptionsFactory,
24
- deps: [USER_OPTIONS]
25
- },
26
- {
27
- provide: APP_INITIALIZER,
28
- useFactory: () => () => { },
29
- deps: [WebSocketHandler],
30
- multi: true
31
- }
32
- ];
33
- }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvd2Vic29ja2V0LXBsdWdpbi9zcmMvcHJvdmlkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBOEIsTUFBTSxXQUFXLENBQUM7QUFFN0YsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE9BQW1DO0lBQzFFLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsT0FBTyxFQUFFLE1BQU07UUFDZixZQUFZLENBQUMsQ0FBZTtZQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxVQUFVLENBQUMsS0FBVTtZQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFvQztJQUNoRSxPQUFPO1FBQ0wsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7UUFDNUM7WUFDRSxPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLFVBQVUsRUFBRSx3QkFBd0I7WUFDcEMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDO1NBQ3JCO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQztZQUMxQixJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN4QixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUFBfSU5JVElBTElaRVIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgV2ViU29ja2V0SGFuZGxlciB9IGZyb20gJy4vd2Vic29ja2V0LWhhbmRsZXInO1xuaW1wb3J0IHsgVVNFUl9PUFRJT05TLCBOR1hTX1dFQlNPQ0tFVF9PUFRJT05TLCBOZ3hzV2ViU29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gJy4vc3ltYm9scyc7XG5cbmV4cG9ydCBmdW5jdGlvbiDJtXdlYnNvY2tldE9wdGlvbnNGYWN0b3J5KG9wdGlvbnM6IE5neHNXZWJTb2NrZXRQbHVnaW5PcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgcmVjb25uZWN0SW50ZXJ2YWw6IDUwMDAsXG4gICAgcmVjb25uZWN0QXR0ZW1wdHM6IDEwLFxuICAgIHR5cGVLZXk6ICd0eXBlJyxcbiAgICBkZXNlcmlhbGl6ZXIoZTogTWVzc2FnZUV2ZW50KSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgIH0sXG4gICAgc2VyaWFsaXplcih2YWx1ZTogYW55KSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH0sXG4gICAgLi4ub3B0aW9uc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gybVnZXRQcm92aWRlcnMob3B0aW9ucz86IE5neHNXZWJTb2NrZXRQbHVnaW5PcHRpb25zKSB7XG4gIHJldHVybiBbXG4gICAgeyBwcm92aWRlOiBVU0VSX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdYU19XRUJTT0NLRVRfT1BUSU9OUyxcbiAgICAgIHVzZUZhY3Rvcnk6IMm1d2Vic29ja2V0T3B0aW9uc0ZhY3RvcnksXG4gICAgICBkZXBzOiBbVVNFUl9PUFRJT05TXVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4gKCkgPT4ge30sXG4gICAgICBkZXBzOiBbV2ViU29ja2V0SGFuZGxlcl0sXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXTtcbn1cbiJdfQ==
@@ -1,3 +0,0 @@
1
- export { NgxsWebSocketPluginModule, withNgxsWebSocketPlugin } from './websocket.module';
2
- export { ConnectWebSocket, WebSocketMessageError, DisconnectWebSocket, WebSocketDisconnected, SendWebSocketMessage, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEYsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsMEJBQTBCLEVBQzFCLGtCQUFrQixFQUNuQixNQUFNLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IE5neHNXZWJTb2NrZXRQbHVnaW5Nb2R1bGUsIHdpdGhOZ3hzV2ViU29ja2V0UGx1Z2luIH0gZnJvbSAnLi93ZWJzb2NrZXQubW9kdWxlJztcbmV4cG9ydCB7XG4gIENvbm5lY3RXZWJTb2NrZXQsXG4gIFdlYlNvY2tldE1lc3NhZ2VFcnJvcixcbiAgRGlzY29ubmVjdFdlYlNvY2tldCxcbiAgV2ViU29ja2V0RGlzY29ubmVjdGVkLFxuICBTZW5kV2ViU29ja2V0TWVzc2FnZSxcbiAgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQsXG4gIFdlYlNvY2tldENvbm5lY3RlZFxufSBmcm9tICcuL3N5bWJvbHMnO1xuIl19
@@ -1,64 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- export const NGXS_WEBSOCKET_OPTIONS = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'NGXS_WEBSOCKET_OPTIONS' : '');
3
- export const USER_OPTIONS = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'USER_OPTIONS' : '');
4
- /**
5
- * Action to connect to the websocket. Optionally pass a URL.
6
- */
7
- export class ConnectWebSocket {
8
- static { this.type = '[WebSocket] Connect'; }
9
- constructor(payload) {
10
- this.payload = payload;
11
- }
12
- }
13
- /**
14
- * Action triggered when a error ocurrs
15
- */
16
- export class WebSocketMessageError {
17
- static { this.type = '[WebSocket] Message Error'; }
18
- constructor(payload) {
19
- this.payload = payload;
20
- }
21
- }
22
- /**
23
- * Action to disconnect the websocket.
24
- */
25
- export class DisconnectWebSocket {
26
- static { this.type = '[WebSocket] Disconnect'; }
27
- }
28
- /**
29
- * Action triggered when websocket is connected
30
- */
31
- export class WebSocketConnected {
32
- static { this.type = '[WebSocket] Connected'; }
33
- }
34
- /**
35
- * Action triggered when websocket is disconnected
36
- */
37
- export class WebSocketDisconnected {
38
- static { this.type = '[WebSocket] Disconnected'; }
39
- }
40
- /**
41
- * Action to send to the server.
42
- */
43
- export class SendWebSocketMessage {
44
- static { this.type = '[WebSocket] Send Message'; }
45
- constructor(payload) {
46
- this.payload = payload;
47
- }
48
- }
49
- /**
50
- * Action dispatched when the user tries to connect if the connection already exists.
51
- */
52
- export class WebSocketConnectionUpdated {
53
- static { this.type = '[WebSocket] Connection Updated'; }
54
- }
55
- /**
56
- * This error is thrown where there is no `type` (or custom `typeKey`) property
57
- * on the message that came from the server side socket
58
- */
59
- export class TypeKeyPropertyMissingError extends Error {
60
- constructor(typeKey) {
61
- super(`Property ${typeKey} is missing on the socket message`);
62
- }
63
- }
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltYm9scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3N5bWJvbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkvQyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDOUUsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FDNUMsT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3BFLENBQUM7QUFvREY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO2FBQ1gsU0FBSSxHQUFHLHFCQUFxQixDQUFDO0lBRTdDLFlBQW1CLE9BQW9DO1FBQXBDLFlBQU8sR0FBUCxPQUFPLENBQTZCO0lBQUcsQ0FBQzs7QUFHN0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8scUJBQXFCO2FBQ2hCLFNBQUksR0FBRywyQkFBMkIsQ0FBQztJQUVuRCxZQUFtQixPQUFZO1FBQVosWUFBTyxHQUFQLE9BQU8sQ0FBSztJQUFHLENBQUM7O0FBR3JDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjthQUNkLFNBQUksR0FBRyx3QkFBd0IsQ0FBQzs7QUFHbEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO2FBQ2IsU0FBSSxHQUFHLHVCQUF1QixDQUFDOztBQUdqRDs7R0FFRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7YUFDaEIsU0FBSSxHQUFHLDBCQUEwQixDQUFDOztBQUdwRDs7R0FFRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7YUFDZixTQUFJLEdBQUcsMEJBQTBCLENBQUM7SUFFbEQsWUFBbUIsT0FBWTtRQUFaLFlBQU8sR0FBUCxPQUFPLENBQUs7SUFBRyxDQUFDOztBQUdyQzs7R0FFRztBQUNILE1BQU0sT0FBTywwQkFBMEI7YUFDckIsU0FBSSxHQUFHLGdDQUFnQyxDQUFDOztBQUcxRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsS0FBSztJQUNwRCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLFlBQVksT0FBTyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmRlY2xhcmUgY29uc3QgbmdEZXZNb2RlOiBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgTkdYU19XRUJTT0NLRVRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ3hzV2ViU29ja2V0UGx1Z2luT3B0aW9ucz4oXG4gIHR5cGVvZiBuZ0Rldk1vZGUgIT09ICd1bmRlZmluZWQnICYmIG5nRGV2TW9kZSA/ICdOR1hTX1dFQlNPQ0tFVF9PUFRJT05TJyA6ICcnXG4pO1xuXG5leHBvcnQgY29uc3QgVVNFUl9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKFxuICB0eXBlb2YgbmdEZXZNb2RlICE9PSAndW5kZWZpbmVkJyAmJiBuZ0Rldk1vZGUgPyAnVVNFUl9PUFRJT05TJyA6ICcnXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5neHNXZWJTb2NrZXRQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFVSTCBvZiB0aGUgd2Vic29ja2V0LlxuICAgKi9cbiAgdXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFaXRoZXIgYSBzaW5nbGUgcHJvdG9jb2wgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHByb3RvY29sIHN0cmluZ3MuXG4gICAqIFRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgdG8gaW5kaWNhdGUgc3ViLXByb3RvY29scywgc28gdGhhdCBhIHNpbmdsZSBzZXJ2ZXJcbiAgICogY2FuIGltcGxlbWVudCBtdWx0aXBsZSBXZWJTb2NrZXQgc3ViLXByb3RvY29scyAoZm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IG9uZSBzZXJ2ZXIgdG8gYmUgYWJsZVxuICAgKiB0byBoYW5kbGUgZGlmZmVyZW50IHR5cGVzIG9mIGludGVyYWN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBwcm90b2NvbCkuXG4gICAqIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgcHJvdG9jb2wgc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcgaXMgYXNzdW1lZC5cbiAgICovXG4gIHByb3RvY29sPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGBiaW5hcnlUeXBlYCBwcm9wZXJ0eSBvZiB0aGUgdW5kZXJseWluZyBXZWJTb2NrZXQuXG4gICAqL1xuICBiaW5hcnlUeXBlPzogJ2Jsb2InIHwgJ2FycmF5YnVmZmVyJztcblxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG5hbWUgdG8gZGlzdGlndW5pc2ggdGhpcyB0eXBlIGZvciB0aGUgc3RvcmUuXG4gICAqIERlZmF1bHQ6ICd0eXBlJ1xuICAgKi9cbiAgdHlwZUtleT86IHN0cmluZztcblxuICAvKipcbiAgICogSW50ZXJ2YWwgdG8gdHJ5IGFuZCByZWNvbm5lY3QuXG4gICAqIERlZmF1bHQ6IDUwMDBcbiAgICovXG4gIHJlY29ubmVjdEludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVjb25uZWN0IGF0dGVtcHMuXG4gICAqIERlZmF1bHQ6IDEwXG4gICAqL1xuICByZWNvbm5lY3RBdHRlbXB0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogU2VyaWFsaXplciB0byBjYWxsIGJlZm9yZSBzZW5kaW5nIG1lc3NhZ2VzXG4gICAqIERlZmF1bHQ6IGBqc29uLnN0cmluZ2lmeWBcbiAgICovXG4gIHNlcmlhbGl6ZXI/OiAoZGF0YTogYW55KSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2VyYWxpemVyIGJlZm9yZSBwdWJsaXNoaW5nIHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgZGVzZXJpYWxpemVyPzogKGU6IE1lc3NhZ2VFdmVudCkgPT4gYW55O1xufVxuXG4vKipcbiAqIEFjdGlvbiB0byBjb25uZWN0IHRvIHRoZSB3ZWJzb2NrZXQuIE9wdGlvbmFsbHkgcGFzcyBhIFVSTC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbm5lY3RXZWJTb2NrZXQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBDb25uZWN0JztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGF5bG9hZD86IE5neHNXZWJTb2NrZXRQbHVnaW5PcHRpb25zKSB7fVxufVxuXG4vKipcbiAqIEFjdGlvbiB0cmlnZ2VyZWQgd2hlbiBhIGVycm9yIG9jdXJyc1xuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZUVycm9yIHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW1dlYlNvY2tldF0gTWVzc2FnZSBFcnJvcic7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBheWxvYWQ6IGFueSkge31cbn1cblxuLyoqXG4gKiBBY3Rpb24gdG8gZGlzY29ubmVjdCB0aGUgd2Vic29ja2V0LlxuICovXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdFdlYlNvY2tldCB7XG4gIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tXZWJTb2NrZXRdIERpc2Nvbm5lY3QnO1xufVxuXG4vKipcbiAqIEFjdGlvbiB0cmlnZ2VyZWQgd2hlbiB3ZWJzb2NrZXQgaXMgY29ubmVjdGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRDb25uZWN0ZWQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBDb25uZWN0ZWQnO1xufVxuXG4vKipcbiAqIEFjdGlvbiB0cmlnZ2VyZWQgd2hlbiB3ZWJzb2NrZXQgaXMgZGlzY29ubmVjdGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXREaXNjb25uZWN0ZWQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbV2ViU29ja2V0XSBEaXNjb25uZWN0ZWQnO1xufVxuXG4vKipcbiAqIEFjdGlvbiB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZW5kV2ViU29ja2V0TWVzc2FnZSB7XG4gIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tXZWJTb2NrZXRdIFNlbmQgTWVzc2FnZSc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBheWxvYWQ6IGFueSkge31cbn1cblxuLyoqXG4gKiBBY3Rpb24gZGlzcGF0Y2hlZCB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIGNvbm5lY3QgaWYgdGhlIGNvbm5lY3Rpb24gYWxyZWFkeSBleGlzdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCB7XG4gIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tXZWJTb2NrZXRdIENvbm5lY3Rpb24gVXBkYXRlZCc7XG59XG5cbi8qKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlcmUgdGhlcmUgaXMgbm8gYHR5cGVgIChvciBjdXN0b20gYHR5cGVLZXlgKSBwcm9wZXJ0eVxuICogb24gdGhlIG1lc3NhZ2UgdGhhdCBjYW1lIGZyb20gdGhlIHNlcnZlciBzaWRlIHNvY2tldFxuICovXG5leHBvcnQgY2xhc3MgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0eXBlS2V5OiBzdHJpbmcpIHtcbiAgICBzdXBlcihgUHJvcGVydHkgJHt0eXBlS2V5fSBpcyBtaXNzaW5nIG9uIHRoZSBzb2NrZXQgbWVzc2FnZWApO1xuICB9XG59XG4iXX0=
@@ -1,145 +0,0 @@
1
- import { Injectable, NgZone, inject, DestroyRef } from '@angular/core';
2
- import { Actions, Store, ofActionDispatched } from '@ngxs/store';
3
- import { getValue } from '@ngxs/store/plugins';
4
- import { ReplaySubject, Subject, fromEvent, takeUntil } from 'rxjs';
5
- import { ConnectWebSocket, DisconnectWebSocket, SendWebSocketMessage, NGXS_WEBSOCKET_OPTIONS, WebSocketMessageError, WebSocketDisconnected, TypeKeyPropertyMissingError, WebSocketConnectionUpdated, WebSocketConnected } from './symbols';
6
- import * as i0 from "@angular/core";
7
- export class WebSocketHandler {
8
- constructor() {
9
- this._store = inject(Store);
10
- this._ngZone = inject(NgZone);
11
- this._actions$ = inject(Actions);
12
- this._options = inject(NGXS_WEBSOCKET_OPTIONS);
13
- this._socket = null;
14
- this._socketClosed$ = new Subject();
15
- this._typeKey = this._options.typeKey;
16
- this._destroy$ = new ReplaySubject(1);
17
- this._setupActionsListeners();
18
- const destroyRef = inject(DestroyRef);
19
- destroyRef.onDestroy(() => {
20
- this._closeConnection(/* forcelyCloseSocket */ true);
21
- this._destroy$.next();
22
- });
23
- }
24
- _setupActionsListeners() {
25
- this._actions$
26
- .pipe(ofActionDispatched(ConnectWebSocket), takeUntil(this._destroy$))
27
- .subscribe(({ payload }) => {
28
- this.connect(payload);
29
- });
30
- this._actions$
31
- .pipe(ofActionDispatched(DisconnectWebSocket), takeUntil(this._destroy$))
32
- .subscribe(() => {
33
- this._disconnect(/* forcelyCloseSocket */ true);
34
- });
35
- this._actions$
36
- .pipe(ofActionDispatched(SendWebSocketMessage), takeUntil(this._destroy$))
37
- .subscribe(({ payload }) => {
38
- this.send(payload);
39
- });
40
- }
41
- connect(options) {
42
- if (this._socket) {
43
- this._closeConnection(/* forcelyCloseSocket */ true);
44
- this._store.dispatch(new WebSocketConnectionUpdated());
45
- }
46
- // TODO(arturovt): we should not override default config values because this breaks support for having multiple socket connections.
47
- if (options) {
48
- if (options.serializer) {
49
- this._options.serializer = options.serializer;
50
- }
51
- if (options.deserializer) {
52
- this._options.deserializer = options.deserializer;
53
- }
54
- }
55
- this._ngZone.runOutsideAngular(() => {
56
- // We either use options provided in the `ConnectWebSocket` action
57
- // or fallback to default config values.
58
- const url = options?.url || this._options.url;
59
- const protocol = options?.protocol || this._options.protocol;
60
- const binaryType = options?.binaryType || this._options.binaryType;
61
- const socket = (this._socket = protocol
62
- ? new WebSocket(url, protocol)
63
- : new WebSocket(url));
64
- if (binaryType) {
65
- socket.binaryType = binaryType;
66
- }
67
- fromEvent(socket, 'open')
68
- .pipe(takeUntil(this._socketClosed$))
69
- .subscribe(() => this._store.dispatch(new WebSocketConnected()));
70
- fromEvent(socket, 'message')
71
- .pipe(takeUntil(this._socketClosed$))
72
- .subscribe(event => {
73
- const message = this._options.deserializer(event);
74
- const type = getValue(message, this._typeKey);
75
- if (!type) {
76
- throw new TypeKeyPropertyMissingError(this._typeKey);
77
- }
78
- this._store.dispatch({ ...message, type });
79
- });
80
- fromEvent(socket, 'error')
81
- .pipe(takeUntil(this._socketClosed$))
82
- .subscribe(error => {
83
- // The error event indicates that an error has occurred during the
84
- // WebSocket communication, and it is often appropriate to close the
85
- // WebSocket connection when such an error occurs.
86
- // We need to call `_disconnect()` after the error event has been fired.
87
- // This ensures that the WebSocket connection is properly closed to prevent
88
- // potential resource leaks.
89
- this._disconnect(/* forcelyCloseSocket */ true);
90
- this._store.dispatch(new WebSocketMessageError(error));
91
- });
92
- fromEvent(socket, 'close')
93
- .pipe(takeUntil(this._socketClosed$))
94
- .subscribe(event => {
95
- if (event.wasClean) {
96
- // It is not necessary to call `socket.close()` after the `close` event
97
- // has been fired. In fact, calling `socket.close()` within the `close`
98
- // event handler or immediately after the event has been fired can lead
99
- // to unexpected behavior.
100
- this._disconnect(/* forcelyCloseSocket */ false);
101
- }
102
- else {
103
- // If the WebSocket `close` event has been fired and its `wasClean`
104
- // property is falsy, it indicates that the WebSocket connection was
105
- // closed in an unexpected or abnormal manner.
106
- // We should call `socket.close()` in this scenario, we can ensure that
107
- // the WebSocket connection is properly closed.
108
- this._disconnect(/* forcelyCloseSocket */ true);
109
- this._store.dispatch(new WebSocketMessageError(event));
110
- }
111
- });
112
- });
113
- }
114
- _disconnect(forcelyCloseSocket) {
115
- if (this._socket) {
116
- this._closeConnection(forcelyCloseSocket);
117
- this._store.dispatch(new WebSocketDisconnected());
118
- }
119
- }
120
- send(data) {
121
- if (!this._socket) {
122
- throw new Error('You must connect to the socket before sending any data');
123
- }
124
- try {
125
- this._socket.send(this._options.serializer(data));
126
- }
127
- catch (error) {
128
- this._store.dispatch(new WebSocketMessageError(error));
129
- }
130
- }
131
- _closeConnection(forcelyCloseSocket) {
132
- if (forcelyCloseSocket) {
133
- this._socket?.close();
134
- }
135
- this._socket = null;
136
- this._socketClosed$.next();
137
- }
138
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: WebSocketHandler, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
139
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: WebSocketHandler, providedIn: 'root' }); }
140
- }
141
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: WebSocketHandler, decorators: [{
142
- type: Injectable,
143
- args: [{ providedIn: 'root' }]
144
- }], ctorParameters: () => [] });
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy93ZWJzb2NrZXQtcGx1Z2luL3NyYy93ZWJzb2NrZXQtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsRUFFdEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLGtCQUFrQixFQUNuQixNQUFNLFdBQVcsQ0FBQzs7QUFHbkIsTUFBTSxPQUFPLGdCQUFnQjtJQWMzQjtRQWJRLFdBQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixjQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLGFBQVEsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUUxQyxZQUFPLEdBQXFCLElBQUksQ0FBQztRQUV4QixtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFckMsYUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBUSxDQUFDO1FBRWxDLGNBQVMsR0FBRyxJQUFJLGFBQWEsQ0FBTyxDQUFDLENBQUMs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QU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLGtCQUEyQjtRQUNsRCxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO2lJQXZKVSxnQkFBZ0I7cUlBQWhCLGdCQUFnQixjQURILE1BQU07OzJGQUNuQixnQkFBZ0I7a0JBRDVCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBpbmplY3QsIERlc3Ryb3lSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbnMsIFN0b3JlLCBvZkFjdGlvbkRpc3BhdGNoZWQgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBnZXRWYWx1ZSB9IGZyb20gJ0BuZ3hzL3N0b3JlL3BsdWdpbnMnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgZnJvbUV2ZW50LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgQ29ubmVjdFdlYlNvY2tldCxcbiAgRGlzY29ubmVjdFdlYlNvY2tldCxcbiAgU2VuZFdlYlNvY2tldE1lc3NhZ2UsXG4gIE5HWFNfV0VCU09DS0VUX09QVElPTlMsXG4gIE5neHNXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxuICBXZWJTb2NrZXRNZXNzYWdlRXJyb3IsXG4gIFdlYlNvY2tldERpc2Nvbm5lY3RlZCxcbiAgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yLFxuICBXZWJTb2NrZXRDb25uZWN0aW9uVXBkYXRlZCxcbiAgV2ViU29ja2V0Q29ubmVjdGVkXG59IGZyb20gJy4vc3ltYm9scyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0SGFuZGxlciB7XG4gIHByaXZhdGUgX3N0b3JlID0gaW5qZWN0KFN0b3JlKTtcbiAgcHJpdmF0ZSBfbmdab25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgX2FjdGlvbnMkID0gaW5qZWN0KEFjdGlvbnMpO1xuICBwcml2YXRlIF9vcHRpb25zID0gaW5qZWN0KE5HWFNfV0VCU09DS0VUX09QVElPTlMpO1xuXG4gIHByaXZhdGUgX3NvY2tldDogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc29ja2V0Q2xvc2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZUtleSA9IHRoaXMuX29wdGlvbnMudHlwZUtleSE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zZXR1cEFjdGlvbnNMaXN0ZW5lcnMoKTtcblxuICAgIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgdGhpcy5fY2xvc2VDb25uZWN0aW9uKC8qIGZvcmNlbHlDbG9zZVNvY2tldCAqLyB0cnVlKTtcbiAgICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwQWN0aW9uc0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3Rpb25zJFxuICAgICAgLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKENvbm5lY3RXZWJTb2NrZXQpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBwYXlsb2FkIH0pID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0KHBheWxvYWQpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9hY3Rpb25zJFxuICAgICAgLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKERpc2Nvbm5lY3RXZWJTb2NrZXQpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Rpc2Nvbm5lY3QoLyogZm9yY2VseUNsb3NlU29ja2V0ICovIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9hY3Rpb25zJFxuICAgICAgLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKFNlbmRXZWJTb2NrZXRNZXNzYWdlKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgIHRoaXMuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25uZWN0KG9wdGlvbnM/OiBOZ3hzV2ViU29ja2V0UGx1Z2luT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRoaXMuX2Nsb3NlQ29ubmVjdGlvbigvKiBmb3JjZWx5Q2xvc2VTb2NrZXQgKi8gdHJ1ZSk7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0Q29ubmVjdGlvblVwZGF0ZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyhhcnR1cm92dCk6IHdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgZGVmYXVsdCBjb25maWcgdmFsdWVzIGJlY2F1c2UgdGhpcyBicmVha3Mgc3VwcG9ydCBmb3IgaGF2aW5nIG11bHRpcGxlIHNvY2tldCBjb25uZWN0aW9ucy5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsaXplcikge1xuICAgICAgICB0aGlzLl9vcHRpb25zLnNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmRlc2VyaWFsaXplcikge1xuICAgICAgICB0aGlzLl9vcHRpb25zLmRlc2VyaWFsaXplciA9IG9wdGlvbnMuZGVzZXJpYWxpemVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAvLyBXZSBlaXRoZXIgdXNlIG9wdGlvbnMgcHJvdmlkZWQgaW4gdGhlIGBDb25uZWN0V2ViU29ja2V0YCBhY3Rpb25cbiAgICAgIC8vIG9yIGZhbGxiYWNrIHRvIGRlZmF1bHQgY29uZmlnIHZhbHVlcy5cbiAgICAgIGNvbnN0IHVybCA9IG9wdGlvbnM/LnVybCB8fCB0aGlzLl9vcHRpb25zLnVybCE7XG4gICAgICBjb25zdCBwcm90b2NvbCA9IG9wdGlvbnM/LnByb3RvY29sIHx8IHRoaXMuX29wdGlvbnMucHJvdG9jb2w7XG4gICAgICBjb25zdCBiaW5hcnlUeXBlID0gb3B0aW9ucz8uYmluYXJ5VHlwZSB8fCB0aGlzLl9vcHRpb25zLmJpbmFyeVR5cGU7XG5cbiAgICAgIGNvbnN0IHNvY2tldCA9ICh0aGlzLl9zb2NrZXQgPSBwcm90b2NvbFxuICAgICAgICA/IG5ldyBXZWJTb2NrZXQodXJsLCBwcm90b2NvbClcbiAgICAgICAgOiBuZXcgV2ViU29ja2V0KHVybCkpO1xuXG4gICAgICBpZiAoYmluYXJ5VHlwZSkge1xuICAgICAgICBzb2NrZXQuYmluYXJ5VHlwZSA9IGJpbmFyeVR5cGU7XG4gICAgICB9XG5cbiAgICAgIGZyb21FdmVudChzb2NrZXQsICdvcGVuJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3NvY2tldENsb3NlZCQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3N0b3JlLmRpc3BhdGNoKG5ldyBXZWJTb2NrZXRDb25uZWN0ZWQoKSkpO1xuXG4gICAgICBmcm9tRXZlbnQ8TWVzc2FnZUV2ZW50Pihzb2NrZXQsICdtZXNzYWdlJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3NvY2tldENsb3NlZCQpKVxuICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fb3B0aW9ucy5kZXNlcmlhbGl6ZXIhKGV2ZW50KTtcbiAgICAgICAgICBjb25zdCB0eXBlID0gZ2V0VmFsdWUobWVzc2FnZSwgdGhpcy5fdHlwZUtleSk7XG4gICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUtleVByb3BlcnR5TWlzc2luZ0Vycm9yKHRoaXMuX3R5cGVLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh7IC4uLm1lc3NhZ2UsIHR5cGUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICBmcm9tRXZlbnQoc29ja2V0LCAnZXJyb3InKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fc29ja2V0Q2xvc2VkJCkpXG4gICAgICAgIC5zdWJzY3JpYmUoZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBldmVudCBpbmRpY2F0ZXMgdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIHRoZVxuICAgICAgICAgIC8vIFdlYlNvY2tldCBjb21tdW5pY2F0aW9uLCBhbmQgaXQgaXMgb2Z0ZW4gYXBwcm9wcmlhdGUgdG8gY2xvc2UgdGhlXG4gICAgICAgICAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gd2hlbiBzdWNoIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgYF9kaXNjb25uZWN0KClgIGFmdGVyIHRoZSBlcnJvciBldmVudCBoYXMgYmVlbiBmaXJlZC5cbiAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgcHJvcGVybHkgY2xvc2VkIHRvIHByZXZlbnRcbiAgICAgICAgICAvLyBwb3RlbnRpYWwgcmVzb3VyY2UgbGVha3MuXG4gICAgICAgICAgdGhpcy5fZGlzY29ubmVjdCgvKiBmb3JjZWx5Q2xvc2VTb2NrZXQgKi8gdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldE1lc3NhZ2VFcnJvcihlcnJvcikpO1xuICAgICAgICB9KTtcblxuICAgICAgZnJvbUV2ZW50PENsb3NlRXZlbnQ+KHNvY2tldCwgJ2Nsb3NlJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3NvY2tldENsb3NlZCQpKVxuICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQud2FzQ2xlYW4pIHtcbiAgICAgICAgICAgIC8vIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgc29ja2V0LmNsb3NlKClgIGFmdGVyIHRoZSBgY2xvc2VgIGV2ZW50XG4gICAgICAgICAgICAvLyBoYXMgYmVlbiBmaXJlZC4gSW4gZmFjdCwgY2FsbGluZyBgc29ja2V0LmNsb3NlKClgIHdpdGhpbiB0aGUgYGNsb3NlYFxuICAgICAgICAgICAgLy8gZXZlbnQgaGFuZGxlciBvciBpbW1lZGlhdGVseSBhZnRlciB0aGUgZXZlbnQgaGFzIGJlZW4gZmlyZWQgY2FuIGxlYWRcbiAgICAgICAgICAgIC8vIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAgICAgICAgICB0aGlzLl9kaXNjb25uZWN0KC8qIGZvcmNlbHlDbG9zZVNvY2tldCAqLyBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgYGNsb3NlYCBldmVudCBoYXMgYmVlbiBmaXJlZCBhbmQgaXRzIGB3YXNDbGVhbmBcbiAgICAgICAgICAgIC8vIHByb3BlcnR5IGlzIGZhbHN5LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gd2FzXG4gICAgICAgICAgICAvLyBjbG9zZWQgaW4gYW4gdW5leHBlY3RlZCBvciBhYm5vcm1hbCBtYW5uZXIuXG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgY2FsbCBgc29ja2V0LmNsb3NlKClgIGluIHRoaXMgc2NlbmFyaW8sIHdlIGNhbiBlbnN1cmUgdGhhdFxuICAgICAgICAgICAgLy8gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIHByb3Blcmx5IGNsb3NlZC5cbiAgICAgICAgICAgIHRoaXMuX2Rpc2Nvbm5lY3QoLyogZm9yY2VseUNsb3NlU29ja2V0ICovIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldE1lc3NhZ2VFcnJvcihldmVudCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9kaXNjb25uZWN0KGZvcmNlbHlDbG9zZVNvY2tldDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRoaXMuX2Nsb3NlQ29ubmVjdGlvbihmb3JjZWx5Q2xvc2VTb2NrZXQpO1xuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gobmV3IFdlYlNvY2tldERpc2Nvbm5lY3RlZCgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbmQoZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgY29ubmVjdCB0byB0aGUgc29ja2V0IGJlZm9yZSBzZW5kaW5nIGFueSBkYXRhJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3NvY2tldC5zZW5kKHRoaXMuX29wdGlvbnMuc2VyaWFsaXplciEoZGF0YSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChuZXcgV2ViU29ja2V0TWVzc2FnZUVycm9yKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xvc2VDb25uZWN0aW9uKGZvcmNlbHlDbG9zZVNvY2tldDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmb3JjZWx5Q2xvc2VTb2NrZXQpIHtcbiAgICAgIHRoaXMuX3NvY2tldD8uY2xvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLl9zb2NrZXRDbG9zZWQkLm5leHQoKTtcbiAgfVxufVxuIl19
@@ -1,21 +0,0 @@
1
- import { NgModule, makeEnvironmentProviders } from '@angular/core';
2
- import { ɵgetProviders } from './providers';
3
- import * as i0 from "@angular/core";
4
- export class NgxsWebSocketPluginModule {
5
- static forRoot(options) {
6
- return {
7
- ngModule: NgxsWebSocketPluginModule,
8
- providers: ɵgetProviders(options)
9
- };
10
- }
11
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsWebSocketPluginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: NgxsWebSocketPluginModule }); }
13
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsWebSocketPluginModule }); }
14
- }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsWebSocketPluginModule, decorators: [{
16
- type: NgModule
17
- }] });
18
- export function withNgxsWebSocketPlugin(options) {
19
- return makeEnvironmentProviders(ɵgetProviders(options));
20
- }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dlYnNvY2tldC1wbHVnaW4vc3JjL3dlYnNvY2tldC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFFBQVEsRUFHUix3QkFBd0IsRUFDekIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFJNUMsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxNQUFNLENBQUMsT0FBTyxDQUNaLE9BQW9DO1FBRXBDLE9BQU87WUFDTCxRQUFRLEVBQUUseUJBQXlCO1lBQ25DLFNBQVMsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDO1NBQ2xDLENBQUM7SUFDSixDQUFDO2lJQVJVLHlCQUF5QjtrSUFBekIseUJBQXlCO2tJQUF6Qix5QkFBeUI7OzJGQUF6Qix5QkFBeUI7a0JBRHJDLFFBQVE7O0FBWVQsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxPQUFvQztJQUVwQyxPQUFPLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBOZ01vZHVsZSxcbiAgTW9kdWxlV2l0aFByb3ZpZGVycyxcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVyc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgybVnZXRQcm92aWRlcnMgfSBmcm9tICcuL3Byb3ZpZGVycyc7XG5pbXBvcnQgeyBOZ3hzV2ViU29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gJy4vc3ltYm9scyc7XG5cbkBOZ01vZHVsZSgpXG5leHBvcnQgY2xhc3MgTmd4c1dlYlNvY2tldFBsdWdpbk1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIG9wdGlvbnM/OiBOZ3hzV2ViU29ja2V0UGx1Z2luT3B0aW9uc1xuICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE5neHNXZWJTb2NrZXRQbHVnaW5Nb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neHNXZWJTb2NrZXRQbHVnaW5Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IMm1Z2V0UHJvdmlkZXJzKG9wdGlvbnMpXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aE5neHNXZWJTb2NrZXRQbHVnaW4oXG4gIG9wdGlvbnM/OiBOZ3hzV2ViU29ja2V0UGx1Z2luT3B0aW9uc1xuKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKMm1Z2V0UHJvdmlkZXJzKG9wdGlvbnMpKTtcbn1cbiJdfQ==