@nolag/signal 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
@@ -26,12 +26,21 @@ npm install @nolag/js-sdk @nolag/signal
26
26
 
27
27
  ## Quick Start
28
28
 
29
+ The app owns one core NoLag client; wrappers attach to it. Any number of
30
+ wrapper SDKs (signal, chat, dash, ...) can share the same connection as
31
+ long as each uses its own app.
32
+
29
33
  ```typescript
34
+ import { NoLag } from "@nolag/js-sdk";
30
35
  import { NoLagSignal } from "@nolag/signal";
31
36
 
32
- const signal = new NoLagSignal("YOUR_ACTOR_TOKEN");
37
+ // One client for the whole app. In a browser, use a token provider so the
38
+ // SDK can mint fresh short-lived client tokens from your backend.
39
+ const client = NoLag(async () => (await (await fetch("/api/nolag-token")).json()).token);
40
+ const signal = new NoLagSignal({ client });
33
41
 
34
- await signal.connect();
42
+ await client.connect(); // the app owns the connection
43
+ await signal.ready(); // wrapper setup done (identity, presence)
35
44
 
36
45
  const room = signal.joinRoom("call-room");
37
46
 
@@ -69,8 +78,32 @@ room.on("signal", async (msg) => {
69
78
  break;
70
79
  }
71
80
  });
81
+
82
+ // Teardown: the wrapper releases its handlers and topics; the app closes
83
+ // the socket (never the other way around).
84
+ signal.detach();
85
+ client.disconnect();
72
86
  ```
73
87
 
88
+ ## Lifecycle
89
+
90
+ - **Construction = attach.** The wrapper wires its handlers onto the injected
91
+ client immediately. If the client is already connected, setup runs on the
92
+ next microtask; otherwise it runs when the client's `connect` event fires.
93
+ - **`ready()`** resolves once the first setup completed (identity and the
94
+ online lobby). Auth failures surface via your own `await client.connect()`,
95
+ not via `ready()`.
96
+ - **Reconnects are automatic.** The wrapper restores room presence and
97
+ reconciles the online-peer list, emitting only real deltas.
98
+ - **`detach()`** removes exactly this wrapper's handlers and topics and never
99
+ touches the socket. It is terminal: construct a new instance to re-attach.
100
+ Detach while the client is still connected so server-side unsubscribes go
101
+ through. In frameworks, call it from your dispose hook (`onUnmounted`,
102
+ HMR dispose).
103
+ - **One wrapper per (client, app).** Sharing a client across wrappers of
104
+ DIFFERENT apps is the intended pattern; two wrappers on the same app would
105
+ collide on topics and presence (the SDK warns if you do this).
106
+
74
107
  ## API Reference
75
108
 
76
109
  ### `NoLagSignal`
@@ -78,34 +111,44 @@ room.on("signal", async (msg) => {
78
111
  #### Constructor
79
112
 
80
113
  ```typescript
81
- const signal = new NoLagSignal(token: string, options?: NoLagSignalOptions);
114
+ const signal = new NoLagSignal(options: NoLagSignalOptions);
82
115
  ```
83
116
 
84
117
  **Options:**
85
118
 
86
119
  | Option | Type | Default | Description |
87
120
  |--------|------|---------|-------------|
121
+ | `client` | `NoLagSocket` | *required* | The injected core NoLag client |
88
122
  | `metadata` | `Record<string, unknown>` | — | Custom peer metadata |
89
- | `debug` | `boolean` | `false` | Enable debug logging |
90
- | `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
123
+ | `appName` | `string` | `'signal'` | NoLag app for topic prefixes |
124
+ | `debug` | `boolean` | `false` | Enable wrapper debug logging |
91
125
 
92
126
  #### Methods
93
127
 
94
128
  | Method | Returns | Description |
95
129
  |--------|---------|-------------|
96
- | `connect()` | `Promise<void>` | Connect to NoLag |
97
- | `disconnect()` | `void` | Disconnect |
130
+ | `ready()` | `Promise<void>` | Resolves when wrapper setup completed |
131
+ | `detach()` | `void` | Release handlers and topics (terminal; never closes the socket) |
98
132
  | `joinRoom(name)` | `SignalRoom` | Join a signaling room |
99
133
  | `leaveRoom(name)` | `void` | Leave a room |
100
134
  | `getRooms()` | `SignalRoom[]` | Get all joined rooms |
101
135
  | `getOnlinePeers()` | `Peer[]` | Get all online peers |
102
136
 
137
+ #### Properties
138
+
139
+ | Property | Type | Description |
140
+ |----------|------|-------------|
141
+ | `connected` | `boolean` | Whether currently connected |
142
+ | `localPeer` | `Peer \| null` | The local peer |
143
+ | `rooms` | `Map<string, SignalRoom>` | All joined rooms |
144
+
103
145
  #### Events
104
146
 
105
147
  | Event | Payload | Description |
106
148
  |-------|---------|-------------|
107
- | `connected` | — | Connected to NoLag |
108
- | `disconnected` | | Disconnected |
149
+ | `connected` | — | First setup completed |
150
+ | `disconnected` | `reason` | Disconnected |
151
+ | `reconnecting` | — | Reconnect attempt started |
109
152
  | `reconnected` | — | Reconnected after disconnect |
110
153
  | `error` | `Error` | Connection or protocol error |
111
154
  | `peerOnline` | `Peer` | A peer came online |
@@ -1,3 +1,4 @@
1
+ import type { NoLagSocket } from '@nolag/js-sdk';
1
2
  import { EventEmitter } from './EventEmitter';
2
3
  import { SignalRoom } from './SignalRoom';
3
4
  import type { NoLagSignalOptions, SignalClientEvents, Peer } from './types';
@@ -7,28 +8,36 @@ import type { NoLagSignalOptions, SignalClientEvents, Peer } from './types';
7
8
  * Provides peer discovery, offer/answer/ICE exchange, and global presence
8
9
  * 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 { NoLagSignal } from '@nolag/signal';
13
19
  *
14
- * const signal = new NoLagSignal(token, { debug: true });
20
+ * const client = NoLag(async () => (await (await fetch('/api/nolag-token')).json()).token);
21
+ * const signal = new NoLagSignal({ client, appName: 'my-signal' });
15
22
  *
16
- * signal.on('connected', () => console.log('Connected!'));
17
23
  * signal.on('peerOnline', (peer) => console.log(peer.peerId, 'is online'));
18
24
  *
19
- * await signal.connect();
25
+ * await client.connect(); // the app owns the connection
26
+ * await signal.ready(); // wrapper setup done (identity, lobby)
20
27
  *
21
28
  * const room = signal.joinRoom('call-room');
22
29
  * room.on('signal', (msg) => {
23
30
  * if (msg.type === 'offer') handleOffer(msg);
24
31
  * });
25
32
  * room.sendOffer(remotePeerId, offer);
33
+ *
34
+ * signal.detach(); // wrapper releases its handlers and topics
35
+ * client.disconnect(); // the app closes the socket
26
36
  * ```
27
37
  */
28
38
  export declare class NoLagSignal extends EventEmitter<SignalClientEvents> {
29
- private _token;
30
- private _options;
31
39
  private _client;
40
+ private _options;
32
41
  private _localPeer;
33
42
  private _rooms;
34
43
  private _lobby;
@@ -36,21 +45,54 @@ export declare class NoLagSignal extends EventEmitter<SignalClientEvents> {
36
45
  private _actorToPeerId;
37
46
  private _peerId;
38
47
  private _log;
39
- constructor(token: string, options?: NoLagSignalOptions);
40
- /** Whether the underlying connection is established */
48
+ private _epoch;
49
+ private _detached;
50
+ private _isReady;
51
+ private _readyResolve;
52
+ private _readyReject;
53
+ private _readyPromise;
54
+ private _lobbyRefreshTimer;
55
+ private _onConnectRef;
56
+ private _onDisconnectRef;
57
+ private _onReconnectRef;
58
+ private _onErrorRef;
59
+ private _onPresenceJoinRef;
60
+ private _onPresenceLeaveRef;
61
+ private _onPresenceUpdateRef;
62
+ private _onLobbyJoinRef;
63
+ private _onLobbyLeaveRef;
64
+ private _onLobbyUpdateRef;
65
+ constructor(options: NoLagSignalOptions);
66
+ /** Whether the underlying connection is established (connected ≠ ready) */
41
67
  get connected(): boolean;
42
- /** The local peer's info (available after connect) */
68
+ /** The injected core client (owned by the app, not the wrapper) */
69
+ get client(): NoLagSocket;
70
+ /** The local peer's info (available after ready) */
43
71
  get localPeer(): Peer | null;
44
72
  /** All currently joined rooms */
45
73
  get rooms(): Map<string, SignalRoom>;
46
74
  /**
47
- * Connect to NoLag and set up global presence.
75
+ * Resolves once the wrapper's first setup completed (identity and lobby
76
+ * ready — equivalently, once 'connected' has fired). Rejects only if
77
+ * detach() is called before that. Client auth failures surface via the
78
+ * app's own `await client.connect()`, not here.
79
+ */
80
+ ready(): Promise<void>;
81
+ /**
82
+ * Detach from the client: remove every handler this wrapper added,
83
+ * unsubscribe its topics and lobby (when connected), clear state.
84
+ * Terminal and idempotent; never touches the socket. To use signaling
85
+ * again, construct a new instance.
48
86
  */
49
- connect(): Promise<void>;
87
+ detach(): void;
88
+ private _onConnect;
50
89
  /**
51
- * Disconnect from NoLag and clean up all rooms.
90
+ * One setup pass per connection epoch. Serves both initial setup (epoch 1)
91
+ * and reconnect restore (epoch > 1). Aborts silently whenever a newer
92
+ * epoch started or the wrapper detached — checked after every await.
52
93
  */
53
- disconnect(): void;
94
+ private _runSetup;
95
+ private _scheduleLobbyRefresh;
54
96
  /**
55
97
  * Join a signaling room. Creates, subscribes, and activates it.
56
98
  * Returns an existing room if already joined.
@@ -68,16 +110,27 @@ export declare class NoLagSignal extends EventEmitter<SignalClientEvents> {
68
110
  * Get all peers currently online across all rooms.
69
111
  */
70
112
  getOnlinePeers(): Peer[];
113
+ private _assertUsable;
71
114
  private _subscribeRoom;
115
+ /**
116
+ * On a shared client, presence events from other apps' wrappers arrive on
117
+ * the same connection-level events. Wrappers stamp their presence with a
118
+ * `__scope` (their appName); a mismatched tag means another app's data.
119
+ * Untagged presence is accepted (older peers in this same app).
120
+ */
121
+ private _foreignScope;
72
122
  private _handleRoomPresenceJoin;
73
123
  private _handleRoomPresenceLeave;
74
124
  private _handleRoomPresenceUpdate;
75
- private _setupLobby;
76
125
  private _handleLobbyJoin;
77
126
  private _handleLobbyLeave;
78
127
  private _handleLobbyUpdate;
79
- private _hydrateOnlinePeers;
128
+ /**
129
+ * Reconcile the online-peer map against a fresh lobby snapshot, emitting
130
+ * only the deltas (peerOffline for vanished, peerOnline for new). One path
131
+ * for initial hydration, reconnect restore, and the deferred refetch.
132
+ */
133
+ private _diffHydrateOnlinePeers;
80
134
  private _presenceToPeer;
81
135
  private _findPeerIdByActorId;
82
- private _restoreRooms;
83
136
  }
@@ -14,8 +14,10 @@ export declare class SignalRoom extends EventEmitter<SignalRoomEvents> {
14
14
  private _options;
15
15
  private _peerManager;
16
16
  private _log;
17
+ private _isConnected;
18
+ private _onSignalingRef;
17
19
  /** @internal */
18
- constructor(name: string, roomContext: RoomContext, localPeer: Peer, options: ResolvedSignalOptions, log: (...args: unknown[]) => void);
20
+ constructor(name: string, roomContext: RoomContext, localPeer: Peer, options: ResolvedSignalOptions, log: (...args: unknown[]) => void, isConnected: () => boolean);
19
21
  /** All remote peers currently in this room */
20
22
  get peers(): Map<string, Peer>;
21
23
  /**
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 o=this._handlers.get(e);if(o)for(const s of o)try{s(...t)}catch(t){console.error(`Error in ${String(e)} handler:`,t)}}listenerCount(e){return this._handlers.get(e)?.size??0}}class o{constructor(e){this._peers=new Map,this._actorToPeerId=new Map,this._localActorId=e}addFromPresence(e,t,o){if(e===this._localActorId)return null;const s=this._actorToPeerId.get(e),n=t.peerId||s||e,r={peerId:n,actorTokenId:e,connectionState:"new",metadata:t.metadata,joinedAt:o||Date.now(),isLocal:!1};return this._peers.set(n,r),this._actorToPeerId.set(e,n),r}removeByActorId(e){if(e===this._localActorId)return null;const t=this._actorToPeerId.get(e);if(!t)return null;const o=this._peers.get(t)||null;return this._peers.delete(t),this._actorToPeerId.delete(e),o}getPeer(e){return this._peers.get(e)}getPeerByActorId(e){const t=this._actorToPeerId.get(e);return t?this._peers.get(t):void 0}getAll(){return Array.from(this._peers.values())}get peers(){return this._peers}clear(){this._peers.clear(),this._actorToPeerId.clear()}}function s(){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 n(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const r="signaling";class i extends t{constructor(e,t,s,n,r){super(),this.name=e,this._roomContext=t,this._localPeer=s,this._options=n,this._log=r,this._peerManager=new o(s.actorTokenId)}get peers(){return this._peerManager.peers}sendOffer(e,t){this.signal(e,"offer",t)}sendAnswer(e,t){this.signal(e,"answer",t)}sendIceCandidate(e,t){this.signal(e,"ice-candidate",t)}sendBye(e){this.signal(e,"bye",{})}signal(e,t,o){const n={id:s(),type:t,fromPeerId:this._localPeer.peerId,toPeerId:e,payload:o,timestamp:Date.now()};this._log("Sending signal:",t,"→",e),this._roomContext.emit(r,n,{echo:!1})}getPeers(){return this._peerManager.getAll()}getPeer(e){return this._peerManager.getPeer(e)}_subscribe(){this._log("Room subscribe:",this.name),this._roomContext.subscribe(r),this._roomContext.on(r,e=>{this._handleIncomingSignal(e)})}_activate(){this._log("Room activate:",this.name),this._setPresence(),this._roomContext.fetchPresence().then(e=>{this._log("Room presence fetched:",this.name,e.length,"actors");for(const t of e)if(t.presence){const e=this._peerManager.addFromPresence(t.actorTokenId,t.presence,t.joinedAt);e&&this.emit("peerJoined",e)}}).catch(e=>{this._log("Failed to fetch room presence:",e)})}_updateLocalPresence(){this._setPresence()}_handlePresenceJoin(e,t){const o=this._peerManager.addFromPresence(e,t);o&&(this._log("Peer joined room:",this.name,o.peerId),this.emit("peerJoined",o))}_handlePresenceLeave(e){const t=this._peerManager.removeByActorId(e);t&&(this._log("Peer left room:",this.name,t.peerId),this.emit("peerLeft",t))}_handlePresenceUpdate(e,t){this._peerManager.addFromPresence(e,t)}_cleanup(){this._log("Room cleanup:",this.name),this._roomContext.unsubscribe(r),this._roomContext.off(r),this._peerManager.clear(),this.removeAllListeners()}_handleIncomingSignal(e){const t=e;t.toPeerId===this._localPeer.peerId&&(this._log("Received signal:",t.type,"from",t.fromPeerId),this.emit("signal",t))}_setPresence(){const e={peerId:this._localPeer.peerId,metadata:this._localPeer.metadata};this._roomContext.setPresence(e)}}class c extends t{constructor(e,t={}){super(),this._client=null,this._localPeer=null,this._rooms=new Map,this._lobby=null,this._onlinePeers=new Map,this._actorToPeerId=new Map,this._token=e,this._peerId=s(),this._options={metadata:t.metadata,appName:t.appName??"signal",url:t.url,debug:t.debug??!1,reconnect:t.reconnect??!0},this._log=n("NoLagSignal",this._options.debug)}get connected(){return this._client?.connected??!1}get localPeer(){return this._localPeer}get rooms(){return this._rooms}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._rooms.size>0&&(this._log("Reconnected — restoring rooms..."),this._restoreRooms(),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._localPeer={peerId:this._peerId,actorTokenId:this._client.actorId,connectionState:"new",metadata:this._options.metadata,joinedAt:Date.now(),isLocal:!0},this._log("Local peer:",this._localPeer.peerId,"→",this._localPeer.actorTokenId),await this._setupLobby(),this.emit("connected"),setTimeout(()=>{this._lobby&&this._client?.connected&&this._lobby.fetchPresence().then(e=>{this._hydrateOnlinePeers(e)}).catch(()=>{})},2e3)}disconnect(){this._log("Disconnecting...");for(const e of[...this._rooms.keys()])this.leaveRoom(e);this._lobby?.unsubscribe(),this._lobby=null,this._client?.disconnect(),this._client=null,this._onlinePeers.clear(),this._actorToPeerId.clear(),this._localPeer=null}joinRoom(e){if(!this._client||!this._localPeer)throw new Error("Not connected — call connect() first");let t=this._rooms.get(e);return t||(t=this._subscribeRoom(e),t._activate()),t}leaveRoom(e){const t=this._rooms.get(e);t&&(this._log("Leaving room:",e),t._cleanup(),this._rooms.delete(e))}getRooms(){return Array.from(this._rooms.values())}getOnlinePeers(){return Array.from(this._onlinePeers.values())}_subscribeRoom(e){if(!this._client||!this._localPeer)throw new Error("Not connected — call connect() first");this._log("Subscribing room:",e);const t=this._client.setApp(this._options.appName).setRoom(e),o=new i(e,t,this._localPeer,this._options,n(`SignalRoom:${e}`,this._options.debug));return this._rooms.set(e,o),o._subscribe(),o}_handleRoomPresenceJoin(e){if(e.actorTokenId===this._localPeer?.actorTokenId)return;const t=e.presence;if(!t?.peerId)return;const o=this._presenceToPeer(e.actorTokenId,t);this._actorToPeerId.set(e.actorTokenId,o.peerId),this._onlinePeers.has(o.peerId)||(this._onlinePeers.set(o.peerId,o),this.emit("peerOnline",o));for(const o of this._rooms.values())o._handlePresenceJoin(e.actorTokenId,t)}_handleRoomPresenceLeave(e){if(e.actorTokenId!==this._localPeer?.actorTokenId)for(const t of this._rooms.values())t._handlePresenceLeave(e.actorTokenId)}_handleRoomPresenceUpdate(e){if(e.actorTokenId===this._localPeer?.actorTokenId)return;const t=e.presence;if(t?.peerId){if(this._onlinePeers.has(t.peerId)){const o=this._presenceToPeer(e.actorTokenId,t);this._onlinePeers.set(o.peerId,o)}for(const o of this._rooms.values())o._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 o=t;"join"===e?this._handleLobbyJoin(o):"leave"===e?this._handleLobbyLeave(o):this._handleLobbyUpdate(o)};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._hydrateOnlinePeers(e),this._log("Lobby subscribed, online peers:",this._onlinePeers.size)}catch(e){this._log("Lobby subscription failed:",e)}}_handleLobbyJoin(e){const{actorId:t,data:o}=e;if(t===this._localPeer?.actorTokenId)return;const s=o;if(!s.peerId)return;const n=this._presenceToPeer(t,s);this._actorToPeerId.set(t,n.peerId),this._onlinePeers.has(n.peerId)||(this._onlinePeers.set(n.peerId,n),this.emit("peerOnline",n))}_handleLobbyLeave(e){const{actorId:t,data:o}=e;if(t===this._localPeer?.actorTokenId)return;const s=o,n=s?.peerId||this._actorToPeerId.get(t)||this._findPeerIdByActorId(t);if(n){const e=this._onlinePeers.get(n);e&&(this._onlinePeers.delete(n),this._actorToPeerId.delete(t),this.emit("peerOffline",e))}}_handleLobbyUpdate(e){const{actorId:t,data:o}=e;if(t===this._localPeer?.actorTokenId)return;const s=o;if(!s.peerId)return;const n=this._presenceToPeer(t,s);this._onlinePeers.set(n.peerId,n)}_hydrateOnlinePeers(e){for(const t of Object.keys(e)){const o=e[t];for(const e of Object.keys(o)){if(e===this._localPeer?.actorTokenId)continue;const t=o[e],s=t?.presence??t;if(s?.peerId){const t=this._presenceToPeer(e,s);this._actorToPeerId.set(e,t.peerId),this._onlinePeers.has(t.peerId)||(this._onlinePeers.set(t.peerId,t),this.emit("peerOnline",t))}}}}_presenceToPeer(e,t){return{peerId:t.peerId,actorTokenId:e,connectionState:"new",metadata:t.metadata,joinedAt:Date.now(),isLocal:!1}}_findPeerIdByActorId(e){for(const t of this._onlinePeers.values())if(t.actorTokenId===e)return t.peerId}_restoreRooms(){for(const e of this._rooms.values())e._updateLocalPresence();this._lobby?.fetchPresence().then(e=>{this._onlinePeers.clear(),this._actorToPeerId.clear(),this._hydrateOnlinePeers(e)}).catch(e=>{this._log("Failed to re-fetch lobby presence:",e)})}}export{t as EventEmitter,c as NoLagSignal,i as SignalRoom};
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 o=this._handlers.get(e);if(o)for(const s of o)try{s(...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._peers=new Map,this._actorToPeerId=new Map,this._localActorId=e}addFromPresence(e,t,o){if(e===this._localActorId)return null;const s=this._actorToPeerId.get(e),n=t.peerId||s||e,i={peerId:n,actorTokenId:e,connectionState:"new",metadata:t.metadata,joinedAt:o||Date.now(),isLocal:!1};return this._peers.set(n,i),this._actorToPeerId.set(e,n),i}removeByActorId(e){if(e===this._localActorId)return null;const t=this._actorToPeerId.get(e);if(!t)return null;const o=this._peers.get(t)||null;return this._peers.delete(t),this._actorToPeerId.delete(e),o}getPeer(e){return this._peers.get(e)}getPeerByActorId(e){const t=this._actorToPeerId.get(e);return t?this._peers.get(t):void 0}getAll(){return Array.from(this._peers.values())}get peers(){return this._peers}clear(){this._peers.clear(),this._actorToPeerId.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 s(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const n=new WeakMap;const i="signaling";class r extends e{constructor(e,o,s,n,i,r){super(),this._onSignalingRef=null,this.name=e,this._roomContext=o,this._localPeer=s,this._options=n,this._log=i,this._isConnected=r,this._peerManager=new t(s.actorTokenId)}get peers(){return this._peerManager.peers}sendOffer(e,t){this.signal(e,"offer",t)}sendAnswer(e,t){this.signal(e,"answer",t)}sendIceCandidate(e,t){this.signal(e,"ice-candidate",t)}sendBye(e){this.signal(e,"bye",{})}signal(e,t,s){const n={id:o(),type:t,fromPeerId:this._localPeer.peerId,toPeerId:e,payload:s,timestamp:Date.now()};this._log("Sending signal:",t,"→",e),this._roomContext.emit(i,n,{echo:!1})}getPeers(){return this._peerManager.getAll()}getPeer(e){return this._peerManager.getPeer(e)}_subscribe(){this._log("Room subscribe:",this.name),this._roomContext.subscribe(i),this._onSignalingRef=e=>{this._handleIncomingSignal(e)},this._roomContext.on(i,this._onSignalingRef)}_activate(){this._log("Room activate:",this.name),this._setPresence(),this._roomContext.fetchPresence().then(e=>{this._log("Room presence fetched:",this.name,e.length,"actors");for(const t of e)if(t.presence){const e=this._peerManager.addFromPresence(t.actorTokenId,t.presence,t.joinedAt);e&&this.emit("peerJoined",e)}}).catch(e=>{this._log("Failed to fetch room presence:",e)})}_updateLocalPresence(){this._setPresence()}_handlePresenceJoin(e,t){const o=this._peerManager.addFromPresence(e,t);o&&(this._log("Peer joined room:",this.name,o.peerId),this.emit("peerJoined",o))}_handlePresenceLeave(e){const t=this._peerManager.removeByActorId(e);t&&(this._log("Peer left room:",this.name,t.peerId),this.emit("peerLeft",t))}_handlePresenceUpdate(e,t){this._peerManager.addFromPresence(e,t)}_cleanup(){this._log("Room cleanup:",this.name),this._isConnected()&&this._roomContext.unsubscribe(i),this._onSignalingRef&&this._roomContext.off(i,this._onSignalingRef),this._onSignalingRef=null,this._peerManager.clear(),this.removeAllListeners()}_handleIncomingSignal(e){const t=e;t.toPeerId===this._localPeer.peerId&&(this._log("Received signal:",t.type,"from",t.fromPeerId),this.emit("signal",t))}_setPresence(){const e={peerId:this._localPeer.peerId,metadata:this._localPeer.metadata,__scope:this._options.appName};this._roomContext.setPresence(e)}}class c extends e{constructor(e){if(super(),this._localPeer=null,this._rooms=new Map,this._lobby=null,this._onlinePeers=new Map,this._actorToPeerId=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("NoLagSignal requires an injected NoLag client: new NoLagSignal({ client, ... })");this._client=e.client,this._peerId=o(),this._options={metadata:e.metadata,appName:e.appName??"signal",debug:e.debug??!1},this._log=s("NoLagSignal",this._options.debug),this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPromise.catch(()=>{}),function(e,t,o){let s=n.get(e);s||(s=new Map,n.set(e,s));const i=s.get(t);i&&console.warn(`[${o}] Another wrapper (${i}) is already attached to this client for app "${t}". Use one wrapper per (client, app) — detach the other instance first.`),s.set(t,o)}(this._client,this._options.appName,"NoLagSignal"),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 localPeer(){return this._localPeer}get rooms(){return this._rooms}ready(){return this._readyPromise}detach(){if(!this._detached){this._log("Detaching..."),this._detached=!0,this._epoch++,this._lobbyRefreshTimer&&(clearTimeout(this._lobbyRefreshTimer),this._lobbyRefreshTimer=null),this._client.off("connect",this._onConnectRef),this._client.off("disconnect",this._onDisconnectRef),this._client.off("reconnect",this._onReconnectRef),this._client.off("error",this._onErrorRef),this._client.off("presence:join",this._onPresenceJoinRef),this._client.off("presence:leave",this._onPresenceLeaveRef),this._client.off("presence:update",this._onPresenceUpdateRef),this._client.off("lobbyPresence:join",this._onLobbyJoinRef),this._client.off("lobbyPresence:leave",this._onLobbyLeaveRef),this._client.off("lobbyPresence:update",this._onLobbyUpdateRef);for(const e of[...this._rooms.keys()])this._rooms.get(e)._cleanup(),this._rooms.delete(e);if(this._lobby&&this._client.connected)try{this._lobby.unsubscribe()}catch{}var e,t;this._lobby=null,this._onlinePeers.clear(),this._actorToPeerId.clear(),this._localPeer=null,e=this._client,t=this._options.appName,n.get(e)?.delete(t),this._isReady||this._readyReject(new Error("NoLagSignal 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._localPeer?this._localPeer.actorTokenId=this._client.actorId:(this._localPeer={peerId:this._peerId,actorTokenId:this._client.actorId,connectionState:"new",metadata:this._options.metadata,joinedAt:Date.now(),isLocal:!0},this._log("Local peer:",this._localPeer.peerId,"→",this._localPeer.actorTokenId)),this._lobby||(this._lobby=this._client.setApp(this._options.appName).setLobby("online"));try{const e=await this._lobby.subscribe();if(t())return;this._diffHydrateOnlinePeers(e),this._log("Lobby subscribed, online peers:",this._onlinePeers.size)}catch(e){if(t())return;this._log("Lobby subscription failed:",e)}if(this._isReady)for(const e of this._rooms.values())e._updateLocalPresence();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._diffHydrateOnlinePeers(t)}).catch(()=>{})},2e3)}joinRoom(e){this._assertUsable();let t=this._rooms.get(e);return t||(t=this._subscribeRoom(e),t._activate()),t}leaveRoom(e){const t=this._rooms.get(e);t&&(this._log("Leaving room:",e),t._cleanup(),this._rooms.delete(e))}getRooms(){return Array.from(this._rooms.values())}getOnlinePeers(){return Array.from(this._onlinePeers.values())}_assertUsable(){if(this._detached)throw new Error("NoLagSignal has been detached — construct a new instance");if(!this._isReady||!this._localPeer)throw new Error('NoLagSignal not ready — await ready() or the "connected" event')}_subscribeRoom(e){this._log("Subscribing room:",e);const t=this._client.setApp(this._options.appName).setRoom(e),o=new r(e,t,this._localPeer,this._options,s(`SignalRoom:${e}`,this._options.debug),()=>this._client.connected);return this._rooms.set(e,o),o._subscribe(),o}_foreignScope(e){const t=e?.__scope;return"string"==typeof t&&t!==this._options.appName}_handleRoomPresenceJoin(e){if(e.actorTokenId===this._localPeer?.actorTokenId)return;const t=e.presence;if(!t?.peerId||this._foreignScope(t))return;const o=this._presenceToPeer(e.actorTokenId,t);this._actorToPeerId.set(e.actorTokenId,o.peerId),this._onlinePeers.has(o.peerId)||(this._onlinePeers.set(o.peerId,o),this.emit("peerOnline",o));for(const o of this._rooms.values())o._handlePresenceJoin(e.actorTokenId,t)}_handleRoomPresenceLeave(e){if(e.actorTokenId!==this._localPeer?.actorTokenId)for(const t of this._rooms.values())t._handlePresenceLeave(e.actorTokenId)}_handleRoomPresenceUpdate(e){if(e.actorTokenId===this._localPeer?.actorTokenId)return;const t=e.presence;if(t?.peerId&&!this._foreignScope(t)){if(this._onlinePeers.has(t.peerId)){const o=this._presenceToPeer(e.actorTokenId,t);this._onlinePeers.set(o.peerId,o)}for(const o of this._rooms.values())o._handlePresenceUpdate(e.actorTokenId,t)}}_handleLobbyJoin(e){const{actorId:t,data:o}=e;if(t===this._localPeer?.actorTokenId)return;const s=o;if(!s.peerId||this._foreignScope(s))return;const n=this._presenceToPeer(t,s);this._actorToPeerId.set(t,n.peerId),this._onlinePeers.has(n.peerId)||(this._onlinePeers.set(n.peerId,n),this.emit("peerOnline",n))}_handleLobbyLeave(e){const{actorId:t,data:o}=e;if(t===this._localPeer?.actorTokenId)return;const s=o;if(this._foreignScope(s))return;const n=s?.peerId||this._actorToPeerId.get(t)||this._findPeerIdByActorId(t);if(n){const e=this._onlinePeers.get(n);e&&(this._onlinePeers.delete(n),this._actorToPeerId.delete(t),this.emit("peerOffline",e))}}_handleLobbyUpdate(e){const{actorId:t,data:o}=e;if(t===this._localPeer?.actorTokenId)return;const s=o;if(!s.peerId||this._foreignScope(s))return;const n=this._presenceToPeer(t,s);this._onlinePeers.set(n.peerId,n)}_diffHydrateOnlinePeers(e){const t=new Map,o=new Map;for(const s of Object.keys(e)){const n=e[s];for(const e of Object.keys(n)){if(e===this._localPeer?.actorTokenId)continue;const s=n[e],i=s?.presence??s;i?.peerId&&!this._foreignScope(i)&&(t.has(i.peerId)||t.set(i.peerId,this._presenceToPeer(e,i)),o.set(e,i.peerId))}}for(const[e,o]of[...this._onlinePeers])if(!t.has(e)){this._onlinePeers.delete(e);for(const[t,o]of[...this._actorToPeerId])o===e&&this._actorToPeerId.delete(t);this.emit("peerOffline",o)}for(const[e,o]of t)this._onlinePeers.has(e)||(this._onlinePeers.set(e,o),this.emit("peerOnline",o));for(const[e,t]of o)this._actorToPeerId.set(e,t)}_presenceToPeer(e,t){return{peerId:t.peerId,actorTokenId:e,connectionState:"new",metadata:t.metadata,joinedAt:Date.now(),isLocal:!1}}_findPeerIdByActorId(e){for(const t of this._onlinePeers.values())if(t.actorTokenId===e)return t.peerId}}export{e as EventEmitter,c as NoLagSignal,r as SignalRoom};
2
2
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/PeerManager.ts","../src/utils.ts","../src/constants.ts","../src/SignalRoom.ts","../src/NoLagSignal.ts"],"sourcesContent":[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","PeerManager","localActorId","_peers","_actorToPeerId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","existing","peerId","peer","connectionState","metadata","Date","now","isLocal","removeByActorId","getPeer","getPeerByActorId","undefined","getAll","Array","from","values","peers","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","TOPIC_SIGNALING","SignalRoom","name","roomContext","localPeer","options","super","_roomContext","_localPeer","_options","_log","_peerManager","sendOffer","toPeerId","offer","signal","sendAnswer","answer","sendIceCandidate","candidate","sendBye","type","payload","message","id","fromPeerId","timestamp","echo","getPeers","_subscribe","subscribe","data","_handleIncomingSignal","_activate","_setPresence","fetchPresence","then","actors","length","actor","catch","err","_updateLocalPresence","_handlePresenceJoin","presenceData","_handlePresenceLeave","_handlePresenceUpdate","_cleanup","unsubscribe","setPresence","NoLagSignal","token","_client","_rooms","_lobby","_onlinePeers","_token","_peerId","appName","url","debug","reconnect","connected","rooms","connect","clientOptions","NoLag","_restoreRooms","reason","_handleRoomPresenceJoin","_handleRoomPresenceLeave","_handleRoomPresenceUpdate","actorId","_setupLobby","setTimeout","state","_hydrateOnlinePeers","disconnect","keys","leaveRoom","joinRoom","Error","room","_subscribeRoom","getRooms","getOnlinePeers","setApp","setRoom","_presenceToPeer","setLobby","lobbyHandler","_handleLobbyJoin","_handleLobbyLeave","_handleLobbyUpdate","initialState","_findPeerIdByActorId","roomId","Object","roomPresence","raw"],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/PeerManager.ts","../src/utils.ts","../src/constants.ts","../src/SignalRoom.ts","../src/NoLagSignal.ts"],"sourcesContent":[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","PeerManager","localActorId","_peers","_actorToPeerId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","existing","peerId","peer","connectionState","metadata","Date","now","isLocal","removeByActorId","getPeer","getPeerByActorId","undefined","getAll","Array","from","values","peers","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","wrapperRegistry","WeakMap","TOPIC_SIGNALING","SignalRoom","name","roomContext","localPeer","options","isConnected","super","_onSignalingRef","_roomContext","_localPeer","_options","_log","_isConnected","_peerManager","sendOffer","toPeerId","offer","signal","sendAnswer","answer","sendIceCandidate","candidate","sendBye","type","payload","message","id","fromPeerId","timestamp","echo","getPeers","_subscribe","subscribe","data","_handleIncomingSignal","_activate","_setPresence","fetchPresence","then","actors","length","actor","catch","err","_updateLocalPresence","_handlePresenceJoin","presenceData","_handlePresenceLeave","_handlePresenceUpdate","_cleanup","unsubscribe","__scope","appName","setPresence","NoLagSignal","_rooms","_lobby","_onlinePeers","_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","_peerId","debug","_readyPromise","Promise","resolve","reject","_readyResolve","_readyReject","wrapperName","apps","warn","registerWrapper","queueMicrotask","connected","rooms","ready","detach","clearTimeout","keys","Error","_runSetup","epoch","stale","actorId","setApp","setLobby","state","_diffHydrateOnlinePeers","room","_scheduleLobbyRefresh","setTimeout","joinRoom","_assertUsable","_subscribeRoom","leaveRoom","getRooms","getOnlinePeers","setRoom","_foreignScope","scope","_presenceToPeer","_findPeerIdByActorId","fresh","freshActors","roomId","Object","roomPresence","raw","mappedPeerId"],"mappings":"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"}
@@ -4,3 +4,5 @@ export declare const DEFAULT_APP_NAME = "signal";
4
4
  export declare const TOPIC_SIGNALING = "signaling";
5
5
  /** Lobby ID for global online presence */
6
6
  export declare const LOBBY_ID = "online";
7
+ /** Delay before the post-setup lobby presence refetch (catches simultaneous joiners) */
8
+ export declare const LOBBY_REFRESH_DELAY_MS = 2000;