package imap import ( "sync" "github.com/emersion/go-imap/v2/imapserver" ) type mailboxTrackerKey struct { userID, mailboxID int } type mailboxTrackerRegistry struct { mu sync.RWMutex trackers map[mailboxTrackerKey]*imapserver.MailboxTracker } func newMailboxTrackerRegistry() *mailboxTrackerRegistry { return &mailboxTrackerRegistry{ trackers: make(map[mailboxTrackerKey]*imapserver.MailboxTracker), } } func (m *mailboxTrackerRegistry) getMailboxTracker(userID, mailboxID int, numMessages uint32) *imapserver.MailboxTracker { k := mailboxTrackerKey{userID, mailboxID} m.mu.Lock() defer m.mu.Unlock() if t, ok := m.trackers[k]; ok { return t } t := imapserver.NewMailboxTracker(numMessages) m.trackers[k] = t return t } func (r *mailboxTrackerRegistry) get(userID, mailboxID int) *imapserver.MailboxTracker { r.mu.Lock() defer r.mu.Unlock() return r.trackers[mailboxTrackerKey{userID, mailboxID}] } func (r *mailboxTrackerRegistry) remove(userID, mailboxID int) { r.mu.Lock() defer r.mu.Unlock() delete(r.trackers, mailboxTrackerKey{userID, mailboxID}) }