mirror of
https://github.com/modrinth/code.git
synced 2026-08-25 09:04:55 +00:00
* 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 3caad59bb4.
* 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 },
|
|
}
|