From ebe0e426bf80705f4a163e33518a626e7d92e213 Mon Sep 17 00:00:00 2001 From: saltbo Date: Sat, 6 Jun 2026 02:29:35 -0400 Subject: [PATCH] fix(downloader): stabilize docker runtime validation --- Dockerfile | 2 +- cmd/internal/engine/aria2.go | 9 ++++++++ cmd/internal/engine/engine_test.go | 33 ++++++++++++++++++++++++++++++ deploy/docker-compose.rustfs.yml | 8 +++++++- deploy/docker-compose.yml | 8 +++++++- docker-compose.yml | 8 +++++++- 6 files changed, 64 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index f5323b66..07d592a9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ COPY . . RUN pnpm build:node \ - && pnpm prune --prod + && pnpm prune --prod --ignore-scripts FROM golang:1.25 AS cli-builder WORKDIR /app/cmd diff --git a/cmd/internal/engine/aria2.go b/cmd/internal/engine/aria2.go index 809be1e7..bb17c068 100644 --- a/cmd/internal/engine/aria2.go +++ b/cmd/internal/engine/aria2.go @@ -125,6 +125,9 @@ func (a Aria2) Check(ctx context.Context) error { } func (a Aria2) ResetTask(ctx context.Context, task client.DownloadTask) error { + if task.SourceType() == "http" { + return HTTP{Dir: a.Dir}.ResetTask(ctx, task) + } aria, err := a.client(ctx) if err != nil { return err @@ -194,6 +197,9 @@ func (a Aria2) RestoreSeed(ctx context.Context, ref SeedRef) (*Seed, error) { } func (a Aria2) InspectTask(ctx context.Context, task client.DownloadTask) (TaskSnapshot, bool, error) { + if task.SourceType() == "http" { + return HTTP{Dir: a.Dir}.InspectTask(ctx, task) + } aria, err := a.client(ctx) if err != nil { return TaskSnapshot{}, false, err @@ -207,6 +213,9 @@ func (a Aria2) InspectTask(ctx context.Context, task client.DownloadTask) (TaskS } func (a Aria2) Download(ctx context.Context, task client.DownloadTask, progress Progress) (Result, error) { + if task.SourceType() == "http" { + return HTTP{Dir: a.Dir}.Download(ctx, task, progress) + } taskDir := filepath.Join(a.Dir, task.ID) if err := os.MkdirAll(taskDir, 0o755); err != nil { return Result{}, err diff --git a/cmd/internal/engine/engine_test.go b/cmd/internal/engine/engine_test.go index 1d9aa754..58e9d637 100644 --- a/cmd/internal/engine/engine_test.go +++ b/cmd/internal/engine/engine_test.go @@ -98,6 +98,39 @@ func TestHTTPRejectsMagnet(t *testing.T) { } } +func TestAria2DelegatesHTTPToBuiltin(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Length", "11") + _, _ = w.Write([]byte("hello world")) + })) + defer server.Close() + + result, err := (Aria2{ + URL: "ws://127.0.0.1:1/jsonrpc", + Dir: t.TempDir(), + }).Download( + context.Background(), + downloadTask("task-1", "http", server.URL+"/file.txt"), + func(downloaded int64, total *int64, bps int64, detail *client.DownloadTaskRuntime) error { + if detail != nil && detail.Engine != "builtin" { + t.Fatalf("expected builtin HTTP runtime detail, got %#v", detail) + } + return nil + }, + ) + + if err != nil { + t.Fatal(err) + } + data, err := os.ReadFile(result.Path) + if err != nil { + t.Fatal(err) + } + if string(data) != "hello world" { + t.Fatalf("unexpected file content: %q", string(data)) + } +} + func TestAria2StartArgsForceSaveCompletedSeeds(t *testing.T) { stateDir := t.TempDir() args, err := (Aria2{Dir: t.TempDir(), StateDir: stateDir}).startArgs("6800") diff --git a/deploy/docker-compose.rustfs.yml b/deploy/docker-compose.rustfs.yml index 175c27b9..049a9206 100644 --- a/deploy/docker-compose.rustfs.yml +++ b/deploy/docker-compose.rustfs.yml @@ -20,6 +20,12 @@ services: depends_on: rustfs: condition: service_started + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8222/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 5s + timeout: 3s + retries: 12 + start_period: 10s restart: unless-stopped downloader: @@ -34,7 +40,7 @@ services: - zpan-downloads:/downloads depends_on: zpan: - condition: service_started + condition: service_healthy restart: unless-stopped rustfs: diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 156899d1..5ef7e63d 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -13,6 +13,12 @@ services: - DATABASE_URL=/data/zpan.db volumes: - zpan-data:/data + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8222/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 5s + timeout: 3s + retries: 12 + start_period: 10s restart: unless-stopped downloader: @@ -27,7 +33,7 @@ services: - zpan-downloads:/downloads depends_on: zpan: - condition: service_started + condition: service_healthy restart: unless-stopped volumes: diff --git a/docker-compose.yml b/docker-compose.yml index 27ac4244..55e1f9b6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,12 @@ services: - DATABASE_URL=/data/zpan.db volumes: - zpan-data:/data + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8222/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 5s + timeout: 3s + retries: 12 + start_period: 10s restart: unless-stopped downloader: @@ -29,7 +35,7 @@ services: - zpan-downloads:/downloads depends_on: zpan: - condition: service_started + condition: service_healthy restart: unless-stopped volumes: