Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ------------------ Main.js ------------------
- var app = require('express');
- var server = require('http').createServer(app);
- var io = require('socket.io')(server);
- var mysql = require('mysql');
- var cluster = require('cluster');
- let bodyParser = require('body-parser');
- let handle = require('./controllers/apicontroller.js');
- ///////////////////////////////////////////////////////////////////////////
- //Create MySql Connections///
- ///////////////////////////////////////////////////////////////////////////
- var connection = mysql.createPool({
- host: "",
- user: "",
- password: "",
- database: ""
- });
- if (cluster.isMaster) {
- cluster.fork();
- cluster.fork();
- cluster.on('online', function(worker) {
- console.log('Worker ' + worker.process.pid + ' is online');
- });
- cluster.on('exit', function(worker, code, signal) {
- console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
- console.log('Starting a new worker');
- cluster.fork();
- });
- } else {
- ///////////////////////////////////////////////////////////////////////////
- //Handle API Requests///
- ///////////////////////////////////////////////////////////////////////////
- app.use(bodyParser.json());
- app.use(function(req, res, next) {
- res.setHeader('Access-Control-Allow-Origin', '*');
- res.header("Access-Control-Allow-Credentials: true");
- res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
- next();
- });
- app.post('/api/v1/relay', function(request, response) {
- console.log('Worker ' + cluster.worker.id + ': Processing..')
- //check customers subscription
- let key = request.body['public_key']
- let queryingString = 'SELECT * FROM users_app WHERE public_key = ?';
- connection.query(queryingString, [key], function(err, result, fields) {
- if (err) throw err;
- if (request.body['public_key'] !== result[0]['public_key'] ||
- request.body['private_key'] !== result[0]['private_key'] ||
- !request.body['channel'] || !request.body['event']) {
- //log this to a file later get origin for tracking
- console.log('bad request from: ');
- return response.sendStatus(400);
- }
- //get the user id of this customers
- var identifier = result[0]['users_app_id'];
- var customer_id = result[0]['user_id'];
- handle.thisRequest(request, response, io, connection,
- identifier, customer_id, app);
- });
- });
- server.listen(8081, function() {
- console.log('Process ' + process.pid + ' is listening to all incoming requests');
- });
- server.on('close', function() {
- connection.end();
- })
- }
- ------------ API Controller -----------
- let limit = require('./ratelimitcontroller.js');
- module.exports = {
- thisRequest: function(request, response, io, connection,
- identifier, customer_id){
- var key = customer_id;
- var queryingString = 'SELECT * FROM users WHERE id = ?';
- connection.query(queryingString, [key], function(err, result, fields) {
- if (err) throw err;
- switch(result[0]['subscription']) {
- case 'Sandbox':
- limit.sandboxPlan(request, response, io, connection,
- identifier, customer_id);
- break;
- case 'Small':
- limit.smallPlan(request, response, io, connection,
- identifier, customer_id);
- break;
- case 'Medium':
- limit.mediumPlan(request, response, io, connection,
- identifier, customer_id);
- break;
- case 'Large':
- limit.largePlan(request, response, io, connection,
- identifier, customer_id);
- break;
- }
- });
- }
- };
- ---------- Sandbox ----------
- module.exports = {
- sandboxPlan: function(request, response, io, connection, identifier, customer_id){
- var RateLimiter = require('limiter').RateLimiter;
- var limiter = new RateLimiter(3, 'second', true); // fire CB immediately
- // Immediately send 429 header to client when rate limiting is in effect
- limiter.removeTokens(1, function(err, remainingRequests) {
- if (remainingRequests < 1) {
- console.log('Customer: ' + customer_id + ' has reached their limit.')
- response.writeHead(429, {'Content-Type': 'text/plain;charset=UTF-8'});
- return response.end('429 Too Many Requests - your IP is being rate limited');
- } else {
- //pass the data to the customers front end
- let event = request.body['event'];
- let data = request.body.data;
- io.emit(event, data);
- //let customer know request was successfull
- response.sendStatus(200);
- //track customers usage
- return track.customersMessage(identifier, connection);
- }
- });
- }
- }
- ------------------- useage controller ----------
- module.exports = {
- customersMessage: function(identifier, connection){
- var key = identifier;
- var getAppInformation = 'SELECT * FROM users_app_details WHERE users_app_id = ?';
- connection.query(getAppInformation, [key], function(err, result, fields) {
- if (err) throw err;
- let appID = result[0]['users_app_id'];
- let messageTotal = result[0]['messages_total'] + 1;
- let messageCycle = result[0]['messages_cycle'] + 1;
- var sql = "UPDATE users_app_details set messages_total = ? , messages_cycle = ? WHERE users_app_id = ?";
- connection.query(sql, [messageTotal, messageCycle, appID], function(err, result) {
- if (err) throw err;
- console.log('processed');
- });
- });
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement