diff --git a/src/__test__/ccxt_conctroller.test.ts b/src/__test__/ccxt_conctroller.test.ts index 5c9f815..267c849 100644 --- a/src/__test__/ccxt_conctroller.test.ts +++ b/src/__test__/ccxt_conctroller.test.ts @@ -8,7 +8,10 @@ describe('CCXT Controller Test', () => { // Add Binance exhcange test('Add valid exchange', async () => { const exchange = CCXT_API.initNewExchanges('binance'); + CCXT_API.initNewExchanges('binance'); + CCXT_API.initNewExchanges('binance'); + expect(CCXT_API.exchanges).toHaveLength(1); expect(exchange.api.tokenBucket).toBeDefined(); }); diff --git a/src/exchange/ccxt_controller.ts b/src/exchange/ccxt_controller.ts index a60825d..29cee57 100644 --- a/src/exchange/ccxt_controller.ts +++ b/src/exchange/ccxt_controller.ts @@ -3,8 +3,13 @@ import _ from 'lodash'; import * as ccxt from 'ccxt'; import { logger } from '../logger'; +type CcxtInstance = { + exchangeName: string; + api: any; +}; + class ExchangeAPI { - exchanges: any[]; + exchanges: CcxtInstance[]; constructor() { this.exchanges = []; } @@ -61,20 +66,28 @@ class ExchangeAPI { } /* CCXT API STUFF */ + _isExchangeLoaded(exchange: string): boolean { + const exchangeName = exchange.toLowerCase(); + + if (this.exchanges.find((e) => e.exchangeName === exchangeName)) { + return true; + } + + return false; + } loadExchangeAPI(exchange: string): any { try { const exchangeName = exchange.toLowerCase(); // Check if CCXT API already loaded - let exchangeData = this.exchanges.find((e) => e.exchange === exchangeName); + const exchangeData = this.exchanges.find((e) => e.exchangeName === exchangeName); - // CCTX API load from buffer or add to the buffer - if (!exchangeData) { - exchangeData = this.initNewExchanges(exchangeName); + if (exchangeData?.api) { + return exchangeData.api; } - return exchangeData.api; + return this.initNewExchanges(exchangeName).api; } catch (e) { logger.error('CCXT load API error ', e); } @@ -86,7 +99,9 @@ class ExchangeAPI { if (_.isObject(ccxt[exchangeName])) { const api = new ccxt[exchangeName](); - this.exchanges.push({ exchangeName, api }); + if (!this._isExchangeLoaded(exchange)) { + this.exchanges.push({ exchangeName, api }); + } return { exchangeName, api }; } diff --git a/src/pricetickers/index.ts b/src/pricetickers/index.ts index 4ea76d6..3dfc4a7 100644 --- a/src/pricetickers/index.ts +++ b/src/pricetickers/index.ts @@ -30,11 +30,11 @@ class PriceTickers { } if (updatePromises.length > 0) { - logger.verbose('Marketdata Update loop'); + logger.verbose('PriceTickers Update loop'); await Promise.all(updatePromises); } } catch (e) { - logger.error('Marketdata Update ', e); + logger.error('PriceTickers Update loop', e); } finally { setTimeout(() => { this.updateLoop(); @@ -80,7 +80,7 @@ class PriceTickers { return; } catch (e) { - logger.error('Update_tradepairs ', e); + logger.error('PriceTickers Update ', e); } }