github.com/awesome-flow/flow@v0.0.3-0.20190918184116-508d75d68a2c/pkg/corev1alpha1/x/encoder_base64.go (about) 1 package x 2 3 import ( 4 "encoding/base64" 5 "sync" 6 7 core "github.com/awesome-flow/flow/pkg/corev1alpha1" 8 ) 9 10 type EncoderBase64 struct { 11 name string 12 ctx *core.Context 13 queue chan *core.Message 14 wg sync.WaitGroup 15 encoding *base64.Encoding 16 } 17 18 var _ core.Actor = (*EncoderBase64)(nil) 19 20 func NewEncoderBase64(name string, ctx *core.Context, params core.Params) (core.Actor, error) { 21 return &EncoderBase64{ 22 name: name, 23 ctx: ctx, 24 queue: make(chan *core.Message, 1), 25 encoding: base64.StdEncoding, 26 }, nil 27 } 28 29 func (e *EncoderBase64) Name() string { 30 return e.name 31 } 32 33 func (e *EncoderBase64) Start() error { 34 return nil 35 } 36 37 func (e *EncoderBase64) Stop() error { 38 close(e.queue) 39 e.wg.Wait() 40 return nil 41 } 42 43 func (e *EncoderBase64) Connect(nthreads int, peer core.Receiver) error { 44 for i := 0; i < nthreads; i++ { 45 e.wg.Add(1) 46 go func() { 47 for msg := range e.queue { 48 if err := peer.Receive(msg); err != nil { 49 e.ctx.Logger().Error("base64 encoder %q failed to send message to receiver: %s", e.name, err) 50 } 51 } 52 e.wg.Done() 53 }() 54 } 55 return nil 56 } 57 58 func (e *EncoderBase64) Receive(msg *core.Message) error { 59 encbody := e.encodeBase64(msg.Body()) 60 msg.SetBody(encbody) 61 e.queue <- msg 62 return nil 63 } 64 65 func (e *EncoderBase64) encodeBase64(data []byte) []byte { 66 newlen := e.encoding.EncodedLen(len(data)) 67 out := make([]byte, newlen) 68 e.encoding.Encode(out, data) 69 return out 70 }