Serve a key's kept values so the issue tracker can carry them into its log (ADR 0307, issue 502)
mesh/delivery-group group adr-0307-state-history delivered: every member is delivered
mesh/delivery delivered
mesh/merge-gate pass: builds mesh-tools, node-tools → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 of …
mesh/repo-check pass: THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): main's version judged it; the change's judges the pull requests after it merges; it…

mesh/state.history answers every value a bucket still keeps for a key,
oldest first, to whoever may get it, by the same watch the runtime already
uses, so no new grant is needed.
This commit is contained in:
jochen
2026-10-12 10:18:34 +02:00
parent 4348b42844
commit 3f0c1a6cec
6 changed files with 219 additions and 5 deletions
+9 -2
View File
@@ -614,8 +614,8 @@ type stateAsked struct {
Revision uint64 `json:"revision"`
}
// State answers a bundle's `get`, `put`, `delete` and `keys` on its module's state (ADR 0201). The
// runtime refuses, with the reason, a state the module was not issued and a write to one it only reads.
// State answers a bundle's `get`, `put`, `delete`, `keys`, `create`, `update` and `history` on its
// module's state (ADR 0201, ADR 0259, ADR 0307). The runtime refuses, with the reason, a state the module was not issued and a write to one it only reads.
func (b *moduleBus) State(verb string, params json.RawMessage) (json.RawMessage, error) {
var asked stateAsked
if err := json.Unmarshal(params, &asked); err != nil || asked.State == "" {
@@ -633,6 +633,13 @@ func (b *moduleBus) State(verb string, params json.RawMessage) (json.RawMessage,
return json.RawMessage("null"), nil
}
answer = entry
case "history":
// Every value the bucket still keeps for the key, oldest first (novox/hq ADR 0307).
kept, err := conn.StateHistory(b.module, asked.State, asked.Key)
if err != nil {
return nil, err
}
answer = kept
case "put":
revision, err := conn.StatePut(b.module, asked.State, asked.Key, asked.Value)
if err != nil {