@nolag/collab 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,15 +24,23 @@ npm install @nolag/js-sdk @nolag/collab
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 (collab, chat, sync, ...) 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 { NoLagCollab } from "@nolag/collab";
29
34
 
30
- const collab = new NoLagCollab("YOUR_ACTOR_TOKEN", {
31
- username: "Alice",
32
- color: "#FF6B6B",
33
- });
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 collab = new NoLagCollab({ client, username: "Alice", color: "#FF6B6B" });
34
39
 
35
- await collab.connect();
40
+ collab.on("userOnline", (user) => console.log(user.username, "is online"));
41
+
42
+ await client.connect(); // the app owns the connection
43
+ await collab.ready(); // wrapper setup done (identity, presence, documents)
36
44
 
37
45
  const doc = collab.joinDocument("readme.md");
38
46
 
@@ -49,23 +57,49 @@ doc.on("operation", (op) => {
49
57
  applyOperation(op);
50
58
  });
51
59
 
52
- // Live cursors
60
+ // Live cursors (throttled by cursorThrottle)
53
61
  doc.updateCursor({ line: 10, column: 5, path: "/content" });
54
62
 
55
63
  doc.on("cursorMoved", (cursor) => {
56
64
  renderCursor(cursor.userId, cursor.line, cursor.column, cursor.color);
57
65
  });
58
66
 
59
- // User awareness
60
- doc.on("awarenessChanged", (users) => {
61
- updatePresenceList(users);
67
+ // User awareness (idle detection, join/leave)
68
+ doc.on("awarenessChanged", ({ userId, status }) => {
69
+ updatePresenceStatus(userId, status);
62
70
  });
63
71
 
64
72
  doc.on("userJoined", (user) => {
65
73
  console.log(`${user.username} started editing`);
66
74
  });
75
+
76
+ // Teardown: the wrapper releases its handlers and topics; the app closes
77
+ // the socket (never the other way around).
78
+ collab.detach();
79
+ client.disconnect();
67
80
  ```
68
81
 
82
+ ## Lifecycle
83
+
84
+ - **Construction = attach.** The wrapper wires its handlers onto the injected
85
+ client immediately. If the client is already connected, setup runs on the
86
+ next microtask; otherwise it runs when the client's `connect` event fires.
87
+ - **`ready()`** resolves once the first setup completed (identity, the online
88
+ lobby, and any configured documents). Auth failures surface via your own
89
+ `await client.connect()`, not via `ready()`.
90
+ - **Reconnects are automatic.** The wrapper re-applies document presence and
91
+ reconciles the online-user list, emitting only real deltas. It emits
92
+ `reconnecting` when a reconnect attempt starts and `reconnected` once setup
93
+ completes again.
94
+ - **`detach()`** removes exactly this wrapper's handlers and topics (including
95
+ cursor-throttle and per-user idle timers) and never touches the socket. It
96
+ is terminal: construct a new instance to re-attach. Detach while the client
97
+ is still connected so server-side unsubscribes go through. In frameworks,
98
+ call it from your dispose hook (`onUnmounted`, HMR dispose).
99
+ - **One wrapper per (client, app).** Sharing a client across wrappers of
100
+ DIFFERENT apps is the intended pattern; two wrappers on the same app would
101
+ collide on topics and presence (the SDK warns if you do this).
102
+
69
103
  ## API Reference
70
104
 
71
105
  ### `NoLagCollab`
@@ -73,43 +107,54 @@ doc.on("userJoined", (user) => {
73
107
  #### Constructor
74
108
 
75
109
  ```typescript
76
- const collab = new NoLagCollab(token: string, options: NoLagCollabOptions);
110
+ const collab = new NoLagCollab(options: NoLagCollabOptions);
77
111
  ```
78
112
 
79
113
  **Options:**
80
114
 
81
115
  | Option | Type | Default | Description |
82
116
  |--------|------|---------|-------------|
117
+ | `client` | `NoLagSocket` | *required* | The injected core NoLag client |
83
118
  | `username` | `string` | *required* | Display name |
84
119
  | `avatar` | `string` | — | Avatar URL |
85
120
  | `color` | `string` | — | Cursor/highlight colour |
86
121
  | `metadata` | `Record<string, unknown>` | — | Custom data |
122
+ | `appName` | `string` | `'collab'` | NoLag app for topic prefixes |
87
123
  | `documents` | `string[]` | — | Auto-join these documents on connect |
88
124
  | `maxOperationCache` | `number` | `1000` | Max operations kept in memory |
89
125
  | `idleTimeout` | `number` | `60000` | Ms before user is marked idle |
90
126
  | `cursorThrottle` | `number` | `50` | Ms between cursor updates |
91
- | `debug` | `boolean` | `false` | Enable debug logging |
92
- | `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
127
+ | `debug` | `boolean` | `false` | Enable wrapper debug logging |
93
128
 
94
129
  #### Methods
95
130
 
96
131
  | Method | Returns | Description |
97
132
  |--------|---------|-------------|
98
- | `connect()` | `Promise<void>` | Connect to NoLag |
99
- | `disconnect()` | `void` | Disconnect |
133
+ | `ready()` | `Promise<void>` | Resolves when wrapper setup completed |
134
+ | `detach()` | `void` | Release handlers and topics (terminal; never closes the socket) |
100
135
  | `joinDocument(name)` | `CollabDocument` | Join a document |
101
136
  | `leaveDocument(name)` | `void` | Leave a document |
102
137
  | `getDocuments()` | `CollabDocument[]` | Get all joined documents |
103
138
  | `getOnlineUsers()` | `CollabUser[]` | Get online users |
104
139
 
140
+ #### Properties
141
+
142
+ | Property | Type | Description |
143
+ |----------|------|-------------|
144
+ | `connected` | `boolean` | Whether currently connected |
145
+ | `client` | `NoLagSocket` | The injected core client |
146
+ | `localUser` | `CollabUser \| null` | The local user (after ready) |
147
+ | `documents` | `Map<string, CollabDocument>` | All joined documents |
148
+
105
149
  #### Events
106
150
 
107
151
  | Event | Payload | Description |
108
152
  |-------|---------|-------------|
109
- | `connected` | — | Connected |
110
- | `disconnected` | | Disconnected |
111
- | `reconnected` | — | Reconnected |
112
- | `error` | `Error` | Error |
153
+ | `connected` | — | First setup completed |
154
+ | `disconnected` | `reason` | Disconnected |
155
+ | `reconnecting` | — | Reconnect attempt started |
156
+ | `reconnected` | | Reconnected after disconnect |
157
+ | `error` | `Error` | Connection or protocol error |
113
158
  | `userOnline` | `CollabUser` | User came online |
114
159
  | `userOffline` | `CollabUser` | User went offline |
115
160
 
@@ -20,11 +20,14 @@ export declare class CollabDocument extends EventEmitter<CollabDocumentEvents> {
20
20
  private _operationStore;
21
21
  private _awarenessManager;
22
22
  private _log;
23
+ private _isConnected;
23
24
  /** Throttle state for cursor updates */
24
25
  private _cursorThrottleTimer;
25
26
  private _pendingCursorUpdate;
27
+ private _onOperationsRef;
28
+ private _onCursorsRef;
26
29
  /** @internal */
27
- constructor(name: string, roomContext: RoomContext, localUser: CollabUser, options: ResolvedCollabOptions, log: (...args: unknown[]) => void);
30
+ constructor(name: string, roomContext: RoomContext, localUser: CollabUser, options: ResolvedCollabOptions, log: (...args: unknown[]) => void, isConnected: () => boolean);
28
31
  /** All remote users currently in this document */
29
32
  get users(): Map<string, CollabUser>;
30
33
  /**
@@ -1,3 +1,4 @@
1
+ import type { NoLagSocket } from '@nolag/js-sdk';
1
2
  import { EventEmitter } from './EventEmitter';
2
3
  import { CollabDocument } from './CollabDocument';
3
4
  import type { NoLagCollabOptions, CollabClientEvents, CollabUser } from './types';
@@ -7,26 +8,34 @@ import type { NoLagCollabOptions, CollabClientEvents, CollabUser } from './types
7
8
  * Provides document-scoped operations, cursor broadcasting, and user awareness
8
9
  * (idle detection, status tracking) — all framework-agnostic via events.
9
10
  *
11
+ * The wrapper NEVER manages the connection. The app owns one core NoLag
12
+ * client (shared by any number of wrappers on distinct apps) and the
13
+ * wrapper attaches to it at construction and releases it via `detach()`.
14
+ *
10
15
  * @example
11
16
  * ```typescript
17
+ * import { NoLag } from '@nolag/js-sdk';
12
18
  * import { NoLagCollab } from '@nolag/collab';
13
19
  *
14
- * const collab = new NoLagCollab(token, { username: 'Alice', debug: true });
20
+ * const client = NoLag(async () => (await (await fetch('/api/nolag-token')).json()).token);
21
+ * const collab = new NoLagCollab({ client, appName: 'my-collab', username: 'Alice' });
15
22
  *
16
- * collab.on('connected', () => console.log('Connected!'));
17
23
  * collab.on('userOnline', (user) => console.log(user.username, 'is online'));
18
24
  *
19
- * await collab.connect();
25
+ * await client.connect(); // the app owns the connection
26
+ * await collab.ready(); // wrapper setup done (identity, lobby, documents)
20
27
  *
21
28
  * const doc = collab.joinDocument('my-doc');
22
29
  * doc.on('operation', (op) => applyOp(op));
23
30
  * doc.sendOperation('insert', { position: 0, content: 'Hello' });
31
+ *
32
+ * collab.detach(); // wrapper releases its handlers and topics
33
+ * client.disconnect(); // the app closes the socket
24
34
  * ```
25
35
  */
26
36
  export declare class NoLagCollab extends EventEmitter<CollabClientEvents> {
27
- private _token;
28
- private _options;
29
37
  private _client;
38
+ private _options;
30
39
  private _localUser;
31
40
  private _documents;
32
41
  private _lobby;
@@ -34,21 +43,54 @@ export declare class NoLagCollab extends EventEmitter<CollabClientEvents> {
34
43
  private _actorToUserId;
35
44
  private _userId;
36
45
  private _log;
37
- constructor(token: string, options: NoLagCollabOptions);
38
- /** Whether the underlying connection is established */
46
+ private _epoch;
47
+ private _detached;
48
+ private _isReady;
49
+ private _readyResolve;
50
+ private _readyReject;
51
+ private _readyPromise;
52
+ private _lobbyRefreshTimer;
53
+ private _onConnectRef;
54
+ private _onDisconnectRef;
55
+ private _onReconnectRef;
56
+ private _onErrorRef;
57
+ private _onPresenceJoinRef;
58
+ private _onPresenceLeaveRef;
59
+ private _onPresenceUpdateRef;
60
+ private _onLobbyJoinRef;
61
+ private _onLobbyLeaveRef;
62
+ private _onLobbyUpdateRef;
63
+ constructor(options: NoLagCollabOptions);
64
+ /** Whether the underlying connection is established (connected ≠ ready) */
39
65
  get connected(): boolean;
40
- /** The local user's info (available after connect) */
66
+ /** The injected core client (owned by the app, not the wrapper) */
67
+ get client(): NoLagSocket;
68
+ /** The local user's info (available after ready) */
41
69
  get localUser(): CollabUser | null;
42
70
  /** All currently joined documents */
43
71
  get documents(): Map<string, CollabDocument>;
44
72
  /**
45
- * Connect to NoLag and set up global presence.
73
+ * Resolves once the wrapper's first setup completed (identity, lobby and
74
+ * configured documents ready — equivalently, once 'connected' has fired).
75
+ * Rejects only if detach() is called before that. Client auth failures
76
+ * surface via the app's own `await client.connect()`, not here.
77
+ */
78
+ ready(): Promise<void>;
79
+ /**
80
+ * Detach from the client: remove every handler this wrapper added,
81
+ * unsubscribe its topics and lobby (when connected), clear state.
82
+ * Terminal and idempotent; never touches the socket. To use collab again,
83
+ * construct a new instance.
46
84
  */
47
- connect(): Promise<void>;
85
+ detach(): void;
86
+ private _onConnect;
48
87
  /**
49
- * Disconnect from NoLag and clean up all documents.
88
+ * One setup pass per connection epoch. Serves both initial setup (epoch 1)
89
+ * and reconnect restore (epoch > 1). Aborts silently whenever a newer
90
+ * epoch started or the wrapper detached — checked after every await.
50
91
  */
51
- disconnect(): void;
92
+ private _runSetup;
93
+ private _scheduleLobbyRefresh;
52
94
  /**
53
95
  * Join a collaborative document. Creates, subscribes, and activates it.
54
96
  * Returns an existing document if already joined.
@@ -66,16 +108,27 @@ export declare class NoLagCollab extends EventEmitter<CollabClientEvents> {
66
108
  * Get all users currently online across all documents.
67
109
  */
68
110
  getOnlineUsers(): CollabUser[];
69
- private _subscribeDocument;
111
+ private _assertUsable;
112
+ private _subscribeDocumentInternal;
113
+ /**
114
+ * On a shared client, presence events from other apps' wrappers arrive on
115
+ * the same connection-level events. Wrappers stamp their presence with a
116
+ * `__scope` (their appName); a mismatched tag means another app's data.
117
+ * Untagged presence is accepted (older peers in this same app).
118
+ */
119
+ private _foreignScope;
70
120
  private _handleRoomPresenceJoin;
71
121
  private _handleRoomPresenceLeave;
72
122
  private _handleRoomPresenceUpdate;
73
- private _setupLobby;
74
123
  private _handleLobbyJoin;
75
124
  private _handleLobbyLeave;
76
125
  private _handleLobbyUpdate;
77
- private _hydrateOnlineUsers;
126
+ /**
127
+ * Reconcile the online-user map against a fresh lobby snapshot, emitting
128
+ * only the deltas (userOffline for vanished, userOnline for new). One path
129
+ * for initial hydration, reconnect restore, and the deferred refetch.
130
+ */
131
+ private _diffHydrateOnlineUsers;
78
132
  private _presenceToUser;
79
133
  private _findUserIdByActorId;
80
- private _restoreDocuments;
81
134
  }
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 r of s)try{r(...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._users=new Map,this._actorToUserId=new Map,this._localActorId=e}addFromPresence(e,t,s){if(e===this._localActorId)return null;const r=this._actorToUserId.get(e),o=t.userId||r||e,n={userId:o,actorTokenId:e,username:t.username,avatar:t.avatar,color:t.color,status:t.status??"active",metadata:t.metadata,joinedAt:s??Date.now(),isLocal:!1};return this._users.set(o,n),this._actorToUserId.set(e,o),n}removeByActorId(e){if(e===this._localActorId)return null;const t=this._actorToUserId.get(e);if(!t)return null;const s=this._users.get(t)??null;return this._users.delete(t),this._actorToUserId.delete(e),s}updateStatus(e,t){const s=this._actorToUserId.get(e);if(!s)return null;const r=this._users.get(s);if(!r)return null;const o={...r,status:t};return this._users.set(s,o),o}getUser(e){return this._users.get(e)}getUserByActorId(e){const t=this._actorToUserId.get(e);return t?this._users.get(t):void 0}getAll(){return Array.from(this._users.values())}get users(){return this._users}clear(){this._users.clear(),this._actorToUserId.clear()}}class r{constructor(e){this._ops=[],this._ids=new Set,this._maxSize=e}add(e){if(this._ids.has(e.id))return!1;for(this._ids.add(e.id),this._ops.push(e),this._ops.sort((e,t)=>e.timestamp-t.timestamp);this._ops.length>this._maxSize;){const e=this._ops.shift();e&&this._ids.delete(e.id)}return!0}getAll(){return[...this._ops]}getByUser(e){return this._ops.filter(t=>t.userId===e)}has(e){return this._ids.has(e)}get size(){return this._ops.length}clear(){this._ops=[],this._ids.clear()}}class o{constructor(e){this._cursors=new Map,this._statuses=new Map,this._idleTimers=new Map,this._localUserId=e}updateCursor(e,t){if(this._cursors.set(e,t),this._idleTimers.has(e)){const t=this._idleTimers.get(e);clearTimeout(t),this._idleTimers.delete(e)}}getCursor(e){return this._cursors.get(e)}getCursors(){return Array.from(this._cursors.values()).filter(e=>e.userId!==this._localUserId)}setStatus(e,t){this._statuses.set(e,t)}getStatus(e){return this._statuses.get(e)??"active"}startIdleTracking(e,t,s){this.stopIdleTracking(e);const r=setTimeout(()=>{this._idleTimers.delete(e),this._statuses.set(e,"idle"),s()},t);this._idleTimers.set(e,r)}stopIdleTracking(e){const t=this._idleTimers.get(e);void 0!==t&&(clearTimeout(t),this._idleTimers.delete(e))}removeCursor(e){this._cursors.delete(e),this._statuses.delete(e),this.stopIdleTracking(e)}dispose(){for(const e of this._idleTimers.values())clearTimeout(e);this._idleTimers.clear(),this._cursors.clear(),this._statuses.clear()}}function n(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"xxxx-xxxx-xxxx-xxxx".replace(/x/g,()=>Math.floor(16*Math.random()).toString(16))}function i(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const a="operations",c="_cursors";class h extends t{constructor(e,t,n,i,a){super(),this._cursorThrottleTimer=null,this._pendingCursorUpdate=null,this.name=e,this._roomContext=t,this._localUser=n,this._options=i,this._log=a,this._presenceManager=new s(n.actorTokenId),this._operationStore=new r(i.maxOperationCache),this._awarenessManager=new o(n.userId)}get users(){return this._presenceManager.users}sendOperation(e,t={}){const s={id:n(),type:e,path:t.path,position:t.position,length:t.length,content:t.content,data:t.data,userId:this._localUser.userId,username:this._localUser.username,timestamp:Date.now(),isReplay:!1};return this._log("Sending operation:",e,s.id),this._operationStore.add(s),this._roomContext.emit(a,s,{echo:!1}),s}getOperations(){return this._operationStore.getAll()}updateCursor(e){this._pendingCursorUpdate=e,null===this._cursorThrottleTimer&&(this._flushCursorUpdate(),this._cursorThrottleTimer=setTimeout(()=>{this._cursorThrottleTimer=null,this._pendingCursorUpdate&&this._flushCursorUpdate()},this._options.cursorThrottle))}getCursors(){return this._awarenessManager.getCursors()}setStatus(e){this._localUser={...this._localUser,status:e},this._setPresence(),this._log("Status updated:",e)}getUsers(){return this._presenceManager.getAll()}getUser(e){return this._presenceManager.getUser(e)}_subscribe(){this._log("Document subscribe:",this.name),this._roomContext.subscribe(a),this._roomContext.subscribe(c),this._roomContext.on(a,e=>{this._handleIncomingOperation(e)}),this._roomContext.on(c,e=>{this._handleIncomingCursor(e)})}_activate(){this._log("Document activate:",this.name),this._setPresence(),this._roomContext.fetchPresence().then(e=>{this._log("Document 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._awarenessManager.setStatus(e.userId,e.status),this.emit("userJoined",e))}}).catch(e=>{this._log("Failed to fetch document presence:",e)})}_updateLocalPresence(){this._setPresence()}_handlePresenceJoin(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&(this._log("User joined document:",this.name,s.userId),this._awarenessManager.setStatus(s.userId,s.status),this._startUserIdleTracking(s),this.emit("userJoined",s))}_handlePresenceLeave(e){const t=this._presenceManager.removeByActorId(e);t&&(this._log("User left document:",this.name,t.userId),this._awarenessManager.removeCursor(t.userId),this.emit("userLeft",t))}_handlePresenceUpdate(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&this._awarenessManager.setStatus(s.userId,s.status)}_replayOperations(e){const t=e.filter(e=>!this._operationStore.has(e.id));if(0===t.length)return;this._log("Replaying",t.length,"operations"),this.emit("replayStart",{count:t.length});let s=0;for(const e of t){const t={...e,isReplay:!0};this._operationStore.add(t)&&(this.emit("operation",t),s++)}this.emit("replayEnd",{replayed:s})}_cleanup(){this._log("Document cleanup:",this.name),null!==this._cursorThrottleTimer&&(clearTimeout(this._cursorThrottleTimer),this._cursorThrottleTimer=null),this._roomContext.unsubscribe(a),this._roomContext.unsubscribe(c),this._roomContext.off(a),this._roomContext.off(c),this._awarenessManager.dispose(),this._presenceManager.clear(),this._operationStore.clear(),this.removeAllListeners()}_handleIncomingOperation(e){const t=e;if(this._operationStore.has(t.id))return;const s={...t,isReplay:!1};this._operationStore.add(s),this._log("Received operation:",t.type,t.id,"from",t.userId),this.emit("operation",s)}_handleIncomingCursor(e){const t=e;if(t.userId===this._localUser.userId)return;this._awarenessManager.updateCursor(t.userId,t);const s=this._presenceManager.getUser(t.userId);s&&this._startUserIdleTracking(s),this._log("Cursor moved:",t.userId),this.emit("cursorMoved",t)}_flushCursorUpdate(){if(!this._pendingCursorUpdate)return;const e=this._pendingCursorUpdate;this._pendingCursorUpdate=null;const t={userId:this._localUser.userId,username:this._localUser.username,color:this._localUser.color,timestamp:Date.now(),...e};this._awarenessManager.updateCursor(this._localUser.userId,t),this._roomContext.emit(c,t,{echo:!1})}_setPresence(){const e={userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,color:this._localUser.color,status:this._localUser.status,metadata:this._localUser.metadata};this._roomContext.setPresence(e)}_startUserIdleTracking(e){"active"!==this._awarenessManager.getStatus(e.userId)&&this._awarenessManager.setStatus(e.userId,"active"),this._awarenessManager.startIdleTracking(e.userId,this._options.idleTimeout,()=>{this._log("User went idle:",e.userId),this.emit("awarenessChanged",{userId:e.userId,status:"idle"})})}}class l extends t{constructor(e,t){super(),this._client=null,this._localUser=null,this._documents=new Map,this._lobby=null,this._onlineUsers=new Map,this._actorToUserId=new Map,this._token=e,this._userId=n(),this._options={username:t.username,avatar:t.avatar,color:t.color,metadata:t.metadata,appName:t.appName??"collab",url:t.url,maxOperationCache:t.maxOperationCache??1e3,idleTimeout:t.idleTimeout??6e4,cursorThrottle:t.cursorThrottle??50,debug:t.debug??!1,reconnect:t.reconnect??!0,documents:t.documents??[]},this._log=i("NoLagCollab",this._options.debug)}get connected(){return this._client?.connected??!1}get localUser(){return this._localUser}get documents(){return this._documents}async connect(){this._log("Connecting...");const t={debug:this._options.debug,reconnect:this._options.reconnect};this._options.url&&(t.url=this._options.url),this._client=e(this._token,t),this._client.on("connect",()=>{this._log("Connected"),this._documents.size>0&&(this._log("Reconnected — restoring documents..."),this._restoreDocuments(),this.emit("reconnected"))}),this._client.on("disconnect",e=>{this._log("Disconnected:",e),this.emit("disconnected",e)}),this._client.on("reconnect",()=>{this._log("Reconnecting...")}),this._client.on("error",e=>{this._log("Error:",e),this.emit("error",e)}),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,color:this._options.color,status:"active",metadata:this._options.metadata,joinedAt:Date.now(),isLocal:!0},this._log("Local user:",this._localUser.userId,"→",this._localUser.actorTokenId),await this._setupLobby(),this.emit("connected");for(const e of this._options.documents)this.joinDocument(e);setTimeout(()=>{this._lobby&&this._client?.connected&&this._lobby.fetchPresence().then(e=>{this._hydrateOnlineUsers(e)}).catch(()=>{})},2e3)}disconnect(){this._log("Disconnecting...");for(const e of[...this._documents.keys()])this.leaveDocument(e);this._lobby?.unsubscribe(),this._lobby=null,this._client?.disconnect(),this._client=null,this._onlineUsers.clear(),this._actorToUserId.clear(),this._localUser=null}joinDocument(e){if(!this._client||!this._localUser)throw new Error("Not connected — call connect() first");let t=this._documents.get(e);return t||(t=this._subscribeDocument(e),t._activate()),t}leaveDocument(e){const t=this._documents.get(e);t&&(this._log("Leaving document:",e),t._cleanup(),this._documents.delete(e))}getDocuments(){return Array.from(this._documents.values())}getOnlineUsers(){return Array.from(this._onlineUsers.values())}_subscribeDocument(e){if(!this._client||!this._localUser)throw new Error("Not connected — call connect() first");this._log("Subscribing document:",e);const t=this._client.setApp(this._options.appName).setRoom(e),s=new h(e,t,this._localUser,this._options,i(`CollabDocument:${e}`,this._options.debug));return this._documents.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));for(const s of this._documents.values())s._handlePresenceJoin(e.actorTokenId,t)}_handleRoomPresenceLeave(e){if(e.actorTokenId!==this._localUser?.actorTokenId)for(const t of this._documents.values())t._handlePresenceLeave(e.actorTokenId)}_handleRoomPresenceUpdate(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=e.presence;if(t?.userId){if(this._onlineUsers.has(t.userId)){const s=this._presenceToUser(e.actorTokenId,t);this._onlineUsers.set(s.userId,s)}for(const s of this._documents.values())s._handlePresenceUpdate(e.actorTokenId,t)}}async _setupLobby(){if(!this._client)return;this._lobby=this._client.setApp(this._options.appName).setLobby("online");const e=e=>t=>{const s=t;"join"===e?this._handleLobbyJoin(s):"leave"===e?this._handleLobbyLeave(s):this._handleLobbyUpdate(s)};this._client.on("lobbyPresence:join",e("join")),this._client.on("lobbyPresence:leave",e("leave")),this._client.on("lobbyPresence:update",e("update"));try{const e=await this._lobby.subscribe();this._hydrateOnlineUsers(e),this._log("Lobby subscribed, online users:",this._onlineUsers.size)}catch(e){this._log("Lobby subscription failed:",e)}}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const r=s;if(!r.userId)return;const o=this._presenceToUser(t,r);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 r=s,o=r?.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 r=s;if(!r.userId)return;const o=this._presenceToUser(t,r);this._onlineUsers.set(o.userId,o)}_hydrateOnlineUsers(e){for(const t of Object.keys(e)){const s=e[t];for(const e of Object.keys(s)){if(e===this._localUser?.actorTokenId)continue;const t=s[e],r=t?.presence??t;if(r?.userId){const t=this._presenceToUser(e,r);this._actorToUserId.set(e,t.userId),this._onlineUsers.has(t.userId)||(this._onlineUsers.set(t.userId,t),this.emit("userOnline",t))}}}}_presenceToUser(e,t){return{userId:t.userId,actorTokenId:e,username:t.username,avatar:t.avatar,color:t.color,status:t.status??"active",metadata:t.metadata,joinedAt:Date.now(),isLocal:!1}}_findUserIdByActorId(e){for(const t of this._onlineUsers.values())if(t.actorTokenId===e)return t.userId}_restoreDocuments(){for(const e of this._documents.values())e._updateLocalPresence();this._lobby?.fetchPresence().then(e=>{this._onlineUsers.clear(),this._actorToUserId.clear(),this._hydrateOnlineUsers(e)}).catch(e=>{this._log("Failed to re-fetch lobby presence:",e)})}}export{h as CollabDocument,t as EventEmitter,l as NoLagCollab};
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 r of s)try{r(...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._users=new Map,this._actorToUserId=new Map,this._localActorId=e}addFromPresence(e,t,s){if(e===this._localActorId)return null;const r=this._actorToUserId.get(e),o=t.userId||r||e,i={userId:o,actorTokenId:e,username:t.username,avatar:t.avatar,color:t.color,status:t.status??"active",metadata:t.metadata,joinedAt:s??Date.now(),isLocal:!1};return this._users.set(o,i),this._actorToUserId.set(e,o),i}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}updateStatus(e,t){const s=this._actorToUserId.get(e);if(!s)return null;const r=this._users.get(s);if(!r)return null;const o={...r,status:t};return this._users.set(s,o),o}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 s{constructor(e){this._ops=[],this._ids=new Set,this._maxSize=e}add(e){if(this._ids.has(e.id))return!1;for(this._ids.add(e.id),this._ops.push(e),this._ops.sort((e,t)=>e.timestamp-t.timestamp);this._ops.length>this._maxSize;){const e=this._ops.shift();e&&this._ids.delete(e.id)}return!0}getAll(){return[...this._ops]}getByUser(e){return this._ops.filter(t=>t.userId===e)}has(e){return this._ids.has(e)}get size(){return this._ops.length}clear(){this._ops=[],this._ids.clear()}}class r{constructor(e){this._cursors=new Map,this._statuses=new Map,this._idleTimers=new Map,this._localUserId=e}updateCursor(e,t){if(this._cursors.set(e,t),this._idleTimers.has(e)){const t=this._idleTimers.get(e);clearTimeout(t),this._idleTimers.delete(e)}}getCursor(e){return this._cursors.get(e)}getCursors(){return Array.from(this._cursors.values()).filter(e=>e.userId!==this._localUserId)}setStatus(e,t){this._statuses.set(e,t)}getStatus(e){return this._statuses.get(e)??"active"}startIdleTracking(e,t,s){this.stopIdleTracking(e);const r=setTimeout(()=>{this._idleTimers.delete(e),this._statuses.set(e,"idle"),s()},t);this._idleTimers.set(e,r)}stopIdleTracking(e){const t=this._idleTimers.get(e);void 0!==t&&(clearTimeout(t),this._idleTimers.delete(e))}removeCursor(e){this._cursors.delete(e),this._statuses.delete(e),this.stopIdleTracking(e)}dispose(){for(const e of this._idleTimers.values())clearTimeout(e);this._idleTimers.clear(),this._cursors.clear(),this._statuses.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 i(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const n=new WeakMap;const a="operations",h="_cursors";class c extends e{constructor(e,o,i,n,a,h){super(),this._cursorThrottleTimer=null,this._pendingCursorUpdate=null,this._onOperationsRef=null,this._onCursorsRef=null,this.name=e,this._roomContext=o,this._localUser=i,this._options=n,this._log=a,this._isConnected=h,this._presenceManager=new t(i.actorTokenId),this._operationStore=new s(n.maxOperationCache),this._awarenessManager=new r(i.userId)}get users(){return this._presenceManager.users}sendOperation(e,t={}){const s={id:o(),type:e,path:t.path,position:t.position,length:t.length,content:t.content,data:t.data,userId:this._localUser.userId,username:this._localUser.username,timestamp:Date.now(),isReplay:!1};return this._log("Sending operation:",e,s.id),this._operationStore.add(s),this._roomContext.emit(a,s,{echo:!1}),s}getOperations(){return this._operationStore.getAll()}updateCursor(e){this._pendingCursorUpdate=e,null===this._cursorThrottleTimer&&(this._flushCursorUpdate(),this._cursorThrottleTimer=setTimeout(()=>{this._cursorThrottleTimer=null,this._pendingCursorUpdate&&this._flushCursorUpdate()},this._options.cursorThrottle))}getCursors(){return this._awarenessManager.getCursors()}setStatus(e){this._localUser={...this._localUser,status:e},this._setPresence(),this._log("Status updated:",e)}getUsers(){return this._presenceManager.getAll()}getUser(e){return this._presenceManager.getUser(e)}_subscribe(){this._log("Document subscribe:",this.name),this._roomContext.subscribe(a),this._roomContext.subscribe(h),this._onOperationsRef=e=>{this._handleIncomingOperation(e)},this._roomContext.on(a,this._onOperationsRef),this._onCursorsRef=e=>{this._handleIncomingCursor(e)},this._roomContext.on(h,this._onCursorsRef)}_activate(){this._log("Document activate:",this.name),this._setPresence(),this._roomContext.fetchPresence().then(e=>{this._log("Document 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._awarenessManager.setStatus(e.userId,e.status),this.emit("userJoined",e))}}).catch(e=>{this._log("Failed to fetch document presence:",e)})}_updateLocalPresence(){this._setPresence()}_handlePresenceJoin(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&(this._log("User joined document:",this.name,s.userId),this._awarenessManager.setStatus(s.userId,s.status),this._startUserIdleTracking(s),this.emit("userJoined",s))}_handlePresenceLeave(e){const t=this._presenceManager.removeByActorId(e);t&&(this._log("User left document:",this.name,t.userId),this._awarenessManager.removeCursor(t.userId),this.emit("userLeft",t))}_handlePresenceUpdate(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&this._awarenessManager.setStatus(s.userId,s.status)}_replayOperations(e){const t=e.filter(e=>!this._operationStore.has(e.id));if(0===t.length)return;this._log("Replaying",t.length,"operations"),this.emit("replayStart",{count:t.length});let s=0;for(const e of t){const t={...e,isReplay:!0};this._operationStore.add(t)&&(this.emit("operation",t),s++)}this.emit("replayEnd",{replayed:s})}_cleanup(){this._log("Document cleanup:",this.name),null!==this._cursorThrottleTimer&&(clearTimeout(this._cursorThrottleTimer),this._cursorThrottleTimer=null),this._pendingCursorUpdate=null,this._isConnected()&&(this._roomContext.unsubscribe(a),this._roomContext.unsubscribe(h)),this._onOperationsRef&&this._roomContext.off(a,this._onOperationsRef),this._onCursorsRef&&this._roomContext.off(h,this._onCursorsRef),this._onOperationsRef=null,this._onCursorsRef=null,this._awarenessManager.dispose(),this._presenceManager.clear(),this._operationStore.clear(),this.removeAllListeners()}_handleIncomingOperation(e){const t=e;if(this._operationStore.has(t.id))return;const s={...t,isReplay:!1};this._operationStore.add(s),this._log("Received operation:",t.type,t.id,"from",t.userId),this.emit("operation",s)}_handleIncomingCursor(e){const t=e;if(t.userId===this._localUser.userId)return;this._awarenessManager.updateCursor(t.userId,t);const s=this._presenceManager.getUser(t.userId);s&&this._startUserIdleTracking(s),this._log("Cursor moved:",t.userId),this.emit("cursorMoved",t)}_flushCursorUpdate(){if(!this._pendingCursorUpdate)return;const e=this._pendingCursorUpdate;this._pendingCursorUpdate=null;const t={userId:this._localUser.userId,username:this._localUser.username,color:this._localUser.color,timestamp:Date.now(),...e};this._awarenessManager.updateCursor(this._localUser.userId,t),this._roomContext.emit(h,t,{echo:!1})}_setPresence(){const e={userId:this._localUser.userId,username:this._localUser.username,avatar:this._localUser.avatar,color:this._localUser.color,status:this._localUser.status,metadata:this._localUser.metadata,__scope:this._options.appName};this._roomContext.setPresence(e)}_startUserIdleTracking(e){"active"!==this._awarenessManager.getStatus(e.userId)&&this._awarenessManager.setStatus(e.userId,"active"),this._awarenessManager.startIdleTracking(e.userId,this._options.idleTimeout,()=>{this._log("User went idle:",e.userId),this.emit("awarenessChanged",{userId:e.userId,status:"idle"})})}}class l extends e{constructor(e){if(super(),this._localUser=null,this._documents=new Map,this._lobby=null,this._onlineUsers=new Map,this._actorToUserId=new Map,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._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("NoLagCollab requires an injected NoLag client: new NoLagCollab({ client, username, ... })");this._client=e.client,this._userId=o(),this._options={username:e.username,avatar:e.avatar,color:e.color,metadata:e.metadata,appName:e.appName??"collab",maxOperationCache:e.maxOperationCache??1e3,idleTimeout:e.idleTimeout??6e4,cursorThrottle:e.cursorThrottle??50,debug:e.debug??!1,documents:e.documents??[]},this._log=i("NoLagCollab",this._options.debug),this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPromise.catch(()=>{}),function(e,t,s){let r=n.get(e);r||(r=new Map,n.set(e,r));const o=r.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.`),r.set(t,s)}(this._client,this._options.appName,"NoLagCollab"),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("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 documents(){return this._documents}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("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._documents.keys()])this._documents.get(e)._cleanup(),this._documents.delete(e);if(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("NoLagCollab 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,color:this._options.color,status:"active",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)for(const e of this._documents.values())e._updateLocalPresence();else for(const e of this._options.documents)this._subscribeDocumentInternal(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)}joinDocument(e){this._assertUsable();let t=this._documents.get(e);return t||(t=this._subscribeDocumentInternal(e),t._activate()),t}leaveDocument(e){const t=this._documents.get(e);t&&(this._log("Leaving document:",e),t._cleanup(),this._documents.delete(e))}getDocuments(){return Array.from(this._documents.values())}getOnlineUsers(){return Array.from(this._onlineUsers.values())}_assertUsable(){if(this._detached)throw new Error("NoLagCollab has been detached — construct a new instance");if(!this._isReady||!this._localUser)throw new Error('NoLagCollab not ready — await ready() or the "connected" event')}_subscribeDocumentInternal(e){this._log("Subscribing document:",e);const t=this._client.setApp(this._options.appName).setRoom(e),s=new c(e,t,this._localUser,this._options,i(`CollabDocument:${e}`,this._options.debug),()=>this._client.connected);return this._documents.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));for(const s of this._documents.values())s._handlePresenceJoin(e.actorTokenId,t)}_handleRoomPresenceLeave(e){if(e.actorTokenId!==this._localUser?.actorTokenId)for(const t of this._documents.values())t._handlePresenceLeave(e.actorTokenId)}_handleRoomPresenceUpdate(e){if(e.actorTokenId===this._localUser?.actorTokenId)return;const t=e.presence;if(t?.userId&&!this._foreignScope(t)){if(this._onlineUsers.has(t.userId)){const s=this._presenceToUser(e.actorTokenId,t);this._onlineUsers.set(s.userId,s)}for(const s of this._documents.values())s._handlePresenceUpdate(e.actorTokenId,t)}}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._localUser?.actorTokenId)return;const r=s;if(!r.userId||this._foreignScope(r))return;const o=this._presenceToUser(t,r);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 r=s;if(this._foreignScope(r))return;const o=r?.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 r=s;if(!r.userId||this._foreignScope(r))return;const o=this._presenceToUser(t,r);this._onlineUsers.set(o.userId,o)}_diffHydrateOnlineUsers(e){const t=new Map,s=new Map;for(const r of Object.keys(e)){const o=e[r];for(const e of Object.keys(o)){if(e===this._localUser?.actorTokenId)continue;const r=o[e],i=r?.presence??r;i?.userId&&!this._foreignScope(i)&&(t.has(i.userId)||t.set(i.userId,this._presenceToUser(e,i)),s.set(e,i.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,color:t.color,status:t.status??"active",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{c as CollabDocument,e as EventEmitter,l as NoLagCollab};
2
2
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/PresenceManager.ts","../src/OperationStore.ts","../src/AwarenessManager.ts","../src/utils.ts","../src/constants.ts","../src/CollabDocument.ts","../src/NoLagCollab.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","PresenceManager","localActorId","_users","_actorToUserId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","existing","userId","user","username","avatar","color","status","metadata","Date","now","isLocal","removeByActorId","updateStatus","updated","getUser","getUserByActorId","undefined","getAll","Array","from","values","users","OperationStore","maxSize","_ops","_ids","_maxSize","op","id","push","sort","a","b","timestamp","length","evicted","shift","getByUser","filter","AwarenessManager","localUserId","_cursors","_statuses","_idleTimers","_localUserId","updateCursor","position","timer","clearTimeout","getCursor","getCursors","c","setStatus","getStatus","startIdleTracking","timeout","onIdle","stopIdleTracking","setTimeout","removeCursor","dispose","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","TOPIC_OPERATIONS","TOPIC_CURSORS","CollabDocument","name","roomContext","localUser","options","super","_cursorThrottleTimer","_pendingCursorUpdate","_roomContext","_localUser","_options","_log","_presenceManager","_operationStore","maxOperationCache","_awarenessManager","sendOperation","type","opts","path","content","data","isReplay","echo","getOperations","_flushCursorUpdate","cursorThrottle","_setPresence","getUsers","_subscribe","subscribe","_handleIncomingOperation","_handleIncomingCursor","_activate","fetchPresence","then","actors","actor","catch","err","_updateLocalPresence","_handlePresenceJoin","presenceData","_startUserIdleTracking","_handlePresenceLeave","_handlePresenceUpdate","_replayOperations","ops","pending","count","replayed","replayOp","_cleanup","unsubscribe","stored","cursor","setPresence","idleTimeout","NoLagCollab","token","_client","_documents","_lobby","_onlineUsers","_token","_userId","appName","url","debug","reconnect","documents","connected","connect","clientOptions","NoLag","_restoreDocuments","reason","_handleRoomPresenceJoin","_handleRoomPresenceLeave","_handleRoomPresenceUpdate","actorId","_setupLobby","docName","joinDocument","state","_hydrateOnlineUsers","disconnect","keys","leaveDocument","Error","doc","_subscribeDocument","getDocuments","getOnlineUsers","setApp","setRoom","_presenceToUser","setLobby","lobbyHandler","_handleLobbyJoin","_handleLobbyLeave","_handleLobbyUpdate","initialState","_findUserIdByActorId","roomId","Object","roomPresence","raw"],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/PresenceManager.ts","../src/OperationStore.ts","../src/AwarenessManager.ts","../src/utils.ts","../src/constants.ts","../src/CollabDocument.ts","../src/NoLagCollab.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","PresenceManager","localActorId","_users","_actorToUserId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","existing","userId","user","username","avatar","color","status","metadata","Date","now","isLocal","removeByActorId","updateStatus","updated","getUser","getUserByActorId","undefined","getAll","Array","from","values","users","OperationStore","maxSize","_ops","_ids","_maxSize","op","id","push","sort","a","b","timestamp","length","evicted","shift","getByUser","filter","AwarenessManager","localUserId","_cursors","_statuses","_idleTimers","_localUserId","updateCursor","position","timer","clearTimeout","getCursor","getCursors","c","setStatus","getStatus","startIdleTracking","timeout","onIdle","stopIdleTracking","setTimeout","removeCursor","dispose","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","wrapperRegistry","WeakMap","TOPIC_OPERATIONS","TOPIC_CURSORS","CollabDocument","name","roomContext","localUser","options","isConnected","super","_cursorThrottleTimer","_pendingCursorUpdate","_onOperationsRef","_onCursorsRef","_roomContext","_localUser","_options","_log","_isConnected","_presenceManager","_operationStore","maxOperationCache","_awarenessManager","sendOperation","type","opts","path","content","data","isReplay","echo","getOperations","_flushCursorUpdate","cursorThrottle","_setPresence","getUsers","_subscribe","subscribe","_handleIncomingOperation","_handleIncomingCursor","_activate","fetchPresence","then","actors","actor","catch","err","_updateLocalPresence","_handlePresenceJoin","presenceData","_startUserIdleTracking","_handlePresenceLeave","_handlePresenceUpdate","_replayOperations","ops","pending","count","replayed","replayOp","_cleanup","unsubscribe","stored","cursor","__scope","appName","setPresence","idleTimeout","NoLagCollab","_documents","_lobby","_onlineUsers","_epoch","_detached","_isReady","_lobbyRefreshTimer","_onConnectRef","_onConnect","_onDisconnectRef","reason","_onReconnectRef","_onErrorRef","_onPresenceJoinRef","_handleRoomPresenceJoin","_onPresenceLeaveRef","_handleRoomPresenceLeave","_onPresenceUpdateRef","_handleRoomPresenceUpdate","_onLobbyJoinRef","_handleLobbyJoin","_onLobbyLeaveRef","_handleLobbyLeave","_onLobbyUpdateRef","_handleLobbyUpdate","client","TypeError","_client","_userId","debug","documents","_readyPromise","Promise","resolve","reject","_readyResolve","_readyReject","wrapperName","apps","warn","registerWrapper","queueMicrotask","connected","ready","detach","keys","Error","_runSetup","epoch","stale","actorId","setApp","setLobby","state","_diffHydrateOnlineUsers","doc","_subscribeDocumentInternal","_scheduleLobbyRefresh","joinDocument","_assertUsable","leaveDocument","getDocuments","getOnlineUsers","setRoom","_foreignScope","scope","_presenceToUser","_findUserIdByActorId","fresh","freshActors","roomId","Object","roomPresence","raw","mappedUserId"],"mappings":"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"}
@@ -12,3 +12,5 @@ export declare const TOPIC_OPERATIONS = "operations";
12
12
  export declare const TOPIC_CURSORS = "_cursors";
13
13
  /** Lobby ID for global online presence */
14
14
  export declare const LOBBY_ID = "online";
15
+ /** Delay before the post-setup lobby presence refetch (catches simultaneous joiners) */
16
+ export declare const LOBBY_REFRESH_DELAY_MS = 2000;