use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use systemprompt_identifiers::{DocumentEditSessionId, DocumentId, DocumentNodeId, UserId};
pub const AWARENESS_COLOR_MAX: usize = 32;
pub const AWARENESS_CURSOR_MAX: usize = 512;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum AwarenessMode {
Viewing,
Editing,
Commenting,
Presenting,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct AwarenessCursor {
pub block: DocumentNodeId,
pub anchor: String,
pub head: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct AwarenessViewport {
pub first: DocumentNodeId,
pub last: DocumentNodeId,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct AwarenessState {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_id: Option<DocumentEditSessionId>,
pub color: String,
pub mode: AwarenessMode,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cursor: Option<AwarenessCursor>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub selection: Vec<AwarenessCursor>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub viewport: Option<AwarenessViewport>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct DocumentAwarenessEvent {
pub document_id: DocumentId,
pub user_id: UserId,
pub display_name: String,
pub state: AwarenessState,
pub expires_at: DateTime<Utc>,
}
impl DocumentAwarenessEvent {
pub const NAME: &'static str = "document.awareness";
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum LiveResyncReason {
SessionChanged,
UpdatesCompacted,
Lagged,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct DocumentLiveReadyEvent {
pub document_id: DocumentId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub edit_session_id: Option<DocumentEditSessionId>,
pub replayed: usize,
}
impl DocumentLiveReadyEvent {
pub const NAME: &'static str = "document.live.ready";
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct DocumentLiveResyncEvent {
pub document_id: DocumentId,
pub reason: LiveResyncReason,
}
impl DocumentLiveResyncEvent {
pub const NAME: &'static str = "document.live.resync";
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct DocumentLiveClosedEvent {
pub document_id: DocumentId,
}
impl DocumentLiveClosedEvent {
pub const NAME: &'static str = "document.live.closed";
}