Bun
Protégez un serveur Bun.serve avec @zarex/bun.
Installation
bun add @zarex/bunZAREX_KEY=zarex_test_...Protéger le serveur
import { zarexBun, shield, rateLimit } from "@zarex/bun";
const wrap = zarexBun({
key: process.env.ZAREX_KEY!,
ipSource: "socket",
rules: [shield(), rateLimit({ max: 100, window: "1m" })],
});
Bun.serve({
fetch: wrap(async (request) => new Response("ok")),
});zarexBun(...) renvoie une fonction qui enveloppe votre gestionnaire fetch. Une requête refusée reçoit automatiquement 403, ou 429 avec retry-after.
L'adresse IP du visiteur
Bun donne l'adresse de la connexion : toutes les valeurs d'ipSource fonctionnent.
ipSource | Quand l'utiliser |
|---|---|
"socket" | Rien devant votre serveur Bun : l'adresse de la connexion. |
"cloudflare" | Derrière Cloudflare. |
{ proxies: n } | n proxys de confiance devant Bun. |
{ trustedProxies: [...] } | Les plages CIDR exactes de vos proxys. |
Sur Vercel et Fly.io, ipSource peut être omis. Ailleurs, l'application refuse de démarrer sans lui.
Identifiants et données de formulaire
const wrap = zarexBun({
key: process.env.ZAREX_KEY!,
ipSource: "socket",
rules: [rateLimit({ max: 100, window: "1m", characteristics: ["userId"] })],
call: (request) => ({
characteristics: { userId: request.headers.get("x-user-id") ?? undefined },
}),
});call peut aussi fournir email, phone, text et tokensRequested. Les identifiants sont hachés (SHA-256) avant l'envoi.
Personnaliser le refus
zarexBun({
key: process.env.ZAREX_KEY!,
ipSource: "socket",
rules: [shield()],
onDeny: (request, decision) =>
Response.json({ erreur: "Requête refusée", id: decision.id }, { status: 403 }),
});onDeny et onDegraded reçoivent la décision complète. Pour la lire à chaque requête, utilisez createZarex et protect (voir la référence).
En-têtes de sécurité et réponses
secureHeaders: true et responseGuard: true s'appliquent automatiquement à toutes les réponses de votre gestionnaire.