package xmpp import ( "encoding/xml" "errors" "io" "log" ) type encoderDecoder struct { session *session rx *xml.Decoder terminator chan bool } func newEncoderDecoder(s *session) encoderDecoder { ed := encoderDecoder{} ed.session = s lr := logger{"[RX] "} r := io.TeeReader(s.transport, lr) ed.rx = xml.NewDecoder(r) return ed } func (s *session) encodeToken(t xml.Token) error { var err error defer func() { if err != nil { log.Println(err) } }() err = s.tx.EncodeToken(t) if err != nil { return err } err = s.tx.Flush() if err != nil { return err } return nil } func (ed *encoderDecoder) run() { for { select { case <-ed.terminator: return default: t, err := ed.rx.Token() if t != nil && err == nil { switch t.(type) { case xml.ProcInst: case xml.Directive: case xml.Comment: default: c := xml.CopyToken(t) ed.session.rx <- c } } if err != nil { if errors.Is(err, io.EOF) { return } log.Println(err) // FIXME terminate session on error return } } } }