DOKUMENTATION

Realtime

Live-Funktionen für deine App: Sende Nachrichten an alle in einem Kanal, zeige, wer online ist, und erhalte Zeilenänderungen aus deiner Datenbank, sobald sie passieren.

← Gesamte Dokumentation

So funktioniert's

  • Deine App öffnet mit espobase.realtime eine einzige WebSocket-Verbindung mit dem öffentlichen Schlüssel des Projekts. Das Zugriffstoken des angemeldeten Nutzers wird automatisch gesendet, nie in der URL.
  • Ein Kanal ist ein Name, den deine App wählt, zum Beispiel room-1. Alle, die demselben Kanal in deinem Projekt beitreten, teilen seine Nachrichten und seine Presence.
  • Datenbankänderungen kommen aus den Tabellen, die du einschaltest. Jede Änderung wird über deine REST-API für jeden Abonnenten neu gelesen, also entscheiden die Sicherheitsregeln der Tabelle, wer welche Zeile erhält.

1. Realtime für eine Tabelle einschalten

Öffne im Dashboard Realtime (linkes Menü) und schalte die Tabelle ein. Die Tabelle braucht einen Primärschlüssel. Ändern können das Administratoren und Inhaber; Änderungen werden im Audit-Log festgehalten.

2. Zeilenänderungen empfangen

import { createClient } from "@espobase/client";

const espobase = createClient(PROJECT_URL, PUBLISHABLE_KEY);

const room = espobase.realtime
  .channel("room-1")
  .onChange("messages", (change) => {
    // change.event: "INSERT" | "UPDATE" | "DELETE"
    // change.record: the row (INSERT, UPDATE); change.old: the primary key (DELETE)
    console.log(change.event, change.record ?? change.old);
  }, { filter: "room_id=eq.1" });

await room.join();

event ist INSERT, UPDATE, DELETE oder * (Standard). filter behält nur Zeilen, die column=op.value entsprechen (op: eq, neq, lt, lte, gt, gte). Füge Listener vor join() hinzu.

3. Broadcast und Presence

const room = espobase.realtime
  .channel("room-1", { presence: { key: user.id } })
  .onMessage("typing", (payload) => showTyping(payload))
  .onPresence((online) => showOnline(Object.keys(online)));

await room.join();
await room.track({ name: user.name });          // who's here
await room.send("typing", { name: user.name }); // everyone else on the channel

await room.leave(); // when done

Broadcasts werden nicht gespeichert. Der Presence-Status ist bis zu 2 KB pro Client groß und wird automatisch entfernt, wenn ein Client die Verbindung trennt.

Sicherheit

  • Zeilenänderungen beachten Row Level Security: Jeder Abonnent erhält nur die Zeilen, die sein Nutzer lesen darf, in der Form, in der die REST-API sie liefert.
  • Bei Löschungen wird nur der Primärschlüssel der gelöschten Zeile gesendet (die Zeile existiert nicht mehr und kann nicht geprüft werden). Filter gelten nicht für Löschungen.
  • Broadcast- und Presence-Kanäle stehen allen offen, die deinen öffentlichen Schlüssel haben. Sende keine privaten Daten per Broadcast, sondern nutze Datenbankänderungen, die durch Sicherheitsregeln geschützt sind.
  • Geheime Schlüssel funktionieren nur auf Servern (nie im Browser) und sehen alle Änderungen.

Limits

  • Free: 200 gleichzeitige Verbindungen pro Projekt, 2M Nachrichten pro Monat. Sind die Nachrichten des Monats aufgebraucht, wird neuer Realtime-Verkehr bis zum nächsten Abrechnungszeitraum abgelehnt.
  • Pro: 500 gleichzeitige Verbindungen pro Projekt, 5M Nachrichten pro Monat.
  • Group: 1.000 gleichzeitige Verbindungen pro Projekt, 10M Nachrichten pro Monat.
  • Nachrichten sind, was Clients empfangen: Broadcasts, Presence-Updates und Datenbankänderungen. Eine Nachricht ist höchstens 64 KB groß; ein Client kann bis zu 50 Nachrichten pro Sekunde senden und bis zu 100 Kanälen beitreten.