DOCUMENTAZIONE

Realtime

Funzioni live per la tua app: invia messaggi a tutti su un canale, mostra chi è online e ricevi le modifiche delle righe del database nel momento in cui avvengono.

← Tutta la documentazione

Come funziona

  • La tua app apre una sola connessione WebSocket con espobase.realtime, usando la chiave pubblicabile del progetto. Il token di accesso dell'utente che ha effettuato l'accesso viene inviato automaticamente, mai nell'URL.
  • Un canale è un nome scelto dalla tua app, come room-1. Tutti quelli che entrano nello stesso canale del tuo progetto ne condividono i messaggi e la presenza.
  • Le modifiche del database arrivano dalle tabelle che attivi. Ogni modifica viene riletta tramite la tua API REST come ciascun iscritto, quindi sono le regole di sicurezza della tabella a decidere chi riceve quale riga.

1. Attiva il realtime su una tabella

Nella dashboard apri Realtime (menu a sinistra) e attiva la tabella. La tabella deve avere una chiave primaria. Possono cambiarlo amministratori e proprietari; le modifiche vengono registrate nel log di audit.

2. Ascolta le modifiche delle righe

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 è INSERT, UPDATE, DELETE o * (predefinito). filter tiene solo le righe che corrispondono a column=op.value (op: eq, neq, lt, lte, gt, gte). Aggiungi i listener prima di join().

3. Broadcast e presenza

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

I messaggi broadcast non vengono salvati. Lo stato di presenza arriva a 2 KB per client e viene rimosso automaticamente quando un client si disconnette.

Sicurezza

  • Le modifiche delle righe rispettano la sicurezza a livello di riga: ogni iscritto riceve solo le righe che il suo utente può leggere, nella forma restituita dall'API REST.
  • Le eliminazioni inviano solo la chiave primaria della riga eliminata (la riga non esiste più, quindi non si può verificare). I filtri non si applicano alle eliminazioni.
  • I canali di broadcast e presenza sono aperti a chiunque abbia la tua chiave pubblicabile. Non inviare dati privati via broadcast; usa le modifiche del database protette dalle regole di sicurezza.
  • Le chiavi segrete funzionano solo dai server (mai dai browser) e vedono tutte le modifiche.

Limiti

  • Free: 200 connessioni simultanee per progetto, 2M di messaggi al mese. Esauriti i messaggi del mese, il nuovo traffico realtime viene rifiutato fino al ciclo di fatturazione successivo.
  • Pro: 500 connessioni simultanee per progetto, 5M di messaggi al mese.
  • Group: 1.000 connessioni simultanee per progetto, 10M di messaggi al mese.
  • I messaggi sono ciò che ricevono i client: broadcast, aggiornamenti di presenza e modifiche del database. Ogni messaggio è al massimo di 64 KB; un client può inviare fino a 50 messaggi al secondo ed entrare in fino a 100 canali.