Skip to content

Commit cb24ca9

Browse files
bugfix(@nestjs/websockets) handle invalid payloads (nestjs#683)
1 parent e37b9f7 commit cb24ca9

2 files changed

Lines changed: 30 additions & 33 deletions

File tree

packages/websockets/adapters/io-adapter.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import * as io from 'socket.io';
2-
import { Server } from 'http';
3-
import { MessageMappingProperties } from '../gateway-metadata-explorer';
4-
import { CONNECTION_EVENT, DISCONNECT_EVENT } from '../constants';
51
import { WebSocketAdapter } from '@nestjs/common';
6-
import { Observable, fromEvent } from 'rxjs';
7-
import { filter, tap, mergeMap } from 'rxjs/operators';
82
import { isFunction } from '@nestjs/common/utils/shared.utils';
3+
import { Server } from 'http';
4+
import { Observable, fromEvent } from 'rxjs';
5+
import { filter, mergeMap } from 'rxjs/operators';
6+
import * as io from 'socket.io';
7+
import { CONNECTION_EVENT, DISCONNECT_EVENT } from '../constants';
8+
import { MessageMappingProperties } from '../gateway-metadata-explorer';
99

1010
export class IoAdapter implements WebSocketAdapter {
1111
constructor(private readonly httpServer: Server | null = null) {}
@@ -32,23 +32,23 @@ export class IoAdapter implements WebSocketAdapter {
3232
return io(port, options);
3333
}
3434

35-
public bindClientConnect(server, callback: (...args) => void) {
35+
public bindClientConnect(server: any, callback: (...args) => void) {
3636
server.on(CONNECTION_EVENT, callback);
3737
}
3838

39-
public bindClientDisconnect(client, callback: (...args) => void) {
39+
public bindClientDisconnect(client: any, callback: (...args) => void) {
4040
client.on(DISCONNECT_EVENT, callback);
4141
}
4242

4343
public bindMessageHandlers(
44-
client,
44+
client: any,
4545
handlers: MessageMappingProperties[],
46-
process: (data: any) => Observable<any>,
46+
transform: (data: any) => Observable<any>,
4747
) {
4848
handlers.forEach(({ message, callback }) =>
4949
fromEvent(client, message)
5050
.pipe(
51-
mergeMap(data => process(callback(data))),
51+
mergeMap(data => transform(callback(data))),
5252
filter(result => !!result && result.event),
5353
)
5454
.subscribe(({ event, data }) => client.emit(event, data)),
@@ -59,7 +59,7 @@ export class IoAdapter implements WebSocketAdapter {
5959
server.use(middleware);
6060
}
6161

62-
public close(server) {
62+
public close(server: any) {
6363
isFunction(server.close) && server.close();
6464
}
6565
}

packages/websockets/adapters/ws-adapter.ts

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
1+
import { Logger, WebSocketAdapter } from '@nestjs/common';
2+
import { loadPackage } from '@nestjs/common/utils/load-package.util';
3+
import { isFunction } from '@nestjs/common/utils/shared.utils';
14
import { Server } from 'http';
5+
import { EMPTY as empty, Observable, fromEvent } from 'rxjs';
6+
import { filter, mergeMap } from 'rxjs/operators';
7+
import { CLOSE_EVENT, CONNECTION_EVENT, ERROR_EVENT } from '../constants';
28
import { MessageMappingProperties } from '../gateway-metadata-explorer';
3-
import {
4-
CONNECTION_EVENT,
5-
DISCONNECT_EVENT,
6-
CLOSE_EVENT,
7-
ERROR_EVENT,
8-
} from '../constants';
9-
import { WebSocketAdapter, Logger } from '@nestjs/common';
10-
import { Observable, fromEvent, EMPTY as empty } from 'rxjs';
11-
import { mergeMap, filter, tap } from 'rxjs/operators';
12-
import { isFunction } from '@nestjs/common/utils/shared.utils';
13-
import { loadPackage } from '@nestjs/common/utils/load-package.util';
149

1510
let wsPackage: any = {};
1611

@@ -54,11 +49,11 @@ export class WsAdapter implements WebSocketAdapter {
5449
public bindMessageHandlers(
5550
client: WebSocket,
5651
handlers: MessageMappingProperties[],
57-
process: (data: any) => Observable<any>,
52+
transform: (data: any) => Observable<any>,
5853
) {
5954
fromEvent(client, 'message')
6055
.pipe(
61-
mergeMap(data => this.bindMessageHandler(data, handlers, process)),
56+
mergeMap(data => this.bindMessageHandler(data, handlers, transform)),
6257
filter(result => !!result),
6358
)
6459
.subscribe(response => client.send(JSON.stringify(response)));
@@ -67,17 +62,19 @@ export class WsAdapter implements WebSocketAdapter {
6762
public bindMessageHandler(
6863
buffer,
6964
handlers: MessageMappingProperties[],
70-
process: (data: any) => Observable<any>,
65+
transform: (data: any) => Observable<any>,
7166
): Observable<any> {
72-
const message = JSON.parse(buffer.data);
73-
const messageHandler = handlers.find(
74-
handler => handler.message === message.event,
75-
);
76-
if (!messageHandler) {
67+
try {
68+
const message = JSON.parse(buffer.data);
69+
const messageHandler = handlers.find(
70+
handler => handler.message === message.event,
71+
);
72+
const { callback } = messageHandler;
73+
return transform(callback(message.data));
74+
}
75+
catch {
7776
return empty;
7877
}
79-
const { callback } = messageHandler;
80-
return process(callback(message.data));
8178
}
8279

8380
public close(server) {

0 commit comments

Comments
 (0)