From 812ad499f9df8a950cc4078b2056113b1d491990 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Wed, 20 Jun 2018 15:33:31 -0300 Subject: [PATCH 1/3] [FIX] Integration scripts were freezing the process some times --- .../rocketchat-integrations/server/api/api.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-integrations/server/api/api.js b/packages/rocketchat-integrations/server/api/api.js index bbd9efa92b63b..962b2903a1e3f 100644 --- a/packages/rocketchat-integrations/server/api/api.js +++ b/packages/rocketchat-integrations/server/api/api.js @@ -1,6 +1,8 @@ /* globals Meteor Restivus logger processWebhookMessage*/ // TODO: remove globals +import Fiber from 'fibers'; +import Future from 'fibers/future'; import _ from 'underscore'; import s from 'underscore.string'; import vm from 'vm'; @@ -64,6 +66,8 @@ function buildSandbox(store = {}) { s, console, moment, + Fiber, + Promise, Livechat: RocketChat.Livechat, Store: { set(key, val) { @@ -236,9 +240,19 @@ function executeIntegrationRest() { sandbox.script = script; sandbox.request = request; - const result = vm.runInNewContext('script.process_incoming_request({ request: request })', sandbox, { + const result = Future.fromPromise(vm.runInNewContext(` + new Promise((resolve, reject) => { + Fiber(() => { + try { + resolve(script.process_incoming_request({ request: request })); + } catch(e) { + reject(e); + } + }).run(); + }); + `, sandbox, { timeout: 3000 - }); + })).wait(); if (!result) { logger.incoming.debug('[Process Incoming Request result of Trigger', this.integration.name, ':] No data'); From 73cd594bd795c3f272fd00af56cd1c140ffcbedc Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Tue, 26 Jun 2018 15:07:06 -0300 Subject: [PATCH 2/3] Add catch to vm script's Promise --- packages/rocketchat-integrations/server/api/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-integrations/server/api/api.js b/packages/rocketchat-integrations/server/api/api.js index 962b2903a1e3f..4cd35bd1b937f 100644 --- a/packages/rocketchat-integrations/server/api/api.js +++ b/packages/rocketchat-integrations/server/api/api.js @@ -249,7 +249,7 @@ function executeIntegrationRest() { reject(e); } }).run(); - }); + }).catch((error) => console.error(error)); `, sandbox, { timeout: 3000 })).wait(); From d8bbe043e43e047c248111504eaff06b4f72c9cb Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Tue, 26 Jun 2018 16:31:00 -0300 Subject: [PATCH 3/3] Force script to time out --- packages/rocketchat-integrations/server/api/api.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/rocketchat-integrations/server/api/api.js b/packages/rocketchat-integrations/server/api/api.js index 4cd35bd1b937f..2d78933c22748 100644 --- a/packages/rocketchat-integrations/server/api/api.js +++ b/packages/rocketchat-integrations/server/api/api.js @@ -62,6 +62,9 @@ const Api = new Restivus({ const compiledScripts = {}; function buildSandbox(store = {}) { const sandbox = { + scriptTimeout(reject) { + return setTimeout(() => reject('timed out'), 3000); + }, _, s, console, @@ -243,13 +246,14 @@ function executeIntegrationRest() { const result = Future.fromPromise(vm.runInNewContext(` new Promise((resolve, reject) => { Fiber(() => { + scriptTimeout(reject); try { resolve(script.process_incoming_request({ request: request })); } catch(e) { reject(e); } }).run(); - }).catch((error) => console.error(error)); + }).catch((error) => { throw new Error(error); }); `, sandbox, { timeout: 3000 })).wait();