[go: up one dir, main page]

worker/
abort.rs

1use std::ops::Deref;
2
3use wasm_bindgen::JsValue;
4
5/// An interface that allows you to abort in-flight [Fetch](crate::Fetch) requests.
6#[derive(Debug)]
7pub struct AbortController {
8    inner: web_sys::AbortController,
9}
10
11impl AbortController {
12    /// Gets a [AbortSignal] which can be passed to a cancellable operation.
13    pub fn signal(&self) -> AbortSignal {
14        AbortSignal::from(self.inner.signal())
15    }
16
17    /// Aborts any operation using a [AbortSignal] created from this controller.
18    pub fn abort(self) {
19        self.inner.abort()
20    }
21
22    /// Aborts any operation using a [AbortSignal] created from this controller with the provided
23    /// reason.
24    pub fn abort_with_reason(self, reason: impl Into<JsValue>) {
25        self.inner.abort_with_reason(&reason.into())
26    }
27}
28
29impl Default for AbortController {
30    fn default() -> Self {
31        Self {
32            inner: web_sys::AbortController::new().unwrap(),
33        }
34    }
35}
36
37/// An interface representing a signal that can be passed to cancellable operations, primarily a
38/// [Fetch](crate::Fetch) request.
39#[derive(Debug, Clone)]
40pub struct AbortSignal {
41    inner: web_sys::AbortSignal,
42}
43
44unsafe impl Send for AbortSignal {}
45unsafe impl Sync for AbortSignal {}
46
47impl AbortSignal {
48    /// A [bool] indicating if the operation that the signal is used for has been aborted.
49    pub fn aborted(&self) -> bool {
50        self.inner.aborted()
51    }
52
53    /// The reason why the signal was aborted.
54    pub fn reason(&self) -> Option<JsValue> {
55        self.aborted().then(|| self.inner.reason())
56    }
57
58    /// Creates a [AbortSignal] that is already aborted.
59    pub fn abort() -> Self {
60        Self::from(web_sys::AbortSignal::abort())
61    }
62
63    /// Creates a [AbortSignal] that is already aborted with the provided reason.
64    pub fn abort_with_reason(reason: impl Into<JsValue>) -> Self {
65        let reason = reason.into();
66        Self::from(web_sys::AbortSignal::abort_with_reason(&reason))
67    }
68
69    #[cfg(feature = "http")]
70    pub(crate) fn inner(&self) -> &web_sys::AbortSignal {
71        &self.inner
72    }
73}
74
75impl From<web_sys::AbortSignal> for AbortSignal {
76    fn from(inner: web_sys::AbortSignal) -> Self {
77        Self { inner }
78    }
79}
80
81impl Deref for AbortSignal {
82    type Target = web_sys::AbortSignal;
83
84    fn deref(&self) -> &Self::Target {
85        &self.inner
86    }
87}