@nolag/chat 0.2.0 → 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 |
@@ -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) */
@@ -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 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 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)}get(e){if(this._ids.has(e))return this._messages.find(t=>t.id===e)}clear(){this._messages=[],this._ids.clear()}}class i{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),r=t.userId||i||e,o={userId:r,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(r,o),this._actorToUserId.set(e,r),o}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 r{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 a(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const n="messages",h="_typing",c="_stream";class l{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 _ extends t{constructor(e,t,o,a,n){super(),this._unreadCount=0,this._active=!1,this.name=e,this._roomContext=t,this._localUser=o,this._options=a,this._log=n,this._presenceManager=new i(o.actorTokenId),this._typingManager=new r(a.typingTimeout),this._messageStore=new s(a.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 l(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(n,{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(n),this._roomContext.subscribe(h),this._roomContext.subscribe(c),this._roomContext.on(n,(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)}),this._roomContext.on(c,e=>{this._handleStreamEvent(e)})}_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(n),this._roomContext.unsubscribe(h),this._roomContext.unsubscribe(c),this._roomContext.off(n),this._roomContext.off(h),this._roomContext.off(c),this._typingManager.dispose(),this._messageStore.clear(),this._presenceManager.clear(),this.removeAllListeners()}_handleIncomingMessage(e,t){const s=e,i=s.id,r=this._messageStore.get(i);if(r&&"streaming"===r.status)return r.text=s.text,r.data=s.data,r.status="delivered",this.emit("streamEnd",r),this.emit("message",r),void(this._active||r.isReplay||(this._unreadCount++,this.emit("unreadChanged",{room:this.name,count:this._unreadCount})));const o={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(o)&&(this.emit("message",o),this._active||o.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};this._roomContext.setPresence(e)}}class d 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=o(),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=a("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 _(e,t,this._localUser,this._options,a(`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 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)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 i=s;if(!i.userId)return;const r=this._presenceToUser(t,i);this._actorToUserId.set(t,r.userId),this._onlineUsers.has(r.userId)||(this._onlineUsers.set(r.userId,r),this.emit("userOnline",r))}_handleLobbyLeave(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const i=s,r=i?.userId||this._actorToUserId.get(t)||this._findUserIdByActorId(t);if(r){const e=this._onlineUsers.get(r);e&&(this._onlineUsers.delete(r),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)return;const r=this._presenceToUser(t,i);this._onlineUsers.set(r.userId,r),this.emit("userUpdated",r)}_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],i=t?.presence??t;if(i?.userId){const t=this._presenceToUser(e,i);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{_ as ChatRoom,t as EventEmitter,d 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/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","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","super","_unreadCount","_active","_roomContext","_localUser","_options","_log","_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","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","prev","getRooms","getOnlineUsers","setStatus","activeRoom","updateProfile","updates","setApp","setRoom","_presenceToUser","setLobby","lobbyHandler","_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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"}
@@ -14,3 +14,5 @@ export declare const TOPIC_STREAM = "_stream";
14
14
  export declare const DEFAULT_STREAM_FLUSH_MS = 60;
15
15
  /** Lobby ID for global online presence */
16
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;