diff options
Diffstat (limited to 'xmpp/session.go')
-rw-r--r-- | xmpp/session.go | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/xmpp/session.go b/xmpp/session.go index a43e4f4..4dfd76f 100644 --- a/xmpp/session.go +++ b/xmpp/session.go @@ -1,9 +1,11 @@ package xmpp import ( + "context" "crypto/tls" "crypto/x509" "encoding/xml" + "io" "log" ) @@ -17,8 +19,8 @@ type session struct { in chan any out chan<- any transport *tls.Conn - ed encoderDecoder - rx chan xml.Token + tx *xml.Encoder + rx chan any resourceReq string } @@ -29,7 +31,7 @@ func StartSession(out chan<- any, jid string, pwd string) (in chan<- any) { s.pwd = pwd s.in = make(chan any) s.out = out - s.rx = make(chan xml.Token, 0) + s.rx = make(chan any, 0) go s.run() @@ -37,21 +39,39 @@ func StartSession(out chan<- any, jid string, pwd string) (in chan<- any) { } func (s *session) run() { - defer func() { s.out <- SessionDisconnect{} }() - err := s.startTransport() if err != nil { return } defer s.transport.Close() - s.ed = newEncoderDecoder(s) - go s.ed.run() - defer func() { s.ed.terminator <- true }() + ctx, cancel := context.WithCancel(context.Background()) + cpy := s.rx + go runRx(ctx, cpy, s.transport) + defer cancel() + + lw := logger{"[TX] "} + w := io.MultiWriter(s.transport, lw) + s.tx = xml.NewEncoder(w) + defer s.tx.Close() - s.out <- SessionConnect{} + openStream(s.tx, s.jid) + defer closeStream(s.tx) - runStreamPair(s) + s.out <- SessionConnect{} // TODO this should be sent after initial presence + defer func() { s.out <- SessionDisconnect{} }() + + for { + select { + case e := <-s.rx: + handle(s, e) + case signal := <-s.in: + switch signal.(type) { + case SessionShouldDisconnect: + return + } + } + } } func (s *session) startTransport() error { |