@nolag/feed 0.1.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,18 +24,24 @@ npm install @nolag/js-sdk @nolag/feed
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 (feed, chat, notify, ...) 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 { NoLagFeed } from "@nolag/feed";
29
34
 
30
- const feed = new NoLagFeed("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 feed = new NoLagFeed({ client, username: "Alice" });
33
39
 
34
- await feed.connect();
40
+ await client.connect(); // the app owns the connection
41
+ await feed.ready(); // wrapper setup done (identity, presence, channels)
35
42
 
43
+ // Join a channel and create a post
36
44
  const channel = feed.joinChannel("main");
37
-
38
- // Create a post
39
45
  channel.createPost({
40
46
  content: "Just shipped v2.0!",
41
47
  media: [{ type: "image", url: "https://example.com/screenshot.png" }],
@@ -50,12 +56,41 @@ channel.on("postCreated", (post) => {
50
56
  channel.likePost(postId);
51
57
  channel.addComment(postId, "Congrats!");
52
58
 
53
- // Real-time updates
54
- channel.on("postLiked", (post) => {
55
- updateLikeCount(post.id, post.likeCount);
59
+ // Real-time reaction updates
60
+ channel.on("postLiked", ({ postId, likeCount }) => {
61
+ updateLikeCount(postId, likeCount);
56
62
  });
63
+
64
+ // See who's online
65
+ feed.on("userOnline", (user) => {
66
+ console.log(`${user.username} came online`);
67
+ });
68
+
69
+ // Teardown: the wrapper releases its handlers and topics; the app closes
70
+ // the socket (never the other way around).
71
+ feed.detach();
72
+ client.disconnect();
57
73
  ```
58
74
 
75
+ ## Lifecycle
76
+
77
+ - **Construction = attach.** The wrapper wires its handlers onto the injected
78
+ client immediately. If the client is already connected, setup runs on the
79
+ next microtask; otherwise it runs when the client's `connect` event fires.
80
+ - **`ready()`** resolves once the first setup completed (identity, online
81
+ lobby, configured channels). Auth failures surface via your own
82
+ `await client.connect()`, not via `ready()`.
83
+ - **Reconnects are automatic.** The wrapper restores presence and reconciles
84
+ the online-user list, emitting only real deltas.
85
+ - **`detach()`** removes exactly this wrapper's handlers and topics and never
86
+ touches the socket. It is terminal: construct a new instance to re-attach.
87
+ Detach while the client is still connected so server-side unsubscribes go
88
+ through. In frameworks, call it from your dispose hook (`onUnmounted`,
89
+ HMR dispose).
90
+ - **One wrapper per (client, app).** Sharing a client across wrappers of
91
+ DIFFERENT apps is the intended pattern; two wrappers on the same app would
92
+ collide on topics and presence (the SDK warns if you do this).
93
+
59
94
  ## API Reference
60
95
 
61
96
  ### `NoLagFeed`
@@ -63,40 +98,53 @@ channel.on("postLiked", (post) => {
63
98
  #### Constructor
64
99
 
65
100
  ```typescript
66
- const feed = new NoLagFeed(token: string, options: NoLagFeedOptions);
101
+ const feed = new NoLagFeed(options: NoLagFeedOptions);
67
102
  ```
68
103
 
69
104
  **Options:**
70
105
 
71
106
  | Option | Type | Default | Description |
72
107
  |--------|------|---------|-------------|
108
+ | `client` | `NoLagSocket` | *required* | The injected core NoLag client |
73
109
  | `username` | `string` | *required* | Display name |
74
110
  | `avatar` | `string` | — | Avatar URL |
75
111
  | `metadata` | `Record<string, unknown>` | — | Custom user data |
112
+ | `appName` | `string` | `'feed'` | NoLag app for topic prefixes |
76
113
  | `channels` | `string[]` | — | Auto-join these channels on connect |
77
114
  | `maxPostCache` | `number` | `200` | Max posts kept in memory |
78
115
  | `maxCommentCache` | `number` | `100` | Max comments per post |
79
116
  | `debug` | `boolean` | `false` | Enable debug logging |
80
- | `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
81
117
 
82
118
  #### Methods
83
119
 
84
120
  | Method | Returns | Description |
85
121
  |--------|---------|-------------|
86
- | `connect()` | `Promise<void>` | Connect to NoLag |
87
- | `disconnect()` | `void` | Disconnect |
122
+ | `ready()` | `Promise<void>` | Resolves when wrapper setup completed |
123
+ | `detach()` | `void` | Release handlers and topics (terminal; never closes the socket) |
88
124
  | `joinChannel(name)` | `FeedChannel` | Join a feed channel |
89
125
  | `leaveChannel(name)` | `void` | Leave a channel |
126
+ | `getChannels()` | `FeedChannel[]` | Get all joined channels |
90
127
  | `getOnlineUsers()` | `FeedUser[]` | Get all online users |
128
+ | `updateProfile(updates)` | `void` | Update username, avatar, or metadata |
129
+
130
+ #### Properties
131
+
132
+ | Property | Type | Description |
133
+ |----------|------|-------------|
134
+ | `connected` | `boolean` | Whether currently connected |
135
+ | `client` | `NoLagSocket` | The injected core client |
136
+ | `localUser` | `FeedUser \| null` | The current user |
137
+ | `channels` | `Map<string, FeedChannel>` | All joined channels |
91
138
 
92
139
  #### Events
93
140
 
94
141
  | Event | Payload | Description |
95
142
  |-------|---------|-------------|
96
- | `connected` | — | Connected |
97
- | `disconnected` | | Disconnected |
98
- | `reconnected` | — | Reconnected |
99
- | `error` | `Error` | Error |
143
+ | `connected` | — | Connected to NoLag |
144
+ | `disconnected` | `reason` | Disconnected |
145
+ | `reconnecting` | — | Reconnect in progress |
146
+ | `reconnected` | | Reconnected after disconnect |
147
+ | `error` | `Error` | Connection or protocol error |
100
148
  | `userOnline` | `FeedUser` | User came online |
101
149
  | `userOffline` | `FeedUser` | User went offline |
102
150
 
@@ -154,7 +202,7 @@ interface FeedPost {
154
202
  commentCount: number;
155
203
  likedByMe: boolean;
156
204
  timestamp: number;
157
- status: "sending" | "sent" | "error";
205
+ status: "sending" | "sent" | "delivered";
158
206
  isReplay: boolean;
159
207
  }
160
208
 
@@ -1,6 +1,12 @@
1
1
  import type { RoomContext } from '@nolag/js-sdk';
2
2
  import { EventEmitter } from './EventEmitter';
3
3
  import type { FeedChannelEvents, FeedPost, FeedComment, FeedUser, FeedPresenceData, ResolvedFeedOptions, CreatePostOptions } from './types';
4
+ /**
5
+ * FeedChannel — a single feed channel with posts, comments, reactions, and
6
+ * presence.
7
+ *
8
+ * Created via `NoLagFeed.joinChannel(name)`. Do not instantiate directly.
9
+ */
4
10
  export declare class FeedChannel extends EventEmitter<FeedChannelEvents> {
5
11
  readonly name: string;
6
12
  private _roomContext;
@@ -11,9 +17,14 @@ export declare class FeedChannel extends EventEmitter<FeedChannelEvents> {
11
17
  private _reactionManager;
12
18
  private _comments;
13
19
  private _log;
20
+ private _isConnected;
14
21
  private _unreadCount;
15
22
  private _active;
16
- constructor(name: string, roomContext: RoomContext, localUser: FeedUser, options: ResolvedFeedOptions, log: (...args: unknown[]) => void);
23
+ private _onPostsRef;
24
+ private _onReactionsRef;
25
+ private _onCommentsRef;
26
+ /** @internal */
27
+ constructor(name: string, roomContext: RoomContext, localUser: FeedUser, options: ResolvedFeedOptions, log: (...args: unknown[]) => void, isConnected: () => boolean);
17
28
  get posts(): FeedPost[];
18
29
  get unreadCount(): number;
19
30
  get active(): boolean;
@@ -25,6 +36,7 @@ export declare class FeedChannel extends EventEmitter<FeedChannelEvents> {
25
36
  getComments(postId: string): FeedComment[];
26
37
  markRead(): void;
27
38
  getUsers(): FeedUser[];
39
+ /** @internal Subscribe to post/reaction/comment topics and attach listeners (all channels) */
28
40
  _subscribe(): void;
29
41
  _activate(): void;
30
42
  _deactivate(): void;
@@ -34,6 +46,7 @@ export declare class FeedChannel extends EventEmitter<FeedChannelEvents> {
34
46
  _handleReplayStart(count: number): void;
35
47
  _handleReplayEnd(replayed: number): void;
36
48
  _updateLocalPresence(): void;
49
+ /** @internal Unsubscribe and clean up */
37
50
  _cleanup(): void;
38
51
  private _handleIncomingPost;
39
52
  private _handleIncomingReaction;
@@ -1,35 +1,146 @@
1
+ import type { NoLagSocket } from '@nolag/js-sdk';
1
2
  import { EventEmitter } from './EventEmitter';
2
3
  import { FeedChannel } from './FeedChannel';
3
4
  import type { NoLagFeedOptions, FeedClientEvents, FeedUser } from './types';
5
+ /**
6
+ * NoLagFeed — high-level activity-feed SDK built on @nolag/js-sdk.
7
+ *
8
+ * Provides multi-channel feeds, posts, likes, comments, presence (who's
9
+ * online), replay, and user mapping — all framework-agnostic via events.
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
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { NoLag } from '@nolag/js-sdk';
18
+ * import { NoLagFeed } from '@nolag/feed';
19
+ *
20
+ * const client = NoLag(async () => (await (await fetch('/api/nolag-token')).json()).token);
21
+ * const feed = new NoLagFeed({ client, appName: 'my-feed', username: 'Alice' });
22
+ *
23
+ * feed.on('userOnline', (user) => console.log(user.username, 'is online'));
24
+ *
25
+ * await client.connect(); // the app owns the connection
26
+ * await feed.ready(); // wrapper setup done (identity, lobby, channels)
27
+ *
28
+ * const channel = feed.joinChannel('general');
29
+ * channel.on('postCreated', (post) => console.log(post.username + ':', post.content));
30
+ * channel.createPost({ content: 'Hello!' });
31
+ *
32
+ * feed.detach(); // wrapper releases its handlers and topics
33
+ * client.disconnect(); // the app closes the socket
34
+ * ```
35
+ */
4
36
  export declare class NoLagFeed extends EventEmitter<FeedClientEvents> {
5
- private _token;
6
- private _options;
7
37
  private _client;
38
+ private _options;
8
39
  private _localUser;
9
40
  private _channels;
10
41
  private _lobby;
11
42
  private _onlineUsers;
12
43
  private _actorToUserId;
13
- private _userId;
14
44
  private _activeChannel;
45
+ private _userId;
15
46
  private _log;
16
- constructor(token: string, options: NoLagFeedOptions);
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: NoLagFeedOptions);
67
+ /** Whether the underlying connection is established (connected ≠ ready) */
17
68
  get connected(): boolean;
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) */
18
72
  get localUser(): FeedUser | null;
73
+ /** All currently joined channels */
19
74
  get channels(): Map<string, FeedChannel>;
20
- connect(): Promise<void>;
21
- disconnect(): void;
75
+ /**
76
+ * Resolves once the wrapper's first setup completed (identity, lobby and
77
+ * configured channels 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 the feed again,
86
+ * construct a new instance.
87
+ */
88
+ detach(): void;
89
+ private _onConnect;
90
+ /**
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.
94
+ */
95
+ private _runSetup;
96
+ private _scheduleLobbyRefresh;
97
+ /**
98
+ * Join (activate) a feed channel. Deactivates the previous active channel.
99
+ * If the channel was pre-subscribed via the `channels` option, activates it.
100
+ * Otherwise creates, subscribes, and activates it.
101
+ */
22
102
  joinChannel(name: string): FeedChannel;
103
+ /**
104
+ * Leave a feed channel. Fully unsubscribes and removes it.
105
+ */
23
106
  leaveChannel(name: string): void;
107
+ /**
108
+ * Get all joined channels.
109
+ */
110
+ getChannels(): FeedChannel[];
111
+ /**
112
+ * Get all users currently online across all channels.
113
+ */
24
114
  getOnlineUsers(): FeedUser[];
25
- private _subscribeChannel;
115
+ /**
116
+ * Update the local user's profile info (broadcast to the active channel).
117
+ */
118
+ updateProfile(updates: {
119
+ username?: string;
120
+ avatar?: string;
121
+ metadata?: Record<string, unknown>;
122
+ }): void;
123
+ private _assertUsable;
124
+ private _subscribeChannelInternal;
125
+ /**
126
+ * On a shared client, presence events from other apps' wrappers arrive on
127
+ * the same connection-level events. Wrappers stamp their presence with a
128
+ * `__scope` (their appName); a mismatched tag means another app's data.
129
+ * Untagged presence is accepted (older peers in this same app).
130
+ */
131
+ private _foreignScope;
26
132
  private _handleRoomPresenceJoin;
27
133
  private _handleRoomPresenceLeave;
28
134
  private _handleRoomPresenceUpdate;
29
- private _setupLobby;
30
135
  private _handleLobbyJoin;
31
136
  private _handleLobbyLeave;
32
- private _hydrateOnlineUsers;
137
+ private _handleLobbyUpdate;
138
+ /**
139
+ * Reconcile the online-user map against a fresh lobby snapshot, emitting
140
+ * only the deltas (userOffline for vanished, userOnline for new). One path
141
+ * for initial hydration, reconnect restore, and the deferred refetch.
142
+ */
143
+ private _diffHydrateOnlineUsers;
33
144
  private _presenceToUser;
34
- private _restoreChannels;
145
+ private _findUserIdByActorId;
35
146
  }
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 n of s)try{n(...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._posts=[],this._ids=new Set,this._maxSize=e}add(e){if(this._ids.has(e.id))return!1;for(this._ids.add(e.id),this._posts.push(e),this._posts.length>1&&e.timestamp<this._posts[this._posts.length-2].timestamp&&this._posts.sort((e,t)=>e.timestamp-t.timestamp);this._posts.length>this._maxSize;){const e=this._posts.shift();this._ids.delete(e.id)}return!0}get(e){return this._posts.find(t=>t.id===e)}getAll(){return[...this._posts]}updateLikeCount(e,t,s){const n=this._posts.find(t=>t.id===e);n&&(n.likeCount=t,n.likedByMe=s)}incrementCommentCount(e){const t=this._posts.find(t=>t.id===e);t&&t.commentCount++}has(e){return this._ids.has(e)}get size(){return this._posts.length}clear(){this._posts=[],this._ids.clear()}}class n{constructor(){this._likes=new Map}like(e,t){this._likes.has(e)||this._likes.set(e,new Set);const s=this._likes.get(e),n=!s.has(t);return s.add(t),{postId:e,likeCount:s.size,isNew:n}}unlike(e,t){const s=this._likes.get(e);if(!s)return{postId:e,likeCount:0,wasLiked:!1};const n=s.has(t);return s.delete(t),{postId:e,likeCount:s.size,wasLiked:n}}isLikedBy(e,t){return this._likes.get(e)?.has(t)??!1}getLikeCount(e){return this._likes.get(e)?.size??0}clear(){this._likes.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 n=this._actorToUserId.get(e),i=t.userId||n||e,o={userId:i,actorTokenId:e,username:t.username,avatar:t.avatar,metadata:t.metadata,joinedAt:s||Date.now(),isLocal:!1};return this._users.set(i,o),this._actorToUserId.set(e,i),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()}}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 a="posts",h="reactions",c="comments";class l extends t{constructor(e,t,o,r,a){super(),this._comments=new Map,this._unreadCount=0,this._active=!1,this.name=e,this._roomContext=t,this._localUser=o,this._options=r,this._log=a,this._presenceManager=new i(o.actorTokenId),this._postStore=new s(r.maxPostCache),this._reactionManager=new n}get posts(){return this._postStore.getAll()}get unreadCount(){return this._unreadCount}get active(){return this._active}createPost(e){const t={id:o(),userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,content:e.content,media:e.media,data:e.data,likeCount:0,commentCount:0,likedByMe:!1,timestamp:Date.now(),status:"sending",isReplay:!1};return this._postStore.add(t),this.emit("postSent",t),this._roomContext.emit(a,{id:t.id,userId:t.userId,username:t.username,avatar:t.avatar,content:t.content,media:t.media,data:t.data,timestamp:t.timestamp},{echo:!1}),t.status="sent",t}getPosts(){return this._postStore.getAll()}likePost(e){const{likeCount:t,isNew:s}=this._reactionManager.like(e,this._localUser.userId);s&&(this._postStore.updateLikeCount(e,t,!0),this._roomContext.emit(h,{postId:e,userId:this._localUser.userId,type:"like",timestamp:Date.now()},{echo:!1}),this.emit("postLiked",{postId:e,userId:this._localUser.userId,likeCount:t}))}unlikePost(e){const{likeCount:t,wasLiked:s}=this._reactionManager.unlike(e,this._localUser.userId);s&&(this._postStore.updateLikeCount(e,t,!1),this._roomContext.emit(h,{postId:e,userId:this._localUser.userId,type:"unlike",timestamp:Date.now()},{echo:!1}),this.emit("postUnliked",{postId:e,userId:this._localUser.userId,likeCount:t}))}addComment(e,t){const s={id:o(),postId:e,userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,text:t,timestamp:Date.now(),isReplay:!1};return this._comments.has(e)||this._comments.set(e,[]),this._comments.get(e).push(s),this._postStore.incrementCommentCount(e),this.emit("commentSent",s),this._roomContext.emit(c,{id:s.id,postId:e,userId:s.userId,username:s.username,avatar:s.avatar,text:s.text,timestamp:s.timestamp},{echo:!1}),s}getComments(e){return this._comments.get(e)??[]}markRead(){0!==this._unreadCount&&(this._unreadCount=0,this.emit("unreadChanged",{channel:this.name,count:0}))}getUsers(){return this._presenceManager.getAll()}_subscribe(){this._roomContext.subscribe(a),this._roomContext.subscribe(h),this._roomContext.subscribe(c),this._roomContext.on(a,(e,t)=>this._handleIncomingPost(e,t)),this._roomContext.on(h,e=>this._handleIncomingReaction(e)),this._roomContext.on(c,(e,t)=>this._handleIncomingComment(e,t))}_activate(){this._active=!0,this._markRead(),this._setPresence(),this._roomContext.fetchPresence().then(e=>{for(const t of e)if(t.presence){const e=this._presenceManager.addFromPresence(t.actorTokenId,t.presence,t.joinedAt);e&&this.emit("subscriberJoined",e)}}).catch(()=>{})}_deactivate(){this._active=!1,this._presenceManager.clear()}_handlePresenceJoin(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&this.emit("subscriberJoined",s)}_handlePresenceLeave(e){const t=this._presenceManager.removeByActorId(e);t&&this.emit("subscriberLeft",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._roomContext.unsubscribe(a),this._roomContext.unsubscribe(h),this._roomContext.unsubscribe(c),this._roomContext.off(a),this._roomContext.off(h),this._roomContext.off(c),this._postStore.clear(),this._reactionManager.clear(),this._comments.clear(),this._presenceManager.clear(),this.removeAllListeners()}_handleIncomingPost(e,t){const s=e,n={id:s.id,userId:s.userId,username:s.username,avatar:s.avatar,content:s.content,media:s.media,data:s.data,likeCount:0,commentCount:0,likedByMe:!1,timestamp:s.timestamp,status:"delivered",isReplay:t.isReplay??!1};this._postStore.add(n)&&(this.emit("postCreated",n),this._active||n.isReplay||(this._unreadCount++,this.emit("unreadChanged",{channel:this.name,count:this._unreadCount})))}_handleIncomingReaction(e){const t=e;if("like"===t.type){const{likeCount:e}=this._reactionManager.like(t.postId,t.userId),s=this._reactionManager.isLikedBy(t.postId,this._localUser.userId);this._postStore.updateLikeCount(t.postId,e,s),this.emit("postLiked",{postId:t.postId,userId:t.userId,likeCount:e})}else if("unlike"===t.type){const{likeCount:e}=this._reactionManager.unlike(t.postId,t.userId),s=this._reactionManager.isLikedBy(t.postId,this._localUser.userId);this._postStore.updateLikeCount(t.postId,e,s),this.emit("postUnliked",{postId:t.postId,userId:t.userId,likeCount:e})}}_handleIncomingComment(e,t){const s=e,n={id:s.id,postId:s.postId,userId:s.userId,username:s.username,avatar:s.avatar,text:s.text,timestamp:s.timestamp,isReplay:t.isReplay??!1};this._comments.has(n.postId)||this._comments.set(n.postId,[]),this._comments.get(n.postId).push(n),this._postStore.incrementCommentCount(n.postId),this.emit("commentAdded",n)}_markRead(){0!==this._unreadCount&&(this._unreadCount=0,this.emit("unreadChanged",{channel:this.name,count:0}))}_setPresence(){this._roomContext.setPresence({userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,metadata:this._localUser.metadata})}}class d extends t{constructor(e,t){super(),this._client=null,this._localUser=null,this._channels=new Map,this._lobby=null,this._onlineUsers=new Map,this._actorToUserId=new Map,this._activeChannel=null,this._token=e,this._userId=o(),this._options={username:t.username,avatar:t.avatar,metadata:t.metadata,appName:t.appName??"feed",url:t.url,maxPostCache:t.maxPostCache??200,maxCommentCache:t.maxCommentCache??100,debug:t.debug??!1,reconnect:t.reconnect??!0,channels:t.channels??[]},this._log=r("NoLagFeed",this._options.debug)}get connected(){return this._client?.connected??!1}get localUser(){return this._localUser}get channels(){return this._channels}async connect(){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._channels.size>0&&(this._restoreChannels(),this.emit("reconnected"))}),this._client.on("disconnect",e=>this.emit("disconnected",e)),this._client.on("reconnect",()=>{}),this._client.on("error",e=>this.emit("error",e)),this._client.on("replay:start",e=>{for(const t of this._channels.values())t._handleReplayStart(e.count)}),this._client.on("replay:end",e=>{for(const t of this._channels.values())t._handleReplayEnd(e.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,joinedAt:Date.now(),isLocal:!0},await this._setupLobby();for(const e of this._options.channels)this._subscribeChannel(e);this.emit("connected"),setTimeout(()=>{this._lobby&&this._client?.connected&&this._lobby.fetchPresence().then(e=>this._hydrateOnlineUsers(e)).catch(()=>{})},2e3)}disconnect(){for(const e of[...this._channels.keys()])this.leaveChannel(e);this._lobby?.unsubscribe(),this._lobby=null,this._client?.disconnect(),this._client=null,this._onlineUsers.clear(),this._actorToUserId.clear(),this._localUser=null}joinChannel(e){if(!this._client||!this._localUser)throw new Error("Not connected — call connect() first");this._activeChannel&&this._activeChannel!==e&&this._channels.get(this._activeChannel)?._deactivate();let t=this._channels.get(e);return t||(t=this._subscribeChannel(e)),this._activeChannel=e,t._activate(),t}leaveChannel(e){const t=this._channels.get(e);t&&(t._cleanup(),this._channels.delete(e),this._activeChannel===e&&(this._activeChannel=null))}getOnlineUsers(){return Array.from(this._onlineUsers.values())}_subscribeChannel(e){if(!this._client||!this._localUser)throw new Error("Not connected");const t=this._client.setApp(this._options.appName).setRoom(e),s=new l(e,t,this._localUser,this._options,r(`FeedChannel:${e}`,this._options.debug));return this._channels.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 n=this._activeChannel?this._channels.get(this._activeChannel):void 0;n&&n._handlePresenceJoin(e.actorTokenId,t)}_handleRoomPresenceLeave(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=this._activeChannel?this._channels.get(this._activeChannel):void 0;t&&t._handlePresenceLeave(e.actorTokenId)}_handleRoomPresenceUpdate(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=e.presence;if(!t?.userId)return;const s=this._activeChannel?this._channels.get(this._activeChannel):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._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)}catch{}}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const n=s;if(!n.userId)return;const i=this._presenceToUser(t,n);this._actorToUserId.set(t,i.userId),this._onlineUsers.has(i.userId)||(this._onlineUsers.set(i.userId,i),this.emit("userOnline",i))}_handleLobbyLeave(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const n=s,i=n?.userId||this._actorToUserId.get(t);if(i){const e=this._onlineUsers.get(i);e&&(this._onlineUsers.delete(i),this._actorToUserId.delete(t),this.emit("userOffline",e))}}_hydrateOnlineUsers(e){for(const t of Object.keys(e))for(const s of Object.keys(e[t])){if(s===this._localUser?.actorTokenId)continue;const n=e[t][s],i=n?.presence??n;if(i?.userId){const e=this._presenceToUser(s,i);this._actorToUserId.set(s,e.userId),this._onlineUsers.has(e.userId)||(this._onlineUsers.set(e.userId,e),this.emit("userOnline",e))}}}_presenceToUser(e,t){return{userId:t.userId,actorTokenId:e,username:t.username,avatar:t.avatar,metadata:t.metadata,joinedAt:Date.now(),isLocal:!1}}_restoreChannels(){if(this._activeChannel){const e=this._channels.get(this._activeChannel);e&&e._updateLocalPresence()}this._lobby?.fetchPresence().then(e=>{this._onlineUsers.clear(),this._actorToUserId.clear(),this._hydrateOnlineUsers(e)}).catch(()=>{})}}export{t as EventEmitter,l as FeedChannel,d as NoLagFeed};
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 n of s)try{n(...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._posts=[],this._ids=new Set,this._maxSize=e}add(e){if(this._ids.has(e.id))return!1;for(this._ids.add(e.id),this._posts.push(e),this._posts.length>1&&e.timestamp<this._posts[this._posts.length-2].timestamp&&this._posts.sort((e,t)=>e.timestamp-t.timestamp);this._posts.length>this._maxSize;){const e=this._posts.shift();this._ids.delete(e.id)}return!0}get(e){return this._posts.find(t=>t.id===e)}getAll(){return[...this._posts]}updateLikeCount(e,t,s){const n=this._posts.find(t=>t.id===e);n&&(n.likeCount=t,n.likedByMe=s)}incrementCommentCount(e){const t=this._posts.find(t=>t.id===e);t&&t.commentCount++}has(e){return this._ids.has(e)}get size(){return this._posts.length}clear(){this._posts=[],this._ids.clear()}}class s{constructor(){this._likes=new Map}like(e,t){this._likes.has(e)||this._likes.set(e,new Set);const s=this._likes.get(e),n=!s.has(t);return s.add(t),{postId:e,likeCount:s.size,isNew:n}}unlike(e,t){const s=this._likes.get(e);if(!s)return{postId:e,likeCount:0,wasLiked:!1};const n=s.has(t);return s.delete(t),{postId:e,likeCount:s.size,wasLiked:n}}isLikedBy(e,t){return this._likes.get(e)?.has(t)??!1}getLikeCount(e){return this._likes.get(e)?.size??0}clear(){this._likes.clear()}}class n{constructor(e){this._users=new Map,this._actorToUserId=new Map,this._localActorId=e}addFromPresence(e,t,s){if(e===this._localActorId)return null;const n=this._actorToUserId.get(e),i=t.userId||n||e,o={userId:i,actorTokenId:e,username:t.username,avatar:t.avatar,metadata:t.metadata,joinedAt:s||Date.now(),isLocal:!1};return this._users.set(i,o),this._actorToUserId.set(e,i),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()}}function i(){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 o(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const r=new WeakMap;const a="posts",h="reactions",c="comments";class l extends e{constructor(e,i,o,r,a,h){super(),this._comments=new Map,this._unreadCount=0,this._active=!1,this._onPostsRef=null,this._onReactionsRef=null,this._onCommentsRef=null,this.name=e,this._roomContext=i,this._localUser=o,this._options=r,this._log=a,this._isConnected=h,this._presenceManager=new n(o.actorTokenId),this._postStore=new t(r.maxPostCache),this._reactionManager=new s}get posts(){return this._postStore.getAll()}get unreadCount(){return this._unreadCount}get active(){return this._active}createPost(e){const t={id:i(),userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,content:e.content,media:e.media,data:e.data,likeCount:0,commentCount:0,likedByMe:!1,timestamp:Date.now(),status:"sending",isReplay:!1};return this._postStore.add(t),this.emit("postSent",t),this._roomContext.emit(a,{id:t.id,userId:t.userId,username:t.username,avatar:t.avatar,content:t.content,media:t.media,data:t.data,timestamp:t.timestamp},{echo:!1}),t.status="sent",t}getPosts(){return this._postStore.getAll()}likePost(e){const{likeCount:t,isNew:s}=this._reactionManager.like(e,this._localUser.userId);s&&(this._postStore.updateLikeCount(e,t,!0),this._roomContext.emit(h,{postId:e,userId:this._localUser.userId,type:"like",timestamp:Date.now()},{echo:!1}),this.emit("postLiked",{postId:e,userId:this._localUser.userId,likeCount:t}))}unlikePost(e){const{likeCount:t,wasLiked:s}=this._reactionManager.unlike(e,this._localUser.userId);s&&(this._postStore.updateLikeCount(e,t,!1),this._roomContext.emit(h,{postId:e,userId:this._localUser.userId,type:"unlike",timestamp:Date.now()},{echo:!1}),this.emit("postUnliked",{postId:e,userId:this._localUser.userId,likeCount:t}))}addComment(e,t){const s={id:i(),postId:e,userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,text:t,timestamp:Date.now(),isReplay:!1};return this._comments.has(e)||this._comments.set(e,[]),this._comments.get(e).push(s),this._postStore.incrementCommentCount(e),this.emit("commentSent",s),this._roomContext.emit(c,{id:s.id,postId:e,userId:s.userId,username:s.username,avatar:s.avatar,text:s.text,timestamp:s.timestamp},{echo:!1}),s}getComments(e){return this._comments.get(e)??[]}markRead(){0!==this._unreadCount&&(this._unreadCount=0,this.emit("unreadChanged",{channel:this.name,count:0}))}getUsers(){return this._presenceManager.getAll()}_subscribe(){this._log("Channel subscribe:",this.name),this._roomContext.subscribe(a),this._roomContext.subscribe(h),this._roomContext.subscribe(c),this._onPostsRef=(e,t)=>{this._handleIncomingPost(e,t)},this._roomContext.on(a,this._onPostsRef),this._onReactionsRef=e=>{this._handleIncomingReaction(e)},this._roomContext.on(h,this._onReactionsRef),this._onCommentsRef=(e,t)=>{this._handleIncomingComment(e,t)},this._roomContext.on(c,this._onCommentsRef)}_activate(){this._active=!0,this._markRead(),this._setPresence(),this._roomContext.fetchPresence().then(e=>{for(const t of e)if(t.presence){const e=this._presenceManager.addFromPresence(t.actorTokenId,t.presence,t.joinedAt);e&&this.emit("subscriberJoined",e)}}).catch(()=>{})}_deactivate(){this._active=!1,this._presenceManager.clear()}_handlePresenceJoin(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&this.emit("subscriberJoined",s)}_handlePresenceLeave(e){const t=this._presenceManager.removeByActorId(e);t&&this.emit("subscriberLeft",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("Channel cleanup:",this.name),this._isConnected()&&(this._roomContext.unsubscribe(a),this._roomContext.unsubscribe(h),this._roomContext.unsubscribe(c)),this._onPostsRef&&this._roomContext.off(a,this._onPostsRef),this._onReactionsRef&&this._roomContext.off(h,this._onReactionsRef),this._onCommentsRef&&this._roomContext.off(c,this._onCommentsRef),this._onPostsRef=null,this._onReactionsRef=null,this._onCommentsRef=null,this._postStore.clear(),this._reactionManager.clear(),this._comments.clear(),this._presenceManager.clear(),this.removeAllListeners()}_handleIncomingPost(e,t){const s=e,n={id:s.id,userId:s.userId,username:s.username,avatar:s.avatar,content:s.content,media:s.media,data:s.data,likeCount:0,commentCount:0,likedByMe:!1,timestamp:s.timestamp,status:"delivered",isReplay:t.isReplay??!1};this._postStore.add(n)&&(this.emit("postCreated",n),this._active||n.isReplay||(this._unreadCount++,this.emit("unreadChanged",{channel:this.name,count:this._unreadCount})))}_handleIncomingReaction(e){const t=e;if("like"===t.type){const{likeCount:e}=this._reactionManager.like(t.postId,t.userId),s=this._reactionManager.isLikedBy(t.postId,this._localUser.userId);this._postStore.updateLikeCount(t.postId,e,s),this.emit("postLiked",{postId:t.postId,userId:t.userId,likeCount:e})}else if("unlike"===t.type){const{likeCount:e}=this._reactionManager.unlike(t.postId,t.userId),s=this._reactionManager.isLikedBy(t.postId,this._localUser.userId);this._postStore.updateLikeCount(t.postId,e,s),this.emit("postUnliked",{postId:t.postId,userId:t.userId,likeCount:e})}}_handleIncomingComment(e,t){const s=e,n={id:s.id,postId:s.postId,userId:s.userId,username:s.username,avatar:s.avatar,text:s.text,timestamp:s.timestamp,isReplay:t.isReplay??!1};this._comments.has(n.postId)||this._comments.set(n.postId,[]),this._comments.get(n.postId).push(n),this._postStore.incrementCommentCount(n.postId),this.emit("commentAdded",n)}_markRead(){0!==this._unreadCount&&(this._unreadCount=0,this.emit("unreadChanged",{channel:this.name,count:0}))}_setPresence(){this._roomContext.setPresence({userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,metadata:this._localUser.metadata,__scope:this._options.appName})}}class _ extends e{constructor(e){if(super(),this._localUser=null,this._channels=new Map,this._lobby=null,this._onlineUsers=new Map,this._actorToUserId=new Map,this._activeChannel=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._channels.values())e._handleReplayStart(t.count)},this._onReplayEndRef=e=>{const t=e;for(const e of this._channels.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("NoLagFeed requires an injected NoLag client: new NoLagFeed({ client, username, ... })");this._client=e.client,this._userId=i(),this._options={username:e.username,avatar:e.avatar,metadata:e.metadata,appName:e.appName??"feed",maxPostCache:e.maxPostCache??200,maxCommentCache:e.maxCommentCache??100,debug:e.debug??!1,channels:e.channels??[]},this._log=o("NoLagFeed",this._options.debug),this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPromise.catch(()=>{}),function(e,t,s){let n=r.get(e);n||(n=new Map,r.set(e,n));const i=n.get(t);i&&console.warn(`[${s}] Another wrapper (${i}) is already attached to this client for app "${t}". Use one wrapper per (client, app) — detach the other instance first.`),n.set(t,s)}(this._client,this._options.appName,"NoLagFeed"),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 channels(){return this._channels}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._channels.keys()])this._channels.get(e)._cleanup(),this._channels.delete(e);if(this._activeChannel=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,r.get(e)?.delete(t),this._isReady||this._readyReject(new Error("NoLagFeed 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,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._activeChannel&&this._channels.get(this._activeChannel)?._updateLocalPresence();else for(const e of this._options.channels)this._subscribeChannelInternal(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)}joinChannel(e){if(this._assertUsable(),this._activeChannel&&this._activeChannel!==e){const e=this._channels.get(this._activeChannel);e&&e._deactivate()}let t=this._channels.get(e);return t||(t=this._subscribeChannelInternal(e)),this._activeChannel=e,t._activate(),t}leaveChannel(e){const t=this._channels.get(e);t&&(this._log("Leaving channel:",e),t._cleanup(),this._channels.delete(e),this._activeChannel===e&&(this._activeChannel=null))}getChannels(){return Array.from(this._channels.values())}getOnlineUsers(){return Array.from(this._onlineUsers.values())}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._activeChannel)){const e=this._channels.get(this._activeChannel);e&&e._updateLocalPresence()}}_assertUsable(){if(this._detached)throw new Error("NoLagFeed has been detached — construct a new instance");if(!this._isReady||!this._localUser)throw new Error('NoLagFeed not ready — await ready() or the "connected" event')}_subscribeChannelInternal(e){this._log("Subscribing channel:",e);const t=this._client.setApp(this._options.appName).setRoom(e),s=new l(e,t,this._localUser,this._options,o(`FeedChannel:${e}`,this._options.debug),()=>this._client.connected);return this._channels.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 n=this._activeChannel?this._channels.get(this._activeChannel):void 0;n&&n._handlePresenceJoin(e.actorTokenId,t)}_handleRoomPresenceLeave(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=this._activeChannel?this._channels.get(this._activeChannel):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)}const s=this._activeChannel?this._channels.get(this._activeChannel):void 0;s&&s._handlePresenceUpdate(e.actorTokenId,t)}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const n=s;if(!n.userId||this._foreignScope(n))return;const i=this._presenceToUser(t,n);this._actorToUserId.set(t,i.userId),this._onlineUsers.has(i.userId)||(this._onlineUsers.set(i.userId,i),this.emit("userOnline",i))}_handleLobbyLeave(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const n=s;if(this._foreignScope(n))return;const i=n?.userId||this._actorToUserId.get(t)||this._findUserIdByActorId(t);if(i){const e=this._onlineUsers.get(i);e&&(this._onlineUsers.delete(i),this._actorToUserId.delete(t),this.emit("userOffline",e))}}_handleLobbyUpdate(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const n=s;if(!n.userId||this._foreignScope(n))return;const i=this._presenceToUser(t,n);this._onlineUsers.set(i.userId,i)}_diffHydrateOnlineUsers(e){const t=new Map,s=new Map;for(const n of Object.keys(e)){const i=e[n];for(const e of Object.keys(i)){if(e===this._localUser?.actorTokenId)continue;const n=i[e],o=n?.presence??n;o?.userId&&!this._foreignScope(o)&&(t.has(o.userId)||t.set(o.userId,this._presenceToUser(e,o)),s.set(e,o.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)this._onlineUsers.has(e)||(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,joinedAt:Date.now(),isLocal:!1}}_findUserIdByActorId(e){for(const t of this._onlineUsers.values())if(t.actorTokenId===e)return t.userId}}export{e as EventEmitter,l as FeedChannel,_ as NoLagFeed};
2
2
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/PostStore.ts","../src/ReactionManager.ts","../src/PresenceManager.ts","../src/utils.ts","../src/constants.ts","../src/FeedChannel.ts","../src/NoLagFeed.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["EventEmitter","constructor","this","_handlers","Map","on","event","handler","has","set","Set","get","add","off","delete","removeAllListeners","clear","emit","args","handlers","e","console","error","String","listenerCount","size","PostStore","maxSize","_posts","_ids","_maxSize","post","id","push","length","timestamp","sort","a","b","removed","shift","find","p","getAll","updateLikeCount","postId","count","likedByMe","likeCount","incrementCommentCount","commentCount","ReactionManager","_likes","like","userId","likers","isNew","unlike","wasLiked","isLikedBy","getLikeCount","PresenceManager","localActorId","_users","_actorToUserId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","existing","user","username","avatar","metadata","Date","now","isLocal","removeByActorId","getUser","getUserByActorId","undefined","Array","from","values","users","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","TOPIC_POSTS","TOPIC_REACTIONS","TOPIC_COMMENTS","FeedChannel","name","roomContext","localUser","options","super","_comments","_unreadCount","_active","_roomContext","_localUser","_options","_log","_presenceManager","_postStore","maxPostCache","_reactionManager","posts","unreadCount","active","createPost","opts","content","media","data","status","isReplay","echo","getPosts","likePost","type","unlikePost","addComment","text","comment","getComments","markRead","channel","getUsers","_subscribe","subscribe","meta","_handleIncomingPost","_handleIncomingReaction","_handleIncomingComment","_activate","_markRead","_setPresence","fetchPresence","then","actors","actor","catch","_deactivate","_handlePresenceJoin","presenceData","_handlePresenceLeave","_handlePresenceUpdate","_handleReplayStart","_handleReplayEnd","replayed","_updateLocalPresence","_cleanup","unsubscribe","raw","setPresence","NoLagFeed","token","_client","_channels","_lobby","_onlineUsers","_activeChannel","_token","_userId","appName","url","maxCommentCache","debug","reconnect","channels","connected","connect","clientOptions","NoLag","_restoreChannels","reason","ch","_handleRoomPresenceJoin","_handleRoomPresenceLeave","_handleRoomPresenceUpdate","actorId","_setupLobby","_subscribeChannel","setTimeout","s","_hydrateOnlineUsers","disconnect","keys","leaveChannel","joinChannel","Error","getOnlineUsers","setApp","setRoom","pd","_presenceToUser","room","setLobby","lh","_handleLobbyJoin","_handleLobbyLeave","state","roomId","Object"],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/PostStore.ts","../src/ReactionManager.ts","../src/PresenceManager.ts","../src/utils.ts","../src/constants.ts","../src/FeedChannel.ts","../src/NoLagFeed.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["EventEmitter","constructor","this","_handlers","Map","on","event","handler","has","set","Set","get","add","off","delete","removeAllListeners","clear","emit","args","handlers","e","console","error","String","listenerCount","size","PostStore","maxSize","_posts","_ids","_maxSize","post","id","push","length","timestamp","sort","a","b","removed","shift","find","p","getAll","updateLikeCount","postId","count","likedByMe","likeCount","incrementCommentCount","commentCount","ReactionManager","_likes","like","userId","likers","isNew","unlike","wasLiked","isLikedBy","getLikeCount","PresenceManager","localActorId","_users","_actorToUserId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","existing","user","username","avatar","metadata","Date","now","isLocal","removeByActorId","getUser","getUserByActorId","undefined","Array","from","values","users","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","wrapperRegistry","WeakMap","TOPIC_POSTS","TOPIC_REACTIONS","TOPIC_COMMENTS","FeedChannel","name","roomContext","localUser","options","isConnected","super","_comments","_unreadCount","_active","_onPostsRef","_onReactionsRef","_onCommentsRef","_roomContext","_localUser","_options","_log","_isConnected","_presenceManager","_postStore","maxPostCache","_reactionManager","posts","unreadCount","active","createPost","opts","content","media","data","status","isReplay","echo","getPosts","likePost","type","unlikePost","addComment","text","comment","getComments","markRead","channel","getUsers","_subscribe","subscribe","meta","_handleIncomingPost","_handleIncomingReaction","_handleIncomingComment","_activate","_markRead","_setPresence","fetchPresence","then","actors","actor","catch","_deactivate","_handlePresenceJoin","presenceData","_handlePresenceLeave","_handlePresenceUpdate","_handleReplayStart","_handleReplayEnd","replayed","_updateLocalPresence","_cleanup","unsubscribe","raw","setPresence","__scope","appName","NoLagFeed","_channels","_lobby","_onlineUsers","_activeChannel","_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","maxCommentCache","debug","channels","_readyPromise","Promise","resolve","reject","_readyResolve","_readyReject","wrapperName","apps","warn","registerWrapper","queueMicrotask","connected","ready","detach","clearTimeout","keys","Error","_runSetup","epoch","stale","actorId","setApp","setLobby","state","_diffHydrateOnlineUsers","err","channelName","_subscribeChannelInternal","_scheduleLobbyRefresh","setTimeout","joinChannel","_assertUsable","prev","leaveChannel","getChannels","getOnlineUsers","updateProfile","updates","activeChannel","setRoom","_foreignScope","scope","_presenceToUser","_findUserIdByActorId","fresh","freshActors","roomId","Object","roomPresence","mappedUserId"],"mappings":"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"}
@@ -5,3 +5,5 @@ export declare const TOPIC_POSTS = "posts";
5
5
  export declare const TOPIC_REACTIONS = "reactions";
6
6
  export declare const TOPIC_COMMENTS = "comments";
7
7
  export declare const LOBBY_ID = "online";
8
+ /** Delay before the post-setup lobby presence refetch (catches simultaneous joiners) */
9
+ export declare const LOBBY_REFRESH_DELAY_MS = 2000;