From 4195cd2bc5046d4cdf1c677c27cd41f427d7a13a Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 17 Apr 2018 14:01:06 +0200 Subject: Add redis cache to feed route --- server/middlewares/cache.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 server/middlewares/cache.ts (limited to 'server/middlewares') diff --git a/server/middlewares/cache.ts b/server/middlewares/cache.ts new file mode 100644 index 000000000..a2c7f7cbd --- /dev/null +++ b/server/middlewares/cache.ts @@ -0,0 +1,41 @@ +import * as express from 'express' +import { Redis } from '../lib/redis' +import { logger } from '../helpers/logger' + +async function cacheRoute (req: express.Request, res: express.Response, next: express.NextFunction) { + const cached = await Redis.Instance.getCachedRoute(req) + + // Not cached + if (!cached) { + logger.debug('Not cached result for route %s.', req.originalUrl) + + const sendSave = res.send.bind(res) + + res.send = (body) => { + if (res.statusCode >= 200 && res.statusCode < 400) { + Redis.Instance.setCachedRoute(req, body, res.getHeader('content-type').toString(), res.statusCode) + .catch(err => logger.error('Cannot cache route.', { err })) + } + + return sendSave(body) + } + + return next() + } + + if (cached.contentType) res.contentType(cached.contentType) + + if (cached.statusCode) { + const statusCode = parseInt(cached.statusCode, 10) + if (!isNaN(statusCode)) res.status(statusCode) + } + + logger.debug('Use cached result for %s.', req.originalUrl) + return res.send(cached.body).end() +} + +// --------------------------------------------------------------------------- + +export { + cacheRoute +} -- cgit v1.2.3