route-cache
Advanced tools
Comparing version 0.2.7 to 0.2.8
134
index.js
@@ -1,20 +0,19 @@ | ||
'use strict'; | ||
var Eidetic = require('eidetic'); | ||
'use strict' | ||
var Eidetic = require('eidetic') | ||
var cacheStore = new Eidetic({ | ||
maxSize: 50, | ||
canPutWhenFull: true | ||
}); | ||
}) | ||
var queues = {}; | ||
var redirects = {}; | ||
var queues = {} | ||
var redirects = {} | ||
module.exports.cacheSeconds = function(ttl) { | ||
return function(req, res, next) { | ||
var key = req.originalUrl; | ||
module.exports.cacheSeconds = function (ttl) { | ||
return function (req, res, next) { | ||
var key = req.originalUrl | ||
if (redirects[key]) { | ||
return res.redirect(redirects[key].status, redirects[key].url); | ||
return res.redirect(redirects[key].status, redirects[key].url) | ||
} | ||
var value = cacheStore.get(key); | ||
var value = cacheStore.get(key) | ||
@@ -24,21 +23,21 @@ if (value) { | ||
if (value.isJson) { | ||
res.json(value.body); | ||
res.json(value.body) | ||
} else { | ||
res.send(value.body); | ||
res.send(value.body) | ||
} | ||
return; | ||
return | ||
} | ||
res.original_send = res.send; | ||
res.original_json = res.json; | ||
res.original_redirect = res.redirect; | ||
res.original_send = res.send | ||
res.original_json = res.json | ||
res.original_redirect = res.redirect | ||
if (!queues[key]) { | ||
queues[key] = []; | ||
queues[key] = [] | ||
} | ||
var didHandle = false; | ||
var didHandle = false | ||
function rawSend(data, isJson) { | ||
var key = req.originalUrl; | ||
function rawSend (data, isJson) { | ||
var key = req.originalUrl | ||
@@ -48,26 +47,25 @@ // pass-through for Buffer - not supported | ||
if (Buffer.isBuffer(data)) { | ||
queues[key]=[]; // clear queue | ||
res.set('Content-Length', data.length); | ||
res.original_send(data); | ||
return; | ||
queues[key] = [] // clear queue | ||
res.set('Content-Length', data.length) | ||
res.original_send(data) | ||
return | ||
} | ||
} | ||
didHandle = true; | ||
var body = data instanceof Buffer ? data.toString() : data; | ||
if (res.statusCode < 400) cacheStore.put(key, { body: body, isJson: isJson }, ttl); | ||
didHandle = true | ||
var body = data instanceof Buffer ? data.toString() : data | ||
if (res.statusCode < 400) cacheStore.put(key, { body: body, isJson: isJson }, ttl) | ||
// drain the queue so anyone else waiting for | ||
// this value will get their responses. | ||
var subscriber = null; | ||
while (subscriber = queues[key].shift()) { | ||
if (subscriber) { | ||
process.nextTick(subscriber); | ||
} | ||
var subscriber = null | ||
while (queues[key].length > 0) { | ||
subscriber = queues[key].shift() | ||
process.nextTick(subscriber) | ||
} | ||
if (isJson) { | ||
res.original_json(body); | ||
res.original_json(body) | ||
} else { | ||
res.original_send(body); | ||
res.original_send(body) | ||
} | ||
@@ -77,23 +75,24 @@ } | ||
// first request will get rendered output | ||
if (queues[key].length === 0 && queues[key].push(function noop(){})) { | ||
if (queues[key].length === 0) { | ||
queues[key].push(function noop () {}) | ||
didHandle = false; | ||
didHandle = false | ||
res.send = function (data) { | ||
if (didHandle) { | ||
res.original_send(data); | ||
res.original_send(data) | ||
} else { | ||
rawSend(data, false); | ||
rawSend(data, false) | ||
} | ||
}; | ||
} | ||
res.json = function (data) { | ||
rawSend(data, true); | ||
}; | ||
rawSend(data, true) | ||
} | ||
// If response happens to be a redirect -- store it to redirect all | ||
// subsequent requests. | ||
res.redirect = function(url) { | ||
var address = url; | ||
var status = 302; | ||
res.redirect = function (url) { | ||
var address = url | ||
var status = 302 | ||
@@ -103,37 +102,36 @@ // allow statusCode for 301 redirect. See: https://github.com/expressjs/express/blob/master/lib/response.js#L857 | ||
if (typeof arguments[0] === 'number') { | ||
status = arguments[0]; | ||
address = arguments[1]; | ||
status = arguments[0] | ||
address = arguments[1] | ||
} else { | ||
console.log('res.redirect(url, status): Use res.redirect(status, url) instead'); | ||
status = arguments[1]; | ||
console.log('res.redirect(url, status): Use res.redirect(status, url) instead') | ||
status = arguments[1] | ||
} | ||
} | ||
redirects[key] = {url: address, status:status}; | ||
res.original_redirect(status, address); | ||
}; | ||
redirects[key] = {url: address, status: status} | ||
res.original_redirect(status, address) | ||
} | ||
next(); | ||
next() | ||
// subsequent requests will batch while the first computes | ||
} else { | ||
queues[key].push(function() { | ||
var value = cacheStore.get(key) || {}; | ||
queues[key].push(function () { | ||
var value = cacheStore.get(key) || {} | ||
if (value.isJson) { | ||
res.json(value.body); | ||
res.json(value.body) | ||
} else { | ||
res.send(value.body); | ||
res.send(value.body) | ||
} | ||
}); | ||
}) | ||
} | ||
}; | ||
}; | ||
} | ||
} | ||
module.exports.removeCache = function (url) { | ||
if (redirects[url]) { | ||
delete redirects[url] | ||
} | ||
cacheStore.del(url) | ||
} | ||
module.exports.removeCache = function(url) { | ||
if (redirects[url]) | ||
delete redirects[url]; | ||
cacheStore.del(url); | ||
}; | ||
module.exports.cacheStore = cacheStore; | ||
module.exports.cacheStore = cacheStore |
{ | ||
"name": "route-cache", | ||
"version": "0.2.7", | ||
"version": "0.2.8", | ||
"description": "express middleware for caching your routes", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "mocha -R spec test" | ||
"test": "standard && mocha -R spec test" | ||
}, | ||
@@ -27,4 +27,11 @@ "repository": { | ||
"mocha": "2.5.3", | ||
"morgan": "1.7.0", | ||
"standard": "7.1.2", | ||
"supertest": "1.2.0" | ||
}, | ||
"standard": { | ||
"ignore": [ | ||
"test/**" | ||
] | ||
}, | ||
"bugs": { | ||
@@ -31,0 +38,0 @@ "url": "https://github.com/bradoyler/route-cache/issues" |
@@ -8,3 +8,3 @@ # Route-Cache | ||
[![NPM](https://nodei.co/npm/route-cache.png?downloads=true&downloadRank=true)](https://nodei.co/npm/route-cache/) | ||
[![NPM](https://nodei.co/npm/route-cache.png?downloads=true&downloadRank=true)](https://nodei.co/npm/route-cache/) [![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard) | ||
@@ -14,3 +14,3 @@ Make your routes do this ->![dodging](http://forgifs.com/gallery/d/80400-8/Muhammad-Ali-dodges-punches.gif) | ||
## Why? | ||
- makes hard-working routes super-fast, under heavy-load | ||
- makes hard-working routes super-fast, under heavy-load, [see Load Tests](loadtests) | ||
- easy to use and fork for your needs | ||
@@ -17,0 +17,0 @@ - works with gzip compression |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
23293
14
577
5
2