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.
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 doneI 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.