func (zi *ZeroMQInput) Run(ir pipeline.InputRunner, h pipeline.PluginHelper) error { // Get the InputRunner's chan to receive empty PipelinePacks packs := ir.InChan() var decoding chan<- *pipeline.PipelinePack if zi.conf.Decoder != "" { // Fetch specified decoder decoder, ok := h.DecoderSet().ByName(zi.conf.Decoder) if !ok { err := fmt.Errorf("Could not find decoder", zi.conf.Decoder) return err } // Get the decoder's receiving chan decoding = decoder.InChan() } var pack *pipeline.PipelinePack var count int var b []byte var err error // Read data from websocket broadcast chan for { b, err = zi.socket.Recv(0) if err != nil { ir.LogError(err) continue } // Grab an empty PipelinePack from the InputRunner pack = <-packs // Trim the excess empty bytes count = len(b) pack.MsgBytes = pack.MsgBytes[:count] // Copy ws bytes into pack's bytes copy(pack.MsgBytes, b) if decoding != nil { // Send pack onto decoder decoding <- pack } else { // Send pack into Heka pipeline ir.Inject(pack) } } return nil }