Message et contrat

Gabarit de chaque page de référence : la règle, pourquoi elle existe, l'exemple tiré du chat, le contre-exemple et ce que le broker dit alors.

La règle

Un message est une enveloppe à clé unique { nom: { payload } }. Le payload est de la donnée JSON pure, et tout champ est déclaré au catalogue. Deux clés d'enveloppe sont réservées au framework, id et session : jamais dans un payload ni au catalogue.

Pourquoi

Un message doit se comporter à l'identique livré localement (copie structuredClone) ou à travers un canal (JSON.stringify). Une Date, une instance, une fonction ne survivent pas au second. Et si un champ non déclaré pouvait passer, le catalogue ne décrirait plus rien.

Dans le chat

La date est une string ISO, contrainte par un pattern dans le contrat de message_poste.

Contre-exemple

this.broker.publish(this, { message_demande: { ref, texte, auteur: "alice" } });
ERROR (broker): message_demande v1 r0 from ecran_fil invalid — dropped: - auteur: field not declared in catalog (R1)

JSON pur

Cinq types : string, number (fini), boolean, object, array. Pour une date : un timestamp number ou une string ISO. Pour un handle (socket, pool) : jamais en message, au constructeur.

Révision, version, émetteur, abonné

Le broker est strict

ERROR (broker): acces_demande v2 is not in the catalog ERROR (broker): registration of ecran_connexion rejected as a whole — nothing registered (see errors above)

Plusieurs clés dans une enveloppe

Le broker tolère plusieurs noms dans une enveloppe : chacun est validé et livré indépendamment, dans l'ordre de déclaration, sans atomicité. Qui veut un tout-ou-rien fait un seul message à payload composite.

Examples et counterexamples

Ils prouvent le contrat. examples: { version: { révision: [payload, …] } } doivent valider ; counterexamples, entrées { reason, payload }, doivent être rejetés. test_engine.js les rejoue. Écrivez-les.