From 90d67f0c72ea60ea5869e696050f7f90aa0bcc75 Mon Sep 17 00:00:00 2001 From: hatim boufnichel Date: Sat, 5 Sep 2020 17:40:08 +0200 Subject: [PATCH] error manager --- utils/lightningServices/errors.js | 142 ++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 utils/lightningServices/errors.js diff --git a/utils/lightningServices/errors.js b/utils/lightningServices/errors.js new file mode 100644 index 00000000..f1051099 --- /dev/null +++ b/utils/lightningServices/errors.js @@ -0,0 +1,142 @@ + +const LightningServices = require('./lightning-services') + +/** + * @typedef {{ + * code:number, + * details:string, + * message:string + * }} LNDError + */ + +/** + * @typedef {(err:LNDError,response:object)=>void} HealthListener + */ + +class LNDErrorManager { + + /** + * @type {boolean} + */ + _isCheckingHealth = false + + /** + * @type {HealthListener[]} + */ + _healthListeners = [] + + getAvailableService(){ + + //require('shock-common').Utils.makePromise((res, rej) => ...) + return new Promise((res,rej)=>{ + if(!this._isCheckingHealth){ + this._isCheckingHealth = true + this.getInfo() + } + /** + * + * @param {LNDError} err + * @param {object} response + */ + const listener = (err,response)=>{ + if (err) { + if (err.code === 12) { + res({ + service: 'walletUnlocker', + message: 'Wallet locked', + code: err.code, + walletStatus: 'locked', + success: true + }) + } else if (err.code === 14) { + rej({ + service: 'unknown', + message: + "Failed to connect to LND server, make sure it's up and running.", + code: 14, + walletStatus: 'unknown', + success: false + }) + } else { + rej({ + service: 'lightning', + message: this.sanitizeLNDError(err), + code: err.code, + walletStatus: 'unlocked', + success: false + }) + } + } + + res({ + service: 'lightning', + message: response, + code: null, + walletStatus: 'unlocked', + success: true + }) + + } + this._healthListeners.push(listener) + }) + + } + + //private + getInfo(){ + const { lightning } = LightningServices.services + /** + * + * @param {LNDError} err + * @param {object} response + */ + const callback = (err, response) => { + this._healthListeners.forEach(l =>{ + l(err,response) + }) + this._healthListeners.length = 0 + this._isCheckingHealth = false + } + const deadline = Date.now() + 2000 + lightning.getInfo({},{deadline}, callback) + } + + /** + * @param {LNDError} e + */ + handleError(e){ + return this.sanitizeLNDError(e) + } + + /** + * @param {LNDError} e + */ + // eslint-disable-next-line + sanitizeLNDError(e){ + let eMessage = '' + if(typeof e === 'string'){ + eMessage = e + }else if(e.details){ + eMessage = e.details + } else if(e.message){ + eMessage = e.message + } + if (eMessage.toLowerCase().includes('unknown')) { + const splittedMessage = eMessage.split('UNKNOWN: ') + return splittedMessage.length > 1 + ? splittedMessage.slice(1).join('') + : splittedMessage.join('') + } + if(eMessage === ''){ + return 'unknown LND error' + } + return eMessage + } + + +} + + +const lndErrorManager = new LNDErrorManager() + +module.exports = lndErrorManager \ No newline at end of file