diff --git a/lib/routes.js b/lib/routes.js index 9f0b4a74..899c68fd 100644 --- a/lib/routes.js +++ b/lib/routes.js @@ -26,10 +26,14 @@ const argv = require('minimist')(process.argv.slice(2)) const CLOCK_SKEW = 60 * 1000 const REQUEST_TTL = 3 * 60 * 1000 +const THROTTLE_LOGS_QUERY = 30 * 1000 +const THROTTLE_CLOCK_SKEW = 60 * 1000 const pids = {} const reboots = {} const restartServicesMap = {} +const canGetLastSeenMap = {} +const canLogClockSkewMap = {} const devMode = argv.dev || options.http @@ -167,13 +171,6 @@ function stateChange (req, res, next) { .catch(next) } -function deviceEvent (req, res, next) { - const pi = plugins(req.settings, req.deviceId) - pi.logEvent(req.body) - .then(() => respond(req, res)) - .catch(next) -} - function verifyUser (req, res, next) { const pi = plugins(req.settings, req.deviceId) pi.verifyUser(req.body) @@ -245,9 +242,19 @@ function updateCustomer (req, res, next) { } function getLastSeen (req, res, next) { - return logs.getLastSeen(req.deviceId) - .then(r => res.json(r)) - .catch(next) + const deviceId = req.deviceId + const timestamp = Date.now() + const shouldTrigger = !canGetLastSeenMap[deviceId] || + timestamp - canGetLastSeenMap[deviceId] >= THROTTLE_LOGS_QUERY + + if (shouldTrigger) { + canGetLastSeenMap[deviceId] = timestamp + return logs.getLastSeen(deviceId) + .then(r => res.json(r)) + .catch(next) + } + + return res.status(408).json({}) } function updateLogs (req, res, next) { @@ -310,9 +317,15 @@ function httpError (msg, code) { function filterOldRequests (req, res, next) { const deviceTime = req.deviceTime - const delta = Date.now() - Date.parse(deviceTime) + const deviceId = req.deviceId + const timestamp = Date.now() + const delta = timestamp - Date.parse(deviceTime) - if (delta > CLOCK_SKEW) { + const shouldTrigger = !canLogClockSkewMap[deviceId] || + timestamp - canLogClockSkewMap[deviceId] >= THROTTLE_CLOCK_SKEW + + if (delta > CLOCK_SKEW && shouldTrigger) { + canLogClockSkewMap[deviceId] = timestamp logger.error('Clock skew with lamassu-machine[%s] too high [%ss], adjust lamassu-machine clock', req.deviceName, (delta / 1000).toFixed(2)) } @@ -337,8 +350,7 @@ function authorize (req, res, next) { .catch(next) } -const skip = (req, res) => _.includes(req.path, ['/poll', '/state', '/logs']) && - res.statusCode === 200 +const skip = (req, res) => _.includes(req.path, ['/poll', '/state', '/logs']) && _.includes(res.statusCode, [200, 408]) const configRequiredRoutes = [ '/poll', @@ -367,7 +379,6 @@ app.use(filterOldRequests) app.get('/poll', poll) app.post('/state', stateChange) -app.post('/event', deviceEvent) app.post('/verify_user', verifyUser) app.post('/verify_transaction', verifyTx) diff --git a/package-lock.json b/package-lock.json index 2a502dab..7d4253ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lamassu-server", - "version": "7.3.2", + "version": "7.3.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c69d00ef..4446dfe0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "lamassu-server", "description": "bitcoin atm client server protocol module", "keywords": [], - "version": "7.3.2", + "version": "7.4.0", "license": "Unlicense", "author": "Lamassu (https://lamassu.is)", "dependencies": {