Opciones del cliente, errores, reintentos y tiempos de espera
El comportamiento compartido por cada servicio del SDK y las opciones que lo cambian.
1. Crea el cliente
createClient(url, key, options?) toma la URL del proyecto y una clave. El proyecto se identifica mediante el host de la URL, por lo que no hay ningún ID de proyecto que pasar. En una pila local, use una URL con el subdominio del proyecto, como http://my-app-ab12.localhost:8080; con un http://localhost:8080 desnudo, el cliente imprime una advertencia, porque la puerta de enlace no puede decir a qué proyecto se refiere.
Utilice la clave pública (aura_anon_…) en navegadores y aplicaciones. Una clave service_role (aura_sk_…) pertenece únicamente a su servidor y el cliente la aplica:
En un navegador, createClient arroja cuando recibe una clave service_role, por lo que una clave filtrada no se puede enviar por accidente. Configure refuseServiceRoleInBrowser: false para reducir el error a una advertencia; no hagas esto en producción.
Cada servicio cuelga del cliente: aura.auth, aura.db, aura.storage, aura.realtime, aura.functions, aura.ai, aura.notifications y aura.from('table') como acceso directo para aura.db.from('table'). Consulte la referencia del cliente.
2. Opciones
| Opción | Predeterminado | Efecto |
|---|---|---|
auth.persistSession | true en un navegador | Mantener la sesión entre cargas de página. |
auth.storage | localStorage en un navegador, memoria en otro lugar | Dónde vive la sesión: pasa tu propia tienda (cookies para SSR) |
auth.autoRefresh | true | Actualice el token de acceso antes de que caduque y mantenga las pestañas sincronizadas |
auth.detectSessionInUrl | true en un navegador | Lea una sesión desde la URL después de una redirección OAuth, luego limpie la URL |
fetch | globalThis.fetch | Tu propio fetch, para pruebas o proxies |
retry | true | Vuelva a intentar leer en caso de errores transitorios. false desactiva, o { enabled, maxRetries } |
requestTimeoutMs | 30000 | Plazo de una solicitud. 0 lo desactiva. |
onEvent | ninguno | Recibe eventos de observabilidad, ver más abajo |
debug | false | También imprima cada evento con console.debug('[aurabase]', event) |
refuseServiceRoleInBrowser | true | Lanzar cuando una clave service_role llega a un navegador |
Para la representación del lado del servidor, utilice los clientes basados en cookies que se describen en Next.js App Router y SSR.
3. El objeto del error
Cada llamada devuelve { data, error } y nunca se devuelve. Cuando falla, error es un AuraError:
Se devolvió una llamada realmente fallida:
| campo | Significado |
|---|---|
status | El estado HTTP. 0 significa que la falla ocurrió antes de cualquier respuesta: red, tiempo de espera o rechazo por parte del cliente. |
code | Un identificador estable. Los códigos de servidor mantienen su valor; el cliente agrega los códigos a continuación. |
message | Una explicación legible |
details | El cuerpo de respuesta crudo |
retryAfter | Segundos de espera, desde un encabezado Retry-After, en un 429 |
isNotFound, isUnauthorized, isForbidden, isRateLimited | Atajos en status |
Códigos producidos por el propio cliente (estado 0): timeout, network_error, invalid_response (un éxito cuyo cuerpo no es JSON), no_session, refresh_discarded, invalid_path, invalid_body. La autenticación agrega códigos como invalid_credentials, weak_password, email_already_in_use, user_not_found, invalid_otp, session_expired, session_revoked y rate_limit_exceeded. Un 429 siempre lleva rate_limit_exceeded.
Pruebe data en lugar de error cuando necesite el valor. Algunas llamadas se realizan correctamente sin contenido (204), y luego tanto data como error son null.
4. Reintentos y tiempos de espera
Reintentos. El cliente reintenta una solicitud automáticamente solo cuando todas estas se mantienen:
- el método es
GEToHEAD(unPOST,PUT,PATCHoDELETEnunca se reproduce, por lo que nada se ejecuta dos veces); - el estado de respuesta es
408,429,502,503o504, o la red falló; - Han ocurrido menos de 3 reintentos.
El retraso es aleatorio entre 0 y min(500 ms × 2^attempt, 10 s). Un encabezado Retry-After lo supera, con un límite de 60 segundos. Las solicitudes reintentadas llevan un encabezado X-Retry-Count. No se reintenta un tiempo de espera.
Medido con un servidor que respondió 503 dos veces, luego 200:
Tiempos de espera. Una solicitud que no recibe respuesta dentro de requestTimeoutMs (30 s de forma predeterminada) finaliza con status: 0 y code: 'timeout'. La lectura del cuerpo está limitada por el mismo límite, por lo que un servidor que envía encabezados y luego se detiene no puede colgar la llamada. Una solicitud a un servidor que nunca respondió, con un límite de 400 ms, devolvió el error después de 405 ms.
Dos casos no utilizan este límite porque administran el suyo propio: una llamada en la que pasa un AbortSignal y las cargas. Las funciones usan su propia opción timeout, consulte Errores, tiempos de espera y reintentos.
5. Observar al cliente
onEvent recibe un evento por cada cosa notable que hace el cliente. Nunca hace que una solicitud falle: se ignora una excepción lanzada por su gancho.
kind | Campos | cuando |
|---|---|---|
retry | attempt, status?, url | Antes de un reintento |
timeout | url | Una solicitud llegó a requestTimeoutMs |
refresh-success | ninguno | Se realizó una actualización de sesión exitosa |
refresh-discarded | reason | Se abandonó una actualización porque la sesión cambió mientras tanto |
jwks-fetch-failed | baseUrl | No se pudieron recuperar las claves de firma (verificaciones de tokens locales) |
storage-blocked | op | El navegador rechazó el acceso al almacenamiento. |
A las URL en eventos se les elimina la cadena de consulta y el fragmento, porque pueden contener secretos (?apikey=, enlaces firmados).
6. Sesiones y tokens
- El cliente envía
apikeyen cada solicitud yAuthorization: Bearer <access token>una vez que el usuario inicia sesión. - Actualiza el token de acceso cuando quedan menos de 30 segundos. Las actualizaciones simultáneas se fusionan en una, por lo que se utiliza una vez un token de actualización rotativo.
- Un
401activa una actualización y una repetición de la solicitud, luego se detiene. - En un navegador, las actualizaciones se coordinan entre pestañas.
aura.auth.onAuthStateChange(callback)le informa sobreSIGNED_IN,SIGNED_OUT,TOKEN_REFRESHED,USER_UPDATEDyMFA_CHALLENGE. Consulte la guía de autenticación.