Tuto 5 : faire évoluer un contrat
D'abord par révision (ajouter color), puis par version (regrouper dans style) avec un upcastFrom déclaratif. Trois émetteurs et deux abonnés cohabitent, et le broker sert chacun dans sa forme.
Fondé sur : évolution des contrats. Projet : tutos/projets/evolution.
Révision 1 : ajouter color
Snapshot complet, jamais un diff. Le champ ajouté est
requiredavec undefault: le défaut sert à compléter les émetteurs en retard, jamais à excuser un émetteur de la révision 1 qui l'omettrait.Version 2 : regrouper dans style
Déplacer un champ casse le contrat : on grave une version. L'upcaster est un vocabulaire fermé,
rename,defaults,remove, interprété par le moteur, pas du code. Le.est le séparateur de chemin.Des émetteurs à chaque révision, des abonnés à chaque version
Un émetteur déclare la révision qu'il produit ; omise, c'est la courante. Un abonné ne déclare jamais de révision.
Observer
Ouvrez le projet et cliquez les quatre boutons. Ce que chaque abonné reçoit s'affiche à côté du texte :
émission reçu par l'abonné v1 reçu par l'abonné v2 v1 r0 { text, ref }{ text, ref, color: "black" }complété{ text, ref, style: { color: "black", font-size: "16px", font-weight: "normal" } }chaînév1 r1 { text, ref, color: "red" }tel quel style.color: "red", le reste pardefaultsv1 r1 sans color rejeté à l'émission : color: requiredv2 sauté : pas de downcast, signalé en console tel quel AUDIT (revision_gap): text_posted: board_r0 emits v1 r0 while the current revision is r1 — subscribers receive the completed r1 form AUDIT (version_gap): text_posted: board_r0 emits v1, box_v2 expects v2 — bridged by the catalog upcasters, delivery unaffected AUDIT (version_gap): text_posted: board_v2 emits v2, box_v1 expects v1 — downcast unsupported, they will never meet ERROR (broker): text_posted v1 r1 from board_r1 invalid — dropped: - color: required ERROR (broker): text_posted: no upcast path v2 -> v1, box_v1 skipped
Client→serveur : un client en retard passe, le serveur upcaste. Graver une révision côté serveur n'éjecte aucun client. Serveur→client : le client doit être au moins aussi à jour, sinon refus propre au handshake. Détail.