From ed193a3ba5201cb97625669dd09f47e9c1a65a94 Mon Sep 17 00:00:00 2001 From: Julian Braha Date: Mon, 13 May 2024 03:35:54 +0100 Subject: [PATCH] Improve Tunnel error handling (#2479) p2p: create and use TunnelError enum --- Cargo.lock | 1 + crates/p2p-tunnel/Cargo.toml | 1 + crates/p2p-tunnel/src/tunnel.rs | 24 +++++++++++++++++------- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 185f1b9ec..b80625c51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9455,6 +9455,7 @@ name = "sd-p2p-tunnel" version = "0.1.0" dependencies = [ "sd-p2p", + "thiserror", "tokio", ] diff --git a/crates/p2p-tunnel/Cargo.toml b/crates/p2p-tunnel/Cargo.toml index de13cbab9..e4e0df7bc 100644 --- a/crates/p2p-tunnel/Cargo.toml +++ b/crates/p2p-tunnel/Cargo.toml @@ -11,3 +11,4 @@ repository.workspace = true sd-p2p = { path = "../p2p" } tokio = { workspace = true, features = ["io-util"] } +thiserror = { workspace = true } diff --git a/crates/p2p-tunnel/src/tunnel.rs b/crates/p2p-tunnel/src/tunnel.rs index 9a83c4e9e..ae559c158 100644 --- a/crates/p2p-tunnel/src/tunnel.rs +++ b/crates/p2p-tunnel/src/tunnel.rs @@ -6,34 +6,44 @@ use std::{ use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, ReadBuf}; +use thiserror::Error; + use sd_p2p::UnicastStream; +#[derive(Debug, Error)] +pub enum TunnelError { + #[error("Error writing discriminator.")] + DiscriminatorWriteError, + #[error("Error reading discriminator. Is this stream actually a tunnel?")] + DiscriminatorReadError, + #[error("Invalid discriminator. Is this stream actually a tunnel?")] + InvalidDiscriminator, +} + #[derive(Debug)] pub struct Tunnel { stream: UnicastStream, } impl Tunnel { - // TODO: Proper errors - pub async fn initiator(mut stream: UnicastStream) -> Result { + pub async fn initiator(mut stream: UnicastStream) -> Result { stream .write_all(&[b'T']) .await - .map_err(|_| "Error writing discriminator")?; + .map_err(|_| TunnelError::DiscriminatorWriteError)?; // TODO: Do pairing + authentication Ok(Self { stream }) } - // TODO: Proper errors - pub async fn responder(mut stream: UnicastStream) -> Result { + pub async fn responder(mut stream: UnicastStream) -> Result { let discriminator = stream .read_u8() .await - .map_err(|_| "Error reading discriminator. Is this stream actually a tunnel?")?; + .map_err(|_| TunnelError::DiscriminatorReadError)?; if discriminator != b'T' { - return Err("Invalid discriminator. Is this stream actually a tunnel?"); + return Err(TunnelError::InvalidDiscriminator); } // TODO: Do pairing + authentication