@nolag/feed 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +182 -0
- package/dist/EventEmitter.d.ts +10 -0
- package/dist/FeedChannel.d.ts +43 -0
- package/dist/NoLagFeed.d.ts +35 -0
- package/dist/PostStore.d.ts +42 -0
- package/dist/PresenceManager.d.ts +40 -0
- package/dist/ReactionManager.d.ts +38 -0
- package/dist/browser.d.ts +4 -0
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/index.cjs +688 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.mjs +684 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types.d.ts +162 -0
- package/dist/utils.d.ts +2 -0
- package/package.json +57 -0
package/README.md
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# @nolag/feed
|
|
2
|
+
|
|
3
|
+
Activity feeds SDK for [NoLag](https://nolag.app) — real-time posts, likes, comments, and fan-out.
|
|
4
|
+
|
|
5
|
+
## How It Works with NoLag
|
|
6
|
+
|
|
7
|
+
NoLag is a real-time messaging platform that handles WebSocket connections, message routing, persistence, and scaling. This SDK wraps the low-level [@nolag/js-sdk](https://www.npmjs.com/package/@nolag/js-sdk) and gives you a purpose-built feed API — posts with media, likes, threaded comments, and real-time updates — without managing topics or subscriptions yourself.
|
|
8
|
+
|
|
9
|
+
### Getting Your Token
|
|
10
|
+
|
|
11
|
+
1. Sign up at [nolag.app](https://nolag.app)
|
|
12
|
+
2. Create a new **project** in the portal
|
|
13
|
+
3. Choose the **Feed** blueprint when creating an app — this pre-configures the topics (`posts`, `reactions`, `comments`) and settings your feed needs
|
|
14
|
+
4. Go to the app's **Tokens** page and generate an **actor token**
|
|
15
|
+
5. Use that token when connecting with this SDK
|
|
16
|
+
|
|
17
|
+
Each token identifies a unique user (actor) in NoLag. The blueprint handles all the infrastructure setup — you just build your feed UI.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @nolag/js-sdk @nolag/feed
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { NoLagFeed } from "@nolag/feed";
|
|
29
|
+
|
|
30
|
+
const feed = new NoLagFeed("YOUR_ACTOR_TOKEN", {
|
|
31
|
+
username: "Alice",
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
await feed.connect();
|
|
35
|
+
|
|
36
|
+
const channel = feed.joinChannel("main");
|
|
37
|
+
|
|
38
|
+
// Create a post
|
|
39
|
+
channel.createPost({
|
|
40
|
+
content: "Just shipped v2.0!",
|
|
41
|
+
media: [{ type: "image", url: "https://example.com/screenshot.png" }],
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Listen for new posts
|
|
45
|
+
channel.on("postCreated", (post) => {
|
|
46
|
+
console.log(`${post.username}: ${post.content}`);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Likes and comments
|
|
50
|
+
channel.likePost(postId);
|
|
51
|
+
channel.addComment(postId, "Congrats!");
|
|
52
|
+
|
|
53
|
+
// Real-time updates
|
|
54
|
+
channel.on("postLiked", (post) => {
|
|
55
|
+
updateLikeCount(post.id, post.likeCount);
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## API Reference
|
|
60
|
+
|
|
61
|
+
### `NoLagFeed`
|
|
62
|
+
|
|
63
|
+
#### Constructor
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
const feed = new NoLagFeed(token: string, options: NoLagFeedOptions);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Options:**
|
|
70
|
+
|
|
71
|
+
| Option | Type | Default | Description |
|
|
72
|
+
|--------|------|---------|-------------|
|
|
73
|
+
| `username` | `string` | *required* | Display name |
|
|
74
|
+
| `avatar` | `string` | — | Avatar URL |
|
|
75
|
+
| `metadata` | `Record<string, unknown>` | — | Custom user data |
|
|
76
|
+
| `channels` | `string[]` | — | Auto-join these channels on connect |
|
|
77
|
+
| `maxPostCache` | `number` | `200` | Max posts kept in memory |
|
|
78
|
+
| `maxCommentCache` | `number` | `100` | Max comments per post |
|
|
79
|
+
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
80
|
+
| `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
|
|
81
|
+
|
|
82
|
+
#### Methods
|
|
83
|
+
|
|
84
|
+
| Method | Returns | Description |
|
|
85
|
+
|--------|---------|-------------|
|
|
86
|
+
| `connect()` | `Promise<void>` | Connect to NoLag |
|
|
87
|
+
| `disconnect()` | `void` | Disconnect |
|
|
88
|
+
| `joinChannel(name)` | `FeedChannel` | Join a feed channel |
|
|
89
|
+
| `leaveChannel(name)` | `void` | Leave a channel |
|
|
90
|
+
| `getOnlineUsers()` | `FeedUser[]` | Get all online users |
|
|
91
|
+
|
|
92
|
+
#### Events
|
|
93
|
+
|
|
94
|
+
| Event | Payload | Description |
|
|
95
|
+
|-------|---------|-------------|
|
|
96
|
+
| `connected` | — | Connected |
|
|
97
|
+
| `disconnected` | — | Disconnected |
|
|
98
|
+
| `reconnected` | — | Reconnected |
|
|
99
|
+
| `error` | `Error` | Error |
|
|
100
|
+
| `userOnline` | `FeedUser` | User came online |
|
|
101
|
+
| `userOffline` | `FeedUser` | User went offline |
|
|
102
|
+
|
|
103
|
+
### `FeedChannel`
|
|
104
|
+
|
|
105
|
+
#### Methods
|
|
106
|
+
|
|
107
|
+
| Method | Returns | Description |
|
|
108
|
+
|--------|---------|-------------|
|
|
109
|
+
| `createPost(options)` | `FeedPost` | Create a post |
|
|
110
|
+
| `getPosts()` | `FeedPost[]` | Get cached posts |
|
|
111
|
+
| `likePost(postId)` | `void` | Like a post |
|
|
112
|
+
| `unlikePost(postId)` | `void` | Unlike a post |
|
|
113
|
+
| `addComment(postId, text)` | `FeedComment` | Add a comment |
|
|
114
|
+
| `getComments(postId)` | `FeedComment[]` | Get comments for a post |
|
|
115
|
+
| `markRead()` | `void` | Mark all posts as read |
|
|
116
|
+
| `getUsers()` | `FeedUser[]` | Get users in this channel |
|
|
117
|
+
|
|
118
|
+
#### Properties
|
|
119
|
+
|
|
120
|
+
| Property | Type | Description |
|
|
121
|
+
|----------|------|-------------|
|
|
122
|
+
| `name` | `string` | Channel name |
|
|
123
|
+
| `posts` | `FeedPost[]` | Cached posts |
|
|
124
|
+
| `unreadCount` | `number` | Unread post count |
|
|
125
|
+
| `active` | `boolean` | Whether currently joined |
|
|
126
|
+
|
|
127
|
+
#### Events
|
|
128
|
+
|
|
129
|
+
| Event | Payload | Description |
|
|
130
|
+
|-------|---------|-------------|
|
|
131
|
+
| `postCreated` | `FeedPost` | New post |
|
|
132
|
+
| `postSent` | `FeedPost` | Your post confirmed |
|
|
133
|
+
| `postLiked` | `FeedPost` | Post was liked |
|
|
134
|
+
| `postUnliked` | `FeedPost` | Post was unliked |
|
|
135
|
+
| `commentAdded` | `FeedComment` | New comment |
|
|
136
|
+
| `commentSent` | `FeedComment` | Your comment confirmed |
|
|
137
|
+
| `subscriberJoined` | `FeedUser` | User joined channel |
|
|
138
|
+
| `subscriberLeft` | `FeedUser` | User left channel |
|
|
139
|
+
| `replayStart` / `replayEnd` | — | Post replay |
|
|
140
|
+
| `unreadChanged` | `number` | Unread count changed |
|
|
141
|
+
|
|
142
|
+
## Types
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
interface FeedPost {
|
|
146
|
+
id: string;
|
|
147
|
+
userId: string;
|
|
148
|
+
username: string;
|
|
149
|
+
avatar?: string;
|
|
150
|
+
content: string;
|
|
151
|
+
media?: MediaAttachment[];
|
|
152
|
+
data?: Record<string, unknown>;
|
|
153
|
+
likeCount: number;
|
|
154
|
+
commentCount: number;
|
|
155
|
+
likedByMe: boolean;
|
|
156
|
+
timestamp: number;
|
|
157
|
+
status: "sending" | "sent" | "error";
|
|
158
|
+
isReplay: boolean;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
interface FeedComment {
|
|
162
|
+
id: string;
|
|
163
|
+
postId: string;
|
|
164
|
+
userId: string;
|
|
165
|
+
username: string;
|
|
166
|
+
avatar?: string;
|
|
167
|
+
text: string;
|
|
168
|
+
timestamp: number;
|
|
169
|
+
isReplay: boolean;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
interface MediaAttachment {
|
|
173
|
+
type: "image" | "video" | "link";
|
|
174
|
+
url: string;
|
|
175
|
+
thumbnail?: string;
|
|
176
|
+
title?: string;
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## License
|
|
181
|
+
|
|
182
|
+
MIT
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class EventEmitter<EventMap extends {
|
|
2
|
+
[K in keyof EventMap]: unknown[];
|
|
3
|
+
}> {
|
|
4
|
+
private _handlers;
|
|
5
|
+
on<K extends keyof EventMap>(event: K, handler: (...args: EventMap[K]) => void): this;
|
|
6
|
+
off<K extends keyof EventMap>(event: K, handler?: (...args: EventMap[K]) => void): this;
|
|
7
|
+
removeAllListeners(): this;
|
|
8
|
+
protected emit<K extends keyof EventMap>(event: K, ...args: EventMap[K]): void;
|
|
9
|
+
listenerCount<K extends keyof EventMap>(event: K): number;
|
|
10
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { RoomContext } from '@nolag/js-sdk';
|
|
2
|
+
import { EventEmitter } from './EventEmitter';
|
|
3
|
+
import type { FeedChannelEvents, FeedPost, FeedComment, FeedUser, FeedPresenceData, ResolvedFeedOptions, CreatePostOptions } from './types';
|
|
4
|
+
export declare class FeedChannel extends EventEmitter<FeedChannelEvents> {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
private _roomContext;
|
|
7
|
+
private _localUser;
|
|
8
|
+
private _options;
|
|
9
|
+
private _presenceManager;
|
|
10
|
+
private _postStore;
|
|
11
|
+
private _reactionManager;
|
|
12
|
+
private _comments;
|
|
13
|
+
private _log;
|
|
14
|
+
private _unreadCount;
|
|
15
|
+
private _active;
|
|
16
|
+
constructor(name: string, roomContext: RoomContext, localUser: FeedUser, options: ResolvedFeedOptions, log: (...args: unknown[]) => void);
|
|
17
|
+
get posts(): FeedPost[];
|
|
18
|
+
get unreadCount(): number;
|
|
19
|
+
get active(): boolean;
|
|
20
|
+
createPost(opts: CreatePostOptions): FeedPost;
|
|
21
|
+
getPosts(): FeedPost[];
|
|
22
|
+
likePost(postId: string): void;
|
|
23
|
+
unlikePost(postId: string): void;
|
|
24
|
+
addComment(postId: string, text: string): FeedComment;
|
|
25
|
+
getComments(postId: string): FeedComment[];
|
|
26
|
+
markRead(): void;
|
|
27
|
+
getUsers(): FeedUser[];
|
|
28
|
+
_subscribe(): void;
|
|
29
|
+
_activate(): void;
|
|
30
|
+
_deactivate(): void;
|
|
31
|
+
_handlePresenceJoin(actorTokenId: string, presenceData: FeedPresenceData): void;
|
|
32
|
+
_handlePresenceLeave(actorTokenId: string): void;
|
|
33
|
+
_handlePresenceUpdate(actorTokenId: string, presenceData: FeedPresenceData): void;
|
|
34
|
+
_handleReplayStart(count: number): void;
|
|
35
|
+
_handleReplayEnd(replayed: number): void;
|
|
36
|
+
_updateLocalPresence(): void;
|
|
37
|
+
_cleanup(): void;
|
|
38
|
+
private _handleIncomingPost;
|
|
39
|
+
private _handleIncomingReaction;
|
|
40
|
+
private _handleIncomingComment;
|
|
41
|
+
private _markRead;
|
|
42
|
+
private _setPresence;
|
|
43
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EventEmitter } from './EventEmitter';
|
|
2
|
+
import { FeedChannel } from './FeedChannel';
|
|
3
|
+
import type { NoLagFeedOptions, FeedClientEvents, FeedUser } from './types';
|
|
4
|
+
export declare class NoLagFeed extends EventEmitter<FeedClientEvents> {
|
|
5
|
+
private _token;
|
|
6
|
+
private _options;
|
|
7
|
+
private _client;
|
|
8
|
+
private _localUser;
|
|
9
|
+
private _channels;
|
|
10
|
+
private _lobby;
|
|
11
|
+
private _onlineUsers;
|
|
12
|
+
private _actorToUserId;
|
|
13
|
+
private _userId;
|
|
14
|
+
private _activeChannel;
|
|
15
|
+
private _log;
|
|
16
|
+
constructor(token: string, options: NoLagFeedOptions);
|
|
17
|
+
get connected(): boolean;
|
|
18
|
+
get localUser(): FeedUser | null;
|
|
19
|
+
get channels(): Map<string, FeedChannel>;
|
|
20
|
+
connect(): Promise<void>;
|
|
21
|
+
disconnect(): void;
|
|
22
|
+
joinChannel(name: string): FeedChannel;
|
|
23
|
+
leaveChannel(name: string): void;
|
|
24
|
+
getOnlineUsers(): FeedUser[];
|
|
25
|
+
private _subscribeChannel;
|
|
26
|
+
private _handleRoomPresenceJoin;
|
|
27
|
+
private _handleRoomPresenceLeave;
|
|
28
|
+
private _handleRoomPresenceUpdate;
|
|
29
|
+
private _setupLobby;
|
|
30
|
+
private _handleLobbyJoin;
|
|
31
|
+
private _handleLobbyLeave;
|
|
32
|
+
private _hydrateOnlineUsers;
|
|
33
|
+
private _presenceToUser;
|
|
34
|
+
private _restoreChannels;
|
|
35
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { FeedPost } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Bounded, deduplicated post cache ordered by timestamp.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PostStore {
|
|
6
|
+
private _posts;
|
|
7
|
+
private _ids;
|
|
8
|
+
private _maxSize;
|
|
9
|
+
constructor(maxSize: number);
|
|
10
|
+
/**
|
|
11
|
+
* Add a post. Returns true if the post was new (not a duplicate).
|
|
12
|
+
*/
|
|
13
|
+
add(post: FeedPost): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Get a post by ID.
|
|
16
|
+
*/
|
|
17
|
+
get(id: string): FeedPost | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Get all posts in timestamp order (oldest first).
|
|
20
|
+
*/
|
|
21
|
+
getAll(): FeedPost[];
|
|
22
|
+
/**
|
|
23
|
+
* Update the like count (and likedByMe flag) for a post in-place.
|
|
24
|
+
*/
|
|
25
|
+
updateLikeCount(postId: string, count: number, likedByMe: boolean): void;
|
|
26
|
+
/**
|
|
27
|
+
* Increment the comment count for a post in-place.
|
|
28
|
+
*/
|
|
29
|
+
incrementCommentCount(postId: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a post ID exists.
|
|
32
|
+
*/
|
|
33
|
+
has(id: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get post count.
|
|
36
|
+
*/
|
|
37
|
+
get size(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Clear all posts.
|
|
40
|
+
*/
|
|
41
|
+
clear(): void;
|
|
42
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { FeedUser, FeedPresenceData } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Maps actorTokenId <-> FeedUser, filtering self.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PresenceManager {
|
|
6
|
+
private _users;
|
|
7
|
+
private _actorToUserId;
|
|
8
|
+
private _localActorId;
|
|
9
|
+
constructor(localActorId: string);
|
|
10
|
+
/**
|
|
11
|
+
* Add or update a user from presence data.
|
|
12
|
+
* Returns the FeedUser if it is a remote user, null if it is self.
|
|
13
|
+
*/
|
|
14
|
+
addFromPresence(actorTokenId: string, presence: FeedPresenceData, joinedAt?: number): FeedUser | null;
|
|
15
|
+
/**
|
|
16
|
+
* Remove a user by actorTokenId.
|
|
17
|
+
* Returns the removed user, or null if not found / is self.
|
|
18
|
+
*/
|
|
19
|
+
removeByActorId(actorTokenId: string): FeedUser | null;
|
|
20
|
+
/**
|
|
21
|
+
* Get a user by userId.
|
|
22
|
+
*/
|
|
23
|
+
getUser(userId: string): FeedUser | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Get a user by actorTokenId.
|
|
26
|
+
*/
|
|
27
|
+
getUserByActorId(actorTokenId: string): FeedUser | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Get all remote users.
|
|
30
|
+
*/
|
|
31
|
+
getAll(): FeedUser[];
|
|
32
|
+
/**
|
|
33
|
+
* Get the users Map (readonly view).
|
|
34
|
+
*/
|
|
35
|
+
get users(): Map<string, FeedUser>;
|
|
36
|
+
/**
|
|
37
|
+
* Clear all tracked users.
|
|
38
|
+
*/
|
|
39
|
+
clear(): void;
|
|
40
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks like/unlike state per post with per-user deduplication.
|
|
3
|
+
*
|
|
4
|
+
* Internal: Map<postId, Set<userId>>
|
|
5
|
+
*/
|
|
6
|
+
export declare class ReactionManager {
|
|
7
|
+
private _likes;
|
|
8
|
+
/**
|
|
9
|
+
* Record a like from userId on postId.
|
|
10
|
+
* Returns the updated likeCount and whether this was a new like.
|
|
11
|
+
*/
|
|
12
|
+
like(postId: string, userId: string): {
|
|
13
|
+
postId: string;
|
|
14
|
+
likeCount: number;
|
|
15
|
+
isNew: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Record an unlike from userId on postId.
|
|
19
|
+
* Returns the updated likeCount and whether the like was removed.
|
|
20
|
+
*/
|
|
21
|
+
unlike(postId: string, userId: string): {
|
|
22
|
+
postId: string;
|
|
23
|
+
likeCount: number;
|
|
24
|
+
wasLiked: boolean;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Check if a userId has liked a postId.
|
|
28
|
+
*/
|
|
29
|
+
isLikedBy(postId: string, userId: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get the total like count for a post.
|
|
32
|
+
*/
|
|
33
|
+
getLikeCount(postId: string): number;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all reaction state.
|
|
36
|
+
*/
|
|
37
|
+
clear(): void;
|
|
38
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { NoLagFeed } from './NoLagFeed';
|
|
2
|
+
export { FeedChannel } from './FeedChannel';
|
|
3
|
+
export { EventEmitter } from './EventEmitter';
|
|
4
|
+
export type { NoLagFeedOptions, FeedUser, FeedPost, CreatePostOptions, FeedComment, FeedReactionType, FeedReaction, MediaType, MediaAttachment, FeedClientEvents, FeedChannelEvents, FeedPresenceData, } from './types';
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{NoLag as e}from"@nolag/js-sdk";class t{constructor(){this._handlers=new Map}on(e,t){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t),this}off(e,t){return t?this._handlers.get(e)?.delete(t):this._handlers.delete(e),this}removeAllListeners(){return this._handlers.clear(),this}emit(e,...t){const s=this._handlers.get(e);if(s)for(const 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};
|
|
2
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const DEFAULT_APP_NAME = "feed";
|
|
2
|
+
export declare const DEFAULT_MAX_POST_CACHE = 200;
|
|
3
|
+
export declare const DEFAULT_MAX_COMMENT_CACHE = 100;
|
|
4
|
+
export declare const TOPIC_POSTS = "posts";
|
|
5
|
+
export declare const TOPIC_REACTIONS = "reactions";
|
|
6
|
+
export declare const TOPIC_COMMENTS = "comments";
|
|
7
|
+
export declare const LOBBY_ID = "online";
|