UNPKG

act-client

Version:
904 lines (812 loc) 20.1 kB
let rp = require('request-promise') //const EventSource = require('eventsource') var sha1 = require('sha1') const http = require('http') //const querystring = require('querystring'); const EventEmitter = require('events'); class MyEmitter extends EventEmitter {} var wrapper = { url : "", user : "", host : "", password : "", challenge : "", challengeResponse : "", token : "", stopped : false } async function getAuthentication(){ return new Promise(async function(resolve, reject){ try{ await getChallenge() getChallengeResponse() await getToken() resolve(wrapper.token) }catch(err){ reject(err) } }) } async function getChallenge(){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAuth/getAuthorizationChallenge', body: { getAuthorizationChallenge: { user: wrapper.user } }, headers: { 'Content-Type': 'application/json' } } rp(options) .then(function(response){ wrapper.challenge = response.getAuthorizationChallengeResponse.challenge; //console.log("CHALLENGE: " + wrapper.challenge); resolve() }) .catch(function (err) { reject(err) }) }) } function setUserToken(user, token) { wrapper.user = user wrapper.token = token } function setUserPassword(user, password) { wrapper.user = user wrapper.password = password } function setUrl(url) { wrapper.url = url let posEnd = url.lastIndexOf(':') let posInit = url.lastIndexOf('/') wrapper.host = url.substr(posInit + 1, posEnd - posInit - 1) } async function getToken(){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAuth/getAuthorizationToken', body: { getAuthorizationToken: { user: wrapper.user, challengeresp: wrapper.challengeResponse } }, headers: { 'Content-Type': 'application/json' } } rp(options) .then(function(response){ wrapper.token = response.getAuthorizationTokenResponse.token; //console.log("TOKEN: " + wrapper.token); resolve() }) .catch(function (err) { reject(err) }) }) } function getChallengeResponse(){ var bytes = []; //console.log("CHALLENGE: " + wrapper.challenge); for(var i = 0; i < wrapper.challenge.length-1; i+=2){ bytes.push(parseInt(wrapper.challenge.substr(i, 2), 16)); } //console.log("PASSWORD: " + wrapper.password); for (var i = 0; i < wrapper.password.length; ++i) { bytes.push(wrapper.password.charCodeAt(i)); } wrapper.challengeResponse = sha1(bytes); //console.log("CHALLENGE RESPONSE: " + wrapper.challengeResponse); } /*function getInterface(){ return new Promise(async function(resolve, reject){ const postData = JSON.stringify( { getInterface: { user: wrapper.user, token: wrapper.token } } ) const options = { host: 'actfx.adhara.io', port: 81, path: '/fcgi-bin/IHFTRestAPI/getInterface', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } }; const req = http.request(options, (res) => { console.log(`STATUS: ${res.statusCode}`); console.log(`HEADERS: ${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => { console.log(`BODY: ${chunk}`); }); res.on('end', () => { console.log('No more data in response.'); resolve() }); }); req.on('error', (e) => { console.error(`problem with request: ${e.message}`); reject() }); // write data to request body req.write(postData); req.end(); }) }*/ /*function getInterface(){ return new Promise(async function(resolve, reject){ var url = wrapper.url + "/fcgi-bin/IHFTRestAPI/getInterface"; var data = JSON.stringify( { getInterface: { user: wrapper.user, token: wrapper.token } } ) $.ajax({ type: "POST", contentType: "application/json", dataType: "json", crossDomain:true, url: url, data: data, success: function(response) { //console.log("POLLING RESPONSE: ",response.getInterfaceResponse.tinterface); resolve(response) //callback(response); }, error: function(error){ console.log(error) reject(error) } }) }) } */ async function getInterface(callback){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/getInterface', body: { getInterface: { user: wrapper.user, token: wrapper.token } }, headers: { 'Content-Type': 'application/json' } } //polling(options) polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) =>{ reject(error) }) }) } async function getAccount(callback){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/getAccount', body: { getAccount: { user: wrapper.user, token: wrapper.token } }, headers: { 'Content-Type': 'application/json' } } polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) =>{ reject(error) }) }) } async function getPricePolling(seclist, tilist, gran, lev, callback){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/getPrice', //uri: wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice', body: { getPrice: { user: wrapper.user, token: wrapper.token, security: seclist, tinterface: tilist, granularity: gran, levels: lev} }, headers: { 'Content-Type': 'application/json' } } polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) =>{ reject(error) }) }) } async function getPriceStreaming( seclist, tilist, gran, lev, int, callback){ return new Promise(async function(resolve, reject){ const postData = JSON.stringify({ getPrice: { user: wrapper.user, token: wrapper.token, security: seclist, tinterface: tilist, granularity: gran, levels: lev, interval: int} }) const options = { hostname: wrapper.host/*'dockerfx.adhara.io'*/, port: 81, path: '/cgi-bin/IHFTRestStreamer/getPrice', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } }; streaming(options, postData, callback).then(() => { resolve() }).catch(() =>{ reject() }) }) } async function setOrder( sec, ti, qua, sid, typ, tif, pri, exp, up, tmp, res, callback){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/setOrder', body: { setOrder: { user: wrapper.user, token: wrapper.token, order:[ { security: sec, tinterface: ti, quantity: qua, side: sid, type: typ, timeinforce: tif, price: pri, expiration: exp, userparam: up, tempid: tmp, result: res }] }, headers: { 'Content-Type': 'application/json' } } } polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) =>{ reject(error) }) }) } async function modifyOrder(fid, pri, qua, callback ){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/modifyOrder', //uri: wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice', body: { modifyOrder: { user: wrapper.user, token: wrapper.token, order:{ fixid: fid, price: pri, quantity: qua } }, headers: { 'Content-Type': 'application/json' } } } polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) =>{ reject(error) }) }) } async function cancelOrder(fid, callback){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/cancelOrder', //uri: wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice', body: { cancelOrder: { user: wrapper.user, token: wrapper.token, fixid: fid }, headers: { 'Content-Type': 'application/json' } } } polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) => { reject(error) }) }) } async function getOrderPolling(seclist, tilist, typlist, callback){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/getOrder', //uri: wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice', body: { getOrder: { user: wrapper.user, token: wrapper.token, security: seclist, tinterface: tilist, type: typlist } }, headers: { 'Content-Type': 'application/json' } } polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) =>{ reject(error) }) }) } async function getOrderStreaming(seclist, tilist, typlist, int, callback){ return new Promise(async function(resolve, reject){ const postData = JSON.stringify({ getOrder: { user: wrapper.user, token: wrapper.token, security: seclist, tinterface: tilist, type: typlist, interval: int } }) const options = { host: wrapper.host, port: 81, path: '/cgi-bin/IHFTRestStreamer/getOrder', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } } streaming( options, postData, callback).then(() => { resolve() }).catch(() =>{ reject() }) }) } async function getPositionPolling(asslist, seclist, acclist, callback){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/getPosition', //uri: wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice', body: { getPosition: { user: wrapper.user, token: wrapper.token, asset: asslist, security: seclist, account: acclist } }, headers: { 'Content-Type': 'application/json' } } polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) =>{ reject(error) }) }) } async function getPositionStreaming(asslist, seclist, acclist, int, callback){ return new Promise(async function(resolve, reject){ const postData = JSON.stringify({ getOrder: { user: wrapper.user, token: wrapper.token, asset: asslist, security: seclist, account: acclist, interval: int } }) const options = { host: wrapper.host, port: 81, path: '/cgi-bin/IHFTRestStreamer/getOrder', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } } streaming( options, postData, callback).then(() => { resolve() }).catch(() =>{ reject() }) }) } async function getIndicatorStreaming(sec, tilist, ind, num, per, callback){ return new Promise(async function(resolve, reject){ const postData = JSON.stringify({ getIndicator: { user: wrapper.user, token: wrapper.token, security: sec, tinterface: tilist, indicator: ind, number: num, period: per } }) const options = { host: wrapper.host, port: 81, path: '/cgi-bin/IHFTRestStreamer/getIndicator', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } } streaming( options, postData, callback).then(() => { resolve() }).catch(() =>{ reject() }) }) } async function getHistoricalPrices (sec, tilist, gran, sid, num, callback){ return new Promise(async function(resolve, reject){ var options = { method: "POST", json: true, //port: 80, uri: wrapper.url + '/fcgi-bin/IHFTRestAPI/getHistoricalPrice', //uri: wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice', body: { getHistoricalPrice: { user: wrapper.user, token: wrapper.token, security: sec, tinterface: tilist, granularity: gran, side: sid, number: num } }, headers: { 'Content-Type': 'application/json' } } polling(options).then((response) => { if (callback){ callback(response) } resolve(response) }).catch((error) =>{ reject(error) }) }) } async function streaming (options, postData, callback){ return new Promise(async function(resolve, reject){ //var error = false var endEvent = false const myEmitter = new MyEmitter(); myEmitter.on('endStreaming', () => { endEvent = true }); const req = http.request(options, (res) => { //console.log(`STATUS: ${res.statusCode}`); //console.log(`HEADERS: ${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => { if( endEvent == true ){ res.destroy() }else{ //console.log(`BODY: ${chunk}`); callback(chunk, myEmitter) } }); res.on('end', () => { //console.log('No more data in response.') resolve() }) }); req.on('error', (e) => { console.error(`problem with request: ${e.message}`); //error = true reject() }); // write data to request body req.write(postData); req.end(); }) } /*function streaming (callback, options, postData){ var error = false var endEvent = false const myEmitter = new MyEmitter(); myEmitter.on('endStreaming', () => { endEvent = true }); const req = http.request(options, (res) => { //console.log(`STATUS: ${res.statusCode}`); //console.log(`HEADERS: ${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => { if( endEvent == true ){ res.destroy() }else{ //console.log(`BODY: ${chunk}`); callback(chunk, myEmitter) } }); res.on('end', () => { console.log('No more data in response.'); return error }); }); req.on('error', (e) => { console.error(`problem with request: ${e.message}`); error = true return error }); // write data to request body req.write(postData); req.end(); }*/ async function polling (options){ return new Promise(async function(resolve, reject){ rp(options) .then(function(response){ resolve(response) }) .catch(function (err) { reject(err) }) }) } /*async function getPriceStreaming(callback, seclist, tilist, gran, lev, int){ const url = wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice' const data = JSON.stringify( { getPrice: { user: wrapper.user, token: wrapper.token, security: seclist, tinterface: tilist, granularity: gran, levels: lev, interval: int } } ); var lastPtr = 0; // jQuery.support.cors = true; var xhr = $.ajax({ type: "POST", contentType: "application/json", dataType: "json", crossDomain:true, url: url, data: data, success: function(response) { console.log("POLLING RESPONSE: ",response.getPriceResponse.tick) //callback(response); }, error: function(error){ console.log(error) reject(error) } }) console.log(xhr.readyState) console.log(xhr.onreadystatechange) console.log(xhr.status) xhr.onreadystatechange = function() { console.log(xhr.readyState); }; /* headers: { 'Access-Control-Allow-Origin' : '*', }, xhrFields: { withCredentials: true }, withCredentials : true, */ /* if (lastPtr>100000){ jqXHR.abort(); var newdata = data.replace(/"number":\d+/g, '"number":2') console.log(newdata); streaming(url, newdata, callback); } */ /* } } }, error: function (jqXHR, ajaxOptionspollin, thrownError) { //alert(jqXHR.statusText); console.log (jqXHR.status); console.log (thrownError); } });*/ //} /*async function getPriceStreaming(fn, seclist, tilist, gran, lev){ const url = wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice' const data = { method: "POST", json: true, u: wrapper.url + '/cgi-bin/IHFTRestStreamer/getPrice', body: { getPrice: { user: wrapper.user, token: wrapper.token, security: seclist, tinterface: tilist, granularity: gran, levels: lev} }, headers: { 'Content-Type': 'application/json' } } const test = querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':'); console.log(test) const postData = JSON.stringify({ getPrice: { user: wrapper.user, token: wrapper.token, security: seclist, tinterface: tilist, granularity: gran, levels: lev} }) //console.log(dataString) //const postData = querystring.stringify({dataString},';', ':'); console.log(postData); const url = "http://actfx.adhara.io:81/cgi-bin/IHFTRestStreamer/getPrice" const options = { //hostname: "http://actfx.adhara.io", //port: 81, //path: '/cgi-bin/IHFTRestStreamer/getPrice', method: 'POST', headers: { 'Content-Type': 'application/json' } }; const req = http.request(options, (res) => { console.log(`STATUS: ${res.statusCode}`); console.log(`HEADERS: ${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => { console.log(`BODY: ${chunk}`); }); res.on('end', () => { console.log('No more data in response.'); }); }); req.on('error', (e) => { console.error(`problem with request: ${e.message}`); }); // write data to request body req.write(postData); req.end(); /*console.log(data) const es = new EventSource(data) es.addEventListener('getPriceStreaming', function (e) { console.log("Listening"+e.data) if(!e.close){ e.close = function (){ es._close() } } fn(e) }) }*/ //module.exports = wrapper /*module.exports.setUserPassword = setUserPassword module.exports.setUrl = setUrl module.exports.getAuthentication = getAuthentication module.exports.getInterface = getInterface module.exports.getAccount = getAccount module.exports.getPricePolling = getPricePolling module.exports.getPriceStreaming = getPriceStreaming module.exports.setOrder = setOrder module.exports.getOrderPolling = getOrderPolling module.exports.modifyOrder = modifyOrder module.exports.cancelOrder = cancelOrder module.exports.getOrderStreaming = getOrderStreaming module.exports.getPositionPolling = getPositionPolling module.exports.getPositionStreaming= getPositionStreaming module.exports.getIndicatorStreaming = getIndicatorStreaming*/ module.exports = { setUserToken, setUserPassword, setUrl, getAuthentication, getInterface, getAccount, getPricePolling, getPriceStreaming, setOrder, getOrderPolling, modifyOrder, cancelOrder, getOrderStreaming, getPositionPolling, getPositionStreaming, getIndicatorStreaming, getHistoricalPrices } //module.exports.getHistoricalPrices = getHistoricalPrices