mirror of
https://github.com/shiroyashik/sculptor.git
synced 2025-12-06 04:51:13 +03:00
I tried adding hang session cleanup as it works in Figura, but it doesn't work as it should.
Apparently authCheck (a variable from NetworkStuff.java), is updated a bit unexpectedly.
This commit is contained in:
parent
a08985544f
commit
48b2b7eeab
3 changed files with 16 additions and 1 deletions
|
|
@ -1,7 +1,9 @@
|
|||
use std::time::Duration;
|
||||
|
||||
use anyhow::bail;
|
||||
use axum::{body::Bytes, extract::{ws::{Message, WebSocket}, State}};
|
||||
use dashmap::DashMap;
|
||||
use tokio::sync::{broadcast, mpsc};
|
||||
use tokio::{sync::{broadcast, mpsc}, time::{sleep_until, Instant}};
|
||||
use tracing::instrument;
|
||||
|
||||
use crate::{auth::Userinfo, AppState};
|
||||
|
|
@ -67,6 +69,7 @@ async fn handle_socket(mut ws: WebSocket, state: AppState) {
|
|||
#[instrument(skip_all, fields(nickname = %session.user.nickname))]
|
||||
async fn main_worker(session: &mut WSSession, ws: &mut WebSocket, state: &AppState) -> anyhow::Result<()> {
|
||||
tracing::debug!("WebSocket control for {} is transferred to the main worker", session.user.nickname);
|
||||
let mut keep_alive = Instant::now() + Duration::from_secs(360); // 5 minutes and one more just in case + Don't forget about UpdateKeepAlive
|
||||
loop {
|
||||
tokio::select! {
|
||||
external_msg = ws.recv_and_decode() => {
|
||||
|
|
@ -137,9 +140,17 @@ async fn main_worker(session: &mut WSSession, ws: &mut WebSocket, state: &AppSta
|
|||
);
|
||||
bail!("{} banned!", session.user.nickname)
|
||||
},
|
||||
SessionMessage::UpdateKeepAlive => {
|
||||
tracing::trace!(keep_alive = ?keep_alive.saturating_duration_since(Instant::now()), "UpdateKeepAlive");
|
||||
keep_alive = Instant::now() + Duration::from_secs(360);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ = sleep_until(keep_alive) => {
|
||||
let _ = ws.send(Message::Close(Some(axum::extract::ws::CloseFrame { code: 4000, reason: "Re-auth".into() }))).await;
|
||||
bail!("session expired");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,4 +12,5 @@ pub struct WSSession {
|
|||
pub enum SessionMessage {
|
||||
Ping(Vec<u8>),
|
||||
Banned,
|
||||
UpdateKeepAlive,
|
||||
}
|
||||
|
|
@ -295,6 +295,9 @@ pub async fn check_auth(
|
|||
Err(ApiError::Unauthorized)
|
||||
} else {
|
||||
debug!(nickname = user.nickname, status = "ok", "Token verified successfully");
|
||||
if let Some(session) = state.session.get(&user.uuid) {
|
||||
let _ = session.send(crate::api::figura::SessionMessage::UpdateKeepAlive).await;
|
||||
};
|
||||
Ok("ok")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue