The node seat node-engine served on the engine's link: its verbs with their proven caller, its acts kept in its own state, a hand-over or access act asked of the operator as node-engine-<node> and performed only on the warrant (issue 774, ADR 0563 §1-§3)
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
stdio "git.novox.be/novox/mesh-sdk/go"
|
||||
"git.novox.be/novox/mesh-sdk/go/health"
|
||||
)
|
||||
|
||||
@@ -47,6 +48,9 @@ type Session struct {
|
||||
// MoveSecret moves one value sealed to this machine into the vault, asked by the controller during the move of
|
||||
// the secrets (design 57's V3, issue 676). Nil answers every such ask with a refusal.
|
||||
MoveSecret MoveSecretFunc
|
||||
// Acts is the node seat node-engine this engine holds (novox/hq ADR 0563): served on every link, and its asks to the
|
||||
// operator asked and heard over it. Nil serves no seat.
|
||||
Acts *HandActs
|
||||
// Keys reads the node's public keys and its certificate for its record (ADR 0555 §3), at each facts report; nil writes
|
||||
// no record.
|
||||
Keys func() RecordKeys
|
||||
@@ -337,3 +341,49 @@ func (q *Session) AskSeat(ctx context.Context, seat, verb string, args any, with
|
||||
}
|
||||
return env.Result, nil
|
||||
}
|
||||
|
||||
// PublishAsk publishes an ask or a cancel to the operator's router over the link open now (novox/hq ADR 0563 §3).
|
||||
func (q *Session) PublishAsk(subject string, body any, id string) error {
|
||||
asking, err := q.operatorAsks()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return asking.PublishAsk(subject, body, id)
|
||||
}
|
||||
|
||||
// RouterRecord reads one key of the router's records over the link open now.
|
||||
func (q *Session) RouterRecord(key string) (*stdio.StateEntry, error) {
|
||||
asking, err := q.operatorAsks()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return asking.RouterRecord(key)
|
||||
}
|
||||
|
||||
// SayEngine says one of the node seat's events over the link open now; with none open it is not said.
|
||||
func (q *Session) SayEngine(event string, body any) {
|
||||
q.init()
|
||||
q.mu.Lock()
|
||||
bus := q.bus
|
||||
q.mu.Unlock()
|
||||
if sayer, ok := bus.(interface{ SayEngine(string, any) error }); ok {
|
||||
if err := sayer.SayEngine(event, body); err != nil {
|
||||
q.Say("could not say the node seat's " + event + ": " + err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (q *Session) operatorAsks() (OperatorAsks, error) {
|
||||
q.init()
|
||||
q.mu.Lock()
|
||||
bus := q.bus
|
||||
q.mu.Unlock()
|
||||
if bus == nil {
|
||||
return nil, fmt.Errorf("%w: this machine has no link to the bus open now", ErrNotAsked)
|
||||
}
|
||||
asking, ok := bus.(OperatorAsks)
|
||||
if !ok {
|
||||
return nil, errNoAsking
|
||||
}
|
||||
return asking, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user