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.

  1. Révision 1 : ajouter color

    Snapshot complet, jamais un diff. Le champ ajouté est required avec un default : le défaut sert à compléter les émetteurs en retard, jamais à excuser un émetteur de la révision 1 qui l'omettrait.

  2. 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.

  3. 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.

  4. Observer

    Ouvrez le projet et cliquez les quatre boutons. Ce que chaque abonné reçoit s'affiche à côté du texte :

    émissionreçu par l'abonné v1reç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 quelstyle.color: "red", le reste par defaults
    v1 r1 sans colorrejeté à l'émission : color: required
    v2sauté : pas de downcast, signalé en consoletel 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
v1 r0{ text, ref } v1 r1 (canonique v1){ text, ref, color } v2 r0{ text, ref, style{…} } default : color = "black" upcastFrom : rename, defaults Toujours vers l'avant. Gouvernance : les abonnés d'abord, l'émetteur en dernier.
La chaîne d'upcast : révision 0 vers 1 par les défauts, puis version 1 vers 2 par l'upcaster déclaratif.
À travers un canal

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.