@nestjs/platform-ws 11.1.16 → 12.0.0-alpha.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/adapters/index.d.ts +1 -1
- package/adapters/index.js +1 -4
- package/adapters/ws-adapter.d.ts +2 -2
- package/adapters/ws-adapter.js +34 -31
- package/index.d.ts +1 -1
- package/index.js +1 -4
- package/package.json +10 -2
- package/tsconfig.build.json +1 -7
package/adapters/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './ws-adapter';
|
|
1
|
+
export * from './ws-adapter.js';
|
package/adapters/index.js
CHANGED
package/adapters/ws-adapter.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { INestApplicationContext, Logger } from '@nestjs/common';
|
|
1
|
+
import { type INestApplicationContext, Logger } from '@nestjs/common';
|
|
2
2
|
import { AbstractWsAdapter } from '@nestjs/websockets';
|
|
3
|
-
import { MessageMappingProperties } from '@nestjs/websockets/gateway-metadata-explorer';
|
|
4
3
|
import * as http from 'http';
|
|
5
4
|
import { Observable } from 'rxjs';
|
|
5
|
+
import type { MessageMappingProperties } from '@nestjs/websockets';
|
|
6
6
|
type WsServerRegistryEntry = any[];
|
|
7
7
|
type WsData = string | Buffer | ArrayBuffer | Buffer[];
|
|
8
8
|
type WsMessageParser = (data: WsData) => {
|
package/adapters/ws-adapter.js
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const http = require("http");
|
|
10
|
-
const rxjs_1 = require("rxjs");
|
|
11
|
-
const operators_1 = require("rxjs/operators");
|
|
1
|
+
import { Logger } from '@nestjs/common';
|
|
2
|
+
import { AbstractWsAdapter } from '@nestjs/websockets';
|
|
3
|
+
import * as http from 'http';
|
|
4
|
+
import { createRequire } from 'module';
|
|
5
|
+
import { EMPTY, fromEvent } from 'rxjs';
|
|
6
|
+
import { filter, first, mergeMap, share, takeUntil } from 'rxjs/operators';
|
|
7
|
+
import { loadPackageSync, isNil, normalizePath } from '@nestjs/common/internal';
|
|
8
|
+
import { CLOSE_EVENT, CONNECTION_EVENT, ERROR_EVENT, } from '@nestjs/websockets/internal';
|
|
12
9
|
let wsPackage = {};
|
|
13
10
|
var READY_STATE;
|
|
14
11
|
(function (READY_STATE) {
|
|
@@ -21,16 +18,21 @@ const UNDERLYING_HTTP_SERVER_PORT = 0;
|
|
|
21
18
|
/**
|
|
22
19
|
* @publicApi
|
|
23
20
|
*/
|
|
24
|
-
class WsAdapter extends
|
|
21
|
+
export class WsAdapter extends AbstractWsAdapter {
|
|
22
|
+
logger = new Logger(WsAdapter.name);
|
|
23
|
+
httpServersRegistry = new Map();
|
|
24
|
+
wsServersRegistry = new Map();
|
|
25
|
+
messageParser = (data) => {
|
|
26
|
+
return JSON.parse(data.toString());
|
|
27
|
+
};
|
|
25
28
|
constructor(appOrHttpServer, options) {
|
|
26
29
|
super(appOrHttpServer);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
wsPackage = (0, load_package_util_1.loadPackage)('ws', 'WsAdapter', () => require('ws'));
|
|
30
|
+
wsPackage = loadPackageSync('ws', 'WsAdapter', () => createRequire(import.meta.url)('ws'));
|
|
31
|
+
// Normalize CJS/ESM: In CJS, require('ws') returns WebSocket with .Server.
|
|
32
|
+
// We need .Server for creating WebSocketServer instances.
|
|
33
|
+
if (!wsPackage.Server) {
|
|
34
|
+
wsPackage = { ...wsPackage, Server: wsPackage.WebSocketServer };
|
|
35
|
+
}
|
|
34
36
|
if (options?.messageParser) {
|
|
35
37
|
this.messageParser = options.messageParser;
|
|
36
38
|
}
|
|
@@ -77,8 +79,8 @@ class WsAdapter extends websockets_1.AbstractWsAdapter {
|
|
|
77
79
|
bindMessageHandlers(client, handlers, transform) {
|
|
78
80
|
const handlersMap = new Map();
|
|
79
81
|
handlers.forEach(handler => handlersMap.set(handler.message, handler));
|
|
80
|
-
const close$ =
|
|
81
|
-
const source$ =
|
|
82
|
+
const close$ = fromEvent(client, CLOSE_EVENT).pipe(share(), first());
|
|
83
|
+
const source$ = fromEvent(client, 'message').pipe(mergeMap(data => this.bindMessageHandler(data, handlersMap, transform).pipe(filter(result => !isNil(result)))), takeUntil(close$));
|
|
82
84
|
const onMessage = (response) => {
|
|
83
85
|
if (client.readyState !== READY_STATE.OPEN_STATE) {
|
|
84
86
|
return;
|
|
@@ -91,28 +93,30 @@ class WsAdapter extends websockets_1.AbstractWsAdapter {
|
|
|
91
93
|
try {
|
|
92
94
|
const message = this.messageParser(buffer.data);
|
|
93
95
|
if (!message) {
|
|
94
|
-
return
|
|
96
|
+
return EMPTY;
|
|
95
97
|
}
|
|
96
98
|
const messageHandler = handlersMap.get(message.event);
|
|
97
99
|
const { callback } = messageHandler;
|
|
98
100
|
return transform(callback(message.data, message.event));
|
|
99
101
|
}
|
|
100
102
|
catch {
|
|
101
|
-
return
|
|
103
|
+
return EMPTY;
|
|
102
104
|
}
|
|
103
105
|
}
|
|
104
106
|
bindErrorHandler(server) {
|
|
105
|
-
server.on(
|
|
106
|
-
server.on(
|
|
107
|
+
server.on(CONNECTION_EVENT, (ws) => ws.on(ERROR_EVENT, (err) => this.logger.error(err)));
|
|
108
|
+
server.on(ERROR_EVENT, (err) => this.logger.error(err));
|
|
107
109
|
return server;
|
|
108
110
|
}
|
|
109
111
|
bindClientDisconnect(client, callback) {
|
|
110
|
-
client.on(
|
|
112
|
+
client.on(CLOSE_EVENT, callback);
|
|
111
113
|
}
|
|
112
114
|
async close(server) {
|
|
113
115
|
const closeEventSignal = new Promise((resolve, reject) => server.close((err) => (err ? reject(err) : resolve(undefined))));
|
|
114
|
-
|
|
115
|
-
ws.
|
|
116
|
+
if (server.clients) {
|
|
117
|
+
for (const ws of server.clients) {
|
|
118
|
+
ws.terminate();
|
|
119
|
+
}
|
|
116
120
|
}
|
|
117
121
|
await closeEventSignal;
|
|
118
122
|
}
|
|
@@ -152,7 +156,7 @@ class WsAdapter extends websockets_1.AbstractWsAdapter {
|
|
|
152
156
|
}
|
|
153
157
|
}
|
|
154
158
|
catch (err) {
|
|
155
|
-
socket.end(
|
|
159
|
+
socket.end(`HTTP/1.1 400\r\n${err.message}`);
|
|
156
160
|
}
|
|
157
161
|
});
|
|
158
162
|
return httpServer;
|
|
@@ -160,8 +164,7 @@ class WsAdapter extends websockets_1.AbstractWsAdapter {
|
|
|
160
164
|
addWsServerToRegistry(wsServer, port, path) {
|
|
161
165
|
const entries = this.wsServersRegistry.get(port) ?? [];
|
|
162
166
|
entries.push(wsServer);
|
|
163
|
-
wsServer.path =
|
|
167
|
+
wsServer.path = normalizePath(path);
|
|
164
168
|
this.wsServersRegistry.set(port, entries);
|
|
165
169
|
}
|
|
166
170
|
}
|
|
167
|
-
exports.WsAdapter = WsAdapter;
|
package/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './adapters';
|
|
1
|
+
export * from './adapters/index.js';
|
package/index.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*
|
|
3
2
|
* Nest @platform-ws
|
|
4
3
|
* Copyright(c) 2017 - 2025 Kamil Mysliwiec
|
|
5
4
|
* https://nestjs.com
|
|
6
5
|
* MIT Licensed
|
|
7
6
|
*/
|
|
8
|
-
|
|
9
|
-
const tslib_1 = require("tslib");
|
|
10
|
-
tslib_1.__exportStar(require("./adapters"), exports);
|
|
7
|
+
export * from './adapters/index.js';
|
package/package.json
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestjs/platform-ws",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "12.0.0-alpha.1",
|
|
4
4
|
"description": "Nest - modern, fast, powerful node.js web framework (@platform-ws)",
|
|
5
5
|
"author": "Kamil Mysliwiec",
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./index.js",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": "./index.js",
|
|
11
|
+
"./*.js": "./*.js",
|
|
12
|
+
"./*": "./*.js",
|
|
13
|
+
"./adapters": "./adapters/index.js"
|
|
14
|
+
},
|
|
7
15
|
"homepage": "https://nestjs.com",
|
|
8
16
|
"funding": {
|
|
9
17
|
"type": "opencollective",
|
|
@@ -26,5 +34,5 @@
|
|
|
26
34
|
"@nestjs/websockets": "^11.0.0",
|
|
27
35
|
"rxjs": "^7.1.0"
|
|
28
36
|
},
|
|
29
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "7035ecc828a2a9f752aad188871b1171663a20c2"
|
|
30
38
|
}
|
package/tsconfig.build.json
CHANGED
|
@@ -2,13 +2,7 @@
|
|
|
2
2
|
"extends": "../tsconfig.build.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"outDir": ".",
|
|
5
|
-
"rootDir": "."
|
|
6
|
-
"paths": {
|
|
7
|
-
"@nestjs/common": ["../common"],
|
|
8
|
-
"@nestjs/common/*": ["../common/*"],
|
|
9
|
-
"@nestjs/websockets": ["../websockets"],
|
|
10
|
-
"@nestjs/websockets/*": ["../websockets/*"]
|
|
11
|
-
}
|
|
5
|
+
"rootDir": "."
|
|
12
6
|
},
|
|
13
7
|
"exclude": ["node_modules", "dist", "test/**/*", "*.spec.ts"],
|
|
14
8
|
"references": [
|