@xloon/xms-client 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/room.js ADDED
@@ -0,0 +1,610 @@
1
+ // High-level client for one XMS room: one publish PeerConnection, plus one PeerConnection per
2
+ // publisher subscribed to (docs/protocol.md "Transports"). Framework-free; plain browser APIs only.
3
+ import { SignalingClient } from './signaling.js';
4
+ /** Lowest quality first: subscribers default to the last-listed (highest) layer. */
5
+ const SIMULCAST_ENCODINGS = [
6
+ { rid: 'l', scaleResolutionDownBy: 4, maxBitrate: 150_000 },
7
+ { rid: 'm', scaleResolutionDownBy: 2, maxBitrate: 500_000 },
8
+ { rid: 'h', maxBitrate: 1_500_000 },
9
+ ];
10
+ const MAX_RECONNECT_ATTEMPTS = 10;
11
+ const MAX_RECONNECT_DELAY_MS = 30_000;
12
+ /** Rejoin errors retrying won't fix. AUTH_INVALID is retried once with getToken() when given. */
13
+ const FATAL_REJOIN_ERRORS = new Set(['ROOM_NOT_FOUND', 'FORBIDDEN', 'AUTH_INVALID']);
14
+ export class XmsRoom {
15
+ roomId;
16
+ options;
17
+ signaling;
18
+ participantId;
19
+ token;
20
+ iceServers = [];
21
+ autoSubscribe;
22
+ newPeerConnection;
23
+ remote = new Map();
24
+ subscriptions = new Map();
25
+ /** What each subscription asked for, so it can be restored after a rejoin. */
26
+ subscribeOptions = new Map();
27
+ published = new Map();
28
+ /** Our participantIds from before rejoins: the server may list them until it notices they're gone. */
29
+ previousIds = new Set();
30
+ /** PeerConnections that have connected at least once. */
31
+ connectedPcs = new WeakSet();
32
+ listeners = new Map();
33
+ /** Serializes negotiations per transport: key "pub" or a publisherId. */
34
+ queues = new Map();
35
+ publisherPc = null;
36
+ left = false;
37
+ reconnecting = false;
38
+ /** Connects, authenticates and joins. Existing publishers are subscribed to automatically unless
39
+ * {@link JoinOptions.autoSubscribe} is false. If the connection later drops, the room is rejoined
40
+ * automatically (see the reconnecting/reconnected events). */
41
+ static async join(options) {
42
+ const { signaling, joined } = await connectAndJoin(options, options.token);
43
+ const room = new XmsRoom(options, signaling, joined.participantId);
44
+ room.applyJoin(joined);
45
+ return room;
46
+ }
47
+ constructor(options, signaling, participantId) {
48
+ this.roomId = options.roomId;
49
+ this.options = options;
50
+ this.signaling = signaling;
51
+ this.participantId = participantId;
52
+ this.token = options.token;
53
+ this.autoSubscribe = options.autoSubscribe ?? true;
54
+ this.newPeerConnection = options.createPeerConnection ?? ((config) => new RTCPeerConnection(config));
55
+ this.bindSignalingEvents();
56
+ }
57
+ /** This client's participantId; a new one after each rejoin. */
58
+ get localParticipantId() {
59
+ return this.participantId;
60
+ }
61
+ /** Other participants currently in the room. */
62
+ get participants() {
63
+ return [...this.remote.values()];
64
+ }
65
+ on(event, handler) {
66
+ let handlers = this.listeners.get(event);
67
+ if (!handlers) {
68
+ handlers = new Set();
69
+ this.listeners.set(event, handlers);
70
+ }
71
+ handlers.add(handler);
72
+ return () => handlers.delete(handler);
73
+ }
74
+ // --- publishing --------------------------------------------------------------------------
75
+ /**
76
+ * Publishes the stream's tracks. Call again to add a track later (e.g. turn the camera on after
77
+ * joining audio-only): a track whose kind is already published replaces that one in place, a
78
+ * new kind is added and the publish transport is renegotiated.
79
+ */
80
+ publish(stream, options = {}) {
81
+ return this.publishTracks(stream.getTracks().map((track) => ({
82
+ track, stream, simulcast: track.kind === 'video' && (options.simulcast ?? true),
83
+ })));
84
+ }
85
+ publishTracks(tracks) {
86
+ return this.enqueue('pub', async () => {
87
+ const pc = this.ensurePublisherPc();
88
+ let needsNegotiation = !pc.localDescription;
89
+ for (const published of tracks) {
90
+ const { track } = published;
91
+ const existing = pc.getTransceivers().find((t) => t.sender.track?.kind === track.kind
92
+ || (t.receiver.track.kind === track.kind && t.direction !== 'stopped'));
93
+ if (existing) {
94
+ await existing.sender.replaceTrack(track);
95
+ this.published.set(track.kind, { ...(this.published.get(track.kind) ?? published), track });
96
+ if (existing.direction !== 'sendonly') {
97
+ existing.direction = 'sendonly';
98
+ needsNegotiation = true;
99
+ }
100
+ continue;
101
+ }
102
+ pc.addTransceiver(track, {
103
+ direction: 'sendonly',
104
+ streams: [published.stream],
105
+ ...(published.simulcast ? { sendEncodings: SIMULCAST_ENCODINGS.map((e) => ({ ...e })) } : {}),
106
+ });
107
+ this.published.set(track.kind, published);
108
+ needsNegotiation = true;
109
+ }
110
+ if (needsNegotiation) {
111
+ await this.negotiatePublisher(pc);
112
+ }
113
+ });
114
+ }
115
+ /** Stops sending one kind of track (e.g. turn the camera off for good, freeing its bandwidth);
116
+ * other participants see a publisherUpdated without it. Use {@link setMuted} for a quick toggle. */
117
+ unpublishTrack(kind) {
118
+ return this.enqueue('pub', async () => {
119
+ const pc = this.publisherPc;
120
+ const transceiver = pc?.getTransceivers().find((t) => t.sender.track?.kind === kind);
121
+ if (!pc || !transceiver) {
122
+ return;
123
+ }
124
+ transceiver.sender.track?.stop();
125
+ await transceiver.sender.replaceTrack(null);
126
+ this.published.delete(kind);
127
+ transceiver.direction = 'inactive';
128
+ await this.negotiatePublisher(pc);
129
+ });
130
+ }
131
+ /** Mutes/unmutes a published track: stops its media locally and tells the room (trackMuted). */
132
+ async setMuted(kind, muted) {
133
+ const transceiver = this.publisherPc?.getTransceivers().find((t) => t.sender.track?.kind === kind);
134
+ if (!transceiver?.sender.track || !transceiver.mid) {
135
+ return;
136
+ }
137
+ transceiver.sender.track.enabled = !muted;
138
+ await this.signaling.request('track.setMuted', { trackId: transceiver.mid, muted });
139
+ }
140
+ /** Replaces the outgoing track of that kind without renegotiating (e.g. camera <-> screen). */
141
+ async replaceTrack(kind, track) {
142
+ const transceiver = this.publisherPc?.getTransceivers().find((t) => t.sender.track?.kind === kind);
143
+ if (!transceiver) {
144
+ throw new Error(`No published ${kind} track to replace`);
145
+ }
146
+ await transceiver.sender.replaceTrack(track);
147
+ const published = this.published.get(kind);
148
+ if (published) {
149
+ this.published.set(kind, { ...published, track });
150
+ }
151
+ }
152
+ /** Stops publishing entirely (stays in the room). */
153
+ unpublish() {
154
+ return this.enqueue('pub', async () => {
155
+ if (!this.publisherPc) {
156
+ return;
157
+ }
158
+ await this.signaling.request('publish.stop', {});
159
+ this.closePeerConnection(this.publisherPc);
160
+ this.publisherPc = null;
161
+ this.published.clear();
162
+ });
163
+ }
164
+ ensurePublisherPc() {
165
+ if (this.publisherPc) {
166
+ return this.publisherPc;
167
+ }
168
+ const pc = this.newPeerConnection({ iceServers: this.iceServers });
169
+ pc.onicecandidate = (event) => {
170
+ if (event.candidate) {
171
+ this.signaling.request('trickle', { transport: 'publisher', candidate: toCandidate(event.candidate) })
172
+ .catch((err) => this.emit('error', asError(err)));
173
+ }
174
+ };
175
+ pc.onicegatheringstatechange = () => {
176
+ if (pc.iceGatheringState === 'complete') {
177
+ this.signaling.request('trickleComplete', { transport: 'publisher' })
178
+ .catch((err) => this.emit('error', asError(err)));
179
+ }
180
+ };
181
+ pc.onconnectionstatechange = () => this.reconnectIfFailed(pc);
182
+ this.publisherPc = pc;
183
+ return pc;
184
+ }
185
+ async negotiatePublisher(pc) {
186
+ const offer = await pc.createOffer();
187
+ await pc.setLocalDescription(offer);
188
+ const { sdp } = await this.signaling.request('publish.offer', { sdp: offer.sdp ?? '' });
189
+ await pc.setRemoteDescription({ type: 'answer', sdp });
190
+ }
191
+ // --- subscribing -------------------------------------------------------------------------
192
+ /**
193
+ * Subscribes to a publisher (all its tracks unless {@link SubscribeOptions.trackIds} narrows it).
194
+ * Calling again for the same publisher renegotiates that subscription to the new track set.
195
+ */
196
+ subscribe(participantId, options = {}) {
197
+ this.subscribeOptions.set(participantId, options);
198
+ return this.enqueue(participantId, async () => {
199
+ const offer = await this.signaling.request('subscribe.offer', {
200
+ publisherId: participantId,
201
+ ...(options.trackIds ? { trackIds: options.trackIds } : {}),
202
+ ...(options.layers ? { layers: options.layers } : {}),
203
+ });
204
+ let subscription = this.subscriptions.get(participantId);
205
+ if (!subscription || subscription.transportId !== offer.transportId) {
206
+ if (subscription) {
207
+ this.closeSubscription(participantId);
208
+ }
209
+ subscription = this.createSubscription(participantId, offer.transportId);
210
+ }
211
+ const pc = subscription.pc;
212
+ await pc.setRemoteDescription({ type: 'offer', sdp: offer.sdp });
213
+ const answer = await pc.createAnswer();
214
+ await pc.setLocalDescription(answer);
215
+ await this.signaling.request('subscribe.answer', { transportId: offer.transportId, sdp: answer.sdp ?? '' });
216
+ this.sweepEndedTracks(participantId, subscription);
217
+ });
218
+ }
219
+ /** Switches which simulcast layer (a TrackInfo.rids entry) of a subscribed track is received. */
220
+ async setLayer(participantId, trackId, rid) {
221
+ const subscription = this.subscriptions.get(participantId);
222
+ if (!subscription) {
223
+ throw new Error(`Not subscribed to ${participantId}`);
224
+ }
225
+ await this.signaling.request('subscribe.setLayer', { transportId: subscription.transportId, trackId, rid });
226
+ const options = this.subscribeOptions.get(participantId) ?? {};
227
+ this.subscribeOptions.set(participantId, { ...options, layers: { ...options.layers, [trackId]: rid } });
228
+ }
229
+ unsubscribe(participantId) {
230
+ this.subscribeOptions.delete(participantId);
231
+ return this.enqueue(participantId, async () => {
232
+ const subscription = this.subscriptions.get(participantId);
233
+ if (!subscription) {
234
+ return;
235
+ }
236
+ await this.signaling.request('subscribe.close', { transportId: subscription.transportId });
237
+ this.closeSubscription(participantId);
238
+ });
239
+ }
240
+ createSubscription(participantId, transportId) {
241
+ const pc = this.newPeerConnection({ iceServers: this.iceServers });
242
+ const subscription = { transportId, pc, tracks: new Map() };
243
+ pc.onicecandidate = (event) => {
244
+ if (event.candidate) {
245
+ this.signaling.request('trickle', { transportId, candidate: toCandidate(event.candidate) })
246
+ .catch((err) => this.emit('error', asError(err)));
247
+ }
248
+ };
249
+ pc.onicegatheringstatechange = () => {
250
+ if (pc.iceGatheringState === 'complete') {
251
+ this.signaling.request('trickleComplete', { transportId }).catch((err) => this.emit('error', asError(err)));
252
+ }
253
+ };
254
+ pc.onconnectionstatechange = () => this.reconnectIfFailed(pc);
255
+ pc.ontrack = (event) => {
256
+ // XMS sets each track's msid stream id to the publisher's trackId.
257
+ const trackId = event.streams[0]?.id ?? event.transceiver.mid ?? event.track.id;
258
+ subscription.tracks.set(trackId, event.track);
259
+ this.emit('track', { participantId, trackId, kind: event.track.kind, track: event.track });
260
+ };
261
+ this.subscriptions.set(participantId, subscription);
262
+ return subscription;
263
+ }
264
+ /** After a renegotiation that dropped tracks, their receivers have ended: report them. */
265
+ sweepEndedTracks(participantId, subscription) {
266
+ for (const [trackId, track] of [...subscription.tracks]) {
267
+ if (track.readyState === 'ended') {
268
+ subscription.tracks.delete(trackId);
269
+ this.emit('trackEnded', { participantId, trackId });
270
+ }
271
+ }
272
+ }
273
+ closeSubscription(participantId) {
274
+ const subscription = this.subscriptions.get(participantId);
275
+ if (!subscription) {
276
+ return;
277
+ }
278
+ this.subscriptions.delete(participantId);
279
+ this.closePeerConnection(subscription.pc);
280
+ for (const trackId of subscription.tracks.keys()) {
281
+ this.emit('trackEnded', { participantId, trackId });
282
+ }
283
+ }
284
+ // --- room -------------------------------------------------------------------------------
285
+ sendChat(text) {
286
+ return this.signaling.request('chat.send', { text }).then(() => undefined);
287
+ }
288
+ /** Sends app data (reactions, raise-hand, cursors, ...) to everyone else in the room, or only to
289
+ * `options.to`. `type` is your own label (1-64 chars); `payload` any JSON, at most 16 KB. Not
290
+ * echoed back to you; at most 50 per second. */
291
+ sendData(type, payload, options = {}) {
292
+ const params = options.to ? { type, payload, to: options.to } : { type, payload };
293
+ return this.signaling.request('data.send', params).then(() => undefined);
294
+ }
295
+ /** Leaves the room and releases every transport. Local media tracks are left to the caller. */
296
+ async leave() {
297
+ if (this.left) {
298
+ return;
299
+ }
300
+ this.left = true;
301
+ try {
302
+ await this.signaling.request('room.leave', {});
303
+ }
304
+ finally {
305
+ for (const participantId of [...this.subscriptions.keys()]) {
306
+ this.closeSubscription(participantId);
307
+ }
308
+ if (this.publisherPc) {
309
+ this.closePeerConnection(this.publisherPc);
310
+ this.publisherPc = null;
311
+ }
312
+ this.signaling.disconnect();
313
+ }
314
+ }
315
+ /** The underlying PeerConnections, for diagnostics (getStats) and tests. */
316
+ peerConnections() {
317
+ const subscribers = {};
318
+ for (const [participantId, subscription] of this.subscriptions) {
319
+ subscribers[participantId] = subscription.pc;
320
+ }
321
+ return { publisher: this.publisherPc, subscribers };
322
+ }
323
+ // --- joining and rejoining ---------------------------------------------------------------
324
+ /** Takes in a room.join result: the room's participants and publishers, and the subscriptions to
325
+ * set up. On a rejoin, reports how the room changed while we were away instead of a fresh list. */
326
+ applyJoin(joined, rejoin = false) {
327
+ this.participantId = joined.participantId;
328
+ this.iceServers = joined.iceServers.map((s) => ({ urls: s.urls, username: s.username, credential: s.credential }));
329
+ const before = new Map(this.remote);
330
+ this.remote.clear();
331
+ for (const participant of joined.existingParticipants) {
332
+ if (!this.previousIds.has(participant.participantId)) {
333
+ this.remote.set(participant.participantId, { ...participant, tracks: [] });
334
+ }
335
+ }
336
+ for (const publisher of joined.existingPublishers) {
337
+ const participant = this.remote.get(publisher.publisherId);
338
+ if (participant) {
339
+ participant.tracks = publisher.tracks;
340
+ }
341
+ }
342
+ if (rejoin) {
343
+ for (const [participantId, was] of before) {
344
+ const now = this.remote.get(participantId);
345
+ if (!now) {
346
+ this.emit('participantLeft', { participantId, reason: 'left' });
347
+ }
348
+ else if (was.tracks.length > 0 && now.tracks.length === 0) {
349
+ this.emit('publisherRemoved', { participantId });
350
+ }
351
+ else if (was.tracks.length === 0 && now.tracks.length > 0) {
352
+ this.emit('publisherAdded', now);
353
+ }
354
+ else if (JSON.stringify(was.tracks) !== JSON.stringify(now.tracks)) {
355
+ this.emit('publisherUpdated', now);
356
+ }
357
+ }
358
+ for (const [participantId, participant] of this.remote) {
359
+ if (!before.has(participantId)) {
360
+ this.emit('participantJoined', participant);
361
+ if (participant.tracks.length > 0) {
362
+ this.emit('publisherAdded', participant);
363
+ }
364
+ }
365
+ }
366
+ }
367
+ for (const [participantId, participant] of this.remote) {
368
+ if (participant.tracks.length === 0) {
369
+ this.subscribeOptions.delete(participantId);
370
+ }
371
+ else if (this.autoSubscribe || this.subscribeOptions.has(participantId)) {
372
+ this.subscribe(participantId, this.subscribeOptions.get(participantId))
373
+ .catch((err) => this.emit('error', asError(err)));
374
+ }
375
+ }
376
+ }
377
+ reconnectIfFailed(pc) {
378
+ if (pc.connectionState === 'connected') {
379
+ this.connectedPcs.add(pc);
380
+ }
381
+ else if (pc.connectionState === 'failed' && this.connectedPcs.has(pc)) {
382
+ // XMS doesn't support ICE restarts, so a lost transport is recovered by rejoining. One that
383
+ // never connected (e.g. UDP blocked, no TURN) would just fail again, so that isn't retried.
384
+ this.reconnect();
385
+ }
386
+ }
387
+ /** Drops every transport and the signaling connection, then rejoins with backoff. */
388
+ reconnect() {
389
+ if (this.left || this.reconnecting) {
390
+ return;
391
+ }
392
+ this.reconnecting = true;
393
+ this.previousIds.add(this.participantId);
394
+ for (const participantId of [...this.subscriptions.keys()]) {
395
+ this.closeSubscription(participantId);
396
+ }
397
+ if (this.publisherPc) {
398
+ this.closePeerConnection(this.publisherPc);
399
+ this.publisherPc = null;
400
+ }
401
+ this.queues.clear();
402
+ this.signaling.disconnect();
403
+ void this.rejoin();
404
+ }
405
+ async rejoin() {
406
+ const baseDelay = this.options.reconnectDelayMs ?? 1000;
407
+ let lastError = null;
408
+ for (let attempt = 1; attempt <= MAX_RECONNECT_ATTEMPTS && !this.left; attempt++) {
409
+ this.emit('reconnecting', { attempt });
410
+ await new Promise((resolve) => setTimeout(resolve, Math.min(baseDelay * 2 ** (attempt - 1), MAX_RECONNECT_DELAY_MS)));
411
+ if (this.left) {
412
+ return;
413
+ }
414
+ try {
415
+ const { signaling, joined } = await this.connectAndJoinRefreshingToken();
416
+ if (this.left) {
417
+ signaling.disconnect();
418
+ return;
419
+ }
420
+ this.signaling = signaling;
421
+ this.bindSignalingEvents();
422
+ this.reconnecting = false;
423
+ this.applyJoin(joined, true);
424
+ await this.republish();
425
+ this.emit('reconnected', { participantId: this.participantId });
426
+ return;
427
+ }
428
+ catch (err) {
429
+ lastError = err;
430
+ if (FATAL_REJOIN_ERRORS.has(asError(err).code)) {
431
+ break;
432
+ }
433
+ }
434
+ }
435
+ this.reconnecting = false;
436
+ if (!this.left) {
437
+ this.left = true;
438
+ this.emit('disconnected', { code: 0, reason: `Rejoining failed: ${asError(lastError).message}` });
439
+ }
440
+ }
441
+ async connectAndJoinRefreshingToken() {
442
+ try {
443
+ return await connectAndJoin(this.options, this.token);
444
+ }
445
+ catch (err) {
446
+ if (asError(err).code !== 'AUTH_INVALID' || !this.options.getToken) {
447
+ throw err;
448
+ }
449
+ this.token = await this.options.getToken();
450
+ return connectAndJoin(this.options, this.token);
451
+ }
452
+ }
453
+ /** Publishes the tracks we had published before the rejoin (still live ones), mute state included. */
454
+ async republish() {
455
+ const tracks = [...this.published.values()].filter((p) => p.track.readyState !== 'ended');
456
+ this.published.clear();
457
+ if (tracks.length === 0) {
458
+ return;
459
+ }
460
+ await this.publishTracks(tracks);
461
+ for (const { track } of tracks) {
462
+ if (!track.enabled) {
463
+ await this.setMuted(track.kind, true);
464
+ }
465
+ }
466
+ }
467
+ bindSignalingEvents() {
468
+ const s = this.signaling;
469
+ // Events from a connection a rejoin has replaced are stale.
470
+ const on = (event, handler) => s.on(event, (data) => {
471
+ if (s === this.signaling) {
472
+ handler(data);
473
+ }
474
+ });
475
+ on('participant.joined', (data) => {
476
+ const participant = { ...data, tracks: [] };
477
+ this.remote.set(data.participantId, participant);
478
+ this.emit('participantJoined', participant);
479
+ });
480
+ on('participant.left', (data) => {
481
+ if (this.previousIds.delete(data.participantId)) {
482
+ return; // our own session from before a rejoin, finally noticed gone
483
+ }
484
+ this.closeSubscription(data.participantId);
485
+ this.subscribeOptions.delete(data.participantId);
486
+ this.remote.delete(data.participantId);
487
+ this.emit('participantLeft', data);
488
+ });
489
+ on('publisher.added', (data) => {
490
+ if (data.participantId === this.localParticipantId || this.previousIds.has(data.participantId)) {
491
+ return; // our own publish, echoed to the whole room
492
+ }
493
+ const participant = this.upsertParticipant(data.participantId, data.displayName, data.identity);
494
+ participant.tracks = data.tracks;
495
+ this.emit('publisherAdded', participant);
496
+ if (this.autoSubscribe) {
497
+ this.subscribe(data.participantId).catch((err) => this.emit('error', asError(err)));
498
+ }
499
+ });
500
+ on('publisher.updated', (data) => {
501
+ if (data.participantId === this.localParticipantId || this.previousIds.has(data.participantId)) {
502
+ return;
503
+ }
504
+ const participant = this.upsertParticipant(data.participantId, data.participantId, null);
505
+ participant.tracks = data.tracks;
506
+ this.emit('publisherUpdated', participant);
507
+ if (this.autoSubscribe && this.subscriptions.has(data.participantId)) {
508
+ this.subscribe(data.participantId).catch((err) => this.emit('error', asError(err)));
509
+ }
510
+ });
511
+ on('publisher.removed', (data) => {
512
+ if (data.participantId === this.localParticipantId || this.previousIds.has(data.participantId)) {
513
+ return;
514
+ }
515
+ // The server has already closed every subscription to this publisher.
516
+ this.closeSubscription(data.participantId);
517
+ this.subscribeOptions.delete(data.participantId);
518
+ const participant = this.remote.get(data.participantId);
519
+ if (participant) {
520
+ participant.tracks = [];
521
+ }
522
+ this.emit('publisherRemoved', data);
523
+ });
524
+ on('track.muted', (data) => {
525
+ const track = this.remote.get(data.participantId)?.tracks.find((t) => t.trackId === data.trackId);
526
+ if (track) {
527
+ track.muted = data.muted;
528
+ }
529
+ this.emit('trackMuted', data);
530
+ });
531
+ on('chat.message', (data) => this.emit('chat', {
532
+ participantId: data.fromParticipantId, text: data.text, timestampMillis: data.timestampMillis,
533
+ }));
534
+ on('data.message', (data) => this.emit('data', {
535
+ participantId: data.fromParticipantId, type: data.type, payload: data.payload, timestampMillis: data.timestampMillis,
536
+ }));
537
+ on('recording.started', (data) => this.emit('recordingStarted', { recordingId: data.recordingId }));
538
+ on('recording.stopped', (data) => this.emit('recordingStopped', { recordingId: data.recordingId }));
539
+ on('error', (data) => this.emit('error', data));
540
+ s.onClose((event) => {
541
+ if (s !== this.signaling) {
542
+ return;
543
+ }
544
+ if (this.left) {
545
+ this.emit('disconnected', { code: event.code, reason: event.reason });
546
+ }
547
+ else {
548
+ this.reconnect();
549
+ }
550
+ });
551
+ }
552
+ upsertParticipant(participantId, displayName, identity) {
553
+ let participant = this.remote.get(participantId);
554
+ if (!participant) {
555
+ participant = { participantId, displayName, identity, metadata: null, tracks: [] };
556
+ this.remote.set(participantId, participant);
557
+ }
558
+ return participant;
559
+ }
560
+ enqueue(key, task) {
561
+ const previous = this.queues.get(key) ?? Promise.resolve();
562
+ const next = previous.catch(() => undefined).then(task);
563
+ this.queues.set(key, next);
564
+ return next;
565
+ }
566
+ closePeerConnection(pc) {
567
+ pc.onicecandidate = null;
568
+ pc.onicegatheringstatechange = null;
569
+ pc.onconnectionstatechange = null;
570
+ pc.ontrack = null;
571
+ pc.close();
572
+ }
573
+ emit(event, data) {
574
+ for (const handler of this.listeners.get(event) ?? []) {
575
+ try {
576
+ handler(data);
577
+ }
578
+ catch (err) {
579
+ console.error(`XmsRoom: ${event} handler threw`, err);
580
+ }
581
+ }
582
+ }
583
+ }
584
+ async function connectAndJoin(options, token) {
585
+ const signaling = new SignalingClient(options.url, options.webSocketFactory);
586
+ try {
587
+ await signaling.connect();
588
+ await signaling.request('session.hello', { authToken: token });
589
+ const joined = await signaling.request('room.join', {
590
+ roomId: options.roomId,
591
+ authToken: token,
592
+ ...(options.displayName ? { displayName: options.displayName } : {}),
593
+ });
594
+ return { signaling, joined };
595
+ }
596
+ catch (err) {
597
+ signaling.disconnect();
598
+ throw err;
599
+ }
600
+ }
601
+ function toCandidate(candidate) {
602
+ return { candidate: candidate.candidate, sdpMid: candidate.sdpMid, sdpMLineIndex: candidate.sdpMLineIndex };
603
+ }
604
+ function asError(err) {
605
+ if (err && typeof err === 'object' && 'code' in err && 'message' in err) {
606
+ return err;
607
+ }
608
+ return { code: 'CLIENT_ERROR', message: err instanceof Error ? err.message : String(err) };
609
+ }
610
+ //# sourceMappingURL=room.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}