github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/chat/storage/inbox_memcache.go (about)

     1  package storage
     2  
     3  import (
     4  	"sync"
     5  
     6  	"github.com/keybase/client/go/chat/types"
     7  	"github.com/keybase/client/go/libkb"
     8  	"github.com/keybase/client/go/protocol/chat1"
     9  	"github.com/keybase/client/go/protocol/gregor1"
    10  )
    11  
    12  type inboxMemCacheImpl struct {
    13  	sync.Mutex
    14  
    15  	versMap  map[string]*inboxDiskVersions
    16  	indexMap map[string]*inboxDiskIndex
    17  	convMap  map[string]types.RemoteConversation
    18  }
    19  
    20  func newInboxMemCacheImpl() *inboxMemCacheImpl {
    21  	return &inboxMemCacheImpl{
    22  		versMap:  make(map[string]*inboxDiskVersions),
    23  		indexMap: make(map[string]*inboxDiskIndex),
    24  		convMap:  make(map[string]types.RemoteConversation),
    25  	}
    26  }
    27  
    28  func (i *inboxMemCacheImpl) GetVersions(uid gregor1.UID) *inboxDiskVersions {
    29  	i.Lock()
    30  	defer i.Unlock()
    31  	if ibox, ok := i.versMap[uid.String()]; ok {
    32  		return ibox
    33  	}
    34  	return nil
    35  }
    36  
    37  func (i *inboxMemCacheImpl) PutVersions(uid gregor1.UID, ibox *inboxDiskVersions) {
    38  	i.Lock()
    39  	defer i.Unlock()
    40  	i.versMap[uid.String()] = ibox
    41  }
    42  
    43  func (i *inboxMemCacheImpl) GetIndex(uid gregor1.UID) *inboxDiskIndex {
    44  	i.Lock()
    45  	defer i.Unlock()
    46  	if ibox, ok := i.indexMap[uid.String()]; ok {
    47  		ret := ibox.DeepCopy()
    48  		return &ret
    49  	}
    50  	return nil
    51  }
    52  
    53  func (i *inboxMemCacheImpl) PutIndex(uid gregor1.UID, ibox *inboxDiskIndex) {
    54  	i.Lock()
    55  	defer i.Unlock()
    56  	i.indexMap[uid.String()] = ibox
    57  }
    58  
    59  func (i *inboxMemCacheImpl) convKey(uid gregor1.UID, convID chat1.ConversationID) string {
    60  	return uid.String() + convID.String()
    61  }
    62  
    63  func (i *inboxMemCacheImpl) GetConv(uid gregor1.UID, convID chat1.ConversationID) *types.RemoteConversation {
    64  	i.Lock()
    65  	defer i.Unlock()
    66  	if conv, ok := i.convMap[i.convKey(uid, convID)]; ok {
    67  		ret := conv.DeepCopy()
    68  		return &ret
    69  	}
    70  	return nil
    71  }
    72  
    73  func (i *inboxMemCacheImpl) PutConv(uid gregor1.UID, conv types.RemoteConversation) {
    74  	i.Lock()
    75  	defer i.Unlock()
    76  	i.convMap[i.convKey(uid, conv.GetConvID())] = conv
    77  }
    78  
    79  func (i *inboxMemCacheImpl) Clear(uid gregor1.UID) {
    80  	i.Lock()
    81  	defer i.Unlock()
    82  	delete(i.versMap, uid.String())
    83  	delete(i.indexMap, uid.String())
    84  	i.convMap = make(map[string]types.RemoteConversation)
    85  }
    86  
    87  func (i *inboxMemCacheImpl) clearCache() {
    88  	i.Lock()
    89  	defer i.Unlock()
    90  	i.versMap = make(map[string]*inboxDiskVersions)
    91  	i.indexMap = make(map[string]*inboxDiskIndex)
    92  	i.convMap = make(map[string]types.RemoteConversation)
    93  }
    94  
    95  func (i *inboxMemCacheImpl) OnLogout(m libkb.MetaContext) error {
    96  	i.clearCache()
    97  	return nil
    98  }
    99  
   100  func (i *inboxMemCacheImpl) OnDbNuke(m libkb.MetaContext) error {
   101  	i.clearCache()
   102  	return nil
   103  }
   104  
   105  var inboxMemCache = newInboxMemCacheImpl()