From 566c7fb0ad5a53c80409c8b54e64b5619efc3c45 Mon Sep 17 00:00:00 2001 From: plane000 Date: Thu, 19 Jul 2018 14:35:45 +0100 Subject: [PATCH] Added a print queue and rate limiting for the API --- client/index.html | 3 +- client/main.js | 4 ++ client/style.css | 9 +++- endpoints.js | 36 +++++++++++++--- helper.js | 7 +++ print.js | 40 +++++++++++++++--- .../Adafruit_Thermal.cpython-37.pyc | Bin 0 -> 15583 bytes 7 files changed, 85 insertions(+), 14 deletions(-) create mode 100644 helper.js create mode 100644 printer/__pycache__/Adafruit_Thermal.cpython-37.pyc diff --git a/client/index.html b/client/index.html index 1d50074..216db99 100644 --- a/client/index.html +++ b/client/index.html @@ -8,9 +8,10 @@ - + +
\ No newline at end of file diff --git a/client/main.js b/client/main.js index e46118e..12b04b3 100644 --- a/client/main.js +++ b/client/main.js @@ -8,6 +8,10 @@ async function print() { } let http = new XMLHttpRequest(); + http.onreadystatechange = function() { + let response = this.responseText; + document.getElementById('response').innerHTML = 'Server responded with: ' + response; + } let string = '/print?name=' + name + '&coords=' + coords; await http.open('GET', string, true); diff --git a/client/style.css b/client/style.css index 1125c7f..22f6629 100644 --- a/client/style.css +++ b/client/style.css @@ -11,7 +11,7 @@ input { input[type=text] { -webkit-transition: width 0.4s ease-in-out; transition: width 0.4s ease-in-out; - width: 20%; + width: 300px; padding: 12px 20px; margin: 8px 0; border-radius: 4px; @@ -28,7 +28,7 @@ input[type=text]:focus { input[type=submit] { top: 56%; - width: 20%; + width: 300px; background-color: rgb(66, 183, 238); border-radius: 4px; color: white; @@ -40,3 +40,8 @@ input[type=submit] { input[type=submit]:hover { background-color: rgb(59, 164, 212); } + +.serverResponse { + position: absolute; + top: 63%; +} diff --git a/endpoints.js b/endpoints.js index 4985e31..2d5efe6 100644 --- a/endpoints.js +++ b/endpoints.js @@ -1,5 +1,6 @@ const bodyParser = require('body-parser'); const express = require('express'); +const Helper = require('./helper'); const fs = require('fs'); const Printer = require('./print'); @@ -19,11 +20,34 @@ app.get('/', function (req, res) { res.sendFile( __dirname + '/client'); }); -app.get('/print', function (req, res) { - let name = req.query.name; - let coords = req.query.coords; +app.get('/print', async function (req, res) { + let rate = await rateLimit(); + if (rate == -1) return; - console.log(name, coords); - - Printer.print(name, coords); + let inname = req.query.name; + let incoords = req.query.coords; + console.log('New print request for ', inname, ' at ', incoords); + + let set = Printer.getprintqueue(); + set.push({ + name: inname, + coords: incoords + }); + Printer.setprintqueue(set); + if (!Printer.printing()) Printer.print(); + res.end('200 OK'); }); + +let requests = []; +async function rateLimit() { + if (requests.indexOf(req.connection.remoteAddress) != -1) { + res.end('400 BAD REQUEST: TO MANY REQUESTS'); + await Helper.sleep('3000'); + + while (requests.indexOf(req.connection.remoteAddress) != -1) { + requests.splice(requests.indexOf(req.connection.remoteAddress), 1); + } + return -1; + } + requests.push(req.connection.remoteAddress); +} diff --git a/helper.js b/helper.js new file mode 100644 index 0000000..1930ff2 --- /dev/null +++ b/helper.js @@ -0,0 +1,7 @@ +module.exports.sleep = function(ms) { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve(); + }, ms); + }); + } \ No newline at end of file diff --git a/print.js b/print.js index c585400..b771c43 100644 --- a/print.js +++ b/print.js @@ -1,8 +1,34 @@ const PythonShell = require('python-shell'); -const Result = require('./resultbuilder'); const WeatherAPI = require('./weatherAPI'); +const Result = require('./resultbuilder'); +const Helper = require('./helper'); -module.exports.print = async function(name, coords) { +let printQueue = []; +let printing = false; + +module.exports.getprintqueue = function() { + return printQueue; +} + +module.exports.setprintqueue = function(tmp) { + printQueue = tmp; +} + +module.exports.printing = function() { + return printing; +} + +module.exports.print = async function() { + printing = true; + while (printQueue.length > 0) { + await currentprint(printQueue[0].name, printQueue[0].coords); + await Helper.sleep(200); + printQueue.splice(0, 1); + } + printing = false; +} + +async function currentprint(name, coords) { let text = Result.genCompilerSettings({ padding: 2, lineBreaks: 1, @@ -29,7 +55,11 @@ module.exports.print = async function(name, coords) { } ] }); - PythonShell.run('printer/write.py', text, function (err, results) { - if (err) throw err; - }); + try { + await PythonShell.run('printer/write.py', text, function (err, results) { + if (err) { + console.log('Could not open serial connection for ' + name + '\'s print'); + } + }); + } catch (err) {} } \ No newline at end of file diff --git a/printer/__pycache__/Adafruit_Thermal.cpython-37.pyc b/printer/__pycache__/Adafruit_Thermal.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..888b0521376311a552d38ba4f976d6fcd32b2d8a GIT binary patch literal 15583 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 literal 0 HcmV?d00001