@nestjs/websockets 9.2.0 → 9.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  (The MIT License)
2
2
 
3
- Copyright (c) 2017-2022 Kamil Mysliwiec <https://kamilmysliwiec.com>
3
+ Copyright (c) 2017-2023 Kamil Mysliwiec <https://kamilmysliwiec.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
package/Readme.md CHANGED
@@ -78,7 +78,10 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
78
78
  <td>
79
79
  <a href="https://jetbrains.com/" target="_blank"><img src="https://nestjs.com/img/jetbrains-logo.svg" width="110" valign="middle" /></a></td><td>
80
80
  <a href="https://snyk.co/nestjs" target="_blank"><img src="https://nestjs.com/img/snyk-logo-black.png" width="185" valign="middle" /></a></td><td>
81
- <a href="https://fuseautotech.com/" target="_blank"><img src="https://nestjs.com/img/fuse-logo.svg" width="105" valign="middle" /></a></td></</tr></table>
81
+ <a href="https://fuseautotech.com/" target="_blank"><img src="https://nestjs.com/img/fuse-logo.svg" width="105" valign="middle" /></a></td>
82
+ <td>
83
+ <a href="https://ridicorp.com/career/" target="_blank"><img src="https://nestjs.com/img/ridi-logo.svg" width="105" valign="middle" /></a></td><td>
84
+ <a href="https://www.movavi.com/imovie-for-windows.html" target="_blank"><img src="https://nestjs.com/img/movavi-logo.svg" width="105" valign="middle" /></a></td></</tr></table>
82
85
 
83
86
  #### Silver Sponsors
84
87
 
@@ -91,7 +94,8 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
91
94
  <td><a href="https://www.tinystacks.com" target="_blank"><img src="https://nestjs.com/img/tinystacks-logo.png#1" width="140" valign="middle" /></td>
92
95
  <td><a href="https://n.inc" target="_blank"><img src="https://nestjs.com/img/n-inc-logo.svg" width="120" valign="middle" /></td></tr><tr>
93
96
  <td><a href="https://bilberrry.com/" target="_blank"><img src="https://nestjs.com/img/bilberrry-logo.svg" width="180" valign="middle" /></td>
94
- <td><a href="https://ipinfo.ai/" target="_blank"><img src="https://nestjs.com/img/ipinfo-logo.png" width="130" valign="middle" /></td></tr>
97
+ <td><a href="https://ipinfo.ai/" target="_blank"><img src="https://nestjs.com/img/ipinfo-logo.png" width="130" valign="middle" /></td>
98
+ <td><a href="https://chax.at" target="_blank"><img src="https://nestjs.com/img/chaxat-logo.png" width="100" valign="middle" /></td></tr>
95
99
  </table>
96
100
 
97
101
  #### Sponsors
@@ -132,7 +136,8 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
132
136
  <td align="center" valign="middle"><a href="https://mobilereality.pl/" target="_blank"><img src="https://nestjs.com/img/mobile-reality-logo.png" width="45" valign="middle" /></a></td>
133
137
  <td align="center" valign="middle"><a href="https://boringowl.io/" target="_blank"><img src="https://nestjs.com/img/boringowl-logo.svg" width="120" valign="middle" /></a></td>
134
138
  <td align="center" valign="middle"><a href="https://www.mobilefactory.jp/" target="_blank"><img src="https://nestjs.com/img/mobilefactory-logo.png" width="100" valign="middle" /></a></td>
135
- <td align="center" valign="middle"><a href="https://db.nordbot.app/" target="_blank"><img src="https://nestjs.com/img/nord-logo.png" width="50" valign="middle" /></a></td>
139
+ <td align="center" valign="middle"><a href="https://nordbot.app/" target="_blank"><img src="https://nestjs.com/img/nordbot-logo.png" width="120" valign="middle" /></a></td>
140
+ <td align="center" valign="middle"><a href="https://doppio.sh/" target="_blank"><img src="https://nestjs.com/img/dopiosh-logo.png" width="50" valign="middle" /></a></td>
136
141
  </tr></table>
137
142
 
138
143
  ## Backers
@@ -0,0 +1,4 @@
1
+ export declare type WebsocketEntrypointMetadata = {
2
+ port: number;
3
+ message: unknown;
4
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestjs/websockets",
3
- "version": "9.2.0",
3
+ "version": "9.3.0-beta.1",
4
4
  "description": "Nest - modern, fast, powerful node.js web framework (@websockets)",
5
5
  "author": "Kamil Mysliwiec",
6
6
  "license": "MIT",
@@ -17,8 +17,8 @@
17
17
  "tslib": "2.4.1"
18
18
  },
19
19
  "devDependencies": {
20
- "@nestjs/common": "9.2.0",
21
- "@nestjs/core": "9.2.0"
20
+ "@nestjs/common": "^9.3.0-beta.1",
21
+ "@nestjs/core": "^9.3.0-beta.1"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "@nestjs/common": "^9.0.0",
@@ -1,15 +1,18 @@
1
1
  import { Injectable } from '@nestjs/common/interfaces/injectable.interface';
2
+ import { NestApplicationContextOptions } from '@nestjs/common/interfaces/nest-application-context-options.interface';
2
3
  import { ApplicationConfig } from '@nestjs/core/application-config';
3
4
  import { NestContainer } from '@nestjs/core/injector/container';
4
5
  import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
5
6
  import { InstanceToken } from '@nestjs/core/injector/module';
6
- export declare class SocketModule<HttpServer = any> {
7
+ import { GraphInspector } from '@nestjs/core/inspector/graph-inspector';
8
+ export declare class SocketModule<THttpServer = any, TAppOptions extends NestApplicationContextOptions = NestApplicationContextOptions> {
7
9
  private readonly socketsContainer;
8
10
  private applicationConfig;
9
11
  private webSocketsController;
10
12
  private isAdapterInitialized;
11
13
  private httpServer;
12
- register(container: NestContainer, config: ApplicationConfig, httpServer?: HttpServer): void;
14
+ private appOptions;
15
+ register(container: NestContainer, applicationConfig: ApplicationConfig, graphInspector: GraphInspector, appOptions: TAppOptions, httpServer?: THttpServer): void;
13
16
  connectAllGateways(providers: Map<InstanceToken, InstanceWrapper<Injectable>>, moduleName: string): void;
14
17
  connectGatewayToServer(wrapper: InstanceWrapper<Injectable>, moduleName: string): void;
15
18
  close(): Promise<any>;
package/socket-module.js CHANGED
@@ -20,12 +20,13 @@ class SocketModule {
20
20
  constructor() {
21
21
  this.socketsContainer = new sockets_container_1.SocketsContainer();
22
22
  }
23
- register(container, config, httpServer) {
24
- this.applicationConfig = config;
23
+ register(container, applicationConfig, graphInspector, appOptions, httpServer) {
24
+ this.applicationConfig = applicationConfig;
25
+ this.appOptions = appOptions;
25
26
  this.httpServer = httpServer;
26
27
  const contextCreator = this.getContextCreator(container);
27
- const serverProvider = new socket_server_provider_1.SocketServerProvider(this.socketsContainer, config);
28
- this.webSocketsController = new web_sockets_controller_1.WebSocketsController(serverProvider, config, contextCreator);
28
+ const serverProvider = new socket_server_provider_1.SocketServerProvider(this.socketsContainer, applicationConfig);
29
+ this.webSocketsController = new web_sockets_controller_1.WebSocketsController(serverProvider, applicationConfig, contextCreator, graphInspector, this.appOptions);
29
30
  const modules = container.getModules();
30
31
  modules.forEach(({ providers }, moduleName) => this.connectAllGateways(providers, moduleName));
31
32
  }
@@ -43,7 +44,7 @@ class SocketModule {
43
44
  if (!this.isAdapterInitialized) {
44
45
  this.initializeAdapter();
45
46
  }
46
- this.webSocketsController.connectGatewayToServer(instance, metatype, moduleName);
47
+ this.webSocketsController.connectGatewayToServer(instance, metatype, moduleName, wrapper.id);
47
48
  }
48
49
  async close() {
49
50
  if (!this.applicationConfig) {
@@ -0,0 +1,22 @@
1
+ {
2
+ "extends": "../tsconfig.build.json",
3
+ "compilerOptions": {
4
+ "outDir": ".",
5
+ "rootDir": ".",
6
+ "paths": {
7
+ "@nestjs/common": ["../common"],
8
+ "@nestjs/common/*": ["../common/*"],
9
+ "@nestjs/core": ["../core"],
10
+ "@nestjs/core/*": ["../core/*"]
11
+ }
12
+ },
13
+ "exclude": ["node_modules", "dist", "test/**/*", "*.spec.ts"],
14
+ "references": [
15
+ {
16
+ "path": "../common/tsconfig.build.json"
17
+ },
18
+ {
19
+ "path": "../core/tsconfig.build.json"
20
+ }
21
+ ]
22
+ }
@@ -1,5 +1,7 @@
1
+ import { NestApplicationContextOptions } from '@nestjs/common/interfaces/nest-application-context-options.interface';
1
2
  import { Type } from '@nestjs/common/interfaces/type.interface';
2
3
  import { ApplicationConfig } from '@nestjs/core/application-config';
4
+ import { GraphInspector } from '@nestjs/core/inspector/graph-inspector';
3
5
  import { Observable, Subject } from 'rxjs';
4
6
  import { WsContextCreator } from './context/ws-context-creator';
5
7
  import { MessageMappingProperties } from './gateway-metadata-explorer';
@@ -11,11 +13,13 @@ export declare class WebSocketsController {
11
13
  private readonly socketServerProvider;
12
14
  private readonly config;
13
15
  private readonly contextCreator;
16
+ private readonly graphInspector;
17
+ private readonly appOptions;
14
18
  private readonly logger;
15
19
  private readonly metadataExplorer;
16
- constructor(socketServerProvider: SocketServerProvider, config: ApplicationConfig, contextCreator: WsContextCreator);
17
- connectGatewayToServer(instance: NestGateway, metatype: Type<unknown> | Function, moduleKey: string): void;
18
- subscribeToServerEvents<T extends GatewayMetadata>(instance: NestGateway, options: T, port: number, moduleKey: string): void;
20
+ constructor(socketServerProvider: SocketServerProvider, config: ApplicationConfig, contextCreator: WsContextCreator, graphInspector: GraphInspector, appOptions?: NestApplicationContextOptions);
21
+ connectGatewayToServer(instance: NestGateway, metatype: Type<unknown> | Function, moduleKey: string, instanceWrapperId: string): void;
22
+ subscribeToServerEvents<T extends GatewayMetadata>(instance: NestGateway, options: T, port: number, moduleKey: string, instanceWrapperId: string): void;
19
23
  subscribeEvents(instance: NestGateway, subscribersMap: MessageMappingProperties[], observableServer: ServerAndEventStreamsHost): void;
20
24
  getConnectionHandler(context: WebSocketsController, instance: NestGateway, subscribersMap: MessageMappingProperties[], disconnect: Subject<any>, connection: Subject<any>): (...args: unknown[]) => void;
21
25
  subscribeInitEvent(instance: NestGateway, event: Subject<any>): void;
@@ -23,6 +27,7 @@ export declare class WebSocketsController {
23
27
  subscribeDisconnectEvent(instance: NestGateway, event: Subject<any>): void;
24
28
  subscribeMessages<T = any>(subscribersMap: MessageMappingProperties[], client: T, instance: NestGateway): void;
25
29
  pickResult(deferredResult: Promise<any>): Promise<Observable<any>>;
30
+ inspectEntrypointDefinitions(instance: NestGateway, port: number, messageHandlers: MessageMappingProperties[], instanceWrapperId: string): void;
26
31
  private assignServerToProperties;
27
32
  private printSubscriptionLogs;
28
33
  }
@@ -10,30 +10,36 @@ const invalid_socket_port_exception_1 = require("./errors/invalid-socket-port.ex
10
10
  const gateway_metadata_explorer_1 = require("./gateway-metadata-explorer");
11
11
  const compare_element_util_1 = require("./utils/compare-element.util");
12
12
  class WebSocketsController {
13
- constructor(socketServerProvider, config, contextCreator) {
13
+ constructor(socketServerProvider, config, contextCreator, graphInspector, appOptions = {}) {
14
14
  this.socketServerProvider = socketServerProvider;
15
15
  this.config = config;
16
16
  this.contextCreator = contextCreator;
17
+ this.graphInspector = graphInspector;
18
+ this.appOptions = appOptions;
17
19
  this.logger = new logger_service_1.Logger(WebSocketsController.name, {
18
20
  timestamp: true,
19
21
  });
20
22
  this.metadataExplorer = new gateway_metadata_explorer_1.GatewayMetadataExplorer(new metadata_scanner_1.MetadataScanner());
21
23
  }
22
- connectGatewayToServer(instance, metatype, moduleKey) {
24
+ connectGatewayToServer(instance, metatype, moduleKey, instanceWrapperId) {
23
25
  const options = Reflect.getMetadata(constants_1.GATEWAY_OPTIONS, metatype) || {};
24
26
  const port = Reflect.getMetadata(constants_1.PORT_METADATA, metatype) || 0;
25
27
  if (!Number.isInteger(port)) {
26
28
  throw new invalid_socket_port_exception_1.InvalidSocketPortException(port, metatype);
27
29
  }
28
- this.subscribeToServerEvents(instance, options, port, moduleKey);
30
+ this.subscribeToServerEvents(instance, options, port, moduleKey, instanceWrapperId);
29
31
  }
30
- subscribeToServerEvents(instance, options, port, moduleKey) {
32
+ subscribeToServerEvents(instance, options, port, moduleKey, instanceWrapperId) {
31
33
  const nativeMessageHandlers = this.metadataExplorer.explore(instance);
32
34
  const messageHandlers = nativeMessageHandlers.map(({ callback, message, methodName }) => ({
33
35
  message,
34
36
  methodName,
35
37
  callback: this.contextCreator.create(instance, callback, moduleKey, methodName),
36
38
  }));
39
+ this.inspectEntrypointDefinitions(instance, port, messageHandlers, instanceWrapperId);
40
+ if (this.appOptions.preview) {
41
+ return;
42
+ }
37
43
  const observableServer = this.socketServerProvider.scanForSocketServer(options, port);
38
44
  this.assignServerToProperties(instance, observableServer.server);
39
45
  this.subscribeEvents(instance, messageHandlers, observableServer);
@@ -96,6 +102,22 @@ class WebSocketsController {
96
102
  }
97
103
  return (0, rxjs_1.of)(result);
98
104
  }
105
+ inspectEntrypointDefinitions(instance, port, messageHandlers, instanceWrapperId) {
106
+ messageHandlers.forEach(handler => {
107
+ var _a;
108
+ this.graphInspector.insertEntrypointDefinition({
109
+ type: 'websocket',
110
+ methodName: handler.methodName,
111
+ className: (_a = instance.constructor) === null || _a === void 0 ? void 0 : _a.name,
112
+ classNodeId: instanceWrapperId,
113
+ metadata: {
114
+ port,
115
+ key: handler.message,
116
+ message: handler.message,
117
+ },
118
+ }, instanceWrapperId);
119
+ });
120
+ }
99
121
  assignServerToProperties(instance, server) {
100
122
  for (const propertyKey of this.metadataExplorer.scanForServerHooks(instance)) {
101
123
  Reflect.set(instance, propertyKey, server);