@@ -2882,6 +2882,8 @@ const convertDateToDayCode = require('../../../utilities/convert/dateToDayCode')
28822882 convertDayCodeToNumber = require('../../../utilities/convert/dayCodeToNumber'),
28832883 convertBaseCodeToUnitCode = require('../../../utilities/convert/baseCodeToUnitCode');
28842884
2885+ const LoggerFactory = require('./../../../logging/LoggerFactory');
2886+
28852887module.exports = (() => {
28862888 'use strict';
28872889
@@ -2899,6 +2901,7 @@ module.exports = (() => {
28992901 regex.c3.currencies.rub = /^(RUB)\/(.*)$/i;
29002902 regex.c3.currencies.uah = /^(UAH)\/(.*)$/i;
29012903 regex.c3.currencies.usd = /^(USD|Usc|\$|)\/(.*)$/i;
2904+ let logger = null;
29022905 /**
29032906 * Executes an HTTP request for a quote snapshot(s) and returns a
29042907 * promise of quote refresh message(s) (suitable for processing by
@@ -2915,6 +2918,10 @@ module.exports = (() => {
29152918
29162919 function retrieveSnapshots(symbols, username, password) {
29172920 return Promise.resolve().then(() => {
2921+ if (logger === null) {
2922+ logger = LoggerFactory.getLogger('@barchart/marketdata-api-js');
2923+ }
2924+
29182925 let symbolsToUse;
29192926
29202927 if (is.string(symbols)) {
@@ -2991,67 +2998,73 @@ module.exports = (() => {
29912998 };
29922999 return Promise.resolve(axios(options)).then(response => {
29933000 const results = response.data.results || [];
2994- const messages = results.map(result => {
2995- const message = {};
2996- message.type = 'REFRESH_QUOTE';
2997- message.symbol = result.symbol.toUpperCase();
2998- message.name = result.name;
2999- message.exchange = result.exchange;
3000-
3001- if (result.unitCode !== null) {
3002- message.unitcode = convertBaseCodeToUnitCode(parseInt(result.unitCode));
3003- } else {
3004- message.unitcode = '2';
3005- }
3001+ const messages = results.reduce((accumulator, result) => {
3002+ try {
3003+ const message = {};
3004+ message.type = 'REFRESH_QUOTE';
3005+ message.symbol = result.symbol.toUpperCase();
3006+ message.name = result.name;
3007+ message.exchange = result.exchange;
30063008
3007- message.tradeTime = new Date(result.tradeTimestamp);
3008- let dayCode;
3009+ if (result.unitCode !== null) {
3010+ message.unitcode = convertBaseCodeToUnitCode(parseInt(result.unitCode));
3011+ } else {
3012+ message.unitcode = '2';
3013+ }
30093014
3010- if (is.string(result.dayCode) && result.dayCode.length === 1) {
3011- dayCode = result.dayCode;
3012- } else {
3013- dayCode = convertDateToDayCode(message.tradeTime);
3014- }
3015+ message.tradeTime = new Date(result.tradeTimestamp);
3016+ let dayCode;
30153017
3016- message.day = dayCode;
3017- message.dayNum = convertDayCodeToNumber(dayCode);
3018- message.flag = result.flag;
3019- message.mode = result.mode;
3020- message.lastPrice = result.lastPrice;
3021- message.tradeSize = result.tradeSize;
3022- message.numberOfTrades = result.numTrades;
3023- message.bidPrice = result.bid;
3024- message.bidSize = result.bidSize;
3025- message.askPrice = result.ask;
3026- message.askSize = result.askSize;
3027- message.settlementPrice = result.settlement;
3028- message.previousPrice = result.previousLastPrice;
3029- message.openPrice = result.open;
3030- message.highPrice = result.high;
3031- message.lowPrice = result.low;
3032- message.volume = result.volume;
3033- message.lastUpdate = message.tradeTime;
3034-
3035- if (regex.c3.symbol.test(message.symbol)) {
3036- const c3 = {};
3037- c3.currency = null;
3038- c3.delivery = null;
3039-
3040- if (result.commodityDataCurrency) {
3041- c3.currency = getC3Currency(result.commodityDataCurrency);
3018+ if (is.string(result.dayCode) && result.dayCode.length === 1) {
3019+ dayCode = result.dayCode;
3020+ } else {
3021+ dayCode = convertDateToDayCode(message.tradeTime);
30423022 }
30433023
3044- if (result.commodityDataDelivery) {
3045- c3.delivery = result.commodityDataDelivery;
3024+ message.day = dayCode;
3025+ message.dayNum = convertDayCodeToNumber(dayCode);
3026+ message.flag = result.flag;
3027+ message.mode = result.mode;
3028+ message.lastPrice = result.lastPrice;
3029+ message.tradeSize = result.tradeSize;
3030+ message.numberOfTrades = result.numTrades;
3031+ message.bidPrice = result.bid;
3032+ message.bidSize = result.bidSize;
3033+ message.askPrice = result.ask;
3034+ message.askSize = result.askSize;
3035+ message.settlementPrice = result.settlement;
3036+ message.previousPrice = result.previousLastPrice;
3037+ message.openPrice = result.open;
3038+ message.highPrice = result.high;
3039+ message.lowPrice = result.low;
3040+ message.volume = result.volume;
3041+ message.lastUpdate = message.tradeTime;
3042+
3043+ if (regex.c3.symbol.test(message.symbol)) {
3044+ const c3 = {};
3045+ c3.currency = null;
3046+ c3.delivery = null;
3047+
3048+ if (result.commodityDataCurrency) {
3049+ c3.currency = getC3Currency(result.commodityDataCurrency);
3050+ }
3051+
3052+ if (result.commodityDataDelivery) {
3053+ c3.delivery = result.commodityDataDelivery;
3054+ }
3055+
3056+ message.additional = {
3057+ c3: c3
3058+ };
30463059 }
30473060
3048- message.additional = {
3049- c3: c3
3050- } ;
3061+ accumulator.push(message);
3062+ } catch (e) {
3063+ logger.warn(`Snapshot: Failed to process for symbol`) ;
30513064 }
30523065
3053- return message ;
3054- });
3066+ return accumulator ;
3067+ }, [] );
30553068 return messages;
30563069 });
30573070 });
@@ -3066,37 +3079,42 @@ module.exports = (() => {
30663079 return Promise.resolve(axios(options)).then(response => {
30673080 const results = response.data.results || [];
30683081 const messages = symbols.reduce((accumulator, symbol) => {
3069- const result = results.find(result => result.symbol === symbol || result.shortSymbol === symbol);
3082+ try {
3083+ const result = results.find(result => result.symbol === symbol || result.shortSymbol === symbol);
30703084
3071- if (!result) {
3072- return accumulator;
3073- }
3085+ if (!result) {
3086+ return accumulator;
3087+ }
30743088
3075- const match = result.tradeTimestamp.match(regex.day);
3076- const date = new Date(parseInt(match[1]), parseInt(match[2]) - 1, parseInt(match[3]));
3077- const dayCode = convertDateToDayCode(date);
3078- const message = {};
3079- message.type = 'REFRESH_QUOTE';
3089+ const match = result.tradeTimestamp.match(regex.day);
3090+ const date = new Date(parseInt(match[1]), parseInt(match[2]) - 1, parseInt(match[3]));
3091+ const dayCode = convertDateToDayCode(date);
3092+ const message = {};
3093+ message.type = 'REFRESH_QUOTE';
30803094
3081- if (regex.cmdty.long.test(symbol)) {
3082- message.symbol = result.symbol.toUpperCase();
3083- } else {
3084- message.symbol = result.shortSymbol.toUpperCase();
3085- }
3095+ if (regex.cmdty.long.test(symbol)) {
3096+ message.symbol = result.symbol.toUpperCase();
3097+ } else {
3098+ message.symbol = result.shortSymbol.toUpperCase();
3099+ }
30863100
3087- message.name = result.shortName;
3088- message.exchange = 'CSTATS';
3089- message.unitcode = '2';
3090- message.day = dayCode;
3091- message.dayNum = convertDayCodeToNumber(dayCode);
3092- message.lastPrice = result.lastPrice;
3101+ message.name = result.shortName;
3102+ message.exchange = 'CSTATS';
3103+ message.unitcode = '2';
3104+ message.day = dayCode;
3105+ message.dayNum = convertDayCodeToNumber(dayCode);
3106+ message.lastPrice = result.lastPrice;
3107+
3108+ if (result.previousClose) {
3109+ message.previousPrice = result.previousClose;
3110+ }
30933111
3094- if (result.previousClose) {
3095- message.previousPrice = result.previousClose;
3112+ message.lastUpdate = date;
3113+ accumulator.push(message);
3114+ } catch (e) {
3115+ logger.warn(`Snapshot: Failed to process response for cmdtyStats symbol [ ${symbol} ]`);
30963116 }
30973117
3098- message.lastUpdate = date;
3099- accumulator.push(message);
31003118 return accumulator;
31013119 }, []);
31023120 return messages;
@@ -3131,7 +3149,7 @@ module.exports = (() => {
31313149 return retrieveSnapshots;
31323150})();
31333151
3134- },{"../../../utilities/convert/baseCodeToUnitCode":20,"../../../utilities/convert/dateToDayCode":21,"../../../utilities/convert/dayCodeToNumber":22,"@barchart/common-js/lang/array":41,"@barchart/common-js/lang/is":43,"axios":46}],10:[function(require,module,exports){
3152+ },{"../../../utilities/convert/baseCodeToUnitCode":20,"../../../utilities/convert/dateToDayCode":21,"../../../utilities/convert/dayCodeToNumber":22,"./../../../logging/LoggerFactory":12," @barchart/common-js/lang/array":41,"@barchart/common-js/lang/is":43,"axios":46}],10:[function(require,module,exports){
31353153const axios = require('axios');
31363154
31373155const is = require('@barchart/common-js/lang/is');
@@ -8789,6 +8807,18 @@ module.exports = (() => {
87898807 return this.number(candidate) && candidate < 0;
87908808 },
87918809
8810+ /**
8811+ * Returns true if the argument is iterable.
8812+ *
8813+ * @static
8814+ * @public
8815+ * @param {*} candidate
8816+ * @returns {boolean}
8817+ */
8818+ iterable(candidate) {
8819+ return !this.null(candidate) && !this.undefined(candidate) && this.fn(candidate[Symbol.iterator]);
8820+ },
8821+
87928822 /**
87938823 * Returns true if the argument is a string.
87948824 *
0 commit comments