Skip to content

Commit

Permalink
Add file system cache
Browse files Browse the repository at this point in the history
  • Loading branch information
niutech committed Dec 18, 2017
1 parent 8590e4c commit 3c7d6eb
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 12 deletions.
142 changes: 141 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "bandwidth-hero-proxy",
"main": "server.js",
"private": true,
"version": "1.0.2",
"version": "1.0.3",
"description": "Data compression service that converts images to low-res WebP or JPEG on the fly. Used in Bandwidth-Hero browser extension.",
"author": "Anatoliy Yastreb",
"license": "MIT",
Expand All @@ -11,6 +11,8 @@
},
"dependencies": {
"basic-auth": "^2.0.0",
"cache-manager": "^2.6.0",
"cache-manager-fs-binary": "^1.0.4",
"express": "4.16.2",
"lodash": "^4.17.4",
"request": "^2.83.0",
Expand Down
35 changes: 25 additions & 10 deletions src/compress.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,42 @@
const sharp = require('sharp')
const redirect = require('./redirect')
const cacheMgr = require('cache-manager')
const cacheStore = require('cache-manager-fs-binary')
const cache = cacheMgr.caching({
store: cacheStore,
options: {
ttl: 604800, //7d
maxsize: 1073741824, //1GB
path: './cache',
preventfill: true
}
})

function compress(req, res, input) {
const format = req.params.webp ? 'webp' : 'jpeg'
const key = req.params.url || ''

sharp(input)
cache.wrap(key, (callback) => {
sharp(input)
.grayscale(req.params.grayscale)
.toFormat(format, {
quality: req.params.quality,
progressive: true,
optimizeScans: true
})
.toBuffer((err, output, info) => {
if (err || !info || res.headersSent) return redirect(req, res)

res.setHeader('content-type', `image/${format}`)
res.setHeader('content-length', info.size)
res.setHeader('x-original-size', req.params.originSize)
res.setHeader('x-bytes-saved', req.params.originSize - info.size)
res.status(200)
res.write(output)
res.end()
callback(err, {binary: {output: output}, info: info})
})
}, (err, obj) => {
if (err || !obj || !obj.info || res.headersSent) return redirect(req, res)
res.setHeader('content-type', `image/${format}`)
res.setHeader('content-length', obj.info.size)
res.setHeader('x-original-size', req.params.originSize)
res.setHeader('x-bytes-saved', req.params.originSize - obj.info.size)
res.status(200)
res.write(obj.binary.output)
res.end()
})
}

module.exports = compress

0 comments on commit 3c7d6eb

Please sign in to comment.