diff --git a/Cargo.toml b/Cargo.toml index 003be40e6..12dfa2580 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,20 +12,20 @@ repository = "https://github.com/webrtc-rs/webrtc" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -util = { package = "webrtc-util", version = "0.4.3" } -sdp = "0.2.3" -mdns = { package = "webrtc-mdns", version = "0.3.5" } -stun = "0.3.5" -turn = "0.4.0" -ice = { package = "webrtc-ice", version = "0.4.1" } -dtls = { package = "webrtc-dtls", version = "0.4.12" } -rtp = "0.4.1" -rtcp = "0.4.1" -srtp = { package = "webrtc-srtp", version = "0.5.0" } -sctp = { package = "webrtc-sctp", version = "0.3.8" } -data = { package = "webrtc-data", version = "0.2.8" } -media = { package = "webrtc-media", version = "0.2.1" } -interceptor = "0.2.3" +util = { package = "webrtc-util", version = "0.5.0" } +sdp = "0.3.0" +mdns = { package = "webrtc-mdns", version = "0.4.0" } +stun = "0.4.0" +turn = "0.5.0" +ice = { package = "webrtc-ice", version = "0.5.0" } +dtls = { package = "webrtc-dtls", version = "0.5.0" } +rtp = "0.5.0" +rtcp = "0.5.0" +srtp = { package = "webrtc-srtp", version = "0.6.0" } +sctp = { package = "webrtc-sctp", version = "0.4.0" } +data = { package = "webrtc-data", version = "0.3.0" } +media = { package = "webrtc-media", version = "0.3.0" } +interceptor = "0.3.0" tokio = { version = "1.12.0", features = ["full"] } log = "0.4.14" async-trait = "0.1.42" @@ -33,8 +33,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" rand = "0.8" bytes = "1" -thiserror = "1.0.25" -anyhow = "1.0.41" +thiserror = "1.0" waitgroup = "0.1.2" regex = "1" url = "2.2.2" @@ -53,6 +52,7 @@ clap = "2" hyper = { version = "0.14.13", features = ["full"] } signal = {path = "examples/signal" } tokio-util = "0.6.8" +anyhow = "1.0" [profile.dev] opt-level = 0 diff --git a/crates/data b/crates/data index 4235ccc0b..36dec3f08 160000 --- a/crates/data +++ b/crates/data @@ -1 +1 @@ -Subproject commit 4235ccc0bc04515b7c454ed4dd6736e798e8e2ff +Subproject commit 36dec3f083a1bd594699817478b2b409f24ec5a4 diff --git a/crates/dtls b/crates/dtls index 3c1638654..4c1602696 160000 --- a/crates/dtls +++ b/crates/dtls @@ -1 +1 @@ -Subproject commit 3c1638654ad67f79eaf044fca4e533c7fd1ee508 +Subproject commit 4c1602696095d6ba227072131a4bf3918e924bb5 diff --git a/crates/ice b/crates/ice index 2e379c828..7ff710560 160000 --- a/crates/ice +++ b/crates/ice @@ -1 +1 @@ -Subproject commit 2e379c828e00aa2b486d1f9f23ef7f64bc794104 +Subproject commit 7ff710560e239395996ddcdcec3e896c70ac9743 diff --git a/crates/interceptor b/crates/interceptor index 809e42c06..a0ee04641 160000 --- a/crates/interceptor +++ b/crates/interceptor @@ -1 +1 @@ -Subproject commit 809e42c06631ab6cc25708fd32971c2d50b202c0 +Subproject commit a0ee046419220991c37ef3880bc9588f79f6d6aa diff --git a/crates/mdns b/crates/mdns index 584cb6526..4a2d7c3a6 160000 --- a/crates/mdns +++ b/crates/mdns @@ -1 +1 @@ -Subproject commit 584cb652646d2022e75ebebec43241da81c76cc7 +Subproject commit 4a2d7c3a64a1f3cef87fa8381b5ddd4ba3d1bbbb diff --git a/crates/media b/crates/media index 5ccf0ab36..3a9b0d8d9 160000 --- a/crates/media +++ b/crates/media @@ -1 +1 @@ -Subproject commit 5ccf0ab36c133f1160371c634b31ba68b64911e5 +Subproject commit 3a9b0d8d90dc47b1c8a7132a01eb7062021ff1d5 diff --git a/crates/rtcp b/crates/rtcp index cbc3efdd8..4df3b5d28 160000 --- a/crates/rtcp +++ b/crates/rtcp @@ -1 +1 @@ -Subproject commit cbc3efdd8dba612d7ee3ab540d317681db591b27 +Subproject commit 4df3b5d28c49add8b52e303f24db809a51c47f6e diff --git a/crates/rtp b/crates/rtp index fa3858f4d..5a8d8eb58 160000 --- a/crates/rtp +++ b/crates/rtp @@ -1 +1 @@ -Subproject commit fa3858f4d186299d0ec81fd3c847f1a87e67f80d +Subproject commit 5a8d8eb585f911b925b88ab79a594efb4e1aeafa diff --git a/crates/sctp b/crates/sctp index 60ff7bfa3..16cbb5cb9 160000 --- a/crates/sctp +++ b/crates/sctp @@ -1 +1 @@ -Subproject commit 60ff7bfa31e6784e54ae4f849ac86e59d026bfd8 +Subproject commit 16cbb5cb9a514ce7e100c099d92e7af0e388b13f diff --git a/crates/sdp b/crates/sdp index cb9211d1f..c413ad73b 160000 --- a/crates/sdp +++ b/crates/sdp @@ -1 +1 @@ -Subproject commit cb9211d1fe7b5201e7185efbfc72ae2593cf69d9 +Subproject commit c413ad73b820e49093f54016068e701c7fd2cf35 diff --git a/crates/srtp b/crates/srtp index 762308844..7af52f840 160000 --- a/crates/srtp +++ b/crates/srtp @@ -1 +1 @@ -Subproject commit 762308844b1e6f90d1ff8ec787327877a9fe53e7 +Subproject commit 7af52f84024fa6421254034e90233b3a732cfcbe diff --git a/crates/stun b/crates/stun index d6e25e627..04a1b0f20 160000 --- a/crates/stun +++ b/crates/stun @@ -1 +1 @@ -Subproject commit d6e25e627c0631608c216c98103d1b8a0ea3b54e +Subproject commit 04a1b0f2042307056cc42651b76a8dba1c67aecf diff --git a/crates/turn b/crates/turn index 986cddfc0..6d2dec043 160000 --- a/crates/turn +++ b/crates/turn @@ -1 +1 @@ -Subproject commit 986cddfc0a4a6f650662a2a2afdfce3724c1f94c +Subproject commit 6d2dec04322a068d751eb9cba2fc9a5e3dc2f682 diff --git a/examples/broadcast/broadcast.rs b/examples/broadcast/broadcast.rs index ad6de6aac..2cb3df42a 100644 --- a/examples/broadcast/broadcast.rs +++ b/examples/broadcast/broadcast.rs @@ -8,7 +8,6 @@ use tokio::time::Duration; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::MediaEngine; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::RTPCodecType; use webrtc::media::rtp::rtp_receiver::RTCRtpReceiver; use webrtc::media::track::track_local::track_local_static_rtp::TrackLocalStaticRTP; @@ -18,6 +17,7 @@ use webrtc::peer::configuration::RTCConfiguration; use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; #[tokio::main] async fn main() -> Result<()> { @@ -147,7 +147,7 @@ async fn main() -> Result<()> { result = pc2.write_rtcp(&PictureLossIndication{ sender_ssrc: 0, media_ssrc, - }).await; + }).await.map_err(Into::into); } }; } @@ -157,7 +157,7 @@ async fn main() -> Result<()> { tokio::spawn(async move { // Create Track that we send video back to browser on let local_track = Arc::new(TrackLocalStaticRTP::new( - track.codec().await.capability.clone(), + track.codec().await.capability, "video".to_owned(), "webrtc-rs".to_owned(), )); @@ -166,7 +166,7 @@ async fn main() -> Result<()> { // Read RTP packets being sent to webrtc-rs while let Ok((rtp, _)) = track.read_rtp().await { if let Err(err) = local_track.write_rtp(&rtp).await { - if !Error::ErrClosedPipe.equal(&err) { + if Error::ErrClosedPipe != err { print!("output track write_rtp got error: {} and break", err); break; } else { @@ -186,7 +186,7 @@ async fn main() -> Result<()> { // This will notify you when the peer has connected/disconnected peer_connection .on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { - print!("Peer Connection State has changed: {}\n", s); + println!("Peer Connection State has changed: {}", s); Box::pin(async {}) })) .await; @@ -274,7 +274,7 @@ async fn main() -> Result<()> { // This will notify you when the peer has connected/disconnected peer_connection .on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { - print!("Peer Connection State has changed: {}\n", s); + println!("Peer Connection State has changed: {}", s); Box::pin(async {}) })) .await; diff --git a/examples/data-channels-close/data-channels-close.rs b/examples/data-channels-close/data-channels-close.rs index c480766c4..4927294c0 100644 --- a/examples/data-channels-close/data-channels-close.rs +++ b/examples/data-channels-close/data-channels-close.rs @@ -143,7 +143,7 @@ async fn main() -> Result<()> { Box::pin(async move { let d2 = Arc::clone(&d); let d_label2 = d_label.clone(); - let d_id2 = d_id.clone(); + let d_id2 = d_id; d.on_open(Box::new(move || { println!("Data channel '{}'-'{}' open. Random messages will now be sent to any connected DataChannels every 5 seconds", d_label2, d_id2); let (done_tx, mut done_rx) = tokio::sync::mpsc::channel::<()>(1); @@ -170,7 +170,7 @@ async fn main() -> Result<()> { _ = timeout.as_mut() =>{ let message = math_rand_alpha(15); println!("Sending '{}'", message); - result = d2.send_text(message).await; + result = d2.send_text(message).await.map_err(Into::into); let cnt = close_after2.fetch_sub(1, Ordering::SeqCst); if cnt <= 0 { @@ -187,7 +187,7 @@ async fn main() -> Result<()> { // Register text message handling d.on_message(Box::new(move |msg: DataChannelMessage| { let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); - print!("Message from DataChannel '{}': '{}'\n", d_label, msg_str); + println!("Message from DataChannel '{}': '{}'", d_label, msg_str); Box::pin(async {}) })).await; }) diff --git a/examples/data-channels-create/data-channels-create.rs b/examples/data-channels-create/data-channels-create.rs index ef2901456..da0dfdd68 100644 --- a/examples/data-channels-create/data-channels-create.rs +++ b/examples/data-channels-create/data-channels-create.rs @@ -131,7 +131,7 @@ async fn main() -> Result<()> { _ = timeout.as_mut() =>{ let message = math_rand_alpha(15); println!("Sending '{}'", message); - result = d2.send_text(message).await; + result = d2.send_text(message).await.map_err(Into::into); } }; } diff --git a/examples/data-channels-detach-create/data-channels-detach-create.rs b/examples/data-channels-detach-create/data-channels-detach-create.rs index 8998a6181..b40d4a220 100644 --- a/examples/data-channels-detach-create/data-channels-detach-create.rs +++ b/examples/data-channels-detach-create/data-channels-detach-create.rs @@ -226,7 +226,7 @@ async fn write_loop(d: Arc) -> Result<()> { _ = timeout.as_mut() =>{ let message = math_rand_alpha(15); println!("Sending '{}'", message); - result = d.write(&Bytes::from(message)).await; + result = d.write(&Bytes::from(message)).await.map_err(Into::into); } }; } diff --git a/examples/data-channels-detach/data-channels-detach.rs b/examples/data-channels-detach/data-channels-detach.rs index d25b5813e..e570e32a0 100644 --- a/examples/data-channels-detach/data-channels-detach.rs +++ b/examples/data-channels-detach/data-channels-detach.rs @@ -136,7 +136,7 @@ async fn main() -> Result<()> { Box::pin(async move { let d2 = Arc::clone(&d); let d_label2 = d_label.clone(); - let d_id2 = d_id.clone(); + let d_id2 = d_id; d.on_open(Box::new(move || { println!("Data channel '{}'-'{}' open.", d_label2, d_id2); @@ -235,7 +235,7 @@ async fn write_loop(d: Arc) -> Result<()> { _ = timeout.as_mut() =>{ let message = math_rand_alpha(15); println!("Sending '{}'", message); - result = d.write(&Bytes::from(message)).await; + result = d.write(&Bytes::from(message)).await.map_err(Into::into); } }; } diff --git a/examples/data-channels/data-channels.rs b/examples/data-channels/data-channels.rs index 58fba2230..c6dcfda78 100644 --- a/examples/data-channels/data-channels.rs +++ b/examples/data-channels/data-channels.rs @@ -124,7 +124,7 @@ async fn main() -> Result<()> { Box::pin(async move { let d2 = Arc::clone(&d); let d_label2 = d_label.clone(); - let d_id2 = d_id.clone(); + let d_id2 = d_id; d.on_open(Box::new(move || { println!("Data channel '{}'-'{}' open. Random messages will now be sent to any connected DataChannels every 5 seconds", d_label2, d_id2); @@ -138,7 +138,7 @@ async fn main() -> Result<()> { _ = timeout.as_mut() =>{ let message = math_rand_alpha(15); println!("Sending '{}'", message); - result = d2.send_text(message).await; + result = d2.send_text(message).await.map_err(Into::into); } }; } @@ -148,7 +148,7 @@ async fn main() -> Result<()> { // Register text message handling d.on_message(Box::new(move |msg: DataChannelMessage| { let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); - print!("Message from DataChannel '{}': '{}'\n", d_label, msg_str); + println!("Message from DataChannel '{}': '{}'", d_label, msg_str); Box::pin(async {}) })).await; }) diff --git a/examples/insertable-streams/insertable-streams.rs b/examples/insertable-streams/insertable-streams.rs index 7826c76aa..06046d4f7 100644 --- a/examples/insertable-streams/insertable-streams.rs +++ b/examples/insertable-streams/insertable-streams.rs @@ -13,7 +13,6 @@ use tokio::time::Duration; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::{MediaEngine, MIME_TYPE_VP8}; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::RTCRtpCodecCapability; use webrtc::media::track::track_local::track_local_static_sample::TrackLocalStaticSample; use webrtc::media::track::track_local::TrackLocal; @@ -22,6 +21,7 @@ use webrtc::peer::ice::ice_connection_state::RTCIceConnectionState; use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; const CIPHER_KEY: u8 = 0xAA; @@ -205,7 +205,7 @@ async fn main() -> Result<()> { // This will notify you when the peer has connected/disconnected peer_connection .on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { - print!("Peer Connection State has changed: {}\n", s); + println!("Peer Connection State has changed: {}", s); if s == RTCPeerConnectionState::Failed { // Wait until PeerConnection has had no network activity for 30 seconds or another failure. It may be reconnected using an ICE Restart. diff --git a/examples/offer-answer/answer.rs b/examples/offer-answer/answer.rs index caeb4d0db..5c8e5ebfd 100644 --- a/examples/offer-answer/answer.rs +++ b/examples/offer-answer/answer.rs @@ -149,7 +149,7 @@ async fn remote_handler(req: Request) -> Result, hyper::Err Ok(resp) => resp, Err(err) => { println!("{}", err); - return Err(err.into()); + return Err(err); } }; //println!("remote_handler Response: {}", resp.status()); @@ -348,7 +348,7 @@ async fn main() -> Result<()> { // Register channel opening handling let d2 = Arc::clone(&d); let d_label2 = d_label.clone(); - let d_id2 = d_id.clone(); + let d_id2 = d_id; d.on_open(Box::new(move || { println!("Data channel '{}'-'{}' open. Random messages will now be sent to any connected DataChannels every 5 seconds", d_label2, d_id2); Box::pin(async move { @@ -361,7 +361,7 @@ async fn main() -> Result<()> { _ = timeout.as_mut() =>{ let message = math_rand_alpha(15); println!("Sending '{}'", message); - result = d2.send_text(message).await; + result = d2.send_text(message).await.map_err(Into::into); } }; } @@ -371,7 +371,7 @@ async fn main() -> Result<()> { // Register text message handling d.on_message(Box::new(move |msg: DataChannelMessage| { let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); - print!("Message from DataChannel '{}': '{}'\n", d_label, msg_str); + println!("Message from DataChannel '{}': '{}'", d_label, msg_str); Box::pin(async{}) })).await; }) diff --git a/examples/offer-answer/offer.rs b/examples/offer-answer/offer.rs index b0760dd7a..94f283d43 100644 --- a/examples/offer-answer/offer.rs +++ b/examples/offer-answer/offer.rs @@ -315,7 +315,7 @@ async fn main() -> Result<()> { _ = timeout.as_mut() =>{ let message = math_rand_alpha(15); println!("Sending '{}'", message); - result = d2.send_text(message).await; + result = d2.send_text(message).await.map_err(Into::into); } }; } diff --git a/examples/ortc/ortc.rs b/examples/ortc/ortc.rs index d9671684c..4ab783ed1 100644 --- a/examples/ortc/ortc.rs +++ b/examples/ortc/ortc.rs @@ -104,7 +104,7 @@ async fn main() -> Result<()> { Box::pin(async move { let d2 = Arc::clone(&d); let d_label2 = d_label.clone(); - let d_id2 = d_id.clone(); + let d_id2 = d_id; d.on_open(Box::new(move || { println!("Data channel '{}'-'{}' open. Random messages will now be sent to any connected DataChannels every 5 seconds", d_label2, d_id2); @@ -116,7 +116,7 @@ async fn main() -> Result<()> { // Register text message handling d.on_message(Box::new(move |msg: DataChannelMessage| { let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); - print!("Message from DataChannel '{}': '{}'\n", d_label, msg_str); + println!("Message from DataChannel '{}': '{}'", d_label, msg_str); Box::pin(async {}) })).await; }) @@ -204,7 +204,7 @@ async fn main() -> Result<()> { let d_label = d.label().to_owned(); d.on_message(Box::new(move |msg: DataChannelMessage| { let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); - print!("Message from DataChannel '{}': '{}'\n", d_label, msg_str); + println!("Message from DataChannel '{}': '{}'", d_label, msg_str); Box::pin(async {}) })) .await; @@ -244,7 +244,7 @@ async fn handle_on_open(d: Arc) -> Result<()> { _ = timeout.as_mut() =>{ let message = math_rand_alpha(15); println!("Sending '{}'", message); - result = d.send_text(message).await; + result = d.send_text(message).await.map_err(Into::into); } }; } diff --git a/examples/play-from-disk-h264/play-from-disk-h264.rs b/examples/play-from-disk-h264/play-from-disk-h264.rs index 170aa2775..0c942c3b5 100644 --- a/examples/play-from-disk-h264/play-from-disk-h264.rs +++ b/examples/play-from-disk-h264/play-from-disk-h264.rs @@ -14,7 +14,6 @@ use tokio::time::Duration; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::{MediaEngine, MIME_TYPE_H264, MIME_TYPE_OPUS}; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::RTCRtpCodecCapability; use webrtc::media::track::track_local::track_local_static_sample::TrackLocalStaticSample; use webrtc::media::track::track_local::TrackLocal; @@ -23,6 +22,7 @@ use webrtc::peer::ice::ice_connection_state::RTCIceConnectionState; use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; #[tokio::main] async fn main() -> Result<()> { diff --git a/examples/play-from-disk-renegotiation/play-from-disk-renegotiation.rs b/examples/play-from-disk-renegotiation/play-from-disk-renegotiation.rs index 2bd75b438..f191ba01f 100644 --- a/examples/play-from-disk-renegotiation/play-from-disk-renegotiation.rs +++ b/examples/play-from-disk-renegotiation/play-from-disk-renegotiation.rs @@ -18,7 +18,6 @@ use tokio_util::codec::{BytesCodec, FramedRead}; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::{MediaEngine, MIME_TYPE_VP8}; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::RTCRtpCodecCapability; use webrtc::media::track::track_local::track_local_static_sample::TrackLocalStaticSample; use webrtc::media::track::track_local::TrackLocal; @@ -27,6 +26,7 @@ use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection::RTCPeerConnection; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; #[macro_use] extern crate lazy_static; @@ -323,7 +323,7 @@ async fn main() -> Result<()> { // This will notify you when the peer has connected/disconnected peer_connection .on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { - print!("Peer Connection State has changed: {}\n", s); + println!("Peer Connection State has changed: {}", s); if s == RTCPeerConnectionState::Failed { // Wait until PeerConnection has had no network activity for 30 seconds or another failure. It may be reconnected using an ICE Restart. @@ -383,7 +383,7 @@ async fn write_video_to_track(video_file: String, t: Arc Ok((frame, _)) => frame, Err(err) => { println!("All video frames parsed and sent: {}", err); - return Err(err); + return Err(err.into()); } }; diff --git a/examples/play-from-disk-vp8/play-from-disk-vp8.rs b/examples/play-from-disk-vp8/play-from-disk-vp8.rs index 310ad01c4..d2f7743b7 100644 --- a/examples/play-from-disk-vp8/play-from-disk-vp8.rs +++ b/examples/play-from-disk-vp8/play-from-disk-vp8.rs @@ -14,7 +14,6 @@ use tokio::time::Duration; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::{MediaEngine, MIME_TYPE_OPUS, MIME_TYPE_VP8}; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::RTCRtpCodecCapability; use webrtc::media::track::track_local::track_local_static_sample::TrackLocalStaticSample; use webrtc::media::track::track_local::TrackLocal; @@ -23,6 +22,7 @@ use webrtc::peer::ice::ice_connection_state::RTCIceConnectionState; use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; #[tokio::main] async fn main() -> Result<()> { @@ -288,7 +288,7 @@ async fn main() -> Result<()> { // This will notify you when the peer has connected/disconnected peer_connection .on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { - print!("Peer Connection State has changed: {}\n", s); + println!("Peer Connection State has changed: {}", s); if s == RTCPeerConnectionState::Failed { // Wait until PeerConnection has had no network activity for 30 seconds or another failure. It may be reconnected using an ICE Restart. diff --git a/examples/play-from-disk-vp9/play-from-disk-vp9.rs b/examples/play-from-disk-vp9/play-from-disk-vp9.rs index 27b2836c7..f756201b0 100644 --- a/examples/play-from-disk-vp9/play-from-disk-vp9.rs +++ b/examples/play-from-disk-vp9/play-from-disk-vp9.rs @@ -14,7 +14,6 @@ use tokio::time::Duration; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::{MediaEngine, MIME_TYPE_OPUS, MIME_TYPE_VP9}; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::RTCRtpCodecCapability; use webrtc::media::track::track_local::track_local_static_sample::TrackLocalStaticSample; use webrtc::media::track::track_local::TrackLocal; @@ -23,6 +22,7 @@ use webrtc::peer::ice::ice_connection_state::RTCIceConnectionState; use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; #[tokio::main] async fn main() -> Result<()> { diff --git a/examples/reflect/reflect.rs b/examples/reflect/reflect.rs index 5de85b80f..d905c252e 100644 --- a/examples/reflect/reflect.rs +++ b/examples/reflect/reflect.rs @@ -188,7 +188,7 @@ async fn main() -> Result<()> { result = pc2.write_rtcp(&PictureLossIndication{ sender_ssrc: 0, media_ssrc, - }).await; + }).await.map_err(Into::into); } }; } diff --git a/examples/rtp-forwarder/rtp-forwarder.rs b/examples/rtp-forwarder/rtp-forwarder.rs index 5da0fb54c..8a175d5ca 100644 --- a/examples/rtp-forwarder/rtp-forwarder.rs +++ b/examples/rtp-forwarder/rtp-forwarder.rs @@ -202,7 +202,7 @@ async fn main() -> Result<()> { result = pc2.write_rtcp(&PictureLossIndication{ sender_ssrc: 0, media_ssrc, - }).await; + }).await.map_err(Into::into); } }; } @@ -266,7 +266,7 @@ async fn main() -> Result<()> { // This will notify you when the peer has connected/disconnected peer_connection .on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { - print!("Peer Connection State has changed: {}\n", s); + println!("Peer Connection State has changed: {}", s); if s == RTCPeerConnectionState::Failed { // Wait until PeerConnection has had no network activity for 30 seconds or another failure. It may be reconnected using an ICE Restart. diff --git a/examples/rtp-to-webrtc/rtp-to-webrtc.rs b/examples/rtp-to-webrtc/rtp-to-webrtc.rs index 971a0eb3e..eaf57dcdf 100644 --- a/examples/rtp-to-webrtc/rtp-to-webrtc.rs +++ b/examples/rtp-to-webrtc/rtp-to-webrtc.rs @@ -7,7 +7,6 @@ use tokio::net::UdpSocket; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::{MediaEngine, MIME_TYPE_VP8}; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::RTCRtpCodecCapability; use webrtc::media::track::track_local::track_local_static_rtp::TrackLocalStaticRTP; use webrtc::media::track::track_local::{TrackLocal, TrackLocalWriter}; @@ -16,6 +15,7 @@ use webrtc::peer::ice::ice_connection_state::RTCIceConnectionState; use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; #[tokio::main] async fn main() -> Result<()> { @@ -142,7 +142,7 @@ async fn main() -> Result<()> { // This will notify you when the peer has connected/disconnected peer_connection .on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { - print!("Peer Connection State has changed: {}\n", s); + println!("Peer Connection State has changed: {}", s); if s == RTCPeerConnectionState::Failed { // Wait until PeerConnection has had no network activity for 30 seconds or another failure. It may be reconnected using an ICE Restart. @@ -195,7 +195,7 @@ async fn main() -> Result<()> { let mut inbound_rtp_packet = vec![0u8; 1600]; // UDP MTU while let Ok((n, _)) = listener.recv_from(&mut inbound_rtp_packet).await { if let Err(err) = video_track.write(&inbound_rtp_packet[..n]).await { - if Error::ErrClosedPipe.equal(&err) { + if Error::ErrClosedPipe == err { // The peerConnection has been closed. return; } else { diff --git a/examples/save-to-disk/save-to-disk.rs b/examples/save-to-disk/save-to-disk.rs index 71c09a0c9..a3071d6f5 100644 --- a/examples/save-to-disk/save-to-disk.rs +++ b/examples/save-to-disk/save-to-disk.rs @@ -234,7 +234,7 @@ async fn main() -> Result<()> { result = pc2.write_rtcp(&PictureLossIndication{ sender_ssrc: 0, media_ssrc, - }).await; + }).await.map_err(Into::into); } }; } diff --git a/examples/simulcast/simulcast.rs b/examples/simulcast/simulcast.rs index 04a32bd5e..6245119cd 100644 --- a/examples/simulcast/simulcast.rs +++ b/examples/simulcast/simulcast.rs @@ -9,7 +9,6 @@ use tokio::time::Duration; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::{MediaEngine, MIME_TYPE_VP8}; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::{ RTCRtpCodecCapability, RTCRtpHeaderExtensionCapability, RTPCodecType, }; @@ -21,6 +20,7 @@ use webrtc::peer::configuration::RTCConfiguration; use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; #[tokio::main] async fn main() -> Result<()> { @@ -188,7 +188,7 @@ async fn main() -> Result<()> { result = pc2.write_rtcp(&PictureLossIndication{ sender_ssrc: 0, media_ssrc, - }).await; + }).await.map_err(Into::into); } }; } @@ -199,7 +199,7 @@ async fn main() -> Result<()> { println!("enter track loop {}", track.rid()); while let Ok((rtp, _)) = track.read_rtp().await { if let Err(err) = output_track.write_rtp(&rtp).await { - if !Error::ErrClosedPipe.equal(&err) { + if Error::ErrClosedPipe != err { println!("output track write_rtp got error: {} and break", err); break; } else { diff --git a/examples/swap-tracks/swap-tracks.rs b/examples/swap-tracks/swap-tracks.rs index 039e73000..2fca6e137 100644 --- a/examples/swap-tracks/swap-tracks.rs +++ b/examples/swap-tracks/swap-tracks.rs @@ -9,7 +9,6 @@ use tokio::time::Duration; use webrtc::api::interceptor_registry::register_default_interceptors; use webrtc::api::media_engine::{MediaEngine, MIME_TYPE_VP8}; use webrtc::api::APIBuilder; -use webrtc::error::Error; use webrtc::media::rtp::rtp_codec::RTCRtpCodecCapability; use webrtc::media::rtp::rtp_receiver::RTCRtpReceiver; use webrtc::media::track::track_local::track_local_static_rtp::TrackLocalStaticRTP; @@ -19,6 +18,7 @@ use webrtc::peer::configuration::RTCConfiguration; use webrtc::peer::ice::ice_server::RTCIceServer; use webrtc::peer::peer_connection_state::RTCPeerConnectionState; use webrtc::peer::sdp::session_description::RTCSessionDescription; +use webrtc::Error; #[tokio::main] async fn main() -> Result<()> { @@ -213,7 +213,7 @@ async fn main() -> Result<()> { let done1 = Arc::clone(&done); peer_connection .on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { - print!("Peer Connection State has changed: {}\n", s); + println!("Peer Connection State has changed: {}", s); let done2 = Arc::clone(&done1); Box::pin(async move { @@ -263,7 +263,7 @@ async fn main() -> Result<()> { packet.header.sequence_number = i; // Write out the packet, ignoring closed pipe if nobody is listening if let Err(err) = output_track.write_rtp(&packet).await { - if Error::ErrClosedPipe.equal(&err) { + if Error::ErrClosedPipe == err { // The peerConnection has been closed. return; } else { diff --git a/src/api/interceptor_registry.rs b/src/api/interceptor_registry.rs index d0d40692d..47fb13d0c 100644 --- a/src/api/interceptor_registry.rs +++ b/src/api/interceptor_registry.rs @@ -1,10 +1,10 @@ use crate::api::media_engine::MediaEngine; +use crate::error::Result; use crate::media::rtp::{rtp_codec::RTPCodecType, RTCPFeedback}; use interceptor::nack::{generator::Generator, responder::Responder}; use interceptor::registry::Registry; use interceptor::report::{receiver::ReceiverReport, sender::SenderReport}; -use anyhow::Result; use std::sync::Arc; /// register_default_interceptors will register some useful interceptors. diff --git a/src/api/media_engine.rs b/src/api/media_engine.rs index 7a80dbe8d..fcd7c62af 100644 --- a/src/api/media_engine.rs +++ b/src/api/media_engine.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod media_engine_test; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::rtp::fmtp::parse_fmtp; use crate::media::rtp::rtp_codec::{ codec_parameters_fuzzy_search, CodecMatch, RTCRtpCodecCapability, RTCRtpCodecParameters, @@ -14,7 +14,6 @@ use crate::media::rtp::rtp_transceiver_direction::{ use crate::media::rtp::{PayloadType, RTCPFeedback}; use crate::peer::sdp::{codecs_from_media_description, rtp_extensions_from_media_description}; -use anyhow::Result; use sdp::session_description::SessionDescription; use std::collections::HashMap; use std::sync::atomic::{AtomicBool, Ordering}; @@ -393,7 +392,10 @@ impl MediaEngine { ) -> Result<()> { codec.stats_id = format!( "RTPCodec-{}", - SystemTime::now().duration_since(UNIX_EPOCH)?.as_nanos() + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() ); match typ { RTPCodecType::Audio => { @@ -404,7 +406,7 @@ impl MediaEngine { MediaEngine::add_codec(&mut self.video_codecs, codec); Ok(()) } - _ => Err(Error::ErrUnknownType.into()), + _ => Err(Error::ErrUnknownType), } } @@ -427,7 +429,7 @@ impl MediaEngine { if *direction != RTCRtpTransceiverDirection::Recvonly && *direction != RTCRtpTransceiverDirection::Sendonly { - return Err(Error::ErrRegisterHeaderExtensionInvalidDirection.into()); + return Err(Error::ErrRegisterHeaderExtensionInvalidDirection); } } @@ -527,7 +529,7 @@ impl MediaEngine { } } - Err(Error::ErrCodecNotFound.into()) + Err(Error::ErrCodecNotFound) } /*TODO: func (m *MediaEngine) collectStats(collector *statsReportCollector) { diff --git a/src/api/media_engine/media_engine_test.rs b/src/api/media_engine/media_engine_test.rs index 4c1359037..d2f654e06 100644 --- a/src/api/media_engine/media_engine_test.rs +++ b/src/api/media_engine/media_engine_test.rs @@ -17,7 +17,7 @@ async fn test_opus_case() -> Result<()> { let offer = pc.create_offer(None).await?; - let re = Regex::new(r"(?m)^a=rtpmap:\d+ opus/48000/2")?; + let re = Regex::new(r"(?m)^a=rtpmap:\d+ opus/48000/2").unwrap(); assert!(re.is_match(offer.sdp.as_str())); pc.close().await?; @@ -37,11 +37,11 @@ async fn test_video_case() -> Result<()> { let offer = pc.create_offer(None).await?; - let re = Regex::new(r"(?m)^a=rtpmap:\d+ H264/90000")?; + let re = Regex::new(r"(?m)^a=rtpmap:\d+ H264/90000").unwrap(); assert!(re.is_match(offer.sdp.as_str())); - let re = Regex::new(r"(?m)^a=rtpmap:\d+ VP8/90000")?; + let re = Regex::new(r"(?m)^a=rtpmap:\d+ VP8/90000").unwrap(); assert!(re.is_match(offer.sdp.as_str())); - let re = Regex::new(r"(?m)^a=rtpmap:\d+ VP9/90000")?; + let re = Regex::new(r"(?m)^a=rtpmap:\d+ VP9/90000").unwrap(); assert!(re.is_match(offer.sdp.as_str())); pc.close().await?; @@ -53,7 +53,7 @@ async fn test_video_case() -> Result<()> { async fn test_media_engine_remote_description() -> Result<()> { let must_parse = |raw: &str| -> Result { let mut reader = Cursor::new(raw.as_bytes()); - SessionDescription::unmarshal(&mut reader) + Ok(SessionDescription::unmarshal(&mut reader)?) }; //"No Media" @@ -493,7 +493,7 @@ a=fmtp:97 apt=96 assert!(m.negotiated_video.load(Ordering::SeqCst)); if let Err(err) = m.get_codec_by_payload(97).await { - assert!(Error::ErrCodecNotFound.equal(&err)); + assert_eq!(Error::ErrCodecNotFound, err); } else { assert!(false); } @@ -605,7 +605,7 @@ async fn test_media_engine_header_extension_direction() -> Result<()> { ) .await; if let Err(err) = result { - assert!(Error::ErrRegisterHeaderExtensionInvalidDirection.equal(&err)); + assert_eq!(Error::ErrRegisterHeaderExtensionInvalidDirection, err); } else { assert!(false); } @@ -620,7 +620,7 @@ async fn test_media_engine_header_extension_direction() -> Result<()> { ) .await; if let Err(err) = result { - assert!(Error::ErrRegisterHeaderExtensionInvalidDirection.equal(&err)); + assert_eq!(Error::ErrRegisterHeaderExtensionInvalidDirection, err); } else { assert!(false); } @@ -634,7 +634,7 @@ async fn test_media_engine_header_extension_direction() -> Result<()> { ) .await; if let Err(err) = result { - assert!(Error::ErrRegisterHeaderExtensionInvalidDirection.equal(&err)); + assert_eq!(Error::ErrRegisterHeaderExtensionInvalidDirection, err); } else { assert!(false); } diff --git a/src/api/mod.rs b/src/api/mod.rs index 8281ae60f..8ba97012b 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -17,7 +17,7 @@ use setting_engine::*; use crate::data::data_channel::data_channel_parameters::DataChannelParameters; use crate::data::data_channel::RTCDataChannel; use crate::data::sctp_transport::RTCSctpTransport; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::rtp::rtp_codec::RTPCodecType; use crate::media::rtp::rtp_receiver::RTCRtpReceiver; use crate::media::rtp::rtp_sender::RTCRtpSender; @@ -26,7 +26,6 @@ use crate::peer::configuration::RTCConfiguration; use crate::peer::peer_connection::RTCPeerConnection; use interceptor::{noop::NoOp, registry::Registry, Interceptor}; -use anyhow::Result; use rcgen::KeyPair; use std::sync::Arc; use std::time::SystemTime; @@ -88,7 +87,7 @@ impl API { let now = SystemTime::now(); for cert in &certificates { if cert.expires().duration_since(now).is_err() { - return Err(Error::ErrCertificateExpired.into()); + return Err(Error::ErrCertificateExpired); } } } else { @@ -127,7 +126,7 @@ impl API { ) -> Result { // https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api (Step #5) if params.label.len() > 65535 { - return Err(Error::ErrStringSizeLimit.into()); + return Err(Error::ErrStringSizeLimit); } let d = RTCDataChannel::new(params, Arc::clone(&self.setting_engine)); diff --git a/src/api/setting_engine.rs b/src/api/setting_engine.rs index bca145cbd..6c70d5bfa 100644 --- a/src/api/setting_engine.rs +++ b/src/api/setting_engine.rs @@ -8,8 +8,8 @@ use ice::agent::agent_config::InterfaceFilterFn; use ice::mdns::MulticastDnsMode; use ice::network_type::NetworkType; -use crate::error::Error; -use anyhow::Result; +use crate::error::{Error, Result}; + use std::sync::Arc; use tokio::time::Duration; use util::vnet::net::*; @@ -134,7 +134,7 @@ impl SettingEngine { /// and the local address of server reflexive candidates. pub fn set_ephemeral_udp_port_range(&mut self, port_min: u16, port_max: u16) -> Result<()> { if port_max < port_min { - return Err(ice::error::Error::ErrPort.into()); + return Err(ice::Error::ErrPort.into()); } self.ephemeral_udp.port_min = port_min; @@ -199,7 +199,7 @@ impl SettingEngine { /// Act as dtls_transport Server, wait for ClientHello pub fn set_answering_dtls_role(&mut self, role: DTLSRole) -> Result<()> { if role != DTLSRole::Client && role != DTLSRole::Server { - return Err(Error::ErrSettingEngineSetAnsweringDTLSRole.into()); + return Err(Error::ErrSettingEngineSetAnsweringDTLSRole); } self.answering_dtls_role = role; diff --git a/src/data/data_channel/data_channel_test.rs b/src/data/data_channel/data_channel_test.rs index fe239b710..4c04ebd53 100644 --- a/src/data/data_channel/data_channel_test.rs +++ b/src/data/data_channel/data_channel_test.rs @@ -1310,11 +1310,11 @@ async fn test_data_channel_non_standard_session_description() -> Result<()> { const OLD_APPLICATION: &str = "m=application 63743 DTLS/SCTP 5000\r"; const OLD_ATTRIBUTE: &str = "a=sctpmap:5000 webrtc-datachannel 256\r"; - let re = Regex::new(r"m=application (.*?)\r")?; + let re = Regex::new(r"m=application (.*?)\r").unwrap(); offer.sdp = re .replace_all(offer.sdp.as_str(), OLD_APPLICATION) .to_string(); - let re = Regex::new(r"a=sctp-port(.*?)\r")?; + let re = Regex::new(r"a=sctp-port(.*?)\r").unwrap(); offer.sdp = re .replace_all(offer.sdp.as_str(), OLD_ATTRIBUTE) .to_string(); @@ -1548,8 +1548,9 @@ async fn test_data_channel_ortc_e2e() -> Result<()> { // attempt to send when channel is closed let result = channel_a.send(&Bytes::from_static(b"ABC")).await; if let Err(err) = result { - assert!( - Error::ErrClosedPipe.equal(&err), + assert_eq!( + Error::ErrClosedPipe, + err, "expected ErrClosedPipe, but got {}", err ); @@ -1559,8 +1560,9 @@ async fn test_data_channel_ortc_e2e() -> Result<()> { let result = channel_a.send_text("test".to_owned()).await; if let Err(err) = result { - assert!( - Error::ErrClosedPipe.equal(&err), + assert_eq!( + Error::ErrClosedPipe, + err, "expected ErrClosedPipe, but got {}", err ); @@ -1570,8 +1572,9 @@ async fn test_data_channel_ortc_e2e() -> Result<()> { let result = channel_a.ensure_open(); if let Err(err) = result { - assert!( - Error::ErrClosedPipe.equal(&err), + assert_eq!( + Error::ErrClosedPipe, + err, "expected ErrClosedPipe, but got {}", err ); diff --git a/src/data/data_channel/mod.rs b/src/data/data_channel/mod.rs index a7774566e..57a462dc1 100644 --- a/src/data/data_channel/mod.rs +++ b/src/data/data_channel/mod.rs @@ -16,7 +16,6 @@ use std::sync::atomic::{AtomicBool, AtomicU16, AtomicU8, AtomicUsize, Ordering}; use std::sync::Arc; use std::time::SystemTime; -use anyhow::Result; use data::message::message_channel_open::ChannelType; use sctp::stream::OnBufferedAmountLowFn; use tokio::sync::Mutex; @@ -25,7 +24,7 @@ use data_channel_state::RTCDataChannelState; use crate::api::setting_engine::SettingEngine; use crate::data::sctp_transport::RTCSctpTransport; -use crate::error::{Error, OnErrorHdlrFn}; +use crate::error::{Error, OnErrorHdlrFn, Result}; /// message size limit for Chromium const DATA_CHANNEL_BUFFER_SIZE: u16 = u16::MAX; @@ -179,7 +178,7 @@ impl RTCDataChannel { Ok(()) } else { - Err(Error::ErrSCTPNotEstablished.into()) + Err(Error::ErrSCTPNotEstablished) } } @@ -296,12 +295,12 @@ impl RTCDataChannel { Ok((n, is_string)) => (n, is_string), Err(err) => { ready_state.store(RTCDataChannelState::Closed as u8, Ordering::SeqCst); - if !sctp::error::Error::ErrStreamClosed.equal(&err) { + if err != sctp::Error::ErrStreamClosed { let on_error_handler2 = Arc::clone(&on_error_handler); tokio::spawn(async move { let mut handler = on_error_handler2.lock().await; if let Some(f) = &mut *handler { - f(err).await; + f(err.into()).await; } }); } @@ -337,9 +336,9 @@ impl RTCDataChannel { let data_channel = self.data_channel.lock().await; if let Some(dc) = &*data_channel { - dc.write_data_channel(data, false).await + Ok(dc.write_data_channel(data, false).await?) } else { - Err(Error::ErrClosedPipe.into()) + Err(Error::ErrClosedPipe) } } @@ -349,15 +348,15 @@ impl RTCDataChannel { let data_channel = self.data_channel.lock().await; if let Some(dc) = &*data_channel { - dc.write_data_channel(&Bytes::from(s), true).await + Ok(dc.write_data_channel(&Bytes::from(s), true).await?) } else { - Err(Error::ErrClosedPipe.into()) + Err(Error::ErrClosedPipe) } } fn ensure_open(&self) -> Result<()> { if self.ready_state() != RTCDataChannelState::Open { - Err(Error::ErrClosedPipe.into()) + Err(Error::ErrClosedPipe) } else { Ok(()) } @@ -373,7 +372,7 @@ impl RTCDataChannel { /// resulting DataChannel object. pub async fn detach(&self) -> Result> { if !self.setting_engine.detach.data_channels { - return Err(Error::ErrDetachNotEnabled.into()); + return Err(Error::ErrDetachNotEnabled); } let data_channel = self.data_channel.lock().await; @@ -382,7 +381,7 @@ impl RTCDataChannel { Ok(Arc::clone(dc)) } else { - Err(Error::ErrDetachBeforeOpened.into()) + Err(Error::ErrDetachBeforeOpened) } } @@ -397,7 +396,7 @@ impl RTCDataChannel { let data_channel = self.data_channel.lock().await; if let Some(dc) = &*data_channel { - dc.close().await + Ok(dc.close().await?) } else { Ok(()) } diff --git a/src/data/sctp_transport/mod.rs b/src/data/sctp_transport/mod.rs index 74a228ff1..8acba9565 100644 --- a/src/data/sctp_transport/mod.rs +++ b/src/data/sctp_transport/mod.rs @@ -18,7 +18,6 @@ use sctp::association::Association; use crate::data::data_channel::data_channel_parameters::DataChannelParameters; -use anyhow::Result; use std::future::Future; use std::pin::Pin; use std::sync::atomic::{AtomicBool, AtomicU32, AtomicU8, Ordering}; @@ -167,7 +166,7 @@ impl RTCSctpTransport { Ok(()) } else { - Err(Error::ErrSCTPTransportDTLS.into()) + Err(Error::ErrSCTPTransportDTLS) } } @@ -196,11 +195,11 @@ impl RTCSctpTransport { { Ok(dc) => dc, Err(err) => { - if data::error::Error::ErrStreamClosed.equal(&err) { + if data::Error::ErrStreamClosed == err { log::error!("Failed to accept data channel: {}", err); let mut handler = param.on_error_handler.lock().await; if let Some(f) = &mut *handler { - f(err).await; + f(err.into()).await; } } break; @@ -367,7 +366,7 @@ impl RTCSctpTransport { } } - Err(Error::ErrMaxDataChannelID.into()) + Err(Error::ErrMaxDataChannelID) } pub(crate) async fn association(&self) -> Option> { diff --git a/src/error.rs b/src/error.rs index b21aa9936..586e88bb8 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,8 +1,15 @@ +use rcgen::RcgenError; use std::future::Future; +use std::num::ParseIntError; use std::pin::Pin; +use std::string::FromUtf8Error; use thiserror::Error; +use tokio::sync::mpsc::error::SendError as MpscSendError; + +pub type Result = std::result::Result; #[derive(Error, Debug, PartialEq)] +#[non_exhaustive] pub enum Error { /// ErrUnknownType indicates an error with Unknown info. #[error("unknown")] @@ -333,17 +340,65 @@ pub enum Error { #[error("not long enough to be a RTP Packet")] ErrRTPTooShort, + #[error("{0}")] + Util(#[from] util::Error), + #[error("{0}")] + Ice(#[from] ice::Error), + #[error("{0}")] + Srtp(#[from] srtp::Error), + #[error("{0}")] + Dtls(#[from] dtls::Error), + #[error("{0}")] + Data(#[from] data::Error), + #[error("{0}")] + Sctp(#[from] sctp::Error), + #[error("{0}")] + Sdp(#[from] sdp::Error), + #[error("{0}")] + Interceptor(#[from] interceptor::Error), + #[error("{0}")] + Rtcp(#[from] rtcp::Error), + #[error("{0}")] + Rtp(#[from] rtp::Error), + + #[error("utf-8 error: {0}")] + Utf8(#[from] FromUtf8Error), + #[error("{0}")] + RcGen(#[from] RcgenError), + #[error("mpsc send: {0}")] + MpscSend(String), + #[error("parse int: {0}")] + ParseInt(#[from] ParseIntError), + #[error("parse url: {0}")] + ParseUrl(#[from] url::ParseError), + #[allow(non_camel_case_types)] #[error("{0}")] new(String), } -impl Error { - pub fn equal(&self, err: &anyhow::Error) -> bool { - err.downcast_ref::().map_or(false, |e| e == self) +pub type OnErrorHdlrFn = + Box Pin + Send + 'static>>) + Send + Sync>; + +// Because Tokio SendError is parameterized, we sadly lose the backtrace. +impl From> for Error { + fn from(e: MpscSendError) -> Self { + Error::MpscSend(e.to_string()) + } +} + +impl From for interceptor::Error { + fn from(e: Error) -> Self { + // this is a bit lol, but we do preserve the stack trace + interceptor::Error::Util(util::Error::from_std(e)) } } -pub type OnErrorHdlrFn = Box< - dyn (FnMut(anyhow::Error) -> Pin + Send + 'static>>) + Send + Sync, ->; +impl PartialEq for Error { + fn eq(&self, other: &ice::Error) -> bool { + if let Error::Ice(e) = self { + return e == other; + } + false + } +} diff --git a/src/lib.rs b/src/lib.rs index 9d6e8ac41..5f121b75b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,12 +5,14 @@ use ::dtls::extension::extension_use_srtp::SrtpProtectionProfile; pub mod api; pub mod data; -pub mod error; +mod error; pub mod media; pub mod peer; pub mod stats; pub mod util; +pub use error::Error; + #[macro_use] extern crate lazy_static; diff --git a/src/media/dtls_transport/dtls_role.rs b/src/media/dtls_transport/dtls_role.rs index fda57df99..b662e05ba 100644 --- a/src/media/dtls_transport/dtls_role.rs +++ b/src/media/dtls_transport/dtls_role.rs @@ -93,9 +93,10 @@ impl DTLSRole { #[cfg(test)] mod test { + use crate::error::Result; + use super::*; - use anyhow::Result; use std::io::Cursor; #[test] diff --git a/src/media/dtls_transport/dtls_transport_test.rs b/src/media/dtls_transport/dtls_transport_test.rs index 44a812da7..1f88a2fa4 100644 --- a/src/media/dtls_transport/dtls_transport_test.rs +++ b/src/media/dtls_transport/dtls_transport_test.rs @@ -97,7 +97,7 @@ async fn test_invalid_fingerprint_causes_failed() -> Result<()> { log::trace!("receiving pending local desc: {:?}", offer); // Replace with invalid fingerprint - let re = Regex::new(r"sha-256 (.*?)\r")?; + let re = Regex::new(r"sha-256 (.*?)\r").unwrap(); offer.sdp = re.replace_all(offer.sdp.as_str(), "sha-256 AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA\r").to_string(); pc_answer.set_remote_description(offer).await?; diff --git a/src/media/dtls_transport/mod.rs b/src/media/dtls_transport/mod.rs index eaf04d9e9..b1c4dd7be 100644 --- a/src/media/dtls_transport/mod.rs +++ b/src/media/dtls_transport/mod.rs @@ -3,7 +3,6 @@ use std::pin::Pin; use std::sync::atomic::{AtomicBool, AtomicU8, Ordering}; use std::sync::Arc; -use anyhow::Result; use bytes::Bytes; use dtls::config::ClientAuthType; use dtls::conn::DTLSConn; @@ -18,7 +17,7 @@ use dtls_role::*; use crate::api::setting_engine::SettingEngine; use crate::default_srtp_protection_profiles; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::dtls_transport::dtls_parameters::DTLSParameters; use crate::media::dtls_transport::dtls_transport_state::RTCDtlsTransportState; use crate::media::ice_transport::ice_role::RTCIceRole; @@ -186,7 +185,7 @@ impl RTCDtlsTransport { .extract_session_keys_from_dtls(conn_state, self.role().await == DTLSRole::Client) .await?; } else { - return Err(Error::ErrDtlsTransportNotStarted.into()); + return Err(Error::ErrDtlsTransportNotStarted); } { @@ -226,7 +225,7 @@ impl RTCDtlsTransport { .extract_session_keys_from_dtls(conn_state, self.role().await == DTLSRole::Client) .await?; } else { - return Err(Error::ErrDtlsTransportNotStarted.into()); + return Err(Error::ErrDtlsTransportNotStarted); } { @@ -302,7 +301,7 @@ impl RTCDtlsTransport { self.ensure_ice_conn()?; if self.state() != RTCDtlsTransportState::New { - return Err(Error::ErrInvalidDTLSStart.into()); + return Err(Error::ErrInvalidDTLSStart); } { @@ -321,7 +320,7 @@ impl RTCDtlsTransport { let certificate = if let Some(cert) = self.certificates.first() { cert.certificate.clone() } else { - return Err(Error::ErrNonCertificate.into()); + return Err(Error::ErrNonCertificate); }; self.state_change(RTCDtlsTransportState::Connecting).await; @@ -375,14 +374,16 @@ impl RTCDtlsTransport { .await } } else { - Err(Error::new("ice_transport.new_endpoint failed".to_owned()).into()) + Err(dtls::Error::Other( + "ice_transport.new_endpoint failed".to_owned(), + )) }; let dtls_conn = match dtls_conn_result { Ok(dtls_conn) => dtls_conn, Err(err) => { self.state_change(RTCDtlsTransportState::Failed).await; - return Err(err); + return Err(err.into()); } }; @@ -398,7 +399,7 @@ impl RTCDtlsTransport { } _ => { self.state_change(RTCDtlsTransportState::Failed).await; - return Err(Error::ErrNoSRTPProtectionProfile.into()); + return Err(Error::ErrNoSRTPProtectionProfile); } }; } @@ -414,7 +415,7 @@ impl RTCDtlsTransport { let remote_certs = &dtls_conn.connection_state().await.peer_certificates; if remote_certs.is_empty() { self.state_change(RTCDtlsTransportState::Failed).await; - return Err(Error::ErrNoRemoteCertificate.into()); + return Err(Error::ErrNoRemoteCertificate); } { @@ -443,14 +444,14 @@ impl RTCDtlsTransport { /// stops and closes the DTLSTransport object. pub async fn stop(&self) -> Result<()> { // Try closing everything and collect the errors - let mut close_errs: Vec = vec![]; + let mut close_errs: Vec = vec![]; { let mut srtp_session = self.srtp_session.lock().await; if let Some(srtp_session) = srtp_session.take() { match srtp_session.close().await { Ok(_) => {} Err(err) => { - close_errs.push(err); + close_errs.push(err.into()); } }; } @@ -462,7 +463,7 @@ impl RTCDtlsTransport { match srtcp_session.close().await { Ok(_) => {} Err(err) => { - close_errs.push(err); + close_errs.push(err.into()); } }; } @@ -474,7 +475,7 @@ impl RTCDtlsTransport { match ss.close().await { Ok(_) => {} Err(err) => { - close_errs.push(err); + close_errs.push(err.into()); } }; } @@ -485,8 +486,8 @@ impl RTCDtlsTransport { match conn.close().await { Ok(_) => {} Err(err) => { - if err.to_string() != dtls::error::Error::ErrConnClosed.to_string() { - close_errs.push(err); + if err.to_string() != dtls::Error::ErrConnClosed.to_string() { + close_errs.push(err.into()); } } } @@ -501,7 +502,7 @@ impl RTCDtlsTransport { let remote_parameters = self.remote_parameters.lock().await; for fp in &remote_parameters.fingerprints { if fp.algorithm != "sha-256" { - return Err(Error::ErrUnsupportedFingerprintAlgorithm.into()); + return Err(Error::ErrUnsupportedFingerprintAlgorithm); } let mut h = Sha256::new(); @@ -515,12 +516,12 @@ impl RTCDtlsTransport { } } - Err(Error::ErrNoMatchingCertificateFingerprint.into()) + Err(Error::ErrNoMatchingCertificateFingerprint) } pub(crate) fn ensure_ice_conn(&self) -> Result<()> { if self.ice_transport.state() == RTCIceTransportState::New { - Err(Error::ErrICEConnectionNotStarted.into()) + Err(Error::ErrICEConnectionNotStarted) } else { Ok(()) } diff --git a/src/media/ice_transport/ice_transport_test.rs b/src/media/ice_transport/ice_transport_test.rs index 9e57c6dfa..b086592e6 100644 --- a/src/media/ice_transport/ice_transport_test.rs +++ b/src/media/ice_transport/ice_transport_test.rs @@ -1,6 +1,7 @@ use super::*; use crate::api::media_engine::MediaEngine; use crate::api::APIBuilder; +use crate::error::Result; use crate::peer::ice::ice_connection_state::RTCIceConnectionState; use crate::peer::peer_connection::peer_connection_test::{ close_pair_now, new_pair, signal_pair, until_connection_state, diff --git a/src/media/ice_transport/mod.rs b/src/media/ice_transport/mod.rs index e79e2c904..84447417f 100644 --- a/src/media/ice_transport/mod.rs +++ b/src/media/ice_transport/mod.rs @@ -3,7 +3,6 @@ use std::pin::Pin; use std::sync::atomic::{AtomicU8, Ordering}; use std::sync::Arc; -use anyhow::Result; use ice::candidate::Candidate; use ice::state::ConnectionState; use tokio::sync::{mpsc, Mutex}; @@ -12,7 +11,7 @@ use util::Conn; use ice_candidate_pair::RTCIceCandidatePair; use ice_role::RTCIceRole; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::ice_transport::ice_parameters::RTCIceParameters; use crate::media::ice_transport::ice_transport_state::RTCIceTransportState; use crate::peer::ice::ice_candidate::RTCIceCandidate; @@ -88,7 +87,7 @@ impl RTCIceTransport { /// Start incoming connectivity checks based on its configured role. pub async fn start(&self, params: &RTCIceParameters, role: Option) -> Result<()> { if self.state() != RTCIceTransportState::New { - return Err(Error::ErrICETransportNotInNew.into()); + return Err(Error::ErrICETransportNotInNew); } self.ensure_gatherer().await?; @@ -163,7 +162,7 @@ impl RTCIceTransport { .await? } - _ => return Err(Error::ErrICERoleUnknown.into()), + _ => return Err(Error::ErrICERoleUnknown), }; let config = Config { @@ -181,7 +180,7 @@ impl RTCIceTransport { Ok(()) } else { - Err(Error::ErrICEAgentNotExist.into()) + Err(Error::ErrICEAgentNotExist) } } @@ -200,7 +199,7 @@ impl RTCIceTransport { ) .await?; } else { - return Err(Error::ErrICEAgentNotExist.into()); + return Err(Error::ErrICEAgentNotExist); } self.gatherer.gather().await } @@ -255,7 +254,7 @@ impl RTCIceTransport { } Ok(()) } else { - Err(Error::ErrICEAgentNotExist.into()) + Err(Error::ErrICEAgentNotExist) } } @@ -274,7 +273,7 @@ impl RTCIceTransport { Ok(()) } else { - Err(Error::ErrICEAgentNotExist.into()) + Err(Error::ErrICEAgentNotExist) } } @@ -347,7 +346,7 @@ impl RTCIceTransport { if let Some(agent) = self.gatherer.get_agent().await { Ok(agent.set_remote_credentials(new_ufrag, new_pwd).await?) } else { - Err(Error::ErrICEAgentNotExist.into()) + Err(Error::ErrICEAgentNotExist) } } } diff --git a/src/media/interceptor/mod.rs b/src/media/interceptor/mod.rs index fdc1de7dc..e1e4ffeb1 100644 --- a/src/media/interceptor/mod.rs +++ b/src/media/interceptor/mod.rs @@ -1,8 +1,8 @@ +use crate::error::Result; use crate::media::rtp::rtp_codec::{RTCRtpCodecCapability, RTCRtpHeaderExtensionParameters}; use crate::media::rtp::{PayloadType, SSRC}; use crate::media::track::track_local::TrackLocalWriter; -use anyhow::Result; use async_trait::async_trait; use interceptor::stream_info::{RTCPFeedback, RTPHeaderExtension, StreamInfo}; use interceptor::{Attributes, RTPWriter}; @@ -42,7 +42,7 @@ impl TrackLocalWriter for InterceptorToTrackLocalWriter { let interceptor_rtp_writer = self.interceptor_rtp_writer.lock().await; if let Some(writer) = &*interceptor_rtp_writer { let a = Attributes::new(); - writer.write(pkt, &a).await + Ok(writer.write(pkt, &a).await?) } else { Ok(0) } diff --git a/src/media/rtp/rtp_codec.rs b/src/media/rtp/rtp_codec.rs index 5a8a89ad6..b77b829d8 100644 --- a/src/media/rtp/rtp_codec.rs +++ b/src/media/rtp/rtp_codec.rs @@ -1,9 +1,8 @@ use super::*; use crate::api::media_engine::*; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::rtp::fmtp::*; -use anyhow::Result; use std::fmt; /// RTPCodecType determines the type of a codec @@ -85,7 +84,7 @@ impl RTCRtpCodecCapability { { Ok(Box::new(rtp::codecs::g7xx::G7xxPayloader::default())) } else { - Err(Error::ErrNoPayloaderForCodec.into()) + Err(Error::ErrNoPayloaderForCodec) } } } diff --git a/src/media/rtp/rtp_receiver.rs b/src/media/rtp/rtp_receiver.rs index 58ff5f694..bfa6799ab 100644 --- a/src/media/rtp/rtp_receiver.rs +++ b/src/media/rtp/rtp_receiver.rs @@ -2,7 +2,7 @@ mod rtp_receiver_test; use crate::api::media_engine::MediaEngine; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::dtls_transport::RTCDtlsTransport; use crate::media::interceptor::*; use crate::media::rtp::rtp_codec::{ @@ -17,7 +17,7 @@ use crate::util::flatten_errs; use crate::RECEIVE_MTU; use crate::peer::sdp::TrackDetails; -use anyhow::Result; + use interceptor::stream_info::{RTPHeaderExtension, StreamInfo}; use interceptor::{Attributes, Interceptor, RTCPReader, RTPReader}; use std::sync::Arc; @@ -48,16 +48,16 @@ impl RTPReceiverInternal { if let Some(t) = tracks.first(){ if let Some(rtcp_interceptor) = &t.rtcp_interceptor{ let a = Attributes::new(); - rtcp_interceptor.read(b, &a).await + Ok(rtcp_interceptor.read(b, &a).await?) }else{ - Err(Error::ErrInterceptorNotBind.into()) + Err(Error::ErrInterceptorNotBind) } }else{ - Err(Error::ErrExistingTrack.into()) + Err(Error::ErrExistingTrack) } } _ = closed_rx.recv() => { - Err(Error::ErrClosedPipe.into()) + Err(Error::ErrClosedPipe) } } } @@ -74,16 +74,16 @@ impl RTPReceiverInternal { if t.track.rid() == rid { if let Some(rtcp_interceptor) = &t.rtcp_interceptor{ let a = Attributes::new(); - return rtcp_interceptor.read(b, &a).await; + return Ok(rtcp_interceptor.read(b, &a).await?); }else{ - return Err(Error::ErrInterceptorNotBind.into()); + return Err(Error::ErrInterceptorNotBind); } } } - Err(Error::ErrRTPReceiverForRIDTrackStreamNotFound.into()) + Err(Error::ErrRTPReceiverForRIDTrackStreamNotFound) } _ = closed_rx.recv() => { - Err(Error::ErrClosedPipe.into()) + Err(Error::ErrClosedPipe) } } } @@ -139,10 +139,10 @@ impl RTPReceiverInternal { if let Some(ri) = rtp_interceptor { let a = Attributes::new(); - ri.read(b, &a).await + Ok(ri.read(b, &a).await?) } else { //log::debug!("read_rtp exit tracks with ErrRTPReceiverWithSSRCTrackStreamNotFound"); - Err(Error::ErrRTPReceiverWithSSRCTrackStreamNotFound.into()) + Err(Error::ErrRTPReceiverWithSSRCTrackStreamNotFound) } } @@ -297,7 +297,7 @@ impl RTCRtpReceiver { let _d = { let mut received_tx = self.received_tx.lock().await; if received_tx.is_none() { - return Err(Error::ErrRTPReceiverReceiveAlreadyCalled.into()); + return Err(Error::ErrRTPReceiverReceiveAlreadyCalled); } received_tx.take() }; @@ -536,7 +536,7 @@ impl RTCRtpReceiver { } //log::debug!("receive_for_rid exit tracks 2"); - Err(Error::ErrRTPReceiverForSSRCTrackStreamNotFound.into()) + Err(Error::ErrRTPReceiverForSSRCTrackStreamNotFound) } async fn streams_for_ssrc( diff --git a/src/media/rtp/rtp_receiver/rtp_receiver_test.rs b/src/media/rtp/rtp_receiver/rtp_receiver_test.rs index 3db789cbd..a828b751f 100644 --- a/src/media/rtp/rtp_receiver/rtp_receiver_test.rs +++ b/src/media/rtp/rtp_receiver/rtp_receiver_test.rs @@ -1,5 +1,6 @@ use super::*; use crate::api::media_engine::MIME_TYPE_OPUS; +use crate::error::Result; use crate::media::rtp::rtp_codec::RTCRtpHeaderExtensionParameters; use crate::media::rtp::RTCPFeedback; use crate::media::track::track_local::track_local_static_sample::TrackLocalStaticSample; diff --git a/src/media/rtp/rtp_sender.rs b/src/media/rtp/rtp_sender.rs index a53300a01..29c2662ab 100644 --- a/src/media/rtp/rtp_sender.rs +++ b/src/media/rtp/rtp_sender.rs @@ -2,7 +2,7 @@ mod rtp_sender_test; use crate::api::media_engine::MediaEngine; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::dtls_transport::RTCDtlsTransport; use crate::media::interceptor::{create_stream_info, InterceptorToTrackLocalWriter}; use crate::media::rtp::rtp_codec::{RTCRtpCodecParameters, RTPCodecType}; @@ -13,7 +13,6 @@ use crate::media::rtp::{PayloadType, RTCRtpEncodingParameters, RTCRtpSendParamet use crate::media::track::track_local::{TrackLocal, TrackLocalContext, TrackLocalWriter}; use crate::RECEIVE_MTU; -use anyhow::Result; use ice::rand::generate_crypto_random_string; use interceptor::stream_info::StreamInfo; use interceptor::{Attributes, Interceptor, RTCPReader, RTPWriter}; @@ -40,13 +39,13 @@ impl RTPSenderInternal { let rtcp_interceptor = self.rtcp_interceptor.lock().await; if let Some(rtcp_interceptor) = &*rtcp_interceptor{ let a = Attributes::new(); - rtcp_interceptor.read(b, &a).await + Ok(rtcp_interceptor.read(b, &a).await?) }else{ - Err(Error::ErrInterceptorNotBind.into()) + Err(Error::ErrInterceptorNotBind) } } _ = stop_called_rx.recv() =>{ - Err(Error::ErrClosedPipe.into()) + Err(Error::ErrClosedPipe) } } } @@ -236,7 +235,7 @@ impl RTCRtpSender { let tr = self.tr.lock().await; if let Some(r) = &*tr { if r.kind != t.kind() { - return Err(Error::ErrRTPSenderNewTrackHasIncorrectKind.into()); + return Err(Error::ErrRTPSenderNewTrackHasIncorrectKind); } } else { //TODO: what about None tr? @@ -275,7 +274,7 @@ impl RTCRtpSender { t.bind(&new_context).await } else { - Err(Error::ErrRTPSenderTrackNil.into()) + Err(Error::ErrRTPSenderTrackNil) }; match result { @@ -306,7 +305,7 @@ impl RTCRtpSender { /// send Attempts to set the parameters controlling the sending of media. pub async fn send(&self, parameters: &RTCRtpSendParameters) -> Result<()> { if self.has_sent().await { - return Err(Error::ErrRTPSenderSendAlreadyCalled.into()); + return Err(Error::ErrRTPSenderSendAlreadyCalled); } let write_stream = Arc::new(InterceptorToTrackLocalWriter::new()); diff --git a/src/media/rtp/rtp_sender/rtp_sender_test.rs b/src/media/rtp/rtp_sender/rtp_sender_test.rs index 1b13f0fb0..2305a6268 100644 --- a/src/media/rtp/rtp_sender/rtp_sender_test.rs +++ b/src/media/rtp/rtp_sender/rtp_sender_test.rs @@ -2,6 +2,7 @@ use super::*; use crate::api::media_engine::{MIME_TYPE_H264, MIME_TYPE_OPUS, MIME_TYPE_VP8, MIME_TYPE_VP9}; use crate::api::setting_engine::SettingEngine; use crate::api::APIBuilder; +use crate::error::Result; use crate::media::rtp::rtp_codec::RTCRtpCodecCapability; use crate::media::rtp::rtp_receiver::RTCRtpReceiver; use crate::media::track::track_local::track_local_static_sample::TrackLocalStaticSample; @@ -238,7 +239,7 @@ async fn test_rtp_sender_replace_track_invalid_track_kind_change() -> Result<()> }); if let Err(err) = rtp_sender.replace_track(Some(track_b)).await { - assert!(Error::ErrRTPSenderNewTrackHasIncorrectKind.equal(&err)); + assert_eq!(Error::ErrRTPSenderNewTrackHasIncorrectKind, err); } else { assert!(false); } @@ -314,7 +315,7 @@ async fn test_rtp_sender_replace_track_invalid_codec_change() -> Result<()> { }); if let Err(err) = rtp_sender.replace_track(Some(track_b)).await { - assert!(Error::ErrUnsupportedCodec.equal(&err)); + assert_eq!(Error::ErrUnsupportedCodec, err); } else { assert!(false); } diff --git a/src/media/rtp/rtp_transceiver.rs b/src/media/rtp/rtp_transceiver.rs index d0813f8b1..2323d10cd 100644 --- a/src/media/rtp/rtp_transceiver.rs +++ b/src/media/rtp/rtp_transceiver.rs @@ -2,7 +2,7 @@ mod rtp_transceiver_test; use crate::api::media_engine::MediaEngine; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::rtp::rtp_codec::*; use crate::media::rtp::rtp_receiver::{RTCRtpReceiver, RTPReceiverInternal}; use crate::media::rtp::rtp_sender::RTCRtpSender; @@ -10,7 +10,6 @@ use crate::media::rtp::rtp_transceiver_direction::RTCRtpTransceiverDirection; use crate::media::rtp::PayloadType; use crate::media::track::track_local::TrackLocal; -use anyhow::Result; use std::sync::atomic::{AtomicU8, Ordering}; use std::sync::Arc; use tokio::sync::Mutex; @@ -64,7 +63,7 @@ impl RTCRtpTransceiver { let media_engine_codecs = self.media_engine.get_codecs_by_kind(self.kind).await; let (_, match_type) = codec_parameters_fuzzy_search(codec, &media_engine_codecs); if match_type == CodecMatch::None { - return Err(Error::ErrRTPTransceiverCodecUnsupported.into()); + return Err(Error::ErrRTPTransceiverCodecUnsupported); } } @@ -139,7 +138,7 @@ impl RTCRtpTransceiver { pub(crate) async fn set_mid(&self, mid: String) -> Result<()> { let mut m = self.mid.lock().await; if !m.is_empty() { - return Err(Error::ErrRTPTransceiverCannotChangeMid.into()); + return Err(Error::ErrRTPTransceiverCannotChangeMid); } *m = mid; @@ -220,7 +219,7 @@ impl RTCRtpTransceiver { } else if track_is_none && direction == RTCRtpTransceiverDirection::Sendonly { self.set_direction(RTCRtpTransceiverDirection::Inactive); } else { - return Err(Error::ErrRTPTransceiverSetSendingInvalidState.into()); + return Err(Error::ErrRTPTransceiverSetSendingInvalidState); } Ok(()) } diff --git a/src/media/rtp/rtp_transceiver/rtp_transceiver_test.rs b/src/media/rtp/rtp_transceiver/rtp_transceiver_test.rs index d92f06014..a62adb843 100644 --- a/src/media/rtp/rtp_transceiver/rtp_transceiver_test.rs +++ b/src/media/rtp/rtp_transceiver/rtp_transceiver_test.rs @@ -69,7 +69,7 @@ async fn test_rtp_transceiver_set_codec_preferences() -> Result<()> { for test_case in fail_test_cases { if let Err(err) = tr.set_codec_preferences(test_case).await { - assert!(Error::ErrRTPTransceiverCodecUnsupported.equal(&err)); + assert_eq!(Error::ErrRTPTransceiverCodecUnsupported, err); } else { assert!(false); } diff --git a/src/media/rtp/srtp_writer_future.rs b/src/media/rtp/srtp_writer_future.rs index 7ae3016bf..03717397e 100644 --- a/src/media/rtp/srtp_writer_future.rs +++ b/src/media/rtp/srtp_writer_future.rs @@ -1,4 +1,4 @@ -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::dtls_transport::RTCDtlsTransport; use crate::media::rtp::rtp_sender::RTPSenderInternal; use crate::media::rtp::SSRC; @@ -6,7 +6,6 @@ use crate::media::rtp::SSRC; use srtp::session::Session; use srtp::stream::Stream; -use anyhow::Result; use async_trait::async_trait; use bytes::Bytes; use interceptor::{Attributes, RTCPReader, RTPWriter}; @@ -29,7 +28,7 @@ impl SrtpWriterFuture { if return_when_no_srtp { { if self.rtp_sender.stop_called_signal.load(Ordering::SeqCst) { - return Err(Error::ErrClosedPipe.into()); + return Err(Error::ErrClosedPipe); } } @@ -42,7 +41,7 @@ impl SrtpWriterFuture { let mut stop_called_rx = self.rtp_sender.stop_called_rx.lock().await; tokio::select! { - _ = stop_called_rx.recv()=> return Err(Error::ErrClosedPipe.into()), + _ = stop_called_rx.recv()=> return Err(Error::ErrClosedPipe), _ = srtp_ready_rx.recv() =>{} } } @@ -66,7 +65,7 @@ impl SrtpWriterFuture { pub async fn close(&self) -> Result<()> { let stream = self.rtcp_read_stream.lock().await; if let Some(rtcp_read_stream) = &*stream { - rtcp_read_stream.close().await + Ok(rtcp_read_stream.close().await?) } else { Ok(()) } @@ -76,7 +75,7 @@ impl SrtpWriterFuture { { let stream = self.rtcp_read_stream.lock().await; if let Some(rtcp_read_stream) = &*stream { - return rtcp_read_stream.read(b).await; + return Ok(rtcp_read_stream.read(b).await?); } } @@ -85,7 +84,7 @@ impl SrtpWriterFuture { { let stream = self.rtcp_read_stream.lock().await; if let Some(rtcp_read_stream) = &*stream { - return rtcp_read_stream.read(b).await; + return Ok(rtcp_read_stream.read(b).await?); } } @@ -96,7 +95,7 @@ impl SrtpWriterFuture { { let session = self.rtp_write_session.lock().await; if let Some(rtp_write_session) = &*session { - return rtp_write_session.write_rtp(pkt).await; + return Ok(rtp_write_session.write_rtp(pkt).await?); } } @@ -105,7 +104,7 @@ impl SrtpWriterFuture { { let session = self.rtp_write_session.lock().await; if let Some(rtp_write_session) = &*session { - return rtp_write_session.write_rtp(pkt).await; + return Ok(rtp_write_session.write_rtp(pkt).await?); } } @@ -116,7 +115,7 @@ impl SrtpWriterFuture { { let session = self.rtp_write_session.lock().await; if let Some(rtp_write_session) = &*session { - return rtp_write_session.write(b, true).await; + return Ok(rtp_write_session.write(b, true).await?); } } @@ -125,7 +124,7 @@ impl SrtpWriterFuture { { let session = self.rtp_write_session.lock().await; if let Some(rtp_write_session) = &*session { - return rtp_write_session.write(b, true).await; + return Ok(rtp_write_session.write(b, true).await?); } } @@ -133,16 +132,18 @@ impl SrtpWriterFuture { } } +type IResult = std::result::Result; + #[async_trait] impl RTCPReader for SrtpWriterFuture { - async fn read(&self, buf: &mut [u8], a: &Attributes) -> Result<(usize, Attributes)> { + async fn read(&self, buf: &mut [u8], a: &Attributes) -> IResult<(usize, Attributes)> { Ok((self.read(buf).await?, a.clone())) } } #[async_trait] impl RTPWriter for SrtpWriterFuture { - async fn write(&self, pkt: &rtp::packet::Packet, _a: &Attributes) -> Result { - self.write_rtp(pkt).await + async fn write(&self, pkt: &rtp::packet::Packet, _a: &Attributes) -> IResult { + Ok(self.write_rtp(pkt).await?) } } diff --git a/src/media/track/track_local/mod.rs b/src/media/track/track_local/mod.rs index 5d225e90f..80a41d7a6 100644 --- a/src/media/track/track_local/mod.rs +++ b/src/media/track/track_local/mod.rs @@ -4,11 +4,10 @@ mod track_local_static_test; pub mod track_local_static_rtp; pub mod track_local_static_sample; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::rtp::rtp_codec::*; use crate::media::rtp::*; -use anyhow::Result; use async_trait::async_trait; use std::any::Any; use std::fmt; diff --git a/src/media/track/track_local/track_local_static_rtp.rs b/src/media/track/track_local/track_local_static_rtp.rs index 94801f6ea..cc43e1322 100644 --- a/src/media/track/track_local/track_local_static_rtp.rs +++ b/src/media/track/track_local/track_local_static_rtp.rs @@ -56,7 +56,7 @@ impl TrackLocal for TrackLocalStaticRTP { Ok(codec) } else { - Err(Error::ErrUnsupportedCodec.into()) + Err(Error::ErrUnsupportedCodec) } } @@ -75,7 +75,7 @@ impl TrackLocal for TrackLocalStaticRTP { bindings.remove(index); Ok(()) } else { - Err(Error::ErrUnbindFailed.into()) + Err(Error::ErrUnbindFailed) } } @@ -132,8 +132,7 @@ impl TrackLocalWriter for TrackLocalStaticRTP { } } } else { - write_errs - .push(Error::new("track binding has none write_stream".to_owned()).into()); + write_errs.push(Error::new("track binding has none write_stream".to_owned())); } } diff --git a/src/media/track/track_local/track_local_static_test.rs b/src/media/track/track_local/track_local_static_test.rs index 0bf5e06a1..5b6cea101 100644 --- a/src/media/track/track_local/track_local_static_test.rs +++ b/src/media/track/track_local/track_local_static_test.rs @@ -39,7 +39,7 @@ async fn test_track_local_static_no_codec_intersection() -> Result<()> { pc.add_track(Arc::clone(&track)).await?; if let Err(err) = signal_pair(&mut pc, &mut no_codec_pc).await { - assert!(Error::ErrUnsupportedCodec.equal(&err)); + assert_eq!(Error::ErrUnsupportedCodec, err); } else { assert!(false); } @@ -79,8 +79,9 @@ async fn test_track_local_static_no_codec_intersection() -> Result<()> { pc.add_track(Arc::clone(&track)).await?; if let Err(err) = signal_pair(&mut vp9only_pc, &mut pc).await { - assert!( - Error::ErrUnsupportedCodec.equal(&err), + assert_eq!( + Error::ErrUnsupportedCodec, + err, "expected {}, but got {}", Error::ErrUnsupportedCodec, err @@ -108,7 +109,7 @@ async fn test_track_local_static_no_codec_intersection() -> Result<()> { offerer.add_track(Arc::new(invalid_codec_track)).await?; if let Err(err) = signal_pair(&mut offerer, &mut answerer).await { - assert!(Error::ErrUnsupportedCodec.equal(&err)); + assert_eq!(Error::ErrUnsupportedCodec, err); } else { assert!(false); } diff --git a/src/media/track/track_remote/mod.rs b/src/media/track/track_remote/mod.rs index 13e40c0ad..981fc784c 100644 --- a/src/media/track/track_remote/mod.rs +++ b/src/media/track/track_remote/mod.rs @@ -1,11 +1,11 @@ use crate::api::media_engine::MediaEngine; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::rtp::rtp_codec::{RTCRtpCodecParameters, RTCRtpParameters, RTPCodecType}; use crate::media::rtp::{PayloadType, SSRC}; use crate::{RECEIVE_MTU, RTP_PAYLOAD_TYPE_BITMASK}; use crate::media::rtp::rtp_receiver::RTPReceiverInternal; -use anyhow::Result; + use bytes::{Bytes, BytesMut}; use interceptor::{Attributes, Interceptor}; use std::sync::atomic::{AtomicU32, AtomicU8, AtomicUsize, Ordering}; @@ -193,7 +193,7 @@ impl TrackRemote { if let Some(receiver) = &self.receiver { receiver.read_rtp(b, self.tid).await? } else { - return Err(Error::ErrRTPReceiverNil.into()); + return Err(Error::ErrRTPReceiverNil); } }; self.check_and_update_track(&b[..n]).await?; @@ -205,7 +205,7 @@ impl TrackRemote { /// once a different payloadType is detected the track will be updated async fn check_and_update_track(&self, b: &[u8]) -> Result<()> { if b.len() < 2 { - return Err(Error::ErrRTPTooShort.into()); + return Err(Error::ErrRTPTooShort); } let payload_type = b[1] & RTP_PAYLOAD_TYPE_BITMASK; @@ -224,7 +224,7 @@ impl TrackRemote { *codec = if let Some(codec) = p.codecs.first() { codec.clone() } else { - return Err(Error::ErrCodecNotFound.into()); + return Err(Error::ErrCodecNotFound); }; } { diff --git a/src/peer/certificate.rs b/src/peer/certificate.rs index 7faf7557f..4e2a49a51 100644 --- a/src/peer/certificate.rs +++ b/src/peer/certificate.rs @@ -1,7 +1,7 @@ -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::dtls_transport::dtls_fingerprint::RTCDtlsFingerprint; use crate::util::math_rand_alpha; -use anyhow::Result; + use dtls::crypto::{CryptoPrivateKey, CryptoPrivateKeyKind}; use rcgen::{CertificateParams, KeyPair, RcgenError}; use ring::signature::{EcdsaKeyPair, Ed25519KeyPair, RsaKeyPair}; @@ -67,7 +67,7 @@ impl RTCCertificate { serialized_der, } } else { - return Err(Error::new("Unsupported key_pair".to_owned()).into()); + return Err(Error::new("Unsupported key_pair".to_owned())); }; params.key_pair = Some(key_pair); @@ -82,7 +82,10 @@ impl RTCCertificate { }, stats_id: format!( "certificate-{}", - SystemTime::now().duration_since(UNIX_EPOCH)?.as_nanos() as u64 + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() as u64 ), x509_cert, expires, @@ -126,7 +129,7 @@ impl RTCCertificate { } else if key_pair.is_compatible(&rcgen::PKCS_RSA_SHA256) { params.alg = &rcgen::PKCS_RSA_SHA256; } else { - return Err(Error::new("Unsupported key_pair".to_owned()).into()); + return Err(Error::new("Unsupported key_pair".to_owned())); }; params.key_pair = Some(key_pair); diff --git a/src/peer/ice/ice_candidate/mod.rs b/src/peer/ice/ice_candidate/mod.rs index 8f03ac43b..f28221d51 100644 --- a/src/peer/ice/ice_candidate/mod.rs +++ b/src/peer/ice/ice_candidate/mod.rs @@ -1,7 +1,6 @@ use std::fmt; use std::sync::Arc; -use anyhow::Result; use ice::candidate::candidate_base::CandidateBaseConfig; use ice::candidate::candidate_host::CandidateHostConfig; use ice::candidate::candidate_peer_reflexive::CandidatePeerReflexiveConfig; @@ -10,7 +9,7 @@ use ice::candidate::candidate_server_reflexive::CandidateServerReflexiveConfig; use ice::candidate::Candidate; use serde::{Deserialize, Serialize}; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::peer::ice::ice_candidate::ice_candidate_type::RTCIceCandidateType; use crate::peer::ice::ice_protocol::RTCIceProtocol; @@ -138,7 +137,7 @@ impl RTCIceCandidate { }; config.new_candidate_relay().await? } - _ => return Err(Error::ErrICECandidateTypeUnknown.into()), + _ => return Err(Error::ErrICECandidateTypeUnknown), }; Ok(c) diff --git a/src/peer/ice/ice_gather/ice_gatherer.rs b/src/peer/ice/ice_gather/ice_gatherer.rs index 2bf2462cb..56118f63f 100644 --- a/src/peer/ice/ice_gather/ice_gatherer.rs +++ b/src/peer/ice/ice_gather/ice_gatherer.rs @@ -1,5 +1,5 @@ use crate::api::setting_engine::SettingEngine; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::ice_transport::ice_parameters::RTCIceParameters; use crate::peer::ice::ice_candidate::ice_candidate_type::RTCIceCandidateType; use crate::peer::ice::ice_candidate::*; @@ -10,7 +10,6 @@ use ice::agent::Agent; use ice::candidate::{Candidate, CandidateType}; use ice::url::Url; -use anyhow::Result; use std::future::Future; use std::pin::Pin; use std::sync::atomic::{AtomicU8, Ordering}; @@ -235,7 +234,7 @@ impl RTCIceGatherer { let (frag, pwd) = if let Some(agent) = self.get_agent().await { agent.get_local_user_credentials().await } else { - return Err(Error::ErrICEAgentNotExist.into()); + return Err(Error::ErrICEAgentNotExist); }; Ok(RTCIceParameters { @@ -252,7 +251,7 @@ impl RTCIceGatherer { let ice_candidates = if let Some(agent) = self.get_agent().await { agent.get_local_candidates().await? } else { - return Err(Error::ErrICEAgentNotExist.into()); + return Err(Error::ErrICEAgentNotExist); }; Ok(rtc_ice_candidates_from_ice_candidates(&ice_candidates)) diff --git a/src/peer/ice/ice_server.rs b/src/peer/ice/ice_server.rs index 9d2731304..c0af42c3b 100644 --- a/src/peer/ice/ice_server.rs +++ b/src/peer/ice/ice_server.rs @@ -1,8 +1,6 @@ -use crate::error::Error; +use crate::error::{Error, Result}; use crate::peer::ice::ice_credential_type::RTCIceCredentialType; -use anyhow::Result; - /// ICEServer describes a single STUN and TURN server that can be used by /// the ICEAgent to establish a connection with a peer. #[derive(Default, Debug, Clone)] @@ -15,7 +13,7 @@ pub struct RTCIceServer { impl RTCIceServer { pub(crate) fn parse_url(&self, url_str: &str) -> Result { - ice::url::Url::parse_url(url_str) + Ok(ice::url::Url::parse_url(url_str)?) } pub(crate) fn validate(&self) -> Result<()> { @@ -32,7 +30,7 @@ impl RTCIceServer { { // https://www.w3.org/TR/webrtc/#set-the-configuration (step #11.3.2) if self.username.is_empty() || self.credential.is_empty() { - return Err(Error::ErrNoTurnCredentials.into()); + return Err(Error::ErrNoTurnCredentials); } url.username = self.username.clone(); @@ -49,7 +47,7 @@ impl RTCIceServer { } }*/ } - _ => return Err(Error::ErrTurnCredentials.into()), + _ => return Err(Error::ErrTurnCredentials), }; } @@ -143,12 +141,7 @@ mod test { for (ice_server, expected_err) in tests { if let Err(err) = ice_server.urls() { - assert!( - expected_err.equal(&err), - "{:?} with err {:?}", - ice_server, - err - ); + assert_eq!(expected_err, err, "{:?} with err {:?}", ice_server, err); } else { assert!(false, "expected error, but got ok"); } @@ -164,17 +157,12 @@ mod test { credential: String::new(), credential_type: RTCIceCredentialType::Oauth, }, - ice::error::Error::ErrStunQuery, + ice::Error::ErrStunQuery, )]; for (ice_server, expected_err) in tests { if let Err(err) = ice_server.urls() { - assert!( - expected_err.equal(&err), - "{:?} with err {:?}", - ice_server, - err - ); + assert_eq!(err, expected_err, "{:?} with err {:?}", ice_server, err); } else { assert!(false, "expected error, but got ok"); } diff --git a/src/peer/operation.rs b/src/peer/operation.rs index 0e8f36673..ecf2fc54d 100644 --- a/src/peer/operation.rs +++ b/src/peer/operation.rs @@ -1,7 +1,6 @@ #[cfg(test)] mod operation_test; -use anyhow::Result; use std::fmt; use std::future::Future; use std::pin::Pin; @@ -10,6 +9,8 @@ use std::sync::Arc; use tokio::sync::mpsc; use waitgroup::WaitGroup; +use crate::error::Result; + /// Operation is a function pub struct Operation( pub Box Pin + Send + 'static>>) + Send + Sync>, diff --git a/src/peer/operation/operation_test.rs b/src/peer/operation/operation_test.rs index 206dd1ebe..bef479575 100644 --- a/src/peer/operation/operation_test.rs +++ b/src/peer/operation/operation_test.rs @@ -1,3 +1,5 @@ +use crate::error::Result; + use super::*; use tokio::sync::Mutex; @@ -13,11 +15,7 @@ async fn test_operations_enqueue() -> Result<()> { Box::pin(async move { let mut r3 = r2.lock().await; r3[k] += k * k; - if r3[k] == 225 { - true - } else { - false - } + r3[k] == 225 }) }))) .await?; diff --git a/src/peer/peer_connection.rs b/src/peer/peer_connection.rs index dd8f5a1e9..97f36efc4 100644 --- a/src/peer/peer_connection.rs +++ b/src/peer/peer_connection.rs @@ -13,7 +13,7 @@ use crate::data::data_channel::RTCDataChannel; use crate::data::sctp_transport::sctp_transport_capabilities::SCTPTransportCapabilities; use crate::data::sctp_transport::sctp_transport_state::RTCSctpTransportState; use crate::data::sctp_transport::RTCSctpTransport; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::dtls_transport::dtls_fingerprint::RTCDtlsFingerprint; use crate::media::dtls_transport::dtls_parameters::DTLSParameters; use crate::media::dtls_transport::dtls_role::{ @@ -61,7 +61,6 @@ use crate::{ SSRC_STR, }; -use anyhow::Result; use async_trait::async_trait; use ice::candidate::candidate_base::unmarshal_candidate; use ice::candidate::Candidate; @@ -177,7 +176,10 @@ impl RTCPeerConnection { Ok(RTCPeerConnection { stats_id: format!( "PeerConnection-{}", - SystemTime::now().duration_since(UNIX_EPOCH)?.as_nanos() + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() ), interceptor_rtcp_writer, internal, @@ -204,7 +206,7 @@ impl RTCPeerConnection { let now = SystemTime::now(); for cert in &configuration.certificates { if cert.expires().duration_since(now).is_err() { - return Err(Error::ErrCertificateExpired.into()); + return Err(Error::ErrCertificateExpired); } } } else { @@ -630,9 +632,9 @@ impl RTCPeerConnection { ) -> Result { let use_identity = self.idp_login_url.is_some(); if use_identity { - return Err(Error::ErrIdentityProviderNotImplemented.into()); + return Err(Error::ErrIdentityProviderNotImplemented); } else if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } if let Some(options) = options { @@ -752,7 +754,7 @@ impl RTCPeerConnection { } count += 1; if count >= 128 { - return Err(Error::ErrExcessiveRetries.into()); + return Err(Error::ErrExcessiveRetries); } } @@ -818,15 +820,15 @@ impl RTCPeerConnection { ) -> Result { let use_identity = self.idp_login_url.is_some(); if self.remote_description().await.is_none() { - return Err(Error::ErrNoRemoteDescription.into()); + return Err(Error::ErrNoRemoteDescription); } else if use_identity { - return Err(Error::ErrIdentityProviderNotImplemented.into()); + return Err(Error::ErrIdentityProviderNotImplemented); } else if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } else if self.signaling_state() != RTCSignalingState::HaveRemoteOffer && self.signaling_state() != RTCSignalingState::HaveLocalPranswer { - return Err(Error::ErrIncorrectSignalingState.into()); + return Err(Error::ErrIncorrectSignalingState); } let mut connection_role = self @@ -876,9 +878,9 @@ impl RTCPeerConnection { op: StateChangeOp, ) -> Result<()> { if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } else if sd.sdp_type == RTCSdpType::Unspecified { - return Err(Error::ErrPeerConnSDPTypeInvalidValue.into()); + return Err(Error::ErrPeerConnSDPTypeInvalidValue); } let next_state = { @@ -896,7 +898,7 @@ impl RTCPeerConnection { sd.sdp != *last_offer }; if check { - Err(new_sdpdoes_not_match_offer.into()) + Err(new_sdpdoes_not_match_offer) } else { let next_state = check_next_signaling_state( cur, @@ -920,7 +922,7 @@ impl RTCPeerConnection { sd.sdp != *last_answer }; if check { - Err(new_sdpdoes_not_match_answer.into()) + Err(new_sdpdoes_not_match_answer) } else { let next_state = check_next_signaling_state( cur, @@ -975,7 +977,7 @@ impl RTCPeerConnection { sd.sdp != *last_answer }; if check { - Err(new_sdpdoes_not_match_answer.into()) + Err(new_sdpdoes_not_match_answer) } else { let next_state = check_next_signaling_state( cur, @@ -991,7 +993,7 @@ impl RTCPeerConnection { next_state } } - _ => Err(Error::ErrPeerConnStateChangeInvalid.into()), + _ => Err(Error::ErrPeerConnStateChangeInvalid), } } StateChangeOp::SetRemote => { @@ -1075,7 +1077,7 @@ impl RTCPeerConnection { } next_state } - _ => Err(Error::ErrPeerConnStateChangeInvalid.into()), + _ => Err(Error::ErrPeerConnStateChangeInvalid), } } //_ => Err(Error::ErrPeerConnStateChangeUnhandled.into()), } @@ -1126,7 +1128,7 @@ impl RTCPeerConnection { /// set_local_description sets the SessionDescription of the local peer pub async fn set_local_description(&self, mut desc: RTCSessionDescription) -> Result<()> { if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } let have_local_description = { @@ -1145,7 +1147,7 @@ impl RTCPeerConnection { let last_offer = self.internal.last_offer.lock().await; desc.sdp = last_offer.clone(); } - _ => return Err(Error::ErrPeerConnSDPTypeInvalidValueSetLocalDescription.into()), + _ => return Err(Error::ErrPeerConnSDPTypeInvalidValueSetLocalDescription), } } @@ -1198,7 +1200,7 @@ impl RTCPeerConnection { /// set_remote_description sets the SessionDescription of the remote peer pub async fn set_remote_description(&self, mut desc: RTCSessionDescription) -> Result<()> { if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } let is_renegotation = { @@ -1227,9 +1229,7 @@ impl RTCPeerConnection { for media in &parsed.media_descriptions { if let Some(mid_value) = get_mid_value(media) { if mid_value.is_empty() { - return Err( - Error::ErrPeerConnRemoteDescriptionWithoutMidValue.into() - ); + return Err(Error::ErrPeerConnRemoteDescriptionWithoutMidValue); } if media.media_name.media == MEDIA_SECTION_APPLICATION { @@ -1450,7 +1450,7 @@ impl RTCPeerConnection { /// to the existing set of candidates. pub async fn add_ice_candidate(&self, candidate: RTCIceCandidateInit) -> Result<()> { if self.remote_description().await.is_none() { - return Err(Error::ErrNoRemoteDescription.into()); + return Err(Error::ErrNoRemoteDescription); } let candidate_value = match candidate.candidate.strip_prefix("candidate:") { @@ -1518,7 +1518,7 @@ impl RTCPeerConnection { track: Arc, ) -> Result> { if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } { @@ -1585,14 +1585,14 @@ impl RTCPeerConnection { match transceiver.sender().await { Some(sender) => Ok(sender), - None => Err(Error::ErrRTPSenderNil.into()), + None => Err(Error::ErrRTPSenderNil), } } /// remove_track removes a Track from the PeerConnection pub async fn remove_track(&self, sender: &Arc) -> Result<()> { if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } let mut transceiver = None; @@ -1633,7 +1633,7 @@ impl RTCPeerConnection { } Ok(()) } else { - Err(Error::ErrSenderNotCreatedByConnection.into()) + Err(Error::ErrSenderNotCreatedByConnection) } } @@ -1653,13 +1653,13 @@ impl RTCPeerConnection { init: &[RTCRtpTransceiverInit], ) -> Result> { if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } let direction = match init.len() { 0 => RTCRtpTransceiverDirection::Sendrecv, 1 => init[0].direction, - _ => return Err(Error::ErrPeerConnAddTransceiverFromTrackOnlyAcceptsOne.into()), + _ => return Err(Error::ErrPeerConnAddTransceiverFromTrackOnlyAcceptsOne), }; let t = self @@ -1682,7 +1682,7 @@ impl RTCPeerConnection { ) -> Result> { // https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api (Step #2) if self.internal.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } let mut params = DataChannelParameters { @@ -1721,7 +1721,7 @@ impl RTCPeerConnection { // https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api (Step #11) if params.protocol.len() > 65535 { - return Err(Error::ErrProtocolTooLarge.into()); + return Err(Error::ErrProtocolTooLarge); } // https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api (Step #12) @@ -1737,7 +1737,7 @@ impl RTCPeerConnection { // https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api (Step #16) if d.max_packet_lifetime != 0 && d.max_retransmits != 0 { - return Err(Error::ErrRetransmitsOrPacketLifeTime.into()); + return Err(Error::ErrRetransmitsOrPacketLifeTime); } { @@ -1775,7 +1775,7 @@ impl RTCPeerConnection { /// set_identity_provider is used to configure an identity provider to generate identity assertions pub fn set_identity_provider(&self, _provider: &str) -> Result<()> { - Err(Error::ErrPeerConnSetIdentityProviderNotImplemented.into()) + Err(Error::ErrPeerConnSetIdentityProviderNotImplemented) } /// write_rtcp sends a user provided RTCP packet to the connected peer. If no peer is connected the @@ -1785,7 +1785,7 @@ impl RTCPeerConnection { pkt: &(dyn rtcp::packet::Packet + Send + Sync), ) -> Result { let a = Attributes::new(); - self.interceptor_rtcp_writer.write(pkt, &a).await + Ok(self.interceptor_rtcp_writer.write(pkt, &a).await?) } /// close ends the PeerConnection @@ -1821,7 +1821,7 @@ impl RTCPeerConnection { for t in &*rtp_transceivers { if !t.stopped { if let Err(err) = t.stop().await { - close_errs.push(err); + close_errs.push(err.into()); } } } @@ -1837,17 +1837,17 @@ impl RTCPeerConnection { // https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-close (step #6) if let Err(err) = self.internal.sctp_transport.stop().await { - close_errs.push(err); + close_errs.push(err.into()); } // https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-close (step #7) if let Err(err) = self.internal.dtls_transport.stop().await { - close_errs.push(err); + close_errs.push(err.into()); } // https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-close (step #8, #9, #10) if let Err(err) = self.internal.ice_transport.stop().await { - close_errs.push(err); + close_errs.push(err.into()); } // https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-close (step #11) @@ -1861,7 +1861,7 @@ impl RTCPeerConnection { .await; if let Err(err) = self.internal.ops.close().await { - close_errs.push(err); + close_errs.push(err.into()); } flatten_errs(close_errs) diff --git a/src/peer/peer_connection/peer_connection_internal.rs b/src/peer/peer_connection/peer_connection_internal.rs index 2ed08396a..735d2f3e0 100644 --- a/src/peer/peer_connection/peer_connection_internal.rs +++ b/src/peer/peer_connection/peer_connection_internal.rs @@ -427,20 +427,20 @@ impl PeerConnectionInternal { init: &[RTCRtpTransceiverInit], ) -> Result> { if self.is_closed.load(Ordering::SeqCst) { - return Err(Error::ErrConnectionClosed.into()); + return Err(Error::ErrConnectionClosed); } let direction = match init.len() { 0 => RTCRtpTransceiverDirection::Sendrecv, 1 => init[0].direction, - _ => return Err(Error::ErrPeerConnAddTransceiverFromKindOnlyAcceptsOne.into()), + _ => return Err(Error::ErrPeerConnAddTransceiverFromKindOnlyAcceptsOne), }; let t = match direction { RTCRtpTransceiverDirection::Sendonly | RTCRtpTransceiverDirection::Sendrecv => { let codecs = self.media_engine.get_codecs_by_kind(kind).await; if codecs.is_empty() { - return Err(Error::ErrNoCodecsAvailable.into()); + return Err(Error::ErrNoCodecsAvailable); } let track = Arc::new(TrackLocalStaticSample::new( codecs[0].capability.clone(), @@ -468,7 +468,7 @@ impl PeerConnectionInternal { ) .await } - _ => return Err(Error::ErrPeerConnAddTransceiverFromKindSupport.into()), + _ => return Err(Error::ErrPeerConnAddTransceiverFromKindSupport), }; self.add_rtp_transceiver(Arc::clone(&t)).await; @@ -512,7 +512,7 @@ impl PeerConnectionInternal { )); (None, s) } - _ => return Err(Error::ErrPeerConnAddTransceiverFromTrackSupport.into()), + _ => return Err(Error::ErrPeerConnAddTransceiverFromTrackSupport), }; Ok(RTCRtpTransceiver::new( @@ -707,7 +707,7 @@ impl PeerConnectionInternal { let dtls_fingerprints = if let Some(cert) = self.dtls_transport.certificates.first() { cert.get_fingerprints()? } else { - return Err(Error::ErrNonCertificate.into()); + return Err(Error::ErrNonCertificate); }; let params = PopulateSdpParams { @@ -762,7 +762,7 @@ impl PeerConnectionInternal { for media in &parsed.media_descriptions { if let Some(mid_value) = get_mid_value(media) { if mid_value.is_empty() { - return Err(Error::ErrPeerConnRemoteDescriptionWithoutMidValue.into()); + return Err(Error::ErrPeerConnRemoteDescriptionWithoutMidValue); } if media.media_name.media == MEDIA_SECTION_APPLICATION { @@ -788,7 +788,7 @@ impl PeerConnectionInternal { && detected_plan_b) { if !detected_plan_b { - return Err(Error::ErrIncorrectSDPSemantics.into()); + return Err(Error::ErrIncorrectSDPSemantics); } // If we're responding to a plan-b offer, then we should try to fill up this // media entry with all matching local transceivers @@ -831,7 +831,7 @@ impl PeerConnectionInternal { || sdp_semantics == RTCSdpSemantics::UnifiedPlanWithFallback { if detected_plan_b { - return Err(Error::ErrIncorrectSDPSemantics.into()); + return Err(Error::ErrIncorrectSDPSemantics); } if let Some(t) = find_by_mid(mid_value, &mut local_transceivers).await { if let Some(sender) = t.sender().await { @@ -845,11 +845,11 @@ impl PeerConnectionInternal { ..Default::default() }); } else { - return Err(Error::ErrPeerConnTranscieverMidNil.into()); + return Err(Error::ErrPeerConnTranscieverMidNil); } } } else { - return Err(Error::ErrPeerConnRemoteDescriptionWithoutMidValue.into()); + return Err(Error::ErrPeerConnRemoteDescriptionWithoutMidValue); } } } @@ -900,7 +900,7 @@ impl PeerConnectionInternal { let dtls_fingerprints = if let Some(cert) = self.dtls_transport.certificates.first() { cert.get_fingerprints()? } else { - return Err(Error::ErrNonCertificate.into()); + return Err(Error::ErrNonCertificate); }; let params = PopulateSdpParams { @@ -942,9 +942,7 @@ impl PeerConnectionInternal { if let Some(only_media_section) = parsed.media_descriptions.first() { for a in &only_media_section.attributes { if a.key == SSRC_STR { - return Err( - Error::ErrPeerConnSingleMediaSectionHasExplicitSSRC.into() - ); + return Err(Error::ErrPeerConnSingleMediaSectionHasExplicitSSRC); } } @@ -987,7 +985,7 @@ impl PeerConnectionInternal { }) .await; if !audio_supported && !video_supported { - return Err(Error::ErrPeerConnSimulcastMidRTPExtensionRequired.into()); + return Err(Error::ErrPeerConnSimulcastMidRTPExtensionRequired); } let (sid_extension_id, audio_supported, video_supported) = self @@ -997,7 +995,7 @@ impl PeerConnectionInternal { }) .await; if !audio_supported && !video_supported { - return Err(Error::ErrPeerConnSimulcastStreamIDRTPExtensionRequired.into()); + return Err(Error::ErrPeerConnSimulcastStreamIDRTPExtensionRequired); } let mut b = vec![0u8; RECEIVE_MTU]; @@ -1050,11 +1048,11 @@ impl PeerConnectionInternal { } } } - return Err(Error::ErrPeerConnSimulcastIncomingSSRCFailed.into()); + return Err(Error::ErrPeerConnSimulcastIncomingSSRCFailed); } } - Err(Error::ErrPeerConnRemoteDescriptionNil.into()) + Err(Error::ErrPeerConnRemoteDescriptionNil) } async fn start_receiver( @@ -1182,13 +1180,15 @@ impl PeerConnectionInternal { } } +type IResult = std::result::Result; + #[async_trait] impl RTCPWriter for PeerConnectionInternal { async fn write( &self, pkt: &(dyn rtcp::packet::Packet + Send + Sync), _a: &Attributes, - ) -> Result { - self.dtls_transport.write_rtcp(pkt).await + ) -> IResult { + Ok(self.dtls_transport.write_rtcp(pkt).await?) } } diff --git a/src/peer/policy/sdp_semantics.rs b/src/peer/policy/sdp_semantics.rs index e709a373a..0c5e464a2 100644 --- a/src/peer/policy/sdp_semantics.rs +++ b/src/peer/policy/sdp_semantics.rs @@ -64,6 +64,7 @@ mod test { use super::*; use crate::api::media_engine::MediaEngine; use crate::api::APIBuilder; + use crate::error::Result; use crate::media::rtp::rtp_codec::{RTCRtpCodecCapability, RTPCodecType}; use crate::media::rtp::rtp_transceiver_direction::RTCRtpTransceiverDirection; use crate::media::rtp::RTCRtpTransceiverInit; @@ -72,7 +73,7 @@ mod test { use crate::peer::configuration::RTCConfiguration; use crate::peer::peer_connection::peer_connection_test::close_pair_now; use crate::SSRC_STR; - use anyhow::Result; + use sdp::media_description::MediaDescription; use sdp::session_description::SessionDescription; use std::collections::HashSet; diff --git a/src/peer/sdp/mod.rs b/src/peer/sdp/mod.rs index 5ec71a5d1..6a8297653 100644 --- a/src/peer/sdp/mod.rs +++ b/src/peer/sdp/mod.rs @@ -2,7 +2,7 @@ mod sdp_test; use crate::api::media_engine::MediaEngine; -use crate::error::Error; +use crate::error::{Error, Result}; use crate::media::dtls_transport::dtls_fingerprint::RTCDtlsFingerprint; use crate::media::ice_transport::ice_parameters::RTCIceParameters; use crate::media::rtp::rtp_codec::{RTCRtpCodecCapability, RTCRtpCodecParameters, RTPCodecType}; @@ -17,7 +17,6 @@ use crate::MEDIA_SECTION_APPLICATION; pub mod sdp_type; pub mod session_description; -use anyhow::Result; use ice::candidate::candidate_base::unmarshal_candidate; use ice::candidate::Candidate; use sdp::common_description::{Address, ConnectionInformation}; @@ -374,7 +373,7 @@ pub(crate) async fn add_transceiver_sdp( params: AddTransceiverSdpParams, ) -> Result<(SessionDescription, bool)> { if media_section.transceivers.is_empty() { - return Err(Error::ErrSDPZeroTransceivers.into()); + return Err(Error::ErrSDPZeroTransceivers); } let (is_plan_b, should_add_candidates, mid_value, dtls_role, ice_gathering_state) = ( params.is_plan_b, @@ -560,9 +559,9 @@ pub(crate) async fn populate_sdp( for (i, m) in media_sections.iter().enumerate() { if m.data && !m.transceivers.is_empty() { - return Err(Error::ErrSDPMediaSectionMediaDataChanInvalid.into()); + return Err(Error::ErrSDPMediaSectionMediaDataChanInvalid); } else if !params.is_plan_b && m.transceivers.len() > 1 { - return Err(Error::ErrSDPMediaSectionMultipleTrackInvalid.into()); + return Err(Error::ErrSDPMediaSectionMultipleTrackInvalid); } let should_add_candidates = i == 0; @@ -635,7 +634,7 @@ pub(crate) fn description_is_plan_b( ) -> Result { if let Some(desc) = desc { if let Some(parsed) = &desc.parsed { - let detection_regex = regex::Regex::new(r"(?i)^(audio|video|data)$")?; + let detection_regex = regex::Regex::new(r"(?i)^(audio|video|data)$").unwrap(); for media in &parsed.media_descriptions { if let Some(s) = get_mid_value(media) { if let Some(caps) = detection_regex.captures(s) { @@ -674,18 +673,18 @@ pub(crate) fn extract_fingerprint(desc: &SessionDescription) -> Result<(String, } if fingerprints.is_empty() { - return Err(Error::ErrSessionDescriptionNoFingerprint.into()); + return Err(Error::ErrSessionDescriptionNoFingerprint); } for m in 1..fingerprints.len() { if fingerprints[m] != fingerprints[0] { - return Err(Error::ErrSessionDescriptionConflictingFingerprints.into()); + return Err(Error::ErrSessionDescriptionConflictingFingerprints); } } let parts: Vec<&str> = fingerprints[0].split(' ').collect(); if parts.len() != 2 { - return Err(Error::ErrSessionDescriptionInvalidFingerprint.into()); + return Err(Error::ErrSessionDescriptionInvalidFingerprint); } Ok((parts[1].to_owned(), parts[0].to_owned())) @@ -726,20 +725,20 @@ pub(crate) async fn extract_ice_details( } if remote_ufrags.is_empty() { - return Err(Error::ErrSessionDescriptionMissingIceUfrag.into()); + return Err(Error::ErrSessionDescriptionMissingIceUfrag); } else if remote_pwds.is_empty() { - return Err(Error::ErrSessionDescriptionMissingIcePwd.into()); + return Err(Error::ErrSessionDescriptionMissingIcePwd); } for m in 1..remote_ufrags.len() { if remote_ufrags[m] != remote_ufrags[0] { - return Err(Error::ErrSessionDescriptionConflictingIceUfrag.into()); + return Err(Error::ErrSessionDescriptionConflictingIceUfrag); } } for m in 1..remote_pwds.len() { if remote_pwds[m] != remote_pwds[0] { - return Err(Error::ErrSessionDescriptionConflictingIcePwd.into()); + return Err(Error::ErrSessionDescriptionConflictingIcePwd); } } @@ -803,7 +802,7 @@ pub(crate) fn codecs_from_media_description( if payload_type == 0 { continue; } - return Err(err); + return Err(err.into()); } }; diff --git a/src/peer/sdp/sdp_test.rs b/src/peer/sdp/sdp_test.rs index de0a744fb..6012fa6b6 100644 --- a/src/peer/sdp/sdp_test.rs +++ b/src/peer/sdp/sdp_test.rs @@ -51,7 +51,7 @@ fn test_extract_fingerprint() -> Result<()> { let s = SessionDescription::default(); if let Err(err) = extract_fingerprint(&s) { - assert!(Error::ErrSessionDescriptionNoFingerprint.equal(&err)); + assert_eq!(Error::ErrSessionDescriptionNoFingerprint, err); } else { assert!(false); } @@ -68,7 +68,7 @@ fn test_extract_fingerprint() -> Result<()> { }; if let Err(err) = extract_fingerprint(&s) { - assert!(Error::ErrSessionDescriptionInvalidFingerprint.equal(&err)); + assert_eq!(Error::ErrSessionDescriptionInvalidFingerprint, err); } else { assert!(false); } @@ -92,7 +92,7 @@ fn test_extract_fingerprint() -> Result<()> { }; if let Err(err) = extract_fingerprint(&s) { - assert!(Error::ErrSessionDescriptionConflictingFingerprints.equal(&err)); + assert_eq!(Error::ErrSessionDescriptionConflictingFingerprints, err); } else { assert!(false); } @@ -120,7 +120,7 @@ async fn test_extract_ice_details() -> Result<()> { }; if let Err(err) = extract_ice_details(&s).await { - assert!(Error::ErrSessionDescriptionMissingIcePwd.equal(&err)); + assert_eq!(Error::ErrSessionDescriptionMissingIcePwd, err); } else { assert!(false); } @@ -140,7 +140,7 @@ async fn test_extract_ice_details() -> Result<()> { }; if let Err(err) = extract_ice_details(&s).await { - assert!(Error::ErrSessionDescriptionMissingIceUfrag.equal(&err)); + assert_eq!(Error::ErrSessionDescriptionMissingIceUfrag, err); } else { assert!(false); } @@ -216,7 +216,7 @@ async fn test_extract_ice_details() -> Result<()> { }; if let Err(err) = extract_ice_details(&s).await { - assert!(Error::ErrSessionDescriptionConflictingIceUfrag.equal(&err)); + assert_eq!(Error::ErrSessionDescriptionConflictingIceUfrag, err); } else { assert!(false); } @@ -246,7 +246,7 @@ async fn test_extract_ice_details() -> Result<()> { }; if let Err(err) = extract_ice_details(&s).await { - assert!(Error::ErrSessionDescriptionConflictingIcePwd.equal(&err)); + assert_eq!(Error::ErrSessionDescriptionConflictingIcePwd, err); } else { assert!(false); } @@ -542,8 +542,10 @@ async fn fingerprint_test( let sdparray = s.marshal(); - let v: Vec<&str> = sdparray.matches("sha-256").collect(); - assert_eq!(v.len(), expected_fingerprint_count); + assert_eq!( + sdparray.matches("sha-256").count(), + expected_fingerprint_count + ); Ok(()) } diff --git a/src/peer/sdp/session_description.rs b/src/peer/sdp/session_description.rs index e9e711090..01ba90417 100644 --- a/src/peer/sdp/session_description.rs +++ b/src/peer/sdp/session_description.rs @@ -1,6 +1,7 @@ +use crate::error::Result; + use super::sdp_type::RTCSdpType; -use anyhow::Result; use sdp::session_description::SessionDescription; use serde::{Deserialize, Serialize}; use std::io::Cursor; diff --git a/src/peer/signaling_state.rs b/src/peer/signaling_state.rs index 74e20c962..2cd8e22a3 100644 --- a/src/peer/signaling_state.rs +++ b/src/peer/signaling_state.rs @@ -1,7 +1,6 @@ -use crate::error::Error; +use crate::error::{Error, Result}; use crate::peer::sdp::sdp_type::RTCSdpType; -use anyhow::Result; use std::fmt; #[derive(Debug, Copy, Clone, PartialEq)] @@ -129,7 +128,7 @@ pub(crate) fn check_next_signaling_state( ) -> Result { // Special case for rollbacks if sdp_type == RTCSdpType::Rollback && cur == RTCSignalingState::Stable { - return Err(Error::ErrSignalingStateCannotRollback.into()); + return Err(Error::ErrSignalingStateCannotRollback); } // 4.3.1 valid state transitions @@ -205,11 +204,11 @@ pub(crate) fn check_next_signaling_state( } } _ => { - return Err(Error::ErrSignalingStateProposedTransitionInvalid.into()); + return Err(Error::ErrSignalingStateProposedTransitionInvalid); } }; - Err(Error::ErrSignalingStateProposedTransitionInvalid.into()) + Err(Error::ErrSignalingStateProposedTransitionInvalid) } #[cfg(test)] diff --git a/src/util/mod.rs b/src/util/mod.rs index 3b56362ac..93077fb81 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -1,7 +1,7 @@ pub mod mux; -use crate::error::Error; -use anyhow::Result; +use crate::error::{Error, Result}; + use rand::{thread_rng, Rng}; const RUNES_ALPHA: &[u8] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -21,11 +21,11 @@ pub fn math_rand_alpha(n: usize) -> String { } /// flatten_errs flattens multiple errors into one -pub fn flatten_errs(errs: Vec) -> Result<()> { +pub fn flatten_errs(errs: Vec>) -> Result<()> { if errs.is_empty() { Ok(()) } else { - let errs_strs: Vec = errs.into_iter().map(|e| e.to_string()).collect(); - Err(Error::new(errs_strs.join("\n")).into()) + let errs_strs: Vec = errs.into_iter().map(|e| e.into().to_string()).collect(); + Err(Error::new(errs_strs.join("\n"))) } } diff --git a/src/util/mux/endpoint.rs b/src/util/mux/endpoint.rs index 8b022d81f..cb52d0fa4 100644 --- a/src/util/mux/endpoint.rs +++ b/src/util/mux/endpoint.rs @@ -1,7 +1,6 @@ use crate::util::mux::mux_func::MatchFunc; use util::{Buffer, Conn}; -use anyhow::Result; use async_trait::async_trait; use std::collections::HashMap; use std::io; @@ -30,6 +29,8 @@ impl Endpoint { } } +type Result = std::result::Result; + #[async_trait] impl Conn for Endpoint { async fn connect(&self, _addr: SocketAddr) -> Result<()> { diff --git a/src/util/mux/mod.rs b/src/util/mux/mod.rs index b6ad690d8..d0e764784 100644 --- a/src/util/mux/mod.rs +++ b/src/util/mux/mod.rs @@ -4,10 +4,10 @@ mod mux_test; pub mod endpoint; pub mod mux_func; +use crate::error::Result; use crate::util::mux::endpoint::Endpoint; use crate::util::mux::mux_func::MatchFunc; -use anyhow::Result; use std::collections::HashMap; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; diff --git a/src/util/mux/mux_test.rs b/src/util/mux/mux_test.rs index fa7fcfa04..d6ad49389 100644 --- a/src/util/mux/mux_test.rs +++ b/src/util/mux/mux_test.rs @@ -25,7 +25,7 @@ async fn pipe_memory() -> (Arc, impl Conn) { } #[tokio::test] -async fn test_no_endpoints() -> Result<()> { +async fn test_no_endpoints() -> crate::error::Result<()> { // In memory pipe let (ca, _) = pipe(); @@ -45,6 +45,8 @@ struct MuxErrorConn { data: Vec>, } +type Result = std::result::Result; + #[async_trait] impl Conn for MuxErrorConn { async fn connect(&self, _addr: SocketAddr) -> Result<()> {