npm package: @siran/chat-supabase-events
Description: Implémentation Supabase des adaptateurs d'événements en temps réel pour le système de chat.
Latest version: 0.1.16

# @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

```bash
bun install
```

## Utilisation

### RealTimeEventEmitter

Pour émettre des événements en temps réel :

```typescript
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 :

```typescript
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 :

1. **Channels de conversation** : `conversation:{conversationId}`
   - Utilisés pour diffuser des événements à tous les participants d'une conversation
   - Format : `conversation:{uuid}`

2. **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.created`
- `message.updated`
- `message.deleted`
- `message.status_changed`
- `conversation.created`
- `conversation.updated`
- `conversation.deleted`
- `conversation.last_message_updated`
- `user.typing`
- `user.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 :

```typescript
// Pour l'emitter
await eventEmitter.cleanup();

// Pour le subscriber
await subscriber.cleanup();
```