From f7f1e97671e08889af13f243f4daaa194fb02035 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 19 Feb 2026 01:50:37 +0100 Subject: [PATCH] Simple session --- Cargo.lock | 1 + Cargo.toml | 2 +- src/session.rs | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/ws/mod.rs | 4 +++ 4 files changed, 96 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 3b82341..743c953 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -276,6 +276,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", + "serde_derive", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7a353f2..70031df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2024" [dependencies] base64 = "0.22.1" rand = "0.10.0" -serde = "1.0.228" +serde = { version = "1.0.228", features = ["serde_derive"] } serde_json = "1.0.149" sha1 = "0.10.6" tokio = { version = "1.49.0", features = ["io-util", "macros", "net", "rt", "sync", "time"] } diff --git a/src/session.rs b/src/session.rs index e69de29..e7bcd9c 100644 --- a/src/session.rs +++ b/src/session.rs @@ -0,0 +1,90 @@ +use std::{marker::PhantomData, sync::Arc}; + +use serde::{Deserialize, Serialize}; +use tokio::sync::Mutex; + +use crate::ws::WebSocket; + +#[derive(Debug, Serialize, Deserialize)] +pub enum SessionMessageKind { + Request, + Response, + Notification, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct SessionMessage { + id: u32, + kind: SessionMessageKind, + data: T, +} + +pub struct Session< + Req: Serialize + for<'a> Deserialize<'a>, + Res: Serialize + for<'a> Deserialize<'a>, + PeerReq: Serialize + for<'a> Deserialize<'a>, + PeerRes: Serialize + for<'a> Deserialize<'a>, + Notification: Serialize + for<'a> Deserialize<'a>, +> { + _pd: ( + PhantomData, + PhantomData, + PhantomData, + PhantomData, + PhantomData, + ), + pub ws: WebSocket, + id: Arc>, +} + +impl< + Req: Serialize + for<'a> Deserialize<'a>, + Res: Serialize + for<'a> Deserialize<'a>, + PeerReq: Serialize + for<'a> Deserialize<'a>, + PeerRes: Serialize + for<'a> Deserialize<'a>, + Notification: Serialize + for<'a> Deserialize<'a>, +> Session +{ + pub async fn send_id( + &self, + id: u32, + kind: SessionMessageKind, + data: &T, + ) -> crate::Result<()> { + self.ws + .send_text_payload(&serde_json::to_vec(&SessionMessage { id, kind, data })?) + .await?; + + Ok(()) + } + + pub async fn send( + &self, + kind: SessionMessageKind, + data: &T, + ) -> crate::Result<()> { + self.send_id( + { + let mut i = self.id.lock().await; + *i += 1; + *i + }, + kind, + data, + ) + .await + } + + pub async fn request(&self, data: &Req) -> crate::Result<()> { + self.send(SessionMessageKind::Request, data).await + } + + pub async fn respond(&self, to_req: &SessionMessage, data: &Res) -> crate::Result<()> { + self.send_id(to_req.id, SessionMessageKind::Response, data) + .await + } + + pub async fn notify(&self, data: &Res) -> crate::Result<()> { + self.send(SessionMessageKind::Notification, data).await + } +} diff --git a/src/ws/mod.rs b/src/ws/mod.rs index 6f6227a..6a6de66 100644 --- a/src/ws/mod.rs +++ b/src/ws/mod.rs @@ -99,6 +99,10 @@ impl WebSocket { self.send_frame(0x1, msg.as_bytes()).await } + pub async fn send_text_payload(&self, payload: &[u8]) -> Result<()> { + self.send_frame(0x1, payload).await + } + pub async fn send_bin(&self, payload: &[u8]) -> Result<()> { self.send_frame(0x2, payload).await }