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