restify-etag-cache
Advanced tools
Comparing version 1.0.0 to 1.0.1
106
lib/index.js
@@ -8,63 +8,75 @@ 'use strict'; | ||
function eTagCache(req, res, nextM) { | ||
let oldWrite, | ||
oldWriteHead, | ||
oldEnd; | ||
function eTagCache(options) { | ||
let chunks = []; | ||
let headers = []; | ||
/** | ||
* TODO | ||
* Implement the options logic. | ||
* - ignore urls | ||
* - ? | ||
*/ | ||
oldWrite = res.write; | ||
oldWriteHead = res.writeHead; | ||
oldEnd = res.end; | ||
function middleware(req, res, nextM) { | ||
let oldWrite, | ||
oldWriteHead, | ||
oldEnd; | ||
chunks = []; | ||
headers = []; | ||
let chunks = []; | ||
let headers = []; | ||
res.writeHead = function() { | ||
headers.push(arguments); | ||
}; | ||
oldWrite = res.write; | ||
oldWriteHead = res.writeHead; | ||
oldEnd = res.end; | ||
res.write = function(chunk) { | ||
chunks.push(chunk); | ||
}; | ||
chunks = []; | ||
headers = []; | ||
res.end = function(chunk) { | ||
if (chunk) { | ||
res.writeHead = function() { | ||
headers.push(arguments); | ||
}; | ||
res.write = function(chunk) { | ||
chunks.push(chunk); | ||
} | ||
}; | ||
res.writeHead = oldWriteHead; | ||
res.write = oldWrite; | ||
res.end = oldEnd; | ||
res.end = function(chunk) { | ||
if (chunk) { | ||
chunks.push(chunk); | ||
} | ||
const strEtag = etag(chunks.join('')); | ||
res.setHeader('etag', strEtag); | ||
debug('Generated etag: ' + strEtag); | ||
res.writeHead = oldWriteHead; | ||
res.write = oldWrite; | ||
res.end = oldEnd; | ||
async.eachSeries(restify.conditionalRequest(), (conditionalRequestMiddleware, nextConditionalRequestMiddleware) => { | ||
conditionalRequestMiddleware(req, res, (stopChainFlag) => { | ||
debug('nextConditionalRequestMiddleware'); | ||
if (stopChainFlag === false) { | ||
nextConditionalRequestMiddleware(new Error('Send client cache headers')); | ||
} else { | ||
nextConditionalRequestMiddleware(); | ||
const strEtag = etag(chunks.join('')); | ||
res.setHeader('etag', strEtag); | ||
debug('Generated etag: ' + strEtag); | ||
async.eachSeries(restify.conditionalRequest(), (conditionalRequestMiddleware, nextConditionalRequestMiddleware) => { | ||
conditionalRequestMiddleware(req, res, (stopChainFlag) => { | ||
debug('nextConditionalRequestMiddleware'); | ||
if (stopChainFlag === false) { | ||
nextConditionalRequestMiddleware(new Error('Send client cache headers')); | ||
} else { | ||
nextConditionalRequestMiddleware(); | ||
} | ||
}); | ||
}, (err) => { | ||
if (!err) { | ||
headers.forEach((header) => { | ||
oldWriteHead.apply(res, header); | ||
}); | ||
chunks.forEach((chunk) => { | ||
oldWrite.apply(res, [chunk]); | ||
}); | ||
oldEnd.apply(res, arguments); | ||
} | ||
}); | ||
}, (err) => { | ||
if (!err) { | ||
headers.forEach((header) => { | ||
oldWriteHead.apply(res, header); | ||
}); | ||
}; | ||
chunks.forEach((chunk) => { | ||
oldWrite.apply(res, [chunk]); | ||
}); | ||
nextM(); | ||
} | ||
oldEnd.apply(res, arguments); | ||
} | ||
}); | ||
}; | ||
nextM(); | ||
return middleware; | ||
} | ||
@@ -71,0 +83,0 @@ |
{ | ||
"name": "restify-etag-cache", | ||
"version": "1.0.0", | ||
"version": "1.0.1", | ||
"description": "Restify ETag Cache. The easy way.", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
4995
94