github.com/keybase/client/go@v0.0.0-20240520164431-4f512a4c85a3/libkb/track_cache.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package libkb
     5  
     6  import (
     7  	"encoding/hex"
     8  	"fmt"
     9  	"time"
    10  
    11  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    12  	"stathat.com/c/ramcache"
    13  )
    14  
    15  type TrackCache struct {
    16  	cache *ramcache.Ramcache
    17  }
    18  
    19  func NewTrackCache() *TrackCache {
    20  	res := &TrackCache{
    21  		cache: ramcache.New(),
    22  	}
    23  	res.cache.TTL = 1 * time.Hour
    24  	res.cache.MaxAge = 1 * time.Hour
    25  	return res
    26  }
    27  
    28  func (c *TrackCache) Get(key keybase1.TrackToken) (*IdentifyOutcome, error) {
    29  	v, err := c.cache.Get(string(key))
    30  	if err != nil {
    31  		if err == ramcache.ErrNotFound {
    32  			return nil, IdentifyTimeoutError{}
    33  		}
    34  		return nil, err
    35  	}
    36  	outcome, ok := v.(*IdentifyOutcome)
    37  	if !ok {
    38  		return nil, fmt.Errorf("invalid type in cache: %T", v)
    39  	}
    40  	return outcome, nil
    41  }
    42  
    43  func (c *TrackCache) Insert(outcome *IdentifyOutcome) (keybase1.TrackToken, error) {
    44  	rb, err := RandBytes(16)
    45  	if err != nil {
    46  		return "", err
    47  	}
    48  	key := hex.EncodeToString(rb)
    49  	if err := c.cache.Set(key, outcome); err != nil {
    50  		return "", err
    51  	}
    52  	return keybase1.TrackToken(key), nil
    53  }
    54  
    55  func (c *TrackCache) Delete(key keybase1.TrackToken) error {
    56  	return c.cache.Delete(string(key))
    57  }
    58  
    59  func (c *TrackCache) Shutdown() {
    60  	c.cache.Shutdown()
    61  }