@nolag/chat 1.0.0 → 1.2.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/dist/ChatRoom.d.ts +31 -2
- package/dist/NoLagChat.d.ts +2 -2
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/index.cjs +114 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +114 -14
- package/dist/index.mjs.map +1 -1
- package/dist/react-native.d.ts +13 -0
- package/dist/react-native.js +1579 -0
- package/dist/react-native.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/utils.d.ts +49 -0
- package/package.json +10 -4
package/dist/ChatRoom.d.ts
CHANGED
|
@@ -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, StreamMessageOptions, MessageStream } from './types';
|
|
3
|
+
import type { ChatRoomEvents, ChatMessage, ChatUser, ChatPresenceData, ResolvedChatOptions, SendMessageOptions, StreamMessageOptions, MessageStream, FilterValue } from './types';
|
|
4
4
|
/**
|
|
5
5
|
* ChatRoom — a single chat room with messages, users, and typing indicators.
|
|
6
6
|
*
|
|
@@ -19,6 +19,7 @@ export declare class ChatRoom extends EventEmitter<ChatRoomEvents> {
|
|
|
19
19
|
private _isConnected;
|
|
20
20
|
private _unreadCount;
|
|
21
21
|
private _active;
|
|
22
|
+
private _filters;
|
|
22
23
|
private _onMessagesRef;
|
|
23
24
|
private _onTypingRef;
|
|
24
25
|
private _onStreamRef;
|
|
@@ -36,6 +37,34 @@ export declare class ChatRoom extends EventEmitter<ChatRoomEvents> {
|
|
|
36
37
|
get active(): boolean;
|
|
37
38
|
/** Reset the unread count to zero */
|
|
38
39
|
markRead(): void;
|
|
40
|
+
/** The filter values currently applied to this room's messages. */
|
|
41
|
+
get filters(): FilterValue[];
|
|
42
|
+
/**
|
|
43
|
+
* Replace this room's message filters — only messages published with one of
|
|
44
|
+
* these values are delivered. Applies to live streams as well as finalized
|
|
45
|
+
* messages, so a filtered stream reaches the same audience as its final
|
|
46
|
+
* message.
|
|
47
|
+
*
|
|
48
|
+
* Passing an empty array clears filtering and restores the wildcard
|
|
49
|
+
* subscription, which receives everything on the topic.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* room.setFilters(['alice', 'bob']); // alice OR bob
|
|
54
|
+
* room.setFilters([['alice', 'admin']]); // alice AND admin
|
|
55
|
+
* room.setFilters([]); // everything
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
setFilters(values: FilterValue[]): void;
|
|
59
|
+
/** Add filter values to the existing set. Existing AND groups are kept. */
|
|
60
|
+
addFilters(values: string[]): void;
|
|
61
|
+
/**
|
|
62
|
+
* Remove filter values from the existing set. Removing the last value
|
|
63
|
+
* restores the wildcard subscription.
|
|
64
|
+
*/
|
|
65
|
+
removeFilters(values: string[]): void;
|
|
66
|
+
/** @internal Push the current filter set to one topic. */
|
|
67
|
+
private _applyFilters;
|
|
39
68
|
/**
|
|
40
69
|
* Send a text message to this room. Returns an optimistic ChatMessage.
|
|
41
70
|
*/
|
|
@@ -88,7 +117,7 @@ export declare class ChatRoom extends EventEmitter<ChatRoomEvents> {
|
|
|
88
117
|
*/
|
|
89
118
|
getUser(userId: string): ChatUser | undefined;
|
|
90
119
|
/** @internal Subscribe to message/typing topics and attach listeners (all rooms) */
|
|
91
|
-
_subscribe(): void;
|
|
120
|
+
_subscribe(filters?: FilterValue[]): void;
|
|
92
121
|
/** @internal Set presence and fetch room members (active room only) */
|
|
93
122
|
_activate(): void;
|
|
94
123
|
/** @internal Clear presence state but keep subscriptions alive */
|
package/dist/NoLagChat.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { NoLagSocket } from '@nolag/js-sdk';
|
|
2
2
|
import { EventEmitter } from './EventEmitter';
|
|
3
3
|
import { ChatRoom } from './ChatRoom';
|
|
4
|
-
import type { NoLagChatOptions, ChatClientEvents, ChatUser } from './types';
|
|
4
|
+
import type { NoLagChatOptions, ChatClientEvents, ChatUser, JoinRoomOptions } from './types';
|
|
5
5
|
/**
|
|
6
6
|
* NoLagChat — high-level chat SDK built on @nolag/js-sdk.
|
|
7
7
|
*
|
|
@@ -99,7 +99,7 @@ export declare class NoLagChat extends EventEmitter<ChatClientEvents> {
|
|
|
99
99
|
* If the room was pre-subscribed via the `rooms` option, activates it.
|
|
100
100
|
* Otherwise creates, subscribes, and activates it.
|
|
101
101
|
*/
|
|
102
|
-
joinRoom(name: string): ChatRoom;
|
|
102
|
+
joinRoom(name: string, opts?: JoinRoomOptions): ChatRoom;
|
|
103
103
|
/**
|
|
104
104
|
* Leave a chat room. Fully unsubscribes and removes it.
|
|
105
105
|
*/
|
package/dist/browser.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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};
|
|
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)=>{}}function n(e){return e?.filter?{filter:e.filter}:e?.filters&&e.filters.length>0?{filters:e.filters}:{}}const a=new WeakMap;const h="messages",c="_typing",_="_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 d extends e{constructor(e,o,r,n,a,h){super(),this._unreadCount=0,this._active=!1,this._filters=[],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=h,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(c,{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}))}get filters(){return[...this._filters]}setFilters(e){this._filters=[...e],this._applyFilters(h),this._applyFilters(_)}addFilters(e){this.setFilters(function(e,t){const s=new Set,i=[];for(const t of e)"string"==typeof t?s.add(t):i.push(t);for(const e of t)s.add(e);return[...s,...i]}(this._filters,e))}removeFilters(e){this.setFilters(function(e,t){const s=new Set(t);return e.filter(e=>"string"!=typeof e||!s.has(e))}(this._filters,e))}_applyFilters(e){this._roomContext.setFilters(e,this._filters)}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,n(t)),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};this._messageStore.add(t),this._typingManager.stopTyping();const s=n(e);return new l(t,e?.flushIntervalMs??60,{publishStream:e=>this._roomContext.emit(_,e,{echo:!1,...s}),publishFinal:e=>this._publishFinalMessage(e,s),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,t={}){this._roomContext.emit(h,{id:e.id,userId:e.userId,username:e.username,avatar:e.avatar,text:e.text,data:e.data,timestamp:e.timestamp},{echo:!1,...t})}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(e){if(this._log("Room subscribe:",this.name,e?.length?`filters: ${e.length}`:""),this._filters=e?[...e]:[],this._filters.length>0){const e={filters:this._filters};this._roomContext.subscribe(h,e),this._roomContext.subscribe(_,e)}else this._roomContext.subscribe(h),this._roomContext.subscribe(_);this._roomContext.subscribe(c),this._onMessagesRef=(e,t)=>{this._handleIncomingMessage(e,t)},this._roomContext.on(h,this._onMessagesRef),this._onTypingRef=e=>{const{userId:t,typing:s}=e;t!==this._localUser.userId&&this._typingManager.handleRemote(t,s)},this._roomContext.on(c,this._onTypingRef),this._onStreamRef=e=>{this._handleStreamEvent(e)},this._roomContext.on(_,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(h),this._roomContext.unsubscribe(c),this._roomContext.unsubscribe(_)),this._onMessagesRef&&this._roomContext.off(h,this._onMessagesRef),this._onTypingRef&&this._roomContext.off(c,this._onTypingRef),this._onStreamRef&&this._roomContext.off(_,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 m 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=a.get(e);i||(i=new Map,a.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,a.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,t){if(this._assertUsable(),this._activeRoom&&this._activeRoom!==e){const e=this._rooms.get(this._activeRoom);e&&e._deactivate()}let s=this._rooms.get(e);return s?t?.filters&&s.setFilters(t.filters):s=this._subscribeRoomInternal(e,t?.filters),this._activeRoom=e,s._activate(),s}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,t){this._log("Subscribing room:",e);const s=this._client.setApp(this._options.appName).setRoom(e),i=new d(e,s,this._localUser,this._options,r(`ChatRoom:${e}`,this._options.debug),()=>this._client.connected);return this._rooms.set(e,i),i._subscribe(t),i}_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{d as ChatRoom,e as EventEmitter,m as NoLagChat};
|
|
2
2
|
//# sourceMappingURL=browser.js.map
|
package/dist/browser.js.map
CHANGED
|
@@ -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","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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"}
|
|
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","filterEmitOptions","opts","filter","filters","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","_filters","_onMessagesRef","_onTypingRef","_onStreamRef","_roomContext","_localUser","_options","_log","_isConnected","_presenceManager","_typingManager","typingTimeout","_messageStore","maxMessageCache","echo","typingUsers","messages","typingIds","unreadCount","active","markRead","room","count","setFilters","_applyFilters","addFilters","simple","groups","f","v","mergeFilters","removeFilters","remove","drop","withoutFilters","topic","sendMessage","data","isReplay","_publishFinalMessage","startStream","filterOpts","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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"}
|
package/dist/index.cjs
CHANGED
|
@@ -349,6 +349,45 @@ function createLogger(prefix, enabled) {
|
|
|
349
349
|
console.log(`[${prefix}]`, ...args);
|
|
350
350
|
};
|
|
351
351
|
}
|
|
352
|
+
// ============ Filters ============
|
|
353
|
+
/**
|
|
354
|
+
* Build the filter fragment of an emit options object.
|
|
355
|
+
*
|
|
356
|
+
* `filter` wins over `filters`: a publish is routed to exactly one topic, so
|
|
357
|
+
* honouring both would silently drop one of them.
|
|
358
|
+
*/
|
|
359
|
+
function filterEmitOptions(opts) {
|
|
360
|
+
if (opts?.filter)
|
|
361
|
+
return { filter: opts.filter };
|
|
362
|
+
if (opts?.filters && opts.filters.length > 0)
|
|
363
|
+
return { filters: opts.filters };
|
|
364
|
+
return {};
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Merge OR terms into an existing filter set. AND groups (nested arrays) are
|
|
368
|
+
* preserved as-is — only plain string terms are deduplicated.
|
|
369
|
+
*/
|
|
370
|
+
function mergeFilters(existing, add) {
|
|
371
|
+
const simple = new Set();
|
|
372
|
+
const groups = [];
|
|
373
|
+
for (const f of existing) {
|
|
374
|
+
if (typeof f === 'string')
|
|
375
|
+
simple.add(f);
|
|
376
|
+
else
|
|
377
|
+
groups.push(f);
|
|
378
|
+
}
|
|
379
|
+
for (const v of add)
|
|
380
|
+
simple.add(v);
|
|
381
|
+
return [...simple, ...groups];
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Drop OR terms from a filter set. AND groups are left untouched — remove
|
|
385
|
+
* those by calling `setFilters` with the set you want.
|
|
386
|
+
*/
|
|
387
|
+
function withoutFilters(existing, remove) {
|
|
388
|
+
const drop = new Set(remove);
|
|
389
|
+
return existing.filter((f) => typeof f !== 'string' || !drop.has(f));
|
|
390
|
+
}
|
|
352
391
|
// ============ Wrapper registry ============
|
|
353
392
|
// One wrapper instance per (client, appName): two wrappers sharing an app on
|
|
354
393
|
// one connection would collide on topics, presence and the online lobby.
|
|
@@ -479,6 +518,7 @@ class ChatRoom extends EventEmitter {
|
|
|
479
518
|
super();
|
|
480
519
|
this._unreadCount = 0;
|
|
481
520
|
this._active = false;
|
|
521
|
+
this._filters = [];
|
|
482
522
|
// Stored topic handler refs — cleanup removes exactly these, never all
|
|
483
523
|
// handlers for a topic (the client may be shared with other consumers).
|
|
484
524
|
this._onMessagesRef = null;
|
|
@@ -540,6 +580,49 @@ class ChatRoom extends EventEmitter {
|
|
|
540
580
|
this.emit('unreadChanged', { room: this.name, count: 0 });
|
|
541
581
|
}
|
|
542
582
|
}
|
|
583
|
+
// ============ Filters ============
|
|
584
|
+
/** The filter values currently applied to this room's messages. */
|
|
585
|
+
get filters() {
|
|
586
|
+
return [...this._filters];
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Replace this room's message filters — only messages published with one of
|
|
590
|
+
* these values are delivered. Applies to live streams as well as finalized
|
|
591
|
+
* messages, so a filtered stream reaches the same audience as its final
|
|
592
|
+
* message.
|
|
593
|
+
*
|
|
594
|
+
* Passing an empty array clears filtering and restores the wildcard
|
|
595
|
+
* subscription, which receives everything on the topic.
|
|
596
|
+
*
|
|
597
|
+
* @example
|
|
598
|
+
* ```ts
|
|
599
|
+
* room.setFilters(['alice', 'bob']); // alice OR bob
|
|
600
|
+
* room.setFilters([['alice', 'admin']]); // alice AND admin
|
|
601
|
+
* room.setFilters([]); // everything
|
|
602
|
+
* ```
|
|
603
|
+
*/
|
|
604
|
+
setFilters(values) {
|
|
605
|
+
this._filters = [...values];
|
|
606
|
+
this._applyFilters(TOPIC_MESSAGES);
|
|
607
|
+
this._applyFilters(TOPIC_STREAM);
|
|
608
|
+
}
|
|
609
|
+
/** Add filter values to the existing set. Existing AND groups are kept. */
|
|
610
|
+
addFilters(values) {
|
|
611
|
+
this.setFilters(mergeFilters(this._filters, values));
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Remove filter values from the existing set. Removing the last value
|
|
615
|
+
* restores the wildcard subscription.
|
|
616
|
+
*/
|
|
617
|
+
removeFilters(values) {
|
|
618
|
+
this.setFilters(withoutFilters(this._filters, values));
|
|
619
|
+
}
|
|
620
|
+
/** @internal Push the current filter set to one topic. */
|
|
621
|
+
_applyFilters(topic) {
|
|
622
|
+
// The core types filters as `string[]`, but both its implementation and
|
|
623
|
+
// the wire protocol accept AND groups (nested arrays).
|
|
624
|
+
this._roomContext.setFilters(topic, this._filters);
|
|
625
|
+
}
|
|
543
626
|
// ============ Messaging ============
|
|
544
627
|
/**
|
|
545
628
|
* Send a text message to this room. Returns an optimistic ChatMessage.
|
|
@@ -560,7 +643,7 @@ class ChatRoom extends EventEmitter {
|
|
|
560
643
|
this._messageStore.add(message);
|
|
561
644
|
this.emit('messageSent', message);
|
|
562
645
|
// Publish to room (echo: false prevents duplicate)
|
|
563
|
-
this._publishFinalMessage(message);
|
|
646
|
+
this._publishFinalMessage(message, filterEmitOptions(options));
|
|
564
647
|
// Mark as sent
|
|
565
648
|
message.status = 'sent';
|
|
566
649
|
// Stop typing on send
|
|
@@ -595,9 +678,12 @@ class ChatRoom extends EventEmitter {
|
|
|
595
678
|
// Optimistic: appears in room.messages and grows as tokens arrive.
|
|
596
679
|
this._messageStore.add(message);
|
|
597
680
|
this._typingManager.stopTyping();
|
|
681
|
+
// Deltas and the final message carry the same filter, so subscribers who
|
|
682
|
+
// see the stream grow are exactly those who end up with the message.
|
|
683
|
+
const filterOpts = filterEmitOptions(options);
|
|
598
684
|
return new MessageStreamController(message, options?.flushIntervalMs ?? DEFAULT_STREAM_FLUSH_MS, {
|
|
599
|
-
publishStream: (payload) => this._roomContext.emit(TOPIC_STREAM, payload, { echo: false }),
|
|
600
|
-
publishFinal: (m) => this._publishFinalMessage(m),
|
|
685
|
+
publishStream: (payload) => this._roomContext.emit(TOPIC_STREAM, payload, { echo: false, ...filterOpts }),
|
|
686
|
+
publishFinal: (m) => this._publishFinalMessage(m, filterOpts),
|
|
601
687
|
emitStart: (m) => this.emit('streamStart', m),
|
|
602
688
|
emitChunk: (m, delta) => this.emit('streamChunk', { message: m, delta }),
|
|
603
689
|
emitEnd: (m) => this.emit('streamEnd', m),
|
|
@@ -629,7 +715,7 @@ class ChatRoom extends EventEmitter {
|
|
|
629
715
|
}
|
|
630
716
|
}
|
|
631
717
|
/** @internal Publish a final message on the persisted `messages` topic. */
|
|
632
|
-
_publishFinalMessage(message) {
|
|
718
|
+
_publishFinalMessage(message, filterOpts = {}) {
|
|
633
719
|
this._roomContext.emit(TOPIC_MESSAGES, {
|
|
634
720
|
id: message.id,
|
|
635
721
|
userId: message.userId,
|
|
@@ -638,7 +724,7 @@ class ChatRoom extends EventEmitter {
|
|
|
638
724
|
text: message.text,
|
|
639
725
|
data: message.data,
|
|
640
726
|
timestamp: message.timestamp,
|
|
641
|
-
}, { echo: false });
|
|
727
|
+
}, { echo: false, ...filterOpts });
|
|
642
728
|
}
|
|
643
729
|
/**
|
|
644
730
|
* Get all messages (alias for the messages getter).
|
|
@@ -674,12 +760,21 @@ class ChatRoom extends EventEmitter {
|
|
|
674
760
|
}
|
|
675
761
|
// ============ Internal (called by NoLagChat) ============
|
|
676
762
|
/** @internal Subscribe to message/typing topics and attach listeners (all rooms) */
|
|
677
|
-
_subscribe() {
|
|
678
|
-
this._log('Room subscribe:', this.name);
|
|
679
|
-
|
|
680
|
-
|
|
763
|
+
_subscribe(filters) {
|
|
764
|
+
this._log('Room subscribe:', this.name, filters?.length ? `filters: ${filters.length}` : '');
|
|
765
|
+
this._filters = filters ? [...filters] : [];
|
|
766
|
+
// Subscribe to topics. Typing stays unfiltered: it is ephemeral, room-wide
|
|
767
|
+
// and already keyed by userId in the payload.
|
|
768
|
+
if (this._filters.length > 0) {
|
|
769
|
+
const opts = { filters: this._filters };
|
|
770
|
+
this._roomContext.subscribe(TOPIC_MESSAGES, opts);
|
|
771
|
+
this._roomContext.subscribe(TOPIC_STREAM, opts);
|
|
772
|
+
}
|
|
773
|
+
else {
|
|
774
|
+
this._roomContext.subscribe(TOPIC_MESSAGES);
|
|
775
|
+
this._roomContext.subscribe(TOPIC_STREAM);
|
|
776
|
+
}
|
|
681
777
|
this._roomContext.subscribe(TOPIC_TYPING);
|
|
682
|
-
this._roomContext.subscribe(TOPIC_STREAM);
|
|
683
778
|
// Listen for messages (refs stored for handler-specific removal)
|
|
684
779
|
this._onMessagesRef = (data, meta) => {
|
|
685
780
|
this._handleIncomingMessage(data, meta);
|
|
@@ -1196,7 +1291,7 @@ class NoLagChat extends EventEmitter {
|
|
|
1196
1291
|
* If the room was pre-subscribed via the `rooms` option, activates it.
|
|
1197
1292
|
* Otherwise creates, subscribes, and activates it.
|
|
1198
1293
|
*/
|
|
1199
|
-
joinRoom(name) {
|
|
1294
|
+
joinRoom(name, opts) {
|
|
1200
1295
|
this._assertUsable();
|
|
1201
1296
|
// Deactivate the current active room
|
|
1202
1297
|
if (this._activeRoom && this._activeRoom !== name) {
|
|
@@ -1207,7 +1302,12 @@ class NoLagChat extends EventEmitter {
|
|
|
1207
1302
|
// Get or create the room
|
|
1208
1303
|
let room = this._rooms.get(name);
|
|
1209
1304
|
if (!room) {
|
|
1210
|
-
room = this._subscribeRoomInternal(name);
|
|
1305
|
+
room = this._subscribeRoomInternal(name, opts?.filters);
|
|
1306
|
+
}
|
|
1307
|
+
else if (opts?.filters) {
|
|
1308
|
+
// Already subscribed (pre-subscribed via the `rooms` option, or an
|
|
1309
|
+
// earlier join). Re-point its filters rather than ignoring them.
|
|
1310
|
+
room.setFilters(opts.filters);
|
|
1211
1311
|
}
|
|
1212
1312
|
this._activeRoom = name;
|
|
1213
1313
|
room._activate();
|
|
@@ -1290,12 +1390,12 @@ class NoLagChat extends EventEmitter {
|
|
|
1290
1390
|
}
|
|
1291
1391
|
}
|
|
1292
1392
|
// ============ Private: Room Setup ============
|
|
1293
|
-
_subscribeRoomInternal(name) {
|
|
1393
|
+
_subscribeRoomInternal(name, filters) {
|
|
1294
1394
|
this._log('Subscribing room:', name);
|
|
1295
1395
|
const roomContext = this._client.setApp(this._options.appName).setRoom(name);
|
|
1296
1396
|
const room = new ChatRoom(name, roomContext, this._localUser, this._options, createLogger(`ChatRoom:${name}`, this._options.debug), () => this._client.connected);
|
|
1297
1397
|
this._rooms.set(name, room);
|
|
1298
|
-
room._subscribe();
|
|
1398
|
+
room._subscribe(filters);
|
|
1299
1399
|
return room;
|
|
1300
1400
|
}
|
|
1301
1401
|
// ============ Private: Scope Filtering ============
|