311 lines
8.7 KiB
JavaScript
311 lines
8.7 KiB
JavaScript
|
|
const MODULE_NAME = "Node Server";
|
|
const START_BROWSER_APP = true;
|
|
|
|
|
|
/*
|
|
const octokit = require('@octokit/rest')()
|
|
global.atob = require("atob");
|
|
|
|
let owner = "AAMasters";
|
|
let repo = "AABruce-Bot";
|
|
let branch = "master";
|
|
let page = 1;
|
|
let per_page = 100;
|
|
let ref = "master";
|
|
let path = "One-Min-Daily-Candles-Volumes/run.js";
|
|
|
|
octokit.repos.getContent({ owner, repo, path, ref }, onContent);
|
|
|
|
function onContent (error, result) {
|
|
|
|
let decoded = atob(result.data.content);
|
|
|
|
console.log(decoded);
|
|
|
|
console.log(result);
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
//'use strict';
|
|
var http = require('http');
|
|
var port = process.env.PORT || 1337;
|
|
|
|
startHtttpServer();
|
|
|
|
function onRequestReceivedFromBrowser(request, response) {
|
|
|
|
var htmlResponse;
|
|
var requestParameters = request.url.split("/");
|
|
|
|
|
|
switch (requestParameters[1]) {
|
|
|
|
case "CandleTechnicalAnalisys":
|
|
{
|
|
respondWithFile('./' + requestParameters[1] + '/' + requestParameters[2], response);
|
|
}
|
|
break;
|
|
|
|
case "VolumeTechnicalAnalisys":
|
|
{
|
|
respondWithFile('./' + requestParameters[1] + '/' + requestParameters[2], response);
|
|
}
|
|
break;
|
|
|
|
case "Panels":
|
|
{
|
|
respondWithFile('./' + requestParameters[1] + '/' + requestParameters[2], response);
|
|
}
|
|
break;
|
|
|
|
case "ChartLayers":
|
|
{
|
|
respondWithFile('./' + requestParameters[1] + '/' + requestParameters[2], response);
|
|
}
|
|
break;
|
|
|
|
case "Indicators":
|
|
{
|
|
respondWithFile('./' + requestParameters[1] + '/' + requestParameters[2], response);
|
|
}
|
|
break;
|
|
|
|
case "Azure":
|
|
{
|
|
respondWithFile('./' + requestParameters[1] + '/' + requestParameters[2], response);
|
|
}
|
|
break;
|
|
|
|
case "lastTrades":
|
|
{
|
|
const marketId = requestParameters[2];
|
|
const exchangeId = requestParameters[3];
|
|
|
|
const sqlQuery = "SELECT TOP 100000 "
|
|
+ " InternalExchangeTradeId AS Id, "
|
|
+ " Type, "
|
|
+ " Rate, "
|
|
+ " AmountAssetA AS AmountA, "
|
|
+ " AmountAssetB AS AmountB, "
|
|
+ " Timestamp "
|
|
+ " FROM Trades "
|
|
+ " WHERE "
|
|
+ " IdMarket = " + marketId + " "
|
|
+ " AND "
|
|
+ " IdExchange = " + exchangeId + " "
|
|
+ " ORDER BY IdExchange ASC, IdMarket ASC, InternalExchangeTradeId DESC"
|
|
;
|
|
|
|
////console.log("About to execute: " + sqlQuery);
|
|
|
|
|
|
/* Then we execute the query */
|
|
|
|
database.executeSQL(sqlQuery, function (err, resultSet) {
|
|
|
|
//console.log("Query executed: " + sqlQuery);
|
|
|
|
var myJsonString = JSON.stringify(resultSet);
|
|
|
|
////console.log(myJsonString);
|
|
|
|
response.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
response.write(myJsonString);
|
|
response.end("\n");
|
|
}
|
|
);
|
|
|
|
}
|
|
break;
|
|
|
|
|
|
case "trades":
|
|
{
|
|
const marketId = requestParameters[2];
|
|
const exchangeId = requestParameters[3];
|
|
const idBegin = unescape(requestParameters[4]);
|
|
const idEnd = unescape(requestParameters[5]);
|
|
|
|
const sqlQuery = "SELECT "
|
|
+ " InternalExchangeTradeId AS Id, "
|
|
+ " Type, "
|
|
+ " Rate, "
|
|
+ " AmountAssetA AS AmountA, "
|
|
+ " AmountAssetB AS AmountB, "
|
|
+ " Timestamp "
|
|
+ " FROM Trades "
|
|
+ " WHERE "
|
|
+ " IdExchange = " + exchangeId + " "
|
|
+ " AND "
|
|
+ " IdMarket = " + marketId + " "
|
|
+ " AND "
|
|
+ " InternalExchangeTradeId >= " + idBegin + " "
|
|
+ " AND "
|
|
+ " InternalExchangeTradeId <= " + idEnd + " "
|
|
+ " ORDER BY IdExchange, IdMarket, InternalExchangeTradeId "
|
|
;
|
|
|
|
let records = idEnd - idBegin;
|
|
console.log("Records Requested: " + records + " idBegin = " + idBegin + " idEnd = " + idEnd);
|
|
|
|
|
|
/* Then we execute the query */
|
|
|
|
database.executeSQL(sqlQuery, function (err, resultSet) {
|
|
|
|
//console.log("Query executed: " + sqlQuery);
|
|
|
|
var myJsonString = JSON.stringify(resultSet);
|
|
|
|
////console.log(myJsonString);
|
|
|
|
response.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
response.write(myJsonString);
|
|
response.end("\n");
|
|
}
|
|
);
|
|
|
|
}
|
|
break;
|
|
|
|
|
|
case "orderbook":
|
|
|
|
{
|
|
const marketId = requestParameters[2];
|
|
const datetimeBegin = unescape(requestParameters[3]);
|
|
const datetimeEnd = unescape(requestParameters[4]);
|
|
|
|
var sqlQuery = "SELECT "
|
|
+ " Id, "
|
|
+ " Rate, "
|
|
+ " Amount * Rate AS AmountA, "
|
|
+ " Amount AS AmountB, "
|
|
+ " Type AS Type, "
|
|
+ " DatetimeIn AS DatetimeIn, "
|
|
+ " ISNULL(DatetimeOut, '3000-01-01') AS DatetimeOut "
|
|
+ " FROM OrderBooks "
|
|
+ " WHERE "
|
|
+ " ( "
|
|
+ " IdMarket = " + marketId + " "
|
|
+ " ) "
|
|
+ " AND "
|
|
+ " ( "
|
|
+ " DatetimeIn <= '" + datetimeEnd + "' "
|
|
+ " ) "
|
|
+ " AND "
|
|
+ " ( "
|
|
+ " ISNULL(DatetimeOut, '3000-01-01') > '" + datetimeBegin + "' "
|
|
+ " ) "
|
|
;
|
|
|
|
|
|
//console.log(sqlQuery);
|
|
|
|
|
|
/* Then we execute the query */
|
|
|
|
database.executeSQL(sqlQuery, function (err, resultSet) {
|
|
|
|
var myJsonString = JSON.stringify(resultSet);
|
|
|
|
//console.log(myJsonString);
|
|
|
|
response.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
response.write(myJsonString);
|
|
response.end("\n");
|
|
}
|
|
);
|
|
}
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
////console.log("Unknown request received from the browser: " + request.url);
|
|
|
|
if (requestParameters[1] === "") {
|
|
requestParameters[1] = "index.html";
|
|
}
|
|
|
|
respondWithFile("" + requestParameters[1], response);
|
|
|
|
}
|
|
|
|
function sendResponseToBrowser(htmlResponse) {
|
|
response.writeHead(200, { 'Content-Type': 'text/html' });
|
|
response.write(htmlResponse);
|
|
|
|
response.end("\n");
|
|
}
|
|
}
|
|
|
|
|
|
function respondWithFile(fileName, response) {
|
|
|
|
let fs = require('fs');
|
|
try {
|
|
|
|
fs.readFile(fileName, onFileRead);
|
|
|
|
function onFileRead(err, file) {
|
|
|
|
try {
|
|
let htmlResponse = file.toString();
|
|
|
|
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
|
|
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
|
|
response.setHeader("Expires", "0"); // Proxies.
|
|
response.setHeader("Access-Control-Allow-Origin", "*"); // Allows to access data from other domains.
|
|
|
|
response.writeHead(200, { 'Content-Type': 'text/html' });
|
|
response.write(htmlResponse);
|
|
response.end("\n");
|
|
console.log("File Sent: " + fileName);
|
|
//
|
|
}
|
|
catch (err) {
|
|
returnEmptyArray();
|
|
console.log("File Not Found: " + fileName);
|
|
}
|
|
|
|
}
|
|
}
|
|
catch (err) {
|
|
returnEmptyArray();
|
|
}
|
|
|
|
function returnEmptyArray() {
|
|
|
|
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
|
|
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
|
|
response.setHeader("Expires", "0"); // Proxies.
|
|
|
|
response.writeHead(200, { 'Content-Type': 'text/html' });
|
|
response.write("[]");
|
|
response.end("\n");
|
|
|
|
}
|
|
}
|
|
|
|
function startHtttpServer() {
|
|
|
|
if (START_BROWSER_APP === true) {
|
|
|
|
try {
|
|
|
|
gWebServer = http.createServer(onRequestReceivedFromBrowser).listen(port);
|
|
}
|
|
catch (err) {
|
|
console.log(err);
|
|
}
|
|
}
|
|
}
|
|
|
|
|