1// Copyright 2015 Keybase, Inc. All rights reserved. Use of 2// this source code is governed by the included BSD license. 3 4package libkb 5 6import ( 7 "encoding/hex" 8 "fmt" 9 "time" 10 11 keybase1 "github.com/keybase/client/go/protocol/keybase1" 12 "stathat.com/c/ramcache" 13) 14 15type TrackCache struct { 16 cache *ramcache.Ramcache 17} 18 19func 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 28func (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 43func (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 55func (c *TrackCache) Delete(key keybase1.TrackToken) error { 56 return c.cache.Delete(string(key)) 57} 58 59func (c *TrackCache) Shutdown() { 60 c.cache.Shutdown() 61} 62