docs/beam/utils/queue.go

42 lines
599 B
Go

package utils
import (
"github.com/docker/libswarm/beam"
)
type Queue struct {
*beam.PipeSender
dst beam.Sender
ch chan *beam.Message
}
func NewQueue(dst beam.Sender, size int) *Queue {
r, w := beam.Pipe()
q := &Queue{
PipeSender: w,
dst: dst,
ch: make(chan *beam.Message, size),
}
go func() {
defer close(q.ch)
for {
msg, err := r.Receive(beam.Ret)
if err != nil {
r.Close()
return
}
q.ch <- msg
}
}()
go func() {
for msg := range q.ch {
_, err := dst.Send(msg)
if err != nil {
r.Close()
return
}
}
}()
return q
}