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  }