Adds compression utils to the Fastify reply
object.
Support gzip
, deflate
and brotli
.
npm i fastify-compress --save
This plugins adds two functionalities to Fastify, a compress utility and a global compression hook.
Currently the following headers are supported:
'deflate'
'gzip'
'br'
'*'
If the 'accept-encoding'
header specifies no preferred encoding with an asterisk *
the payload will be compressed with gzip
.
If an unsupported encoding is received, it will automatically return a 406
error, if the 'accept-encoding'
header is missing, it will not compress the payload.
It automatically defines if a payload should be compressed or not based on its Content-Type
, if no content type is present, it will assume is application/json
.
The global compression hook is enabled by default if you want to disable it, pass the option { global: false }
.
fastify.register(
require('fastify-compress'),
{ global: false }
)
Remember that thanks to the Fastify encapsulation model, you can set a global compression, but running it only in a subset of routes is you wrap them inside a plugin.
This plugin add a compress
function to reply
that accepts a stream or a string and compress it based on the 'accept-encoding'
header. If a js object is passed in, will be stringified as json.
const fs = require('fs')
const fastify = require('fastify')
fastify.register(require('fastify-compress'), { global: false })
fastify.get('/', (req, reply) => {
reply
.type('text/plain')
.compress(fs.createReadStream('./package.json'))
})
fastify.listen(3000, function (err) {
if (err) throw err
console.log(`server listening on ${fastify.server.address().port}`)
})
You can set a custom threshold below which it will not be made compression, default to 1024
.
fastify.register(
require('fastify-compress'),
{ threshold: 2048 }
)
mime-db is used to determine if a Content-Type
should be compressed. You can compress additional content types via regular expression.
fastify.register(
require('fastify-compress'),
{ customTypes: /x-protobuf$/ }
)
Brotli compression is not enabled by default, if you need it we recommend to install iltorb
and pass it as option.
fastify.register(
require('fastify-compress'),
{ brotli: require('iltorb') }
)
You can selectively disable the response compression by using the x-no-compression
header in the request.
Optional feature to inflate pre-compressed data if the client doesn't include one of the supported compression types in its Accept-Encoding
header.
fastify.register(
require('fastify-compress'),
{ inflateIfDeflated: true }
)
fastify.get('/file', (req, reply) =>
// will inflate the file on the way out for clients
// that indicate they do not support compression
reply.send(fs.createReadStream('./file.gz')))
Please have in mind that in large scale scenarios, you should use a proxy like Nginx to handle response-compression.
This project is kindly sponsored by:
Licensed under MIT.