createChatService

expérimentaldepuis 0.1.0@legba-core/realtime

createChatService

Ce que ça fait

Orchestration du chat persistant au-dessus d’un ChatStore (mémoire ou MongoDB) : valide les entrées, assigne l’horodatage d’envoi, délègue la persistance et la pagination au magasin. N’a aucune dépendance à LiveKit ou à une connexion RTC — un message s’envoie et se lit indépendamment de tout appel en cours.

Signature

function createChatService(store: ChatStore): ChatService

Paramètres

NomTypeRequisDéfautDescription
storeChatStoreouicreateInMemoryChatStore() ou createMongoChatStore(db)

Retour

Un ChatService :

MéthodeRôle
sendMessage(roomName, senderIdentity, text)Persiste un message et rend l’objet complet (id, sentAt assignés)
listMessages(roomName, options?){ limit?, before? } — rend l’historique, du plus ancien au plus récent dans la page

Erreurs

CodeQuandComment corriger
LEGBA_INVALID_CHAT_REQUESTroomName, senderIdentity ou text vide/blancFournir une valeur non vide pour le champ nommé dans le message
LEGBA_CHAT_INVALID_CURSORlistMessages : before est une chaîne vide/blancheOmettre before ou passer un id déjà rendu par un appel précédent

Exemple minimal

import { createChatService, createInMemoryChatStore } from "@legba-core/realtime";

const chat = createChatService(createInMemoryChatStore());
await chat.sendMessage("salle-demo", "alice", "bonjour !");
const history = await chat.listMessages("salle-demo");

Exemple complet

import { createChatService, createMongoChatStore, LegbaChatError } from "@legba-core/realtime";
import { MongoClient } from "mongodb";

const client = await MongoClient.connect(process.env.MONGO_URL!);
const chat = createChatService(createMongoChatStore(client.db("mon-app")));

try {
  await chat.sendMessage("salle-demo", "alice", "");
} catch (error) {
  if (error instanceof LegbaChatError) {
    console.error(error.code, error.message);
  }
}

// pagination : charger la page précédente à partir du message le plus ancien déjà affiché
const firstPage = await chat.listMessages("salle-demo", { limit: 50 });
const oldest = firstPage[0];
const previousPage = oldest
  ? await chat.listMessages("salle-demo", { limit: 50, before: oldest.id })
  : [];

Pièges

  • sendMessage/listMessages ne touchent jamais livekit-client : un message envoyé sans aucune connexion RTC active à la salle est persisté normalement — le chat est entièrement découplé de la couche temps réel.
  • before est un curseur opaque : toujours la valeur id d’un message déjà rendu par ce même magasin, jamais une valeur construite à la main. Un before bien formé mais inconnu (par exemple d’un autre magasin) ne lève pas d’erreur — il rend simplement un tableau vide.
  • Sans limit, DEFAULT_CHAT_PAGE_SIZE (50) est appliqué : listMessages ne charge jamais tout l’historique par défaut.
  • C’est le ChatStore (pas createChatService) qui assigne id et garantit l’ordre stable, y compris pour deux messages envoyés à la même seconde — voir createInMemoryChatStore et createMongoChatStore.

Voir aussi