internal/imap/tracker.go (view raw)
1package imap
2
3import (
4 "sync"
5
6 "github.com/emersion/go-imap/v2/imapserver"
7)
8
9type mailboxTrackerKey struct {
10 userID, mailboxID int
11}
12
13type mailboxTrackerRegistry struct {
14 mu sync.RWMutex
15 trackers map[mailboxTrackerKey]*imapserver.MailboxTracker
16}
17
18func newMailboxTrackerRegistry() *mailboxTrackerRegistry {
19 return &mailboxTrackerRegistry{
20 trackers: make(map[mailboxTrackerKey]*imapserver.MailboxTracker),
21 }
22}
23
24func (m *mailboxTrackerRegistry) getMailboxTracker(userID, mailboxID int, numMessages uint32) *imapserver.MailboxTracker {
25 k := mailboxTrackerKey{userID, mailboxID}
26
27 m.mu.Lock()
28 defer m.mu.Unlock()
29
30 if t, ok := m.trackers[k]; ok {
31 return t
32 }
33 t := imapserver.NewMailboxTracker(numMessages)
34 m.trackers[k] = t
35 return t
36}
37
38func (r *mailboxTrackerRegistry) get(userID, mailboxID int) *imapserver.MailboxTracker {
39 r.mu.Lock()
40 defer r.mu.Unlock()
41 return r.trackers[mailboxTrackerKey{userID, mailboxID}]
42}
43
44func (r *mailboxTrackerRegistry) remove(userID, mailboxID int) {
45 r.mu.Lock()
46 defer r.mu.Unlock()
47 delete(r.trackers, mailboxTrackerKey{userID, mailboxID})
48}