From f9c87674990ef5a233c02f6cf64546423e0d2277 Mon Sep 17 00:00:00 2001 From: Mohamed Mahmoud Date: Mon, 18 May 2026 14:51:41 +0300 Subject: [PATCH] fix(daemon): add panic recovery (#1306) ## What? Added panic recovery to the async refresh goroutine in `daemon/handler.go`. ## Why? The goroutine had no panic recovery. A panic from any provider would crash the entire daemon. Now it recovers and notifies subscribers instead. Closes #1121 --- daemon/handler.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/daemon/handler.go b/daemon/handler.go index 8ee6c6734ed975959cc5b3282495f8a042322df9..d2ec60983ca906e4a170a51af838b3c23736bd8a 100644 --- a/daemon/handler.go +++ b/daemon/handler.go @@ -310,6 +310,17 @@ func (d *Daemon) handleRefreshFolder(conn *daemonrpc.Conn, req *daemonrpc.Reques // Async: fetch in background, push events when done. go func() { + defer func() { + if r := recover(); r != nil { + log.Printf("daemon: refresh panic for account = %s folder = %s: %v", params.AccountID, params.Folder, r) + d.broadcastToSubscribers(params.AccountID, params.Folder, daemonrpc.EventSyncError, daemonrpc.SyncErrorEvent{ + AccountID: params.AccountID, + Folder: params.Folder, + Error: fmt.Sprintf("panic: %v", r), + }) + } + }() + p, err := d.getProvider(params.AccountID) if err != nil { log.Printf("daemon: refresh provider error: %v", err)