diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 50b4031..4599975 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -641,8 +641,10 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" name = "cultivation" version = "0.1.0" dependencies = [ + "futures-util", "hudsucker", "opener", + "reqwest", "rustls-pemfile", "serde", "serde_json", @@ -861,6 +863,15 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "error-chain" version = "0.12.4" @@ -1384,6 +1395,31 @@ dependencies = [ "syn", ] +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util 0.7.1", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + [[package]] name = "heck" version = "0.3.3" @@ -1484,7 +1520,7 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-tungstenite", - "tokio-util", + "tokio-util 0.7.1", "tracing", ] @@ -1498,6 +1534,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", + "h2", "http", "http-body", "httparse", @@ -1526,6 +1563,19 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "hyper-tungstenite" version = "0.6.0" @@ -1584,6 +1634,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "indexmap" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "infer" version = "0.7.0" @@ -1611,6 +1671,12 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + [[package]] name = "itertools" version = "0.10.3" @@ -1867,6 +1933,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2799,6 +2871,43 @@ dependencies = [ "winapi", ] +[[package]] +name = "reqwest" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tokio-util 0.6.9", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rfd" version = "0.8.2" @@ -3737,6 +3846,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.23.4" @@ -3764,6 +3883,20 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.1" @@ -3775,6 +3908,7 @@ dependencies = [ "futures-sink", "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -4499,6 +4633,15 @@ version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + [[package]] name = "winres" version = "0.1.12" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 27b1dd8..5a17589 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -24,6 +24,8 @@ tracing = "0.1.34" tokio-rustls = "0.23.4" tokio-tungstenite = "0.17.1" rustls-pemfile = "1.0.0" +reqwest = { version = "0.11.3", features = ["stream"] } +futures-util = "0.3.14" [features] # by default Tauri runs in production mode diff --git a/src-tauri/src/downloader.rs b/src-tauri/src/downloader.rs new file mode 100644 index 0000000..a143507 --- /dev/null +++ b/src-tauri/src/downloader.rs @@ -0,0 +1,43 @@ +use std::cmp::min; +use std::fs::File; +use std::io::Write; + +use futures_util::StreamExt; + +use tauri::{ + command, + Event +}; + +// Lots of help from: https://gist.github.com/giuliano-oliveira/4d11d6b3bb003dba3a1b53f43d81b30d +// and docs ofc + +#[tauri::command] +pub async fn download_file(url: &str, path: &str) -> Result<(), String> { + // Reqwest setup + let res = reqwest::get(url).await.or(Err(format!("Failed to get {}", url)))?; + let total_size = res + .content_length() + .ok_or(format!("Failed to get content length from '{}'", &url))?; + + // Create file path + let mut file = File::create(path).or(Err(format!("Failed to create file '{}'", path)))?; + let mut downloaded: u64 = 0; + + // File stream + let mut stream = res.bytes_stream(); + + // Await chunks + while let Some(item) = stream.next().await { + let chunk = item.or(Err(format!("Error while downloading file"))); + // Write chunk + file.write_all(&chunk) + .or(Err(format!("Error while writing to file")))?; + // New progress + let new = min(downloaded + (chunk.len() as u64), total_size); + downloaded = new; + } + + // We are done + return Ok(()); +} \ No newline at end of file diff --git a/src/utils/download.ts b/src/utils/download.ts new file mode 100644 index 0000000..e535c8b --- /dev/null +++ b/src/utils/download.ts @@ -0,0 +1,5 @@ +export default class DownloadHandler { + constructor() { + console.log('AAAAAAAAAAAAAAAAAAAAA') + } +} \ No newline at end of file