Skip to content

Commit ae4f6fd

Browse files
authored
Merge pull request #293 from peers/290-rangeerror-invalid-websocket-frame-rsv2-and-rsv3-must-be-clear
fix: the server could crash if a client sends invalid frames
2 parents d4b292d + 29394de commit ae4f6fd

File tree

4 files changed

+18
-19
lines changed

4 files changed

+18
-19
lines changed

src/models/client.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { MyWebSocket } from "../services/webSocketServer/webSocket";
1+
import type WebSocket from "ws";
22

33
export interface IClient {
44
getId(): string;
55

66
getToken(): string;
77

8-
getSocket(): MyWebSocket | null;
8+
getSocket(): WebSocket | null;
99

10-
setSocket(socket: MyWebSocket | null): void;
10+
setSocket(socket: WebSocket | null): void;
1111

1212
getLastPing(): number;
1313

@@ -19,7 +19,7 @@ export interface IClient {
1919
export class Client implements IClient {
2020
private readonly id: string;
2121
private readonly token: string;
22-
private socket: MyWebSocket | null = null;
22+
private socket: WebSocket | null = null;
2323
private lastPing: number = new Date().getTime();
2424

2525
constructor({ id, token }: { id: string; token: string; }) {
@@ -35,11 +35,11 @@ export class Client implements IClient {
3535
return this.token;
3636
}
3737

38-
public getSocket(): MyWebSocket | null {
38+
public getSocket(): WebSocket | null {
3939
return this.socket;
4040
}
4141

42-
public setSocket(socket: MyWebSocket | null): void {
42+
public setSocket(socket: WebSocket | null): void {
4343
this.socket = socket;
4444
}
4545

src/services/webSocketServer/index.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { IConfig } from "../../config";
66
import { Errors, MessageType } from "../../enums";
77
import { Client, IClient } from "../../models/client";
88
import { IRealm } from "../../models/realm";
9-
import { MyWebSocket } from "./webSocket";
9+
import type WebSocket from "ws";
1010

1111
export interface IWebSocketServer extends EventEmitter {
1212
readonly path: string;
@@ -42,11 +42,14 @@ export class WebSocketServer extends EventEmitter implements IWebSocketServer {
4242

4343
this.socketServer = new WebSocketLib.Server({ path: this.path, server });
4444

45-
this.socketServer.on("connection", (socket: MyWebSocket, req) => this._onSocketConnection(socket, req));
45+
this.socketServer.on("connection", (socket, req) => this._onSocketConnection(socket, req));
4646
this.socketServer.on("error", (error: Error) => this._onSocketError(error));
4747
}
4848

49-
private _onSocketConnection(socket: MyWebSocket, req: IncomingMessage): void {
49+
private _onSocketConnection(socket: WebSocket, req: IncomingMessage): void {
50+
// An unhandled socket error might crash the server. Handle it first.
51+
socket.on("error", error => this._onSocketError(error))
52+
5053
const { query = {} } = url.parse(req.url ?? '', true);
5154

5255
const { id, token, key }: IAuthParams = query;
@@ -85,7 +88,7 @@ export class WebSocketServer extends EventEmitter implements IWebSocketServer {
8588

8689
private _registerClient({ socket, id, token }:
8790
{
88-
socket: MyWebSocket;
91+
socket: WebSocket;
8992
id: string;
9093
token: string;
9194
}): void {
@@ -103,7 +106,7 @@ export class WebSocketServer extends EventEmitter implements IWebSocketServer {
103106
this._configureWS(socket, newClient);
104107
}
105108

106-
private _configureWS(socket: MyWebSocket, client: IClient): void {
109+
private _configureWS(socket: WebSocket, client: IClient): void {
107110
client.setSocket(socket);
108111

109112
// Cleanup after a socket closes.
@@ -130,7 +133,7 @@ export class WebSocketServer extends EventEmitter implements IWebSocketServer {
130133
this.emit("connection", client);
131134
}
132135

133-
private _sendErrorAndClose(socket: MyWebSocket, msg: Errors): void {
136+
private _sendErrorAndClose(socket: WebSocket, msg: Errors): void {
134137
socket.send(
135138
JSON.stringify({
136139
type: MessageType.ERROR,

src/services/webSocketServer/webSocket.ts

-4
This file was deleted.

test/messageHandler/handlers/transmission/index.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { Client } from '../../../../src/models/client';
33
import { TransmissionHandler } from '../../../../src/messageHandler/handlers';
44
import { Realm } from '../../../../src/models/realm';
55
import { MessageType } from '../../../../src/enums';
6-
import { MyWebSocket } from '../../../../src/services/webSocketServer/webSocket';
6+
import type WebSocket from "ws";
77

8-
const createFakeSocket = (): MyWebSocket => {
8+
const createFakeSocket = (): WebSocket => {
99
/* eslint-disable @typescript-eslint/no-empty-function */
1010
const sock = {
1111
send: (): void => { },
@@ -14,7 +14,7 @@ const createFakeSocket = (): MyWebSocket => {
1414
};
1515
/* eslint-enable @typescript-eslint/no-empty-function */
1616

17-
return (sock as unknown as MyWebSocket);
17+
return (sock as unknown as WebSocket);
1818
};
1919

2020
describe('Transmission handler', () => {

0 commit comments

Comments
 (0)