1use std::ops::Deref;
2
3use wasm_bindgen::JsValue;
4
5#[derive(Debug)]
7pub struct AbortController {
8 inner: web_sys::AbortController,
9}
10
11impl AbortController {
12 pub fn signal(&self) -> AbortSignal {
14 AbortSignal::from(self.inner.signal())
15 }
16
17 pub fn abort(self) {
19 self.inner.abort()
20 }
21
22 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#[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 pub fn aborted(&self) -> bool {
50 self.inner.aborted()
51 }
52
53 pub fn reason(&self) -> Option<JsValue> {
55 self.aborted().then(|| self.inner.reason())
56 }
57
58 pub fn abort() -> Self {
60 Self::from(web_sys::AbortSignal::abort())
61 }
62
63 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}