Skip to content

SRD — transport unique et deux façades

Publié sur le site VitePress sous /srd/architecture. Les diagrammes Mermaid sont rendus via le plugin VitePress.

Objectif

Une couche transport partagée dans @franksauvag/rpg-commons/srd et deux façades consommant la même donnée JSON exposée par l’API PHP :

  1. Façade bundlescreateSrdClient + build*Bundle : adaptateurs TypeScript côté client.
  2. Façade entréescreateSrdEntryListClient : bulk par typeId, overlay /api/locales/{lang}/srd/{typeId}, merge dans editor, lignes triées par index.

Transport partagé

  • fetchJsonWithRetry (src/srd/http/fetch.ts) : GET JSON, timeout, retry sur 429/502/503, backoff, corps parsé en unknown.
  • SrdHttpError : erreur réseau / HTTP homogène.
  • URLs (src/srd/http/config.ts) : buildSrdDatasetUrl, buildSrdMetaUrl, buildLocaleSrdUrl — uniquement à partir de apiBaseUrl injecté (pas d’import.meta.env dans la lib).

createSrdClient et createSrdEntryListClient utilisent ce transport en interne (dédup « en vol » par dataset / par couple locale+dataset pour les overlays).

Façade entrées (détail)

Consommateur (character-creator-studio)

Depuis 2.0 : srdRuntime (src/srd/runtime.ts) encapsule createSrdRuntime — bundles, loadTypeEntries, stats, preload. Candlekeep : src/library/registry/. Types SrdEntryRow / overlays depuis @franksauvag/rpg-commons/srd.

Chaîne de responsabilité (résumé)

CoucheRôle
ServeurJSON (bulk, meta, stats, locales).
fetchJsonWithRetryFetch + retry + parse.
Façade bundlesadapters / bundleBuilders.
Façade entréescreateSrdEntryListClient + mergeLocaleOverlayRows.
AppsUI ; instance runtime dans la lib (cache + preload) — pas de second cache SRD côté app. CCS (2.0) : src/srd/runtime.ts (srdRuntime).

Cible : runtime SRD (cache + preload, cadrage 2026)

Statut : implémenté en 2.0.0createSrdRuntime dans @franksauvag/rpg-commons/srd. Voir SRD overview et le CHANGELOG.
Implémentation : livrée en 2.0.0 — voir overview, migration, CHANGELOG. Reliquats et audits : audit-2026-05.md (interne).

Objectif

  • Offrir une seule couche de mémoïsation valeur + promesse pour tout le périmètre SRD lecture géré par la lib, en s’appuyant sur les deux façades existantes (bundles + index / entrées).
  • Permettre un preload à l’initialisation sans charger par défaut tout le catalogue : l’app déclare ce dont elle a besoin (bundles lourds et/ou listes typeId + lang pour la façade entrées).

Principes

  1. Framework-agnostic : pas de import.meta.env ; pas de @tanstack/react-query dans le cœur du runtime (l’app peut utiliser Query pour le hors-SRD ou en queryFn qui délègue au runtime sans conserver une seconde copie des données SRD).
  2. Preload déclaratif : à l’init, config explicite — par exemple listes preloadBundles, preloadTypeEntries: { typeId, lang }[], et éventuellement profils nommés (character-editor, candlekeep-library, …) documentés dans la lib. Défaut : sobre (vide ou minimal) pour éviter le sur-coût réseau.
  3. Pas de double cache : l’app ne combine pas loadResource / autre Map / useQuery avec mémo concurrente pour les mêmes clés SRD ; migration CCS = supprimer ces chemins au profit du runtime.
  4. Un seul chemin HTTP interne : le runtime réutilise ou encapsule createSrdClient / createSrdEntryListClient (ou une couche unique) pour éviter deux dédup inflight sur le même GET.
  5. Changement de langue : l’API du runtime expose une stratégie documentée (setLocale, invalidation des clés dépendantes, etc.) — détail d’implémentation à livrer avec le code.

Documentation obligatoire (lib)

  • Ce fichier (docs/srd-facades.md) : section cible + lien depuis le backlog unifié.
  • À la livraison : overview, CHANGELOG.md, page /srd/architecture si les diagrammes évoluent.

Politique des clés de cache (consommateurs)

Référence actuelle : character-creator-studio (src/data/srd/cache.ts + appelants). Cible : ces clés migrent dans le runtime de la lib (section Cible : runtime SRD ci-dessous) ; le CCS ne conserve pas un second magasin pour le même périmètre.

Principe

  • Un seul magasin : toute mémoïsation « promesse + valeur » des chargements SRD côté app passe par loadResource / peekResource (une Map unique). Ne pas ajouter un second cache parallèle (autre Map, WeakMap globale, singleton ad hoc) pour le même périmètre HTTP sans mettre à jour ce document.

Préfixes documentés (CCS)

Préfixe / motifUsage
{dataset}:v2Bundles éditeur lourds (classes, spells, …) — voir src/data/srd/lazy/index.ts.
srd:type:{typeId}:{lang}Lignes entrées Candlekeep — loadSrdTypeEntriesCached ; loadType dans src/srd/loader.ts délègue directement à cette clé (plus de couche srd:bundle).
srd:translation-stats:{lang}Réponse translation-stats par langue.
srd:meta:localesListe des locales issues de /api/srd/meta.

Rôle de la lib (complémentaire, pas redondant)

createSrdClient et createSrdEntryListClient dédupliquent les requêtes en vol par dataset / couple (locale, dataset) à l’intérieur du client : ce n’est pas un second cache applicatif ; les apps gardent loadResource pour la durée de vie session / onglet — jusqu’à adoption du runtime unifié, qui remplace ce rôle pour le SRD.

Diagrammes (Mermaid)

Modèles côté serveur (HTTP)

Façade bundles (createSrdClient)

Façade entrées (createSrdEntryListClient)

Chaîne complète (acteurs)

Maintenir les diagrammes (DOC7)

  1. Source unique : éditer uniquement docs/srd-facades.md (section « Diagrammes (Mermaid) ») — pas de copie divergente ailleurs.
  2. Quand mettre à jour : changement d’URL ou de flux dans src/srd/ (transport, entryList, client, adaptateurs, runtime une fois livré) ; évolution du contrat OpenAPI / PHP qui change le sens des flèches.
  3. Valider la syntaxe : aperçu sur GitHub, ou mermaid.live en collant le bloc ; respecter la règle IDs de nœuds sans espaces (voir section « Diagrammes » ci-dessus).
  4. Mini-site : après modification, cd website && pnpm build (ou pnpm run build:website à la racine du dépôt si Storybook + site). Vérifier /docs/srd-facades en pnpm dev.
  5. Implémentation : le rendu Mermaid est géré par le plugin VitePress (vitepress-plugin-mermaid) ; conserver les blocs ```mermaid dans ce fichier.

Liens