diff --git a/src/routes.js b/src/routes.js index 8a144800..a0156829 100644 --- a/src/routes.js +++ b/src/routes.js @@ -380,14 +380,31 @@ module.exports = async ( const walletStatus = await walletExists() const availableService = await getAvailableService() const statusMessage = availableService.walletStatus + if (availableService.code === 12) { + return res.status(401).json({ + field: 'lnd_locked', + errorMessage: availableService.message + ? availableService.message + : 'unknown' + }) + } + if (availableService.code === 14) { + return res.status(401).json({ + field: 'lnd_dead', + errorMessage: availableService.message + ? availableService.message + : 'unknown' + }) + } if (walletStatus) { if (statusMessage === 'unlocked') { return next() } - return res.status(401).json({ field: 'wallet', - errorMessage: statusMessage ? statusMessage : 'unknown' + errorMessage: availableService.message + ? availableService.message + : 'unknown' }) } @@ -399,6 +416,18 @@ module.exports = async ( next() } catch (err) { logger.error(err) + if (err.code === 12) { + return res.status(401).json({ + field: 'lnd_locked', + errorMessage: err.message ? err.message : 'unknown' + }) + } + if (err.code === 14) { + return res.status(401).json({ + field: 'lnd_dead', + errorMessage: err.message ? err.message : 'unknown' + }) + } res.status(500).json({ field: 'wallet', errorMessage: err.message ? err.message : err @@ -602,17 +631,46 @@ module.exports = async ( stream.on('end', () => { logger.info('Channel backup stream ended, starting a new one...') // Prevents call stack overflow exceptions - process.nextTick(onNewChannelBackup) + //process.nextTick(onNewChannelBackup) }) stream.on('error', err => { logger.error('Channel backup stream error:', err) }) stream.on('status', status => { - if (status.code === 14) { - // Prevents call stack overflow exceptions - process.nextTick(() => setTimeout(onNewChannelBackup, 30000)) - } else { - logger.error('Channel backup stream status:', status) + logger.error('Channel backup stream status:', status) + switch (status.code) { + case 0: { + logger.info('Channel backup stream ok') + break + } + case 2: { + //Happens to fire when the grpc client lose access to macaroon file + logger.warn('Channel backup got UNKNOWN error status') + break + } + case 12: { + logger.warn( + 'Channel backup LND locked, new registration in 60 seconds' + ) + process.nextTick(() => + setTimeout(() => onNewTransaction(socket, subID), 60000) + ) + break + } + case 13: { + //https://grpc.github.io/grpc/core/md_doc_statuscodes.html + logger.error('Channel backup INTERNAL LND error') + break + } + case 14: { + logger.error( + 'Channel backup LND disconnected, sockets reconnecting in 30 seconds...' + ) + process.nextTick(() => + setTimeout(() => onNewTransaction(socket, subID), 30000) + ) + break + } } }) } diff --git a/utils/lightningServices/errors.js b/utils/lightningServices/errors.js index 04e35aeb..971a0d02 100644 --- a/utils/lightningServices/errors.js +++ b/utils/lightningServices/errors.js @@ -107,7 +107,7 @@ class LNDErrorManager { this._healthListeners.length = 0 this._isCheckingHealth = false } - const deadline = Date.now() + 2000 + const deadline = Date.now() + 4000 lightning.getInfo({},{deadline}, callback) }