Index des routes
Le fichier
L'index est le fichier routes/index.json du dépôt : du JSON simple, lisible depuis n'importe quel langage. Une entrée ressemble à ceci :
{
"method": "PATCH",
"path": "/channels/{channel_id}",
"name": "Update channel",
"source": "discord",
"auth": ["bot"],
"major": "channel_id",
"global": true,
"model": "unknown",
"coverage": "exercised",
"notes": ["Changing a channel's name or topic sits behind a sub-limit of its own, ..."]
}
major: le paramètre qui donne à chaque valeur son propre compteur :channel_id,guild_id,webhook_idouwebhook_id+webhook_token. Vide quand tous les appels partagent un seul compteur.global:falsepour les routes exemptées de la limite globale du bot.model:token_bucket,fixed_window, ouunknowntant qu'aucune série ne l'a observé.family: les routes que Discord compte ensemble, dans un seul bucket.source:discordpour la spécification OpenAPI de Discord,userdoccerspour les routes documentées seulement par Discord Userdoccers, commePOST /guilds/{guild_id}/members-search.coverage: si le moteur exerce la route, et sinon pourquoi (dansnotes).notes: les sous-limites et autres cas particuliers.
Depuis Go
Le paquet routes associe une requête à sa route :
import "github.com/FCAgreatgoals/bucketmap/routes"
r, ok := routes.Match("PATCH", "/api/v10/channels/123/messages/456")
// r.Path "/channels/{channel_id}/messages/{message_id}"
// r.MajorValue(path) "123"
Sa documentation est sur pkg.go.dev.
Deux façons de se recharger
X-RateLimit-Reset-After donne le temps restant avant que le bucket soit de nouveau plein, ce qui veut dire deux choses différentes selon le bucket :
- Fenêtre fixe (
fixed_window) : le bucket se recharge d'un coup, à la fin de la fenêtre. D'une requête à l'autre,maintenant + Reset-Afterne bouge pas, etReset-Afterdiminue à mesure que le bucket se vide. - Seau à jetons (
token_bucket) : le bucket se recharge une requête à la fois. D'une requête à l'autre,maintenant + Reset-Afteravance d'une requête, etReset-Afteraugmente à mesure que le bucket se vide.
Deux requêtes consécutives sur le même bucket suffisent pour les distinguer, bien en dessous de toute limite. Le moteur envoie exprès quelques paires de ce genre.
Garder l'index à jour
Le workflow index du dépôt reconstruit l'index chaque semaine à partir des sources les plus récentes, et échoue quand elles décrivent une route que l'index ne connaît pas encore. Pour le reconstruire à la main :
git clone --depth 1 https://github.com/discord/discord-api-spec /tmp/spec
git clone --depth 1 https://github.com/discord-userdoccers/discord-userdoccers /tmp/userdoccers
bucketmap index -spec /tmp/spec/specs/openapi.json -userdoccers /tmp/userdoccers/pages
Options de bucketmap index : -spec (le fichier openapi.json de Discord), -userdoccers (le dossier pages de Discord Userdoccers), -annotations (par défaut routes/annotations.json) et -out (par défaut routes/index.json).
Ce que les sources ne disent pas vit dans routes/annotations.json : les modèles de bucket, les familles, les notes, et la raison pour laquelle une route est écartée. Le build échoue sur toute route qui n'est ni exercée ni expliquée.