@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
59 lines (58 loc) • 2.31 kB
JavaScript
import { useEnv } from '@directus/env';
import { getCache, getCacheValue } from '../cache.js';
import { useLogger } from '../logger/index.js';
import asyncHandler from '../utils/async-handler.js';
import { getCacheControlHeader } from '../utils/get-cache-headers.js';
import { getCacheKey } from '../utils/get-cache-key.js';
import { shouldSkipCache } from '../utils/should-skip-cache.js';
const checkCacheMiddleware = asyncHandler(async (req, res, next) => {
const env = useEnv();
const { cache } = getCache();
const logger = useLogger();
if (req.method.toLowerCase() !== 'get' && req.originalUrl?.startsWith('/graphql') === false)
return next();
if (env['CACHE_ENABLED'] !== true)
return next();
if (!cache)
return next();
if (shouldSkipCache(req)) {
if (env['CACHE_STATUS_HEADER'])
res.setHeader(`${env['CACHE_STATUS_HEADER']}`, 'MISS');
return next();
}
const key = await getCacheKey(req);
let cachedData;
try {
cachedData = await getCacheValue(cache, key);
}
catch (err) {
logger.warn(err, `[cache] Couldn't read key ${key}. ${err.message}`);
if (env['CACHE_STATUS_HEADER'])
res.setHeader(`${env['CACHE_STATUS_HEADER']}`, 'MISS');
return next();
}
if (cachedData) {
let cacheExpiryDate;
try {
cacheExpiryDate = (await getCacheValue(cache, `${key}__expires_at`))?.exp;
}
catch (err) {
logger.warn(err, `[cache] Couldn't read key ${`${key}__expires_at`}. ${err.message}`);
if (env['CACHE_STATUS_HEADER'])
res.setHeader(`${env['CACHE_STATUS_HEADER']}`, 'MISS');
return next();
}
const cacheTTL = cacheExpiryDate ? cacheExpiryDate - Date.now() : undefined;
res.setHeader('Cache-Control', getCacheControlHeader(req, cacheTTL, true, true));
res.setHeader('Vary', 'Origin, Cache-Control');
if (env['CACHE_STATUS_HEADER'])
res.setHeader(`${env['CACHE_STATUS_HEADER']}`, 'HIT');
return res.json(cachedData);
}
else {
if (env['CACHE_STATUS_HEADER'])
res.setHeader(`${env['CACHE_STATUS_HEADER']}`, 'MISS');
return next();
}
});
export default checkCacheMiddleware;