Skip to main content

supabase_client_realtime/
lib.rs

1//! Supabase Realtime WebSocket client.
2//!
3//! This crate implements the Phoenix Channels v1.0.0 protocol to provide
4//! real-time subscriptions for Postgres changes, broadcast messages, and
5//! presence tracking.
6//!
7//! # Usage
8//!
9//! ```ignore
10//! use supabase_client_sdk::prelude::*;
11//!
12//! let realtime = client.realtime()?;
13//! realtime.connect().await?;
14//!
15//! let channel = realtime.channel("db-changes")
16//!     .on_postgres_changes(
17//!         PostgresChangesEvent::Insert,
18//!         PostgresChangesFilter::new("public", "messages"),
19//!         |payload| println!("New row: {:?}", payload.record),
20//!     )
21//!     .subscribe(|status, _err| println!("Status: {}", status))
22//!     .await?;
23//! ```
24
25pub mod callback;
26pub mod channel;
27pub mod client;
28pub mod error;
29pub(crate) mod presence;
30pub(crate) mod protocol;
31pub(crate) mod transport;
32pub mod types;
33
34// Re-exports for convenient access
35pub use channel::{ChannelBuilder, RealtimeChannel};
36pub use client::RealtimeClient;
37pub use error::RealtimeError;
38pub use types::{
39    BroadcastConfig, ChannelState, ColumnInfo, JoinConfig, JoinPayload,
40    PostgresChangePayload, PostgresChangesEvent, PostgresChangesFilter, PresenceConfig,
41    PresenceDiff, PresenceEntry, PresenceMeta, PresenceState, RealtimeConfig,
42    ReconnectConfig, SubscriptionStatus,
43};
44
45use supabase_client_core::SupabaseClient;
46
47/// Extension trait to create a [`RealtimeClient`] from a [`SupabaseClient`].
48pub trait SupabaseClientRealtimeExt {
49    /// Create a [`RealtimeClient`] from the client's configuration.
50    ///
51    /// Requires `supabase_url` and `supabase_key` to be set in the config.
52    fn realtime(&self) -> Result<RealtimeClient, RealtimeError>;
53}
54
55impl SupabaseClientRealtimeExt for SupabaseClient {
56    fn realtime(&self) -> Result<RealtimeClient, RealtimeError> {
57        RealtimeClient::new(self.supabase_url(), self.api_key())
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64    use supabase_client_core::config::SupabaseConfig;
65
66    #[test]
67    fn test_realtime_extension_trait() {
68        let config = SupabaseConfig::new("http://localhost:54321", "test-key");
69        let client = SupabaseClient::new(config).unwrap();
70        let realtime = client.realtime();
71        assert!(realtime.is_ok());
72        let realtime = realtime.unwrap();
73        assert!(realtime.is_connected() == false);
74    }
75}