gitdataai/libs/transport/handler/inbound/msg.rs

70 lines
2.0 KiB
Rust

use room::ws_context::WsUserContext;
use crate::error::AppTransportError;
use crate::handler::session::TransportSession;
use crate::handler::types::WsOutEvent;
use room::connection::MAX_ROOMS_PER_SESSION;
pub(crate) async fn ping() -> Result<Option<WsOutEvent>, AppTransportError> {
Ok(Some(WsOutEvent::Pong {
protocol_version: crate::handler::types::WS_PROTOCOL_VERSION,
}))
}
pub(crate) async fn subscribe(
session: &TransportSession,
room: models::RoomId,
) -> Result<Option<WsOutEvent>, AppTransportError> {
// Per-session room subscription limit
if session.subscriptions.len() >= MAX_ROOMS_PER_SESSION {
return Err(AppTransportError::RateLimitExceeded);
}
let sub = session.subscribe_room(room).await?;
session.subscriptions.insert(room, sub);
session.service.room.spawn_room_workers(room);
session.refresh_project().await;
Ok(None)
}
pub(crate) async fn unsubscribe(
session: &TransportSession,
room: models::RoomId,
) -> Result<Option<WsOutEvent>, AppTransportError> {
session.unsubscribe_room(room).await;
Ok(None)
}
pub(crate) async fn typing_start(
session: &TransportSession,
room: models::RoomId,
) -> Result<Option<WsOutEvent>, AppTransportError> {
session.broadcast_typing(room, "start").await;
Ok(None)
}
pub(crate) async fn typing_stop(
session: &TransportSession,
room: models::RoomId,
) -> Result<Option<WsOutEvent>, AppTransportError> {
session.broadcast_typing(room, "stop").await;
Ok(None)
}
pub(crate) async fn read_receipt(
session: &TransportSession,
room: models::RoomId,
last_read_seq: i64,
) -> Result<Option<WsOutEvent>, AppTransportError> {
let ctx = WsUserContext::new(session.user.user_id);
session
.service
.room
.room_user_state_update_read_seq(room, last_read_seq, &ctx)
.await
.map_err(|e| {
tracing::warn!(error = %e, "room_user_state_update_read_seq failed");
AppTransportError::Internal
})?;
Ok(None)
}