DOCUMENTAÇÃO

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.

← Toda a documentação

Como funciona

  • Uma função é um módulo TypeScript que exporta um handler: recebe uma Request padrão e devolve uma Response. Ela roda no Deno, então fetch, Web Crypto e pacotes npm: 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.