package xmpp import ( "crypto/tls" "crypto/x509" "encoding/xml" "log" ) type SessionConnect struct{} type SessionDisconnect struct{} type SessionShouldDisconnect struct{} type session struct { jid string pwd string in chan any out chan<- any transport *tls.Conn ed encoderDecoder rx chan xml.Token resourceReq string } func StartSession(out chan<- any, jid string, pwd string) (in chan<- any) { s := session{} s.jid = jid s.pwd = pwd s.in = make(chan any) s.out = out s.rx = make(chan xml.Token, 0) go s.run() return s.in } 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 }() s.out <- SessionConnect{} runStreamPair(s) } func (s *session) startTransport() error { domain := domainpart(s.jid) roots, err := x509.SystemCertPool() if err != nil { log.Println(err) return err } s.transport, err = tls.Dial("tcp", domain+":"+"5223", &tls.Config{RootCAs: roots}) if err != nil { log.Println(err) return err } return nil }