-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathwriters.go
More file actions
56 lines (45 loc) · 954 Bytes
/
writers.go
File metadata and controls
56 lines (45 loc) · 954 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package dl
import (
"context"
"io"
"golang.org/x/time/rate"
)
type offsetWriter struct {
w io.WriterAt
offset int64
}
func (ow *offsetWriter) Write(p []byte) (int, error) {
n, err := ow.w.WriteAt(p, ow.offset)
ow.offset += int64(n)
return n, err
}
type rateLimitedWriter struct {
w io.Writer
limiter *rate.Limiter
ctx context.Context
}
func (rl *rateLimitedWriter) Write(p []byte) (int, error) {
if rl.limiter == nil {
return rl.w.Write(p)
}
written := 0
for written < len(p) {
chunkSize := 16 * 1024
if chunkSize > len(p)-written {
chunkSize = len(p) - written
}
if err := rl.limiter.WaitN(rl.ctx, chunkSize); err != nil {
return written, err
}
n, err := rl.w.Write(p[written : written+chunkSize])
written += n
if err != nil {
return written, err
}
}
return written, nil
}
type WriterFunc func([]byte) (int, error)
func (f WriterFunc) Write(p []byte) (int, error) {
return f(p)
}