Edge Functions
Seu próprio código de servidor, ao lado do seu banco de dados: receba webhooks, cobre pagamentos, envie e-mails ou chame outras APIs, sem manter um servidor.
Como funciona
- Uma função é um módulo TypeScript que exporta um handler: recebe uma
Requestpadrão e devolve umaResponse. Ela roda no Deno, entãofetch, Web Crypto e pacotesnpm:funcionam. - As funções de cada projeto rodam no próprio ambiente isolado (gVisor). Uma função pode usar a rede e os segredos do seu projeto, e nada mais: nem arquivos, nem outros programas, nem senhas do banco de dados.
- As funções iniciam na primeira chamada e entram em repouso após 10 minutos sem chamadas. Cada publicação é uma nova versão.
1. Escreva e publique
// 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}!` });
};No painel, abra Edge Functions → Nova função, escolha um nome (ele faz parte da URL) e clique em Publicar. Desenvolvedores, administradores e proprietários podem publicar; excluir uma função exige um administrador ou proprietário.
2. Chame-a
# 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 padrão, uma função exige a chave de API do projeto, como a API REST. Mude Quem pode chamá-la para Qualquer pessoa com a URL para webhooks (do Stripe, GitHub, …) e verifique as assinaturas deles dentro da função.
3. Saiba quem está chamando
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 um usuário conectado chama (espobase.functions.invoke envia o token dele), o Espobase verifica o token e passa o usuário em x-espobase-user-id, x-espobase-user-email e x-espobase-user-role. x-espobase-auth é authenticated, anonymous, service ou public. Os clientes não podem definir esses cabeçalhos por conta própria.
4. Segredos
const stripeKey = Deno.env.get("STRIPE_SECRET_KEY");
const projectUrl = Deno.env.get("ESPOBASE_URL");Adicione chaves como STRIPE_SECRET_KEY em Edge Functions → Segredos e leia-as com Deno.env.get("STRIPE_SECRET_KEY"). Os valores ficam guardados criptografados e não podem ser vistos de novo; as funções em execução reiniciam quando um segredo muda. ESPOBASE_URL (a URL da API do seu projeto) está sempre definida.
Logs
O que uma função imprime com console.log e os erros que ela lança aparecem abaixo da função no painel, chamada por chamada, com o status e a duração. Os logs ficam guardados pelo mesmo tempo que o seu plano guarda os logs de requisições.
Publique pela CLI
npx espobase login npx espobase link <project-ref> npx espobase functions deploy hello # functions/hello.ts npx espobase functions logs hello
deploy cria a função na primeira publicação (adicione --public para webhooks). O código vem de functions/<name>.ts, functions/<name>/index.ts ou --file. Em CI, use um token de acesso pessoal com a permissão Publicar edge functions.
Segurança
- As funções de cada projeto rodam separadas dos outros projetos e dos bancos de dados do Espobase, sob o gVisor, com um sistema de arquivos somente leitura e sem privilégios especiais.
- Chaves de API, cookies e cabeçalhos internos do Espobase nunca chegam ao seu código; as respostas não podem definir cookies no endereço da API.
- Funções públicas não verificam nenhuma chave: verifique as assinaturas dos webhooks no seu código.
- Os erros lançados por uma função chegam a quem chamou apenas como um erro genérico; os detalhes vão para os logs da função.
Limites
- Free: 500K chamadas por mês. Quando acabam, as chamadas são recusadas até o próximo ciclo de cobrança.
- Pro: 2M chamadas por mês.
- Group: 10M chamadas por mês.
- Cada chamada: até 10 segundos e 6 MB de corpo de requisição ou resposta. Até 25 funções por projeto, 256 KB de código cada uma, e 50 segredos.