DOKUMENTATION

Edge Functions

Dein eigener Servercode, direkt neben deiner Datenbank: Webhooks empfangen, Zahlungen annehmen, E-Mails senden oder andere APIs aufrufen, ohne einen Server zu betreiben.

← Gesamte Dokumentation

So funktioniert es

  • Eine Funktion ist ein TypeScript-Modul, das einen Handler exportiert: Er erhält einen Standard-Request und gibt eine Response zurück. Sie läuft auf Deno, daher funktionieren fetch, Web Crypto und npm:-Pakete.
  • Die Funktionen jedes Projekts laufen in ihrer eigenen Sandbox (gVisor). Eine Funktion kann das Netzwerk und die Secrets ihres Projekts nutzen, sonst nichts: keine Dateien, keine anderen Programme, keine Datenbankpasswörter.
  • Funktionen starten beim ersten Aufruf und ruhen nach 10 Minuten ohne Aufrufe. Jede Bereitstellung ist eine neue Version.

1. Schreiben und bereitstellen

// 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}!` });
};

Öffne im Dashboard Edge Functions → Neue Funktion, wähle einen Namen (er wird Teil der URL) und klicke auf Bereitstellen. Entwickler, Admins und Inhaber können bereitstellen; zum Löschen einer Funktion braucht es einen Admin oder Inhaber.

2. Aufrufen

# 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" } });

Standardmäßig braucht eine Funktion den API-Schlüssel des Projekts, wie die REST-API. Stelle Wer sie aufrufen darf für Webhooks (von Stripe, GitHub, …) auf Jeder mit der URL und prüfe deren Signaturen in der Funktion.

3. Wissen, wer aufruft

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") });
};

Wenn ein angemeldeter Nutzer aufruft (espobase.functions.invoke sendet seinen Token), prüft Espobase den Token und übergibt den Nutzer in x-espobase-user-id, x-espobase-user-email und x-espobase-user-role. x-espobase-auth ist authenticated, anonymous, service oder public. Clients können diese Header nicht selbst setzen.

4. Secrets

const stripeKey = Deno.env.get("STRIPE_SECRET_KEY");
const projectUrl = Deno.env.get("ESPOBASE_URL");

Füge Schlüssel wie STRIPE_SECRET_KEY unter Edge Functions → Secrets hinzu und lies sie mit Deno.env.get("STRIPE_SECRET_KEY"). Die Werte werden verschlüsselt gespeichert und können nicht wieder angezeigt werden; laufende Funktionen starten neu, wenn sich ein Secret ändert. ESPOBASE_URL (die API-URL deines Projekts) ist immer gesetzt.

Logs

Was eine Funktion mit console.log ausgibt und welche Fehler sie wirft, erscheint im Dashboard unter der Funktion, Aufruf für Aufruf, mit Status und Dauer. Logs werden so lange aufbewahrt wie die Anfrage-Logs deines Tarifs.

Über die CLI bereitstellen

npx espobase login
npx espobase link <project-ref>
npx espobase functions deploy hello    # functions/hello.ts
npx espobase functions logs hello

deploy legt die Funktion bei der ersten Bereitstellung an (füge --public für Webhooks hinzu). Der Code kommt aus functions/<name>.ts, functions/<name>/index.ts oder --file. In CI nutzt du ein persönliches Zugriffstoken mit der Berechtigung Edge Functions bereitstellen.

Sicherheit

  • Die Funktionen jedes Projekts laufen getrennt von anderen Projekten und von den Datenbanken von Espobase, unter gVisor, mit schreibgeschütztem Dateisystem und ohne besondere Rechte.
  • API-Schlüssel, Cookies und interne Header von Espobase erreichen deinen Code nie; Antworten können keine Cookies für die Adresse der API setzen.
  • Öffentliche Funktionen prüfen keinen Schlüssel: Prüfe Webhook-Signaturen in deinem Code.
  • Fehler, die eine Funktion wirft, erreichen den Aufrufer nur als allgemeiner Fehler; die Details landen in den Logs der Funktion.

Limits

  • Free: 500K Aufrufe pro Monat. Sind sie aufgebraucht, werden Aufrufe bis zum nächsten Abrechnungszeitraum abgelehnt.
  • Pro: 2M Aufrufe pro Monat.
  • Group: 10M Aufrufe pro Monat.
  • Jeder Aufruf: bis zu 10 Sekunden und 6 MB Anfrage- oder Antwortinhalt. Bis zu 25 Funktionen pro Projekt, je 256 KB Code, und 50 Secrets.