From 16f34a2d6ecc7757bdc11f6109554f73b578acd5 Mon Sep 17 00:00:00 2001 From: Marlon Marcos Date: Mon, 1 Jul 2019 00:43:07 +0800 Subject: [PATCH] Allow setting a cache freshness --- README.md | 7 ++++ index.js | 99 ++++++++++++++++++++++++++-------------------------- package.json | 2 +- 3 files changed, 58 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index f66a098..fa6292d 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,13 @@ Allows you to prefix your keys if you want all of your snapshots to live in a sp default: none +#### S3_CACHE_FRESHNESS +Allows to set how long a cached copy of the html in s3 is considered fresh before overwriting with a new version. Value should be unix epoch time in milliseconds. + +`export S3_CACHE_FRESHNESS=` + +default: 604800000 (7 days) + ## License The MIT License (MIT) diff --git a/index.js b/index.js index 6038d8b..08999ca 100644 --- a/index.js +++ b/index.js @@ -1,51 +1,52 @@ -var s3 = new (require('aws-sdk')).S3({params:{Bucket: process.env.S3_BUCKET_NAME}}); +const AWS = require('aws-sdk'); +const s3 = new AWS.S3({params: {Bucket: process.env.S3_BUCKET_NAME}}); module.exports = { - - requestReceived: function(req, res, next) { - if(req.method !== 'GET') { - return next(); - } - - var key = req.prerender.url; - - if (process.env.S3_PREFIX_KEY) { - key = process.env.S3_PREFIX_KEY + '/' + key; - } - - s3.getObject({ - Key: key - }, function (err, result) { - - if (!err && result) { - return res.send(200, result.Body); - } - - next(); - }); - }, - - pageLoaded: function(req, res, next) { - if(req.prerender.statusCode !== 200) { - return next(); - } - - var key = req.prerender.url; - - if (process.env.S3_PREFIX_KEY) { - key = process.env.S3_PREFIX_KEY + '/' + key; - } - - s3.putObject({ - Key: key, - ContentType: 'text/html;charset=UTF-8', - StorageClass: 'REDUCED_REDUNDANCY', - Body: req.prerender.content - }, function(err, result) { - - if (err) console.error(err); - - next(); - }); - } -}; \ No newline at end of file + requestReceived: function(req, res, next) { + if (req.method !== 'GET') { + return next(); + } + + s3.getObject({Key: this.getCacheKey(req)}, (err, result) => { + if (!err && result) { + const freshness = process.env.S3_CACHE_FRESHNESS || 604800000; + const now = Date.now(); + const lastModified = result.LastModified.getTime(); + if ((now - lastModified) < freshness) { + return res.send(200, result.Body); + } + } + + next(); + }); + }, + + pageLoaded: function(req, res, next) { + if(req.prerender.statusCode !== 200) { + return next(); + } + + const s3Options = { + Key: this.getCacheKey(req), + ContentType: 'text/html;charset=UTF-8', + StorageClass: 'REDUCED_REDUNDANCY', + Body: req.prerender.content + } + + s3.putObject(s3Options, (err, result) => { + if (err) console.error(err); + next(); + }); + }, + + getCacheKey: function(req) { + let key = req.prerender.url; + if (req.prerender.width) { + key = `${key}-width-${req.prerender.width}`; + } + if (process.env.S3_PREFIX_KEY) { + key = `${process.env.S3_PREFIX_KEY}/${key}`; + } + return key; + }, +}; diff --git a/package.json b/package.json index 2b86f5e..6b4b683 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prerender-aws-s3-cache", - "version": "1.0.1", + "version": "1.1.0", "description": "S3 cache for use with Prerender server", "main": "index.js", "author": "Todd Hooper",