zotregistry.dev/zot@v1.4.4-0.20240314164342-eec277e14d20/pkg/extensions/sync/httpclient/cache.go (about) 1 package client 2 3 import ( 4 "sync" 5 ) 6 7 // Key:Value store for bearer tokens, key is namespace, value is token. 8 // We are storing only pull scoped tokens, the http client is for pulling only. 9 type TokenCache struct { 10 entries sync.Map 11 } 12 13 func NewTokenCache() *TokenCache { 14 return &TokenCache{ 15 entries: sync.Map{}, 16 } 17 } 18 19 func (c *TokenCache) Set(namespace string, token *bearerToken) { 20 if c == nil || token == nil { 21 return 22 } 23 24 defer c.prune() 25 26 c.entries.Store(namespace, token) 27 } 28 29 func (c *TokenCache) Get(namespace string) *bearerToken { 30 if c == nil { 31 return nil 32 } 33 34 val, ok := c.entries.Load(namespace) 35 if !ok { 36 return nil 37 } 38 39 bearerToken, ok := val.(*bearerToken) 40 if !ok { 41 return nil 42 } 43 44 return bearerToken 45 } 46 47 func (c *TokenCache) prune() { 48 c.entries.Range(func(key, val any) bool { 49 bearerToken, ok := val.(*bearerToken) 50 if ok { 51 if bearerToken.isExpired() { 52 c.entries.Delete(key) 53 } 54 } 55 56 return true 57 }) 58 }