@nolag/signal 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 +52 -9
- package/dist/NoLagSignal.d.ts +68 -15
- package/dist/SignalRoom.d.ts +3 -1
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/index.cjs +322 -152
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +322 -152
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.ts +10 -7
- package/dist/utils.d.ts +4 -0
- package/package.json +3 -3
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
| `
|
|
90
|
-
| `
|
|
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
|
-
| `
|
|
97
|
-
| `
|
|
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` | — |
|
|
108
|
-
| `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 |
|
package/dist/NoLagSignal.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
40
|
-
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
87
|
+
detach(): void;
|
|
88
|
+
private _onConnect;
|
|
50
89
|
/**
|
|
51
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/dist/SignalRoom.d.ts
CHANGED
|
@@ -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
|
package/dist/browser.js.map
CHANGED
|
@@ -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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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -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;
|