Temps réel
Des fonctions en direct pour votre app. Envoyez des messages à tout un canal, affichez qui est en ligne et recevez les modifications des lignes de votre base de données au moment où elles se produisent.
Fonctionnement
- Votre app ouvre une seule connexion WebSocket avec
espobase.realtime, avec la clé publiable du projet. Le jeton d'accès de l'utilisateur connecté est envoyé automatiquement, jamais dans l'URL. - Un canal est un nom choisi par votre app, comme
room-1. Toutes les personnes qui rejoignent le même canal de votre projet en partagent les messages et la présence. - Les modifications de la base de données viennent des tables que vous activez. Chaque modification est relue via votre API REST en tant que chaque abonné, ce sont donc les règles de sécurité de la table qui décident qui reçoit quelle ligne.
1. Activer le temps réel sur une table
Dans le tableau de bord, ouvrez Temps réel (menu de gauche) et activez la table. La table doit avoir une clé primaire. Les administrateurs et les propriétaires peuvent le modifier, et chaque modification est enregistrée dans le journal d'audit.
2. Écouter les modifications des lignes
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 vaut INSERT, UPDATE, DELETE ou * (par défaut). filter ne garde que les lignes qui correspondent à column=op.value (op parmi eq, neq, lt, lte, gt, gte). Ajoutez les écouteurs avant join().
3. Messages diffusés et présence
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 doneLes messages diffusés ne sont pas enregistrés. L'état de présence fait au plus 2 Ko par client et disparaît automatiquement quand un client se déconnecte.
Sécurité
- Les modifications des lignes respectent la sécurité au niveau des lignes. Chaque abonné reçoit uniquement les lignes que son utilisateur peut lire, sous la forme renvoyée par l'API REST.
- Les suppressions n'envoient que la clé primaire de la ligne supprimée (la ligne n'existe plus, elle ne peut donc pas être vérifiée). Les filtres ne s'appliquent pas aux suppressions.
- Les canaux de messages et de présence sont ouverts à toute personne disposant de votre clé publiable. N'envoyez pas de données privées par message diffusé, utilisez plutôt les modifications de la base de données protégées par des règles de sécurité.
- Les clés secrètes ne fonctionnent que depuis des serveurs (jamais depuis un navigateur) et voient toutes les modifications.
Limites
- Free : 200 connexions simultanées par projet, 2M de messages par mois. Une fois les messages du mois épuisés, le nouveau trafic temps réel est refusé jusqu'au cycle de facturation suivant.
- Pro : 500 connexions simultanées par projet, 5M de messages par mois.
- Group : 1 000 connexions simultanées par projet, 10M de messages par mois.
- Les messages sont ce que reçoivent les clients (messages diffusés, mises à jour de présence et modifications de la base de données). Chaque message fait au plus 64 Ko, et un client peut envoyer jusqu'à 50 messages par seconde et rejoindre jusqu'à 100 canaux.