Giter Site home page Giter Site logo

fastify-caching's Introduction

fastify-caching

Greenkeeper badge Build Status

fastify-caching is a plugin for the Fastify framework that provides mechanisms for manipulating HTTP cache headers according to RFC 2616 §14.9.

Supports Fastify versions ^2.0.0.

This plugin fully supports Fastify's encapsulation. Therefore, routes that should have differing cache settings should be registered within different contexts.

In addition to providing header manipulation, the plugin also decorates the server instance with an object that can be used for caching items. Note: the default cache should not be used in a "production" environment. It is an LRU, in-memory cache that is capped at 100,000 items. It is highly recommended that a full featured cache object be supplied, e.g. abstract-cache-redis.

Example

This example shows using the plugin to disable client side caching of all routes.

const http = require('http')
const fastify = require('fastify')
const fastifyCaching = require('fastify-caching')

fastify.register(
  fastifyCaching,
  {privacy: fastifyCaching.privacy.NOCACHE},
  (err) => { if (err) throw err }
)

fastify.get('/', (req, reply) => {
  reply.send({hello: 'world'})
})

fastify.listen(3000, (err) => {
  if (err) throw err

  http.get('http://127.0.0.1:3000/', (res) => {
    console.log(res.headers['cache-control'])
  })
})

This example shows how to register the plugin such that it only provides a server-local cache. It will not set any cache control headers on responses. It also shows how to retain a reference to the cache object so that it can be re-used.

const redis = require('ioredis')({host: '127.0.0.1'})
const abcache = require('abstract-cache')({
  useAwait: false,
  driver: {
    name: 'abstract-cache-redis', // must be installed via `npm install`
    options: {client: redis}
  }
})

const fastify = require('fastify')()
fastify
  .register(require('fastify-redis'), {client: redis})
  .register(require('fastify-caching'), {cache: abcache})

fastify.get('/', (req, reply) => {
  fastify.cache.set('hello', {hello: 'world'}, 10000, (err) => {
    if (err) return reply.send(err)
    reply.send({hello: 'world'})
  })
})

fastify.listen(3000, (err) => {
  if (err) throw err
})

API

Options

fastify-caching accepts the options object:

{
  privacy: 'value',
  expiresIn: 300,
  cache: {get, set},
  cacheSegment: 'segment-name'
}
  • privacy (Default: undefined): can be set to any string that is valid for a cache-response-directive as defined by RFC 2616.
  • expiresIn (Default: undefined): a value, in seconds, for the max-age the resource may be cached. When this is set, and privacy is not set to no-cache, then ', max-age=<value>' will be appended to the cache-control header.
  • cache (Default: abstract-cache.memclient): an abstract-cache protocol compliant cache object. Note: the plugin requires a cache instance to properly support the ETag mechanism. Therefore, if a falsy value is supplied the default will be used.
  • cacheSegment (Default: 'fastify-caching'): segment identifier to use when communicating with the cache.

reply.etag(string, number)

This method allows setting of the etag header. It accepts any arbitrary string. Be sure to supply a string that is valid for HTTP headers.

If a tag string is not supplied then uid-safe will be used to generate a tag. This operation will be performed synchronously. It is recommended to always supply a value to this method to avoid this operation.

All incoming requests to paths affected by this plugin will be inspected for the if-none-match header. If the header is present, the value will be used to lookup the tag within the cache associated with this plugin. If the tag is found, then the response will be ended with a 304 status code sent to the client.

Tags will be cached according to the second parameter. If the second parameter is supplied, and it is an integer, then it will be used as the time to cache the etag for generating 304 responses. The time must be specified in milliseconds. The default lifetime, when the parameter is not specified, is 3600000.

reply.expires(date)

This method allows setting of the expires header. It accepts a regular Date object, or a string that is a valid date string according to RFC 2616 §14.21.

License

MIT License

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.