supabase_rust_realtime/
message.rs1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct RealtimeMessage {
7 pub topic: String,
8 pub event: ChannelEvent, pub payload: serde_json::Value, #[serde(rename = "ref")]
11 pub message_ref: serde_json::Value, }
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
16#[serde(rename_all = "snake_case")] pub enum ChannelEvent {
18 Insert, Update,
20 Delete,
21 All, PostgresChanges, #[serde(rename = "phx_join")] PhoenixJoin,
26 #[serde(rename = "phx_reply")]
27 PhoenixReply,
28 #[serde(rename = "phx_error")]
29 PhoenixError,
30 #[serde(rename = "phx_close")]
31 PhoenixClose,
32
33 Heartbeat,
34 Presence,
35 Broadcast,
36 }
38
39impl std::fmt::Display for ChannelEvent {
40 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41 write!(
44 f,
45 "{}",
46 serde_json::to_string(self).unwrap_or_else(|_| format!("{:?}", self))
47 )
48 }
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct Payload {
69 pub data: serde_json::Value,
71 #[serde(rename = "type")] pub event_type: Option<String>,
73 pub timestamp: Option<String>, }
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct PresenceChange {
79 pub joins: HashMap<String, serde_json::Value>,
80 pub leaves: HashMap<String, serde_json::Value>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct PresenceState {
86 pub state: HashMap<String, serde_json::Value>,
88}
89
90impl PresenceState {
91 pub fn new() -> Self {
92 Self {
93 state: HashMap::new(),
94 }
95 }
96
97 pub fn sync(&mut self, presence_diff: &PresenceChange) {
99 for (key, value) in &presence_diff.joins {
100 self.state.insert(key.clone(), value.clone());
101 }
102 for key in presence_diff.leaves.keys() {
103 self.state.remove(key);
104 }
105 }
106
107 pub fn list(&self) -> Vec<(String, serde_json::Value)> {
109 self.state
110 .iter()
111 .map(|(k, v)| (k.clone(), v.clone()))
112 .collect()
113 }
114
115 pub fn get(&self, key: &str) -> Option<&serde_json::Value> {
117 self.state.get(key)
118 }
119}
120
121impl Default for PresenceState {
122 fn default() -> Self {
123 Self::new()
124 }
125}