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.
Cómo funciona
- Una función es un módulo TypeScript que exporta un manejador: recibe una
Requestestándar y devuelve unaResponse. Se ejecuta en Deno, así quefetch, Web Crypto y los paquetesnpm: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.