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
- Retry the download — the partial file is preserved and the next attempt resumes from the received byte offset with a Range request.
- Check the network path: disable idle-timeout proxies/VPN split tunneling, keep the machine awake during download.
- 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.
- Verify the artifact URL/CDN is healthy; if a mirror is down, switch network or wait and retry.
- 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
- Retry automatically on this timeout — resume logic makes retries cheap and idempotent
- Prevent laptop sleep mid-download (caffeinate / power settings) so TCP connections survive
- Use a stable connection for multi-hundred-MB model downloads; avoid captive-portal wifi
- Check the CDN URL is reachable (HEAD request) before starting
- For offline machines, install model files manually into the models directory
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.
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- Failed to preserve {} after timeout: {}
- Failed to preserve {} after stream error: {}
- Download timeout - No data received for 30 seconds
- {}: {}
- Failed to start download: {}
AI-assisted analysis of Zackriya-Solutions/meetily@a2cb62e827 (2026-09-12).
Data as JSON: /api/errors/1c49d930b62b8dfb.
Report an issue: GitHub.