@vtex/api
Version:
VTEX I/O API client
54 lines (53 loc) • 1.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.vary = void 0;
const constants_1 = require("../../../../../constants");
const cachingStrategies = [
{
forbidden: [],
path: '/_v/private/',
vary: [constants_1.HeaderKeys.SEGMENT, constants_1.HeaderKeys.SESSION],
},
{
forbidden: [constants_1.HeaderKeys.SEGMENT, constants_1.HeaderKeys.SESSION],
path: '/_v/public/',
vary: [],
},
{
forbidden: [constants_1.HeaderKeys.SESSION],
path: '/_v/segment/',
vary: [constants_1.HeaderKeys.SEGMENT],
},
];
const shouldVaryByHeader = (ctx, header, strategy) => {
if (strategy && strategy.vary.includes(header)) {
return true;
}
if (process.env.DETERMINISTIC_VARY) {
return false;
}
return !!ctx.get(header);
};
async function vary(ctx, next) {
const { method, path } = ctx;
const strategy = cachingStrategies.find((cachingStrategy) => path.indexOf(cachingStrategy.path) === 0);
if (strategy) {
strategy.forbidden.forEach((headerName) => {
delete ctx.headers[headerName];
});
}
// We don't need to vary non GET requests, since they are never cached
if (method.toUpperCase() !== 'GET') {
await next();
return;
}
ctx.vary(constants_1.HeaderKeys.LOCALE);
if (shouldVaryByHeader(ctx, constants_1.HeaderKeys.SEGMENT, strategy)) {
ctx.vary(constants_1.HeaderKeys.SEGMENT);
}
if (shouldVaryByHeader(ctx, constants_1.HeaderKeys.SESSION, strategy)) {
ctx.vary(constants_1.HeaderKeys.SESSION);
}
await next();
}
exports.vary = vary;