package buscompose import ( "git.novox.be/novox/mesh-sdk/go/asks" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/delivery" ) // The node seat node-engine (novox/hq ADR 0563 §1): every node's engine holds it on its own bus account, and no module // claims it. Its verbs and events are the catalogue's (catalogue.EngineVerbs), read here rather than copied. // EngineSeat is the seat. const EngineSeat = catalogue.EngineSeat // EngineModule is the node-engine's manifest's module name, and EngineActsState its state the acts asked through the // node seat and its own asks are kept in (ADR 0563 §2, §3: "the engine's own state"): the bucket mesh-host_acts, keys // `.act.`, `.open..` and `.ask.`, each written by that node's engine alone. const ( EngineModule = "mesh-host" EngineActsState = "acts" ) // EngineActsBucket is that state's bucket. var EngineActsBucket = BucketName(EngineModule, EngineActsState) // EnginePackagesBucket is the engine's state of its node's declared packages (novox/hq ADR 0565 clause 6): one key, the // node's name, written by that node's engine alone. var EnginePackagesBucket = BucketName(EngineModule, delivery.EnginePackagesState) // EnginePackagesGrants is what a node's engine publishes to keep its node's key of the packages bucket: the key alone, // and its read. func EnginePackagesGrants(node string) []string { return append([]string{"$KV." + EnginePackagesBucket + "." + node}, readGrants(EnginePackagesBucket, node)...) } // engineGrants is what a node's engine is granted to hold its node seat and to ask the operator (ADR 0563 §1, §3): it // answers its own node's verbs (the caller-named subjects are added beside them with every principal's), says the // seat's events about its node, answers discovery for the seat, asks who answers what (the login shell's execute, ADR // 0563 §6), and asks the operator under asks.EngineAsker(node) on the router's seat as its holder declares it, as any // user of that seat is granted. func engineGrants(p Principal) (pub, sub []string) { for _, v := range catalogue.EngineVerbs() { sub = append(sub, "mesh.seat."+EngineSeat+".tool."+v.Name+"."+p.Node) } for _, e := range catalogue.EngineEvents { pub = append(pub, "mesh.seat."+EngineSeat+".event."+e+"."+p.Node) } sub = append(sub, announcing(EngineSeat)...) pub = append(pub, discovering()...) tp, ts := seatTrafficGrants(SeatTrafficOf(asks.EngineAsker(p.Node), nil, p.Uses, nil)) // And its acts and asks, under its own node's keys alone; never the bucket's creation, which is the grants part's. if own, err := NodeKeysGrants(EngineActsBucket, p.Node); err == nil { pub = append(pub, own...) } // And its node's declared packages, its own key alone (ADR 0565 clause 6). if safeSubject.MatchString(p.Node) { pub = append(pub, EnginePackagesGrants(p.Node)...) } return append(pub, tp...), append(sub, ts...) }