commit 3f2977063eff53a20f765369ca5acad77015acdc
Author: Wim <wim@42.be>
Date: Sun Feb 09 22:11:46 2020 +0000
diff --git a/bridge/whatsapp/handlers.go b/bridge/whatsapp/handlers.go
index 2873f0c..eaa3f6f 100644
--- a/bridge/whatsapp/handlers.go
+++ b/bridge/whatsapp/handlers.go
@@ -96 +97 @@ import (
"github.com/42wim/matterbridge/bridge/config"
"github.com/42wim/matterbridge/bridge/helper"
"github.com/Rhymen/go-whatsapp"
+ "github.com/jpillora/backoff"
)
/*
@@ -257 +2638 @@ func (b *Bwhatsapp) HandleError(err error) {
if strings.Contains(err.Error(), "error processing data: received invalid data") {
return
}
- b.Log.Errorf("%v", err) // TODO implement proper handling? at least respond to different error types
+
+ switch err.(type) {
+ case *whatsapp.ErrConnectionClosed, *whatsapp.ErrConnectionFailed:
+ b.reconnect(err)
+ default:
+ switch err {
+ case whatsapp.ErrConnectionTimeout:
+ b.reconnect(err)
+ default:
+ b.Log.Errorf("%v", err)
+ }
+ }
+}
+
+func (b *Bwhatsapp) reconnect(err error) {
+ bf := &backoff.Backoff{
+ Min: time.Second,
+ Max: 5 * time.Minute,
+ Jitter: true,
+ }
+ for {
+ d := bf.Duration()
+ b.Log.Errorf("Connection failed, underlying error: %v", err)
+ b.Log.Infof("Waiting %s...", d)
+ time.Sleep(d)
+ b.Log.Info("Reconnecting...")
+ err := b.conn.Restore()
+ if err == nil {
+ bf.Reset()
+ return
+ }
+ }
}
// HandleTextMessage sent from WhatsApp, relay it to the brige