act-client
Version:
ACT Wrapper for nodejs
904 lines (812 loc) • 20.1 kB
JavaScript
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