truedata-nodejs
Advanced tools
Comparing version 1.0.15 to 1.0.16
573
feed.js
@@ -16,3 +16,3 @@ const WebSocket = require('ws'); | ||
let lastHeartBeatTime = 0; | ||
let fullFeed = false | ||
let fullFeed = false; | ||
@@ -34,368 +34,363 @@ let user; | ||
module.exports.rtConnect = ( | ||
username, | ||
password, | ||
allSymbols, | ||
userPort = 8082, | ||
bidaskFeed = 1, | ||
heartbeat = 1, | ||
replay = 0 | ||
username, | ||
password, | ||
allSymbols, | ||
userPort = 8082, | ||
bidaskFeed = 1, | ||
heartbeat = 1, | ||
replay = 0 | ||
) => { | ||
disconnectConnection = false; | ||
hearbeatCheckerCalled = false; | ||
if (typeof allSymbols === 'object') symbols = [...allSymbols]; | ||
if (typeof allSymbols === 'string') symbols = [allSymbols]; | ||
bidaskData = bidaskFeed === 1 ? true : false; | ||
heartbeatMessage = heartbeat === 1 ? true : false; | ||
if (replay === 1) connectionUrl = 'wss://replay.truedata.in:'; | ||
user = username; | ||
pwd = password; | ||
port = userPort; | ||
connect(); | ||
disconnectConnection = false; | ||
hearbeatCheckerCalled = false; | ||
if (typeof allSymbols === 'object') symbols = [...allSymbols]; | ||
if (typeof allSymbols === 'string') symbols = [allSymbols]; | ||
bidaskData = bidaskFeed === 1 ? true : false; | ||
heartbeatMessage = heartbeat === 1 ? true : false; | ||
if (replay === 1) connectionUrl = 'wss://replay.truedata.in:'; | ||
user = username; | ||
pwd = password; | ||
port = userPort; | ||
connect(); | ||
}; | ||
module.exports.rtConnectFullFeed = async ( | ||
username, | ||
password, | ||
symbolName = 1, | ||
userPort = 8082, | ||
bidaskFeed = 1, | ||
heartbeat = 1, | ||
replay = 0 | ||
username, | ||
password, | ||
symbolName = 1, | ||
userPort = 8082, | ||
bidaskFeed = 1, | ||
heartbeat = 1, | ||
replay = 0 | ||
) => { | ||
disconnectConnection = false; | ||
hearbeatCheckerCalled = false; | ||
fullFeed = true | ||
disconnectConnection = false; | ||
hearbeatCheckerCalled = false; | ||
fullFeed = true; | ||
if (symbolName !== 0) { | ||
const d = new Date() | ||
const date = new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()).toDateString() | ||
const time = new Date().setUTCHours(2, 40, 0); | ||
if (symbolName !== 0) { | ||
const d = new Date(); | ||
const date = new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()).toDateString(); | ||
const time = new Date().setUTCHours(2, 40, 0); | ||
const symbolNamePath = path.join(__dirname, 'symbolName.json'); | ||
const symbolNamePath = path.join(__dirname, 'symbolName.json'); | ||
try { | ||
const symbolFile = JSON.parse(fs.readFileSync(symbolNamePath)); | ||
if (symbolFile && symbolFile[date] && symbolName !== 2) { | ||
touchlineMap = symbolFile[date] | ||
} else throw '' | ||
} catch (err) { | ||
console.log('Downloading Symbol Names... ( To skip this, please put symbolName = 0 while connecting )') | ||
await fetchSymbolNames(username, password, symbolNamePath, date) | ||
} | ||
try { | ||
const symbolFile = JSON.parse(fs.readFileSync(symbolNamePath)); | ||
if (symbolFile && symbolFile[date] && symbolName !== 2) { | ||
touchlineMap = symbolFile[date]; | ||
} else throw ''; | ||
} catch (err) { | ||
console.log('Downloading Symbol Names... ( To skip this, please put symbolName = 0 while connecting )'); | ||
await fetchSymbolNames(username, password, symbolNamePath, date); | ||
} | ||
if (d < time) { | ||
setTimeout(async () => { | ||
console.log('Updating Symbol Names...') | ||
await fetchSymbolNames(username, password, symbolNamePath, date) | ||
closeConnection() | ||
}, time - d + 20000); | ||
} | ||
if (d < time) { | ||
setTimeout(async () => { | ||
console.log('Updating Symbol Names...'); | ||
await fetchSymbolNames(username, password, symbolNamePath, date); | ||
closeConnection(); | ||
}, time - d + 20000); | ||
} | ||
} | ||
} | ||
bidaskData = bidaskFeed === 1 ? true : false; | ||
heartbeatMessage = heartbeat === 1 ? true : false; | ||
if (replay === 1) connectionUrl = 'wss://replay.truedata.in:'; | ||
user = username; | ||
pwd = password; | ||
port = userPort; | ||
connect(); | ||
bidaskData = bidaskFeed === 1 ? true : false; | ||
heartbeatMessage = heartbeat === 1 ? true : false; | ||
if (replay === 1) connectionUrl = 'wss://replay.truedata.in:'; | ||
user = username; | ||
pwd = password; | ||
port = userPort; | ||
connect(); | ||
}; | ||
module.exports.rtSubscribe = (subSymbols) => { | ||
if (connection) { | ||
additionSub = true; | ||
additionSubLength = subSymbols.length; | ||
symbols = [...symbols, ...subSymbols]; | ||
subscribe(subSymbols); | ||
} else { | ||
console.log( | ||
'Error: Please use rtConnect(user, pwd, symbols, port, (bidask = 0), (heartbeat = 1)) to initiate connection.' | ||
); | ||
} | ||
if (connection) { | ||
additionSub = true; | ||
additionSubLength = subSymbols.length; | ||
symbols = [...symbols, ...subSymbols]; | ||
subscribe(subSymbols); | ||
} else { | ||
console.log( | ||
'Error: Please use rtConnect(user, pwd, symbols, port, (bidask = 0), (heartbeat = 1)) to initiate connection.' | ||
); | ||
} | ||
}; | ||
module.exports.rtUnsubscribe = (unSubSymbols) => { | ||
symbols = symbols.filter((symbol) => !unSubSymbols.includes(symbol)); | ||
unSubscribe(unSubSymbols); | ||
symbols = symbols.filter((symbol) => !unSubSymbols.includes(symbol)); | ||
unSubscribe(unSubSymbols); | ||
}; | ||
module.exports.rtDisconnect = () => { | ||
disconnectConnection = true; | ||
for (let i = 0; i < 20; i++) { | ||
clearInterval(t); | ||
} | ||
closeConnection(); | ||
if (connection) { | ||
disconnectConnection = true; | ||
for (let i = 0; i < 20; i++) { | ||
clearInterval(t); | ||
} | ||
closeConnection(); | ||
} else { | ||
console.log('Calling rtDisconnect before the websocket connection is established'); | ||
} | ||
}; | ||
const connect = () => { | ||
console.log('Connecting..'); | ||
url = connectionUrl + port + '?user=' + user + '&password=' + pwd; | ||
console.log(url); | ||
try { | ||
connection = new WebSocket(url); | ||
console.log('Connecting..'); | ||
url = connectionUrl + port + '?user=' + user + '&password=' + pwd; | ||
console.log(url); | ||
try { | ||
connection = new WebSocket(url); | ||
connection.onopen = socketonopen; | ||
connection.onerror = socketonerror; | ||
connection.onmessage = socketonmessage; | ||
connection.onclose = socketonclose; | ||
connection.onopen = socketonopen; | ||
connection.onerror = socketonerror; | ||
connection.onmessage = socketonmessage; | ||
connection.onclose = socketonclose; | ||
return true; | ||
} catch (error) { | ||
console.log(error); | ||
setInterval(connect, reconnectionTime); | ||
return false; | ||
} | ||
return true; | ||
} catch (error) { | ||
console.log(error); | ||
setInterval(connect, reconnectionTime); | ||
return false; | ||
} | ||
}; | ||
function socketonopen(e) { | ||
console.log('Connected Websocket'); | ||
console.log('Connected Websocket'); | ||
} | ||
function socketonerror(e) { | ||
console.log('Websocket Error ' + e.message); | ||
console.log('Websocket Error ' + e.message); | ||
} | ||
function socketonmessage(e) { | ||
var jsonObj = JSON.parse(e.data); | ||
var jsonObj = JSON.parse(e.data); | ||
if (jsonObj.trade != null) { | ||
const tradeArray = jsonObj.trade; | ||
rtFeed.emit('tick', handleRealTimeData(tradeArray)); | ||
} | ||
if (jsonObj.trade != null) { | ||
const tradeArray = jsonObj.trade; | ||
rtFeed.emit('tick', handleRealTimeData(tradeArray)); | ||
} else if (bidaskData && jsonObj.bidask != null) { | ||
const bidaskArray = jsonObj.bidask; | ||
rtFeed.emit('bidask', handleBidaskData(bidaskArray)); | ||
} else if (jsonObj.bar1min) { | ||
const barArray = jsonObj.bar1min; | ||
rtFeed.emit('bar', handleBarData(barArray, '1min')); | ||
} else if (jsonObj.bar5min) { | ||
const barArray = jsonObj.bar5min; | ||
rtFeed.emit('bar', handleBarData(barArray, '5min')); | ||
} else if (jsonObj.interval) { | ||
const bar = jsonObj.interval; | ||
const barDataArray = jsonObj.data.map((barArray) => handleFullFeedBarData(barArray, bar)); | ||
rtFeed.emit('barArray', barDataArray); | ||
} else if (jsonObj.success) { | ||
switch (jsonObj.message) { | ||
case 'TrueData Real Time Data Service': | ||
if (reconnectLogs.length === 0) console.log(jsonObj); | ||
else if (bidaskData && jsonObj.bidask != null) { | ||
const bidaskArray = jsonObj.bidask; | ||
rtFeed.emit('bidask', handleBidaskData(bidaskArray)); | ||
} | ||
if (!hearbeatCheckerCalled) { | ||
hearbeatChecker(); | ||
hearbeatCheckerCalled = true; | ||
} | ||
!fullFeed && subscribe(symbols); | ||
break; | ||
else if (jsonObj.bar1min) { | ||
const barArray = jsonObj.bar1min; | ||
rtFeed.emit('bar', handleBarData(barArray, '1min')); | ||
} | ||
case 'symbols added': | ||
totalSymbolsAdded += jsonObj.symbolsadded; | ||
console.log( | ||
`Added Symbols:${jsonObj.symbolsadded}, Total Symbols Subscribed:${jsonObj.totalsymbolsubscribed}` | ||
); | ||
else if (jsonObj.bar5min) { | ||
const barArray = jsonObj.bar5min; | ||
rtFeed.emit('bar', handleBarData(barArray, '5min')); | ||
} | ||
jsonObj.symbollist.forEach((d) => { | ||
touchlineData[d[1]] = handleTouchline(d); | ||
touchlineMap[d[1]] = d[0]; | ||
}); | ||
else if (jsonObj.interval) { | ||
const bar = jsonObj.interval | ||
const barDataArray = jsonObj.data.map(barArray=> handleFullFeedBarData(barArray, bar)); | ||
rtFeed.emit('barArray', barDataArray); | ||
} | ||
if ( | ||
jsonObj.totalsymbolsubscribed === symbols.length || | ||
(additionSub && totalSymbolsAdded === additionSubLength) | ||
) { | ||
if (reconnectLogs.length === 0 || additionSub) rtFeed.emit('touchline', touchlineData); | ||
totalSymbolsAdded = 0; | ||
additionSub = false; | ||
additionSubLength = null; | ||
} | ||
break; | ||
else if (jsonObj.success) { | ||
switch (jsonObj.message) { | ||
case 'TrueData Real Time Data Service': | ||
if (reconnectLogs.length === 0) console.log(jsonObj); | ||
case 'symbols removed': | ||
console.log( | ||
`Removed Symbols:${jsonObj.symbolsremoved}, Symbols Subscribed:${jsonObj.totalsymbolsubscribed}` | ||
); | ||
break; | ||
if (!hearbeatCheckerCalled) { | ||
hearbeatChecker(); | ||
hearbeatCheckerCalled = true; | ||
} | ||
!fullFeed && subscribe(symbols); | ||
break; | ||
case 'touchline': | ||
jsonObj.symbollist.forEach((touchline) => { | ||
touchlineData[touchline[1]] = handleTouchline(touchline); | ||
}); | ||
case 'symbols added': | ||
totalSymbolsAdded += jsonObj.symbolsadded; | ||
console.log(`Added Symbols:${jsonObj.symbolsadded}, Total Symbols Subscribed:${jsonObj.totalsymbolsubscribed}`); | ||
rtFeed.emit('touchline', touchlineData); | ||
break; | ||
jsonObj.symbollist.forEach((d) => { | ||
touchlineData[d[1]] = handleTouchline(d); | ||
touchlineMap[d[1]] = d[0]; | ||
}); | ||
case 'HeartBeat': | ||
const { message, timestamp } = jsonObj; | ||
heartbeatMessage && console.log('Message ' + message + ' Time: ' + timestamp); | ||
rtFeed.emit('heartbeat', { Message: message, Timestamp: timestamp }); | ||
lastHeartBeatTime = Date.now(); | ||
break; | ||
if ( | ||
jsonObj.totalsymbolsubscribed === symbols.length || | ||
(additionSub && totalSymbolsAdded === additionSubLength) | ||
) { | ||
if (reconnectLogs.length === 0 || additionSub) rtFeed.emit('touchline', touchlineData); | ||
totalSymbolsAdded = 0; | ||
additionSub = false; | ||
additionSubLength = null; | ||
} | ||
break; | ||
case 'marketstatus': | ||
rtFeed.emit('marketstatus', jsonObj.data); | ||
break; | ||
case 'symbols removed': | ||
console.log(`Removed Symbols:${jsonObj.symbolsremoved}, Symbols Subscribed:${jsonObj.totalsymbolsubscribed}`); | ||
break; | ||
case 'touchline': | ||
jsonObj.symbollist.forEach((touchline) => { | ||
touchlineData[touchline[1]] = handleTouchline(touchline); | ||
}); | ||
rtFeed.emit('touchline', touchlineData); | ||
break; | ||
case 'HeartBeat': | ||
heartbeatMessage && console.log('Message ' + jsonObj.message + ' Time: ' + jsonObj.timestamp); | ||
lastHeartBeatTime = Date.now(); | ||
break; | ||
case 'marketstatus': | ||
rtFeed.emit('marketstatus', jsonObj.data) | ||
break; | ||
default: | ||
console.log(jsonObj); | ||
} | ||
} | ||
else if (jsonObj.success == false) { | ||
console.log('Not connected'); | ||
console.log(jsonObj); | ||
} | ||
default: | ||
console.log(jsonObj); | ||
} | ||
} else if (jsonObj.success == false) { | ||
console.log('Not connected'); | ||
console.log(jsonObj); | ||
} | ||
} | ||
function closeConnection() { | ||
connection.close(); | ||
connection.close(); | ||
} | ||
function socketonclose() { | ||
console.log('Disconnected Websocket'); | ||
if (!disconnectConnection) setTimeout(connect, reconnectionTime); | ||
console.log('Disconnected Websocket'); | ||
if (!disconnectConnection) setTimeout(connect, reconnectionTime); | ||
} | ||
function subscribe(symbols) { | ||
//for-loop to override max 65000 characters | ||
for (let i = 0; i <= symbols.length; i += 1500) { | ||
const jsonRequest = { | ||
method: 'addsymbol', | ||
symbols: symbols.slice(i, i + 1500), | ||
}; | ||
let s = JSON.stringify(jsonRequest); | ||
connection.send(s); | ||
} | ||
//for-loop to override max 65000 characters | ||
for (let i = 0; i <= symbols.length; i += 1500) { | ||
const jsonRequest = { | ||
method: 'addsymbol', | ||
symbols: symbols.slice(i, i + 1500), | ||
}; | ||
let s = JSON.stringify(jsonRequest); | ||
connection.send(s); | ||
} | ||
} | ||
function unSubscribe(symbols) { | ||
for (let i = 0; i <= symbols.length; i += 1500) { | ||
const jsonRequest = { | ||
method: 'removesymbol', | ||
symbols: symbols.slice(i, i + 1500), | ||
}; | ||
let s = JSON.stringify(jsonRequest); | ||
connection.send(s); | ||
} | ||
for (let i = 0; i <= symbols.length; i += 1500) { | ||
const jsonRequest = { | ||
method: 'removesymbol', | ||
symbols: symbols.slice(i, i + 1500), | ||
}; | ||
let s = JSON.stringify(jsonRequest); | ||
connection.send(s); | ||
} | ||
} | ||
function hearbeatChecker() { | ||
t = setInterval(() => { | ||
const checkerHeartBeat = Date.now() - lastHeartBeatTime; | ||
if (checkerHeartBeat > 15000) { | ||
closeConnection(); | ||
hearbeatCheckerCalled = false; | ||
const reconnectLog = `Auto Reconnect Initiated @ ${new Date().toLocaleTimeString()}`; | ||
reconnectLogs.push(reconnectLog); | ||
console.log(reconnectLog); | ||
for (let i = 0; i < 20; i++) { | ||
clearInterval(t); | ||
} | ||
} | ||
}, 20000); | ||
t = setInterval(() => { | ||
const checkerHeartBeat = Date.now() - lastHeartBeatTime; | ||
if (checkerHeartBeat > 15000) { | ||
closeConnection(); | ||
hearbeatCheckerCalled = false; | ||
const reconnectLog = `Auto Reconnect Initiated @ ${new Date().toLocaleTimeString()}`; | ||
reconnectLogs.push(reconnectLog); | ||
console.log(reconnectLog); | ||
for (let i = 0; i < 20; i++) { | ||
clearInterval(t); | ||
} | ||
} | ||
}, 20000); | ||
} | ||
function handleTouchline(touchline) { | ||
return { | ||
Symbol: touchline[0], | ||
LastUpdateTime: touchline[2], | ||
LTP: +touchline[3], | ||
TickVolume: +touchline[4], | ||
ATP: +touchline[5], | ||
TotalVolume: +touchline[6], | ||
Open: +touchline[7], | ||
High: +touchline[8], | ||
Low: +touchline[9], | ||
Previous_Close: +touchline[10], | ||
Today_OI: +touchline[11], | ||
Previous_Open_Interest_Close: +touchline[12], | ||
Turnover: +touchline[13], | ||
Bid: +touchline[14] || 0, | ||
BidQty: +touchline[15] || 0, | ||
Ask: +touchline[16] || 0, | ||
AskQty: +touchline[17] || 0, | ||
}; | ||
return { | ||
Symbol: touchline[0], | ||
LastUpdateTime: touchline[2], | ||
LTP: +touchline[3], | ||
TickVolume: +touchline[4], | ||
ATP: +touchline[5], | ||
TotalVolume: +touchline[6], | ||
Open: +touchline[7], | ||
High: +touchline[8], | ||
Low: +touchline[9], | ||
Previous_Close: +touchline[10], | ||
Today_OI: +touchline[11], | ||
Previous_Open_Interest_Close: +touchline[12], | ||
Turnover: +touchline[13], | ||
Bid: +touchline[14] || 0, | ||
BidQty: +touchline[15] || 0, | ||
Ask: +touchline[16] || 0, | ||
AskQty: +touchline[17] || 0, | ||
}; | ||
} | ||
function handleRealTimeData(tradeArray) { | ||
return { | ||
Symbol: touchlineMap[tradeArray[0]], | ||
Symbol_ID: +tradeArray[0], | ||
Timestamp: tradeArray[1], | ||
LTP: +tradeArray[2], | ||
LTQ: +tradeArray[3], | ||
ATP: +tradeArray[4], | ||
Volume: +tradeArray[5], | ||
Open: +tradeArray[6], | ||
High: +tradeArray[7], | ||
Low: +tradeArray[8], | ||
Prev_Close: +tradeArray[9], | ||
OI: +tradeArray[10], | ||
Prev_Open_Int_Close: +tradeArray[11], | ||
Day_Turnover: +tradeArray[12], | ||
Special: tradeArray[13], | ||
Tick_Sequence_No: +tradeArray[14], | ||
Bid: tradeArray[15] !== undefined ? +tradeArray[15] : bidDeactivatedMessage, | ||
Bid_Qty: tradeArray[16] !== undefined ? +tradeArray[16] : bidDeactivatedMessage, | ||
Ask: tradeArray[17] !== undefined ? +tradeArray[17] : bidDeactivatedMessage, | ||
Ask_Qty: tradeArray[18] !== undefined ? +tradeArray[18] : bidDeactivatedMessage, | ||
}; | ||
return { | ||
Symbol: touchlineMap[tradeArray[0]], | ||
Symbol_ID: +tradeArray[0], | ||
Timestamp: tradeArray[1], | ||
LTP: +tradeArray[2], | ||
LTQ: +tradeArray[3], | ||
ATP: +tradeArray[4], | ||
Volume: +tradeArray[5], | ||
Open: +tradeArray[6], | ||
High: +tradeArray[7], | ||
Low: +tradeArray[8], | ||
Prev_Close: +tradeArray[9], | ||
OI: +tradeArray[10], | ||
Prev_Open_Int_Close: +tradeArray[11], | ||
Day_Turnover: +tradeArray[12], | ||
Special: tradeArray[13], | ||
Tick_Sequence_No: +tradeArray[14], | ||
Bid: tradeArray[15] !== undefined ? +tradeArray[15] : bidDeactivatedMessage, | ||
Bid_Qty: tradeArray[16] !== undefined ? +tradeArray[16] : bidDeactivatedMessage, | ||
Ask: tradeArray[17] !== undefined ? +tradeArray[17] : bidDeactivatedMessage, | ||
Ask_Qty: tradeArray[18] !== undefined ? +tradeArray[18] : bidDeactivatedMessage, | ||
}; | ||
} | ||
function handleBidaskData(bidaskArray) { | ||
return { | ||
Symbol: touchlineMap[bidaskArray[0]], | ||
SymbolId: bidaskArray[0], | ||
Time: bidaskArray[1], | ||
Bid: +bidaskArray[2], | ||
BidQty: +bidaskArray[3], | ||
Ask: +bidaskArray[4], | ||
AskQty: +bidaskArray[5], | ||
}; | ||
return { | ||
Symbol: touchlineMap[bidaskArray[0]], | ||
SymbolId: bidaskArray[0], | ||
Time: bidaskArray[1], | ||
Bid: +bidaskArray[2], | ||
BidQty: +bidaskArray[3], | ||
Ask: +bidaskArray[4], | ||
AskQty: +bidaskArray[5], | ||
}; | ||
} | ||
function handleBarData(barArray, bar) { | ||
return { | ||
Symbol: touchlineMap[barArray[0]], | ||
SymbolId: barArray[0], | ||
Bar: bar, | ||
Time: barArray[1], | ||
Open: +barArray[2], | ||
High: +barArray[3], | ||
Low: +barArray[4], | ||
Close: +barArray[5], | ||
Volume: +barArray[6], | ||
OI: +barArray[7], | ||
}; | ||
return { | ||
Symbol: touchlineMap[barArray[0]], | ||
SymbolId: barArray[0], | ||
Bar: bar, | ||
Time: barArray[1], | ||
Open: +barArray[2], | ||
High: +barArray[3], | ||
Low: +barArray[4], | ||
Close: +barArray[5], | ||
Volume: +barArray[6], | ||
OI: +barArray[7], | ||
}; | ||
} | ||
function handleFullFeedBarData(barArray, bar) { | ||
return { | ||
Symbol: touchlineMap[barArray[1]], | ||
SymbolId: barArray[1], | ||
Bar: bar, | ||
Time: barArray[0], | ||
Open: +barArray[2], | ||
High: +barArray[3], | ||
Low: +barArray[4], | ||
Close: +barArray[5], | ||
Volume: +barArray[6], | ||
OI: +barArray[7], | ||
}; | ||
return { | ||
Symbol: touchlineMap[barArray[1]], | ||
SymbolId: barArray[1], | ||
Bar: bar, | ||
Time: barArray[0], | ||
Open: +barArray[2], | ||
High: +barArray[3], | ||
Low: +barArray[4], | ||
Close: +barArray[5], | ||
Volume: +barArray[6], | ||
OI: +barArray[7], | ||
}; | ||
} | ||
async function fetchSymbolNames(username, password, symbolNamePath, date) { | ||
const symbolNames = await axios | ||
.get(`https://api.truedata.in/getAllSymbols?segment=all&user=${username}&password=${password}&allexpiry=false`) | ||
.catch((err) => console.log('Downloading Symbol Names Failed...', err.response)); | ||
symbolNames.data.Records.forEach((d) => { | ||
touchlineMap[d[0]] = d[1]; | ||
}); | ||
const symbolNames = await axios | ||
.get(`https://api.truedata.in/getAllSymbols?segment=all&user=${username}&password=${password}&allexpiry=false`) | ||
.catch((err) => console.log('Downloading Symbol Names Failed...', err.response)); | ||
symbolNames.data.Records.forEach((d) => { | ||
touchlineMap[d[0]] = d[1]; | ||
}); | ||
fs.writeFileSync(symbolNamePath, JSON.stringify({ [date]: touchlineMap })); | ||
fs.writeFileSync(symbolNamePath, JSON.stringify({ [date]: touchlineMap })); | ||
return | ||
return; | ||
} |
@@ -202,3 +202,3 @@ const axios = require('axios'); | ||
.catch((err) => { | ||
if (err.response && err.response.data && err.response.data.Mesage) console.log(err.response.data.Mesage); | ||
if (err.response && err.response.data && err.response.data.Message) console.log(err.response.data.Message); | ||
else if (err.response.data) console.log(err.response.data); | ||
@@ -276,2 +276,3 @@ else console.log(err.response); | ||
err.response.data && | ||
err.response.data.Message && | ||
err.response.data.Message.startsWith('Authorization has been denied for this request') && | ||
@@ -278,0 +279,0 @@ !reAuthenticated |
{ | ||
"name": "truedata-nodejs", | ||
"version": "1.0.15", | ||
"version": "1.0.16", | ||
"description": "Truedata's Official Nodejs Package", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -30,3 +30,5 @@ # Documentation for TrueData Nodejs | ||
rtFeed.on('bar', barHandler); // Receives 1min and 5min bar data | ||
rtFeed.on('marketstatus', marketStatusHandler) // Receives market status messages | ||
rtFeed.on('heartbeat', heartbeatHandler); // Receives market status messages | ||
rtFeed.on('heartbeat', heartbeatHandler); // Receives heartbeat message and time | ||
@@ -53,2 +55,6 @@ function touchlineHandler(touchline){ | ||
function heartbeatHandler(heartbeat) { | ||
console.log(heartbeat); | ||
} | ||
### Default values and available values | ||
@@ -171,2 +177,3 @@ | ||
rtFeed.on('marketstatus', marketStatusHandler) | ||
rtFeed.on('heartbeat', heartbeatHandler); | ||
@@ -193,2 +200,6 @@ function touchlineHandler(touchline) { | ||
function heartbeatHandler(heartbeat) { | ||
console.log(heartbeat); | ||
} | ||
historical.auth(user, pwd); // For authentication | ||
@@ -195,0 +206,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
680
232
32943