diff --git a/src/app.js b/src/app.js index b97a756..ad37d27 100644 --- a/src/app.js +++ b/src/app.js @@ -3,11 +3,17 @@ const express = require('express'); const cookieParser = require("cookie-parser"); const sessions = require('express-session'); const Request = require('./request'); +const WebSocket = require('ws'); const REFRESH_INTERVAL = 5 * 1000; //10 * 60 * 1000; -module.exports = function App(secret, trustedIDs, DB) { +module.exports = function App(secret, DB) { + if (!(this instanceof App)) + return new App(secret, DB); + + var server = null, + wss = null; const app = express(); //session middleware app.use(sessions({ @@ -65,12 +71,67 @@ module.exports = function App(secret, trustedIDs, DB) { app.post('/withdraw-rupee', Request.WithdrawRupee); //Manage user tags (Access to trusted IDs only) - Request.trustedIDs = trustedIDs; + app.post('/add-tag', Request.addUserTag); app.post('/remove-tag', Request.removeUserTag); Request.DB = DB; - Request.periodicProcess(); - let refresher = setInterval(Request.periodicProcess, REFRESH_INTERVAL); - return app; + + //Properties + var periodInstance = null; + let self = this; + + //return server, express-app, wss + Object.defineProperty(self, "server", { + get: () => server + }); + Object.defineProperty(self, "express", { + get: () => app + }); + Object.defineProperty(self, "wss", { + get: () => wss + }); + + //set trustedID for subAdmin requests + Object.defineProperty(self, "trustedIDs", { + set: (ids) => Request.trustedIDs = ids + }); + + //Start (or) Stop servers + self.start = (port) => new Promise(resolve => { + server = app.listen(port, () => { + wss = new WebSocket.Server({ + server + }); + resolve(`Server Running at port ${port}`); + }); + }); + self.stop = () => new Promise(resolve => { + server.close(() => { + server = null; + wss = null; + resolve('Server stopped') + }); + }); + + //(Node is not master) Pause serving the clients + self.pause = () => { + Request.pause(); + if (periodInstance !== null) { + clearInterval(periodInstance); + periodInstance = null; + } + } + + //(Node is master) Resume serving the clients + self.resume = () => { + Request.resume(); + Request.periodicProcess(); + if (periodInstance === null) + periodInstance = setInterval(Request.periodicProcess, REFRESH_INTERVAL); + } + + Object.defineProperty(self, "periodInstance", { + get: () => periodInstance + }); } \ No newline at end of file diff --git a/src/market.js b/src/market.js index 3fe915d..fe3a60f 100644 --- a/src/market.js +++ b/src/market.js @@ -54,10 +54,6 @@ const tokenAPI = { } } -function returnRates() { - return coupling.price.currentRate; -} - function addSellOrder(floID, quantity, min_price) { return new Promise((resolve, reject) => { if (!floID || !floCrypto.validateAddr(floID)) @@ -505,7 +501,9 @@ function blockchainReCheck() { } module.exports = { - returnRates, + get rate() { + return coupling.price.currentRate; + }, addBuyOrder, addSellOrder, cancelOrder, diff --git a/src/request.js b/src/request.js index ccf0511..86f3336 100644 --- a/src/request.js +++ b/src/request.js @@ -21,8 +21,13 @@ INTERNAL.e_code = 500; const oneDay = 1000 * 60 * 60 * 24; const maxSessionTimeout = 60 * oneDay; +var serving; +const INVALID_SERVER_MSG = "Incorrect Server. Please connect to main server."; + function validateRequestFromFloID(request, sign, floID, proxy = true) { return new Promise((resolve, reject) => { + if (!serving) + return reject(INVALID(INVALID_SERVER_MSG)); DB.query("SELECT " + (proxy ? "proxyKey AS pubKey FROM Sessions" : "pubKey FROM Users") + " WHERE floID=?", [floID]).then(result => { if (result.length < 1) return reject(INVALID(proxy ? "Session not active" : "User not registered")); @@ -53,6 +58,8 @@ function storeRequest(floID, req_str, sign) { } function SignUp(req, res) { + if (!serving) + return res.status(INVALID.e_code).send(INVALID_SERVER_MSG); let data = req.body, session = req.session; if (floCrypto.getFloID(data.pubKey) !== data.floID) @@ -249,11 +256,15 @@ function ListTransactions(req, res) { } function getRate(req, res) { - let rate = market.returnRates(); - res.send(`${rate}`); + if (!serving) + res.status(INVALID.e_code).send(INVALID_SERVER_MSG); + else + res.send(`${market.rate}`); } function Account(req, res) { + if (!serving) + return res.status(INVALID.e_code).send(INVALID_SERVER_MSG); const setLogin = function(message) { let randID = floCrypto.randString(16, true); req.session.random = randID; @@ -506,5 +517,11 @@ module.exports = { set DB(db) { DB = db; market.DB = db; + }, + pause() { + serving = false; + }, + resume() { + serving = true; } }; \ No newline at end of file