From 4852da9bd598cebc69b7025d12f27e32152507a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Tue, 20 Apr 2021 10:30:59 +0200 Subject: [PATCH] Catch all exceptions raised in commands that are invoked locally --- CHANGELOG.md | 5 +++++ src/socketlib.js | 29 +++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a389033..2089327 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## In development +### Bugfixes +- `executeFor` functions will no longer fail with an exception if a function scheduled to be called by the local user throws. + + ## 1.0.2 ### New API endpoints - Added `executeForOthers` and `executeForOtherGMs` that execute for all users/all GMs except the local client. diff --git a/src/socketlib.js b/src/socketlib.js index b8fbe42..2ea426a 100644 --- a/src/socketlib.js +++ b/src/socketlib.js @@ -109,9 +109,14 @@ class SocketlibSocket { async executeForAllGMs(handler, ...args) { const [name, func] = this._resolveFunction(handler); this._sendCommand(name, args, RECIPIENT_TYPES.ALL_GMS); - if (game.user.isGM) - // TODO Make this function call run async, even if the function isn't delcared as async to prevent exceptions to propagate through executeForUsers - func(...args); + if (game.user.isGM) { + try { + func(...args); + } + catch (e) { + console.error(e); + } + } } async executeForOtherGMs(handler, ...args) { @@ -122,8 +127,11 @@ class SocketlibSocket { async executeForEveryone(handler, ...args) { const [name, func] = this._resolveFunction(handler); this._sendCommand(name, args, RECIPIENT_TYPES.EVERYONE); - // TODO Make this function call run async, even if the function isn't delcared as async to prevent exceptions to propagate through executeForUsers - func(...args); + try { + func(...args); + } catch (e) { + console.error(e); + } } async executeForOthers(handler, ...args) { @@ -139,9 +147,14 @@ class SocketlibSocket { if (currentUserIndex >= 0) recipients.splice(currentUserIndex, 1); this._sendCommand(name, args, recipients); - if (currentUserIndex >= 0) - // TODO Make this function call run async, even if the function isn't delcared as async to prevent exceptions to propagate through executeForUsers - func(...args); + if (currentUserIndex >= 0) { + try { + func(...args); + } + catch (e) { + console.error(e); + } + } } _sendRequest(handlerName, args, recipient) {