@nolag/collab 0.1.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -18
- package/dist/CollabDocument.d.ts +4 -1
- package/dist/NoLagCollab.d.ts +69 -16
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/index.cjs +346 -166
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +346 -166
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.ts +8 -6
- package/dist/utils.d.ts +4 -0
- package/package.json +3 -3
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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", (
|
|
61
|
-
|
|
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(
|
|
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
|
-
| `
|
|
99
|
-
| `
|
|
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` | — |
|
|
110
|
-
| `disconnected` |
|
|
111
|
-
| `
|
|
112
|
-
| `
|
|
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
|
|
package/dist/CollabDocument.d.ts
CHANGED
|
@@ -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
|
/**
|
package/dist/NoLagCollab.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
38
|
-
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
85
|
+
detach(): void;
|
|
86
|
+
private _onConnect;
|
|
48
87
|
/**
|
|
49
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
package/dist/browser.js.map
CHANGED
|
@@ -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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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -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;
|