From 661a7705fd8caaf960fd0c726a3436d0aeb9af79 Mon Sep 17 00:00:00 2001 From: Valeriy S Date: Fri, 22 Feb 2019 16:01:20 +0300 Subject: [PATCH] fix(client): do not throw on SASS compile errors --- client/src/client/workers/sass-compile.js | 2 +- .../Challenges/utils/worker-executor.js | 35 ++++++++++++++----- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/client/src/client/workers/sass-compile.js b/client/src/client/workers/sass-compile.js index 126a8618f0..701c039d76 100644 --- a/client/src/client/workers/sass-compile.js +++ b/client/src/client/workers/sass-compile.js @@ -19,7 +19,7 @@ self.onmessage = e => { if (result.status === 0) { self.postMessage(result.text); } else { - throw result.formatted; + self.postMessage({ type: 'error', data: { message: result.formatted } }); } }); }; diff --git a/client/src/templates/Challenges/utils/worker-executor.js b/client/src/templates/Challenges/utils/worker-executor.js index 054a2754b0..688ba27df4 100644 --- a/client/src/templates/Challenges/utils/worker-executor.js +++ b/client/src/templates/Challenges/utils/worker-executor.js @@ -39,31 +39,48 @@ class WorkerExecutor { // Handle timeout const timeoutId = setTimeout(() => { this.killWorker(); - reject('timeout'); + done('timeout'); }, timeout); + const done = (err, data) => { + clearTimeout(timeoutId); + this.remove('error', handleError); + if (err) { + reject(err); + } else { + resolve(data); + } + }; + + const handleError = e => { + done(e.message); + }; + this.on('error', handleError); + worker.postMessage(data); // Handle result worker.onmessage = e => { if (e.data && e.data.type) { - const observers = this.observers[e.data.type] || []; - for (const observer of observers) { - observer(e.data.data); - } + this.handleEvent(e.data.type, e.data.data); return; } - clearTimeout(timeoutId); - resolve(e.data); + done(null, e.data); }; worker.onerror = e => { - clearTimeout(timeoutId); - reject(e.message); + this.handleEvent('error', { message: e.message }); }; }); } + handleEvent(type, data) { + const observers = this.observers[type] || []; + for (const observer of observers) { + observer(data); + } + } + on(type, callback) { const observers = this.observers[type] || []; observers.push(callback);