show-rss/src/slow/reader.go

40 lines
584 B
Go

package slow
import (
"context"
"io"
"golang.org/x/time/rate"
)
type Reader struct {
ctx context.Context
limiter *rate.Limiter
r io.Reader
}
var _ io.Reader = Reader{}
func NewReader(ctx context.Context, bps rate.Limit, r io.Reader) Reader {
return Reader{
ctx: ctx,
limiter: rate.NewLimiter(bps, 8192),
r: r,
}
}
func (r Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
m := 0
burst := r.limiter.Burst()
for m < n {
if err := r.limiter.WaitN(r.ctx, burst); err != nil {
return n, err
}
m += burst
}
return n, err
}