@nolag/chat

Multi-room chat with presence, typing indicators, message replay, and user mapping.

Overview

@nolag/chat is a high-level SDK that turns any application into a fully-featured chat system. It handles room management, user presence, typing indicators, message history replay, and unread tracking, all on top of @nolag/js-sdk. You create a NoLagChat instance, connect, join rooms, and start sending messages within minutes.

Key Features

  • Multi-room chat with isolated presence per room
  • Typing indicators with automatic timeout
  • Message replay to catch up on up to 7 days of history after reconnect
  • User mapping to attach names, avatars, and metadata to each actor
  • Unread message tracking with per-room badge counts
  • Automatic reconnection with state restoration

How It Works

NoLagChat wraps the @nolag/js-sdk client and manages a lobby for global user presence. When you call joinRoom(), it returns a ChatRoom instance that subscribes to two topics: messages for durable chat history and _typing for ephemeral typing signals. A MessageStore inside each room accumulates messages and replayed history, while a PresenceManager tracks who is currently online.

TopicPurposeReplay
messagesChat messages: text, metadata, sender info7 days
_typingTyping start/stop signals (ephemeral)None

Installation

npm install @nolag/chat @nolag/js-sdk

Quick Start

import { NoLagChat } from '@nolag/chat'

// Create and connect the client
const chat = new NoLagChat('your-access-token', {
  user: { id: 'user-123', name: 'Alice', avatar: '/img/alice.png' },
})

await chat.connect()

// Join a room
const room = await chat.joinRoom('general')

// Send a message
await room.sendMessage('Hello everyone!')

// Listen for messages
room.on('message', (msg) => {
  console.log(`[${msg.sender.name}]: ${msg.text}`)
  console.log('Sent at:', new Date(msg.timestamp))
})

// Listen for typing indicators
room.on('typing', ({ user, isTyping }) => {
  console.log(`${user.name} is ${isTyping ? 'typing...' : 'no longer typing'}`)
})

// Trigger typing events
room.startTyping()
// ... user stops typing
room.stopTyping()

// Get online users in this room
const users = room.getUsers()
console.log('Online:', users.length)

// Leave when done
await chat.leaveRoom('general')
chat.disconnect()

API Reference

NoLagChat

The main class. Manages the WebSocket connection, global user presence, and room lifecycle.

MethodDescription
connect()Establish WebSocket connection and announce presence in the lobby
disconnect()Gracefully close the connection and clear all rooms
joinRoom(name)Join a chat room; returns a ChatRoom instance
leaveRoom(name)Leave a room and unsubscribe from its topics
getOnlineUsers()Return all users currently online across all rooms
setStatus(status)Update your own presence status (e.g. 'away', 'busy')
updateProfile(profile)Update display name, avatar, or other profile fields broadcast to peers

Events: NoLagChat

EventPayloadDescription
connectednoneWebSocket connection established
disconnectedreason: stringConnection closed
reconnectednoneReconnection successful; rooms are restored automatically
errorerror: ErrorUnrecoverable error occurred
userOnlineuser: ChatUserA user has come online in the lobby
userOfflineuser: ChatUserA user has gone offline
userUpdateduser: ChatUserA user updated their profile or status

ChatRoom

Returned by joinRoom(). Scoped to a single room; handles messaging, typing, and per-room presence.

MethodDescription
sendMessage(text)Publish a chat message to the room
getMessages()Return all messages currently in the local store (including replayed history)
startTyping()Broadcast a typing-start signal to other room members
stopTyping()Broadcast a typing-stop signal
getUsers()Return users currently present in this room
markRead()Mark all messages in this room as read, resetting the unread count

Events: ChatRoom

EventPayloadDescription
messageChatMessageIncoming message from another user
messageSentChatMessageConfirmation that your own message was delivered
userJoinedChatUserA user joined this room
userLeftChatUserA user left this room
typing{ user: ChatUser, isTyping: boolean }A user started or stopped typing
replayStart{ count: number }Historical message replay is beginning
replayEnd{ replayed: number }Historical message replay is complete
unreadChanged{ count: number }The unread message count for this room changed