From a4c8039cc76dee79fcda10a035b29cb9dda6ffd0 Mon Sep 17 00:00:00 2001 From: ansuz Date: Thu, 26 Mar 2020 14:45:24 -0400 Subject: [PATCH] improve error handling with rpc response API --- lib/hk-util.js | 17 +++++++---------- www/common/common-util.js | 29 ++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/lib/hk-util.js b/lib/hk-util.js index 799ec547f..c04ac245b 100644 --- a/lib/hk-util.js +++ b/lib/hk-util.js @@ -772,7 +772,9 @@ HK.initializeIndexWorkers = function (Env, config, _cb) { const workers = []; - const response = Util.response(); + const response = Util.response(function (errLabel, info) { + Env.Log.error('HK_DB_WORKER__' + errLabel, info); + }); const initWorker = function (worker, cb) { //console.log("initializing index worker"); const txid = Util.uid(); @@ -798,14 +800,7 @@ HK.initializeIndexWorkers = function (Env, config, _cb) { return; } //console.log(res); - try { - response.handle(res.txid, [res.error, res.value]); - } catch (err) { - Env.Log.error("INDEX_WORKER", { - error: err, - response: res, - }); - } + response.handle(res.txid, [res.error, res.value]); }); worker.on('exit', function () { var idx = workers.indexOf(worker); @@ -945,7 +940,9 @@ HK.initializeValidationWorkers = function (Env) { workers.push(fork('lib/workers/check-signature.js')); } - const response = Util.response(); + const response = Util.response(function (errLabel, info) { + Env.Log.error('HK_VALIDATE_WORKER__' + errLabel, info); + }); var initWorker = function (worker) { worker.on('message', function (res) { diff --git a/www/common/common-util.js b/www/common/common-util.js index da373f1ad..a1c35307f 100644 --- a/www/common/common-util.js +++ b/www/common/common-util.js @@ -81,10 +81,16 @@ }); }; - Util.response = function () { + Util.response = function (errorHandler) { var pending = {}; var timeouts = {}; + if (typeof(errorHandler) !== 'function') { + errorHandler = function (label) { + throw new Error(label); + }; + } + var clear = function (id) { clearTimeout(timeouts[id]); delete timeouts[id]; @@ -92,8 +98,8 @@ }; var expect = function (id, fn, ms) { - if (typeof(id) !== 'string') { throw new Error("EXPECTED_STRING"); } - if (typeof(fn) !== 'function') { throw new Error("EXPECTED_CALLBACK"); } + if (typeof(id) !== 'string') { errorHandler('EXPECTED_STRING'); } + if (typeof(fn) !== 'function') { errorHandler('EXPECTED_CALLBACK'); } pending[id] = fn; if (typeof(ms) === 'number' && ms) { timeouts[id] = setTimeout(function () { @@ -105,8 +111,21 @@ var handle = function (id, args) { var fn = pending[id]; - if (typeof(fn) !== 'function') { throw new Error("MISSING_CALLBACK"); } - pending[id].apply(null, Array.isArray(args)? args : [args]); + if (typeof(fn) !== 'function') { + errorHandler("MISSING_CALLBACK", { + id: id, + args: args, + }); + } + try { + pending[id].apply(null, Array.isArray(args)? args : [args]); + } catch (err) { + errorHandler('HANDLER_ERROR', { + error: err, + id: id, + args: args, + }); + } clear(id); };