Stop crashed on an undeclared stopRequested variable before doing
anything. Split the single Start/Stop toggle into separate Submit and
Stop buttons, add a Download > Upload > Results stage machine, an
/upload discard endpoint, upload workers, and partial-result finalization
on stop.
feat: single/multi modes, 100GB steady-state test with origin pooling
- Replace auto/manual modes with Single (one stream) and Multi
(streams pooled across loopback origins via CORS)
- BYOB 1MiB reads, time-gated stall re-arm, 50ms progress posts
- Steady detection over 2s windows, 30s floor run
- no-cache static assets + cache-busted worker URLs
feat: worker-based ranged downloads with connection auto-tune
- /download serves any byte range of a 1 TB virtual file (sendfile,
repeated binary); new /hold endpoint for browser cap detection
- download-worker.js: per-stream worker pulling endless ranges with
stall watchdog and graceful stop
- tune-worker.js: auto-tune off the UI thread - warmup, stream-count
sweep, confirmation; steps end on steady-state detection (median
window within 2%) with max-time fallback; one 100 GB range per
stream so request overhead stays out of the measurement
- app.js: Auto-tune/Manual modes, wave-based connection cap probe,
gauge integration, verdict + per-step results
feat: download speed meter with parallel chunk testing