From cdddeee4ea97fd870a7801b8e71f272b57bce9bb Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 4 Nov 2026 12:04:20 +0100 Subject: [PATCH] CAT-N3: the events' body in the field names of the seat mesh-broker's message said module, local-name, storage-type, template, options, configuration, bus-name, asked, held, fill, snapshot and why as the seat's definition in mesh-contracts names them, so taking its generated type changes no byte; binding (a ledger's several names) and revision (the indexer's, of the verdict acted on) beside, asked of the definition. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig --- modules/nats/internal/keeper/keeper.go | 46 ++++++++++++++------- modules/nats/internal/keeper/keeper_test.go | 7 ++++ 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/modules/nats/internal/keeper/keeper.go b/modules/nats/internal/keeper/keeper.go index cc38e5c1..ac3fc53e 100644 --- a/modules/nats/internal/keeper/keeper.go +++ b/modules/nats/internal/keeper/keeper.go @@ -41,22 +41,37 @@ const ( EventDropped = "dropped" ) -// Event is the body of every bus module event: the entry, its binding (the names on the bus), the settings asked and -// held by bus object, why (refused, drifted), and the indexer's revision of the verdict it acted on. +// Event is the body of every bus module event, in the field names of the seat mesh-broker's definition (its message +// `said`, mesh-contracts go/seats/meshbroker Said): the entry (module, local name, storage type, template, options, +// configuration), its bus name, the settings asked and held by bus object, its fill, the snapshot a recreate or drop +// took, and why (refused, drifted). Beside the definition's fields: binding, the names a module receives (a ledger's +// history, state, indexes and snapshot, which one bus name cannot carry), and revision, the indexer's revision of the +// verdict it acted on; both asked of the definition. // -// Written here until mesh-contracts holds the generated type of the seat mesh-broker's definition (ADR 0613 ยง1); the -// field names are that definition's. +// Written here until this module takes mesh-contracts' generated type; the swap changes no byte of the body. type Event struct { - V int `json:"v"` - Module string `json:"module"` - Local string `json:"local"` - Storage string `json:"storage"` - Template string `json:"template,omitempty"` - Binding membership.BusBinding `json:"binding"` - Asked map[string]Settings `json:"asked,omitempty"` - Held map[string]Settings `json:"held,omitempty"` - Why string `json:"why,omitempty"` - Revision uint64 `json:"revision"` + V int `json:"v"` + Module string `json:"module"` + Local string `json:"local-name"` + Storage string `json:"storage-type,omitempty"` + Template string `json:"template,omitempty"` + Options map[string]json.RawMessage `json:"options,omitempty"` + Configuration map[string]json.RawMessage `json:"configuration,omitempty"` + BusName string `json:"bus-name"` + Binding membership.BusBinding `json:"binding"` + Asked map[string]Settings `json:"asked,omitempty"` + Held map[string]Settings `json:"held,omitempty"` + Fill *EventFill `json:"fill,omitempty"` + Snapshot string `json:"snapshot,omitempty"` + Why string `json:"why,omitempty"` + Revision uint64 `json:"revision"` +} + +// EventFill is an entry's fill as an event says it: its messages, its bytes and its cap. +type EventFill struct { + Count uint64 `json:"count"` + Bytes uint64 `json:"bytes"` + Cap int64 `json:"cap"` } // Accepted is a manifest-accepted the keeper heard, or a module of its first view: the module, its manifest's digest, @@ -538,7 +553,8 @@ func (k *Keeper) emit(event string, p Plan, revision uint64, why string, asked, if k.Emit == nil { return } - body := Event{V: 1, Module: p.Module, Local: p.Local, Storage: p.Storage, Template: p.Template, Binding: p.Binding, + body := Event{V: 1, Module: p.Module, Local: p.Local, Storage: p.Storage, Template: p.Template, Options: p.Entry.Options, + Configuration: p.Entry.Configuration, BusName: BusName(p.Module, p.Local), Binding: p.Binding, Asked: asked, Held: held, Why: why, Revision: revision} if event == EventDropped { // A dropped entry's names only: the binding to remove. diff --git a/modules/nats/internal/keeper/keeper_test.go b/modules/nats/internal/keeper/keeper_test.go index f26ee953..0453ea43 100644 --- a/modules/nats/internal/keeper/keeper_test.go +++ b/modules/nats/internal/keeper/keeper_test.go @@ -291,6 +291,13 @@ func TestTheKeeperMakesWhatAVerdictAsksForAndSaysIt(t *testing.T) { if b := out.bodies[1]; b.Binding.Stream != "m_log" || b.Binding.Subject != "mesh.bus.m.log" || b.Revision != 3 || b.Asked["m_log"].MaxBytes == 0 { t.Errorf("created carries %+v: the binding, the revision and the settings asked", b) } + // In the field names of the seat mesh-broker's message said (mesh-contracts), beside binding and revision. + raw, _ := json.Marshal(out.bodies[1]) + for _, w := range []string{`"module":"m"`, `"local-name":"log"`, `"storage-type":"stream"`, `"template":"log"`, `"bus-name":"m_log"`, `"binding":{`, `"revision":3`} { + if !strings.Contains(string(raw), w) { + t.Errorf("the body %s lacks %s", raw, w) + } + } }}, {"a replay not newer is not applied", func(t *testing.T, k *Keeper, bus *fakeBus, out *said) { k.Heard(Accepted{Module: "m", Digest: "d2", Revision: 9, BusState: []catalogue.BusStateEntry{drafts}})