diff --git a/app/containers/Root.js b/app/containers/Root.js index 68b88f1f..0405f19b 100644 --- a/app/containers/Root.js +++ b/app/containers/Root.js @@ -206,22 +206,23 @@ const Root = ({ onboardingProps, syncingProps }) => { - // If we are syncing show the syncing screen - if (!onboardingProps.onboarding.onboarded) { + // If we are onboarding show the onboarding screen. + if (onboardingProps.onboarding.onboarding) { return } - // If we are syncing show the syncing screen + // If we are syncing show the syncing screen. if ( + onboardingProps.onboarding.onboarded && + lnd.lightningGrpcActive && onboardingProps.onboarding.connectionType === 'local' && - lnd.grpcStarted && lnd.syncStatus !== 'complete' ) { return } - // Don't launch the app without gRPC connection - if (!lnd.grpcStarted) { + // Don't launch the app without a connection to the lightning wallet gRPC interface. + if (!lnd.lightningGrpcActive) { return } diff --git a/app/lnd/lib/neutrino.js b/app/lnd/lib/neutrino.js index 0685a877..acf4cb70 100644 --- a/app/lnd/lib/neutrino.js +++ b/app/lnd/lib/neutrino.js @@ -5,17 +5,19 @@ import config from '../config' import { mainLog, lndLog, lndLogGetLevel } from '../../utils/log' import { fetchBlockHeight } from './util' -// Sync status is currenty pending. -const NEUTRINO_SYNC_STATUS_PENDING = 'chain-sync-pending' - -// Waiting for chain backend to finish synchronizing. -const NEUTRINO_SYNC_STATUS_WAITING = 'chain-sync-waiting' - -// Initial sync is currently in progress. -const NEUTRINO_SYNC_STATUS_IN_PROGRESS = 'chain-sync-started' - -// Initial sync has completed. -const NEUTRINO_SYNC_STATUS_COMPLETE = 'chain-sync-finished' +// Sync statuses +const CHAIN_SYNC_PENDING = 'chain-sync-pending' +const CHAIN_SYNC_WAITING = 'chain-sync-waiting' +const CHAIN_SYNC_IN_PROGRESS = 'chain-sync-started' +const CHAIN_SYNC_COMPLETE = 'chain-sync-finished' + +// Events +const ERROR = 'error' +const CLOSE = 'close' +const WALLET_UNLOCKER_GRPC_ACTIVE = 'wallet-unlocker-grpc-active' +const LIGHTNING_GRPC_ACTIVE = 'lightning-grpc-active' +const GOT_CURRENT_BLOCK_HEIGHT = 'got-current-block-height' +const GOT_LND_BLOCK_HEIGHT = 'got-lnd-block-height' /** * Wrapper class for Lnd to run and monitor it in Neutrino mode. @@ -27,9 +29,9 @@ class Neutrino extends EventEmitter { this.alias = alias this.autopilot = autopilot this.process = null - this.grpcProxyStarted = false - this.walletOpened = false - this.chainSyncStatus = NEUTRINO_SYNC_STATUS_PENDING + this.walletUnlockerGrpcActive = false + this.lightningGrpcActive = false + this.chainSyncStatus = CHAIN_SYNC_PENDING } /** @@ -56,9 +58,9 @@ class Neutrino extends EventEmitter { ] this.process = spawn(lndConfig.lndPath, neutrinoArgs) - .on('error', error => this.emit('error', error)) + .on('error', error => this.emit(ERROR, error)) .on('close', code => { - this.emit('close', code) + this.emit(CLOSE, code) this.process = null }) @@ -75,55 +77,55 @@ class Neutrino extends EventEmitter { lndLog[lndLogGetLevel(line)](line) } - // gRPC started. - if (!this.grpcProxyStarted) { - if (line.includes('gRPC proxy started') && line.includes('password')) { - this.grpcProxyStarted = true - this.emit('grpc-proxy-started') + // password RPC server listening (wallet unlocker started). + if (!this.walletUnlockerGrpcActive && !this.lightningGrpcActive) { + if (line.includes('RPC server listening on') && line.includes('password')) { + this.walletUnlockerGrpcActive = true + this.emit(WALLET_UNLOCKER_GRPC_ACTIVE) } } - // Wallet opened. - if (!this.walletOpened) { - if (line.includes('gRPC proxy started') && !line.includes('password')) { - this.walletOpened = true - this.emit('wallet-opened') + // RPC server listening (wallet unlocked). + if (!this.lightningGrpcActive) { + if (line.includes('RPC server listening on') && !line.includes('password')) { + this.lightningGrpcActive = true + this.emit(LIGHTNING_GRPC_ACTIVE) } } - // If the sync has already completed then we don't need to do anythibng else. - if (this.is(NEUTRINO_SYNC_STATUS_COMPLETE)) { + // If the sync has already completed then we don't need to do anything else. + if (this.is(CHAIN_SYNC_COMPLETE)) { return } // Lnd waiting for backend to finish syncing. - if (this.is(NEUTRINO_SYNC_STATUS_PENDING) || this.is(NEUTRINO_SYNC_STATUS_IN_PROGRESS)) { + if (this.is(CHAIN_SYNC_PENDING) || this.is(CHAIN_SYNC_IN_PROGRESS)) { if ( line.includes('No sync peer candidates available') || line.includes('Unable to synchronize wallet to chain') || line.includes('Waiting for chain backend to finish sync') ) { - this.setState(NEUTRINO_SYNC_STATUS_WAITING) + this.setState(CHAIN_SYNC_WAITING) } } // Lnd syncing has started or resumed. - if (this.is(NEUTRINO_SYNC_STATUS_PENDING) || this.is(NEUTRINO_SYNC_STATUS_WAITING)) { + if (this.is(CHAIN_SYNC_PENDING) || this.is(CHAIN_SYNC_WAITING)) { const match = line.match(/Syncing to block height (\d+)/) if (match) { // Notify that chhain syncronisation has now started. - this.setState(NEUTRINO_SYNC_STATUS_IN_PROGRESS) + this.setState(CHAIN_SYNC_IN_PROGRESS) // This is the latest block that BTCd is aware of. const btcdHeight = Number(match[1]) - this.emit('got-current-block-height', btcdHeight) + this.emit(GOT_CURRENT_BLOCK_HEIGHT, btcdHeight) // The height returned from the LND log output may not be the actual current block height (this is the case // when BTCD is still in the middle of syncing the blockchain) so try to fetch thhe current height from from // some block explorers just incase. fetchBlockHeight() .then( - height => (height > btcdHeight ? this.emit('got-current-block-height', height) : null) + height => (height > btcdHeight ? this.emit(GOT_CURRENT_BLOCK_HEIGHT, height) : null) ) // If we were unable to fetch from bock explorers at least we already have what BTCd gave us so just warn. .catch(err => mainLog.warn(`Unable to fetch block height: ${err.message}`)) @@ -131,7 +133,7 @@ class Neutrino extends EventEmitter { } // Lnd as received some updated block data. - if (this.is(NEUTRINO_SYNC_STATUS_WAITING) || this.is(NEUTRINO_SYNC_STATUS_IN_PROGRESS)) { + if (this.is(CHAIN_SYNC_WAITING) || this.is(CHAIN_SYNC_IN_PROGRESS)) { let height let match @@ -144,13 +146,13 @@ class Neutrino extends EventEmitter { } if (height) { - this.setState(NEUTRINO_SYNC_STATUS_IN_PROGRESS) - this.emit('got-lnd-block-height', height) + this.setState(CHAIN_SYNC_IN_PROGRESS) + this.emit(GOT_LND_BLOCK_HEIGHT, height) } // Lnd syncing has completed. if (line.includes('Chain backend is fully synced')) { - this.setState(NEUTRINO_SYNC_STATUS_COMPLETE) + this.setState(CHAIN_SYNC_COMPLETE) } } }) diff --git a/app/reducers/ipc.js b/app/reducers/ipc.js index beabeeb9..6336b2e9 100644 --- a/app/reducers/ipc.js +++ b/app/reducers/ipc.js @@ -1,11 +1,5 @@ import createIpc from 'redux-electron-ipc' -import { - lndSyncStatus, - currentBlockHeight, - lndBlockHeight, - grpcDisconnected, - grpcConnected -} from './lnd' +import { lndSyncStatus, currentBlockHeight, lndBlockHeight, lightningGrpcActive } from './lnd' import { receiveInfo } from './info' import { receiveAddress } from './address' import { receiveCryptocurrency } from './ticker' @@ -47,7 +41,7 @@ import { receiveDescribeNetwork, receiveQueryRoutes, receiveInvoiceAndQueryRoute import { startOnboarding, startLndError, - walletUnlockerStarted, + walletUnlockerGrpcActive, receiveSeed, receiveSeedError, successfullyCreatedWallet, @@ -60,8 +54,7 @@ const ipc = createIpc({ lndSyncStatus, currentBlockHeight, lndBlockHeight, - grpcDisconnected, - grpcConnected, + lightningGrpcActive, receiveInfo, @@ -115,7 +108,7 @@ const ipc = createIpc({ startOnboarding, startLndError, - walletUnlockerStarted, + walletUnlockerGrpcActive, receiveSeed, receiveSeedError, successfullyCreatedWallet, diff --git a/app/reducers/lnd.js b/app/reducers/lnd.js index ab3efef8..9b57f871 100644 --- a/app/reducers/lnd.js +++ b/app/reducers/lnd.js @@ -15,8 +15,7 @@ export const SET_SYNC_STATUS_COMPLETE = 'SET_SYNC_STATUS_COMPLETE' export const RECEIVE_BLOCK_HEIGHT = 'RECEIVE_BLOCK_HEIGHT' export const RECEIVE_BLOCK = 'RECEIVE_BLOCK' -export const GRPC_DISCONNECTED = 'GRPC_DISCONNECTED' -export const GRPC_CONNECTED = 'GRPC_CONNECTED' +export const SET_LIGHTNING_WALLET_ACTIVE = 'SET_LIGHTNING_WALLET_ACTIVE' // ------------------------------------ // Actions @@ -60,11 +59,9 @@ export const lndSyncStatus = (event, status) => (dispatch, getState) => { } } -export const grpcDisconnected = () => dispatch => dispatch({ type: GRPC_DISCONNECTED }) - -export const grpcConnected = () => dispatch => { +export const lightningGrpcActive = () => dispatch => { dispatch(fetchInfo()) - dispatch({ type: GRPC_CONNECTED }) + dispatch({ type: SET_LIGHTNING_WALLET_ACTIVE }) } // Receive IPC event for LND streaming a line @@ -98,8 +95,7 @@ const ACTION_HANDLERS = { }), [RECEIVE_BLOCK]: (state, { lndBlockHeight }) => ({ ...state, lndBlockHeight }), - [GRPC_DISCONNECTED]: state => ({ ...state, grpcStarted: false }), - [GRPC_CONNECTED]: state => ({ ...state, grpcStarted: true }) + [SET_LIGHTNING_WALLET_ACTIVE]: state => ({ ...state, lightningGrpcActive: true }) } // ------------------------------------ @@ -107,7 +103,7 @@ const ACTION_HANDLERS = { // ------------------------------------ const initialState = { syncStatus: 'pending', - grpcStarted: false, + lightningGrpcActive: false, blockHeight: 0, lndBlockHeight: 0 } diff --git a/app/reducers/onboarding.js b/app/reducers/onboarding.js index 6842643c..68100e3a 100644 --- a/app/reducers/onboarding.js +++ b/app/reducers/onboarding.js @@ -250,7 +250,7 @@ export const startLndError = (event, errors) => (dispatch, getState) => { } // Listener from after the LND walletUnlocker has started -export const walletUnlockerStarted = () => dispatch => { +export const walletUnlockerGrpcActive = () => dispatch => { dispatch({ type: LND_STARTED }) ipcRenderer.send('walletUnlocker', { msg: 'genSeed' }) } @@ -333,8 +333,8 @@ const ACTION_HANDLERS = { [CHANGE_STEP]: (state, { step }) => ({ ...state, step, previousStep: state.step }), - [ONBOARDING_STARTED]: state => ({ ...state, onboarded: false }), - [ONBOARDING_FINISHED]: state => ({ ...state, onboarded: true }), + [ONBOARDING_STARTED]: state => ({ ...state, onboarding: true, onboarded: false }), + [ONBOARDING_FINISHED]: state => ({ ...state, onboarding: false, onboarded: true }), [STARTING_LND]: state => ({ ...state, startingLnd: true }), [LND_STARTED]: state => ({ ...state, startingLnd: false }), @@ -448,6 +448,7 @@ export { onboardingSelectors } // Reducer // ------------------------------------ const initialState = { + onboarding: false, onboarded: false, step: 0.1, connectionType: store.get('type', 'local'), diff --git a/app/zap.js b/app/zap.js index 29cba066..f0fdfaa8 100644 --- a/app/zap.js +++ b/app/zap.js @@ -81,7 +81,7 @@ class ZapController { return setTimeout(async () => { if (mode === 'external') { // If lnd is already running, create and subscribe to the Lightning grpc object. - await this.startGrpc() + await this.startLightningWallet() this.sendMessage('successfullyCreatedWallet') } else { // Otherwise, start the onboarding process. @@ -114,8 +114,8 @@ class ZapController { /** * Create and subscribe to the Lightning grpc object. */ - async startGrpc() { - mainLog.info('Starting gRPC...') + async startLightningWallet() { + mainLog.info('Starting lightning wallet...') const { lndSubscribe, lndMethods } = await lnd.initLnd() // Subscribe to bi-directional streams @@ -126,7 +126,7 @@ class ZapController { lndMethods(event, msg, data) }) - this.sendMessage('grpcConnected') + this.sendMessage('lightningGrpcActive') } /** @@ -142,7 +142,7 @@ class ZapController { walletUnlockerMethods(event, msg, data) }) - this.sendMessage('walletUnlockerStarted') + this.sendMessage('walletUnlockerGrpcActive') } catch (error) { dialog.showMessageBox({ type: 'error', @@ -174,14 +174,14 @@ class ZapController { app.quit() }) - this.neutrino.on('grpc-proxy-started', () => { - mainLog.info('gRPC proxy started') + this.neutrino.on('wallet-unlocker-grpc-active', () => { + mainLog.info('Wallet unlocker gRPC active') this.startWalletUnlocker() }) - this.neutrino.on('wallet-opened', () => { - mainLog.info('Wallet opened') - this.startGrpc() + this.neutrino.on('lightning-grpc-active', () => { + mainLog.info('Lightning gRPC active') + this.startLightningWallet() }) this.neutrino.on('chain-sync-waiting', () => { @@ -243,7 +243,7 @@ class ZapController { mainLog.info(' > host:', cleanOptions.host) mainLog.info(' > cert:', cleanOptions.cert) mainLog.info(' > macaroon:', cleanOptions.macaroon) - this.startGrpc() + this.startLightningWallet() .then(() => this.sendMessage('successfullyCreatedWallet')) .catch(e => { const errors = {}