Added callback to process errors after connection.

Added tests and refactored a bit.
This commit is contained in:
CORNIERE Rémi
2019-12-05 18:12:00 +01:00
parent b74c0f0374
commit e675e65a59
10 changed files with 792 additions and 332 deletions
+9 -11
View File
@@ -48,11 +48,12 @@ type Component struct {
transport Transport
// read / write
socketProxy io.ReadWriter // TODO
socketProxy io.ReadWriter // TODO
ErrorHandler func(error)
}
func NewComponent(opts ComponentOptions, r *Router) (*Component, error) {
c := Component{ComponentOptions: opts, router: r}
func NewComponent(opts ComponentOptions, r *Router, errorHandler func(error)) (*Component, error) {
c := Component{ComponentOptions: opts, router: r, ErrorHandler: errorHandler}
return &c, nil
}
@@ -104,11 +105,8 @@ func (c *Component) Resume(sm SMState) error {
case stanza.Handshake:
// Start the receiver go routine
c.updateState(StateSessionEstablished)
// Leaving this channel here for later. Not used atm. We should return this instead of an error because right
// now the returned error is lost in limbo.
errChan := make(chan error)
go c.recv(errChan) // Sends to errChan
return err // Should be empty at this point
go c.recv()
return err // Should be empty at this point
default:
c.updateState(StatePermanentError)
return NewConnError(errors.New("expecting handshake result, got "+v.Name()), true)
@@ -128,13 +126,13 @@ func (c *Component) SetHandler(handler EventHandler) {
}
// Receiver Go routine receiver
func (c *Component) recv(errChan chan<- error) {
func (c *Component) recv() {
for {
val, err := stanza.NextPacket(c.transport.GetDecoder())
if err != nil {
c.updateState(StateDisconnected)
errChan <- err
c.ErrorHandler(err)
return
}
// Handle stream errors
@@ -142,7 +140,7 @@ func (c *Component) recv(errChan chan<- error) {
case stanza.StreamError:
c.router.route(c, val)
c.streamError(p.Error.Local, p.Text)
errChan <- errors.New("stream error: " + p.Error.Local)
c.ErrorHandler(errors.New("stream error: " + p.Error.Local))
return
}
c.router.route(c, val)