diff --git a/client.go b/client.go index 7d5a424..3cb43cd 100644 --- a/client.go +++ b/client.go @@ -70,8 +70,8 @@ type Client struct { Session *Session // TCP level connection / can be replaced by a TLS session after starttls conn net.Conn - // Packet channel - RecvChannel chan Packet + // Router is used to dispatch packets + router *Router // Track and broadcast connection state EventManager } @@ -84,7 +84,7 @@ Setting up the client / Checking the parameters // If host is not specified, the DNS SRV should be used to find the host from the domainpart of the JID. // Default the port to 5222. // TODO: better config checks -func NewClient(config Config) (c *Client, err error) { +func NewClient(config Config, r *Router) (c *Client, err error) { // TODO: If option address is nil, use the Jid domain to compose the address if config.Address, err = checkAddress(config.Address); err != nil { return nil, NewConnError(err, true) @@ -103,14 +103,12 @@ func NewClient(config Config) (c *Client, err error) { c = new(Client) c.config = config + c.router = r if c.config.ConnectTimeout == 0 { c.config.ConnectTimeout = 15 // 15 second as default } - // Create a default channel that developers can override - c.RecvChannel = make(chan Packet) - return } @@ -173,13 +171,6 @@ func (c *Client) SetHandler(handler EventHandler) { c.Handler = handler } -// Recv abstracts receiving preparsed XMPP packets from a channel. -// Channel allow client to receive / dispatch packets in for range loop. -// TODO: Deprecate this function in favor of reading directly from the RecvChannel ? -func (c *Client) Recv() <-chan Packet { - return c.RecvChannel -} - // Send marshals XMPP stanza and sends it to the server. func (c *Client) Send(packet Packet) error { data, err := xml.Marshal(packet) @@ -219,13 +210,13 @@ func (c *Client) recv(keepaliveQuit chan<- struct{}) (err error) { // Handle stream errors switch packet := val.(type) { case StreamError: - c.RecvChannel <- val - close(c.RecvChannel) + c.router.Route(c, val) + close(keepaliveQuit) c.streamError(packet.Error.Local, packet.Text) return errors.New("stream error: " + packet.Error.Local) } - c.RecvChannel <- val + c.router.Route(c, val) } }