45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
package buildstep
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
stdio "git.novox.be/novox/mesh-sdk/go"
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
// SeatAsks is a build seat's workers as a tools bundle reaches them: through its runtime's seat pull and settle
|
|
// (stdio.SeatPull, SeatSettle; issue 1887 A11), one message per pull, only from the workers the module's membership
|
|
// lists.
|
|
type SeatAsks struct {
|
|
Language string
|
|
// Pull and Settle are stdio.SeatPull and stdio.SeatSettle when nil; a test gives its own.
|
|
Pull func(worker string, wait time.Duration) (*stdio.Pulled, error)
|
|
Settle func(id, fate string) error
|
|
}
|
|
|
|
// Next is AskSource's.
|
|
func (s SeatAsks) Next(ctx context.Context, kind string, wait time.Duration) (*Pulled, error) {
|
|
pull, settle := s.Pull, s.Settle
|
|
if pull == nil {
|
|
pull = stdio.SeatPull
|
|
}
|
|
if settle == nil {
|
|
settle = stdio.SeatSettle
|
|
}
|
|
worker, err := delivery.AskWorker(s.Language, kind)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := ctx.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
p, err := pull(worker, wait)
|
|
if err != nil || p == nil {
|
|
return nil, err
|
|
}
|
|
fate := func(f string) func() error { return func() error { return settle(p.ID, f) } }
|
|
return &Pulled{Data: p.Body, Delivered: p.Delivered, Ack: fate(stdio.SettleAck), InProgress: fate(stdio.SettleProgress),
|
|
Nak: fate(stdio.SettleNak), Term: fate(stdio.SettleTerm)}, nil
|
|
}
|