livekit-client 1.4.4 → 1.5.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.
Files changed (99) hide show
  1. package/dist/livekit-client.esm.mjs +510 -38
  2. package/dist/livekit-client.esm.mjs.map +1 -1
  3. package/dist/livekit-client.umd.js +1 -1
  4. package/dist/livekit-client.umd.js.map +1 -1
  5. package/dist/src/connectionHelper/ConnectionCheck.d.ts +25 -0
  6. package/dist/src/connectionHelper/ConnectionCheck.d.ts.map +1 -0
  7. package/dist/src/connectionHelper/checks/Checker.d.ts +59 -0
  8. package/dist/src/connectionHelper/checks/Checker.d.ts.map +1 -0
  9. package/dist/src/connectionHelper/checks/publishAudio.d.ts +6 -0
  10. package/dist/src/connectionHelper/checks/publishAudio.d.ts.map +1 -0
  11. package/dist/src/connectionHelper/checks/publishVideo.d.ts +6 -0
  12. package/dist/src/connectionHelper/checks/publishVideo.d.ts.map +1 -0
  13. package/dist/src/connectionHelper/checks/reconnect.d.ts +6 -0
  14. package/dist/src/connectionHelper/checks/reconnect.d.ts.map +1 -0
  15. package/dist/src/connectionHelper/checks/turn.d.ts +6 -0
  16. package/dist/src/connectionHelper/checks/turn.d.ts.map +1 -0
  17. package/dist/src/connectionHelper/checks/webrtc.d.ts +6 -0
  18. package/dist/src/connectionHelper/checks/webrtc.d.ts.map +1 -0
  19. package/dist/src/connectionHelper/checks/websocket.d.ts +6 -0
  20. package/dist/src/connectionHelper/checks/websocket.d.ts.map +1 -0
  21. package/dist/src/index.d.ts +3 -1
  22. package/dist/src/index.d.ts.map +1 -1
  23. package/dist/src/proto/livekit_rtc.d.ts +8 -0
  24. package/dist/src/proto/livekit_rtc.d.ts.map +1 -1
  25. package/dist/src/room/DeviceManager.d.ts.map +1 -1
  26. package/dist/src/room/Room.d.ts +6 -0
  27. package/dist/src/room/Room.d.ts.map +1 -1
  28. package/dist/src/room/events.d.ts +5 -1
  29. package/dist/src/room/events.d.ts.map +1 -1
  30. package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
  31. package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
  32. package/dist/src/room/track/RemoteTrackPublication.d.ts +2 -0
  33. package/dist/src/room/track/RemoteTrackPublication.d.ts.map +1 -1
  34. package/dist/ts4.2/src/api/SignalClient.d.ts +85 -0
  35. package/dist/ts4.2/src/connectionHelper/ConnectionCheck.d.ts +25 -0
  36. package/dist/ts4.2/src/connectionHelper/checks/Checker.d.ts +59 -0
  37. package/dist/ts4.2/src/connectionHelper/checks/publishAudio.d.ts +6 -0
  38. package/dist/ts4.2/src/connectionHelper/checks/publishVideo.d.ts +6 -0
  39. package/dist/ts4.2/src/connectionHelper/checks/reconnect.d.ts +6 -0
  40. package/dist/ts4.2/src/connectionHelper/checks/turn.d.ts +6 -0
  41. package/dist/ts4.2/src/connectionHelper/checks/webrtc.d.ts +6 -0
  42. package/dist/ts4.2/src/connectionHelper/checks/websocket.d.ts +6 -0
  43. package/dist/ts4.2/src/index.d.ts +30 -0
  44. package/dist/ts4.2/src/logger.d.ts +26 -0
  45. package/dist/ts4.2/src/options.d.ts +91 -0
  46. package/dist/ts4.2/src/proto/google/protobuf/timestamp.d.ts +141 -0
  47. package/dist/ts4.2/src/proto/livekit_models.d.ts +1421 -0
  48. package/dist/ts4.2/src/proto/livekit_rtc.d.ts +7122 -0
  49. package/dist/ts4.2/src/room/DefaultReconnectPolicy.d.ts +8 -0
  50. package/dist/ts4.2/src/room/DeviceManager.d.ts +9 -0
  51. package/dist/ts4.2/src/room/PCTransport.d.ts +33 -0
  52. package/dist/ts4.2/src/room/RTCEngine.d.ts +96 -0
  53. package/dist/ts4.2/src/room/ReconnectPolicy.d.ts +23 -0
  54. package/dist/ts4.2/src/room/Room.d.ts +203 -0
  55. package/dist/ts4.2/src/room/defaults.d.ts +8 -0
  56. package/dist/ts4.2/src/room/errors.d.ts +39 -0
  57. package/dist/ts4.2/src/room/events.d.ts +422 -0
  58. package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +141 -0
  59. package/dist/ts4.2/src/room/participant/Participant.d.ts +92 -0
  60. package/dist/ts4.2/src/room/participant/ParticipantTrackPermission.d.ts +26 -0
  61. package/dist/ts4.2/src/room/participant/RemoteParticipant.d.ts +52 -0
  62. package/dist/ts4.2/src/room/participant/publishUtils.d.ts +19 -0
  63. package/dist/ts4.2/src/room/stats.d.ts +67 -0
  64. package/dist/ts4.2/src/room/track/LocalAudioTrack.d.ts +25 -0
  65. package/dist/ts4.2/src/room/track/LocalTrack.d.ts +42 -0
  66. package/dist/ts4.2/src/room/track/LocalTrackPublication.d.ts +38 -0
  67. package/dist/ts4.2/src/room/track/LocalVideoTrack.d.ts +53 -0
  68. package/dist/ts4.2/src/room/track/RemoteAudioTrack.d.ts +53 -0
  69. package/dist/ts4.2/src/room/track/RemoteTrack.d.ts +15 -0
  70. package/dist/ts4.2/src/room/track/RemoteTrackPublication.d.ts +61 -0
  71. package/dist/ts4.2/src/room/track/RemoteVideoTrack.d.ts +52 -0
  72. package/dist/ts4.2/src/room/track/Track.d.ts +121 -0
  73. package/dist/ts4.2/src/room/track/TrackPublication.d.ts +68 -0
  74. package/dist/ts4.2/src/room/track/create.d.ts +24 -0
  75. package/dist/ts4.2/src/room/track/options.d.ts +241 -0
  76. package/dist/ts4.2/src/room/track/types.d.ts +23 -0
  77. package/dist/ts4.2/src/room/track/utils.d.ts +14 -0
  78. package/dist/ts4.2/src/room/utils.d.ts +35 -0
  79. package/dist/ts4.2/src/test/MockMediaStreamTrack.d.ts +26 -0
  80. package/dist/ts4.2/src/test/mocks.d.ts +11 -0
  81. package/dist/ts4.2/src/version.d.ts +3 -0
  82. package/package.json +13 -3
  83. package/src/api/SignalClient.ts +2 -2
  84. package/src/connectionHelper/ConnectionCheck.ts +90 -0
  85. package/src/connectionHelper/checks/Checker.ts +164 -0
  86. package/src/connectionHelper/checks/publishAudio.ts +33 -0
  87. package/src/connectionHelper/checks/publishVideo.ts +33 -0
  88. package/src/connectionHelper/checks/reconnect.ts +45 -0
  89. package/src/connectionHelper/checks/turn.ts +53 -0
  90. package/src/connectionHelper/checks/webrtc.ts +18 -0
  91. package/src/connectionHelper/checks/websocket.ts +22 -0
  92. package/src/index.ts +3 -1
  93. package/src/proto/livekit_rtc.ts +12 -1
  94. package/src/room/DeviceManager.ts +0 -17
  95. package/src/room/Room.ts +22 -2
  96. package/src/room/events.ts +5 -0
  97. package/src/room/participant/LocalParticipant.ts +15 -8
  98. package/src/room/track/LocalTrack.ts +3 -0
  99. package/src/room/track/RemoteTrackPublication.ts +20 -0
@@ -12428,7 +12428,8 @@ function createBaseUpdateTrackSettings() {
12428
12428
  disabled: false,
12429
12429
  quality: 0,
12430
12430
  width: 0,
12431
- height: 0
12431
+ height: 0,
12432
+ fps: 0
12432
12433
  };
12433
12434
  }
12434
12435
 
@@ -12456,6 +12457,10 @@ const UpdateTrackSettings = {
12456
12457
  writer.uint32(48).uint32(message.height);
12457
12458
  }
12458
12459
 
12460
+ if (message.fps !== 0) {
12461
+ writer.uint32(56).uint32(message.fps);
12462
+ }
12463
+
12459
12464
  return writer;
12460
12465
  },
12461
12466
 
@@ -12488,6 +12493,10 @@ const UpdateTrackSettings = {
12488
12493
  message.height = reader.uint32();
12489
12494
  break;
12490
12495
 
12496
+ case 7:
12497
+ message.fps = reader.uint32();
12498
+ break;
12499
+
12491
12500
  default:
12492
12501
  reader.skipType(tag & 7);
12493
12502
  break;
@@ -12503,7 +12512,8 @@ const UpdateTrackSettings = {
12503
12512
  disabled: isSet(object.disabled) ? Boolean(object.disabled) : false,
12504
12513
  quality: isSet(object.quality) ? videoQualityFromJSON(object.quality) : 0,
12505
12514
  width: isSet(object.width) ? Number(object.width) : 0,
12506
- height: isSet(object.height) ? Number(object.height) : 0
12515
+ height: isSet(object.height) ? Number(object.height) : 0,
12516
+ fps: isSet(object.fps) ? Number(object.fps) : 0
12507
12517
  };
12508
12518
  },
12509
12519
 
@@ -12520,11 +12530,12 @@ const UpdateTrackSettings = {
12520
12530
  message.quality !== undefined && (obj.quality = videoQualityToJSON(message.quality));
12521
12531
  message.width !== undefined && (obj.width = Math.round(message.width));
12522
12532
  message.height !== undefined && (obj.height = Math.round(message.height));
12533
+ message.fps !== undefined && (obj.fps = Math.round(message.fps));
12523
12534
  return obj;
12524
12535
  },
12525
12536
 
12526
12537
  fromPartial(object) {
12527
- var _a, _b, _c, _d, _e;
12538
+ var _a, _b, _c, _d, _e, _f;
12528
12539
 
12529
12540
  const message = createBaseUpdateTrackSettings();
12530
12541
  message.trackSids = ((_a = object.trackSids) === null || _a === void 0 ? void 0 : _a.map(e => e)) || [];
@@ -12532,6 +12543,7 @@ const UpdateTrackSettings = {
12532
12543
  message.quality = (_c = object.quality) !== null && _c !== void 0 ? _c : 0;
12533
12544
  message.width = (_d = object.width) !== null && _d !== void 0 ? _d : 0;
12534
12545
  message.height = (_e = object.height) !== null && _e !== void 0 ? _e : 0;
12546
+ message.fps = (_f = object.fps) !== null && _f !== void 0 ? _f : 0;
12535
12547
  return message;
12536
12548
  }
12537
12549
 
@@ -14466,6 +14478,11 @@ var RoomEvent;
14466
14478
  */
14467
14479
 
14468
14480
  RoomEvent["SignalConnected"] = "signalConnected";
14481
+ /**
14482
+ * Recording of a room has started/stopped.
14483
+ */
14484
+
14485
+ RoomEvent["RecordingStatusChanged"] = "recordingStatusChanged";
14469
14486
  })(RoomEvent || (RoomEvent = {}));
14470
14487
 
14471
14488
  var ParticipantEvent;
@@ -15312,7 +15329,7 @@ var uaParser = {exports: {}};
15312
15329
 
15313
15330
  var UAParser = uaParser.exports;
15314
15331
 
15315
- var version$1 = "1.4.4";
15332
+ var version$1 = "1.5.0";
15316
15333
 
15317
15334
  const version = version$1;
15318
15335
  const protocolVersion = 8;
@@ -15766,25 +15783,6 @@ class DeviceManager {
15766
15783
 
15767
15784
  if (kind) {
15768
15785
  devices = devices.filter(device => device.kind === kind);
15769
- } // Chrome returns 'default' devices, we would filter them out, but put the default
15770
- // device at first
15771
- // we would only do this if there are more than 1 device though
15772
-
15773
-
15774
- if (devices.length > 1 && devices[0].deviceId === defaultId) {
15775
- // find another device with matching group id, and move that to 0
15776
- const defaultDevice = devices[0];
15777
-
15778
- for (let i = 1; i < devices.length; i += 1) {
15779
- if (devices[i].groupId === defaultDevice.groupId) {
15780
- const temp = devices[0];
15781
- devices[0] = devices[i];
15782
- devices[i] = temp;
15783
- break;
15784
- }
15785
- }
15786
-
15787
- return devices.filter(device => device !== defaultDevice);
15788
15786
  }
15789
15787
 
15790
15788
  return devices;
@@ -16748,7 +16746,9 @@ class LocalTrack extends Track {
16748
16746
  await this.sender.replaceTrack(track);
16749
16747
  }
16750
16748
 
16751
- this._mediaStreamTrack = track;
16749
+ this._mediaStreamTrack = track; // sync muted state with the enabled state of the newly provided track
16750
+
16751
+ this._mediaStreamTrack.enabled = !this.isMuted;
16752
16752
  await this.resumeUpstream();
16753
16753
  this.attachedElements.forEach(el => {
16754
16754
  attachToElement(track, el);
@@ -19195,6 +19195,23 @@ class RemoteTrackPublication extends TrackPublication {
19195
19195
  this.emitTrackUpdate();
19196
19196
  }
19197
19197
 
19198
+ setVideoFPS(fps) {
19199
+ if (!this.isManualOperationAllowed()) {
19200
+ return;
19201
+ }
19202
+
19203
+ if (!(this.track instanceof RemoteVideoTrack)) {
19204
+ return;
19205
+ }
19206
+
19207
+ if (this.fps === fps) {
19208
+ return;
19209
+ }
19210
+
19211
+ this.fps = fps;
19212
+ this.emitTrackUpdate();
19213
+ }
19214
+
19198
19215
  get videoQuality() {
19199
19216
  return this.currentVideoQuality;
19200
19217
  }
@@ -19298,7 +19315,8 @@ class RemoteTrackPublication extends TrackPublication {
19298
19315
  emitTrackUpdate() {
19299
19316
  const settings = UpdateTrackSettings.fromPartial({
19300
19317
  trackSids: [this.trackSid],
19301
- disabled: this.disabled
19318
+ disabled: this.disabled,
19319
+ fps: this.fps
19302
19320
  });
19303
19321
 
19304
19322
  if (this.videoDimensions) {
@@ -19936,6 +19954,9 @@ class LocalParticipant extends Participant {
19936
19954
  const publishPromises = [];
19937
19955
 
19938
19956
  for (const localTrack of localTracks) {
19957
+ livekitLogger.info('publishing track', {
19958
+ localTrack
19959
+ });
19939
19960
  publishPromises.push(this.publishTrack(localTrack, publishOptions));
19940
19961
  }
19941
19962
 
@@ -20077,14 +20098,28 @@ class LocalParticipant extends Participant {
20077
20098
  let videoConstraints = true;
20078
20099
 
20079
20100
  if (options.resolution) {
20080
- videoConstraints = {
20081
- width: options.resolution.width,
20082
- height: options.resolution.height,
20083
- frameRate: options.resolution.frameRate
20084
- };
20085
- } // typescript definition is missing getDisplayMedia: https://github.com/microsoft/TypeScript/issues/33232
20086
- // @ts-ignore
20087
-
20101
+ if (isSafari()) {
20102
+ videoConstraints = {
20103
+ width: {
20104
+ max: options.resolution.width
20105
+ },
20106
+ height: {
20107
+ max: options.resolution.height
20108
+ },
20109
+ frameRate: options.resolution.frameRate
20110
+ };
20111
+ } else {
20112
+ videoConstraints = {
20113
+ width: {
20114
+ ideal: options.resolution.width
20115
+ },
20116
+ height: {
20117
+ ideal: options.resolution.height
20118
+ },
20119
+ frameRate: options.resolution.frameRate
20120
+ };
20121
+ }
20122
+ }
20088
20123
 
20089
20124
  const stream = await navigator.mediaDevices.getDisplayMedia({
20090
20125
  audio: (_a = options.audio) !== null && _a !== void 0 ? _a : false,
@@ -20939,8 +20974,8 @@ class SignalClient {
20939
20974
  await sleep(this.signalLatency);
20940
20975
  }
20941
20976
 
20942
- if (!this.ws) {
20943
- livekitLogger.error('cannot send signal request before connected');
20977
+ if (!this.ws || this.ws.readyState < this.ws.OPEN) {
20978
+ livekitLogger.error("cannot send signal request before connected, type: ".concat(message === null || message === void 0 ? void 0 : message.$case));
20944
20979
  return;
20945
20980
  }
20946
20981
 
@@ -23275,6 +23310,7 @@ class Room extends events.exports.EventEmitter {
23275
23310
  /** room metadata */
23276
23311
 
23277
23312
  this.metadata = undefined;
23313
+ this._isRecording = false;
23278
23314
  this.audioEnabled = true;
23279
23315
 
23280
23316
  this.connect = (url, token, opts) => {
@@ -23368,6 +23404,12 @@ class Room extends events.exports.EventEmitter {
23368
23404
  this.name = joinResponse.room.name;
23369
23405
  this.sid = joinResponse.room.sid;
23370
23406
  this.metadata = joinResponse.room.metadata;
23407
+
23408
+ if (this._isRecording !== joinResponse.room.activeRecording) {
23409
+ this._isRecording = joinResponse.room.activeRecording;
23410
+ this.emit(RoomEvent.RecordingStatusChanged, joinResponse.room.activeRecording);
23411
+ }
23412
+
23371
23413
  this.emit(RoomEvent.SignalConnected);
23372
23414
  } catch (err) {
23373
23415
  this.recreateEngine();
@@ -23682,8 +23724,15 @@ class Room extends events.exports.EventEmitter {
23682
23724
  };
23683
23725
 
23684
23726
  this.handleRoomUpdate = r => {
23685
- this.metadata = r.metadata;
23686
- this.emitWhenConnected(RoomEvent.RoomMetadataChanged, r.metadata);
23727
+ if (this._isRecording !== r.activeRecording) {
23728
+ this._isRecording = r.activeRecording;
23729
+ this.emit(RoomEvent.RecordingStatusChanged, r.activeRecording);
23730
+ }
23731
+
23732
+ if (this.metadata !== r.metadata) {
23733
+ this.metadata = r.metadata;
23734
+ this.emitWhenConnected(RoomEvent.RoomMetadataChanged, r.metadata);
23735
+ }
23687
23736
  };
23688
23737
 
23689
23738
  this.handleConnectionQualityUpdate = update => {
@@ -23829,6 +23878,14 @@ class Room extends events.exports.EventEmitter {
23829
23878
  clearConnectionFutures() {
23830
23879
  this.connectFuture = undefined;
23831
23880
  }
23881
+ /**
23882
+ * if the current room has a participant with `recorder: true` in its JWT grant
23883
+ **/
23884
+
23885
+
23886
+ get isRecording() {
23887
+ return this._isRecording;
23888
+ }
23832
23889
  /**
23833
23890
  * @internal for testing
23834
23891
  */
@@ -24469,5 +24526,420 @@ async function createLocalScreenTracks(options) {
24469
24526
  return localTracks;
24470
24527
  }
24471
24528
 
24472
- export { AudioPresets, ConnectionError, ConnectionQuality, ConnectionState, DataPacket_Kind, DefaultReconnectPolicy, DisconnectReason, EngineEvent, LivekitError, LocalAudioTrack, LocalParticipant, LocalTrack, LocalTrackPublication, LocalVideoTrack, LogLevel, MediaDeviceFailure, NegotiationError, Participant, ParticipantEvent, PublishDataError, RemoteAudioTrack, RemoteParticipant, RemoteTrack, RemoteTrackPublication, RemoteVideoTrack, Room, RoomEvent, RoomState, ScreenSharePresets, Track, TrackEvent, TrackInvalidError, TrackPublication, UnexpectedConnectionState, UnsupportedServer, VideoPreset, VideoPresets, VideoPresets43, VideoQuality, attachToElement, createLocalAudioTrack, createLocalScreenTracks, createLocalTracks, createLocalVideoTrack, detachTrack, getEmptyAudioStreamTrack, getEmptyVideoStreamTrack, isBackupCodec, isBrowserSupported, protocolVersion, setLogExtension, setLogLevel, supportsAV1, supportsAdaptiveStream, supportsDynacast, version };
24529
+ var CheckStatus;
24530
+
24531
+ (function (CheckStatus) {
24532
+ CheckStatus[CheckStatus["IDLE"] = 0] = "IDLE";
24533
+ CheckStatus[CheckStatus["RUNNING"] = 1] = "RUNNING";
24534
+ CheckStatus[CheckStatus["SKIPPED"] = 2] = "SKIPPED";
24535
+ CheckStatus[CheckStatus["SUCCESS"] = 3] = "SUCCESS";
24536
+ CheckStatus[CheckStatus["FAILED"] = 4] = "FAILED";
24537
+ })(CheckStatus || (CheckStatus = {}));
24538
+
24539
+ class Checker extends events.exports.EventEmitter {
24540
+ constructor(url, token) {
24541
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
24542
+ super();
24543
+ this.status = CheckStatus.IDLE;
24544
+ this.logs = [];
24545
+ this.errorsAsWarnings = false;
24546
+ this.url = url;
24547
+ this.token = token;
24548
+ this.name = this.constructor.name;
24549
+ this.room = new Room(options.roomOptions);
24550
+ this.connectOptions = options.connectOptions;
24551
+
24552
+ if (options.errorsAsWarnings) {
24553
+ this.errorsAsWarnings = options.errorsAsWarnings;
24554
+ }
24555
+ }
24556
+
24557
+ async run(onComplete) {
24558
+ if (this.status !== CheckStatus.IDLE) {
24559
+ throw Error('check is running already');
24560
+ }
24561
+
24562
+ this.setStatus(CheckStatus.RUNNING);
24563
+ this.appendMessage("".concat(this.name, " started."));
24564
+
24565
+ try {
24566
+ await this.perform();
24567
+ } catch (err) {
24568
+ if (err instanceof Error) {
24569
+ if (this.errorsAsWarnings) {
24570
+ this.appendWarning(err.message);
24571
+ } else {
24572
+ this.appendError(err.message);
24573
+ }
24574
+ }
24575
+ }
24576
+
24577
+ await this.disconnect(); // sleep for a bit to ensure disconnect
24578
+
24579
+ await new Promise(resolve => setTimeout(resolve, 500)); // @ts-ignore
24580
+
24581
+ if (this.status !== CheckStatus.SKIPPED) {
24582
+ this.setStatus(this.isSuccess() ? CheckStatus.SUCCESS : CheckStatus.FAILED);
24583
+ }
24584
+
24585
+ if (onComplete) {
24586
+ onComplete();
24587
+ }
24588
+
24589
+ return this.getInfo();
24590
+ }
24591
+
24592
+ isSuccess() {
24593
+ return !this.logs.some(l => l.level === 'error');
24594
+ }
24595
+
24596
+ async connect() {
24597
+ if (this.room.state === ConnectionState.Connected) {
24598
+ return this.room;
24599
+ }
24600
+
24601
+ await this.room.connect(this.url, this.token);
24602
+ return this.room;
24603
+ }
24604
+
24605
+ async disconnect() {
24606
+ if (this.room && this.room.state !== ConnectionState.Disconnected) {
24607
+ await this.room.disconnect(); // wait for it to go through
24608
+
24609
+ await new Promise(resolve => setTimeout(resolve, 500));
24610
+ }
24611
+ }
24612
+
24613
+ skip() {
24614
+ this.setStatus(CheckStatus.SKIPPED);
24615
+ }
24616
+
24617
+ appendMessage(message) {
24618
+ this.logs.push({
24619
+ level: 'info',
24620
+ message
24621
+ });
24622
+ this.emit('update', this.getInfo());
24623
+ }
24624
+
24625
+ appendWarning(message) {
24626
+ this.logs.push({
24627
+ level: 'warning',
24628
+ message
24629
+ });
24630
+ this.emit('update', this.getInfo());
24631
+ }
24632
+
24633
+ appendError(message) {
24634
+ this.logs.push({
24635
+ level: 'error',
24636
+ message
24637
+ });
24638
+ this.emit('update', this.getInfo());
24639
+ }
24640
+
24641
+ setStatus(status) {
24642
+ this.status = status;
24643
+ this.emit('update', this.getInfo());
24644
+ }
24645
+
24646
+ get engine() {
24647
+ var _a;
24648
+
24649
+ return (_a = this.room) === null || _a === void 0 ? void 0 : _a.engine;
24650
+ }
24651
+
24652
+ getInfo() {
24653
+ return {
24654
+ logs: this.logs,
24655
+ name: this.name,
24656
+ status: this.status,
24657
+ description: this.description
24658
+ };
24659
+ }
24660
+
24661
+ }
24662
+
24663
+ class PublishAudioCheck extends Checker {
24664
+ get description() {
24665
+ return 'Can publish audio';
24666
+ }
24667
+
24668
+ async perform() {
24669
+ var _a;
24670
+
24671
+ const room = await this.connect();
24672
+ const track = await createLocalAudioTrack();
24673
+ room.localParticipant.publishTrack(track); // wait for a few seconds to publish
24674
+
24675
+ await new Promise(resolve => setTimeout(resolve, 3000)); // verify RTC stats that it's publishing
24676
+
24677
+ const stats = await ((_a = track.sender) === null || _a === void 0 ? void 0 : _a.getStats());
24678
+
24679
+ if (!stats) {
24680
+ throw new Error('Could not get RTCStats');
24681
+ }
24682
+
24683
+ let numPackets = 0;
24684
+ stats.forEach(stat => {
24685
+ if (stat.type === 'outbound-rtp' && stat.mediaType === 'audio') {
24686
+ numPackets = stat.packetsSent;
24687
+ }
24688
+ });
24689
+
24690
+ if (numPackets === 0) {
24691
+ throw new Error('Could not determine packets are sent');
24692
+ }
24693
+
24694
+ this.appendMessage("published ".concat(numPackets, " audio packets"));
24695
+ }
24696
+
24697
+ }
24698
+
24699
+ class PublishVideoCheck extends Checker {
24700
+ get description() {
24701
+ return 'Can publish video';
24702
+ }
24703
+
24704
+ async perform() {
24705
+ var _a;
24706
+
24707
+ const room = await this.connect();
24708
+ const track = await createLocalVideoTrack();
24709
+ room.localParticipant.publishTrack(track); // wait for a few seconds to publish
24710
+
24711
+ await new Promise(resolve => setTimeout(resolve, 3000)); // verify RTC stats that it's publishing
24712
+
24713
+ const stats = await ((_a = track.sender) === null || _a === void 0 ? void 0 : _a.getStats());
24714
+
24715
+ if (!stats) {
24716
+ throw new Error('Could not get RTCStats');
24717
+ }
24718
+
24719
+ let numPackets = 0;
24720
+ stats.forEach(stat => {
24721
+ if (stat.type === 'outbound-rtp' && stat.mediaType === 'video') {
24722
+ numPackets = stat.packetsSent;
24723
+ }
24724
+ });
24725
+
24726
+ if (numPackets === 0) {
24727
+ throw new Error('Could not determine packets are sent');
24728
+ }
24729
+
24730
+ this.appendMessage("published ".concat(numPackets, " video packets"));
24731
+ }
24732
+
24733
+ }
24734
+
24735
+ class ReconnectCheck extends Checker {
24736
+ get description() {
24737
+ return 'Resuming connection after interruption';
24738
+ }
24739
+
24740
+ async perform() {
24741
+ var _a;
24742
+
24743
+ const room = await this.connect();
24744
+ let reconnectingTriggered = false;
24745
+ let reconnected = false;
24746
+ let reconnectResolver;
24747
+ const reconnectTimeout = new Promise(resolve => {
24748
+ setTimeout(resolve, 5000);
24749
+ reconnectResolver = resolve;
24750
+ });
24751
+ room.on(RoomEvent.Reconnecting, () => {
24752
+ reconnectingTriggered = true;
24753
+ }).on(RoomEvent.Reconnected, () => {
24754
+ reconnected = true;
24755
+ reconnectResolver(true);
24756
+ });
24757
+ (_a = room.engine.client.ws) === null || _a === void 0 ? void 0 : _a.close();
24758
+ const onClose = room.engine.client.onClose;
24759
+
24760
+ if (onClose) {
24761
+ onClose('');
24762
+ }
24763
+
24764
+ await reconnectTimeout;
24765
+
24766
+ if (!reconnectingTriggered) {
24767
+ throw new Error('Did not attempt to reconnect');
24768
+ } else if (!reconnected || room.state !== ConnectionState.Connected) {
24769
+ this.appendWarning('reconnection is only possible in Redis-based configurations');
24770
+ throw new Error('Not able to reconnect');
24771
+ }
24772
+ }
24773
+
24774
+ }
24775
+
24776
+ class TURNCheck extends Checker {
24777
+ get description() {
24778
+ return 'Can connect via TURN';
24779
+ }
24780
+
24781
+ async perform() {
24782
+ var _a, _b;
24783
+
24784
+ const signalClient = new SignalClient();
24785
+ const joinRes = await signalClient.join(this.url, this.token, {
24786
+ autoSubscribe: true,
24787
+ maxRetries: 0
24788
+ });
24789
+ let hasTLS = false;
24790
+ let hasTURN = false;
24791
+ let hasSTUN = false;
24792
+
24793
+ for (let iceServer of joinRes.iceServers) {
24794
+ for (let url of iceServer.urls) {
24795
+ if (url.startsWith('turn:')) {
24796
+ hasTURN = true;
24797
+ hasSTUN = true;
24798
+ } else if (url.startsWith('turns:')) {
24799
+ hasTURN = true;
24800
+ hasSTUN = true;
24801
+ hasTLS = true;
24802
+ }
24803
+
24804
+ if (url.startsWith('stun:')) {
24805
+ hasSTUN = true;
24806
+ }
24807
+ }
24808
+ }
24809
+
24810
+ if (!hasSTUN) {
24811
+ this.appendWarning('No STUN servers configured on server side.');
24812
+ } else if (hasTURN && !hasTLS) {
24813
+ this.appendWarning('TURN is configured server side, but TURN/TLS is unavailable.');
24814
+ }
24815
+
24816
+ signalClient.close();
24817
+
24818
+ if (((_b = (_a = this.connectOptions) === null || _a === void 0 ? void 0 : _a.rtcConfig) === null || _b === void 0 ? void 0 : _b.iceServers) || hasTURN) {
24819
+ await this.room.connect(this.url, this.token, {
24820
+ rtcConfig: {
24821
+ iceTransportPolicy: 'relay'
24822
+ }
24823
+ });
24824
+ } else {
24825
+ this.appendWarning('No TURN servers configured.');
24826
+ this.skip();
24827
+ await new Promise(resolve => setTimeout(resolve, 0));
24828
+ }
24829
+ }
24830
+
24831
+ }
24832
+
24833
+ class WebRTCCheck extends Checker {
24834
+ get description() {
24835
+ return 'Establishing WebRTC connection';
24836
+ }
24837
+
24838
+ async perform() {
24839
+ try {
24840
+ console.log('initiating room connection');
24841
+ this.room = await this.connect();
24842
+ console.log('now the room is connected');
24843
+ } catch (err) {
24844
+ this.appendWarning('ports need to be open on firewall in order to connect.');
24845
+ throw err;
24846
+ }
24847
+ }
24848
+
24849
+ }
24850
+
24851
+ class WebSocketCheck extends Checker {
24852
+ get description() {
24853
+ return 'Connecting to signal connection via WebSocket';
24854
+ }
24855
+
24856
+ async perform() {
24857
+ if (this.url.startsWith('ws:') || this.url.startsWith('http:')) {
24858
+ this.appendWarning('Server is insecure, clients may block connections to it');
24859
+ }
24860
+
24861
+ let signalClient = new SignalClient();
24862
+ const joinRes = await signalClient.join(this.url, this.token, {
24863
+ autoSubscribe: true,
24864
+ maxRetries: 0
24865
+ });
24866
+ this.appendMessage("Connected to server, version ".concat(joinRes.serverVersion, "."));
24867
+ signalClient.close();
24868
+ }
24869
+
24870
+ }
24871
+
24872
+ class ConnectionCheck extends events.exports {
24873
+ constructor(url, token) {
24874
+ super();
24875
+ this.checkResults = new Map();
24876
+ this.url = url;
24877
+ this.token = token;
24878
+ }
24879
+
24880
+ getNextCheckId() {
24881
+ const nextId = this.checkResults.size;
24882
+ this.checkResults.set(nextId, {
24883
+ logs: [],
24884
+ status: CheckStatus.IDLE,
24885
+ name: '',
24886
+ description: ''
24887
+ });
24888
+ return nextId;
24889
+ }
24890
+
24891
+ updateCheck(checkId, info) {
24892
+ this.checkResults.set(checkId, info);
24893
+ this.emit('checkUpdate', checkId, info);
24894
+ }
24895
+
24896
+ isSuccess() {
24897
+ return Array.from(this.checkResults.values()).every(r => r.status !== CheckStatus.FAILED);
24898
+ }
24899
+
24900
+ getResults() {
24901
+ return Array.from(this.checkResults.values());
24902
+ }
24903
+
24904
+ async createAndRunCheck(check) {
24905
+ const checkId = this.getNextCheckId();
24906
+ const test = new check(this.url, this.token);
24907
+
24908
+ const handleUpdate = info => {
24909
+ this.updateCheck(checkId, info);
24910
+ };
24911
+
24912
+ test.on('update', handleUpdate);
24913
+ const result = await test.run();
24914
+ test.off('update', handleUpdate);
24915
+ return result;
24916
+ }
24917
+
24918
+ async checkWebsocket() {
24919
+ return this.createAndRunCheck(WebSocketCheck);
24920
+ }
24921
+
24922
+ async checkWebRTC() {
24923
+ return this.createAndRunCheck(WebRTCCheck);
24924
+ }
24925
+
24926
+ async checkTURN() {
24927
+ return this.createAndRunCheck(TURNCheck);
24928
+ }
24929
+
24930
+ async checkReconnect() {
24931
+ return this.createAndRunCheck(ReconnectCheck);
24932
+ }
24933
+
24934
+ async checkPublishAudio() {
24935
+ return this.createAndRunCheck(PublishAudioCheck);
24936
+ }
24937
+
24938
+ async checkPublishVideo() {
24939
+ return this.createAndRunCheck(PublishVideoCheck);
24940
+ }
24941
+
24942
+ }
24943
+
24944
+ export { AudioPresets, ConnectionCheck, ConnectionError, ConnectionQuality, ConnectionState, DataPacket_Kind, DefaultReconnectPolicy, DisconnectReason, EngineEvent, LivekitError, LocalAudioTrack, LocalParticipant, LocalTrack, LocalTrackPublication, LocalVideoTrack, LogLevel, MediaDeviceFailure, NegotiationError, Participant, ParticipantEvent, PublishDataError, RemoteAudioTrack, RemoteParticipant, RemoteTrack, RemoteTrackPublication, RemoteVideoTrack, Room, RoomEvent, RoomState, ScreenSharePresets, Track, TrackEvent, TrackInvalidError, TrackPublication, UnexpectedConnectionState, UnsupportedServer, VideoPreset, VideoPresets, VideoPresets43, VideoQuality, attachToElement, createLocalAudioTrack, createLocalScreenTracks, createLocalTracks, createLocalVideoTrack, detachTrack, getEmptyAudioStreamTrack, getEmptyVideoStreamTrack, isBackupCodec, isBrowserSupported, protocolVersion, setLogExtension, setLogLevel, supportsAV1, supportsAdaptiveStream, supportsDynacast, version };
24473
24945
  //# sourceMappingURL=livekit-client.esm.mjs.map