package xmpp import ( "context" "crypto/tls" "encoding/xml" "errors" "io" "log" ) func runRx(ctx context.Context, chn chan xml.Token, conn *tls.Conn) { l := logger{"[RX] "} r := io.TeeReader(conn, l) d := xml.NewDecoder(r) for { select { case <-ctx.Done(): return default: t, err := d.Token() if t != nil && err == nil { switch t.(type) { case xml.ProcInst: case xml.Directive: case xml.Comment: default: c := xml.CopyToken(t) chn <- c } } if err != nil { if errors.Is(err, io.EOF) { return } log.Println(err) // FIXME terminate session on error return } } } } 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 }