github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/usermemo.go (about)

     1  package libkb
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  
     7  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
     8  )
     9  
    10  type UserPlusKeysMemo struct {
    11  	upk        keybase1.UserPlusKeys
    12  	validUntil time.Time
    13  	sync.RWMutex
    14  	Contextified
    15  }
    16  
    17  func NewUserPlusKeysMemo(g *GlobalContext) *UserPlusKeysMemo {
    18  	return &UserPlusKeysMemo{
    19  		Contextified: NewContextified(g),
    20  	}
    21  }
    22  
    23  func (u *UserPlusKeysMemo) Get(uid keybase1.UID) (keybase1.UserPlusKeys, bool) {
    24  	u.RLock()
    25  	defer u.RUnlock()
    26  
    27  	if !u.upk.Uid.Equal(uid) {
    28  		return keybase1.UserPlusKeys{}, false
    29  	}
    30  
    31  	if time.Now().Before(u.validUntil) {
    32  		u.G().Log.Debug("UserPlusKeysMemo: cache expired")
    33  		return keybase1.UserPlusKeys{}, false
    34  	}
    35  
    36  	u.G().Log.Debug("UserPlusKeysMemo: cache hit")
    37  
    38  	return u.upk, true
    39  }
    40  
    41  func (u *UserPlusKeysMemo) Set(upk keybase1.UserPlusKeys) {
    42  	u.Lock()
    43  	defer u.Unlock()
    44  
    45  	u.G().Log.Debug("UserPlusKeysMemo: set %s, %s", upk.Username, upk.Uid)
    46  
    47  	u.upk = upk
    48  	u.validUntil = time.Now().Add(1 * time.Minute)
    49  }
    50  
    51  func (u *UserPlusKeysMemo) Clear() {
    52  	u.Lock()
    53  	defer u.Unlock()
    54  
    55  	u.G().Log.Debug("UserPlusKeysMemo: clear")
    56  
    57  	u.upk = keybase1.UserPlusKeys{}
    58  	u.validUntil = time.Time{}
    59  }