By default, Broadcast and Presence are enabled for all projects.
By default, listening to database changes is disabled for new projects due to database performance and security concerns. You can turn it on by managing Realtime's replication.
You can receive the "previous" data for updates and deletes by setting the table's REPLICA IDENTITY to FULL (e.g., ALTER TABLE your_table REPLICA IDENTITY FULL;).
Row level security is not applied to delete statements. When RLS is enabled and replica identity is set to full, only the primary key is sent to clients.
Examples
Listen to broadcast messages
channel = supabase.channel("room1")
def on_subscribe(status, err):
if status == RealtimeSubscribeStates.SUBSCRIBED:
channel.send_broadcast(
"cursor-pos",
\{"x": random.random(), "y": random.random()\}
)
def handle_broadcast(payload):
print("Cursor position received!", payload)
channel.on_broadcast(event="cursor-pos", callback=handle_broadcast).subscribe(on_subscribe)
Listen to presence sync
channel = supabase.channel("room1")
def on_subscribe(status, err):
if status == RealtimeSubscribeStates.SUBSCRIBED:
channel.track(\{"online_at": datetime.datetime.now().isoformat()\})
def handle_presence_sync():
print("Synced presence state: ", channel.presence.state)
channel.on_presence_sync(callback=handle_presence_sync).subscribe(on_subscribe)
Listen to presence join
channel = supabase.channel("room1")
def handle_presence_join(key, current_presence, new_presence):
print("Newly joined presences: ", new_presence)
def on_subscribe(status, err):
if status == RealtimeSubscribeStates.SUBSCRIBED:
channel.track(\{"online_at": datetime.datetime.now().isoformat()\})
channel.on_presence_join(callback=handle_presence_join).subscribe(on_subscribe)
Listen to presence leave
channel = supabase.channel("room1")
def handle_presence_leave(key, current_presence, left_presence):
print("Newly left presences: ", left_presence)
def on_subscribe(status, err):
if status == RealtimeSubscribeStates.SUBSCRIBED:
channel.track(\{"online_at": datetime.datetime.now().isoformat()\})
channel.untrack()
channel.on_presence_leave(callback=handle_presence_leave).subscribe(on_subscribe)