- TLS 1.3 on TCP (rustls + tokio-rustls, optional self-signed cert) - Server-side channel CRUD with SQLite persistence - Gateway → voice-node membership bridge via broadcast channel
37 lines
937 B
Rust
37 lines
937 B
Rust
use anyhow::Result;
|
|
use tokio::io::{AsyncRead, AsyncWrite};
|
|
|
|
use crate::{
|
|
domain::session,
|
|
net::io,
|
|
proto::{FriendDeclinePayload, PacketId, SessionCrypto, to_payload},
|
|
};
|
|
|
|
pub async fn handle_friend_decline(
|
|
stream: &mut (impl AsyncRead + AsyncWrite + Unpin),
|
|
seq: &mut u32,
|
|
session_id: &str,
|
|
payload: &[u8],
|
|
crypto: &SessionCrypto,
|
|
state: &crate::net::state::State,
|
|
) -> Result<()> {
|
|
let req: FriendDeclinePayload = serde_json::from_slice(payload)?;
|
|
let sess = session::get(&state.sessions, session_id)
|
|
.await
|
|
.ok_or_else(|| anyhow::anyhow!("session not found"))?;
|
|
|
|
state
|
|
.storage
|
|
.decline_friend_request(&req.from_user_id, &sess.user_id)
|
|
.await?;
|
|
|
|
io::send_encrypted(
|
|
stream,
|
|
PacketId::FriendDecline,
|
|
seq,
|
|
&to_payload(&serde_json::json!({"status": "DECLINED"})),
|
|
crypto,
|
|
)
|
|
.await?;
|
|
Ok(())
|
|
}
|