Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions daemon/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@ import (
"github.com/floatpane/matcha/daemonrpc"
)

// Per-handler timeouts. fetchTimeout covers reads against the upstream IMAP
// provider, which can return large bodies and so are given more headroom.
// mutateTimeout covers state-changing operations and folder listings, which
// are bounded by IMAP command latency rather than payload size.
const (
fetchTimeout = 60 * time.Second
mutateTimeout = 30 * time.Second
)

func (d *Daemon) handleRequest(conn *daemonrpc.Conn, req *daemonrpc.Request) {
switch req.Method {
case daemonrpc.MethodPing:
Expand Down Expand Up @@ -117,7 +126,7 @@ func (d *Daemon) handleFetchEmails(conn *daemonrpc.Conn, req *daemonrpc.Request)
return
}

ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), fetchTimeout)
defer cancel()

emails, err := p.FetchEmails(ctx, params.Folder, params.Limit, params.Offset)
Expand All @@ -142,7 +151,7 @@ func (d *Daemon) handleFetchEmailBody(conn *daemonrpc.Conn, req *daemonrpc.Reque
return
}

ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), fetchTimeout)
defer cancel()

body, attachments, err := p.FetchEmailBody(ctx, params.Folder, params.UID)
Expand Down Expand Up @@ -181,7 +190,7 @@ func (d *Daemon) handleDeleteEmails(conn *daemonrpc.Conn, req *daemonrpc.Request
return
}

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), mutateTimeout)
defer cancel()

if err := p.DeleteEmails(ctx, params.Folder, params.UIDs); err != nil {
Expand All @@ -204,7 +213,7 @@ func (d *Daemon) handleArchiveEmails(conn *daemonrpc.Conn, req *daemonrpc.Reques
return
}

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), mutateTimeout)
defer cancel()

if err := p.ArchiveEmails(ctx, params.Folder, params.UIDs); err != nil {
Expand All @@ -227,7 +236,7 @@ func (d *Daemon) handleMoveEmails(conn *daemonrpc.Conn, req *daemonrpc.Request)
return
}

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), mutateTimeout)
defer cancel()

if err := p.MoveEmails(ctx, params.UIDs, params.SourceFolder, params.DestFolder); err != nil {
Expand All @@ -250,7 +259,7 @@ func (d *Daemon) handleMarkRead(conn *daemonrpc.Conn, req *daemonrpc.Request) {
return
}

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), mutateTimeout)
defer cancel()

// MarkAsRead only supports one UID at a time in the Provider interface.
Expand All @@ -275,7 +284,7 @@ func (d *Daemon) handleFetchFolders(conn *daemonrpc.Conn, req *daemonrpc.Request
return
}

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), mutateTimeout)
defer cancel()

folders, err := p.FetchFolders(ctx)
Expand Down Expand Up @@ -306,7 +315,7 @@ func (d *Daemon) handleRefreshFolder(conn *daemonrpc.Conn, req *daemonrpc.Reques
Folder: params.Folder,
})

ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), fetchTimeout)
defer cancel()

emails, err := p.FetchEmails(ctx, params.Folder, 50, 0)
Expand Down
Loading