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 :
- Façade bundles —
createSrdClient+build*Bundle: adaptateurs TypeScript côté client. - Façade entrées —
createSrdEntryListClient: bulk partypeId, overlay/api/locales/{lang}/srd/{typeId}, merge danseditor, lignes triées parindex.
Transport partagé
fetchJsonWithRetry(src/srd/http/fetch.ts) :GETJSON, timeout, retry sur 429/502/503, backoff, corps parsé enunknown.SrdHttpError: erreur réseau / HTTP homogène.- URLs (
src/srd/http/config.ts) :buildSrdDatasetUrl,buildSrdMetaUrl,buildLocaleSrdUrl— uniquement à partir deapiBaseUrlinjecté (pas d’import.meta.envdans 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)
mergeLocaleOverlayRows(src/srd/i18n/mergeLocaleOverlays.ts) : fusion des champs d’overlay (horsindex) danseditorpour chaque ligne source.SrdEntryRow/SrdEditorOverlay(src/srd/types/entry.ts) : contrat minimal pour les listes type Candlekeep.createSrdEntryListClient(config)(src/srd/client/entryListClient.ts) :loadTypeEntries(typeId, lang)— silang === "en", pas d’appel locale ; sinon fetch overlay puis merge.
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é)
| Couche | Rôle |
|---|---|
| Serveur | JSON (bulk, meta, stats, locales). |
fetchJsonWithRetry | Fetch + retry + parse. |
| Façade bundles | adapters / bundleBuilders. |
| Façade entrées | createSrdEntryListClient + mergeLocaleOverlayRows. |
| Apps | UI ; 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.0 —
createSrdRuntimedans@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+langpour la façade entrées).
Principes
- Framework-agnostic : pas de
import.meta.env; pas de@tanstack/react-querydans le cœur du runtime (l’app peut utiliser Query pour le hors-SRD ou enqueryFnqui délègue au runtime sans conserver une seconde copie des données SRD). - 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. - Pas de double cache : l’app ne combine pas
loadResource/ autreMap/useQueryavec mémo concurrente pour les mêmes clés SRD ; migration CCS = supprimer ces chemins au profit du runtime. - 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êmeGET. - 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/architecturesi 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(uneMapunique). Ne pas ajouter un second cache parallèle (autreMap,WeakMapglobale, singleton ad hoc) pour le même périmètre HTTP sans mettre à jour ce document.
Préfixes documentés (CCS)
| Préfixe / motif | Usage |
|---|---|
{dataset}:v2 | Bundles é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:locales | Liste 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)
- Source unique : éditer uniquement
docs/srd-facades.md(section « Diagrammes (Mermaid) ») — pas de copie divergente ailleurs. - 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. - 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).
- Mini-site : après modification,
cd website && pnpm build(oupnpm run build:websiteà la racine du dépôt si Storybook + site). Vérifier/docs/srd-facadesenpnpm dev. - Implémentation : le rendu Mermaid est géré par le plugin VitePress (
vitepress-plugin-mermaid) ; conserver les blocs```mermaiddans ce fichier.
Liens
- audit-2026-05.md — reliquats post-2.0 (données, composants, normalizers).
- CCS backlog post-commons (repo séparé) — suite CCS.
- overview — usage
createSrdRuntimeet clients bas niveau. - CHANGELOG.md — livraisons Phase 1 (lots D, DOC, etc.).