Aller au contenu

Erreurs

Afficher en Markdown
import { VimineError } from '@vimine/sdk'; // aussi depuis /server

Tout ce qui tourne mal arrive sous forme de VimineError, une sous-classe de Error. code est l’identifiant stable sur lequel brancher votre logique : le code d’un document problem+json (RFC 9457), l’error d’une réponse OAuth, ou l’un des codes propres au SDK.

Type
code string le code stable
message string le detail ou le title du problème, ou error_description
status number | null le statut HTTP, null pour les erreurs locales
requestId string | null le request_id de la réponse : citez-le dans vos signalements
detail string | null le detail du problème
errors FieldError[] — { field?, code?, message? } les détails de validation_failed et de identification_required ; une entrée codicefiscale_mismatch porte aussi mismatches, hints et confirmable (guide)
cause unknown l’erreur sous-jacente (network, framed)
isAuthError boolean true pour « la session n’existe plus : reconnectez-vous » (401, invalid_token, token_expired, missing_token, invalid_grant, not_signed_in)
code Quand
invalid_options constructeur sans clientId, redirectUri ou clientSecret
network la requête n’a pas atteint l’API (cause porte l’erreur d’origine)
not_signed_in pas de session, ou pas de jeton de rafraîchissement, pour un appel authentifié
no_flow un retour sans connexion lancée depuis ce navigateur (stockage vide ou expiré)
state_mismatch le retour ne correspond pas à la connexion qui a été lancée
framed signIn() depuis un cadre d’une autre origine
http_<status> une réponse d’erreur sans corps JSON reconnaissable

Les codes de l’API (insufficient_scope, not_found, validation_failed, statuto_required, rate_limited, …) et ceux d’OAuth (invalid_grant, access_denied, unauthorized_client, …) se trouvent dans Autorisations, erreurs et limites.

import { VimineError } from '@vimine/sdk';
try {
await vimine.membership.acceptStatuto({ version });
} catch (err) {
if (!(err instanceof VimineError)) throw err;
if (err.isAuthError) return vimine.signIn({ returnTo: location.pathname });
switch (err.code) {
case 'statuto_outdated': return alert(`Une version plus récente est en vigueur : ${err.detail}`);
case 'insufficient_scope': return vimine.signIn({ scopes: ['statuto:accept'], prompt: 'consent' });
case 'rate_limited': return setTimeout(retry, 5000);
default: console.error(err.code, err.requestId);
}
}