'use strict'; const express = require('express'); const rateLimit = require('express-rate-limit'); const db = new Map(); const app = express(); const limiter1 = rateLimit({ windowMs: 60 * 1000, max: 300, // Limit each IP to 300 requests per `window` standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: false, // Disable the `X-RateLimit-*` headers }); const limiter2 = rateLimit({ windowMs: 60 * 1000, max: 2, standardHeaders: true, legacyHeaders: false, }); app.use(limiter1); app.use('/create', limiter2); app.get('/', (req, res) => { res.sendStatus(403); }); app.get('/create', (req, res) => { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; let code = ""; do { for(let i = 0; i < 4; i += 1) { code += characters.charAt(Math.floor(Math.random() * characters.length)); } } while(db.has(code)); // It's a set because it was originally idx-only, too late to change now db.set(code, { x: -1.0, y: -1.0, set: new Set() }); res.send(code); }); app.get('/verify/:code', (req, res) => { const code = req.params.code.toUpperCase(); if(db.has(code)) { res.send(`${code}`); } else { res.sendStatus(404); } }); app.get('/order/:code/:bagel/:x/:y', (req, res) => { const code = req.params.code.toUpperCase(); if(db.has(code)) { db.get(code).set.add({ type: req.params.bagel, x: req.params.x, y: req.params.y }); res.send("OK"); } else { res.sendStatus(404); } }); app.get('/getpos/:code', (req, res) => { const code = req.params.code.toUpperCase(); if(db.has(code)) { const {x, y} = db.get(code); res.send({x, y}); } else { res.sendStatus(404); } }); app.get('/take/:code/:x/:y', (req, res) => { const code = req.params.code.toUpperCase(); if(db.has(code)) { db.get(code).x = req.params.x; db.get(code).y = req.params.y; const v = [...db.get(code).set.values()]; db.get(code).set.clear(); res.send(v); } else { res.sendStatus(404); } }); app.listen(42137);