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
| Nom | Type | Requis | Défaut | Description |
|---|---|---|---|---|
store | ChatStore | oui | — | createInMemoryChatStore() ou createMongoChatStore(db) |
Retour
Un ChatService :
| Méthode | Rô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
| Code | Quand | Comment corriger |
|---|---|---|
LEGBA_INVALID_CHAT_REQUEST | roomName, senderIdentity ou text vide/blanc | Fournir une valeur non vide pour le champ nommé dans le message |
LEGBA_CHAT_INVALID_CURSOR | listMessages : before est une chaîne vide/blanche | Omettre 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/listMessagesne touchent jamaislivekit-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.beforeest un curseur opaque : toujours la valeuridd’un message déjà rendu par ce même magasin, jamais une valeur construite à la main. Unbeforebien 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é :listMessagesne charge jamais tout l’historique par défaut. - C’est le
ChatStore(pascreateChatService) qui assigneidet garantit l’ordre stable, y compris pour deux messages envoyés à la même seconde — voircreateInMemoryChatStoreetcreateMongoChatStore.