summaryrefslogtreecommitdiff
path: root/xmpp/session.go
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp/session.go')
-rw-r--r--xmpp/session.go40
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 {