@nolag/chat 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +183 -0
- package/dist/ChatRoom.d.ts +82 -0
- package/dist/EventEmitter.d.ts +31 -0
- package/dist/MessageStore.d.ts +30 -0
- package/dist/NoLagChat.d.ts +95 -0
- package/dist/PresenceManager.d.ts +40 -0
- package/dist/TypingManager.d.ts +52 -0
- package/dist/browser.d.ts +8 -0
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -0
- package/dist/constants.d.ts +12 -0
- package/dist/index.cjs +1091 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.mjs +1087 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types.d.ts +117 -0
- package/dist/utils.d.ts +9 -0
- package/package.json +57 -0
package/README.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# @nolag/chat
|
|
2
|
+
|
|
3
|
+
High-level chat SDK for [NoLag](https://nolag.app) — multi-room chat, presence, typing indicators, and message replay.
|
|
4
|
+
|
|
5
|
+
## How It Works with NoLag
|
|
6
|
+
|
|
7
|
+
NoLag is a real-time messaging platform that handles WebSocket connections, message routing, persistence, and scaling. This SDK wraps the low-level [@nolag/js-sdk](https://www.npmjs.com/package/@nolag/js-sdk) and gives you a purpose-built chat API — rooms, messages, typing indicators, and presence — without needing to manage topics or subscriptions yourself.
|
|
8
|
+
|
|
9
|
+
### Getting Your Token
|
|
10
|
+
|
|
11
|
+
1. Sign up at [nolag.app](https://nolag.app)
|
|
12
|
+
2. Create a new **project** in the portal
|
|
13
|
+
3. Choose the **Chat** blueprint when creating an app — this pre-configures the topics (`messages`, `_typing`), rooms, and lobbies your chat app needs
|
|
14
|
+
4. Go to the app's **Tokens** page and generate an **actor token**
|
|
15
|
+
5. Use that token when connecting with this SDK
|
|
16
|
+
|
|
17
|
+
Each token identifies a unique user (actor) in NoLag. The blueprint handles all the infrastructure setup — you just write your chat UI.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @nolag/js-sdk @nolag/chat
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { NoLagChat } from "@nolag/chat";
|
|
29
|
+
|
|
30
|
+
const chat = new NoLagChat("YOUR_ACTOR_TOKEN", {
|
|
31
|
+
username: "Alice",
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
await chat.connect();
|
|
35
|
+
|
|
36
|
+
// Join a room and send a message
|
|
37
|
+
const room = chat.joinRoom("general");
|
|
38
|
+
room.sendMessage("Hello, everyone!");
|
|
39
|
+
|
|
40
|
+
// Listen for messages
|
|
41
|
+
room.on("message", (msg) => {
|
|
42
|
+
console.log(`${msg.username}: ${msg.text}`);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// See who's online
|
|
46
|
+
chat.on("userOnline", (user) => {
|
|
47
|
+
console.log(`${user.username} came online`);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Typing indicators
|
|
51
|
+
room.startTyping(); // auto-stops after timeout
|
|
52
|
+
room.on("typing", (users) => {
|
|
53
|
+
console.log("Typing:", users.map((u) => u.username).join(", "));
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## API Reference
|
|
58
|
+
|
|
59
|
+
### `NoLagChat`
|
|
60
|
+
|
|
61
|
+
#### Constructor
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
const chat = new NoLagChat(token: string, options: NoLagChatOptions);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Options:**
|
|
68
|
+
|
|
69
|
+
| Option | Type | Default | Description |
|
|
70
|
+
|--------|------|---------|-------------|
|
|
71
|
+
| `username` | `string` | *required* | Display name for this user |
|
|
72
|
+
| `avatar` | `string` | — | Avatar URL |
|
|
73
|
+
| `metadata` | `Record<string, unknown>` | — | Custom user data |
|
|
74
|
+
| `rooms` | `string[]` | — | Auto-join these rooms on connect |
|
|
75
|
+
| `typingTimeout` | `number` | `3000` | Ms before typing indicator auto-clears |
|
|
76
|
+
| `maxMessageCache` | `number` | `500` | Max messages kept in memory per room |
|
|
77
|
+
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
78
|
+
| `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
|
|
79
|
+
|
|
80
|
+
#### Methods
|
|
81
|
+
|
|
82
|
+
| Method | Returns | Description |
|
|
83
|
+
|--------|---------|-------------|
|
|
84
|
+
| `connect()` | `Promise<void>` | Connect to NoLag |
|
|
85
|
+
| `disconnect()` | `void` | Disconnect |
|
|
86
|
+
| `joinRoom(name)` | `ChatRoom` | Join a chat room |
|
|
87
|
+
| `leaveRoom(name)` | `void` | Leave a room |
|
|
88
|
+
| `getRooms()` | `ChatRoom[]` | Get all joined rooms |
|
|
89
|
+
| `getOnlineUsers()` | `ChatUser[]` | Get all online users |
|
|
90
|
+
| `setStatus(status)` | `void` | Set status: `'online'`, `'away'`, `'busy'`, `'offline'` |
|
|
91
|
+
| `updateProfile(updates)` | `void` | Update username, avatar, or metadata |
|
|
92
|
+
|
|
93
|
+
#### Properties
|
|
94
|
+
|
|
95
|
+
| Property | Type | Description |
|
|
96
|
+
|----------|------|-------------|
|
|
97
|
+
| `connected` | `boolean` | Whether currently connected |
|
|
98
|
+
| `localUser` | `ChatUser \| null` | The current user |
|
|
99
|
+
| `rooms` | `Map<string, ChatRoom>` | All joined rooms |
|
|
100
|
+
|
|
101
|
+
#### Events
|
|
102
|
+
|
|
103
|
+
| Event | Payload | Description |
|
|
104
|
+
|-------|---------|-------------|
|
|
105
|
+
| `connected` | — | Connected to NoLag |
|
|
106
|
+
| `disconnected` | — | Disconnected |
|
|
107
|
+
| `reconnected` | — | Reconnected after disconnect |
|
|
108
|
+
| `error` | `Error` | Connection or protocol error |
|
|
109
|
+
| `userOnline` | `ChatUser` | A user came online |
|
|
110
|
+
| `userOffline` | `ChatUser` | A user went offline |
|
|
111
|
+
| `userUpdated` | `ChatUser` | A user updated their profile/status |
|
|
112
|
+
|
|
113
|
+
### `ChatRoom`
|
|
114
|
+
|
|
115
|
+
#### Methods
|
|
116
|
+
|
|
117
|
+
| Method | Returns | Description |
|
|
118
|
+
|--------|---------|-------------|
|
|
119
|
+
| `sendMessage(text, options?)` | `ChatMessage` | Send a message |
|
|
120
|
+
| `getMessages()` | `ChatMessage[]` | Get cached messages |
|
|
121
|
+
| `startTyping()` | `void` | Broadcast typing indicator |
|
|
122
|
+
| `stopTyping()` | `void` | Clear typing indicator |
|
|
123
|
+
| `getUsers()` | `ChatUser[]` | Get users in this room |
|
|
124
|
+
| `getUser(userId)` | `ChatUser \| undefined` | Get a specific user |
|
|
125
|
+
| `markRead()` | `void` | Mark all messages as read |
|
|
126
|
+
|
|
127
|
+
#### Properties
|
|
128
|
+
|
|
129
|
+
| Property | Type | Description |
|
|
130
|
+
|----------|------|-------------|
|
|
131
|
+
| `name` | `string` | Room name |
|
|
132
|
+
| `messages` | `ChatMessage[]` | Cached messages |
|
|
133
|
+
| `typingUsers` | `ChatUser[]` | Users currently typing |
|
|
134
|
+
| `unreadCount` | `number` | Number of unread messages |
|
|
135
|
+
| `active` | `boolean` | Whether currently joined |
|
|
136
|
+
|
|
137
|
+
#### Events
|
|
138
|
+
|
|
139
|
+
| Event | Payload | Description |
|
|
140
|
+
|-------|---------|-------------|
|
|
141
|
+
| `message` | `ChatMessage` | New message received |
|
|
142
|
+
| `messageSent` | `ChatMessage` | Your message was confirmed |
|
|
143
|
+
| `userJoined` | `ChatUser` | User joined the room |
|
|
144
|
+
| `userLeft` | `ChatUser` | User left the room |
|
|
145
|
+
| `typing` | `ChatUser[]` | Typing users changed |
|
|
146
|
+
| `replayStart` | — | Message replay started |
|
|
147
|
+
| `replayEnd` | — | Message replay finished |
|
|
148
|
+
| `unreadChanged` | `number` | Unread count changed |
|
|
149
|
+
|
|
150
|
+
## Types
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
interface ChatUser {
|
|
154
|
+
userId: string;
|
|
155
|
+
actorTokenId: string;
|
|
156
|
+
username: string;
|
|
157
|
+
avatar?: string;
|
|
158
|
+
metadata?: Record<string, unknown>;
|
|
159
|
+
status: "online" | "away" | "busy" | "offline";
|
|
160
|
+
joinedAt: number;
|
|
161
|
+
isLocal: boolean;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
interface ChatMessage {
|
|
165
|
+
id: string;
|
|
166
|
+
userId: string;
|
|
167
|
+
username: string;
|
|
168
|
+
avatar?: string;
|
|
169
|
+
text: string;
|
|
170
|
+
data?: Record<string, unknown>;
|
|
171
|
+
timestamp: number;
|
|
172
|
+
status: "sending" | "sent" | "error";
|
|
173
|
+
isReplay: boolean;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
interface SendMessageOptions {
|
|
177
|
+
data?: Record<string, unknown>;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## License
|
|
182
|
+
|
|
183
|
+
MIT
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { RoomContext } from '@nolag/js-sdk';
|
|
2
|
+
import { EventEmitter } from './EventEmitter';
|
|
3
|
+
import type { ChatRoomEvents, ChatMessage, ChatUser, ChatPresenceData, ResolvedChatOptions, SendMessageOptions } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* ChatRoom — a single chat room with messages, users, and typing indicators.
|
|
6
|
+
*
|
|
7
|
+
* Created via `NoLagChat.joinRoom(name)`. Do not instantiate directly.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ChatRoom extends EventEmitter<ChatRoomEvents> {
|
|
10
|
+
/** Room name */
|
|
11
|
+
readonly name: string;
|
|
12
|
+
private _roomContext;
|
|
13
|
+
private _localUser;
|
|
14
|
+
private _options;
|
|
15
|
+
private _presenceManager;
|
|
16
|
+
private _typingManager;
|
|
17
|
+
private _messageStore;
|
|
18
|
+
private _log;
|
|
19
|
+
private _unreadCount;
|
|
20
|
+
private _active;
|
|
21
|
+
/** @internal */
|
|
22
|
+
constructor(name: string, roomContext: RoomContext, localUser: ChatUser, options: ResolvedChatOptions, log: (...args: unknown[]) => void);
|
|
23
|
+
/** All remote users currently in this room */
|
|
24
|
+
get users(): Map<string, ChatUser>;
|
|
25
|
+
/** All messages in this room (timestamp order) */
|
|
26
|
+
get messages(): ChatMessage[];
|
|
27
|
+
/** Users currently typing */
|
|
28
|
+
get typingUsers(): ChatUser[];
|
|
29
|
+
/** Number of unread messages (increments when room is not active) */
|
|
30
|
+
get unreadCount(): number;
|
|
31
|
+
/** Whether this room is the currently active (visible) room */
|
|
32
|
+
get active(): boolean;
|
|
33
|
+
/** Reset the unread count to zero */
|
|
34
|
+
markRead(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Send a text message to this room. Returns an optimistic ChatMessage.
|
|
37
|
+
*/
|
|
38
|
+
sendMessage(text: string, options?: SendMessageOptions): ChatMessage;
|
|
39
|
+
/**
|
|
40
|
+
* Get all messages (alias for the messages getter).
|
|
41
|
+
*/
|
|
42
|
+
getMessages(): ChatMessage[];
|
|
43
|
+
/**
|
|
44
|
+
* Signal that the local user is typing. Auto-stops after timeout.
|
|
45
|
+
*/
|
|
46
|
+
startTyping(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Explicitly signal that the local user has stopped typing.
|
|
49
|
+
*/
|
|
50
|
+
stopTyping(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Get all remote users in this room.
|
|
53
|
+
*/
|
|
54
|
+
getUsers(): ChatUser[];
|
|
55
|
+
/**
|
|
56
|
+
* Get a specific user by userId.
|
|
57
|
+
*/
|
|
58
|
+
getUser(userId: string): ChatUser | undefined;
|
|
59
|
+
/** @internal Subscribe to message/typing topics and attach listeners (all rooms) */
|
|
60
|
+
_subscribe(): void;
|
|
61
|
+
/** @internal Set presence and fetch room members (active room only) */
|
|
62
|
+
_activate(): void;
|
|
63
|
+
/** @internal Clear presence state but keep subscriptions alive */
|
|
64
|
+
_deactivate(): void;
|
|
65
|
+
/** @internal Handle a lobby presence:join event routed from NoLagChat */
|
|
66
|
+
_handlePresenceJoin(actorTokenId: string, presenceData: ChatPresenceData): void;
|
|
67
|
+
/** @internal Handle a lobby presence:leave event routed from NoLagChat */
|
|
68
|
+
_handlePresenceLeave(actorTokenId: string): void;
|
|
69
|
+
/** @internal Handle a lobby presence:update event routed from NoLagChat */
|
|
70
|
+
_handlePresenceUpdate(actorTokenId: string, presenceData: ChatPresenceData): void;
|
|
71
|
+
/** @internal Handle replay start event */
|
|
72
|
+
_handleReplayStart(count: number): void;
|
|
73
|
+
/** @internal Handle replay end event */
|
|
74
|
+
_handleReplayEnd(replayed: number): void;
|
|
75
|
+
/** @internal Re-set presence after reconnect */
|
|
76
|
+
_updateLocalPresence(): void;
|
|
77
|
+
/** @internal Unsubscribe and clean up */
|
|
78
|
+
_cleanup(): void;
|
|
79
|
+
private _handleIncomingMessage;
|
|
80
|
+
private _markRead;
|
|
81
|
+
private _setPresence;
|
|
82
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny typed event emitter — framework-agnostic base for NoLagChat and ChatRoom.
|
|
3
|
+
*
|
|
4
|
+
* EventMap is a record of event name → tuple of handler arguments.
|
|
5
|
+
* e.g. { message: [ChatMessage]; typing: [{ users: ChatUser[] }] }
|
|
6
|
+
*/
|
|
7
|
+
export declare class EventEmitter<EventMap extends {
|
|
8
|
+
[K in keyof EventMap]: unknown[];
|
|
9
|
+
}> {
|
|
10
|
+
private _handlers;
|
|
11
|
+
/**
|
|
12
|
+
* Register an event handler.
|
|
13
|
+
*/
|
|
14
|
+
on<K extends keyof EventMap>(event: K, handler: (...args: EventMap[K]) => void): this;
|
|
15
|
+
/**
|
|
16
|
+
* Remove a specific handler, or all handlers for an event.
|
|
17
|
+
*/
|
|
18
|
+
off<K extends keyof EventMap>(event: K, handler?: (...args: EventMap[K]) => void): this;
|
|
19
|
+
/**
|
|
20
|
+
* Remove all handlers for all events.
|
|
21
|
+
*/
|
|
22
|
+
removeAllListeners(): this;
|
|
23
|
+
/**
|
|
24
|
+
* Emit an event to all registered handlers.
|
|
25
|
+
*/
|
|
26
|
+
protected emit<K extends keyof EventMap>(event: K, ...args: EventMap[K]): void;
|
|
27
|
+
/**
|
|
28
|
+
* Returns the number of handlers registered for an event.
|
|
29
|
+
*/
|
|
30
|
+
listenerCount<K extends keyof EventMap>(event: K): number;
|
|
31
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ChatMessage } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Bounded, deduplicated message cache ordered by timestamp.
|
|
4
|
+
*/
|
|
5
|
+
export declare class MessageStore {
|
|
6
|
+
private _messages;
|
|
7
|
+
private _ids;
|
|
8
|
+
private _maxSize;
|
|
9
|
+
constructor(maxSize: number);
|
|
10
|
+
/**
|
|
11
|
+
* Add a message. Returns true if the message was new (not a duplicate).
|
|
12
|
+
*/
|
|
13
|
+
add(message: ChatMessage): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Get all messages in timestamp order.
|
|
16
|
+
*/
|
|
17
|
+
getAll(): ChatMessage[];
|
|
18
|
+
/**
|
|
19
|
+
* Get message count.
|
|
20
|
+
*/
|
|
21
|
+
get size(): number;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a message ID exists.
|
|
24
|
+
*/
|
|
25
|
+
has(id: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Clear all messages.
|
|
28
|
+
*/
|
|
29
|
+
clear(): void;
|
|
30
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { EventEmitter } from './EventEmitter';
|
|
2
|
+
import { ChatRoom } from './ChatRoom';
|
|
3
|
+
import type { NoLagChatOptions, ChatClientEvents, ChatUser } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* NoLagChat — high-level chat SDK built on @nolag/js-sdk.
|
|
6
|
+
*
|
|
7
|
+
* Provides multi-room chat, presence (who's online), typing indicators,
|
|
8
|
+
* message replay, and user mapping — all framework-agnostic via events.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { NoLagChat } from '@nolag/chat';
|
|
13
|
+
*
|
|
14
|
+
* const chat = new NoLagChat(token, { username: 'Alice' });
|
|
15
|
+
*
|
|
16
|
+
* chat.on('connected', () => console.log('Connected!'));
|
|
17
|
+
* chat.on('userOnline', (user) => console.log(user.username, 'is online'));
|
|
18
|
+
*
|
|
19
|
+
* await chat.connect();
|
|
20
|
+
*
|
|
21
|
+
* const room = chat.joinRoom('general');
|
|
22
|
+
* room.on('message', (msg) => console.log(msg.username + ':', msg.text));
|
|
23
|
+
* room.sendMessage('Hello!');
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class NoLagChat extends EventEmitter<ChatClientEvents> {
|
|
27
|
+
private _token;
|
|
28
|
+
private _options;
|
|
29
|
+
private _client;
|
|
30
|
+
private _localUser;
|
|
31
|
+
private _rooms;
|
|
32
|
+
private _lobby;
|
|
33
|
+
private _onlineUsers;
|
|
34
|
+
private _actorToUserId;
|
|
35
|
+
private _activeRoom;
|
|
36
|
+
private _userId;
|
|
37
|
+
private _log;
|
|
38
|
+
constructor(token: string, options: NoLagChatOptions);
|
|
39
|
+
/** Whether the underlying connection is established */
|
|
40
|
+
get connected(): boolean;
|
|
41
|
+
/** The local user's info (available after connect) */
|
|
42
|
+
get localUser(): ChatUser | null;
|
|
43
|
+
/** All currently joined rooms */
|
|
44
|
+
get rooms(): Map<string, ChatRoom>;
|
|
45
|
+
/**
|
|
46
|
+
* Connect to NoLag and set up global presence.
|
|
47
|
+
*/
|
|
48
|
+
connect(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Disconnect from NoLag and clean up all rooms.
|
|
51
|
+
*/
|
|
52
|
+
disconnect(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Join (activate) a chat room. Deactivates the previous active room.
|
|
55
|
+
* If the room was pre-subscribed via the `rooms` option, activates it.
|
|
56
|
+
* Otherwise creates, subscribes, and activates it.
|
|
57
|
+
*/
|
|
58
|
+
joinRoom(name: string): ChatRoom;
|
|
59
|
+
/**
|
|
60
|
+
* Leave a chat room. Fully unsubscribes and removes it.
|
|
61
|
+
*/
|
|
62
|
+
leaveRoom(name: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* Get all joined rooms.
|
|
65
|
+
*/
|
|
66
|
+
getRooms(): ChatRoom[];
|
|
67
|
+
/**
|
|
68
|
+
* Get all users currently online across all rooms.
|
|
69
|
+
*/
|
|
70
|
+
getOnlineUsers(): ChatUser[];
|
|
71
|
+
/**
|
|
72
|
+
* Update the local user's online status.
|
|
73
|
+
*/
|
|
74
|
+
setStatus(status: ChatUser['status']): void;
|
|
75
|
+
/**
|
|
76
|
+
* Update the local user's profile info (broadcast to all rooms).
|
|
77
|
+
*/
|
|
78
|
+
updateProfile(updates: {
|
|
79
|
+
username?: string;
|
|
80
|
+
avatar?: string;
|
|
81
|
+
metadata?: Record<string, unknown>;
|
|
82
|
+
}): void;
|
|
83
|
+
private _subscribeRoom;
|
|
84
|
+
private _handleRoomPresenceJoin;
|
|
85
|
+
private _handleRoomPresenceLeave;
|
|
86
|
+
private _handleRoomPresenceUpdate;
|
|
87
|
+
private _setupLobby;
|
|
88
|
+
private _handleLobbyJoin;
|
|
89
|
+
private _handleLobbyLeave;
|
|
90
|
+
private _handleLobbyUpdate;
|
|
91
|
+
private _hydrateOnlineUsers;
|
|
92
|
+
private _presenceToUser;
|
|
93
|
+
private _findUserIdByActorId;
|
|
94
|
+
private _restoreRooms;
|
|
95
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ChatUser, ChatPresenceData } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Maps actorTokenId ↔ ChatUser, filtering self.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PresenceManager {
|
|
6
|
+
private _users;
|
|
7
|
+
private _actorToUserId;
|
|
8
|
+
private _localActorId;
|
|
9
|
+
constructor(localActorId: string);
|
|
10
|
+
/**
|
|
11
|
+
* Add or update a user from presence data.
|
|
12
|
+
* Returns the ChatUser if it's a remote user, null if it's self.
|
|
13
|
+
*/
|
|
14
|
+
addFromPresence(actorTokenId: string, presence: ChatPresenceData, joinedAt?: number): ChatUser | null;
|
|
15
|
+
/**
|
|
16
|
+
* Remove a user by actorTokenId.
|
|
17
|
+
* Returns the removed user, or null if not found / is self.
|
|
18
|
+
*/
|
|
19
|
+
removeByActorId(actorTokenId: string): ChatUser | null;
|
|
20
|
+
/**
|
|
21
|
+
* Get a user by userId.
|
|
22
|
+
*/
|
|
23
|
+
getUser(userId: string): ChatUser | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Get a user by actorTokenId.
|
|
26
|
+
*/
|
|
27
|
+
getUserByActorId(actorTokenId: string): ChatUser | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Get all remote users.
|
|
30
|
+
*/
|
|
31
|
+
getAll(): ChatUser[];
|
|
32
|
+
/**
|
|
33
|
+
* Get the users Map (readonly view).
|
|
34
|
+
*/
|
|
35
|
+
get users(): Map<string, ChatUser>;
|
|
36
|
+
/**
|
|
37
|
+
* Clear all tracked users.
|
|
38
|
+
*/
|
|
39
|
+
clear(): void;
|
|
40
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages typing indicator state for both local (send) and remote (receive) sides.
|
|
3
|
+
*
|
|
4
|
+
* Send-side: debounced — calling startTyping() sends a signal, then auto-stops
|
|
5
|
+
* after a configurable timeout unless startTyping() is called again.
|
|
6
|
+
*
|
|
7
|
+
* Receive-side: per-user timeouts — if no typing signal arrives within the
|
|
8
|
+
* timeout window, the user is considered to have stopped typing.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TypingManager {
|
|
11
|
+
private _timeout;
|
|
12
|
+
private _localTimer;
|
|
13
|
+
private _localTyping;
|
|
14
|
+
private _remoteTimers;
|
|
15
|
+
private _typingUserIds;
|
|
16
|
+
private _onSend;
|
|
17
|
+
private _onChange;
|
|
18
|
+
constructor(timeout: number);
|
|
19
|
+
/**
|
|
20
|
+
* Set the callback invoked when a typing signal needs to be sent.
|
|
21
|
+
*/
|
|
22
|
+
onSend(cb: (typing: boolean) => void): void;
|
|
23
|
+
/**
|
|
24
|
+
* Set the callback invoked when the set of typing users changes.
|
|
25
|
+
*/
|
|
26
|
+
onChange(cb: () => void): void;
|
|
27
|
+
/**
|
|
28
|
+
* Called by the local user when they are typing.
|
|
29
|
+
* Sends typing=true if not already sent, and (re)starts the auto-stop timer.
|
|
30
|
+
*/
|
|
31
|
+
startTyping(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Called by the local user to explicitly stop typing.
|
|
34
|
+
*/
|
|
35
|
+
stopTyping(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Handle a remote typing signal.
|
|
38
|
+
*/
|
|
39
|
+
handleRemote(userId: string, typing: boolean): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get the set of currently-typing remote user IDs.
|
|
42
|
+
*/
|
|
43
|
+
getTypingUserIds(): Set<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Whether the local user is currently typing.
|
|
46
|
+
*/
|
|
47
|
+
get isLocalTyping(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Clean up all timers.
|
|
50
|
+
*/
|
|
51
|
+
dispose(): void;
|
|
52
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nolag/chat
|
|
3
|
+
* High-level chat SDK for Browser and React Native
|
|
4
|
+
*/
|
|
5
|
+
export { NoLagChat } from './NoLagChat';
|
|
6
|
+
export { ChatRoom } from './ChatRoom';
|
|
7
|
+
export { EventEmitter } from './EventEmitter';
|
|
8
|
+
export type { NoLagChatOptions, ChatUser, ChatMessage, ChatClientEvents, ChatRoomEvents, ChatPresenceData, SendMessageOptions, } from './types';
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{NoLag as e}from"@nolag/js-sdk";class t{constructor(){this._handlers=new Map}on(e,t){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t),this}off(e,t){return t?this._handlers.get(e)?.delete(t):this._handlers.delete(e),this}removeAllListeners(){return this._handlers.clear(),this}emit(e,...t){const s=this._handlers.get(e);if(s)for(const o of s)try{o(...t)}catch(t){console.error(`Error in ${String(e)} handler:`,t)}}listenerCount(e){return this._handlers.get(e)?.size??0}}class s{constructor(e){this._messages=[],this._ids=new Set,this._maxSize=e}add(e){if(this._ids.has(e.id))return!1;for(this._ids.add(e.id),this._messages.push(e),this._messages.length>1&&e.timestamp<this._messages[this._messages.length-2].timestamp&&this._messages.sort((e,t)=>e.timestamp-t.timestamp);this._messages.length>this._maxSize;){const e=this._messages.shift();this._ids.delete(e.id)}return!0}getAll(){return[...this._messages]}get size(){return this._messages.length}has(e){return this._ids.has(e)}clear(){this._messages=[],this._ids.clear()}}class o{constructor(e){this._users=new Map,this._actorToUserId=new Map,this._localActorId=e}addFromPresence(e,t,s){if(e===this._localActorId)return null;const o=this._actorToUserId.get(e),i=t.userId||o||e,n={userId:i,actorTokenId:e,username:t.username,avatar:t.avatar,metadata:t.metadata,status:t.status||"online",joinedAt:s||Date.now(),isLocal:!1};return this._users.set(i,n),this._actorToUserId.set(e,i),n}removeByActorId(e){if(e===this._localActorId)return null;const t=this._actorToUserId.get(e);if(!t)return null;const s=this._users.get(t)||null;return this._users.delete(t),this._actorToUserId.delete(e),s}getUser(e){return this._users.get(e)}getUserByActorId(e){const t=this._actorToUserId.get(e);return t?this._users.get(t):void 0}getAll(){return Array.from(this._users.values())}get users(){return this._users}clear(){this._users.clear(),this._actorToUserId.clear()}}class i{constructor(e){this._localTimer=null,this._localTyping=!1,this._remoteTimers=new Map,this._typingUserIds=new Set,this._onSend=null,this._onChange=null,this._timeout=e}onSend(e){this._onSend=e}onChange(e){this._onChange=e}startTyping(){this._localTyping||(this._localTyping=!0,this._onSend?.(!0)),this._localTimer&&clearTimeout(this._localTimer),this._localTimer=setTimeout(()=>{this.stopTyping()},this._timeout)}stopTyping(){this._localTyping&&(this._localTyping=!1,this._localTimer&&(clearTimeout(this._localTimer),this._localTimer=null),this._onSend?.(!1))}handleRemote(e,t){const s=this._remoteTimers.get(e);s&&clearTimeout(s),t?(this._typingUserIds.add(e),this._remoteTimers.set(e,setTimeout(()=>{this._typingUserIds.delete(e),this._remoteTimers.delete(e),this._onChange?.()},this._timeout+1e3))):(this._typingUserIds.delete(e),this._remoteTimers.delete(e)),this._onChange?.()}getTypingUserIds(){return this._typingUserIds}get isLocalTyping(){return this._localTyping}dispose(){this._localTimer&&clearTimeout(this._localTimer);for(const e of this._remoteTimers.values())clearTimeout(e);this._remoteTimers.clear(),this._typingUserIds.clear(),this._localTyping=!1,this._onSend=null,this._onChange=null}}function n(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"xxxx-xxxx-xxxx-xxxx".replace(/x/g,()=>Math.floor(16*Math.random()).toString(16))}function r(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const a="messages",h="_typing";class c extends t{constructor(e,t,n,r,a){super(),this._unreadCount=0,this._active=!1,this.name=e,this._roomContext=t,this._localUser=n,this._options=r,this._log=a,this._presenceManager=new o(n.actorTokenId),this._typingManager=new i(r.typingTimeout),this._messageStore=new s(r.maxMessageCache),this._typingManager.onSend(e=>{this._roomContext.emit(h,{userId:this._localUser.userId,typing:e},{echo:!1})}),this._typingManager.onChange(()=>{this.emit("typing",{users:this.typingUsers})})}get users(){return this._presenceManager.users}get messages(){return this._messageStore.getAll()}get typingUsers(){const e=this._typingManager.getTypingUserIds(),t=[];for(const s of e){const e=this._presenceManager.getUser(s);e&&t.push(e)}return t}get unreadCount(){return this._unreadCount}get active(){return this._active}markRead(){0!==this._unreadCount&&(this._unreadCount=0,this.emit("unreadChanged",{room:this.name,count:0}))}sendMessage(e,t){const s={id:n(),userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,text:e,data:t?.data,timestamp:Date.now(),status:"sending",isReplay:!1};return this._messageStore.add(s),this.emit("messageSent",s),this._roomContext.emit(a,{id:s.id,userId:s.userId,username:s.username,avatar:s.avatar,text:s.text,data:s.data,timestamp:s.timestamp},{echo:!1}),s.status="sent",this._typingManager.stopTyping(),s}getMessages(){return this._messageStore.getAll()}startTyping(){this._typingManager.startTyping()}stopTyping(){this._typingManager.stopTyping()}getUsers(){return this._presenceManager.getAll()}getUser(e){return this._presenceManager.getUser(e)}_subscribe(){this._log("Room subscribe:",this.name),this._roomContext.subscribe(a),this._roomContext.subscribe(h),this._roomContext.on(a,(e,t)=>{this._handleIncomingMessage(e,t)}),this._roomContext.on(h,e=>{const{userId:t,typing:s}=e;t!==this._localUser.userId&&this._typingManager.handleRemote(t,s)})}_activate(){this._log("Room activate:",this.name),this._active=!0,this._markRead(),this._setPresence(),this._roomContext.fetchPresence().then(e=>{this._log("Room presence fetched:",this.name,e.length,"actors");for(const t of e)if(t.presence){const e=this._presenceManager.addFromPresence(t.actorTokenId,t.presence,t.joinedAt);e&&this.emit("userJoined",e)}}).catch(e=>{this._log("Failed to fetch room presence:",e)})}_deactivate(){this._log("Room deactivate:",this.name),this._active=!1,this._presenceManager.clear()}_handlePresenceJoin(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&(this._log("User joined room:",this.name,s.username),this.emit("userJoined",s))}_handlePresenceLeave(e){const t=this._presenceManager.removeByActorId(e);t&&(this._log("User left room:",this.name,t.username),this._typingManager.handleRemote(t.userId,!1),this.emit("userLeft",t))}_handlePresenceUpdate(e,t){this._presenceManager.addFromPresence(e,t)}_handleReplayStart(e){this.emit("replayStart",{count:e})}_handleReplayEnd(e){this.emit("replayEnd",{replayed:e})}_updateLocalPresence(){this._setPresence()}_cleanup(){this._log("Room cleanup:",this.name),this._roomContext.unsubscribe(a),this._roomContext.unsubscribe(h),this._roomContext.off(a),this._roomContext.off(h),this._typingManager.dispose(),this._messageStore.clear(),this._presenceManager.clear(),this.removeAllListeners()}_handleIncomingMessage(e,t){const s=e,o={id:s.id,userId:s.userId,username:s.username,avatar:s.avatar,text:s.text,data:s.data,timestamp:s.timestamp,status:"delivered",isReplay:t.isReplay??!1};this._messageStore.add(o)&&(this.emit("message",o),this._active||o.isReplay||(this._unreadCount++,this.emit("unreadChanged",{room:this.name,count:this._unreadCount})))}_markRead(){0!==this._unreadCount&&(this._unreadCount=0,this.emit("unreadChanged",{room:this.name,count:0}))}_setPresence(){const e={userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,status:this._localUser.status,metadata:this._localUser.metadata};this._roomContext.setPresence(e)}}class l extends t{constructor(e,t){super(),this._client=null,this._localUser=null,this._rooms=new Map,this._lobby=null,this._onlineUsers=new Map,this._actorToUserId=new Map,this._activeRoom=null,this._token=e,this._userId=n(),this._options={username:t.username,avatar:t.avatar,metadata:t.metadata,appName:t.appName??"chat",url:t.url,typingTimeout:t.typingTimeout??3e3,maxMessageCache:t.maxMessageCache??500,debug:t.debug??!1,reconnect:t.reconnect??!0,rooms:t.rooms??[]},this._log=r("NoLagChat",this._options.debug)}get connected(){return this._client?.connected??!1}get localUser(){return this._localUser}get rooms(){return this._rooms}async connect(){this._log("Connecting...");const t={debug:this._options.debug,reconnect:this._options.reconnect};this._options.url&&(t.url=this._options.url),this._client=e(this._token,t),this._client.on("connect",()=>{this._log("Connected"),this._rooms.size>0&&(this._log("Reconnected — restoring rooms..."),this._restoreRooms(),this.emit("reconnected"))}),this._client.on("disconnect",e=>{this._log("Disconnected:",e),this.emit("disconnected",e)}),this._client.on("reconnect",()=>{this._log("Reconnecting...")}),this._client.on("error",e=>{this._log("Error:",e),this.emit("error",e)}),this._client.on("replay:start",e=>{const t=e;for(const e of this._rooms.values())e._handleReplayStart(t.count)}),this._client.on("replay:end",e=>{const t=e;for(const e of this._rooms.values())e._handleReplayEnd(t.replayed)}),await this._client.connect(),this._client.on("presence:join",e=>{this._handleRoomPresenceJoin(e)}),this._client.on("presence:leave",e=>{this._handleRoomPresenceLeave(e)}),this._client.on("presence:update",e=>{this._handleRoomPresenceUpdate(e)}),this._localUser={userId:this._userId,actorTokenId:this._client.actorId,username:this._options.username,avatar:this._options.avatar,metadata:this._options.metadata,status:"online",joinedAt:Date.now(),isLocal:!0},this._log("Local user:",this._localUser.userId,"→",this._localUser.actorTokenId),await this._setupLobby();for(const e of this._options.rooms)this._subscribeRoom(e);this.emit("connected"),setTimeout(()=>{this._lobby&&this._client?.connected&&this._lobby.fetchPresence().then(e=>{this._hydrateOnlineUsers(e)}).catch(()=>{})},2e3)}disconnect(){this._log("Disconnecting...");for(const e of[...this._rooms.keys()])this.leaveRoom(e);this._lobby?.unsubscribe(),this._lobby=null,this._client?.disconnect(),this._client=null,this._onlineUsers.clear(),this._actorToUserId.clear(),this._localUser=null}joinRoom(e){if(!this._client||!this._localUser)throw new Error("Not connected — call connect() first");if(this._activeRoom&&this._activeRoom!==e){const e=this._rooms.get(this._activeRoom);e&&e._deactivate()}let t=this._rooms.get(e);return t||(t=this._subscribeRoom(e)),this._activeRoom=e,t._activate(),t}leaveRoom(e){const t=this._rooms.get(e);t&&(this._log("Leaving room:",e),t._cleanup(),this._rooms.delete(e),this._activeRoom===e&&(this._activeRoom=null))}getRooms(){return Array.from(this._rooms.values())}getOnlineUsers(){return Array.from(this._onlineUsers.values())}setStatus(e){if(this._localUser&&(this._localUser.status=e),this._activeRoom){const e=this._rooms.get(this._activeRoom);e&&e._updateLocalPresence()}}updateProfile(e){if(this._localUser&&(void 0!==e.username&&(this._localUser.username=e.username,this._options.username=e.username),void 0!==e.avatar&&(this._localUser.avatar=e.avatar,this._options.avatar=e.avatar),void 0!==e.metadata&&(this._localUser.metadata={...this._localUser.metadata,...e.metadata},this._options.metadata=this._localUser.metadata),this._activeRoom)){const e=this._rooms.get(this._activeRoom);e&&e._updateLocalPresence()}}_subscribeRoom(e){if(!this._client||!this._localUser)throw new Error("Not connected — call connect() first");this._log("Subscribing room:",e);const t=this._client.setApp(this._options.appName).setRoom(e),s=new c(e,t,this._localUser,this._options,r(`ChatRoom:${e}`,this._options.debug));return this._rooms.set(e,s),s._subscribe(),s}_handleRoomPresenceJoin(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=e.presence;if(!t?.userId)return;const s=this._presenceToUser(e.actorTokenId,t);this._actorToUserId.set(e.actorTokenId,s.userId),this._onlineUsers.has(s.userId)||(this._onlineUsers.set(s.userId,s),this.emit("userOnline",s));const o=this._activeRoom?this._rooms.get(this._activeRoom):void 0;o&&o._handlePresenceJoin(e.actorTokenId,t)}_handleRoomPresenceLeave(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=this._activeRoom?this._rooms.get(this._activeRoom):void 0;t&&t._handlePresenceLeave(e.actorTokenId)}_handleRoomPresenceUpdate(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=e.presence;if(!t?.userId)return;if(this._onlineUsers.has(t.userId)){const s=this._presenceToUser(e.actorTokenId,t);this._onlineUsers.set(s.userId,s),this.emit("userUpdated",s)}const s=this._activeRoom?this._rooms.get(this._activeRoom):void 0;s&&s._handlePresenceUpdate(e.actorTokenId,t)}async _setupLobby(){if(!this._client)return;this._lobby=this._client.setApp(this._options.appName).setLobby("online");const e=e=>t=>{const s=t;"join"===e?this._handleLobbyJoin(s):"leave"===e?this._handleLobbyLeave(s):this._handleLobbyUpdate(s)};this._client.on("lobbyPresence:join",e("join")),this._client.on("lobbyPresence:leave",e("leave")),this._client.on("lobbyPresence:update",e("update"));try{const e=await this._lobby.subscribe();this._hydrateOnlineUsers(e),this._log("Lobby subscribed, online users:",this._onlineUsers.size)}catch(e){this._log("Lobby subscription failed:",e)}}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const o=s;if(!o.userId)return;const i=this._presenceToUser(t,o);this._actorToUserId.set(t,i.userId),this._onlineUsers.has(i.userId)||(this._onlineUsers.set(i.userId,i),this.emit("userOnline",i))}_handleLobbyLeave(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const o=s,i=o?.userId||this._actorToUserId.get(t)||this._findUserIdByActorId(t);if(i){const e=this._onlineUsers.get(i);e&&(this._onlineUsers.delete(i),this._actorToUserId.delete(t),this.emit("userOffline",e))}}_handleLobbyUpdate(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const o=s;if(!o.userId)return;const i=this._presenceToUser(t,o);this._onlineUsers.set(i.userId,i),this.emit("userUpdated",i)}_hydrateOnlineUsers(e){for(const t of Object.keys(e)){const s=e[t];for(const e of Object.keys(s)){if(e===this._localUser?.actorTokenId)continue;const t=s[e],o=t?.presence??t;if(o?.userId){const t=this._presenceToUser(e,o);this._actorToUserId.set(e,t.userId),this._onlineUsers.has(t.userId)||(this._onlineUsers.set(t.userId,t),this.emit("userOnline",t))}}}}_presenceToUser(e,t){return{userId:t.userId,actorTokenId:e,username:t.username,avatar:t.avatar,metadata:t.metadata,status:t.status||"online",joinedAt:Date.now(),isLocal:!1}}_findUserIdByActorId(e){for(const t of this._onlineUsers.values())if(t.actorTokenId===e)return t.userId}_restoreRooms(){if(this._activeRoom){const e=this._rooms.get(this._activeRoom);e&&e._updateLocalPresence()}this._lobby?.fetchPresence().then(e=>{this._onlineUsers.clear(),this._actorToUserId.clear(),this._hydrateOnlineUsers(e)}).catch(e=>{this._log("Failed to re-fetch lobby presence:",e)})}}export{c as ChatRoom,t as EventEmitter,l as NoLagChat};
|
|
2
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/MessageStore.ts","../src/PresenceManager.ts","../src/TypingManager.ts","../src/utils.ts","../src/constants.ts","../src/ChatRoom.ts","../src/NoLagChat.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["EventEmitter","constructor","this","_handlers","Map","on","event","handler","has","set","Set","get","add","off","delete","removeAllListeners","clear","emit","args","handlers","e","console","error","String","listenerCount","size","MessageStore","maxSize","_messages","_ids","_maxSize","message","id","push","length","timestamp","sort","a","b","removed","shift","getAll","PresenceManager","localActorId","_users","_actorToUserId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","existing","userId","user","username","avatar","metadata","status","Date","now","isLocal","removeByActorId","getUser","getUserByActorId","undefined","Array","from","values","users","TypingManager","timeout","_localTimer","_localTyping","_remoteTimers","_typingUserIds","_onSend","_onChange","_timeout","onSend","cb","onChange","startTyping","clearTimeout","setTimeout","stopTyping","handleRemote","typing","getTypingUserIds","isLocalTyping","dispose","timer","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","TOPIC_MESSAGES","TOPIC_TYPING","ChatRoom","name","roomContext","localUser","options","super","_unreadCount","_active","_roomContext","_localUser","_options","_log","_presenceManager","_typingManager","typingTimeout","_messageStore","maxMessageCache","echo","typingUsers","messages","typingIds","unreadCount","active","markRead","room","count","sendMessage","text","data","isReplay","getMessages","getUsers","_subscribe","subscribe","meta","_handleIncomingMessage","_activate","_markRead","_setPresence","fetchPresence","then","actors","actor","catch","err","_deactivate","_handlePresenceJoin","presenceData","_handlePresenceLeave","_handlePresenceUpdate","_handleReplayStart","_handleReplayEnd","replayed","_updateLocalPresence","_cleanup","unsubscribe","msg","chatMessage","setPresence","NoLagChat","token","_client","_rooms","_lobby","_onlineUsers","_activeRoom","_token","_userId","appName","url","debug","reconnect","rooms","connected","connect","clientOptions","NoLag","_restoreRooms","reason","_handleRoomPresenceJoin","_handleRoomPresenceLeave","_handleRoomPresenceUpdate","actorId","_setupLobby","roomName","_subscribeRoom","state","_hydrateOnlineUsers","disconnect","keys","leaveRoom","joinRoom","Error","prev","getRooms","getOnlineUsers","setStatus","activeRoom","updateProfile","updates","setApp","setRoom","_presenceToUser","setLobby","lobbyHandler","type","_handleLobbyJoin","_handleLobbyLeave","_handleLobbyUpdate","initialState","_findUserIdByActorId","roomId","Object","roomPresence","raw"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Default app name for room topic prefixes */
|
|
2
|
+
export declare const DEFAULT_APP_NAME = "chat";
|
|
3
|
+
/** Default typing indicator auto-stop timeout (ms) */
|
|
4
|
+
export declare const DEFAULT_TYPING_TIMEOUT = 3000;
|
|
5
|
+
/** Default max messages kept per room */
|
|
6
|
+
export declare const DEFAULT_MAX_MESSAGE_CACHE = 500;
|
|
7
|
+
/** Topic name for chat messages within a room */
|
|
8
|
+
export declare const TOPIC_MESSAGES = "messages";
|
|
9
|
+
/** Topic name for typing indicators within a room */
|
|
10
|
+
export declare const TOPIC_TYPING = "_typing";
|
|
11
|
+
/** Lobby ID for global online presence */
|
|
12
|
+
export declare const LOBBY_ID = "online";
|