@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/dist/index.mjs ADDED
@@ -0,0 +1,665 @@
1
+ import { NoLag } from '@nolag/js-sdk';
2
+
3
+ /**
4
+ * Tiny typed event emitter — framework-agnostic base for NoLag SDKs.
5
+ *
6
+ * EventMap is a record of event name → tuple of handler arguments.
7
+ */
8
+ class EventEmitter {
9
+ constructor() {
10
+ this._handlers = new Map();
11
+ }
12
+ on(event, handler) {
13
+ if (!this._handlers.has(event)) {
14
+ this._handlers.set(event, new Set());
15
+ }
16
+ this._handlers.get(event).add(handler);
17
+ return this;
18
+ }
19
+ off(event, handler) {
20
+ if (handler) {
21
+ this._handlers.get(event)?.delete(handler);
22
+ }
23
+ else {
24
+ this._handlers.delete(event);
25
+ }
26
+ return this;
27
+ }
28
+ removeAllListeners() {
29
+ this._handlers.clear();
30
+ return this;
31
+ }
32
+ emit(event, ...args) {
33
+ const handlers = this._handlers.get(event);
34
+ if (!handlers)
35
+ return;
36
+ for (const handler of handlers) {
37
+ try {
38
+ handler(...args);
39
+ }
40
+ catch (e) {
41
+ console.error(`Error in ${String(event)} handler:`, e);
42
+ }
43
+ }
44
+ }
45
+ listenerCount(event) {
46
+ return this._handlers.get(event)?.size ?? 0;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Maps actorTokenId ↔ Peer, filtering self.
52
+ */
53
+ class PeerManager {
54
+ constructor(localActorId) {
55
+ this._peers = new Map();
56
+ this._actorToPeerId = new Map();
57
+ this._localActorId = localActorId;
58
+ }
59
+ /**
60
+ * Add or update a peer from presence data.
61
+ * Returns the Peer if it's a remote peer, null if it's self.
62
+ */
63
+ addFromPresence(actorTokenId, presence, joinedAt) {
64
+ const isLocal = actorTokenId === this._localActorId;
65
+ // Skip self
66
+ if (isLocal)
67
+ return null;
68
+ const existing = this._actorToPeerId.get(actorTokenId);
69
+ const peerId = presence.peerId || existing || actorTokenId;
70
+ const peer = {
71
+ peerId,
72
+ actorTokenId,
73
+ connectionState: 'new',
74
+ metadata: presence.metadata,
75
+ joinedAt: joinedAt || Date.now(),
76
+ isLocal: false,
77
+ };
78
+ this._peers.set(peerId, peer);
79
+ this._actorToPeerId.set(actorTokenId, peerId);
80
+ return peer;
81
+ }
82
+ /**
83
+ * Remove a peer by actorTokenId.
84
+ * Returns the removed peer, or null if not found / is self.
85
+ */
86
+ removeByActorId(actorTokenId) {
87
+ if (actorTokenId === this._localActorId)
88
+ return null;
89
+ const peerId = this._actorToPeerId.get(actorTokenId);
90
+ if (!peerId)
91
+ return null;
92
+ const peer = this._peers.get(peerId) || null;
93
+ this._peers.delete(peerId);
94
+ this._actorToPeerId.delete(actorTokenId);
95
+ return peer;
96
+ }
97
+ /**
98
+ * Get a peer by peerId.
99
+ */
100
+ getPeer(peerId) {
101
+ return this._peers.get(peerId);
102
+ }
103
+ /**
104
+ * Get a peer by actorTokenId.
105
+ */
106
+ getPeerByActorId(actorTokenId) {
107
+ const peerId = this._actorToPeerId.get(actorTokenId);
108
+ return peerId ? this._peers.get(peerId) : undefined;
109
+ }
110
+ /**
111
+ * Get all remote peers.
112
+ */
113
+ getAll() {
114
+ return Array.from(this._peers.values());
115
+ }
116
+ /**
117
+ * Get the peers Map (readonly view).
118
+ */
119
+ get peers() {
120
+ return this._peers;
121
+ }
122
+ /**
123
+ * Clear all tracked peers.
124
+ */
125
+ clear() {
126
+ this._peers.clear();
127
+ this._actorToPeerId.clear();
128
+ }
129
+ }
130
+
131
+ function generateId() {
132
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
133
+ return crypto.randomUUID();
134
+ }
135
+ return 'xxxx-xxxx-xxxx-xxxx'.replace(/x/g, () => Math.floor(Math.random() * 16).toString(16));
136
+ }
137
+ function createLogger(prefix, enabled) {
138
+ if (!enabled) {
139
+ return (..._args) => { };
140
+ }
141
+ return (...args) => {
142
+ console.log(`[${prefix}]`, ...args);
143
+ };
144
+ }
145
+
146
+ /** Default app name for NoLag signal SDK */
147
+ const DEFAULT_APP_NAME = 'signal';
148
+ /** Topic name for signaling messages within a room */
149
+ const TOPIC_SIGNALING = 'signaling';
150
+ /** Lobby ID for global online presence */
151
+ const LOBBY_ID = 'online';
152
+
153
+ /**
154
+ * SignalRoom — a single signaling room for WebRTC peer discovery and exchange.
155
+ *
156
+ * Created via `NoLagSignal.joinRoom(name)`. Do not instantiate directly.
157
+ */
158
+ class SignalRoom extends EventEmitter {
159
+ /** @internal */
160
+ constructor(name, roomContext, localPeer, options, log) {
161
+ super();
162
+ this.name = name;
163
+ this._roomContext = roomContext;
164
+ this._localPeer = localPeer;
165
+ this._options = options;
166
+ this._log = log;
167
+ this._peerManager = new PeerManager(localPeer.actorTokenId);
168
+ }
169
+ // ============ Public Properties ============
170
+ /** All remote peers currently in this room */
171
+ get peers() {
172
+ return this._peerManager.peers;
173
+ }
174
+ // ============ Signaling ============
175
+ /**
176
+ * Send an SDP offer to a specific peer.
177
+ */
178
+ sendOffer(toPeerId, offer) {
179
+ this.signal(toPeerId, 'offer', offer);
180
+ }
181
+ /**
182
+ * Send an SDP answer to a specific peer.
183
+ */
184
+ sendAnswer(toPeerId, answer) {
185
+ this.signal(toPeerId, 'answer', answer);
186
+ }
187
+ /**
188
+ * Send an ICE candidate to a specific peer.
189
+ */
190
+ sendIceCandidate(toPeerId, candidate) {
191
+ this.signal(toPeerId, 'ice-candidate', candidate);
192
+ }
193
+ /**
194
+ * Send a bye signal to a specific peer (graceful close).
195
+ */
196
+ sendBye(toPeerId) {
197
+ this.signal(toPeerId, 'bye', {});
198
+ }
199
+ /**
200
+ * Send a generic signal message to a specific peer.
201
+ */
202
+ signal(toPeerId, type, payload) {
203
+ const message = {
204
+ id: generateId(),
205
+ type,
206
+ fromPeerId: this._localPeer.peerId,
207
+ toPeerId,
208
+ payload,
209
+ timestamp: Date.now(),
210
+ };
211
+ this._log('Sending signal:', type, '→', toPeerId);
212
+ this._roomContext.emit(TOPIC_SIGNALING, message, { echo: false });
213
+ }
214
+ // ============ Peers ============
215
+ /**
216
+ * Get all remote peers in this room.
217
+ */
218
+ getPeers() {
219
+ return this._peerManager.getAll();
220
+ }
221
+ /**
222
+ * Get a specific peer by peerId.
223
+ */
224
+ getPeer(peerId) {
225
+ return this._peerManager.getPeer(peerId);
226
+ }
227
+ // ============ Internal (called by NoLagSignal) ============
228
+ /** @internal Subscribe to signaling topic and attach listeners */
229
+ _subscribe() {
230
+ this._log('Room subscribe:', this.name);
231
+ this._roomContext.subscribe(TOPIC_SIGNALING);
232
+ this._roomContext.on(TOPIC_SIGNALING, (data) => {
233
+ this._handleIncomingSignal(data);
234
+ });
235
+ }
236
+ /** @internal Set presence and fetch room members */
237
+ _activate() {
238
+ this._log('Room activate:', this.name);
239
+ this._setPresence();
240
+ this._roomContext.fetchPresence().then((actors) => {
241
+ this._log('Room presence fetched:', this.name, actors.length, 'actors');
242
+ for (const actor of actors) {
243
+ if (actor.presence) {
244
+ const peer = this._peerManager.addFromPresence(actor.actorTokenId, actor.presence, actor.joinedAt);
245
+ if (peer) {
246
+ this.emit('peerJoined', peer);
247
+ }
248
+ }
249
+ }
250
+ }).catch((err) => {
251
+ this._log('Failed to fetch room presence:', err);
252
+ });
253
+ }
254
+ /** @internal Re-set presence after reconnect */
255
+ _updateLocalPresence() {
256
+ this._setPresence();
257
+ }
258
+ /** @internal Handle a presence:join event */
259
+ _handlePresenceJoin(actorTokenId, presenceData) {
260
+ const peer = this._peerManager.addFromPresence(actorTokenId, presenceData);
261
+ if (peer) {
262
+ this._log('Peer joined room:', this.name, peer.peerId);
263
+ this.emit('peerJoined', peer);
264
+ }
265
+ }
266
+ /** @internal Handle a presence:leave event */
267
+ _handlePresenceLeave(actorTokenId) {
268
+ const peer = this._peerManager.removeByActorId(actorTokenId);
269
+ if (peer) {
270
+ this._log('Peer left room:', this.name, peer.peerId);
271
+ this.emit('peerLeft', peer);
272
+ }
273
+ }
274
+ /** @internal Handle a presence:update event */
275
+ _handlePresenceUpdate(actorTokenId, presenceData) {
276
+ this._peerManager.addFromPresence(actorTokenId, presenceData);
277
+ }
278
+ /** @internal Unsubscribe and clean up */
279
+ _cleanup() {
280
+ this._log('Room cleanup:', this.name);
281
+ this._roomContext.unsubscribe(TOPIC_SIGNALING);
282
+ this._roomContext.off(TOPIC_SIGNALING);
283
+ this._peerManager.clear();
284
+ this.removeAllListeners();
285
+ }
286
+ // ============ Private ============
287
+ _handleIncomingSignal(data) {
288
+ const message = data;
289
+ // Only process messages targeted at this peer
290
+ if (message.toPeerId !== this._localPeer.peerId)
291
+ return;
292
+ this._log('Received signal:', message.type, 'from', message.fromPeerId);
293
+ this.emit('signal', message);
294
+ }
295
+ _setPresence() {
296
+ const presenceData = {
297
+ peerId: this._localPeer.peerId,
298
+ metadata: this._localPeer.metadata,
299
+ };
300
+ this._roomContext.setPresence(presenceData);
301
+ }
302
+ }
303
+
304
+ /**
305
+ * NoLagSignal — high-level WebRTC signaling SDK built on @nolag/js-sdk.
306
+ *
307
+ * Provides peer discovery, offer/answer/ICE exchange, and global presence
308
+ * tracking — all framework-agnostic via events.
309
+ *
310
+ * @example
311
+ * ```typescript
312
+ * import { NoLagSignal } from '@nolag/signal';
313
+ *
314
+ * const signal = new NoLagSignal(token, { debug: true });
315
+ *
316
+ * signal.on('connected', () => console.log('Connected!'));
317
+ * signal.on('peerOnline', (peer) => console.log(peer.peerId, 'is online'));
318
+ *
319
+ * await signal.connect();
320
+ *
321
+ * const room = signal.joinRoom('call-room');
322
+ * room.on('signal', (msg) => {
323
+ * if (msg.type === 'offer') handleOffer(msg);
324
+ * });
325
+ * room.sendOffer(remotePeerId, offer);
326
+ * ```
327
+ */
328
+ class NoLagSignal extends EventEmitter {
329
+ constructor(token, options = {}) {
330
+ super();
331
+ this._client = null;
332
+ this._localPeer = null;
333
+ this._rooms = new Map();
334
+ this._lobby = null;
335
+ this._onlinePeers = new Map();
336
+ this._actorToPeerId = new Map();
337
+ this._token = token;
338
+ this._peerId = generateId();
339
+ this._options = {
340
+ metadata: options.metadata,
341
+ appName: options.appName ?? DEFAULT_APP_NAME,
342
+ url: options.url,
343
+ debug: options.debug ?? false,
344
+ reconnect: options.reconnect ?? true,
345
+ };
346
+ this._log = createLogger('NoLagSignal', this._options.debug);
347
+ }
348
+ // ============ Public Properties ============
349
+ /** Whether the underlying connection is established */
350
+ get connected() {
351
+ return this._client?.connected ?? false;
352
+ }
353
+ /** The local peer's info (available after connect) */
354
+ get localPeer() {
355
+ return this._localPeer;
356
+ }
357
+ /** All currently joined rooms */
358
+ get rooms() {
359
+ return this._rooms;
360
+ }
361
+ // ============ Lifecycle ============
362
+ /**
363
+ * Connect to NoLag and set up global presence.
364
+ */
365
+ async connect() {
366
+ this._log('Connecting...');
367
+ const clientOptions = {
368
+ debug: this._options.debug,
369
+ reconnect: this._options.reconnect,
370
+ };
371
+ if (this._options.url) {
372
+ clientOptions.url = this._options.url;
373
+ }
374
+ this._client = NoLag(this._token, clientOptions);
375
+ // Wire client lifecycle events
376
+ this._client.on('connect', () => {
377
+ this._log('Connected');
378
+ if (this._rooms.size > 0) {
379
+ this._log('Reconnected — restoring rooms...');
380
+ this._restoreRooms();
381
+ this.emit('reconnected');
382
+ }
383
+ });
384
+ this._client.on('disconnect', (reason) => {
385
+ this._log('Disconnected:', reason);
386
+ this.emit('disconnected', reason);
387
+ });
388
+ this._client.on('reconnect', () => {
389
+ this._log('Reconnecting...');
390
+ });
391
+ this._client.on('error', (error) => {
392
+ this._log('Error:', error);
393
+ this.emit('error', error);
394
+ });
395
+ // Connect
396
+ await this._client.connect();
397
+ // Wire room-level presence events
398
+ this._client.on('presence:join', (data) => {
399
+ this._handleRoomPresenceJoin(data);
400
+ });
401
+ this._client.on('presence:leave', (data) => {
402
+ this._handleRoomPresenceLeave(data);
403
+ });
404
+ this._client.on('presence:update', (data) => {
405
+ this._handleRoomPresenceUpdate(data);
406
+ });
407
+ // Create local peer
408
+ this._localPeer = {
409
+ peerId: this._peerId,
410
+ actorTokenId: this._client.actorId,
411
+ connectionState: 'new',
412
+ metadata: this._options.metadata,
413
+ joinedAt: Date.now(),
414
+ isLocal: true,
415
+ };
416
+ this._log('Local peer:', this._localPeer.peerId, '→', this._localPeer.actorTokenId);
417
+ // Set up lobby for global presence
418
+ await this._setupLobby();
419
+ // Emit connected now that _localPeer and lobby are ready
420
+ this.emit('connected');
421
+ // Deferred lobby refetch to catch peers who joined during the setup window
422
+ setTimeout(() => {
423
+ if (this._lobby && this._client?.connected) {
424
+ this._lobby.fetchPresence().then((state) => {
425
+ this._hydrateOnlinePeers(state);
426
+ }).catch(() => { });
427
+ }
428
+ }, 2000);
429
+ }
430
+ /**
431
+ * Disconnect from NoLag and clean up all rooms.
432
+ */
433
+ disconnect() {
434
+ this._log('Disconnecting...');
435
+ // Clean up rooms
436
+ for (const name of [...this._rooms.keys()]) {
437
+ this.leaveRoom(name);
438
+ }
439
+ // Unsubscribe from lobby
440
+ this._lobby?.unsubscribe();
441
+ this._lobby = null;
442
+ // Disconnect client
443
+ this._client?.disconnect();
444
+ this._client = null;
445
+ // Clear state
446
+ this._onlinePeers.clear();
447
+ this._actorToPeerId.clear();
448
+ this._localPeer = null;
449
+ }
450
+ // ============ Room Management ============
451
+ /**
452
+ * Join a signaling room. Creates, subscribes, and activates it.
453
+ * Returns an existing room if already joined.
454
+ */
455
+ joinRoom(name) {
456
+ if (!this._client || !this._localPeer) {
457
+ throw new Error('Not connected — call connect() first');
458
+ }
459
+ let room = this._rooms.get(name);
460
+ if (!room) {
461
+ room = this._subscribeRoom(name);
462
+ room._activate();
463
+ }
464
+ return room;
465
+ }
466
+ /**
467
+ * Leave a signaling room. Fully unsubscribes and removes it.
468
+ */
469
+ leaveRoom(name) {
470
+ const room = this._rooms.get(name);
471
+ if (!room)
472
+ return;
473
+ this._log('Leaving room:', name);
474
+ room._cleanup();
475
+ this._rooms.delete(name);
476
+ }
477
+ /**
478
+ * Get all joined rooms.
479
+ */
480
+ getRooms() {
481
+ return Array.from(this._rooms.values());
482
+ }
483
+ // ============ Global Presence ============
484
+ /**
485
+ * Get all peers currently online across all rooms.
486
+ */
487
+ getOnlinePeers() {
488
+ return Array.from(this._onlinePeers.values());
489
+ }
490
+ // ============ Private: Room Setup ============
491
+ _subscribeRoom(name) {
492
+ if (!this._client || !this._localPeer) {
493
+ throw new Error('Not connected — call connect() first');
494
+ }
495
+ this._log('Subscribing room:', name);
496
+ const roomContext = this._client.setApp(this._options.appName).setRoom(name);
497
+ const room = new SignalRoom(name, roomContext, this._localPeer, this._options, createLogger(`SignalRoom:${name}`, this._options.debug));
498
+ this._rooms.set(name, room);
499
+ room._subscribe();
500
+ return room;
501
+ }
502
+ // ============ Private: Room Presence ============
503
+ _handleRoomPresenceJoin(data) {
504
+ if (data.actorTokenId === this._localPeer?.actorTokenId)
505
+ return;
506
+ const presenceData = data.presence;
507
+ if (!presenceData?.peerId)
508
+ return;
509
+ const peer = this._presenceToPeer(data.actorTokenId, presenceData);
510
+ this._actorToPeerId.set(data.actorTokenId, peer.peerId);
511
+ if (!this._onlinePeers.has(peer.peerId)) {
512
+ this._onlinePeers.set(peer.peerId, peer);
513
+ this.emit('peerOnline', peer);
514
+ }
515
+ // Route to all rooms
516
+ for (const room of this._rooms.values()) {
517
+ room._handlePresenceJoin(data.actorTokenId, presenceData);
518
+ }
519
+ }
520
+ _handleRoomPresenceLeave(data) {
521
+ if (data.actorTokenId === this._localPeer?.actorTokenId)
522
+ return;
523
+ // Route to all rooms
524
+ for (const room of this._rooms.values()) {
525
+ room._handlePresenceLeave(data.actorTokenId);
526
+ }
527
+ }
528
+ _handleRoomPresenceUpdate(data) {
529
+ if (data.actorTokenId === this._localPeer?.actorTokenId)
530
+ return;
531
+ const presenceData = data.presence;
532
+ if (!presenceData?.peerId)
533
+ return;
534
+ if (this._onlinePeers.has(presenceData.peerId)) {
535
+ const peer = this._presenceToPeer(data.actorTokenId, presenceData);
536
+ this._onlinePeers.set(peer.peerId, peer);
537
+ }
538
+ // Route to all rooms
539
+ for (const room of this._rooms.values()) {
540
+ room._handlePresenceUpdate(data.actorTokenId, presenceData);
541
+ }
542
+ }
543
+ // ============ Private: Lobby ============
544
+ async _setupLobby() {
545
+ if (!this._client)
546
+ return;
547
+ this._lobby = this._client.setApp(this._options.appName).setLobby(LOBBY_ID);
548
+ const lobbyHandler = (type) => (data) => {
549
+ const event = data;
550
+ if (type === 'join')
551
+ this._handleLobbyJoin(event);
552
+ else if (type === 'leave')
553
+ this._handleLobbyLeave(event);
554
+ else
555
+ this._handleLobbyUpdate(event);
556
+ };
557
+ this._client.on('lobbyPresence:join', lobbyHandler('join'));
558
+ this._client.on('lobbyPresence:leave', lobbyHandler('leave'));
559
+ this._client.on('lobbyPresence:update', lobbyHandler('update'));
560
+ try {
561
+ const initialState = await this._lobby.subscribe();
562
+ this._hydrateOnlinePeers(initialState);
563
+ this._log('Lobby subscribed, online peers:', this._onlinePeers.size);
564
+ }
565
+ catch (err) {
566
+ this._log('Lobby subscription failed:', err);
567
+ }
568
+ }
569
+ _handleLobbyJoin(event) {
570
+ const { actorId, data } = event;
571
+ if (actorId === this._localPeer?.actorTokenId)
572
+ return;
573
+ const presenceData = data;
574
+ if (!presenceData.peerId)
575
+ return;
576
+ const peer = this._presenceToPeer(actorId, presenceData);
577
+ this._actorToPeerId.set(actorId, peer.peerId);
578
+ if (!this._onlinePeers.has(peer.peerId)) {
579
+ this._onlinePeers.set(peer.peerId, peer);
580
+ this.emit('peerOnline', peer);
581
+ }
582
+ }
583
+ _handleLobbyLeave(event) {
584
+ const { actorId, data } = event;
585
+ if (actorId === this._localPeer?.actorTokenId)
586
+ return;
587
+ const presenceData = data;
588
+ const peerId = presenceData?.peerId
589
+ || this._actorToPeerId.get(actorId)
590
+ || this._findPeerIdByActorId(actorId);
591
+ if (peerId) {
592
+ const peer = this._onlinePeers.get(peerId);
593
+ if (peer) {
594
+ this._onlinePeers.delete(peerId);
595
+ this._actorToPeerId.delete(actorId);
596
+ this.emit('peerOffline', peer);
597
+ }
598
+ }
599
+ }
600
+ _handleLobbyUpdate(event) {
601
+ const { actorId, data } = event;
602
+ if (actorId === this._localPeer?.actorTokenId)
603
+ return;
604
+ const presenceData = data;
605
+ if (!presenceData.peerId)
606
+ return;
607
+ const peer = this._presenceToPeer(actorId, presenceData);
608
+ this._onlinePeers.set(peer.peerId, peer);
609
+ }
610
+ _hydrateOnlinePeers(state) {
611
+ for (const roomId of Object.keys(state)) {
612
+ const roomPresence = state[roomId];
613
+ for (const actorId of Object.keys(roomPresence)) {
614
+ if (actorId === this._localPeer?.actorTokenId)
615
+ continue;
616
+ const raw = roomPresence[actorId];
617
+ const presenceData = (raw?.presence ?? raw);
618
+ if (presenceData?.peerId) {
619
+ const peer = this._presenceToPeer(actorId, presenceData);
620
+ this._actorToPeerId.set(actorId, peer.peerId);
621
+ if (!this._onlinePeers.has(peer.peerId)) {
622
+ this._onlinePeers.set(peer.peerId, peer);
623
+ this.emit('peerOnline', peer);
624
+ }
625
+ }
626
+ }
627
+ }
628
+ }
629
+ // ============ Private: Helpers ============
630
+ _presenceToPeer(actorTokenId, data) {
631
+ return {
632
+ peerId: data.peerId,
633
+ actorTokenId,
634
+ connectionState: 'new',
635
+ metadata: data.metadata,
636
+ joinedAt: Date.now(),
637
+ isLocal: false,
638
+ };
639
+ }
640
+ _findPeerIdByActorId(actorTokenId) {
641
+ for (const peer of this._onlinePeers.values()) {
642
+ if (peer.actorTokenId === actorTokenId)
643
+ return peer.peerId;
644
+ }
645
+ return undefined;
646
+ }
647
+ _restoreRooms() {
648
+ // On reconnect, js-sdk auto-restores subscriptions.
649
+ // Re-set presence on all active rooms.
650
+ for (const room of this._rooms.values()) {
651
+ room._updateLocalPresence();
652
+ }
653
+ // Re-fetch lobby presence
654
+ this._lobby?.fetchPresence().then((state) => {
655
+ this._onlinePeers.clear();
656
+ this._actorToPeerId.clear();
657
+ this._hydrateOnlinePeers(state);
658
+ }).catch((err) => {
659
+ this._log('Failed to re-fetch lobby presence:', err);
660
+ });
661
+ }
662
+ }
663
+
664
+ export { EventEmitter, NoLagSignal, SignalRoom };
665
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","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":[],"mappings":"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"}