aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/emersion/go-imap/responses/idle.go
blob: b5efcacd517f9868f31163300e13671063137e61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package responses

import (
	"github.com/emersion/go-imap"
)

// An IDLE response.
type Idle struct {
	RepliesCh chan []byte
	Stop      <-chan struct{}

	gotContinuationReq bool
}

func (r *Idle) Replies() <-chan []byte {
	return r.RepliesCh
}

func (r *Idle) stop() {
	r.RepliesCh <- []byte("DONE\r\n")
}

func (r *Idle) Handle(resp imap.Resp) error {
	// Wait for a continuation request
	if _, ok := resp.(*imap.ContinuationReq); ok && !r.gotContinuationReq {
		r.gotContinuationReq = true

		// We got a continuation request, wait for r.Stop to be closed
		go func() {
			<-r.Stop
			r.stop()
		}()

		return nil
	}

	return ErrUnhandled
}