Adjustments to support multi exchange

This commit is contained in:
Luis Fernando Molina committed 2018-09-16 15:41:09 +02:00
1 parent 2dda1e3e37
commit 047a43530d
5 files changed
+156 -240

No files matched your search

+137
View File
@@ -0,0 +1,137 @@
function newExchangeAPI() {
const INFO_LOG = true;
const LOG_FILE_CONTENT = true;
const MODULE_NAME = "CloudVM -> Poloniex Client API";
let thisObject = {
API: {
analizeResponse: analizeResponse,
returnOpenOrders: returnOpenOrders,
returnOrderTrades: returnOrderTrades,
buy: buy,
sell: sell,
moveOrder: moveOrder,
returnTicker: returnTicker
}
};
return thisObject;
function returnOpenOrders(pMarketAssetA, pMarketAssetB, callBackFunction) {
let path = "ExchangeAPI" + "/"
+ "returnOpenOrders" + "/"
+ window.SESSION_TOKEN + "/"
+ pMarketAssetA + "/"
+ pMarketAssetB
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function returnOrderTrades(pPositionId, callBackFunction) {
let path = "ExchangeAPI" + "/"
+ "returnOrderTrades" + "/"
+ window.SESSION_TOKEN + "/"
+ pPositionId
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function buy(pMarketAssetA, pMarketAssetB, pRate, pAmountB, callBackFunction) {
let path = "ExchangeAPI" + "/"
+ "buy" + "/"
+ window.SESSION_TOKEN + "/"
+ pMarketAssetA + "/"
+ pMarketAssetB + "/"
+ pRate + "/"
+ pAmountB
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function sell(pMarketAssetA, pMarketAssetB, pRate, pAmountB, callBackFunction) {
let path = "ExchangeAPI" + "/"
+ "sell" + "/"
+ window.SESSION_TOKEN + "/"
+ pMarketAssetA + "/"
+ pMarketAssetB + "/"
+ pRate + "/"
+ pAmountB
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function moveOrder(pPositionId, pNewRate, pPositionAmountB, callBackFunction) {
let path = "ExchangeAPI" + "/"
+ "moveOrder" + "/"
+ window.SESSION_TOKEN + "/"
+ pPositionId + "/"
+ pNewRate + "/"
+ pPositionAmountB
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function returnTicker(callBackFunction) {
let path = "ExchangeAPI" + "/"
+ "returnTicker" + "/"
+ window.SESSION_TOKEN
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
}
-228
View File
@@ -1,228 +0,0 @@
function newPoloniexAPIClient() {
const INFO_LOG = true;
const LOG_FILE_CONTENT = true;
const MODULE_NAME = "CloudVM -> Poloniex Client API";
let thisObject = {
API: {
analizeResponse: analizeResponse,
returnOpenOrders: returnOpenOrders,
returnOrderTrades: returnOrderTrades,
buy: buy,
sell: sell,
moveOrder: moveOrder,
returnTicker: returnTicker
}
};
return thisObject;
function analizeResponse(logger, exchangeErr, exchangeResponse, notOkCallBack, okCallBack) {
/* IMPORTANT> This function is an exact copy of the one running at the cloud, with a browsery applied. In this case it means the world global -> window. */
/* This function analizes the different situations we might encounter trying to access Poloniex and returns appropiate standard errors. */
try {
let stringExchangeResponse = JSON.stringify(exchangeResponse);
let stringExchangeErr = JSON.stringify(exchangeErr);
if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] analizeResponse -> exchangeErr = " + stringExchangeErr); }
if (LOG_FILE_CONTENT === true) { logger.write(MODULE_NAME, "[INFO] analizeResponse -> exchangeResponse = " + stringExchangeResponse); }
if (stringExchangeResponse === undefined) {
logger.write(MODULE_NAME, "[WARN] analizeResponse -> No response received from the exchange. Retrying Later.");
notOkCallBack(global.DEFAULT_RETRY_RESPONSE);
return;
}
if (stringExchangeErr.indexOf("ETIMEDOUT") > 0 ||
stringExchangeErr.indexOf("ENOTFOUND") > 0 ||
stringExchangeErr.indexOf("ECONNREFUSED") > 0 ||
stringExchangeErr.indexOf("ESOCKETTIMEDOUT") > 0 ||
stringExchangeErr.indexOf("ECONNRESET") > 0 ||
(stringExchangeResponse !== undefined && (
stringExchangeResponse.indexOf("Connection timed out") > 0 ||
stringExchangeResponse.indexOf("Connection Error") > 0 ||
stringExchangeResponse.indexOf("Bad gateway") > 0 ||
stringExchangeResponse.indexOf("Nonce must be greater than") > 0 ||
stringExchangeResponse.indexOf("Internal error. Please try again") > 0))) {
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> Somethng bad happened while trying to access the Exchange API. Requesting new execution later.");
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> stringExchangeErr = " + stringExchangeErr);
notOkCallBack(window.DEFAULT_RETRY_RESPONSE);
return;
} else {
if (JSON.stringify(exchangeResponse).indexOf("error") > 0) {
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> Unexpected response from the Exchange.");
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> JSON.stringify(exchangeErr) = " + JSON.stringify(exchangeErr));
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> exchangeErr = " + exchangeErr);
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> exchangeResponse = " + exchangeResponse);
/* {"error":"Not enough USDT.","success":0}*/
if (JSON.stringify(exchangeResponse).indexOf("Not enough") > 0) {
let err = {
resutl: window.CUSTOM_FAIL_RESPONSE.result,
message: exchangeResponse.error
};
notOkCallBack(err);
} else {
notOkCallBack(window.DEFAULT_FAIL_RESPONSE);
}
return;
}
if (exchangeErr) {
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> Unexpected error trying to contact the Exchange.");
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> exchangeErr = " + exchangeErr);
notOkCallBack(window.DEFAULT_FAIL_RESPONSE);
return;
} else {
logger.write(MODULE_NAME, "[INFO] analizeResponse -> No problem found.");
okCallBack();
return;
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] analizeResponse -> err.message = " + err.message);
notOkCallBack(window.DEFAULT_FAIL_RESPONSE);
return;
}
}
function returnOpenOrders(pMarketAssetA, pMarketAssetB, callBackFunction) {
let path = "PoloniexAPIClient" + "/"
+ "returnOpenOrders" + "/"
+ window.SESSION_TOKEN + "/"
+ pMarketAssetA + "/"
+ pMarketAssetB
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function returnOrderTrades(pPositionId, callBackFunction) {
let path = "PoloniexAPIClient" + "/"
+ "returnOrderTrades" + "/"
+ window.SESSION_TOKEN + "/"
+ pPositionId
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function buy(pMarketAssetA, pMarketAssetB, pRate, pAmountB, callBackFunction) {
let path = "PoloniexAPIClient" + "/"
+ "buy" + "/"
+ window.SESSION_TOKEN + "/"
+ pMarketAssetA + "/"
+ pMarketAssetB + "/"
+ pRate + "/"
+ pAmountB
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function sell(pMarketAssetA, pMarketAssetB, pRate, pAmountB, callBackFunction) {
let path = "PoloniexAPIClient" + "/"
+ "sell" + "/"
+ window.SESSION_TOKEN + "/"
+ pMarketAssetA + "/"
+ pMarketAssetB + "/"
+ pRate + "/"
+ pAmountB
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function moveOrder(pPositionId, pNewRate, pPositionAmountB, callBackFunction) {
let path = "PoloniexAPIClient" + "/"
+ "moveOrder" + "/"
+ window.SESSION_TOKEN + "/"
+ pPositionId + "/"
+ pNewRate + "/"
+ pPositionAmountB
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
function returnTicker(callBackFunction) {
let path = "PoloniexAPIClient" + "/"
+ "returnTicker" + "/"
+ window.SESSION_TOKEN
;
callServer(undefined, path + "/NO-LOG", onServerResponse);
function onServerResponse(pServerResponse) {
let response = JSON.parse(pServerResponse);
callBackFunction(response.err, response.exchangeResponse);
}
}
}
+2 -2
View File
@@ -55,10 +55,9 @@
<Compile Include="CloudVM\CloudVM.js">
<SubType>Code</SubType>
</Compile>
<Compile Include="CloudVM\PoloniexAPIClient.js" />
<Compile Include="CloudVM\Exchange\ExchangeAPI.js" />
<Compile Include="Server\Exchange\ExchangeAPI.js" />
<Compile Include="Server\Exchange\exchangeUtils.js" />
<Compile Include="Server\Exchange\PoloniexAPIClient.js" />
<Compile Include="Globals.js">
<SubType>Code</SubType>
</Compile>
@@ -230,6 +229,7 @@
<ItemGroup>
<Folder Include="Azure\" />
<Folder Include="CloudVM\" />
<Folder Include="CloudVM\Exchange\" />
<Folder Include="Server\Exchange\" />
<Folder Include="Files\" />
<Folder Include="FloatingSpace\" />
+1 -1
View File
@@ -64,7 +64,7 @@
"FloatingSpace/FloatingObject.js",
"FloatingSpace/FloatingLayer.js",
"CloudVM/PoloniexAPIClient.js",
"CloudVM/Exchange/ExchangeAPI.js",
"CloudVM/CloudSupport.js",
"CloudVM/CloudRequire.js",
"CloudVM/WebFS.js",
+16 -9
View File
@@ -697,7 +697,7 @@ function onBrowserRequest(request, response) {
}
break;
case "PoloniexAPIClient": // This is trying to access this library functionality from the broser.
case "ExchangeAPI": // This is trying to access this library functionality from the broser.
{
/* We are going to let access the exchange only to authenticated users, that measn that we need the a valid session token. */
@@ -711,38 +711,45 @@ function onBrowserRequest(request, response) {
let exchangeKey = session.exchangeKeys[0].key; // 0 because we only deal with one exchange for now.
let exchangeSecret = session.exchangeKeys[0].secret;
const POLONIEX_CLIENT_MODULE = require('./Server/Exchange/' + 'ExchangeAPI');
let poloniexApiClient = POLONIEX_CLIENT_MODULE.newPoloniexAPIClient(exchangeKey, exchangeSecret);
global.EXCHANGE_KEYS = {
"Poloniex": {
"Key": exchangeKey,
"Secret": exchangeSecret
}
}
const EXCHANGE_API = require('./Server/Exchange/' + 'ExchangeAPI');
let exchangeAPI = EXCHANGE_API.newExchangeAPI();
switch (requestParameters[2]) {
case "returnOpenOrders": {
poloniexApiClient.API.returnOpenOrders(requestParameters[4], requestParameters[5], onExchangeResponse);
exchangeAPI.returnOpenOrders(requestParameters[4], requestParameters[5], onExchangeResponse);
break;
}
case "returnOrderTrades": {
poloniexApiClient.API.returnOrderTrades(requestParameters[4], onExchangeResponse);
exchangeAPI.returnOrderTrades(requestParameters[4], onExchangeResponse);
break;
}
case "buy": {
poloniexApiClient.API.buy(requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse);
exchangeAPI.buy(requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse);
break;
}
case "sell": {
poloniexApiClient.API.sell(requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse);
exchangeAPI.sell(requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse);
break;
}
case "moveOrder": {
poloniexApiClient.API.moveOrder(requestParameters[4], requestParameters[5], requestParameters[6], onExchangeResponse);
exchangeAPI.moveOrder(requestParameters[4], requestParameters[5], requestParameters[6], onExchangeResponse);
break;
}
case "returnTicker": {
poloniexApiClient.API.returnTicker(onExchangeResponse);
exchangeAPI.returnTicker(onExchangeResponse);
break;
}
}