DOCUMENTAZIONE

Edge Functions

Il tuo codice server, accanto al tuo database: ricevi webhook, incassa pagamenti, invia email o chiama altre API, senza gestire un server.

← Tutta la documentazione

Come funziona

  • Una funzione è un modulo TypeScript che esporta un handler: riceve una Request standard e restituisce una Response. Gira su Deno, quindi fetch, Web Crypto e i pacchetti npm: funzionano.
  • Le funzioni di ogni progetto girano nel loro ambiente isolato (gVisor). Una funzione può usare la rete e i segreti del suo progetto, e nient'altro: niente file, niente altri programmi, niente password del database.
  • Le funzioni partono alla prima chiamata e vanno in pausa dopo 10 minuti senza chiamate. Ogni distribuzione è una nuova versione.

1. Scrivi e distribuisci

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

Nella dashboard, apri Edge Functions → Nuova funzione, scegli un nome (diventa parte dell'URL) e fai clic su Distribuisci. Possono distribuire sviluppatori, amministratori e proprietari; per eliminare una funzione serve un amministratore o un proprietario.

2. Chiamala

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

Di base una funzione richiede la chiave API del progetto, come l'API REST. Imposta Chi può chiamarla su Chiunque abbia l'URL per i webhook (da Stripe, GitHub, …) e verificane le firme dentro la funzione.

3. Sapere chi chiama

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

Quando chiama un utente che ha effettuato l'accesso (espobase.functions.invoke invia il suo token), Espobase verifica il token e passa l'utente in x-espobase-user-id, x-espobase-user-email e x-espobase-user-role. x-espobase-auth vale authenticated, anonymous, service o public. I client non possono impostare questi header da soli.

4. Segreti

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

Aggiungi chiavi come STRIPE_SECRET_KEY in Edge Functions → Segreti e leggile con Deno.env.get("STRIPE_SECRET_KEY"). I valori sono salvati cifrati e non si possono più visualizzare; le funzioni in esecuzione si riavviano quando un segreto cambia. ESPOBASE_URL (l'URL dell'API del tuo progetto) è sempre impostata.

Log

Ciò che una funzione stampa con console.log e gli errori che lancia compaiono sotto la funzione nella dashboard, chiamata per chiamata, con lo stato e la durata. I log si conservano per lo stesso tempo dei log delle richieste del tuo piano.

Distribuisci dalla CLI

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

deploy crea la funzione alla prima distribuzione (aggiungi --public per i webhook). Il codice viene da functions/<name>.ts, functions/<name>/index.ts o --file. In CI, usa un token di accesso personale con il permesso Distribuire edge functions.

Sicurezza

  • Le funzioni di ogni progetto girano separate dagli altri progetti e dai database di Espobase, sotto gVisor, con un file system in sola lettura e senza privilegi speciali.
  • Chiavi API, cookie e header interni di Espobase non raggiungono mai il tuo codice; le risposte non possono impostare cookie sull'indirizzo dell'API.
  • Le funzioni pubbliche non controllano alcuna chiave: verifica le firme dei webhook nel tuo codice.
  • Gli errori lanciati da una funzione arrivano a chi chiama solo come errore generico; i dettagli vanno nei log della funzione.

Limiti

  • Free: 500K chiamate al mese. Quando sono esaurite, le chiamate vengono rifiutate fino al ciclo di fatturazione successivo.
  • Pro: 2M chiamate al mese.
  • Group: 10M chiamate al mese.
  • Ogni chiamata: fino a 10 secondi e 6 MB di corpo della richiesta o della risposta. Fino a 25 funzioni per progetto, 256 KB di codice ciascuna e 50 segreti.