feat(room): add TypingEvent type and TypingStart/TypingStop event variants

Add TypingEvent struct in queue::types for broadcast-based typing
indicators, and TypingStart/TypingStop variants in RoomEventType for
WebSocket event dispatch.
This commit is contained in:
ZhenYi 2026-04-24 00:04:01 +08:00
parent 22b5eab769
commit e83512382f
3 changed files with 18 additions and 1 deletions

View File

@ -7,7 +7,7 @@ pub mod worker;
pub use producer::{MessageProducer, RedisPubSub}; pub use producer::{MessageProducer, RedisPubSub};
pub use types::{ pub use types::{
AgentTaskEvent, EmailEnvelope, ProjectRoomEvent, ReactionGroup, RoomMessageEnvelope, AgentTaskEvent, EmailEnvelope, ProjectRoomEvent, ReactionGroup, RoomMessageEnvelope,
RoomMessageEvent, RoomMessageStreamChunkEvent, RoomMessageEvent, RoomMessageStreamChunkEvent, TypingEvent,
}; };
pub use worker::{ pub use worker::{
room_worker_task, start as start_worker, start_email_worker, EmailSendFn, EmailSendFut, GetRedis, room_worker_task, start as start_worker, start_email_worker, EmailSendFn, EmailSendFut, GetRedis,

View File

@ -42,6 +42,17 @@ pub struct RoomMessageEvent {
pub message_id: Option<Uuid>, pub message_id: Option<Uuid>,
} }
/// Typing indicator event — broadcast to all room members.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TypingEvent {
pub room_id: Uuid,
pub user_id: Uuid,
pub username: String,
pub avatar_url: Option<String>,
/// "start" or "stop"
pub action: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReactionGroup { pub struct ReactionGroup {
pub emoji: String, pub emoji: String,

View File

@ -33,6 +33,8 @@ pub enum RoomEventType {
ReadReceipt, ReadReceipt,
ReactionAdded, ReactionAdded,
ReactionRemoved, ReactionRemoved,
TypingStart,
TypingStop,
} }
impl RoomEventType { impl RoomEventType {
@ -55,6 +57,8 @@ impl RoomEventType {
RoomEventType::ReadReceipt => "read_receipt", RoomEventType::ReadReceipt => "read_receipt",
RoomEventType::ReactionAdded => "reaction_added", RoomEventType::ReactionAdded => "reaction_added",
RoomEventType::ReactionRemoved => "reaction_removed", RoomEventType::ReactionRemoved => "reaction_removed",
RoomEventType::TypingStart => "typing_start",
RoomEventType::TypingStop => "typing_stop",
} }
} }
@ -77,6 +81,8 @@ impl RoomEventType {
"read_receipt" => Some(RoomEventType::ReadReceipt), "read_receipt" => Some(RoomEventType::ReadReceipt),
"reaction_added" => Some(RoomEventType::ReactionAdded), "reaction_added" => Some(RoomEventType::ReactionAdded),
"reaction_removed" => Some(RoomEventType::ReactionRemoved), "reaction_removed" => Some(RoomEventType::ReactionRemoved),
"typing_start" => Some(RoomEventType::TypingStart),
"typing_stop" => Some(RoomEventType::TypingStop),
_ => None, _ => None,
} }
} }