@nolag/chat 0.1.3 → 1.0.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 CHANGED
@@ -24,14 +24,21 @@ npm install @nolag/js-sdk @nolag/chat
24
24
 
25
25
  ## Quick Start
26
26
 
27
+ The app owns one core NoLag client; wrappers attach to it. Any number of
28
+ wrapper SDKs (chat, notify, dash, ...) can share the same connection as
29
+ long as each uses its own app.
30
+
27
31
  ```typescript
32
+ import { NoLag } from "@nolag/js-sdk";
28
33
  import { NoLagChat } from "@nolag/chat";
29
34
 
30
- const chat = new NoLagChat("YOUR_ACTOR_TOKEN", {
31
- username: "Alice",
32
- });
35
+ // One client for the whole app. In a browser, use a token provider so the
36
+ // SDK can mint fresh short-lived client tokens from your backend.
37
+ const client = NoLag(async () => (await (await fetch("/api/nolag-token")).json()).token);
38
+ const chat = new NoLagChat({ client, username: "Alice" });
33
39
 
34
- await chat.connect();
40
+ await client.connect(); // the app owns the connection
41
+ await chat.ready(); // wrapper setup done (identity, presence, rooms)
35
42
 
36
43
  // Join a room and send a message
37
44
  const room = chat.joinRoom("general");
@@ -52,8 +59,32 @@ room.startTyping(); // auto-stops after timeout
52
59
  room.on("typing", (users) => {
53
60
  console.log("Typing:", users.map((u) => u.username).join(", "));
54
61
  });
62
+
63
+ // Teardown: the wrapper releases its handlers and topics; the app closes
64
+ // the socket (never the other way around).
65
+ chat.detach();
66
+ client.disconnect();
55
67
  ```
56
68
 
69
+ ## Lifecycle
70
+
71
+ - **Construction = attach.** The wrapper wires its handlers onto the injected
72
+ client immediately. If the client is already connected, setup runs on the
73
+ next microtask; otherwise it runs when the client's `connect` event fires.
74
+ - **`ready()`** resolves once the first setup completed (identity, online
75
+ lobby, configured rooms). Auth failures surface via your own
76
+ `await client.connect()`, not via `ready()`.
77
+ - **Reconnects are automatic.** The wrapper restores presence and reconciles
78
+ the online-user list, emitting only real deltas.
79
+ - **`detach()`** removes exactly this wrapper's handlers and topics and never
80
+ touches the socket. It is terminal: construct a new instance to re-attach.
81
+ Detach while the client is still connected so server-side unsubscribes go
82
+ through. In frameworks, call it from your dispose hook (`onUnmounted`,
83
+ HMR dispose).
84
+ - **One wrapper per (client, app).** Sharing a client across wrappers of
85
+ DIFFERENT apps is the intended pattern; two wrappers on the same app would
86
+ collide on topics and presence (the SDK warns if you do this).
87
+
57
88
  ## API Reference
58
89
 
59
90
  ### `NoLagChat`
@@ -61,28 +92,29 @@ room.on("typing", (users) => {
61
92
  #### Constructor
62
93
 
63
94
  ```typescript
64
- const chat = new NoLagChat(token: string, options: NoLagChatOptions);
95
+ const chat = new NoLagChat(options: NoLagChatOptions);
65
96
  ```
66
97
 
67
98
  **Options:**
68
99
 
69
100
  | Option | Type | Default | Description |
70
101
  |--------|------|---------|-------------|
102
+ | `client` | `NoLagSocket` | *required* | The injected core NoLag client |
71
103
  | `username` | `string` | *required* | Display name for this user |
72
104
  | `avatar` | `string` | — | Avatar URL |
73
105
  | `metadata` | `Record<string, unknown>` | — | Custom user data |
106
+ | `appName` | `string` | `'chat'` | NoLag app for topic prefixes |
74
107
  | `rooms` | `string[]` | — | Auto-join these rooms on connect |
75
108
  | `typingTimeout` | `number` | `3000` | Ms before typing indicator auto-clears |
76
109
  | `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 |
110
+ | `debug` | `boolean` | `false` | Enable wrapper debug logging |
79
111
 
80
112
  #### Methods
81
113
 
82
114
  | Method | Returns | Description |
83
115
  |--------|---------|-------------|
84
- | `connect()` | `Promise<void>` | Connect to NoLag |
85
- | `disconnect()` | `void` | Disconnect |
116
+ | `ready()` | `Promise<void>` | Resolves when wrapper setup completed |
117
+ | `detach()` | `void` | Release handlers and topics (terminal; never closes the socket) |
86
118
  | `joinRoom(name)` | `ChatRoom` | Join a chat room |
87
119
  | `leaveRoom(name)` | `void` | Leave a room |
88
120
  | `getRooms()` | `ChatRoom[]` | Get all joined rooms |
@@ -1,6 +1,6 @@
1
1
  import type { RoomContext } from '@nolag/js-sdk';
2
2
  import { EventEmitter } from './EventEmitter';
3
- import type { ChatRoomEvents, ChatMessage, ChatUser, ChatPresenceData, ResolvedChatOptions, SendMessageOptions } from './types';
3
+ import type { ChatRoomEvents, ChatMessage, ChatUser, ChatPresenceData, ResolvedChatOptions, SendMessageOptions, StreamMessageOptions, MessageStream } from './types';
4
4
  /**
5
5
  * ChatRoom — a single chat room with messages, users, and typing indicators.
6
6
  *
@@ -16,10 +16,14 @@ export declare class ChatRoom extends EventEmitter<ChatRoomEvents> {
16
16
  private _typingManager;
17
17
  private _messageStore;
18
18
  private _log;
19
+ private _isConnected;
19
20
  private _unreadCount;
20
21
  private _active;
22
+ private _onMessagesRef;
23
+ private _onTypingRef;
24
+ private _onStreamRef;
21
25
  /** @internal */
22
- constructor(name: string, roomContext: RoomContext, localUser: ChatUser, options: ResolvedChatOptions, log: (...args: unknown[]) => void);
26
+ constructor(name: string, roomContext: RoomContext, localUser: ChatUser, options: ResolvedChatOptions, log: (...args: unknown[]) => void, isConnected: () => boolean);
23
27
  /** All remote users currently in this room */
24
28
  get users(): Map<string, ChatUser>;
25
29
  /** All messages in this room (timestamp order) */
@@ -36,6 +40,33 @@ export declare class ChatRoom extends EventEmitter<ChatRoomEvents> {
36
40
  * Send a text message to this room. Returns an optimistic ChatMessage.
37
41
  */
38
42
  sendMessage(text: string, options?: SendMessageOptions): ChatMessage;
43
+ /**
44
+ * Begin a streamed message (e.g. an AI response). Returns a handle you append
45
+ * tokens to. Receivers see the message appear and grow live; on `complete()`
46
+ * the full message is persisted like a normal message.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * const stream = room.startStream();
51
+ * for await (const token of llm) stream.append(token);
52
+ * stream.complete();
53
+ * ```
54
+ */
55
+ startStream(options?: StreamMessageOptions): MessageStream;
56
+ /**
57
+ * Stream a message from a token source (sync or async iterable) — drops in
58
+ * for an LLM stream. Appends each chunk, finalizes on completion, and aborts
59
+ * (re-throwing) if the source errors.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * // OpenAI / Anthropic style streams yield text chunks
64
+ * await room.streamMessage(tokenIterable);
65
+ * ```
66
+ */
67
+ streamMessage(source: AsyncIterable<string> | Iterable<string>, options?: StreamMessageOptions): Promise<ChatMessage>;
68
+ /** @internal Publish a final message on the persisted `messages` topic. */
69
+ private _publishFinalMessage;
39
70
  /**
40
71
  * Get all messages (alias for the messages getter).
41
72
  */
@@ -77,6 +108,8 @@ export declare class ChatRoom extends EventEmitter<ChatRoomEvents> {
77
108
  /** @internal Unsubscribe and clean up */
78
109
  _cleanup(): void;
79
110
  private _handleIncomingMessage;
111
+ /** Handle an incoming live stream control payload (start / delta / abort). */
112
+ private _handleStreamEvent;
80
113
  private _markRead;
81
114
  private _setPresence;
82
115
  }
@@ -23,6 +23,11 @@ export declare class MessageStore {
23
23
  * Check if a message ID exists.
24
24
  */
25
25
  has(id: string): boolean;
26
+ /**
27
+ * Get a message by ID. Returns the live reference (mutating it mutates the
28
+ * stored message), or undefined if not present.
29
+ */
30
+ get(id: string): ChatMessage | undefined;
26
31
  /**
27
32
  * Clear all messages.
28
33
  */
@@ -0,0 +1,56 @@
1
+ import type { ChatMessage, MessageStream as IMessageStream } from './types';
2
+ /**
3
+ * Wire payload for the ephemeral `_stream` control topic.
4
+ *
5
+ * Only the live preview travels here (start + coalesced deltas + abort); the
6
+ * authoritative, persisted final message is published on the `messages` topic
7
+ * by `complete()`, which is what finalizes receivers and shows in replay.
8
+ */
9
+ export type StreamWirePayload = {
10
+ type: 'start';
11
+ id: string;
12
+ userId: string;
13
+ username: string;
14
+ avatar?: string;
15
+ timestamp: number;
16
+ } | {
17
+ type: 'delta';
18
+ id: string;
19
+ text: string;
20
+ } | {
21
+ type: 'abort';
22
+ id: string;
23
+ error?: string;
24
+ };
25
+ /** Callbacks the room wires into the controller. */
26
+ export interface MessageStreamHooks {
27
+ /** Publish a control payload on the ephemeral `_stream` topic. */
28
+ publishStream: (payload: StreamWirePayload) => void;
29
+ /** Publish the final, full message on the persisted `messages` topic. */
30
+ publishFinal: (message: ChatMessage) => void;
31
+ emitStart: (message: ChatMessage) => void;
32
+ emitChunk: (message: ChatMessage, delta: string) => void;
33
+ emitEnd: (message: ChatMessage) => void;
34
+ emitAbort: (message: ChatMessage, error?: string) => void;
35
+ }
36
+ /**
37
+ * Producer-side controller for an outgoing streamed message.
38
+ *
39
+ * `append()` updates the local message immediately and buffers the token; a
40
+ * timer flushes buffered tokens as a single network delta at most every
41
+ * `flushIntervalMs`, so a token-per-character source doesn't flood the broker.
42
+ */
43
+ export declare class MessageStreamController implements IMessageStream {
44
+ private readonly _flushIntervalMs;
45
+ private readonly _hooks;
46
+ readonly message: ChatMessage;
47
+ private _buffer;
48
+ private _flushTimer;
49
+ private _closed;
50
+ constructor(message: ChatMessage, _flushIntervalMs: number, _hooks: MessageStreamHooks);
51
+ append(text: string): void;
52
+ complete(): ChatMessage;
53
+ abort(error?: string): void;
54
+ private _flush;
55
+ private _clearTimer;
56
+ }
@@ -1,3 +1,4 @@
1
+ import type { NoLagSocket } from '@nolag/js-sdk';
1
2
  import { EventEmitter } from './EventEmitter';
2
3
  import { ChatRoom } from './ChatRoom';
3
4
  import type { NoLagChatOptions, ChatClientEvents, ChatUser } from './types';
@@ -7,26 +8,34 @@ import type { NoLagChatOptions, ChatClientEvents, ChatUser } from './types';
7
8
  * Provides multi-room chat, presence (who's online), typing indicators,
8
9
  * message replay, and user mapping — all framework-agnostic via events.
9
10
  *
11
+ * The wrapper NEVER manages the connection. The app owns one core NoLag
12
+ * client (shared by any number of wrappers on distinct apps) and the
13
+ * wrapper attaches to it at construction and releases it via `detach()`.
14
+ *
10
15
  * @example
11
16
  * ```typescript
17
+ * import { NoLag } from '@nolag/js-sdk';
12
18
  * import { NoLagChat } from '@nolag/chat';
13
19
  *
14
- * const chat = new NoLagChat(token, { username: 'Alice' });
20
+ * const client = NoLag(async () => (await (await fetch('/api/nolag-token')).json()).token);
21
+ * const chat = new NoLagChat({ client, appName: 'my-chat', username: 'Alice' });
15
22
  *
16
- * chat.on('connected', () => console.log('Connected!'));
17
23
  * chat.on('userOnline', (user) => console.log(user.username, 'is online'));
18
24
  *
19
- * await chat.connect();
25
+ * await client.connect(); // the app owns the connection
26
+ * await chat.ready(); // wrapper setup done (identity, lobby, rooms)
20
27
  *
21
28
  * const room = chat.joinRoom('general');
22
29
  * room.on('message', (msg) => console.log(msg.username + ':', msg.text));
23
30
  * room.sendMessage('Hello!');
31
+ *
32
+ * chat.detach(); // wrapper releases its handlers and topics
33
+ * client.disconnect(); // the app closes the socket
24
34
  * ```
25
35
  */
26
36
  export declare class NoLagChat extends EventEmitter<ChatClientEvents> {
27
- private _token;
28
- private _options;
29
37
  private _client;
38
+ private _options;
30
39
  private _localUser;
31
40
  private _rooms;
32
41
  private _lobby;
@@ -35,21 +44,56 @@ export declare class NoLagChat extends EventEmitter<ChatClientEvents> {
35
44
  private _activeRoom;
36
45
  private _userId;
37
46
  private _log;
38
- constructor(token: string, options: NoLagChatOptions);
39
- /** Whether the underlying connection is established */
47
+ private _epoch;
48
+ private _detached;
49
+ private _isReady;
50
+ private _readyResolve;
51
+ private _readyReject;
52
+ private _readyPromise;
53
+ private _lobbyRefreshTimer;
54
+ private _onConnectRef;
55
+ private _onDisconnectRef;
56
+ private _onReconnectRef;
57
+ private _onErrorRef;
58
+ private _onReplayStartRef;
59
+ private _onReplayEndRef;
60
+ private _onPresenceJoinRef;
61
+ private _onPresenceLeaveRef;
62
+ private _onPresenceUpdateRef;
63
+ private _onLobbyJoinRef;
64
+ private _onLobbyLeaveRef;
65
+ private _onLobbyUpdateRef;
66
+ constructor(options: NoLagChatOptions);
67
+ /** Whether the underlying connection is established (connected ≠ ready) */
40
68
  get connected(): boolean;
41
- /** The local user's info (available after connect) */
69
+ /** The injected core client (owned by the app, not the wrapper) */
70
+ get client(): NoLagSocket;
71
+ /** The local user's info (available after ready) */
42
72
  get localUser(): ChatUser | null;
43
73
  /** All currently joined rooms */
44
74
  get rooms(): Map<string, ChatRoom>;
45
75
  /**
46
- * Connect to NoLag and set up global presence.
76
+ * Resolves once the wrapper's first setup completed (identity, lobby and
77
+ * configured rooms ready — equivalently, once 'connected' has fired).
78
+ * Rejects only if detach() is called before that. Client auth failures
79
+ * surface via the app's own `await client.connect()`, not here.
80
+ */
81
+ ready(): Promise<void>;
82
+ /**
83
+ * Detach from the client: remove every handler this wrapper added,
84
+ * unsubscribe its topics and lobby (when connected), clear state.
85
+ * Terminal and idempotent; never touches the socket. To use chat again,
86
+ * construct a new instance.
47
87
  */
48
- connect(): Promise<void>;
88
+ detach(): void;
89
+ private _onConnect;
49
90
  /**
50
- * Disconnect from NoLag and clean up all rooms.
91
+ * One setup pass per connection epoch. Serves both initial setup (epoch 1)
92
+ * and reconnect restore (epoch > 1). Aborts silently whenever a newer
93
+ * epoch started or the wrapper detached — checked after every await.
51
94
  */
52
- disconnect(): void;
95
+ private _runSetup;
96
+ private _scheduleLobbyRefresh;
53
97
  /**
54
98
  * Join (activate) a chat room. Deactivates the previous active room.
55
99
  * If the room was pre-subscribed via the `rooms` option, activates it.
@@ -80,16 +124,28 @@ export declare class NoLagChat extends EventEmitter<ChatClientEvents> {
80
124
  avatar?: string;
81
125
  metadata?: Record<string, unknown>;
82
126
  }): void;
83
- private _subscribeRoom;
127
+ private _assertUsable;
128
+ private _subscribeRoomInternal;
129
+ /**
130
+ * On a shared client, presence events from other apps' wrappers arrive on
131
+ * the same connection-level events. Wrappers stamp their presence with a
132
+ * `__scope` (their appName); a mismatched tag means another app's data.
133
+ * Untagged presence is accepted (older peers in this same app).
134
+ */
135
+ private _foreignScope;
84
136
  private _handleRoomPresenceJoin;
85
137
  private _handleRoomPresenceLeave;
86
138
  private _handleRoomPresenceUpdate;
87
- private _setupLobby;
88
139
  private _handleLobbyJoin;
89
140
  private _handleLobbyLeave;
90
141
  private _handleLobbyUpdate;
91
- private _hydrateOnlineUsers;
142
+ /**
143
+ * Reconcile the online-user map against a fresh lobby snapshot, emitting
144
+ * only the deltas (userOffline for vanished, userOnline for new,
145
+ * userUpdated for changed). One path for initial hydration, reconnect
146
+ * restore, and the deferred refetch.
147
+ */
148
+ private _diffHydrateOnlineUsers;
92
149
  private _presenceToUser;
93
150
  private _findUserIdByActorId;
94
- private _restoreRooms;
95
151
  }
package/dist/browser.js CHANGED
@@ -1,2 +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};
1
+ class e{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 i of s)try{i(...t)}catch(t){console.error(`Error in ${String(e)} handler:`,t)}}listenerCount(e){return this._handlers.get(e)?.size??0}}class t{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)}get(e){if(this._ids.has(e))return this._messages.find(t=>t.id===e)}clear(){this._messages=[],this._ids.clear()}}class s{constructor(e){this._users=new Map,this._actorToUserId=new Map,this._localActorId=e}addFromPresence(e,t,s){if(e===this._localActorId)return null;const i=this._actorToUserId.get(e),o=t.userId||i||e,r={userId:o,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(o,r),this._actorToUserId.set(e,o),r}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 o(){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 n=new WeakMap;const a="messages",h="_typing",c="_stream";class _{constructor(e,t,s){this._flushIntervalMs=t,this._hooks=s,this._buffer="",this._flushTimer=null,this._closed=!1,this.message=e,this._hooks.publishStream({type:"start",id:e.id,userId:e.userId,username:e.username,avatar:e.avatar,timestamp:e.timestamp}),this._hooks.emitStart(e)}append(e){!this._closed&&e&&(this.message.text+=e,this._buffer+=e,this._hooks.emitChunk(this.message,e),this._flushTimer||(this._flushTimer=setTimeout(()=>this._flush(),this._flushIntervalMs)))}complete(){return this._closed||(this._flush(),this._closed=!0,this._clearTimer(),this.message.status="sent",this._hooks.publishFinal(this.message),this._hooks.emitEnd(this.message)),this.message}abort(e){this._closed||(this._closed=!0,this._clearTimer(),this._buffer="",this.message.status="aborted",this._hooks.publishStream({type:"abort",id:this.message.id,error:e}),this._hooks.emitAbort(this.message,e))}_flush(){this._clearTimer(),this._buffer&&(this._hooks.publishStream({type:"delta",id:this.message.id,text:this._buffer}),this._buffer="")}_clearTimer(){this._flushTimer&&(clearTimeout(this._flushTimer),this._flushTimer=null)}}class l extends e{constructor(e,o,r,n,a,c){super(),this._unreadCount=0,this._active=!1,this._onMessagesRef=null,this._onTypingRef=null,this._onStreamRef=null,this.name=e,this._roomContext=o,this._localUser=r,this._options=n,this._log=a,this._isConnected=c,this._presenceManager=new s(r.actorTokenId),this._typingManager=new i(n.typingTimeout),this._messageStore=new t(n.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:o(),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._publishFinalMessage(s),s.status="sent",this._typingManager.stopTyping(),s}startStream(e){const t={id:o(),userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,text:"",data:e?.data,timestamp:Date.now(),status:"streaming",isReplay:!1};return this._messageStore.add(t),this._typingManager.stopTyping(),new _(t,e?.flushIntervalMs??60,{publishStream:e=>this._roomContext.emit(c,e,{echo:!1}),publishFinal:e=>this._publishFinalMessage(e),emitStart:e=>this.emit("streamStart",e),emitChunk:(e,t)=>this.emit("streamChunk",{message:e,delta:t}),emitEnd:e=>this.emit("streamEnd",e),emitAbort:(e,t)=>this.emit("streamAbort",{message:e,error:t})})}async streamMessage(e,t){const s=this.startStream(t);try{for await(const t of e)s.append(t);return s.complete()}catch(e){throw s.abort(e instanceof Error?e.message:String(e)),e}}_publishFinalMessage(e){this._roomContext.emit(a,{id:e.id,userId:e.userId,username:e.username,avatar:e.avatar,text:e.text,data:e.data,timestamp:e.timestamp},{echo:!1})}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.subscribe(c),this._onMessagesRef=(e,t)=>{this._handleIncomingMessage(e,t)},this._roomContext.on(a,this._onMessagesRef),this._onTypingRef=e=>{const{userId:t,typing:s}=e;t!==this._localUser.userId&&this._typingManager.handleRemote(t,s)},this._roomContext.on(h,this._onTypingRef),this._onStreamRef=e=>{this._handleStreamEvent(e)},this._roomContext.on(c,this._onStreamRef)}_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._isConnected()&&(this._roomContext.unsubscribe(a),this._roomContext.unsubscribe(h),this._roomContext.unsubscribe(c)),this._onMessagesRef&&this._roomContext.off(a,this._onMessagesRef),this._onTypingRef&&this._roomContext.off(h,this._onTypingRef),this._onStreamRef&&this._roomContext.off(c,this._onStreamRef),this._onMessagesRef=null,this._onTypingRef=null,this._onStreamRef=null,this._typingManager.dispose(),this._messageStore.clear(),this._presenceManager.clear(),this.removeAllListeners()}_handleIncomingMessage(e,t){const s=e,i=s.id,o=this._messageStore.get(i);if(o&&"streaming"===o.status)return o.text=s.text,o.data=s.data,o.status="delivered",this.emit("streamEnd",o),this.emit("message",o),void(this._active||o.isReplay||(this._unreadCount++,this.emit("unreadChanged",{room:this.name,count:this._unreadCount})));const r={id:i,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(r)&&(this.emit("message",r),this._active||r.isReplay||(this._unreadCount++,this.emit("unreadChanged",{room:this.name,count:this._unreadCount})))}_handleStreamEvent(e){const t=e;if(t&&t.id)switch(t.type){case"start":{if(t.userId===this._localUser.userId)return;const e={id:t.id,userId:t.userId,username:t.username,avatar:t.avatar,text:"",timestamp:t.timestamp,status:"streaming",isReplay:!1};this._messageStore.add(e)&&this.emit("streamStart",e);break}case"delta":{const e=this._messageStore.get(t.id);e&&"streaming"===e.status&&(e.text+=t.text,this.emit("streamChunk",{message:e,delta:t.text}));break}case"abort":{const e=this._messageStore.get(t.id);e&&"streaming"===e.status&&(e.status="aborted",this.emit("streamAbort",{message:e,error:t.error}));break}}}_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,__scope:this._options.appName};this._roomContext.setPresence(e)}}class d extends e{constructor(e){if(super(),this._localUser=null,this._rooms=new Map,this._lobby=null,this._onlineUsers=new Map,this._actorToUserId=new Map,this._activeRoom=null,this._epoch=0,this._detached=!1,this._isReady=!1,this._lobbyRefreshTimer=null,this._onConnectRef=()=>this._onConnect(),this._onDisconnectRef=e=>{this._log("Disconnected:",e),this.emit("disconnected",e)},this._onReconnectRef=()=>{this._log("Reconnecting..."),this.emit("reconnecting")},this._onErrorRef=e=>{this._log("Error:",e),this.emit("error",e)},this._onReplayStartRef=e=>{const t=e;for(const e of this._rooms.values())e._handleReplayStart(t.count)},this._onReplayEndRef=e=>{const t=e;for(const e of this._rooms.values())e._handleReplayEnd(t.replayed)},this._onPresenceJoinRef=e=>this._handleRoomPresenceJoin(e),this._onPresenceLeaveRef=e=>this._handleRoomPresenceLeave(e),this._onPresenceUpdateRef=e=>this._handleRoomPresenceUpdate(e),this._onLobbyJoinRef=e=>this._handleLobbyJoin(e),this._onLobbyLeaveRef=e=>this._handleLobbyLeave(e),this._onLobbyUpdateRef=e=>this._handleLobbyUpdate(e),!e?.client)throw new TypeError("NoLagChat requires an injected NoLag client: new NoLagChat({ client, username, ... })");this._client=e.client,this._userId=o(),this._options={username:e.username,avatar:e.avatar,metadata:e.metadata,appName:e.appName??"chat",typingTimeout:e.typingTimeout??3e3,maxMessageCache:e.maxMessageCache??500,debug:e.debug??!1,rooms:e.rooms??[]},this._log=r("NoLagChat",this._options.debug),this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPromise.catch(()=>{}),function(e,t,s){let i=n.get(e);i||(i=new Map,n.set(e,i));const o=i.get(t);o&&console.warn(`[${s}] Another wrapper (${o}) is already attached to this client for app "${t}". Use one wrapper per (client, app) — detach the other instance first.`),i.set(t,s)}(this._client,this._options.appName,"NoLagChat"),this._client.on("connect",this._onConnectRef),this._client.on("disconnect",this._onDisconnectRef),this._client.on("reconnect",this._onReconnectRef),this._client.on("error",this._onErrorRef),this._client.on("replay:start",this._onReplayStartRef),this._client.on("replay:end",this._onReplayEndRef),this._client.on("presence:join",this._onPresenceJoinRef),this._client.on("presence:leave",this._onPresenceLeaveRef),this._client.on("presence:update",this._onPresenceUpdateRef),this._client.on("lobbyPresence:join",this._onLobbyJoinRef),this._client.on("lobbyPresence:leave",this._onLobbyLeaveRef),this._client.on("lobbyPresence:update",this._onLobbyUpdateRef),queueMicrotask(()=>{0===this._epoch&&!this._detached&&this._client.connected&&this._onConnect()})}get connected(){return!this._detached&&this._client.connected}get client(){return this._client}get localUser(){return this._localUser}get rooms(){return this._rooms}ready(){return this._readyPromise}detach(){if(!this._detached){this._log("Detaching..."),this._detached=!0,this._epoch++,this._lobbyRefreshTimer&&(clearTimeout(this._lobbyRefreshTimer),this._lobbyRefreshTimer=null),this._client.off("connect",this._onConnectRef),this._client.off("disconnect",this._onDisconnectRef),this._client.off("reconnect",this._onReconnectRef),this._client.off("error",this._onErrorRef),this._client.off("replay:start",this._onReplayStartRef),this._client.off("replay:end",this._onReplayEndRef),this._client.off("presence:join",this._onPresenceJoinRef),this._client.off("presence:leave",this._onPresenceLeaveRef),this._client.off("presence:update",this._onPresenceUpdateRef),this._client.off("lobbyPresence:join",this._onLobbyJoinRef),this._client.off("lobbyPresence:leave",this._onLobbyLeaveRef),this._client.off("lobbyPresence:update",this._onLobbyUpdateRef);for(const e of[...this._rooms.keys()])this._rooms.get(e)._cleanup(),this._rooms.delete(e);if(this._activeRoom=null,this._lobby&&this._client.connected)try{this._lobby.unsubscribe()}catch{}var e,t;this._lobby=null,this._onlineUsers.clear(),this._actorToUserId.clear(),this._localUser=null,e=this._client,t=this._options.appName,n.get(e)?.delete(t),this._isReady||this._readyReject(new Error("NoLagChat detached before ready"))}}_onConnect(){this._epoch++,this._runSetup(this._epoch)}async _runSetup(e){const t=()=>e!==this._epoch||this._detached;this._log(this._isReady?"Restoring after reconnect...":"Setting up..."),this._localUser?this._localUser.actorTokenId=this._client.actorId:(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)),this._lobby||(this._lobby=this._client.setApp(this._options.appName).setLobby("online"));try{const e=await this._lobby.subscribe();if(t())return;this._diffHydrateOnlineUsers(e),this._log("Lobby subscribed, online users:",this._onlineUsers.size)}catch(e){if(t())return;this._log("Lobby subscription failed:",e)}if(this._isReady)this._activeRoom&&this._rooms.get(this._activeRoom)?._updateLocalPresence();else for(const e of this._options.rooms)this._subscribeRoomInternal(e);t()||(this._isReady?this.emit("reconnected"):(this._isReady=!0,this._readyResolve(),this.emit("connected")),this._scheduleLobbyRefresh(e))}_scheduleLobbyRefresh(e){this._lobbyRefreshTimer&&clearTimeout(this._lobbyRefreshTimer),this._lobbyRefreshTimer=setTimeout(()=>{this._lobbyRefreshTimer=null,e===this._epoch&&!this._detached&&this._client.connected&&this._lobby&&this._lobby.fetchPresence().then(t=>{e!==this._epoch||this._detached||this._diffHydrateOnlineUsers(t)}).catch(()=>{})},2e3)}joinRoom(e){if(this._assertUsable(),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._subscribeRoomInternal(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()}}_assertUsable(){if(this._detached)throw new Error("NoLagChat has been detached — construct a new instance");if(!this._isReady||!this._localUser)throw new Error('NoLagChat not ready — await ready() or the "connected" event')}_subscribeRoomInternal(e){this._log("Subscribing room:",e);const t=this._client.setApp(this._options.appName).setRoom(e),s=new l(e,t,this._localUser,this._options,r(`ChatRoom:${e}`,this._options.debug),()=>this._client.connected);return this._rooms.set(e,s),s._subscribe(),s}_foreignScope(e){const t=e?.__scope;return"string"==typeof t&&t!==this._options.appName}_handleRoomPresenceJoin(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=e.presence;if(!t?.userId||this._foreignScope(t))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 i=this._activeRoom?this._rooms.get(this._activeRoom):void 0;i&&i._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||this._foreignScope(t))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)}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const i=s;if(!i.userId||this._foreignScope(i))return;const o=this._presenceToUser(t,i);this._actorToUserId.set(t,o.userId),this._onlineUsers.has(o.userId)||(this._onlineUsers.set(o.userId,o),this.emit("userOnline",o))}_handleLobbyLeave(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const i=s;if(this._foreignScope(i))return;const o=i?.userId||this._actorToUserId.get(t)||this._findUserIdByActorId(t);if(o){const e=this._onlineUsers.get(o);e&&(this._onlineUsers.delete(o),this._actorToUserId.delete(t),this.emit("userOffline",e))}}_handleLobbyUpdate(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const i=s;if(!i.userId||this._foreignScope(i))return;const o=this._presenceToUser(t,i);this._onlineUsers.set(o.userId,o),this.emit("userUpdated",o)}_diffHydrateOnlineUsers(e){const t=new Map,s=new Map;for(const i of Object.keys(e)){const o=e[i];for(const e of Object.keys(o)){if(e===this._localUser?.actorTokenId)continue;const i=o[e],r=i?.presence??i;r?.userId&&!this._foreignScope(r)&&(t.has(r.userId)||t.set(r.userId,this._presenceToUser(e,r)),s.set(e,r.userId))}}for(const[e,s]of[...this._onlineUsers])if(!t.has(e)){this._onlineUsers.delete(e);for(const[t,s]of[...this._actorToUserId])s===e&&this._actorToUserId.delete(t);this.emit("userOffline",s)}for(const[e,s]of t){const t=this._onlineUsers.get(e);t?t.username===s.username&&t.avatar===s.avatar&&t.status===s.status||(this._onlineUsers.set(e,s),this.emit("userUpdated",s)):(this._onlineUsers.set(e,s),this.emit("userOnline",s))}for(const[e,t]of s)this._actorToUserId.set(e,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}}export{l as ChatRoom,e as EventEmitter,d as NoLagChat};
2
2
  //# sourceMappingURL=browser.js.map
@@ -1 +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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"}
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/MessageStream.ts","../src/ChatRoom.ts","../src/NoLagChat.ts"],"sourcesContent":[null,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","find","m","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","wrapperRegistry","WeakMap","TOPIC_MESSAGES","TOPIC_TYPING","TOPIC_STREAM","MessageStreamController","_flushIntervalMs","_hooks","_buffer","_flushTimer","_closed","publishStream","type","emitStart","append","text","emitChunk","_flush","complete","_clearTimer","publishFinal","emitEnd","abort","emitAbort","ChatRoom","name","roomContext","localUser","options","isConnected","super","_unreadCount","_active","_onMessagesRef","_onTypingRef","_onStreamRef","_roomContext","_localUser","_options","_log","_isConnected","_presenceManager","_typingManager","typingTimeout","_messageStore","maxMessageCache","echo","typingUsers","messages","typingIds","unreadCount","active","markRead","room","count","sendMessage","data","isReplay","_publishFinalMessage","startStream","flushIntervalMs","payload","delta","streamMessage","source","stream","chunk","err","Error","getMessages","getUsers","_subscribe","subscribe","meta","_handleIncomingMessage","_handleStreamEvent","_activate","_markRead","_setPresence","fetchPresence","then","actors","actor","catch","_deactivate","_handlePresenceJoin","presenceData","_handlePresenceLeave","_handlePresenceUpdate","_handleReplayStart","_handleReplayEnd","replayed","_updateLocalPresence","_cleanup","unsubscribe","msg","streaming","chatMessage","evt","__scope","appName","setPresence","NoLagChat","_rooms","_lobby","_onlineUsers","_activeRoom","_epoch","_detached","_isReady","_lobbyRefreshTimer","_onConnectRef","_onConnect","_onDisconnectRef","reason","_onReconnectRef","_onErrorRef","_onReplayStartRef","_onReplayEndRef","_onPresenceJoinRef","_handleRoomPresenceJoin","_onPresenceLeaveRef","_handleRoomPresenceLeave","_onPresenceUpdateRef","_handleRoomPresenceUpdate","_onLobbyJoinRef","_handleLobbyJoin","_onLobbyLeaveRef","_handleLobbyLeave","_onLobbyUpdateRef","_handleLobbyUpdate","client","TypeError","_client","_userId","debug","rooms","_readyPromise","Promise","resolve","reject","_readyResolve","_readyReject","wrapperName","apps","warn","registerWrapper","queueMicrotask","connected","ready","detach","keys","_runSetup","epoch","stale","actorId","setApp","setLobby","state","_diffHydrateOnlineUsers","roomName","_subscribeRoomInternal","_scheduleLobbyRefresh","joinRoom","_assertUsable","prev","leaveRoom","getRooms","getOnlineUsers","setStatus","activeRoom","updateProfile","updates","setRoom","_foreignScope","scope","_presenceToUser","_findUserIdByActorId","fresh","freshActors","roomId","Object","roomPresence","raw","mappedUserId"],"mappings":"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"}
@@ -8,5 +8,11 @@ export declare const DEFAULT_MAX_MESSAGE_CACHE = 500;
8
8
  export declare const TOPIC_MESSAGES = "messages";
9
9
  /** Topic name for typing indicators within a room */
10
10
  export declare const TOPIC_TYPING = "_typing";
11
+ /** Topic name for live streamed message chunks within a room (ephemeral) */
12
+ export declare const TOPIC_STREAM = "_stream";
13
+ /** Default coalesce/flush interval for streamed token chunks (ms) */
14
+ export declare const DEFAULT_STREAM_FLUSH_MS = 60;
11
15
  /** Lobby ID for global online presence */
12
16
  export declare const LOBBY_ID = "online";
17
+ /** Delay before the post-setup lobby presence refetch (catches simultaneous joiners) */
18
+ export declare const LOBBY_REFRESH_DELAY_MS = 2000;