From 026e8a17ca40955652949584388b38566fef66e7 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Mon, 13 May 2019 20:16:55 -0400 Subject: Handle incoming emails gracefully --- worker/imap/open.go | 3 +++ worker/imap/worker.go | 23 ++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'worker') diff --git a/worker/imap/open.go b/worker/imap/open.go index dc5d6d1..ab54e88 100644 --- a/worker/imap/open.go +++ b/worker/imap/open.go @@ -17,6 +17,9 @@ func (imapw *IMAPWorker) handleOpenDirectory(msg *types.OpenDirectory) { }, nil) } else { imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + if imapw.idleStop == nil { + imapw.idleStop = make(chan struct{}) + } } } diff --git a/worker/imap/worker.go b/worker/imap/worker.go index 4354ab9..3d4555f 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -18,7 +18,7 @@ var errUnsupported = fmt.Errorf("unsupported command") type imapClient struct { *client.Client - *idle.IdleClient + idle *idle.IdleClient } type IMAPWorker struct { @@ -30,6 +30,8 @@ type IMAPWorker struct { } client *imapClient + idleStop chan struct{} + idleDone chan error selected imap.MailboxStatus updates chan client.Update worker *types.Worker @@ -39,8 +41,9 @@ type IMAPWorker struct { func NewIMAPWorker(worker *types.Worker) *IMAPWorker { return &IMAPWorker{ - updates: make(chan client.Update, 50), - worker: worker, + idleDone: make(chan error), + updates: make(chan client.Update, 50), + worker: worker, } } @@ -80,6 +83,13 @@ func (w *IMAPWorker) verifyPeerCert(msg types.WorkerMessage) func( } func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { + if w.idleStop != nil { + close(w.idleStop) + if err := <-w.idleDone; err != nil { + w.worker.PostMessage(&types.Error{Error: err}, nil) + } + } + switch msg := msg.(type) { case *types.Unsupported: // No-op @@ -167,6 +177,13 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { default: return errUnsupported } + + if w.idleStop != nil { + w.idleStop = make(chan struct{}) + go func() { + w.idleDone <- w.client.idle.IdleWithFallback(w.idleStop, 0) + }() + } return nil } -- cgit v1.2.3