diff --git a/src/node/handler/SocketIORouter.js b/src/node/handler/SocketIORouter.js index 1a53602d..a4bfb41c 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 3f04e566..7a99e0e3 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; + }); }); });