package replaydetector
type ReplayDetector interface {
Check (seq uint64 ) (accept func (), ok bool )
}
type slidingWindowDetector struct {
latestSeq uint64
maxSeq uint64
windowSize uint
mask *fixedBigInt
}
func New (windowSize uint , maxSeq uint64 ) ReplayDetector {
return &slidingWindowDetector {
maxSeq : maxSeq ,
windowSize : windowSize ,
mask : newFixedBigInt (windowSize ),
}
}
func (d *slidingWindowDetector ) Check (seq uint64 ) (accept func (), ok bool ) {
if seq > d .maxSeq {
return func () {}, false
}
if seq <= d .latestSeq {
if d .latestSeq >= uint64 (d .windowSize )+seq {
return func () {}, false
}
if d .mask .Bit (uint (d .latestSeq -seq )) != 0 {
return func () {}, false
}
}
return func () {
if seq > d .latestSeq {
d .mask .Lsh (uint (seq - d .latestSeq ))
d .latestSeq = seq
}
diff := (d .latestSeq - seq ) % d .maxSeq
d .mask .SetBit (uint (diff ))
}, true
}
func WithWrap (windowSize uint , maxSeq uint64 ) ReplayDetector {
return &wrappedSlidingWindowDetector {
maxSeq : maxSeq ,
windowSize : windowSize ,
mask : newFixedBigInt (windowSize ),
}
}
type wrappedSlidingWindowDetector struct {
latestSeq uint64
maxSeq uint64
windowSize uint
mask *fixedBigInt
init bool
}
func (d *wrappedSlidingWindowDetector ) Check (seq uint64 ) (accept func (), ok bool ) {
if seq > d .maxSeq {
return func () {}, false
}
if !d .init {
if seq != 0 {
d .latestSeq = seq - 1
} else {
d .latestSeq = d .maxSeq
}
d .init = true
}
diff := int64 (d .latestSeq ) - int64 (seq )
if diff > int64 (d .maxSeq )/2 {
diff -= int64 (d .maxSeq + 1 )
} else if diff <= -int64 (d .maxSeq )/2 {
diff += int64 (d .maxSeq + 1 )
}
if diff >= int64 (d .windowSize ) {
return func () {}, false
}
if diff >= 0 {
if d .mask .Bit (uint (diff )) != 0 {
return func () {}, false
}
}
return func () {
if diff < 0 {
d .mask .Lsh (uint (-diff ))
d .latestSeq = seq
}
d .mask .SetBit (uint (d .latestSeq - seq ))
}, true
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .