You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
795 B
49 lines
795 B
11 months ago
|
package token
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type (
|
||
|
Store interface {
|
||
|
Set(key string, val any, duration time.Duration) error
|
||
|
Get(key string) (any, bool)
|
||
|
}
|
||
|
node struct {
|
||
|
data any
|
||
|
expired time.Time
|
||
|
}
|
||
|
defaultStore struct {
|
||
|
idMap map[string]*node
|
||
|
lock sync.RWMutex
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func (d *defaultStore) Get(key string) (any, bool) {
|
||
|
d.lock.RLock()
|
||
|
defer d.lock.RUnlock()
|
||
|
if v, ok := d.idMap[key]; ok {
|
||
|
if time.Now().After(v.expired) {
|
||
|
return v.data, true
|
||
|
}
|
||
|
}
|
||
|
return nil, false
|
||
|
}
|
||
|
|
||
|
func (d *defaultStore) Set(key string, val any, duration time.Duration) error {
|
||
|
d.lock.Lock()
|
||
|
defer d.lock.Unlock()
|
||
|
d.idMap[key] = &node{
|
||
|
data: val,
|
||
|
expired: time.Now().Add(duration),
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func newStore() Store {
|
||
|
return &defaultStore{
|
||
|
idMap: make(map[string]*node),
|
||
|
}
|
||
|
}
|