Skip to content

Commit 7e596fc

Browse files
genofiremremond
authored andcommitted
quick fix for component see #47
1 parent 6f9808f commit 7e596fc

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

component.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,52 +66,60 @@ func NewComponent(opts ComponentOptions, r *Router) (*Component, error) {
6666
// Connect triggers component connection to XMPP server component port.
6767
// TODO: Failed handshake should be a permanent error
6868
func (c *Component) Connect() error {
69+
var state SMState
70+
return c.Resume(state)
71+
}
72+
func (c *Component) Resume(sm SMState) error {
6973
var conn net.Conn
7074
var err error
7175
if conn, err = net.DialTimeout("tcp", c.Address, time.Duration(5)*time.Second); err != nil {
7276
return err
7377
}
7478
c.conn = conn
79+
c.updateState(StateConnected)
7580

7681
// 1. Send stream open tag
7782
if _, err := fmt.Fprintf(conn, componentStreamOpen, c.Domain, stanza.NSComponent, stanza.NSStream); err != nil {
78-
return errors.New("cannot send stream open " + err.Error())
83+
c.updateState(StateStreamError)
84+
return NewConnError(errors.New("cannot send stream open "+err.Error()), false)
7985
}
8086
c.decoder = xml.NewDecoder(conn)
8187

8288
// 2. Initialize xml decoder and extract streamID from reply
8389
streamId, err := stanza.InitStream(c.decoder)
8490
if err != nil {
85-
return errors.New("cannot init decoder " + err.Error())
91+
c.updateState(StateStreamError)
92+
return NewConnError(errors.New("cannot init decoder "+err.Error()), false)
8693
}
8794

8895
// 3. Authentication
8996
if _, err := fmt.Fprintf(conn, "<handshake>%s</handshake>", c.handshake(streamId)); err != nil {
90-
return errors.New("cannot send handshake " + err.Error())
97+
c.updateState(StateStreamError)
98+
return NewConnError(errors.New("cannot send handshake "+err.Error()), false)
9199
}
92100

93101
// 4. Check server response for authentication
94102
val, err := stanza.NextPacket(c.decoder)
95103
if err != nil {
96-
return err
104+
c.updateState(StateDisconnected)
105+
return NewConnError(err, true)
97106
}
98107

99108
switch v := val.(type) {
100109
case stanza.StreamError:
101-
return errors.New("handshake failed " + v.Error.Local)
110+
c.streamError("conflict", "no auth loop")
111+
return NewConnError(errors.New("handshake failed "+v.Error.Local), true)
102112
case stanza.Handshake:
103113
// Start the receiver go routine
114+
c.updateState(StateSessionEstablished)
104115
go c.recv()
105116
return nil
106117
default:
107-
return errors.New("expecting handshake result, got " + v.Name())
118+
c.updateState(StateStreamError)
119+
return NewConnError(errors.New("expecting handshake result, got "+v.Name()), true)
108120
}
109121
}
110122

111-
func (c *Component) Resume(SMState) error {
112-
return errors.New("components do not support stream management")
113-
}
114-
115123
func (c *Component) Disconnect() {
116124
_ = c.SendRaw("</stream:stream>")
117125
// TODO: Add a way to wait for stream close acknowledgement from the server for clean disconnect

0 commit comments

Comments
 (0)