From 59178ff276d6151b9db206c5997a4c0501ea75fa Mon Sep 17 00:00:00 2001 From: Luke Childs Date: Wed, 22 Mar 2017 20:49:31 +0800 Subject: [PATCH] Return cached response immediately if not stale --- index.js | 22 +++++++++++++++++++++- package.json | 1 + 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 17a89bf52..735244d5c 100644 --- a/index.js +++ b/index.js @@ -18,6 +18,7 @@ const isRetryAllowed = require('is-retry-allowed'); const Buffer = require('safe-buffer').Buffer; const expired = require('expired'); const normalizeUrl = require('normalize-url'); +const Response = require('http-response-object'); const pkg = require('./package'); function requestAsEventEmitter(opts) { @@ -99,7 +100,22 @@ function requestAsEventEmitter(opts) { }); }; - get(opts); + if (opts.cache && opts.method === 'GET') { + const key = normalizeUrl(requestUrl); + opts.cache.get(key, (err, value) => { + if (err) { + return get(opts); + } + const cachedResponse = JSON.parse(value); + if (expired(cachedResponse.headers) === false) { + const response = responseFromCache(requestUrl, cachedResponse); + ee.emit('response', response); + } + }); + } else { + get(opts); + } + return ee; } @@ -315,6 +331,10 @@ function normalizeArguments(url, opts) { return opts; } +function responseFromCache(url, cachedResponse) { + return new Response(200, cachedResponse.headers, Buffer.from(cachedResponse.body), url); +} + function got(url, opts) { try { return asPromise(normalizeArguments(url, opts)); diff --git a/package.json b/package.json index 92207baa0..f91fc6398 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "duplexer3": "^0.1.4", "expired": "^1.3.8", "get-stream": "^3.0.0", + "http-response-object": "^1.1.0", "is-redirect": "^1.0.0", "is-retry-allowed": "^1.0.0", "is-stream": "^1.0.0",