@nolag/signal 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,162 @@
1
+ # @nolag/signal
2
+
3
+ WebRTC signaling SDK for [NoLag](https://nolag.app) — peer discovery, offer/answer exchange, and ICE candidate relay.
4
+
5
+ ## How It Works with NoLag
6
+
7
+ NoLag is a real-time messaging platform that handles WebSocket connections, message routing, persistence, and scaling. This SDK wraps the low-level [@nolag/js-sdk](https://www.npmjs.com/package/@nolag/js-sdk) and gives you a purpose-built signaling API for WebRTC — peer discovery, SDP exchange, and ICE candidate relay — without managing topics or subscriptions yourself.
8
+
9
+ **Note:** This SDK handles *signaling only* (the coordination layer). The actual media streams (audio/video) are peer-to-peer via WebRTC. NoLag acts as the signaling server that helps peers find each other and negotiate connections.
10
+
11
+ ### Getting Your Token
12
+
13
+ 1. Sign up at [nolag.app](https://nolag.app)
14
+ 2. Create a new **project** in the portal
15
+ 3. Choose the **Signal** blueprint when creating an app — this pre-configures the `signaling` topic your WebRTC app needs
16
+ 4. Go to the app's **Tokens** page and generate an **actor token**
17
+ 5. Use that token when connecting with this SDK
18
+
19
+ Each token identifies a unique peer in NoLag. The blueprint handles all the infrastructure setup — you just build your video/audio UI.
20
+
21
+ ## Install
22
+
23
+ ```bash
24
+ npm install @nolag/js-sdk @nolag/signal
25
+ ```
26
+
27
+ ## Quick Start
28
+
29
+ ```typescript
30
+ import { NoLagSignal } from "@nolag/signal";
31
+
32
+ const signal = new NoLagSignal("YOUR_ACTOR_TOKEN");
33
+
34
+ await signal.connect();
35
+
36
+ const room = signal.joinRoom("call-room");
37
+
38
+ // When a new peer joins, start a WebRTC connection
39
+ room.on("peerJoined", async (peer) => {
40
+ const pc = new RTCPeerConnection();
41
+
42
+ // Send your offer
43
+ const offer = await pc.createOffer();
44
+ await pc.setLocalDescription(offer);
45
+ room.sendOffer(peer.peerId, offer);
46
+
47
+ // Send ICE candidates as they're discovered
48
+ pc.onicecandidate = (e) => {
49
+ if (e.candidate) {
50
+ room.sendIceCandidate(peer.peerId, e.candidate);
51
+ }
52
+ };
53
+ });
54
+
55
+ // Handle incoming signals
56
+ room.on("signal", async (msg) => {
57
+ switch (msg.type) {
58
+ case "offer":
59
+ // Set remote description, create answer, send it back
60
+ break;
61
+ case "answer":
62
+ // Set remote description
63
+ break;
64
+ case "ice-candidate":
65
+ // Add ICE candidate
66
+ break;
67
+ case "bye":
68
+ // Peer hung up
69
+ break;
70
+ }
71
+ });
72
+ ```
73
+
74
+ ## API Reference
75
+
76
+ ### `NoLagSignal`
77
+
78
+ #### Constructor
79
+
80
+ ```typescript
81
+ const signal = new NoLagSignal(token: string, options?: NoLagSignalOptions);
82
+ ```
83
+
84
+ **Options:**
85
+
86
+ | Option | Type | Default | Description |
87
+ |--------|------|---------|-------------|
88
+ | `metadata` | `Record<string, unknown>` | — | Custom peer metadata |
89
+ | `debug` | `boolean` | `false` | Enable debug logging |
90
+ | `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
91
+
92
+ #### Methods
93
+
94
+ | Method | Returns | Description |
95
+ |--------|---------|-------------|
96
+ | `connect()` | `Promise<void>` | Connect to NoLag |
97
+ | `disconnect()` | `void` | Disconnect |
98
+ | `joinRoom(name)` | `SignalRoom` | Join a signaling room |
99
+ | `leaveRoom(name)` | `void` | Leave a room |
100
+ | `getRooms()` | `SignalRoom[]` | Get all joined rooms |
101
+ | `getOnlinePeers()` | `Peer[]` | Get all online peers |
102
+
103
+ #### Events
104
+
105
+ | Event | Payload | Description |
106
+ |-------|---------|-------------|
107
+ | `connected` | — | Connected to NoLag |
108
+ | `disconnected` | — | Disconnected |
109
+ | `reconnected` | — | Reconnected after disconnect |
110
+ | `error` | `Error` | Connection or protocol error |
111
+ | `peerOnline` | `Peer` | A peer came online |
112
+ | `peerOffline` | `Peer` | A peer went offline |
113
+
114
+ ### `SignalRoom`
115
+
116
+ #### Methods
117
+
118
+ | Method | Returns | Description |
119
+ |--------|---------|-------------|
120
+ | `sendOffer(toPeerId, offer)` | `void` | Send an SDP offer |
121
+ | `sendAnswer(toPeerId, answer)` | `void` | Send an SDP answer |
122
+ | `sendIceCandidate(toPeerId, candidate)` | `void` | Send an ICE candidate |
123
+ | `sendBye(toPeerId)` | `void` | Signal call end |
124
+ | `signal(toPeerId, type, payload)` | `void` | Send a raw signal message |
125
+ | `getPeers()` | `Peer[]` | Get peers in this room |
126
+ | `getPeer(peerId)` | `Peer \| undefined` | Get a specific peer |
127
+
128
+ #### Events
129
+
130
+ | Event | Payload | Description |
131
+ |-------|---------|-------------|
132
+ | `signal` | `SignalMessage` | Incoming signal (offer/answer/ICE/bye) |
133
+ | `peerJoined` | `Peer` | Peer joined the room |
134
+ | `peerLeft` | `Peer` | Peer left the room |
135
+
136
+ ## Types
137
+
138
+ ```typescript
139
+ interface Peer {
140
+ peerId: string;
141
+ actorTokenId: string;
142
+ connectionState: string;
143
+ metadata?: Record<string, unknown>;
144
+ joinedAt: number;
145
+ isLocal: boolean;
146
+ }
147
+
148
+ interface SignalMessage {
149
+ id: string;
150
+ type: SignalType;
151
+ fromPeerId: string;
152
+ toPeerId: string;
153
+ payload: unknown;
154
+ timestamp: number;
155
+ }
156
+
157
+ type SignalType = "offer" | "answer" | "ice-candidate" | "renegotiate" | "bye";
158
+ ```
159
+
160
+ ## License
161
+
162
+ MIT
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tiny typed event emitter — framework-agnostic base for NoLag SDKs.
3
+ *
4
+ * EventMap is a record of event name → tuple of handler arguments.
5
+ */
6
+ export declare class EventEmitter<EventMap extends {
7
+ [K in keyof EventMap]: unknown[];
8
+ }> {
9
+ private _handlers;
10
+ on<K extends keyof EventMap>(event: K, handler: (...args: EventMap[K]) => void): this;
11
+ off<K extends keyof EventMap>(event: K, handler?: (...args: EventMap[K]) => void): this;
12
+ removeAllListeners(): this;
13
+ protected emit<K extends keyof EventMap>(event: K, ...args: EventMap[K]): void;
14
+ listenerCount<K extends keyof EventMap>(event: K): number;
15
+ }
@@ -0,0 +1,83 @@
1
+ import { EventEmitter } from './EventEmitter';
2
+ import { SignalRoom } from './SignalRoom';
3
+ import type { NoLagSignalOptions, SignalClientEvents, Peer } from './types';
4
+ /**
5
+ * NoLagSignal — high-level WebRTC signaling SDK built on @nolag/js-sdk.
6
+ *
7
+ * Provides peer discovery, offer/answer/ICE exchange, and global presence
8
+ * tracking — all framework-agnostic via events.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { NoLagSignal } from '@nolag/signal';
13
+ *
14
+ * const signal = new NoLagSignal(token, { debug: true });
15
+ *
16
+ * signal.on('connected', () => console.log('Connected!'));
17
+ * signal.on('peerOnline', (peer) => console.log(peer.peerId, 'is online'));
18
+ *
19
+ * await signal.connect();
20
+ *
21
+ * const room = signal.joinRoom('call-room');
22
+ * room.on('signal', (msg) => {
23
+ * if (msg.type === 'offer') handleOffer(msg);
24
+ * });
25
+ * room.sendOffer(remotePeerId, offer);
26
+ * ```
27
+ */
28
+ export declare class NoLagSignal extends EventEmitter<SignalClientEvents> {
29
+ private _token;
30
+ private _options;
31
+ private _client;
32
+ private _localPeer;
33
+ private _rooms;
34
+ private _lobby;
35
+ private _onlinePeers;
36
+ private _actorToPeerId;
37
+ private _peerId;
38
+ private _log;
39
+ constructor(token: string, options?: NoLagSignalOptions);
40
+ /** Whether the underlying connection is established */
41
+ get connected(): boolean;
42
+ /** The local peer's info (available after connect) */
43
+ get localPeer(): Peer | null;
44
+ /** All currently joined rooms */
45
+ get rooms(): Map<string, SignalRoom>;
46
+ /**
47
+ * Connect to NoLag and set up global presence.
48
+ */
49
+ connect(): Promise<void>;
50
+ /**
51
+ * Disconnect from NoLag and clean up all rooms.
52
+ */
53
+ disconnect(): void;
54
+ /**
55
+ * Join a signaling room. Creates, subscribes, and activates it.
56
+ * Returns an existing room if already joined.
57
+ */
58
+ joinRoom(name: string): SignalRoom;
59
+ /**
60
+ * Leave a signaling room. Fully unsubscribes and removes it.
61
+ */
62
+ leaveRoom(name: string): void;
63
+ /**
64
+ * Get all joined rooms.
65
+ */
66
+ getRooms(): SignalRoom[];
67
+ /**
68
+ * Get all peers currently online across all rooms.
69
+ */
70
+ getOnlinePeers(): Peer[];
71
+ private _subscribeRoom;
72
+ private _handleRoomPresenceJoin;
73
+ private _handleRoomPresenceLeave;
74
+ private _handleRoomPresenceUpdate;
75
+ private _setupLobby;
76
+ private _handleLobbyJoin;
77
+ private _handleLobbyLeave;
78
+ private _handleLobbyUpdate;
79
+ private _hydrateOnlinePeers;
80
+ private _presenceToPeer;
81
+ private _findPeerIdByActorId;
82
+ private _restoreRooms;
83
+ }
@@ -0,0 +1,40 @@
1
+ import type { Peer, SignalPresenceData } from './types';
2
+ /**
3
+ * Maps actorTokenId ↔ Peer, filtering self.
4
+ */
5
+ export declare class PeerManager {
6
+ private _peers;
7
+ private _actorToPeerId;
8
+ private _localActorId;
9
+ constructor(localActorId: string);
10
+ /**
11
+ * Add or update a peer from presence data.
12
+ * Returns the Peer if it's a remote peer, null if it's self.
13
+ */
14
+ addFromPresence(actorTokenId: string, presence: SignalPresenceData, joinedAt?: number): Peer | null;
15
+ /**
16
+ * Remove a peer by actorTokenId.
17
+ * Returns the removed peer, or null if not found / is self.
18
+ */
19
+ removeByActorId(actorTokenId: string): Peer | null;
20
+ /**
21
+ * Get a peer by peerId.
22
+ */
23
+ getPeer(peerId: string): Peer | undefined;
24
+ /**
25
+ * Get a peer by actorTokenId.
26
+ */
27
+ getPeerByActorId(actorTokenId: string): Peer | undefined;
28
+ /**
29
+ * Get all remote peers.
30
+ */
31
+ getAll(): Peer[];
32
+ /**
33
+ * Get the peers Map (readonly view).
34
+ */
35
+ get peers(): Map<string, Peer>;
36
+ /**
37
+ * Clear all tracked peers.
38
+ */
39
+ clear(): void;
40
+ }
@@ -0,0 +1,65 @@
1
+ import type { RoomContext } from '@nolag/js-sdk';
2
+ import { EventEmitter } from './EventEmitter';
3
+ import type { SignalRoomEvents, SignalType, Peer, SignalPresenceData, ResolvedSignalOptions } from './types';
4
+ /**
5
+ * SignalRoom — a single signaling room for WebRTC peer discovery and exchange.
6
+ *
7
+ * Created via `NoLagSignal.joinRoom(name)`. Do not instantiate directly.
8
+ */
9
+ export declare class SignalRoom extends EventEmitter<SignalRoomEvents> {
10
+ /** Room name */
11
+ readonly name: string;
12
+ private _roomContext;
13
+ private _localPeer;
14
+ private _options;
15
+ private _peerManager;
16
+ private _log;
17
+ /** @internal */
18
+ constructor(name: string, roomContext: RoomContext, localPeer: Peer, options: ResolvedSignalOptions, log: (...args: unknown[]) => void);
19
+ /** All remote peers currently in this room */
20
+ get peers(): Map<string, Peer>;
21
+ /**
22
+ * Send an SDP offer to a specific peer.
23
+ */
24
+ sendOffer(toPeerId: string, offer: RTCSessionDescriptionInit): void;
25
+ /**
26
+ * Send an SDP answer to a specific peer.
27
+ */
28
+ sendAnswer(toPeerId: string, answer: RTCSessionDescriptionInit): void;
29
+ /**
30
+ * Send an ICE candidate to a specific peer.
31
+ */
32
+ sendIceCandidate(toPeerId: string, candidate: RTCIceCandidateInit): void;
33
+ /**
34
+ * Send a bye signal to a specific peer (graceful close).
35
+ */
36
+ sendBye(toPeerId: string): void;
37
+ /**
38
+ * Send a generic signal message to a specific peer.
39
+ */
40
+ signal(toPeerId: string, type: SignalType, payload: RTCSessionDescriptionInit | RTCIceCandidateInit | Record<string, unknown>): void;
41
+ /**
42
+ * Get all remote peers in this room.
43
+ */
44
+ getPeers(): Peer[];
45
+ /**
46
+ * Get a specific peer by peerId.
47
+ */
48
+ getPeer(peerId: string): Peer | undefined;
49
+ /** @internal Subscribe to signaling topic and attach listeners */
50
+ _subscribe(): void;
51
+ /** @internal Set presence and fetch room members */
52
+ _activate(): void;
53
+ /** @internal Re-set presence after reconnect */
54
+ _updateLocalPresence(): void;
55
+ /** @internal Handle a presence:join event */
56
+ _handlePresenceJoin(actorTokenId: string, presenceData: SignalPresenceData): void;
57
+ /** @internal Handle a presence:leave event */
58
+ _handlePresenceLeave(actorTokenId: string): void;
59
+ /** @internal Handle a presence:update event */
60
+ _handlePresenceUpdate(actorTokenId: string, presenceData: SignalPresenceData): void;
61
+ /** @internal Unsubscribe and clean up */
62
+ _cleanup(): void;
63
+ private _handleIncomingSignal;
64
+ private _setPresence;
65
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @nolag/signal — Browser entry point
3
+ */
4
+ export { NoLagSignal } from './NoLagSignal';
5
+ export { SignalRoom } from './SignalRoom';
6
+ export { EventEmitter } from './EventEmitter';
7
+ export type { NoLagSignalOptions, ResolvedSignalOptions, SignalType, SignalMessage, Peer, SignalPresenceData, SignalClientEvents, SignalRoomEvents, } from './types';
@@ -0,0 +1,2 @@
1
+ import{NoLag as e}from"@nolag/js-sdk";class t{constructor(){this._handlers=new Map}on(e,t){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t),this}off(e,t){return t?this._handlers.get(e)?.delete(t):this._handlers.delete(e),this}removeAllListeners(){return this._handlers.clear(),this}emit(e,...t){const 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};
2
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,6 @@
1
+ /** Default app name for NoLag signal SDK */
2
+ export declare const DEFAULT_APP_NAME = "signal";
3
+ /** Topic name for signaling messages within a room */
4
+ export declare const TOPIC_SIGNALING = "signaling";
5
+ /** Lobby ID for global online presence */
6
+ export declare const LOBBY_ID = "online";