Options client, erreurs, tentatives et délais d'attente
Le comportement partagé par chaque service du SDK et les options qui le modifient.
1. Créez le client
createClient(url, key, options?) prend l'URL du projet et une clé. Le projet est identifié par l'hôte de l'URL, il n'y a donc aucun identifiant de projet à transmettre. Dans une pile locale, utilisez une URL avec le sous-domaine du projet, telle que http://my-app-ab12.localhost:8080; avec un simple http://localhost:8080, le client imprime un avertissement, car la passerelle ne peut pas savoir de quel projet vous parlez.
Utilisez la clé publique (aura_anon_…) dans les navigateurs et les applications. Une clé service_role (aura_sk_…) appartient uniquement à votre serveur et le client l'applique :
Dans un navigateur, createClient lance lorsqu'il reçoit une clé service_role, de sorte qu'une clé divulguée ne peut pas être expédiée par accident. Définissez refuseServiceRoleInBrowser: false pour rétrograder l'erreur en avertissement ; ne faites pas cela en production.
Chaque service est suspendu au client : aura.auth, aura.db, aura.storage, aura.realtime, aura.functions, aura.ai, aura.notifications et aura.from('table') comme raccourci pour aura.db.from('table'). Voir la référence client.
2.Options
| Options | Par défaut | Effet |
|---|---|---|
auth.persistSession | true dans un navigateur | Conserver la session entre les chargements de pages |
auth.storage | localStorage dans un navigateur, mémoire ailleurs | Où vit la session : passez votre propre boutique (cookies pour SSR) |
auth.autoRefresh | true | Actualisez le jeton d'accès avant son expiration et gardez les onglets synchronisés |
auth.detectSessionInUrl | true dans un navigateur | Lire une session à partir de l'URL après une redirection OAuth, puis nettoyer l'URL |
fetch | globalThis.fetch | Votre propre fetch, pour les tests ou les proxys |
retry | true | Réessayez de lire les erreurs passagères. false désactive, ou { enabled, maxRetries } |
requestTimeoutMs | 30000 | Délai d'une demande. 0 le désactive. |
onEvent | aucun | Reçoit les événements d'observabilité, voir ci-dessous |
debug | false | Imprimez également chaque événement avec console.debug('[aurabase]', event) |
refuseServiceRoleInBrowser | true | Lancer lorsqu'une clé service_role atteint un navigateur |
Pour le rendu côté serveur, utilisez les clients basés sur les cookies décrits dans Next.js App Router et SSR.
3. L'objet d'erreur
Chaque appel renvoie { data, error } et ne lance jamais. En cas d'échec, error est un AuraError:
Un véritable appel échoué est revenu :
| Champ | Signification |
|---|---|
status | Le statut HTTP. 0 signifie que la panne s'est produite avant toute réponse : réseau, timeout ou refus du client. |
code | Un identifiant stable. Les codes serveur gardent leur valeur ; le client ajoute les codes ci-dessous. |
message | Une explication lisible |
details | Le corps de réponse brut |
retryAfter | Secondes à attendre, à partir d'un en-tête Retry-After, sur un 429 |
isNotFound, isUnauthorized, isForbidden, isRateLimited | Raccourcis sur status |
Codes produits par le client lui-même (statut 0) : timeout, network_error, invalid_response (un succès dont le corps n'est pas JSON), no_session, refresh_discarded, invalid_path, invalid_body. L'authentification ajoute des codes tels que invalid_credentials, weak_password, email_already_in_use, user_not_found, invalid_otp, session_expired, session_revoked et rate_limit_exceeded. Un 429 porte toujours rate_limit_exceeded.
Testez data plutôt que error lorsque vous avez besoin de la valeur. Certains appels réussissent sans contenu (204), puis data et error sont null.
4. Nouvelles tentatives et délais d'attente
Nouvelles tentatives. Le client réessaye automatiquement une demande uniquement lorsque tous ces éléments sont satisfaits :
- la méthode est
GETouHEAD(unPOST,PUT,PATCHouDELETEn'est jamais relu, donc rien ne s'exécute deux fois) ; - l'état de la réponse est
408,429,502,503ou504, ou le réseau est en panne ; - moins de 3 tentatives ont eu lieu.
Le délai est aléatoire entre 0 et min(500 ms × 2^attempt, 10 s). Un en-tête Retry-After l'emporte, plafonné à 60 secondes. Les requêtes réessayées portent un en-tête X-Retry-Count. Un délai d'attente n'est pas retenté.
Mesuré par rapport à un serveur qui a répondu deux fois à 503, puis à 200:
Délais d'attente. Une requête qui n'obtient aucune réponse dans un délai de requestTimeoutMs (30 s par défaut) se termine par status: 0 et code: 'timeout'. La lecture du corps est limitée par la même limite, donc un serveur qui envoie des en-têtes puis bloque ne peut pas raccrocher l'appel. Une requête adressée à un serveur qui n'a jamais répondu, avec une limite de 400 ms, a renvoyé l'erreur au bout de 405 ms.
Deux cas n'utilisent pas cette limite car ils gèrent le leur : un appel où l'on passe un AbortSignal, et des uploads. Les fonctions utilisent leur propre option timeout, voir Erreurs, délais d'attente et tentatives.
5. Observez le client
onEvent reçoit un événement pour chaque action notable effectuée par le client. Cela ne fait jamais échouer une requête : une exception levée par votre hook est ignorée.
kind | Champs | Quand |
|---|---|---|
retry | attempt, status?, url | Avant une nouvelle tentative |
timeout | url | Une requête a atteint requestTimeoutMs |
refresh-success | aucun | Une actualisation de session a réussi |
refresh-discarded | reason | Une actualisation a été abandonnée car la session a changé entre-temps |
jwks-fetch-failed | baseUrl | Les clés de signature n'ont pas pu être récupérées (vérifications de jetons locaux) |
storage-blocked | op | Le navigateur a refusé l'accès au stockage |
Les URL dans les événements voient leur chaîne de requête et leur fragment supprimés, car ils peuvent contenir des secrets (?apikey=, liens signés).
6. Sessions et jetons
- Le client envoie
apikeyà chaque demande etAuthorization: Bearer <access token>une fois qu'un utilisateur est connecté. - Il actualise le jeton d'accès lorsqu'il reste moins de 30 secondes. Les actualisations simultanées sont fusionnées en une seule, de sorte qu'un jeton d'actualisation rotatif est utilisé une seule fois.
- Un
401déclenche une actualisation et une relecture de la requête, puis s'arrête. - Dans un navigateur, les actualisations sont coordonnées entre les onglets.
aura.auth.onAuthStateChange(callback)vous parle deSIGNED_IN,SIGNED_OUT,TOKEN_REFRESHED,USER_UPDATEDetMFA_CHALLENGE. Voir le guide d'authentification.