From 14ed37aca96a7c950e2d6125e4b68e2ed59010b2 Mon Sep 17 00:00:00 2001 From: Luke Childs Date: Wed, 31 Aug 2016 13:39:44 +0100 Subject: [PATCH] Cache responses --- package.json | 1 + src/index.js | 28 +++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 7bcebd6..2cfb743 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ }, "homepage": "https://github.com/lukechilds/onionoo-node-client#readme", "dependencies": { + "node-cache": "^3.2.1", "request": "^2.74.0" } } diff --git a/src/index.js b/src/index.js index 448175a..2ae2f39 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,7 @@ -const request = require('request'); +const request = require('request'); +const NodeCache = require('node-cache'); + +const cache = new NodeCache(); const baseUrl = 'https://onionoo.torproject.org/'; const endpoints = [ @@ -10,14 +13,33 @@ const endpoints = [ 'uptime' ]; +function checkResponseCache(response) { + const cacheControl = response.headers['cache-control']; + const maxAgeRegex = /max-age=(\d+)/; + const maxAge = cacheControl && cacheControl.match(maxAgeRegex); + return maxAge && maxAge[1]; +} + module.exports = endpoints.reduce((onionoo, endpoint) => { onionoo[endpoint] = args => new Promise((resolve, reject) => { - request({ + const requestOptions = { uri: `${baseUrl}${endpoint}`, qs: args, json: true - }, (error, response, body) => { + }; + const cacheKey = JSON.stringify(requestOptions); + + const cachedResult = cache.get(cacheKey); + if(cachedResult) { + resolve(cachedResult); + } + + request(requestOptions, (error, response, body) => { if (!error && response.statusCode == 200) { + const ttl = checkResponseCache(response); + if(ttl) { + cache.set(cacheKey, body, ttl); + } resolve(body); } else { reject(error || {