Skip to content

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: true autorise le cache partagé.
  • maxAge: 300 autorise un cache de 5 minutes.
  • staleWhileRevalidate: 60 permet 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

  • private et noCache peuvent aussi recevoir une liste de noms d'entêtes.
  • extensions permet d'ajouter des directives personnalisées si vous devez produire un header plus spécifique.

Diffusé sous licence MIT.