TLS 1.3, channel persistence, membership signaling

- 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
This commit is contained in:
loki5512344 2026-07-09 12:48:18 +02:00
parent 523680e05d
commit 5534cd01f7
Signed by: boba
GPG key ID: 253067914055423B
37 changed files with 771 additions and 160 deletions

View file

@ -21,3 +21,4 @@ tracing-subscriber.workspace = true
anyhow.workspace = true
toml.workspace = true
serde.workspace = true
serde_json.workspace = true

View file

@ -1,7 +1,12 @@
mod voice_membership;
use anyhow::Result;
use std::sync::Arc;
use tokio::sync::broadcast;
use tracing::info;
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
@ -28,12 +33,34 @@ async fn main() -> Result<()> {
let voice_bind = cfg.voice.bind.clone();
let gate_cfg = Arc::new(cfg);
let (voice_member_tx, _) = broadcast::channel::<String>(256);
let mut voice_member_rx = voice_member_tx.subscribe();
let voice_handle = tokio::spawn(async move {
tokio::spawn(async move {
while let Ok(event_str) = voice_member_rx.recv().await {
if let Ok(event) = serde_json::from_str::<serde_json::Value>(&event_str) {
let event_type = event["type"].as_str().unwrap_or("");
let channel_id = event["channel_id"].as_str().unwrap_or("");
let user_id = event["user_id"].as_str().unwrap_or("");
match event_type {
"joined" => {
info!("voice member joined channel {}: {}", channel_id, user_id);
}
"left" => {
info!("voice member left channel {}: {}", channel_id, user_id);
}
_ => {}
}
}
}
});
vnox_voice_node::runner::run_bind(&node_name, &voice_bind).await
});
let gate_handle = tokio::spawn(async move {
vnox_gateway::run(gate_cfg).await
vnox_gateway::run(gate_cfg, Some(voice_member_tx)).await
});
tokio::select! {

View file

@ -0,0 +1,22 @@
use tokio::sync::broadcast;
#[derive(Clone, Debug)]
pub enum VoiceMembershipEvent {
Joined {
channel_id: String,
session_id: String,
user_id: String,
},
Left {
channel_id: String,
session_id: String,
user_id: String,
},
}
pub fn voice_membership_channel() -> (
broadcast::Sender<VoiceMembershipEvent>,
broadcast::Receiver<VoiceMembershipEvent>,
) {
broadcast::channel(256)
}