Products
Realtime
Database changes, broadcast and presence over WebSockets.
This page is available in Polish only for now. The commands, code and API calls below are the same in every language — an English translation is on its way. Open the Polish page
Realtime pozwala subskrybować trzy rodzaje zdarzeń: Postgres Changes (INSERT/UPDATE/DELETE w tabelach), Broadcast (wiadomości między klientami) oraz Presence (kto jest online).
Włączenie tabeli
alter publication supabase_realtime add table todos;
Nasłuchiwanie zmian
const channel = supabase
.channel("todos-zmiany")
.on(
"postgres_changes",
{ event: "*", schema: "public", table: "todos" },
(payload) => console.log("Zmiana:", payload)
)
.subscribe();
// sprzątanie
await supabase.removeChannel(channel);
Broadcast
const room = supabase.channel("pokoj-1");
room.on("broadcast", { event: "kursor" }, ({ payload }) => rysujKursor(payload));
await room.subscribe();
await room.send({ type: "broadcast", event: "kursor", payload: { x: 10, y: 20 } });
Presence
const room = supabase.channel("pokoj-1", { config: { presence: { key: userId } } });
room.on("presence", { event: "sync" }, () => console.log(room.presenceState()));
await room.subscribe(async (status) => {
if (status === "SUBSCRIBED") await room.track({ online_at: new Date().toISOString() });
});
Zdarzenia Postgres Changes respektują polityki RLS — klient otrzyma tylko te wiersze, które ma prawo odczytać.
Realtime w panelu
- Inspektor — dołącz do kanału z przeglądarki, wysyłaj wiadomości broadcast, obserwuj presence i zmiany w tabelach na żywo.
- Publikacja — przełącznikiem przy tabeli dodasz ją do publikacji
supabase_realtime(lub usuniesz) bez pisania SQL. - Metryki — liczba aktywnych połączeń WebSocket projektu na wykresie.
Kanały prywatne
Kanał utworzony z config: { private: true } wymaga zalogowanego użytkownika i polityk RLS na tabeli realtime.messages — bez nich subskrypcja zostanie odrzucona.
-- odbiór wiadomości w kanałach "pokoj:<id>" tylko dla członków pokoju
create policy "członkowie czytają"
on realtime.messages for select to authenticated
using (
realtime.topic() like 'pokoj:%'
and exists (
select 1 from public.czlonkowie_pokoi c
where c.user_id = auth.uid() and 'pokoj:' || c.pokoj_id = realtime.topic()
)
);
-- wysyłanie broadcast w tych samych kanałach
create policy "członkowie wysyłają"
on realtime.messages for insert to authenticated
with check (realtime.topic() like 'pokoj:%');
const kanal = supabase.channel("pokoj:42", { config: { private: true } });