[go: up one dir, main page]

worker/
global.rs

1use std::ops::Deref;
2
3use wasm_bindgen::JsCast;
4use wasm_bindgen_futures::JsFuture;
5
6use crate::{request::Request, response::Response, AbortSignal, Result};
7
8/// Construct a Fetch call from a URL string or a Request object. Call its `send` method to execute
9/// the request.
10#[derive(Debug)]
11pub enum Fetch {
12    Url(url::Url),
13    Request(Request),
14}
15
16impl Fetch {
17    /// Execute a Fetch call and receive a Response.
18    pub async fn send(&self) -> Result<Response> {
19        match self {
20            Fetch::Url(url) => fetch_with_str(url.as_ref(), None).await,
21            Fetch::Request(req) => fetch_with_request(req, None).await,
22        }
23    }
24
25    /// Execute a Fetch call and receive a Response.
26    pub async fn send_with_signal(&self, signal: &AbortSignal) -> Result<Response> {
27        match self {
28            Fetch::Url(url) => fetch_with_str(url.as_ref(), Some(signal)).await,
29            Fetch::Request(req) => fetch_with_request(req, Some(signal)).await,
30        }
31    }
32}
33
34async fn fetch_with_str(url: &str, signal: Option<&AbortSignal>) -> Result<Response> {
35    let init = web_sys::RequestInit::new();
36    init.set_signal(signal.map(|x| x.deref()));
37
38    let worker: web_sys::WorkerGlobalScope = js_sys::global().unchecked_into();
39    let promise = worker.fetch_with_str_and_init(url, &init);
40    let resp = JsFuture::from(promise).await?;
41    let resp: web_sys::Response = resp.dyn_into()?;
42    Ok(resp.into())
43}
44
45async fn fetch_with_request(request: &Request, signal: Option<&AbortSignal>) -> Result<Response> {
46    let init = web_sys::RequestInit::new();
47    init.set_signal(signal.map(|x| x.deref()));
48
49    let worker: web_sys::WorkerGlobalScope = js_sys::global().unchecked_into();
50    let req = request.inner();
51    let promise = worker.fetch_with_request_and_init(req, &init);
52    let resp = JsFuture::from(promise).await?;
53    let edge_response: web_sys::Response = resp.dyn_into()?;
54    Ok(edge_response.into())
55}