8000 feat(115_open): implement rate limiting for API requests · AlistGo/alist@630cf30 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 630cf30

Browse files
committed
feat(115_open): implement rate limiting for API requests
1 parent bc5117f commit 630cf30

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

drivers/115_open/driver.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ import (
1616
"github.com/alist-org/alist/v3/internal/op"
1717
"github.com/alist-org/alist/v3/pkg/utils"
1818
sdk "github.com/xhofe/115-sdk-go"
19+
"golang.org/x/time/rate"
1920
)
2021

2122
type Open115 struct {
2223
model.Storage
2324
Addition
24-
client *sdk.Client
25+
client *sdk.Client
26+
limiter *rate.Limiter
2527
}
2628

2729
func (d *Open115) Config() driver.Config {
@@ -47,6 +49,16 @@ func (d *Open115) Init(ctx context.Context) error {
4749
if err != nil {
4850
return err
4951
}
52+
if d.Addition.LimitRate > 0 {
53+
d.limiter = rate.NewLimiter(rate.Limit(d.Addition.LimitRate), 1)
54+
}
55+
return nil
56+
}
57+
58+
func (d *Open115) WaitLimit(ctx context.Context) error {
59+
if d.limiter != nil {
60+
return d.limiter.Wait(ctx)
61+
}
5062
return nil
5163
}
5264

@@ -59,6 +71,9 @@ func (d *Open115) List(ctx context.Context, dir model.Obj, args model.ListArgs)
5971
pageSize := int64(200)
6072
offset := int64(0)
6173
for {
74+
if err := d.WaitLimit(ctx); err != nil {
75+
return nil, err
76+
}
6277
resp, err := d.client.GetFiles(ctx, &sdk.GetFilesReq{
6378
CID: dir.GetID(),
6479
Limit: pageSize,
@@ -84,6 +99,9 @@ func (d *Open115) List(ctx context.Context, dir model.Obj, args model.ListArgs)
8499
}
85100

86101
func (d *Open115) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
102+
if err := d.WaitLimit(ctx); err != nil {
103+
return nil, err
104+
}
87105
var ua string
88106
if args.Header != nil {
89107
ua = args.Header.Get("User-Agent")
@@ -113,11 +131,13 @@ func (d *Open115) Link(ctx context.Context, file model.Obj, args model.LinkArgs)
113131
}
114132

115133
func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) {
134+
if err := d.WaitLimit(ctx); err != nil {
135+
return nil, err
136+
}
116137
resp, err := d.client.Mkdir(ctx, parentDir.GetID(), dirName)
117138
if err != nil {
118139
return nil, err
119140
}
120-
time.Sleep(800 * time.Millisecond)
121141
return &Obj{
122142
Fid: resp.FileID,
123143
Pid: parentDir.GetID(),
@@ -130,6 +150,9 @@ func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, dirName stri
130150
}
131151

132152
func (d *Open115) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) {
153+
if err := d.WaitLimit(ctx); err != nil {
154+
return nil, err
155+
}
133156
_, err := d.client.Move(ctx, &sdk.MoveReq{
134157
FileIDs: srcObj.GetID(),
135158
ToCid: dstDir.GetID(),
@@ -141,6 +164,9 @@ func (d *Open115) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj
141164
}
142165

143166
func (d *Open115) Rename(ctx context.Context, srcObj model.Obj, newName string) (model.Obj, error) {
167+
if err := d.WaitLimit(ctx); err != nil {
168+
return nil, err
169+
}
144170
_, err := d.client.UpdateFile(ctx, &sdk.UpdateFileReq{
145171
FileID: srcObj.GetID(),
146172
FileNma: newName,
@@ -156,6 +182,9 @@ func (d *Open115) Rename(ctx context.Context, srcObj model.Obj, newName string)
156182
}
157183

158184
func (d *Open115) Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) {
185+
if err := d.WaitLimit(ctx); err != nil {
186+
return nil, err
187+
}
159188
_, err := d.client.Copy(ctx, &sdk.CopyReq{
160189
PID: dstDir.GetID(),
161190
FileID: srcObj.GetID(),
@@ -168,6 +197,9 @@ func (d *Open115) Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj
168197
}
169198

170199
func (d *Open115) Remove(ctx context.Context, obj model.Obj) error {
200+
if err := d.WaitLimit(ctx); err != nil {
201+
return err
202+
}
171203
_obj, ok := obj.(*Obj)
172204
if !ok {
173205
return fmt.Errorf("can't convert obj")
@@ -183,6 +215,9 @@ func (d *Open115) Remove(ctx context.Context, obj model.Obj) error {
183215
}
184216

185217
func (d *Open115) Put(ctx context.Context, dstDir model.Obj, file model.FileStreamer, up driver.UpdateProgress) error {
218+
if err := d.WaitLimit(ctx); err != nil {
219+
return err
220+
}
186221
tempF, err := file.CacheFullInTempFile()
187222
if err != nil {
188223
return err

drivers/115_open/meta.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ type Addition struct {
99
// Usually one of two
1010
driver.RootID
1111
// define other
12-
RefreshToken string `json:"refresh_token" required:"true"`
13-
OrderBy string `json:"order_by" type:"select" options:"file_name,file_size,user_utime,file_type"`
14-
OrderDirection string `json:"order_direction" type:"select" options:"asc,desc"`
12+
RefreshToken string `json:"refresh_token" required:"true"`
13+
OrderBy string `json:"order_by" type:"select" options:"file_name,file_size,user_utime,file_type"`
14+
OrderDirection string `json:"order_direction" type:"select" options:"asc,desc"`
15+
LimitRate float64 `json:"limit_rate" type:"float" default:"1" help:"limit all api request rate ([limit]r/1s)"`
1516
AccessToken string
1617
}
1718

0 commit comments

Comments
 (0)
0