diff --git a/asmux.go b/asmux.go index b1decde..578897c 100644 --- a/asmux.go +++ b/asmux.go @@ -17,8 +17,10 @@ package main import ( + "context" "errors" "net/http" + "sync/atomic" "time" "github.com/Rhymen/go-whatsapp" @@ -97,7 +99,7 @@ func (user *User) sendBridgeStatus(state AsmuxPong) { return } state.fill() - if user.prevBridgeStatus.shouldDeduplicate(&state) { + if user.prevBridgeStatus != nil && user.prevBridgeStatus.shouldDeduplicate(&state) { return } cli := user.bridge.AS.BotClient() @@ -111,6 +113,8 @@ func (user *User) sendBridgeStatus(state AsmuxPong) { } } +var asmuxPingID uint32 = 0 + func (prov *ProvisioningAPI) AsmuxPing(w http.ResponseWriter, r *http.Request) { if !prov.bridge.AS.CheckServerToken(w, r) { return @@ -126,9 +130,15 @@ func (prov *ProvisioningAPI) AsmuxPing(w http.ResponseWriter, r *http.Request) { } } else { if user.Conn.IsConnected() && user.Conn.IsLoggedIn() { - user.log.Debugln("Pinging WhatsApp mobile due to asmux /ping API request") + pingID := atomic.AddUint32(&asmuxPingID, 1) + user.log.Debugfln("Pinging WhatsApp mobile due to asmux /ping API request (ID %d)", pingID) err := user.Conn.AdminTestWithSuppress(true) - user.log.Debugln("Ping response:", err) + if errors.Is(r.Context().Err(), context.Canceled) { + user.log.Warnfln("Ping request %d was canceled before we responded (response was %v)", pingID, err) + user.prevBridgeStatus = nil + return + } + user.log.Debugfln("Ping %d response: %v", pingID, err) if err == whatsapp.ErrPingFalse { user.log.Debugln("Forwarding ping false error from provisioning API to HandleError") go user.HandleError(err)