From 70c24fa5e9d475a9c1b5c10829a0f4368a0c6f17 Mon Sep 17 00:00:00 2001 From: Douglas Gubert Date: Mon, 29 Jul 2024 14:17:06 -0300 Subject: [PATCH] fix: handler errors no being sent to subprocess (#784) --- deno-runtime/lib/accessors/mod.ts | 2 +- .../lib/accessors/modify/ModifyCreator.ts | 26 +++++++----- .../lib/accessors/modify/ModifyUpdater.ts | 42 ++++++++++--------- .../runtime/deno/AppsEngineDenoRuntime.ts | 16 ++++++- 4 files changed, 53 insertions(+), 33 deletions(-) diff --git a/deno-runtime/lib/accessors/mod.ts b/deno-runtime/lib/accessors/mod.ts index 0783fe08f..3c0c0670f 100644 --- a/deno-runtime/lib/accessors/mod.ts +++ b/deno-runtime/lib/accessors/mod.ts @@ -71,7 +71,7 @@ export class AppAccessors { params, }) .then((response) => response.result) - .catch((err) => err.error); + .catch((err) => { throw new Error(err.error) }); }, }, ) as T; diff --git a/deno-runtime/lib/accessors/modify/ModifyCreator.ts b/deno-runtime/lib/accessors/modify/ModifyCreator.ts index 96b51f92c..c08b027ed 100644 --- a/deno-runtime/lib/accessors/modify/ModifyCreator.ts +++ b/deno-runtime/lib/accessors/modify/ModifyCreator.ts @@ -34,7 +34,7 @@ const { RocketChatAssociationModel } = require('@rocket.chat/apps-engine/definit }; export class ModifyCreator implements IModifyCreator { - constructor(private readonly senderFn: typeof Messenger.sendRequest) {} + constructor(private readonly senderFn: typeof Messenger.sendRequest) { } getLivechatCreator(): ILivechatCreator { return new Proxy( @@ -56,7 +56,9 @@ export class ModifyCreator implements IModifyCreator { params, }) .then((response) => response.result) - .catch((err) => err.error); + .catch((err) => { + throw new Error(err.error); + }); }, }, ) as ILivechatCreator; @@ -68,15 +70,17 @@ export class ModifyCreator implements IModifyCreator { { get: (_target: unknown, prop: string) => - (...params: unknown[]) => - prop === 'toJSON' - ? {} - : this.senderFn({ - method: `accessor:getModifier:getCreator:getUploadCreator:${prop}`, - params, - }) - .then((response) => response.result) - .catch((err) => err.error), + (...params: unknown[]) => + prop === 'toJSON' + ? {} + : this.senderFn({ + method: `accessor:getModifier:getCreator:getUploadCreator:${prop}`, + params, + }) + .then((response) => response.result) + .catch((err) => { + throw new Error(err.error); + }), }, ) as IUploadCreator; } diff --git a/deno-runtime/lib/accessors/modify/ModifyUpdater.ts b/deno-runtime/lib/accessors/modify/ModifyUpdater.ts index 4d2e3e498..8befe7bfa 100644 --- a/deno-runtime/lib/accessors/modify/ModifyUpdater.ts +++ b/deno-runtime/lib/accessors/modify/ModifyUpdater.ts @@ -26,7 +26,7 @@ const { RocketChatAssociationModel } = require('@rocket.chat/apps-engine/definit }; export class ModifyUpdater implements IModifyUpdater { - constructor(private readonly senderFn: typeof Messenger.sendRequest) {} + constructor(private readonly senderFn: typeof Messenger.sendRequest) { } public getLivechatUpdater(): ILivechatUpdater { return new Proxy( @@ -34,15 +34,17 @@ export class ModifyUpdater implements IModifyUpdater { { get: (_target: unknown, prop: string) => - (...params: unknown[]) => - prop === 'toJSON' - ? {} - : this.senderFn({ - method: `accessor:getModifier:getUpdater:getLivechatUpdater:${prop}`, - params, - }) - .then((response) => response.result) - .catch((err) => err.error), + (...params: unknown[]) => + prop === 'toJSON' + ? {} + : this.senderFn({ + method: `accessor:getModifier:getUpdater:getLivechatUpdater:${prop}`, + params, + }) + .then((response) => response.result) + .catch((err) => { + throw new Error(err.error); + }), }, ) as ILivechatUpdater; } @@ -53,15 +55,17 @@ export class ModifyUpdater implements IModifyUpdater { { get: (_target: unknown, prop: string) => - (...params: unknown[]) => - prop === 'toJSON' - ? {} - : this.senderFn({ - method: `accessor:getModifier:getUpdater:getUserUpdater:${prop}`, - params, - }) - .then((response) => response.result) - .catch((err) => err.error), + (...params: unknown[]) => + prop === 'toJSON' + ? {} + : this.senderFn({ + method: `accessor:getModifier:getUpdater:getUserUpdater:${prop}`, + params, + }) + .then((response) => response.result) + .catch((err) => { + throw new Error(err.error); + }), }, ) as IUserUpdater; } diff --git a/src/server/runtime/deno/AppsEngineDenoRuntime.ts b/src/server/runtime/deno/AppsEngineDenoRuntime.ts index 2355749da..a01e1639b 100644 --- a/src/server/runtime/deno/AppsEngineDenoRuntime.ts +++ b/src/server/runtime/deno/AppsEngineDenoRuntime.ts @@ -455,7 +455,13 @@ export class DenoRuntimeSubprocessController extends EventEmitter { const { method } = message.payload; if (method.startsWith('accessor:')) { - const result = await this.handleAccessorMessage(message as jsonrpc.IParsedObjectRequest); + let result: jsonrpc.SuccessObject | jsonrpc.ErrorObject; + + try { + result = await this.handleAccessorMessage(message as jsonrpc.IParsedObjectRequest); + } catch (e) { + result = jsonrpc.error((message.payload as jsonrpc.RequestObject).id, new jsonrpc.JsonRpcError(e.message, 1000)); + } this.messenger.send(result); @@ -463,7 +469,13 @@ export class DenoRuntimeSubprocessController extends EventEmitter { } if (method.startsWith('bridges:')) { - const result = await this.handleBridgeMessage(message as jsonrpc.IParsedObjectRequest); + let result: jsonrpc.SuccessObject | jsonrpc.ErrorObject; + + try { + result = await this.handleBridgeMessage(message as jsonrpc.IParsedObjectRequest); + } catch (e) { + result = jsonrpc.error((message.payload as jsonrpc.RequestObject).id, new jsonrpc.JsonRpcError(e.message, 1000)); + } this.messenger.send(result);