Opções do cliente, erros, novas tentativas e tempos limite
O comportamento compartilhado por cada serviço do SDK e as opções que o alteram.
1. Crie o cliente
createClient(url, key, options?) usa o URL do projeto e uma chave. O projeto é identificado pelo host da URL, portanto não há ID do projeto para passar. Em uma pilha local, use uma URL com o subdomínio do projeto, como http://my-app-ab12.localhost:8080; com um http://localhost:8080 simples, o cliente imprime um aviso, porque o gateway não consegue dizer a qual projeto você se refere.
Use a chave pública (aura_anon_…) em navegadores e aplicativos. Uma chave service_role (aura_sk_…) pertence apenas ao seu servidor e o cliente a aplica:
Em um navegador, createClient lança quando recebe uma chave service_role, portanto, uma chave vazada não pode ser enviada acidentalmente. Defina refuseServiceRoleInBrowser: false para fazer o downgrade do erro para um aviso; não faça isso na produção.
Cada serviço fica suspenso no cliente: aura.auth, aura.db, aura.storage, aura.realtime, aura.functions, aura.ai, aura.notifications e aura.from('table') como um atalho para aura.db.from('table'). Consulte a referência do cliente.
2. Opções
| Opção | Padrão | Efeito |
|---|---|---|
auth.persistSession | true em um navegador | Mantenha a sessão entre carregamentos de página |
auth.storage | localStorage em um navegador, memória em outro lugar | Onde mora a sessão: passe na sua própria loja (cookies para SSR) |
auth.autoRefresh | true | Atualize o token de acesso antes que ele expire e mantenha as guias sincronizadas |
auth.detectSessionInUrl | true em um navegador | Leia uma sessão do URL após um redirecionamento OAuth e limpe o URL |
fetch | globalThis.fetch | Seu próprio fetch, para testes ou proxies |
retry | true | Tente novamente leituras em erros transitórios. false desabilita ou { enabled, maxRetries } |
requestTimeoutMs | 30000 | Limite de tempo de uma solicitação. 0 desativa-o. |
onEvent | nenhum | Recebe eventos de observabilidade, veja abaixo |
debug | false | Imprima também cada evento com console.debug('[aurabase]', event) |
refuseServiceRoleInBrowser | true | Lançar quando uma chave service_role chega a um navegador |
Para renderização no lado do servidor, use os clientes baseados em cookies descritos em Next.js App Router e SSR.
3. O objeto de erro
Cada chamada retorna { data, error } e nunca é lançada. Quando falha, error é um AuraError:
Uma chamada com falha real foi retornada:
| Campo | Significado |
|---|---|
status | O status HTTP. 0 significa que a falha ocorreu antes de qualquer resposta: rede, tempo limite ou recusa do cliente. |
code | Um identificador estável. Os códigos do servidor mantêm seu valor; o cliente adiciona os códigos abaixo. |
message | Uma explicação legível |
details | O corpo de resposta bruto |
retryAfter | Segundos de espera, de um cabeçalho Retry-After, em um 429 |
isNotFound, isUnauthorized, isForbidden, isRateLimited | Atalhos em status |
Códigos produzidos pelo próprio cliente (status 0): timeout, network_error, invalid_response (um sucesso cujo corpo não é JSON), no_session, refresh_discarded, invalid_path, invalid_body. A autenticação adiciona códigos como invalid_credentials, weak_password, email_already_in_use, user_not_found, invalid_otp, session_expired, session_revoked e rate_limit_exceeded. Um 429 sempre carrega rate_limit_exceeded.
Teste data em vez de error quando precisar do valor. Algumas chamadas são bem-sucedidas sem conteúdo (204) e então data e error são null.
4. Novas tentativas e tempos limites
Novas tentativas. O cliente tenta novamente uma solicitação automaticamente somente quando todos estes itens são válidos:
- o método é
GETouHEAD(umPOST,PUT,PATCHouDELETEnunca é reproduzido, então nada é executado duas vezes); - o status da resposta é
408,429,502,503ou504, ou a rede falhou; - menos de 3 novas tentativas aconteceram.
O atraso é aleatório entre 0 e min(500 ms × 2^attempt, 10 s). Um cabeçalho Retry-After vence, limitado a 60 segundos. Solicitações repetidas carregam um cabeçalho X-Retry-Count. Um tempo limite não é repetido.
Medido em relação a um servidor que respondeu 503 duas vezes e depois 200:
Tempos limite. Uma solicitação que não obtém resposta dentro de requestTimeoutMs (30 s por padrão) termina com status: 0 e code: 'timeout'. A leitura do corpo é limitada pelo mesmo limite, portanto, um servidor que envia cabeçalhos e depois paralisa não pode interromper a chamada. Uma solicitação a um servidor que nunca atendeu, com limite de 400 ms, retornou o erro após 405 ms.
Dois casos não utilizam esse limite porque gerenciam o seu próprio: uma chamada onde você passa um AbortSignal e uploads. As funções usam sua própria opção timeout, consulte Erros, tempos limite e novas tentativas.
5. Observe o cliente
onEvent recebe um evento por coisa notável que o cliente faz. Nunca faz uma solicitação falhar: uma exceção lançada pelo seu gancho é ignorada.
kind | Campos | Quando |
|---|---|---|
retry | attempt, status?, url | Antes de uma nova tentativa |
timeout | url | Uma solicitação atingiu requestTimeoutMs |
refresh-success | nenhum | Uma atualização de sessão foi bem-sucedida |
refresh-discarded | reason | Uma atualização foi interrompida porque a sessão foi alterada nesse meio tempo |
jwks-fetch-failed | baseUrl | As chaves de assinatura não puderam ser obtidas (verificações de token local) |
storage-blocked | op | O navegador recusou acesso ao armazenamento |
URLs em eventos têm sua string de consulta e fragmento removidos, porque podem conter segredos (?apikey=, links assinados).
6. Sessões e tokens
- O cliente envia
apikeyem cada solicitação eAuthorization: Bearer <access token>quando um usuário faz login. - Ele atualiza o token de acesso quando restam menos de 30 segundos. As atualizações simultâneas são mescladas em uma só, portanto, um token de atualização rotativo é usado uma vez.
- Um
401aciona uma atualização e uma repetição da solicitação e, em seguida, para. - Em um navegador, as atualizações são coordenadas entre guias.
aura.auth.onAuthStateChange(callback)fala sobreSIGNED_IN,SIGNED_OUT,TOKEN_REFRESHED,USER_UPDATEDeMFA_CHALLENGE. Consulte o guia de autenticação.