diff --git a/code/core/src/core-server/utils/__tests__/server-channel.test.ts b/code/core/src/core-server/utils/__tests__/server-channel.test.ts index 419011843bdd..8e071c43ac01 100644 --- a/code/core/src/core-server/utils/__tests__/server-channel.test.ts +++ b/code/core/src/core-server/utils/__tests__/server-channel.test.ts @@ -713,4 +713,13 @@ describe('ServerChannelTransport', () => { expect(handleUpgradeSpy).not.toHaveBeenCalled(); }); }); + + it('does not crash when a socket emits an error', () => { + const server = new EventEmitter() as any as Server; + const transport = createTransport(server); + + const socket = connectClient(server, transport, 'manager'); + + expect(() => socket.emit('error', new Error('Max payload size exceeded'))).not.toThrow(); + }); }); diff --git a/code/core/src/core-server/utils/get-server-channel.ts b/code/core/src/core-server/utils/get-server-channel.ts index 9e8406a6cec3..8524d362ca30 100644 --- a/code/core/src/core-server/utils/get-server-channel.ts +++ b/code/core/src/core-server/utils/get-server-channel.ts @@ -125,6 +125,11 @@ export class ServerChannelTransport { } private addClient(ws: WebSocket, role: ChannelClientRole) { + ws.on('error', (error) => { + // Without a listener, Node crashes on 'error' (e.g. oversized frame). ws closes the socket itself. + logger.warn(`WebSocket error on server channel: ${error}`); + }); + ws.on('message', (raw) => { const data = raw.toString(); const event = typeof data === 'string' && isJSON(data) ? parse(data, {}) : data;