Mise à niveau vers le SDK 0.6 et les nouvelles règles de fonctions
Une liste de contrôle pour les projets qui appellent Edge Functions à partir du SDK JavaScript, avec les secrets dont vous pourriez avoir besoin pour effectuer une rotation.
1. Ce qui a changé
Installez la nouvelle version :
La version comporte un changement de sécurité et plusieurs correctifs concernant la façon dont les erreurs et les réponses sont signalées. Le changement de sécurité se trouve également dans les fonctions du service: il s'applique à votre projet dès la mise à jour du service, quelle que soit la version du SDK que vous utilisez.
2. Briser les changements
Les appels de gestion nécessitent désormais une clé service_role
functions.list(), get(), listJobs(), getJob(), enqueueJob(), listCronJobs(), createCronJob() et deleteCronJob() renvoient 403 à une clé publique ou à un utilisateur connecté. Avant, list() et get() renvoyaient le code source et les variables de chaque fonction à toute personne détenant la clé publique. Voir le modèle de sécurité.
Renvoyez uniquement ce dont votre front-end a besoin (les noms, par exemple), jamais la définition complète.
Un corps qui ne peut pas être JSON est refusé
invoke(name, { body: new Blob(…) }), et pareil avec ArrayBuffer, tableaux typés, FormData, URLSearchParams ou ReadableStream, renvoie désormais le code d'erreur invalid_body. Avant, la fonction recevait {} et aucune erreur n'était signalée. Encodez les données binaires (base64) ou téléchargez-les sur Storage et envoyez leur chemin.
Le 502, 503 ou 504 d'une fonction est un FunctionsHttpError
Avant, ces statuts étaient toujours classés comme FunctionsRelayError, même lorsque votre code les renvoyait. Désormais, FunctionsRelayError signifie que la plate-forme a échoué. Si vous avez réessayé sur FunctionsRelayError, vérifiez que votre logique de nouvelle tentative correspond toujours : voir erreurs, délais d'attente et nouvelles tentatives.
FunctionDef est plus précis
env_vars est Record<string, string> (c'était Record<string, unknown>) et permissions est ajouté. Le code qui lit ces champs continue de fonctionner ; le code qui attribuait des valeurs d’un autre type ne se compile plus.
3. Corrections de comportement
| Avant | Maintenant |
|---|---|
Une fonction renvoyant 500 avec du texte a produit le message "null" | Le message est le texte renvoyé par votre fonction |
Une fonction renvoyant 200 avec le texte produit { data: null, error: null } | data est le texte |
Une réponse binaire en mode par défaut a produit { data: null, error: null } | error.code est invalid_response et le message suggère responseType |
responseType: 'text' avec une erreur JSON { "error": "…" } a montré HTTP 503 | Le message est lu depuis le JSON, comme dans le mode par défaut |
'text', 'blob' et 'arrayBuffer' n'avaient pas de délai d'expiration par défaut | Le délai d'attente client (30 s) s'applique |
| Un nom de fonction a été inséré dans l'URL non codé | Il est codé : a/../b reste à l'intérieur de son chemin |
delaySecs sur une tâche a été ignoré : la tâche a été exécutée immédiatement | Le travail attend sa date |
Nouveaux exports : FunctionsHttpError, FunctionsRelayError, isRelayStatus et FunctionsResponseType proviennent de @aurabase/aurabase-js ainsi que de @aurabase/functions. Si vous les avez importés depuis @aurabase/functions, cela continue de fonctionner ; avec pnpm, vous n'avez plus besoin de ce package en tant que dépendance directe.
Dans @aurabase/auth, le type de email dans le résultat de getClaims() est désormais string | null, ce que le service renvoie pour un utilisateur sans adresse e-mail.
CLI. aura functions deploy n'efface plus les secrets d'une fonction déjà existante. aura functions invoke --data refuse le JSON invalide au lieu d'envoyer {}. aura functions download fonctionne pour les fonctions Deno. aura functions serve écoute sur le port qu'il annonce. aura studio ouvre le Studio sur le port 3000.
4. Faites pivoter les secrets exposés
Si votre projet fonctionnait sur une version de service antérieure à ce changement, tout détenteur de votre clé publique pourrait lire le code et les variables de vos fonctions. Supposons qu'ils aient été lus :
- Listez vos fonctions avec une clé
service_roleet ouvrez les variables de chacune. - Faites pivoter tous les secrets qu'ils contiennent : clés de paiement, secrets de webhook, jetons tiers.
- Supprimez les secrets écrits directement dans
index.tset déplacez-les vers des variables. - Vérifiez les tâches et les règles d'alerte du projet pour les entrées que vous n'avez pas créées.
5. Liste de contrôle
- Recherchez votre code pour
functions.list(,functions.get(,listJobs(,getJob(,enqueueJob(,createCronJob(,deleteCronJob(etlistCronJobs(dans un code qui s'exécute dans un navigateur ou avec une clé publique. - Recherchez les valeurs
body:qui ne sont pas du JSON simple. - Vérifiez la logique de nouvelle tentative qui dépend de
FunctionsRelayError. - Faites pivoter les secrets comme décrit ci-dessus.
- Mettez à jour la CLI.