You've already forked AstralRinth
forked from didirus/AstralRinth
* Fix not being able to connect to local friends socket * Start basic work on tunneling protocol and move some code into a common crate * Commonize message serialization logic * Serialize Base62Ids as u64 when human-readability is not required * Move ActiveSockets tuple into struct * Make CI run when rust-common is updated CI is currently broken for labrinth, however * Fix theseus-release.yml to reference itself correctly * Implement Labrinth side of tunneling * Implement non-friend part of theseus tunneling * Implement client-side except for socket loop * Implement the socket loop Doesn't work though. Debugging time! * Fix config.rs * Fix deadlock in labrinth socket handling * Update dockerfile * switch to workspace prepare at root level * Wait for connection before tunneling in playground * Move rust-common into labrinth * Remove rust-common references from Actions * Revert "Update dockerfile" This reverts commit 3caad59bb474ce425d0b8928d7cee7ae1a5011bd. * Fix Docker build * Rebuild Theseus if common code changes * Allow multiple connections from the same user * Fix test building * Move FriendSocketListening and FriendSocketStoppedListening to non-panicking TODO for now * Make message_serialization macro take varargs for binary messages * Improve syntax of message_serialization macro * Remove the ability to connect to a virtual socket, and disable the ability to listen on one * Allow the app to compile without running labrinth * Clippy fix * Update Rust and Clippy fix again --------- Co-authored-by: Jai A <jaiagr+gpg@pm.me>
69 lines
1.6 KiB
Rust
69 lines
1.6 KiB
Rust
//! "Database" for Hydra
|
|
|
|
use crate::models::users::{UserId, UserStatus};
|
|
use actix_ws::Session;
|
|
use dashmap::{DashMap, DashSet};
|
|
use std::sync::atomic::AtomicU32;
|
|
use uuid::Uuid;
|
|
|
|
pub type SocketId = u32;
|
|
|
|
pub struct ActiveSockets {
|
|
pub sockets: DashMap<SocketId, ActiveSocket>,
|
|
pub sockets_by_user_id: DashMap<UserId, DashSet<SocketId>>,
|
|
pub next_socket_id: AtomicU32,
|
|
pub tunnel_sockets: DashMap<Uuid, TunnelSocket>,
|
|
}
|
|
|
|
impl Default for ActiveSockets {
|
|
fn default() -> Self {
|
|
Self {
|
|
sockets: DashMap::new(),
|
|
sockets_by_user_id: DashMap::new(),
|
|
next_socket_id: AtomicU32::new(0),
|
|
tunnel_sockets: DashMap::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ActiveSockets {
|
|
pub fn get_status(&self, user: UserId) -> Option<UserStatus> {
|
|
self.sockets_by_user_id
|
|
.get(&user)
|
|
.and_then(|x| x.iter().next().and_then(|x| self.sockets.get(&*x)))
|
|
.map(|x| x.status.clone())
|
|
}
|
|
}
|
|
|
|
pub struct ActiveSocket {
|
|
pub status: UserStatus,
|
|
pub socket: Session,
|
|
pub owned_tunnel_sockets: DashSet<Uuid>,
|
|
}
|
|
|
|
impl ActiveSocket {
|
|
pub fn new(status: UserStatus, session: Session) -> Self {
|
|
Self {
|
|
status,
|
|
socket: session,
|
|
owned_tunnel_sockets: DashSet::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct TunnelSocket {
|
|
pub owner: SocketId,
|
|
pub socket_type: TunnelSocketType,
|
|
}
|
|
|
|
impl TunnelSocket {
|
|
pub fn new(owner: SocketId, socket_type: TunnelSocketType) -> Self {
|
|
Self { owner, socket_type }
|
|
}
|
|
}
|
|
|
|
pub enum TunnelSocketType {
|
|
Listening,
|
|
Connected { connected_to: Uuid },
|
|
}
|