use wasm_bindgen::prelude::*;
#[derive(Clone, Debug, thiserror::Error)]
pub enum Error {
#[error("webtransport session error: {0:?}")]
Session(web_sys::WebTransportError),
#[error("webtransport stream error: {0:?}")]
Stream(web_sys::WebTransportError),
#[error("web streams error: {0:?}")]
Streams(#[from] web_streams::Error),
#[error("unknown error: {0:?}")]
Unknown(JsValue),
}
impl Error {
pub fn code(&self) -> Option<u8> {
match self {
Error::Session(e) | Error::Stream(e) => e.stream_error_code(),
_ => None,
}
}
}
impl From<JsValue> for Error {
fn from(v: JsValue) -> Self {
if let Some(e) = v.dyn_ref::<web_sys::WebTransportError>().cloned() {
match e.source() {
web_sys::WebTransportErrorSource::Stream => Error::Stream(e),
web_sys::WebTransportErrorSource::Session => Error::Session(e),
_ => Error::Unknown(v),
}
} else {
Error::Unknown(v)
}
}
}