Aller au contenu
ZarexDocs

Bun

Protégez un serveur Bun.serve avec @zarex/bun.

Installation

bun add @zarex/bun
.env
ZAREX_KEY=zarex_test_...

Protéger le serveur

server.ts
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.

ipSourceQuand 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.

Sur cette page