Publish a module's ledger history and snapshots only on its own ledger connection, read from the runner's own secret ledgers and followed without a restart (issue 1966 T6)

This commit is contained in:
2026-11-03 13:51:47 +01:00
parent 38a634723b
commit 2bb0a6461d
6 changed files with 323 additions and 7 deletions
+18 -2
View File
@@ -61,7 +61,7 @@ const NodeRuntimeModule = "node-tools"
// runtimeOnly are the words of the runtime's own environment no bundle is given.
var runtimeOnly = map[string]bool{ToolEnv: true, ToolModules: true, "MESH_BROKER_FILE": true,
"MESH_BROKER_URL": true, "MESH_CONSOLE_LISTEN": true}
"MESH_BROKER_URL": true, "MESH_CONSOLE_LISTEN": true, LedgersFile: true}
// ServedModulesFrom reads MESH_TOOL_MODULES: `<module>=<entrypoint>` entries, comma-separated, several
// per module. The one-module form — a bare path, or the runtime's own module — is the per-module
@@ -234,9 +234,22 @@ type runner struct {
stops []func() // the watch, the announcement and the seats, in the order they began
}
// Option sets how Run serves, beside what it is given.
type Option func(*consumers)
// WithLedgerWriters gives the runtime the connection each module's ledger history is published on (ledger_credentials.go).
func WithLedgerWriters(writer func(module string) (*bus.Conn, error)) Option {
return func(c *consumers) { c.ledgers.writer = writer }
}
// WithLedgerTypes gives the runtime where it reads a ledger's types (ledgers.go).
func WithLedgerTypes(types LedgerTypes) Option {
return func(c *consumers) { c.ledgers.types = types }
}
// Run launches, binds and serves, and serves each module's bundle again when it appears, changes or
// goes, with no restart. It answers a stop function.
func Run(conn *bus.Conn, served []Served, envs map[string]map[string]string, logf func(string, ...any)) (func(), error) {
func Run(conn *bus.Conn, served []Served, envs map[string]map[string]string, logf func(string, ...any), opts ...Option) (func(), error) {
if account := os.Getenv(OperatorAccount); account != "" {
home := ""
if h := os.Getenv(OperatorHome); h != "" {
@@ -259,6 +272,9 @@ func Run(conn *bus.Conn, served []Served, envs map[string]map[string]string, log
// The module's events, for every child of it that subscribes (ADR 0198): one consumer per module,
// bound the first time any of its children subscribes, each event handed to every child that did.
r.events = &consumers{conn: conn, logf: logf, of: map[string]*moduleEvents{}}
for _, opt := range opts {
opt(r.events)
}
for _, s := range served {
r.of[s.Module] = r.load(s)