Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/bootstrap/stream_limit.go
1560 views
1
package bootstrap
2
3
import (
4
"context"
5
"github.com/alist-org/alist/v3/internal/conf"
6
"github.com/alist-org/alist/v3/internal/op"
7
"github.com/alist-org/alist/v3/internal/setting"
8
"github.com/alist-org/alist/v3/internal/stream"
9
"golang.org/x/time/rate"
10
)
11
12
type blockBurstLimiter struct {
13
*rate.Limiter
14
}
15
16
func (l blockBurstLimiter) WaitN(ctx context.Context, total int) error {
17
for total > 0 {
18
n := l.Burst()
19
if l.Limiter.Limit() == rate.Inf || n > total {
20
n = total
21
}
22
err := l.Limiter.WaitN(ctx, n)
23
if err != nil {
24
return err
25
}
26
total -= n
27
}
28
return nil
29
}
30
31
func streamFilterNegative(limit int) (rate.Limit, int) {
32
if limit < 0 {
33
return rate.Inf, 0
34
}
35
return rate.Limit(limit) * 1024.0, limit * 1024
36
}
37
38
func initLimiter(limiter *stream.Limiter, s string) {
39
clientDownLimit, burst := streamFilterNegative(setting.GetInt(s, -1))
40
*limiter = blockBurstLimiter{Limiter: rate.NewLimiter(clientDownLimit, burst)}
41
op.RegisterSettingChangingCallback(func() {
42
newLimit, newBurst := streamFilterNegative(setting.GetInt(s, -1))
43
(*limiter).SetLimit(newLimit)
44
(*limiter).SetBurst(newBurst)
45
})
46
}
47
48
func InitStreamLimit() {
49
initLimiter(&stream.ClientDownloadLimit, conf.StreamMaxClientDownloadSpeed)
50
initLimiter(&stream.ClientUploadLimit, conf.StreamMaxClientUploadSpeed)
51
initLimiter(&stream.ServerDownloadLimit, conf.StreamMaxServerDownloadSpeed)
52
initLimiter(&stream.ServerUploadLimit, conf.StreamMaxServerUploadSpeed)
53
}
54
55