DOCUMENTACIÓN

Edge Functions

Tu propio código de servidor, junto a tu base de datos: recibe webhooks, cobra pagos, envía correos o llama a otras APIs, sin mantener un servidor.

← Toda la documentación

Cómo funciona

  • Una función es un módulo TypeScript que exporta un manejador: recibe una Request estándar y devuelve una Response. Se ejecuta en Deno, así que fetch, Web Crypto y los paquetes npm: funcionan.
  • Las funciones de cada proyecto se ejecutan en su propio entorno aislado (gVisor). Una función puede usar la red y los secretos de su proyecto, y nada más: ni archivos, ni otros programas, ni contraseñas de la base de datos.
  • Las funciones arrancan con la primera llamada y entran en reposo tras 10 minutos sin llamadas. Cada despliegue es una versión nueva.

1. Escribe y despliega

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

En el panel, abre Edge Functions → Nueva función, elige un nombre (forma parte de la URL) y haz clic en Desplegar. Pueden desplegar los desarrolladores, administradores y propietarios; eliminar una función requiere un administrador o propietario.

2. Llámala

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

Por defecto, una función necesita la clave de API del proyecto, como la API REST. Cambia Quién puede llamarla a Cualquiera con la URL para webhooks (de Stripe, GitHub, …) y verifica sus firmas dentro de la función.

3. Sabe quién llama

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

Cuando llama un usuario con sesión iniciada (espobase.functions.invoke envía su token), Espobase verifica el token y pasa el usuario en x-espobase-user-id, x-espobase-user-email y x-espobase-user-role. x-espobase-auth es authenticated, anonymous, service o public. Los clientes no pueden enviar estos encabezados por su cuenta.

4. Secretos

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

Añade claves como STRIPE_SECRET_KEY en Edge Functions → Secretos y léelas con Deno.env.get("STRIPE_SECRET_KEY"). Los valores se guardan cifrados y no se pueden volver a ver; las funciones en ejecución se reinician cuando cambia un secreto. ESPOBASE_URL (la URL de la API de tu proyecto) siempre está definida.

Registros

Lo que una función imprime con console.log y los errores que lanza aparecen bajo la función en el panel, llamada por llamada, con el estado y la duración. Los registros se guardan tanto tiempo como tu plan guarda los registros de solicitudes.

Despliega desde la 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 función en su primer despliegue (añade --public para webhooks). El código viene de functions/<name>.ts, functions/<name>/index.ts o --file. En CI, usa un token de acceso personal con el permiso Desplegar edge functions.

Seguridad

  • Las funciones de cada proyecto se ejecutan aparte de otros proyectos y de las bases de datos de Espobase, bajo gVisor, con un sistema de archivos de solo lectura y sin privilegios especiales.
  • Las claves de API, las cookies y los encabezados internos de Espobase nunca llegan a tu código; las respuestas no pueden poner cookies en la dirección de la API.
  • Las funciones públicas no comprueban ninguna clave: verifica las firmas de los webhooks en tu código.
  • Los errores que lanza una función llegan a quien llama solo como un error genérico; los detalles van a los registros de la función.

Límites

  • Free: 500K llamadas al mes. Cuando se agotan, las llamadas se rechazan hasta el siguiente ciclo de facturación.
  • Pro: 2M llamadas al mes.
  • Group: 10M llamadas al mes.
  • Cada llamada: hasta 10 segundos y 6 MB de cuerpo de solicitud o respuesta. Hasta 25 funciones por proyecto, 256 KB de código cada una y 50 secretos.