compression
![Gratipay](https://img.shields.io/gratipay/dougwilson.svg?style=flat)
Node.js compression middleware.
Install
$ npm install compression
API
var compression = require('compression')
compression(options)
Returns the compression middleware using the given options
.
app.use(compression({
threshold: 512
}))
Options
compression()
accepts these properties in the options object. In addition to
those listed below, zlib options may be
passed in to the options object.
filter
A function to decide if the response should be considered for compression.
This function is called as filter(req, res)
and is expected to return
true
to consider the response for compression, or false
to not compress
the response.
The default filter function uses the compressible
module to determine if res.getHeader('Content-Type')
is compressible.
threshold
The byte threshold for the response body size before compression is considered
for the response, defaults to 1kb
. This is a number of bytes, any string
accepted by the bytes module, or false
.
.filter
The default filter
function. This is used to construct a custom filter
function that is an extension of the default function.
app.use(compression({filter: shouldCompress}))
function shouldCompress(req, res) {
if (req.headers['x-no-compression']) {
return false
}
return compression.filter(req, res)
}
res.flush
This module adds a res.flush()
method to force the partially-compressed
response to be flushed to the client.
Examples
express/connect
When using this module with express or connect, simply app.use
the module as
high as you like. Requests that pass through the middleware will be compressed.
var compression = require('compression')
var express = require('express')
var app = express()
app.use(compression())
Server-Sent Events
Because of the nature of compression this module does not work out of the box
with server-sent events. To compress content, a window of the output needs to
be buffered up in order to get good compression. Typically when using server-sent
events, there are certain block of data that need to reach the client.
You can achieve this by calling res.flush()
when you need the data written to
actually make it to the client.
var compression = require('compression')
var express = require('express')
var app = express()
app.use(compression())
app.get('/events', function (req, res) {
res.setHeader('Content-Type', 'text/event-stream')
res.setHeader('Cache-Control', 'no-cache')
var timer = setInterval(function () {
res.write('data: ping\n\n')
res.flush()
}, 2000)
res.on('close', function () {
clearInterval(timer)
})
})
License
MIT