0a681f864f
The queue/scheduler lived only in renderer memory, so saved/scheduled and other pending downloads were silently lost on quit (audit M4). Persist them: - main: queue.ts store (proven cached-atomic createJsonStore, queue.json) + queue:list / queue:save IPC; QUEUE_MAX cap. - shared: PersistedQueueItem = the durable subset of DownloadItem (runtime-only progress/speed/eta/sizeLabel/finishing dropped). - renderer: mirror the persistable items on every queue change (a signature over the subset means progress ticks don't re-save; main's jsonStore coalesces the writes) and rehydrate on launch via an App useEffect. Pure mappers extracted to store/queuePersist.ts and unit-tested. Restore semantics: downloading -> queued (yt-dlp continues the .part), saved + scheduledFor survives so the promoter fires when due, paused/error return actionable; completed/canceled are never persisted. A queueHydrated gate stops a launch-time store change from wiping queue.json before it's read. Reconciles ROADMAP.md. typecheck + 268 tests + eslint + prettier green. (OS-level quit/relaunch cycle is worth a manual smoke test.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
68 lines
3.1 KiB
TypeScript
68 lines
3.1 KiB
TypeScript
/**
|
|
* Central home for the main-process timeouts, buffer sizes, and store caps that
|
|
* were previously scattered as bare literals across the spawn/probe/index/store
|
|
* modules (L10). Collecting them here makes the operational envelope reviewable
|
|
* in one place and stops the same "how long / how big" decision drifting between
|
|
* modules. Values that are already single-sourced in the shared contract
|
|
* (e.g. HISTORY_MAX_ENTRIES) stay there; this file is for the main-only ones.
|
|
*/
|
|
|
|
// --- Child-process timeouts (ms) --------------------------------------------
|
|
|
|
/** `<binary> -version` probes (yt-dlp, ffmpeg, ffprobe) — a quick liveness call. */
|
|
export const VERSION_TIMEOUT_MS = 15_000
|
|
/** yt-dlp self-update run — can pull a fresh binary, so a touch longer. */
|
|
export const YTDLP_UPDATE_TIMEOUT_MS = 60_000
|
|
/** Best-effort metadata --print alongside a download (title/uploader/duration). */
|
|
export const META_PROBE_TIMEOUT_MS = 30_000
|
|
/** Full format/metadata probe (`-J`) for the download bar. */
|
|
export const PROBE_TIMEOUT_MS = 60_000
|
|
/** Channel/playlist indexing walk — a big channel legitimately takes minutes. */
|
|
export const INDEX_TIMEOUT_MS = 180_000
|
|
/** RSS feed fetch for a watched source's new-item check. */
|
|
export const FEED_FETCH_TIMEOUT_MS = 15_000
|
|
|
|
/**
|
|
* Idle watchdog for a running download: if a spawned yt-dlp emits no stdout or
|
|
* stderr for this long, treat it as wedged and kill it so the concurrency slot
|
|
* frees (B1). Generous on purpose so a long, output-less post-processing step
|
|
* (e.g. a large ffmpeg merge) isn't mistaken for a stall.
|
|
*/
|
|
export const STALL_TIMEOUT_MS = 5 * 60_000
|
|
|
|
// --- execFile maxBuffer sizes (bytes) ---------------------------------------
|
|
// yt-dlp JSON for a big channel/format list is large; cap generously so a valid
|
|
// response is never truncated (which would look like a parse failure).
|
|
|
|
/** Metadata --print output (three short fields). */
|
|
export const META_MAX_BUFFER = 4 * 1024 * 1024
|
|
/** Single-video `-J` probe JSON. */
|
|
export const PROBE_MAX_BUFFER = 64 * 1024 * 1024
|
|
/** Whole-channel index JSON. */
|
|
export const INDEX_MAX_BUFFER = 256 * 1024 * 1024
|
|
|
|
// --- Misc ------------------------------------------------------------------
|
|
|
|
/** How much of a failed download's stderr to retain for the error message. */
|
|
export const STDERR_TAIL_BYTES = 4000
|
|
|
|
/**
|
|
* Size cap for the diagnostic log file (logger.ts, CC8). Once the live
|
|
* `aerofetch.log` passes this, it's rotated to `aerofetch.log.1` (one generation
|
|
* kept) so app logging can't fill the disk.
|
|
*/
|
|
export const LOG_MAX_BYTES = 1024 * 1024
|
|
|
|
// --- JSON-store row caps ----------------------------------------------------
|
|
// Each hand-rolled JSON store trims to its cap on write so a store file can't
|
|
// grow without bound.
|
|
|
|
/** Diagnostics error log (errorlog.json). */
|
|
export const ERRORLOG_MAX_ENTRIES = 200
|
|
/** Saved custom-command templates (templates.json). */
|
|
export const TEMPLATES_MAX = 100
|
|
/** Indexed media items across all sources (media-items.json). */
|
|
export const MEDIA_ITEMS_MAX = 20_000
|
|
/** Persisted download-queue rows (queue.json, M4) — generous; a whole channel can be queued. */
|
|
export const QUEUE_MAX = 10_000
|