all repos — postern @ main

Modern mail management

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}