From 9f9adb369b3d6a29ad012158131c5ad96536ccce Mon Sep 17 00:00:00 2001 From: Richard Hansen Date: Mon, 6 Sep 2021 05:51:57 -0400 Subject: [PATCH] SocketIORouter: Don't crash if message handler throws --- src/node/handler/SocketIORouter.js | 6 +++++- src/tests/backend/specs/socketio.js | 21 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/node/handler/SocketIORouter.js b/src/node/handler/SocketIORouter.js index 1a53602dc..a4bfb41c4 100644 --- a/src/node/handler/SocketIORouter.js +++ b/src/node/handler/SocketIORouter.js @@ -78,7 +78,11 @@ exports.setSocketIO = (_io) => { return; } logger.debug(`from ${socket.id}: ${JSON.stringify(message)}`); - await components[message.component].handleMessage(socket, message); + try { + await components[message.component].handleMessage(socket, message); + } catch (err) { + logger.error(`Error while handling message from ${socket.id}: ${err.stack || err}`); + } }); socket.on('disconnect', (reason) => { diff --git a/src/tests/backend/specs/socketio.js b/src/tests/backend/specs/socketio.js index 3f04e566d..7a99e0e34 100644 --- a/src/tests/backend/specs/socketio.js +++ b/src/tests/backend/specs/socketio.js @@ -460,7 +460,7 @@ describe(__filename, function () { await disconnected; }); - it('handleMessage', async function () { + it('handleMessage (success)', async function () { let serverSocket; const want = { component: this.test.fullTitle(), @@ -480,5 +480,24 @@ describe(__filename, function () { socket.send(want); assert.deepEqual(await got, want); }); + + it('handleMessage (error)', async function () { + let receive; + const received = new Promise((resolve) => receive = resolve); + socketIoRouter.addComponent(this.test.fullTitle(), new class extends Module { + handleMessage(socket, message) { + if (message.throw) throw new Error('injected'); + receive(); + } + }()); + socket = await connect(); + const tx = (msg = {}) => { + msg = Object.assign({component: this.test.fullTitle(), protocolVersion: 2}, msg); + socket.send(msg); + }; + tx({throw: true}); + tx(); + await received; + }); }); });