From 047a43530d13a3660f6ee1f9a71dc6c1c0e46ebd Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 16 Sep 2018 15:41:09 +0200 Subject: [PATCH] Adjustments to support multi exchange --- CloudVM/Exchange/ExchangeAPI.js | 137 +++++++++++++++++++ CloudVM/PoloniexAPIClient.js | 228 -------------------------------- Project.njsproj | 4 +- Scripts/AppLoader.js | 2 +- server.js | 25 ++-- 5 files changed, 156 insertions(+), 240 deletions(-) create mode 100644 CloudVM/Exchange/ExchangeAPI.js delete mode 100644 CloudVM/PoloniexAPIClient.js diff --git a/CloudVM/Exchange/ExchangeAPI.js b/CloudVM/Exchange/ExchangeAPI.js new file mode 100644 index 000000000..fcf576abf --- /dev/null +++ b/CloudVM/Exchange/ExchangeAPI.js @@ -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); + + } + } +} diff --git a/CloudVM/PoloniexAPIClient.js b/CloudVM/PoloniexAPIClient.js deleted file mode 100644 index e8f124edb..000000000 --- a/CloudVM/PoloniexAPIClient.js +++ /dev/null @@ -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); - - } - } -} diff --git a/Project.njsproj b/Project.njsproj index 79f95a42d..d4fbd65a8 100644 --- a/Project.njsproj +++ b/Project.njsproj @@ -55,10 +55,9 @@ Code - + - Code @@ -230,6 +229,7 @@ + diff --git a/Scripts/AppLoader.js b/Scripts/AppLoader.js index 1bcecfb26..b7def164d 100644 --- a/Scripts/AppLoader.js +++ b/Scripts/AppLoader.js @@ -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", diff --git a/server.js b/server.js index 1020377e9..51deb685e 100644 --- a/server.js +++ b/server.js @@ -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; } }