#![allow(dead_code, unused)]
use fetch_happen::{Client, Error, Result};
use wasm_bindgen::prelude::*;
use web_sys::AbortController;
async fn abortable_request() -> Result<String> {
let client = Client;
let abort_controller = AbortController::new().map_err(|e| Error::JsError(e))?;
let signal = abort_controller.signal();
let request_future = client
.get("https://api.github.com/repos/rust-lang/rust/branches/master")
.header("Accept", "application/vnd.github.v3+json")
.abort_signal(signal)
.send();
let abort_controller_clone = abort_controller.clone();
wasm_bindgen_futures::spawn_local(async move {
js_sys::Promise::new(&mut |resolve, _| {
web_sys::window()
.unwrap()
.set_timeout_with_callback_and_timeout_and_arguments_0(&resolve, 500)
.unwrap();
});
abort_controller_clone.abort();
});
match request_future.await {
Ok(response) => response.text().await,
Err(Error::Aborted) => Err(Error::Aborted),
Err(e) => Err(e),
}
}
async fn request_with_timeout(timeout_ms: i32) -> Result<String> {
let client = Client;
let abort_controller = AbortController::new().map_err(|e| Error::JsError(e))?;
let signal = abort_controller.signal();
let abort_controller_clone = abort_controller.clone();
let timeout_handle = web_sys::window()
.unwrap()
.set_timeout_with_callback_and_timeout_and_arguments_0(
&js_sys::Function::new_no_args(&format!(
"(() => {{ const controller = arguments[0]; controller.abort(); }})"
))
.bind1(&JsValue::undefined(), &abort_controller_clone),
timeout_ms,
)
.map_err(|e| Error::JsError(e))?;
let result = client
.get("https://api.github.com/repos/rust-lang/rust/branches/master")
.signal(signal)
.send()
.await;
web_sys::window()
.unwrap()
.clear_timeout_with_handle(timeout_handle);
match result {
Ok(response) => response.text().await,
Err(e) => Err(e),
}
}
async fn multiple_requests_with_shared_abort() -> Result<()> {
let client = Client;
let abort_controller = AbortController::new().map_err(|e| Error::JsError(e))?;
let signal = abort_controller.signal();
let request1 = client
.get("https://api.github.com/repos/rust-lang/rust")
.signal(signal.clone())
.send();
let request2 = client
.get("https://api.github.com/repos/rust-lang/cargo")
.signal(signal.clone())
.send();
let request3 = client
.get("https://api.github.com/repos/rust-lang/rustup")
.signal(signal)
.send();
let (result1, result2, result3) = futures::join!(request1, request2, request3);
match (result1, result2, result3) {
(Ok(_), Ok(_), Ok(_)) => Ok(()),
_ => Err(Error::JsError(JsValue::from_str(
"One or more requests failed",
))),
}
}
fn main() {}