Zackriya-Solutions/meetily · error · anyhow::Error

Download timeout for {}: no data received for 30 seconds

Error message

Download timeout for {}: no data received for 30 seconds

What it means

Raised when a Parakeet artifact download stream yields no data for 30 seconds: `timeout(Duration::from_secs(30), stream.next())` returns `Err(_)` (elapsed). The engine first flushes the BufWriter to persist received bytes for HTTP-Range resume, then returns this timeout error describing the stalled filename. This is the expected user-facing outcome of a stalled transfer when the partial file could still be preserved.

Source

Thrown at frontend/src-tauri/src/parakeet_engine/parakeet_engine.rs:1013

            let mut stream = response.bytes_stream();

            loop {
                let next_chunk = tokio::select! {
                    biased;
                    _ = active_download.cancellation.cancelled() => {
                        writer.flush().await.map_err(|error| {
                            anyhow!("Failed to preserve {} during cancellation: {}", artifact.filename, error)
                        })?;
                        return Err(DownloadCancelled.into());
                    }
                    chunk = timeout(Duration::from_secs(30), stream.next()) => chunk,
                };
                let chunk = match next_chunk {
                    Err(_) => {
                        writer.flush().await.map_err(|error| {
                            anyhow!("Failed to preserve {} after timeout: {}", artifact.filename, error)
                        })?;
                        return Err(anyhow!(
                            "Download timeout for {}: no data received for 30 seconds",
                            artifact.filename
                        ));
                    }
                    Ok(None) => break,
                    Ok(Some(Err(error))) => {
                        writer.flush().await.map_err(|flush_error| {
                            anyhow!(
                                "Failed to preserve {} after stream error: {}",
                                artifact.filename,
                                flush_error
                            )
                        })?;
                        return Err(anyhow!("Download stream failed for {}: {}", artifact.filename, error));
                    }
                    Ok(Some(Ok(chunk))) => chunk,
                };

View on GitHub (pinned to a2cb62e827)

Solutions

  1. Retry the download — the partial file is preserved and the next attempt resumes from the received byte offset with a Range request.
  2. Check the network path: disable idle-timeout proxies/VPN split tunneling, keep the machine awake during download.
  3. If your connection is reliably slow-but-alive (long TTFB between chunks), the 30 s window is aggressive — increase it or add automatic retry around the engine call.
  4. Verify the artifact URL/CDN is healthy; if a mirror is down, switch network or wait and retry.
  5. For fully offline setups, pre-place the model files manually in the models directory so no download is needed.

Example fix

// caller: make stalled downloads self-healing instead of surfacing the error
let result = loop {
    match engine.download_models(&artifacts, &token).await {
        Err(e) if e.to_string().contains("no data received for 30 seconds") && !token.is_cancelled() => {
            warn!("download stalled, resuming: {e}");
            continue; // resumes from preserved partial bytes
        }
        other => break other,
    }
};
Defensive patterns

Strategy: retry

Validate before calling

// check connectivity + server liveness before kicking off a multi-GB download
if reqwest::get("https://huggingface.co").await.is_err() {
    return Err("no network access; defer model download".into());
}
// ensure room for the resume append
if free_space(&models_dir)? < artifact.exact_bytes {
    return Err("not enough disk space for artifact".into());
}

Try / catch

match engine.download_models(&artifacts, &token).await {
    Err(e) if e.to_string().contains("no data received for 30 seconds") => {
        // safe to retry: partial file preserved, next call resumes via Range
        engine.download_models(&artifacts, &token).await?;
    }
    other => other?,
}

Prevention

When it happens

Trigger: The reqwest `bytes_stream()` for the artifact receives zero chunks within 30 s during `download_models`: server stops responding mid-body, connection silently dropped (sleep/VPN/wifi loss), proxy keeps the socket open but sends nothing, or CDN throttles to a stall. Unlike error 42, this is returned when the preservation flush succeeds.

Common situations: Slow or intermittent internet during a multi-hundred-MB model download; laptop sleep/resume breaking the TCP connection without erroring the stream; corporate firewall idle-timeout on long transfers; Hugging Face CDN hiccup.

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


AI-assisted analysis of Zackriya-Solutions/meetily@a2cb62e827 (2026-09-12). Data as JSON: /api/errors/1c49d930b62b8dfb. Report an issue: GitHub.