Dhal v1.1は、Express、Fastify、NestJS、Koa、Node.js上のHono、node:http向けアダプターを提供します。すべて同じエンジン、設定、ストア、テレメトリ、判断ライフサイクルを再利用します。
Express
import { dhal } from "@rokadhq/dhal/express";
app.use(express.json({ limit: "1mb" }));
app.use(dhal({ configPath: "dhal.json" }));解析済み本文をルールで検査する場合は、本文パーサーをDhalより前に配置します。アダプターはreq.body、任意のreq.rawBody、ID、最終レスポンス状態を読み取ります。既存エンジンにはdhalFromEngine(engine)を使用します。
Fastify
import { dhalFastify } from "@rokadhq/dhal/fastify";
await app.register(dhalFastify({ configPath: "dhal.json" }));DhalはpreHandlerで検査し、onResponseで結果を記録します。既存エンジンにはdhalFastifyFromEngine(engine)を使用します。
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);アプリ作成後、app.listen()の前にDhalを導入します。DhalはNestがExpressまたはFastifyのどちらを利用しているか検出し、対応する安定版アダプターを登録します。
import { installDhalNestFromEngine } from "@rokadhq/dhal/nest";
const installation = await installDhalNestFromEngine(app, engine);戻り値はengine、検出したplatform、close()を公開します。HTTPアダプターを持たないNestマイクロサービストランスポートは対象外です。
Koa
import { dhalKoa } from "@rokadhq/dhal/koa";
app.use(dhalKoa({ configPath: "dhal.json" }));アプリルートより前に登録します。アダプターは後続ミドルウェアの前に検査し、ブロック時はチェーンを終了し、x-dhal-actionとx-dhal-ruleを設定し、最終状態を記録し、context.stateからIDを読み取ります。独自ライフサイクル管理にはdhalKoaFromEngine(engine)を使用します。
Node.js上のHono
import { dhalHono } from "@rokadhq/dhal/hono";
app.use("*", dhalHono({ configPath: "dhal.json" }));標準Web RequestとResponseを利用し、ブロック時は制御されたレスポンスを返し、最終結果を記録します。IDはcontext.varから渡せます。v1.1のサポート対象はNode.js上のHonoであり、エッジランタイムは互換性保証に含まれません。
node:http
import { createNodeHttpDhal } from "@rokadhq/dhal/node-http";
const protection = createNodeHttpDhal({ configPath: "dhal.json" });アダプターはメソッド、URL、パス、ヘッダー、IP、ID、content-lengthを正規化します。リクエストストリームは読み取りません。
独自統合
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 });レスポンスが確定した後にrecordOutcome()を呼び出し、結果依存シグナルを更新します。
ライフサイクルとブロックレスポンス
process.once("SIGTERM", async () => {
await protection.close(5_000);
process.exit(0);
});各アダプターはx-dhal-action: blockとx-dhal-rule: <rule id>を設定し、構成済みの状態コードと制御されたJSONを返します。信頼できないクライアントへ非公開の判断メタデータを公開しないでください。