531f0b58ae
Add uploadStream + downloadStream to the Google Drive provider so book files sync straight from/to disk instead of buffering the whole file in the JS heap. Marshaling a large book across the WebView<->Rust bridge as a single Uint8Array crashes the renderer on mobile, so book sync over Drive was effectively desktop-only; this unlocks it on Android/iOS and keeps the heap flat for gigabyte-scale PDFs on desktop too. - driveRest.ts: resumableCreateUrl / resumableUpdateUrl builders. - GoogleDriveProvider: uploadStream opens a Drive resumable session (POST new / PATCH existing; metadata in the initiation, so no reparent follow-up), then PUTs the bytes to the one-time session URI via the native upload plugin (tauriUpload). downloadStream GETs alt=media to disk via tauriDownload with a bearer token. Attached on Tauri only; web keeps the buffered fallback. Both swallow to false per the provider contract (engine retries once). Reuses @tauri-apps/plugin-upload already shipped for WebDAV streaming; no new native code. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>