Contrôle du cache
@duplojs/http/cacheController fournit createCacheControllerHooks, un hook qui ajoute automatiquement l'entête Cache-Control sur les réponses concernées.
Le hook n'ajoute l'entête que sur les réponses de statut 2xx et 3xx.
Sur une route
ts
import { ResponseContract, useRouteBuilder } from "@duplojs/http";
import { createCacheControllerHooks } from "@duplojs/http/cacheController";
import { DPE } from "@duplojs/utils";
const articleSchema = DPE.object({
id: DPE.number(),
title: DPE.string(),
});
useRouteBuilder("GET", "/articles", {
hooks: [
createCacheControllerHooks({
public: true,
maxAge: 300,
staleWhileRevalidate: 60,
}),
],
})
.handler(
ResponseContract.ok("articles.list", articleSchema.array()),
(__, { response }) => response("articles.list", [
{
id: 1,
title: "Hello",
},
]),
);Dans ce cas, la configuration ne s'applique qu'à la route GET /articles.
public: trueautorise le cache partagé.maxAge: 300autorise un cache de 5 minutes.staleWhileRevalidate: 60permet de servir une réponse légèrement expirée pendant une revalidation.
Sur toutes les routes du Hub
ts
import { createHub } from "@duplojs/http";
import { createCacheControllerHooks } from "@duplojs/http/cacheController";
export const hub = createHub({ environment: "DEV" })
.addRouteHooks(
createCacheControllerHooks({
private: true,
noCache: true,
}),
);Ici, le hook est ajouté globalement avec addRouteHooks. Toutes les routes enregistrées dans ce Hub héritent donc de la même politique de cache.
Interface de configuration
ts
interface CacheControlDirectives {
maxAge?: number;
sMaxAge?: number;
public?: true;
private?: true | string[];
noCache?: true | string[];
noStore?: true;
noTransform?: true;
mustRevalidate?: true;
proxyRevalidate?: true;
immutable?: true;
staleWhileRevalidate?: number;
staleIfError?: number;
mustUnderstand?: true;
extensions?: Record<string, string>;
}Notes utiles
privateetnoCachepeuvent aussi recevoir une liste de noms d'entêtes.extensionspermet d'ajouter des directives personnalisées si vous devez produire un header plus spécifique.
