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 }