@siran/chat-supabase-events
v0.1.16
Published
Implémentation Supabase des adaptateurs d'événements en temps réel pour le système de chat.
Downloads
650
Readme
@package/chat-supabase-events
Implémentation Supabase des adaptateurs d'événements en temps réel pour le système de chat.
Description
Ce package fournit les implémentations Supabase des ports RealTimeEventEmitter et RealTimeEventSubscriber définis dans @siran/chat-core. Il utilise Supabase Realtime pour émettre et recevoir des événements via des channels WebSocket.
Installation
bun installUtilisation
RealTimeEventEmitter
Pour émettre des événements en temps réel :
import { createSupabaseRealTimeEventEmitter } from "@package/chat-supabase-events";
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
const eventEmitter = createSupabaseRealTimeEventEmitter(supabase);
// Émettre un événement à une conversation
await eventEmitter.emitToConversation(conversationId, {
type: "message.created",
conversationId,
payload: { message },
timestamp: new Date(),
});
// Émettre un événement à un utilisateur
await eventEmitter.emitToUser(userId, event);
// Émettre un événement à plusieurs utilisateurs
await eventEmitter.emitToUsers([userId1, userId2], event);RealTimeEventSubscriber
Pour s'abonner aux événements en temps réel :
import { createSupabaseRealTimeEventSubscriber } from "@package/chat-supabase-events";
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
const subscriber = createSupabaseRealTimeEventSubscriber(supabase);
// S'abonner aux événements d'une conversation
const unsubscribe = subscriber.subscribeToConversation(
conversationId,
(event) => {
console.log("Nouvel événement:", event);
// Traiter l'événement...
}
);
// Plus tard, se désabonner
unsubscribe();
// S'abonner aux événements d'un utilisateur
const unsubscribeUser = subscriber.subscribeToUser(userId, (event) => {
console.log("Événement utilisateur:", event);
});Architecture
Channels Supabase
Le package utilise deux types de channels Supabase :
Channels de conversation :
conversation:{conversationId}- Utilisés pour diffuser des événements à tous les participants d'une conversation
- Format :
conversation:{uuid}
Channels utilisateur :
user:{userId}- Utilisés pour envoyer des événements à un utilisateur spécifique
- Format :
user:{uuid}
Gestion des channels
- Les channels sont créés à la demande et réutilisés
- Les channels sont automatiquement nettoyés lorsqu'il n'y a plus de callbacks actifs
- La méthode
cleanup()peut être appelée pour nettoyer tous les channels manuellement
Événements supportés
Tous les types d'événements définis dans @siran/chat-core sont supportés :
message.createdmessage.updatedmessage.deletedmessage.status_changedconversation.createdconversation.updatedconversation.deletedconversation.last_message_updateduser.typinguser.presence_changed
Configuration Supabase
Pour que ce package fonctionne, Supabase Realtime doit être activé pour les tables concernées. Les migrations SQL dans @package/chat/supabase/repo/migrations configurent automatiquement les tables nécessaires.
Notes de performance
- Les channels sont réutilisés pour éviter de créer trop de connexions WebSocket
- Les événements sont sérialisés en JSON avant l'envoi
- Les callbacks sont exécutés de manière synchrone, donc les opérations longues devraient être déléguées à un worker ou une queue
Nettoyage
Il est recommandé d'appeler cleanup() lors de la destruction de l'instance pour libérer les ressources :
// Pour l'emitter
await eventEmitter.cleanup();
// Pour le subscriber
await subscriber.cleanup();