@jobkaehenry/whisper-fetch
v1.0.0
Published
Idle-aware, resumable background prefetch (Range + Abort) with OPFS/IDB storage. Next.js ready.
Maintainers
Readme
Whisper Fetch
더 나은 UX를 위해 대용량 파일을 네트워크 아이들 상태에서 백그라운드에서 청크로 프리패치하는 라이브러리. Idle-aware, resumable background prefetch (Range + Abort) with OPFS/IDB storage. Next.js ready.
Features
- Pause on foreground network activity; resume on idle
- Adaptive chunk (512KB–4MB) + Range resume
- OPFS streaming (Chrome) / IndexedDB fallback
- SHA-256 integrity (optional)
- Next.js CSR safe (SSR guarded)
Installation
npm install @jobkaehenry/whisper-fetchQuick Start
import { BackgroundPrefetcher } from '@jobkaehenry/whisper-fetch';
const prefetch = new BackgroundPrefetcher({ url: 'https://cdn/.../file.bin' });
prefetch.start();React:
import { usePrefetcher } from '@jobkaehenry/whisper-fetch/react';
const { progress, status, objectURL } = usePrefetcher({ url: '...' });Options
allowOnCellular(default false): Allow prefetch on cellular networksrespectSaveData(default true): Respect user's data saver modeminDownlinkMbps(default 2): Minimum network speedchunkSizeomit → adaptive based on networkintegritySha256for on-complete verificationstore: 'opfs' | 'idb' (default 'opfs' with fallback)
API
new BackgroundPrefetcher(opts)url: stringTarget file URLallowOnCellular?: booleanrespectSaveData?: booleanminDownlinkMbps?: numberchunkSize?: numberintegritySha256?: stringonProgress?: (downloaded: number, total?: number) => voidonStatus?: (status: 'started'|'paused'|'resumed'|'stopped'|'completed'|'error', error?: any) => void
start(): Promise<void>Begin background prefetch respecting idle.pause(): voidPause immediately.resume(): Promise<void>Resume respecting idle.stop(): voidStop and cleanup.getObjectURL(): Promise<string|null>Assembled Blob URL if available.
Events
startedPrefetch loop began.pausedSuspended due to foreground activity or manual pause.resumedResumed after idle.completedAll bytes fetched and assembled.stoppedStopped bystop().errorIrrecoverable error occurred.
Server Requirements
- HTTP Range support (206 Partial Content)
- ETag/If-Range recommended for safe resume
React Hook
import { usePrefetcher } from '@jobkaehenry/whisper-fetch/react';
const { status, progress, start, pause, resume, stop, objectURL } = usePrefetcher({
url: 'https://cdn/.../file.bin',
integritySha256: '...optional...'
});Advanced
- Storage: OPFS first (Chrome), fallback to IDB chunk-append + assemble.
- Integrity: If
integritySha256provided, SHA-256 verified on assembled Blob. - Idle-aware: Defers when foreground network activity detected; resumes on idle.
- Resume: Uses Range with adaptive chunk size to continue from last offset.
Testing
Run tests with:
npm testE2E (Playwright) after installing dev deps:
npm run build
npx playwright testBrowser Support
- Chrome 114+ (OPFS streaming). Other modern browsers supported via IDB fallback.
License
MIT
