diff --git a/lib/cli/commands/subscribeorders.ts b/lib/cli/commands/subscribeorders.ts index 00b569d1d..33a5cd823 100644 --- a/lib/cli/commands/subscribeorders.ts +++ b/lib/cli/commands/subscribeorders.ts @@ -15,6 +15,22 @@ export const builder = { }; export const handler = (argv: Arguments) => { + ensureConnection(argv, true); +}; + +const ensureConnection = (argv: Arguments, printError?: boolean) => { + loadXudClient(argv).getInfo(new xudrpc.GetInfoRequest(), (error: Error | null) => { + if (error) { + if (printError) console.error(`${error.name}: ${error.message}`); + setTimeout(ensureConnection.bind(undefined, argv), 3000); + } else { + console.log('Successfully connected, subscribing for orders'); + subscribeOrders(argv); + } + }); +}; + +const subscribeOrders = (argv: Arguments) => { const addedOrdersRequest = new xudrpc.SubscribeAddedOrdersRequest(); addedOrdersRequest.setExisting(argv.existing); const addedOrdersSubscription = loadXudClient(argv).subscribeAddedOrders(addedOrdersRequest); @@ -22,13 +38,28 @@ export const handler = (argv: Arguments) => { console.log(`Order added: ${JSON.stringify(order.toObject())}`); }); + // adding end, close, error events only once, + // since they'll be thrown for three of subscriptions in the corresponding cases, catching once is enough. + addedOrdersSubscription.on('end', ensureConnection.bind(undefined, argv, true)); + addedOrdersSubscription.on('close', ensureConnection.bind(undefined, argv, true)); + addedOrdersSubscription.on('error', (err: Error) => { + console.log(`Unexpected error occured: ${JSON.stringify(err)}, retrying to connect`); + ensureConnection(argv); + }); + const removedOrdersSubscription = loadXudClient(argv).subscribeRemovedOrders(new xudrpc.SubscribeRemovedOrdersRequest()); removedOrdersSubscription.on('data', (orderRemoval: xudrpc.OrderRemoval) => { console.log(`Order removed: ${JSON.stringify(orderRemoval.toObject())}`); }); + // prevent exiting and do nothing, it's already cached above. + removedOrdersSubscription.on('error', () => {}); + const swapsSubscription = loadXudClient(argv).subscribeSwaps(new xudrpc.SubscribeSwapsRequest()); swapsSubscription.on('data', (swapResult: xudrpc.SwapResult) => { console.log(`Order swapped: ${JSON.stringify(swapResult.toObject())}`); }); + + // prevent exiting and do nothing, it's already cached above. + swapsSubscription.on('error', () => {}); };