Edge Functions
Votre propre code serveur, à côté de votre base de données : recevez des webhooks, encaissez des paiements, envoyez des e-mails ou appelez d'autres API, sans gérer de serveur.
Fonctionnement
- Une fonction est un module TypeScript qui exporte un gestionnaire : il reçoit une
Requeststandard et renvoie uneResponse. Elle tourne sur Deno, doncfetch, Web Crypto et les paquetsnpm:fonctionnent. - Les fonctions de chaque projet tournent dans leur propre bac à sable (gVisor). Une fonction peut utiliser le réseau et les secrets de son projet, et rien d'autre : ni fichiers, ni autres programmes, ni mots de passe de base de données.
- Les fonctions démarrent au premier appel et se mettent en veille après 10 minutes sans appel. Chaque déploiement crée une nouvelle version.
1. Écrire et déployer
// functions/hello.ts
export default async (req: Request): Promise<Response> => {
const { name } = await req.json().catch(() => ({ name: "world" }));
console.log("greeting", name);
return Response.json({ message: `Hello ${name}!` });
};Dans le tableau de bord, ouvrez Edge Functions → Nouvelle fonction, choisissez un nom (il fait partie de l'URL) et cliquez sur Déployer. Les développeurs, administrateurs et propriétaires peuvent déployer ; supprimer une fonction nécessite un administrateur ou un propriétaire.
2. L'appeler
# with the project's publishable key
curl -X POST "$ESPOBASE_URL/functions/v1/hello" \
-H "apikey: $ESPOBASE_PUBLISHABLE_KEY" \
-H "content-type: application/json" \
-d '{"name":"Ada"}'
// from your app (@espobase/client): sends the signed-in user's token too
const { data, error } = await espobase.functions.invoke("hello", { body: { name: "Ada" } });Par défaut, une fonction exige la clé d'API du projet, comme l'API REST. Réglez Qui peut l'appeler sur Toute personne ayant l'URL pour les webhooks (de Stripe, GitHub, …) et vérifiez leurs signatures dans la fonction.
3. Savoir qui appelle
export default (req: Request) => {
if (req.headers.get("x-espobase-auth") !== "authenticated") {
return new Response("Sign in first", { status: 401 });
}
return Response.json({ hello: req.headers.get("x-espobase-user-email") });
};Quand un utilisateur connecté appelle (espobase.functions.invoke envoie son jeton), Espobase vérifie le jeton et transmet l'utilisateur dans x-espobase-user-id, x-espobase-user-email et x-espobase-user-role. x-espobase-auth vaut authenticated, anonymous, service ou public. Les clients ne peuvent pas définir ces en-têtes eux-mêmes.
4. Secrets
const stripeKey = Deno.env.get("STRIPE_SECRET_KEY");
const projectUrl = Deno.env.get("ESPOBASE_URL");Ajoutez des clés comme STRIPE_SECRET_KEY dans Edge Functions → Secrets et lisez-les avec Deno.env.get("STRIPE_SECRET_KEY"). Les valeurs sont stockées chiffrées et ne peuvent plus être affichées ; les fonctions en cours redémarrent quand un secret change. ESPOBASE_URL (l'URL de l'API de votre projet) est toujours définie.
Journaux
Ce qu'une fonction affiche avec console.log et les erreurs qu'elle lève apparaissent sous la fonction dans le tableau de bord, appel par appel, avec le statut et la durée. Les journaux sont conservés aussi longtemps que votre offre conserve les journaux de requêtes.
Déployer depuis la CLI
npx espobase login npx espobase link <project-ref> npx espobase functions deploy hello # functions/hello.ts npx espobase functions logs hello
deploy crée la fonction lors de son premier déploiement (ajoutez --public pour les webhooks). Le code vient de functions/<name>.ts, functions/<name>/index.ts ou --file. En CI, utilisez un jeton d'accès personnel avec la permission Déployer des edge functions.
Sécurité
- Les fonctions de chaque projet tournent à part des autres projets et des bases de données d'Espobase, sous gVisor, avec un système de fichiers en lecture seule et sans privilèges particuliers.
- Les clés d'API, les cookies et les en-têtes internes d'Espobase n'atteignent jamais votre code ; les réponses ne peuvent pas poser de cookies sur l'adresse de l'API.
- Les fonctions publiques ne vérifient aucune clé : vérifiez les signatures des webhooks dans votre code.
- Les erreurs levées par une fonction n'arrivent à l'appelant que sous la forme d'une erreur générique ; les détails vont dans les journaux de la fonction.
Limites
- Free : 500K appels par mois. Une fois épuisés, les appels sont refusés jusqu'au cycle de facturation suivant.
- Pro : 2M appels par mois.
- Group : 10M appels par mois.
- Chaque appel : jusqu'à 10 secondes et 6 Mo de corps de requête ou de réponse. Jusqu'à 25 fonctions par projet, 256 Ko de code chacune et 50 secrets.