sing/common/replay/simple.go
2022-05-25 14:13:18 +08:00

47 lines
861 B
Go

package replay
import (
"sync"
"time"
)
type SimpleFilter struct {
access sync.Mutex
lastClean time.Time
timeout time.Duration
pool map[string]time.Time
}
func NewSimple(timeout time.Duration) Filter {
return &SimpleFilter{
lastClean: time.Now(),
pool: make(map[string]time.Time),
timeout: timeout,
}
}
func (f *SimpleFilter) Check(salt []byte) bool {
now := time.Now()
saltStr := string(salt)
f.access.Lock()
defer f.access.Unlock()
var exists bool
if now.Sub(f.lastClean) > f.timeout {
for oldSum, added := range f.pool {
if now.Sub(added) > f.timeout {
delete(f.pool, oldSum)
}
}
_, exists = f.pool[saltStr]
f.lastClean = now
} else {
if added, loaded := f.pool[saltStr]; loaded && now.Sub(added) <= f.timeout {
exists = true
}
}
if !exists {
f.pool[saltStr] = now
}
return !exists
}