Dhal v1.1 fournit des adaptateurs pour Express, Fastify, NestJS, Koa, Hono sur Node.js et node:http. Tous réutilisent le même moteur, la même configuration, les mêmes stockages, la télémétrie et le cycle de décision.
Express
import { dhal } from "@rokadhq/dhal/express";
app.use(express.json({ limit: "1mb" }));
app.use(dhal({ configPath: "dhal.json" }));Placez les analyseurs de corps avant Dhal lorsque les règles doivent examiner des charges déjà analysées. L’adaptateur lit req.body, un éventuel req.rawBody, les identités et le statut final. Utilisez dhalFromEngine(engine) avec un moteur existant.
Fastify
import { dhalFastify } from "@rokadhq/dhal/fastify";
await app.register(dhalFastify({ configPath: "dhal.json" }));Dhal inspecte dans preHandler et enregistre les résultats dans onResponse. Utilisez dhalFastifyFromEngine(engine) pour un moteur précréé.
NestJS
import { installDhalNest } from "@rokadhq/dhal/nest";
const app = await NestFactory.create(AppModule);
const dhal = await installDhalNest(app, { configPath: "dhal.json" });
await app.listen(3000);Installez Dhal après la création de l’application et avant app.listen(). Dhal détecte si Nest utilise Express ou Fastify et installe l’adaptateur stable correspondant.
import { installDhalNestFromEngine } from "@rokadhq/dhal/nest";
const installation = await installDhalNestFromEngine(app, engine);L’installation expose engine, la platform détectée et close(). Les transports de microservices Nest sans adaptateur HTTP ne sont pas couverts.
Koa
import { dhalKoa } from "@rokadhq/dhal/koa";
app.use(dhalKoa({ configPath: "dhal.json" }));Enregistrez Dhal avant les routes. L’adaptateur inspecte avant les middlewares suivants, interrompt la chaîne en cas de blocage, ajoute x-dhal-action et x-dhal-rule, enregistre le statut final et lit les identités depuis context.state. Utilisez dhalKoaFromEngine(engine) pour gérer le cycle de vie.
Hono sur Node.js
import { dhalHono } from "@rokadhq/dhal/hono";
app.use("*", dhalHono({ configPath: "dhal.json" }));L’adaptateur utilise les objets Web Request et Response, renvoie une réponse contrôlée lors d’un blocage et enregistre le résultat final. Les identités peuvent être exposées via context.var. La cible prise en charge en v1.1 est Hono sur Node.js ; les runtimes périphériques ne font pas partie de l’engagement de compatibilité.
node:http
import { createNodeHttpDhal } from "@rokadhq/dhal/node-http";
const protection = createNodeHttpDhal({ configPath: "dhal.json" });L’adaptateur normalise méthode, URL, chemin, en-têtes, IP, identité et content-length. Il ne consomme pas le flux de la requête.
Intégrations personnalisées
import { createDhal, type DhalRequest } from "@rokadhq/dhal";
const protection = createDhal({ configPath: "dhal.json" });
const decision = await protection.inspect(request);
await protection.recordOutcome(request, { statusCode: 401 });Appelez recordOutcome() une fois la réponse connue afin de mettre à jour les signaux dépendant du résultat.
Cycle de vie et réponses de blocage
process.once("SIGTERM", async () => {
await protection.close(5_000);
process.exit(0);
});Les adaptateurs ajoutent x-dhal-action: block et x-dhal-rule: <rule id>, puis renvoient le code configuré avec une réponse JSON contrôlée. N’exposez pas les métadonnées privées de décision aux clients non fiables.