diff --git a/crypto.go b/crypto.go index c8a56a9..9acf28d 100644 --- a/crypto.go +++ b/crypto.go @@ -23,6 +23,7 @@ import ( "crypto/sha512" "encoding/hex" "fmt" + "runtime/debug" "time" "maunium.net/go/maulogger/v2" @@ -207,7 +208,23 @@ type cryptoSyncer struct { } func (syncer *cryptoSyncer) ProcessResponse(resp *mautrix.RespSync, since string) error { - syncer.ProcessSyncResponse(resp, since) + done := make(chan struct{}) + go func() { + defer func() { + if err := recover(); err != nil { + syncer.Log.Error("Processing sync response (%s) panicked: %v\n%s", since, err, debug.Stack()) + } + done <- struct{}{} + }() + syncer.Log.Trace("Starting sync response handling (%s)", since) + syncer.ProcessSyncResponse(resp, since) + syncer.Log.Trace("Successfully handled sync response (%s)", since) + }() + select { + case <-done: + case <-time.After(30 * time.Second): + syncer.Log.Warn("Handling sync response (%s) is taking unusually long", since) + } return nil }