@stream-io/video-client 1.40.2 → 1.41.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.es.js CHANGED
@@ -27,6 +27,38 @@ const AudioSettingsResponseDefaultDeviceEnum = {
27
27
  SPEAKER: 'speaker',
28
28
  EARPIECE: 'earpiece',
29
29
  };
30
+ /**
31
+ * @export
32
+ */
33
+ const CallRecordingFailedEventRecordingTypeEnum = {
34
+ COMPOSITE: 'composite',
35
+ INDIVIDUAL: 'individual',
36
+ RAW: 'raw',
37
+ };
38
+ /**
39
+ * @export
40
+ */
41
+ const CallRecordingReadyEventRecordingTypeEnum = {
42
+ COMPOSITE: 'composite',
43
+ INDIVIDUAL: 'individual',
44
+ RAW: 'raw',
45
+ };
46
+ /**
47
+ * @export
48
+ */
49
+ const CallRecordingStartedEventRecordingTypeEnum = {
50
+ COMPOSITE: 'composite',
51
+ INDIVIDUAL: 'individual',
52
+ RAW: 'raw',
53
+ };
54
+ /**
55
+ * @export
56
+ */
57
+ const CallRecordingStoppedEventRecordingTypeEnum = {
58
+ COMPOSITE: 'composite',
59
+ INDIVIDUAL: 'individual',
60
+ RAW: 'raw',
61
+ };
30
62
  /**
31
63
  * @export
32
64
  */
@@ -62,6 +94,22 @@ const FrameRecordingSettingsResponseModeEnum = {
62
94
  DISABLED: 'disabled',
63
95
  AUTO_ON: 'auto-on',
64
96
  };
97
+ /**
98
+ * @export
99
+ */
100
+ const IndividualRecordingSettingsRequestModeEnum = {
101
+ AVAILABLE: 'available',
102
+ DISABLED: 'disabled',
103
+ AUTO_ON: 'auto-on',
104
+ };
105
+ /**
106
+ * @export
107
+ */
108
+ const IndividualRecordingSettingsResponseModeEnum = {
109
+ AVAILABLE: 'available',
110
+ DISABLED: 'disabled',
111
+ AUTO_ON: 'auto-on',
112
+ };
65
113
  /**
66
114
  * @export
67
115
  */
@@ -127,11 +175,15 @@ const OwnCapability = {
127
175
  START_BROADCAST_CALL: 'start-broadcast-call',
128
176
  START_CLOSED_CAPTIONS_CALL: 'start-closed-captions-call',
129
177
  START_FRAME_RECORD_CALL: 'start-frame-record-call',
178
+ START_INDIVIDUAL_RECORD_CALL: 'start-individual-record-call',
179
+ START_RAW_RECORD_CALL: 'start-raw-record-call',
130
180
  START_RECORD_CALL: 'start-record-call',
131
181
  START_TRANSCRIPTION_CALL: 'start-transcription-call',
132
182
  STOP_BROADCAST_CALL: 'stop-broadcast-call',
133
183
  STOP_CLOSED_CAPTIONS_CALL: 'stop-closed-captions-call',
134
184
  STOP_FRAME_RECORD_CALL: 'stop-frame-record-call',
185
+ STOP_INDIVIDUAL_RECORD_CALL: 'stop-individual-record-call',
186
+ STOP_RAW_RECORD_CALL: 'stop-raw-record-call',
135
187
  STOP_RECORD_CALL: 'stop-record-call',
136
188
  STOP_TRANSCRIPTION_CALL: 'stop-transcription-call',
137
189
  UPDATE_CALL: 'update-call',
@@ -169,6 +221,22 @@ const RTMPSettingsRequestQualityEnum = {
169
221
  PORTRAIT_1080X1920: 'portrait-1080x1920',
170
222
  PORTRAIT_1440X2560: 'portrait-1440x2560',
171
223
  };
224
+ /**
225
+ * @export
226
+ */
227
+ const RawRecordingSettingsRequestModeEnum = {
228
+ AVAILABLE: 'available',
229
+ DISABLED: 'disabled',
230
+ AUTO_ON: 'auto-on',
231
+ };
232
+ /**
233
+ * @export
234
+ */
235
+ const RawRecordingSettingsResponseModeEnum = {
236
+ AVAILABLE: 'available',
237
+ DISABLED: 'disabled',
238
+ AUTO_ON: 'auto-on',
239
+ };
172
240
  /**
173
241
  * @export
174
242
  */
@@ -3984,15 +4052,18 @@ const extractMid = (transceiver, transceiverInitIndex, sdp) => {
3984
4052
  return '';
3985
4053
  return String(transceiverInitIndex);
3986
4054
  };
3987
- /*
3988
- * Sets the start bitrate for the VP9 and H264 codecs in the SDP.
4055
+ /**
4056
+ * Sets the start bitrate for the VP9, H264, and AV1 codecs in the SDP.
3989
4057
  *
3990
4058
  * @param offerSdp the offer SDP to modify.
3991
- * @param startBitrate the start bitrate in kbps to set. Default is 1000 kbps.
4059
+ * @param maxBitrateKbps the maximum bitrate in kbps.
4060
+ * @param startBitrateFactor the factor (0-1) to multiply with maxBitrateKbps to get the start bitrate.
4061
+ * @param targetMid the media ID to target.
3992
4062
  */
3993
4063
  const setStartBitrate = (offerSdp, maxBitrateKbps, startBitrateFactor, targetMid) => {
3994
4064
  // start bitrate should be between 300kbps and max-bitrate-kbps
3995
- const startBitrate = Math.max(Math.min(maxBitrateKbps, startBitrateFactor * maxBitrateKbps), 300);
4065
+ // Clamp to max first, then ensure minimum of 300 (but never exceed max)
4066
+ const startBitrate = Math.min(maxBitrateKbps, Math.max(300, startBitrateFactor * maxBitrateKbps));
3996
4067
  const parsedSdp = parse(offerSdp);
3997
4068
  const targetCodecs = new Set(['av1', 'vp9', 'h264']);
3998
4069
  for (const media of parsedSdp.media) {
@@ -4003,14 +4074,27 @@ const setStartBitrate = (offerSdp, maxBitrateKbps, startBitrateFactor, targetMid
4003
4074
  for (const rtp of media.rtp) {
4004
4075
  if (!targetCodecs.has(rtp.codec.toLowerCase()))
4005
4076
  continue;
4006
- for (const fmtp of media.fmtp) {
4007
- if (fmtp.payload === rtp.payload) {
4008
- if (!fmtp.config.includes('x-google-start-bitrate')) {
4009
- fmtp.config += `;x-google-start-bitrate=${startBitrate}`;
4010
- }
4011
- break;
4077
+ // Find existing fmtp entry for this payload
4078
+ // Guard against media.fmtp being undefined when SDP has no a=fmtp lines
4079
+ const fmtpList = media.fmtp ?? (media.fmtp = []);
4080
+ const existingFmtp = fmtpList.find((fmtp) => fmtp.payload === rtp.payload);
4081
+ if (existingFmtp) {
4082
+ // Append to existing fmtp if not already present
4083
+ // Guard against undefined or empty config from malformed SDP
4084
+ const config = existingFmtp.config ?? '';
4085
+ if (!config.includes('x-google-start-bitrate')) {
4086
+ existingFmtp.config = config
4087
+ ? `${config};x-google-start-bitrate=${startBitrate}`
4088
+ : `x-google-start-bitrate=${startBitrate}`;
4012
4089
  }
4013
4090
  }
4091
+ else {
4092
+ // Create new fmtp entry if none exists
4093
+ fmtpList.push({
4094
+ payload: rtp.payload,
4095
+ config: `x-google-start-bitrate=${startBitrate}`,
4096
+ });
4097
+ }
4014
4098
  }
4015
4099
  }
4016
4100
  return write(parsedSdp);
@@ -4940,6 +5024,10 @@ const paginatedLayoutSortPreset = combineComparators(pinned, ifInvisibleOrUnknow
4940
5024
  */
4941
5025
  const livestreamOrAudioRoomSortPreset = combineComparators(ifInvisibleBy(combineComparators(dominantSpeaker, speaking, reactionType('raised-hand'), withVideoIngressSource, publishingVideo, publishingAudio)), role('admin', 'host', 'speaker'));
4942
5026
 
5027
+ const ensureExhausted = (x, message) => {
5028
+ videoLoggerSystem.getLogger('helpers').warn(message, x);
5029
+ };
5030
+
4943
5031
  /**
4944
5032
  * Returns the default egress object - when no egress data is available.
4945
5033
  */
@@ -4969,6 +5057,8 @@ class CallState {
4969
5057
  this.egressSubject = new BehaviorSubject(undefined);
4970
5058
  this.ingressSubject = new BehaviorSubject(undefined);
4971
5059
  this.recordingSubject = new BehaviorSubject(false);
5060
+ this.individualRecordingSubject = new BehaviorSubject(false);
5061
+ this.rawRecordingSubject = new BehaviorSubject(false);
4972
5062
  this.sessionSubject = new BehaviorSubject(undefined);
4973
5063
  this.settingsSubject = new BehaviorSubject(undefined);
4974
5064
  this.transcribingSubject = new BehaviorSubject(false);
@@ -5395,7 +5485,10 @@ class CallState {
5395
5485
  this.setCurrentValue(this.customSubject, call.custom);
5396
5486
  this.setCurrentValue(this.egressSubject, call.egress);
5397
5487
  this.setCurrentValue(this.ingressSubject, call.ingress);
5398
- this.setCurrentValue(this.recordingSubject, call.recording);
5488
+ const { individual_recording, composite_recording, raw_recording } = call.egress;
5489
+ this.setCurrentValue(this.recordingSubject, call.recording || composite_recording?.status === 'running');
5490
+ this.setCurrentValue(this.individualRecordingSubject, individual_recording?.status === 'running');
5491
+ this.setCurrentValue(this.rawRecordingSubject, raw_recording?.status === 'running');
5399
5492
  const s = this.setCurrentValue(this.sessionSubject, call.session);
5400
5493
  this.updateParticipantCountFromSession(s);
5401
5494
  this.setCurrentValue(this.settingsSubject, call.settings);
@@ -5471,6 +5564,21 @@ class CallState {
5471
5564
  },
5472
5565
  }));
5473
5566
  };
5567
+ this.updateFromRecordingEvent = (type, running) => {
5568
+ // handle the legacy format, where `type` is absent in the emitted events
5569
+ if (type === undefined || type === 'composite') {
5570
+ this.setCurrentValue(this.recordingSubject, running);
5571
+ }
5572
+ else if (type === 'individual') {
5573
+ this.setCurrentValue(this.individualRecordingSubject, running);
5574
+ }
5575
+ else if (type === 'raw') {
5576
+ this.setCurrentValue(this.rawRecordingSubject, running);
5577
+ }
5578
+ else {
5579
+ ensureExhausted(type, 'Unknown recording type');
5580
+ }
5581
+ };
5474
5582
  this.updateParticipantCountFromSession = (session) => {
5475
5583
  // when in JOINED state, we should use the participant count coming through
5476
5584
  // the SFU healthcheck event, as it's more accurate.
@@ -5705,6 +5813,8 @@ class CallState {
5705
5813
  }), distinctUntilChanged(isShallowEqual), shareReplay({ bufferSize: 1, refCount: true }));
5706
5814
  this.participantCount$ = duc(this.participantCountSubject);
5707
5815
  this.recording$ = duc(this.recordingSubject);
5816
+ this.individualRecording$ = duc(this.individualRecordingSubject);
5817
+ this.rawRecording$ = duc(this.rawRecordingSubject);
5708
5818
  this.transcribing$ = duc(this.transcribingSubject);
5709
5819
  this.captioning$ = duc(this.captioningSubject);
5710
5820
  this.eventHandlers = {
@@ -5771,9 +5881,15 @@ class CallState {
5771
5881
  },
5772
5882
  'call.permissions_updated': this.updateOwnCapabilities,
5773
5883
  'call.reaction_new': this.updateParticipantReaction,
5774
- 'call.recording_started': () => this.setCurrentValue(this.recordingSubject, true),
5775
- 'call.recording_stopped': () => this.setCurrentValue(this.recordingSubject, false),
5776
- 'call.recording_failed': () => this.setCurrentValue(this.recordingSubject, false),
5884
+ 'call.recording_started': (e) => {
5885
+ this.updateFromRecordingEvent(e.recording_type, true);
5886
+ },
5887
+ 'call.recording_stopped': (e) => {
5888
+ this.updateFromRecordingEvent(e.recording_type, false);
5889
+ },
5890
+ 'call.recording_failed': (e) => {
5891
+ this.updateFromRecordingEvent(e.recording_type, false);
5892
+ },
5777
5893
  'call.rejected': (e) => this.updateFromCallResponse(e.call),
5778
5894
  'call.ring': (e) => this.updateFromCallResponse(e.call),
5779
5895
  'call.missed': (e) => this.updateFromCallResponse(e.call),
@@ -5956,11 +6072,23 @@ class CallState {
5956
6072
  return this.getCurrentValue(this.ingress$);
5957
6073
  }
5958
6074
  /**
5959
- * Will provide the recording state of this call.
6075
+ * Will provide the composite recording state of this call.
5960
6076
  */
5961
6077
  get recording() {
5962
6078
  return this.getCurrentValue(this.recording$);
5963
6079
  }
6080
+ /**
6081
+ * Will provide the individual recording state of this call.
6082
+ */
6083
+ get individualRecording() {
6084
+ return this.getCurrentValue(this.individualRecording$);
6085
+ }
6086
+ /**
6087
+ * Will provide the raw recording state of this call.
6088
+ */
6089
+ get rawRecording() {
6090
+ return this.getCurrentValue(this.rawRecording$);
6091
+ }
5964
6092
  /**
5965
6093
  * Will provide the session data of this call.
5966
6094
  */
@@ -6061,7 +6189,7 @@ const getSdkVersion = (sdk) => {
6061
6189
  return sdk ? `${sdk.major}.${sdk.minor}.${sdk.patch}` : '0.0.0-development';
6062
6190
  };
6063
6191
 
6064
- const version = "1.40.2";
6192
+ const version = "1.41.0";
6065
6193
  const [major, minor, patch] = version.split('.');
6066
6194
  let sdkInfo = {
6067
6195
  type: SdkType.PLAIN_JAVASCRIPT,
@@ -7409,10 +7537,6 @@ class TransceiverCache {
7409
7537
  }
7410
7538
  }
7411
7539
 
7412
- const ensureExhausted = (x, message) => {
7413
- videoLoggerSystem.getLogger('helpers').warn(message, x);
7414
- };
7415
-
7416
7540
  const trackTypeToParticipantStreamKey = (trackType) => {
7417
7541
  switch (trackType) {
7418
7542
  case TrackType.SCREEN_SHARE:
@@ -7893,7 +8017,7 @@ class Publisher extends BasePeerConnection {
7893
8017
  let sdp = dangerouslyForceCodec
7894
8018
  ? removeCodecsExcept(baseSdp, dangerouslyForceCodec, fmtpLine)
7895
8019
  : baseSdp;
7896
- if (dangerouslySetStartBitrateFactor) {
8020
+ if (dangerouslySetStartBitrateFactor !== undefined) {
7897
8021
  this.transceiverCache.items().forEach((t) => {
7898
8022
  if (t.publishOption.trackType !== TrackType.VIDEO)
7899
8023
  return;
@@ -11931,8 +12055,6 @@ class SpeakerManager {
11931
12055
  /**
11932
12056
  * Set the volume of a participant.
11933
12057
  *
11934
- * Note: This method is not supported in React Native.
11935
- *
11936
12058
  * @param sessionId the participant's session id.
11937
12059
  * @param volume a number between 0 and 1. Set it to `undefined` to use the default volume.
11938
12060
  */
@@ -12275,6 +12397,7 @@ class Call {
12275
12397
  this.ringingSubject.next(false);
12276
12398
  this.cancelAutoDrop();
12277
12399
  this.clientStore.unregisterCall(this);
12400
+ globalThis.streamRNVideoSDK?.callManager.stop();
12278
12401
  this.camera.dispose();
12279
12402
  this.microphone.dispose();
12280
12403
  this.screenShare.dispose();
@@ -12607,6 +12730,7 @@ class Call {
12607
12730
  // re-apply them on later reconnections or server-side data fetches
12608
12731
  if (!this.deviceSettingsAppliedOnce && this.state.settings) {
12609
12732
  await this.applyDeviceConfig(this.state.settings, true);
12733
+ globalThis.streamRNVideoSDK?.callManager.start();
12610
12734
  this.deviceSettingsAppliedOnce = true;
12611
12735
  }
12612
12736
  // We shouldn't persist the `ring` and `notify` state after joining the call
@@ -12798,7 +12922,7 @@ class Call {
12798
12922
  }
12799
12923
  if (this.streamClient._hasConnectionID()) {
12800
12924
  this.watching = true;
12801
- this.clientStore.registerCall(this);
12925
+ this.clientStore.registerOrUpdateCall(this);
12802
12926
  }
12803
12927
  return joinResponse;
12804
12928
  };
@@ -13398,14 +13522,22 @@ class Call {
13398
13522
  /**
13399
13523
  * Starts recording the call
13400
13524
  */
13401
- this.startRecording = async (request) => {
13402
- return this.streamClient.post(`${this.streamClientBasePath}/start_recording`, request ? request : {});
13525
+ this.startRecording = async (dataOrType, type) => {
13526
+ type = typeof dataOrType === 'string' ? dataOrType : type;
13527
+ dataOrType = typeof dataOrType === 'string' ? undefined : dataOrType;
13528
+ const endpoint = !type
13529
+ ? `/start_recording`
13530
+ : `/recordings/${encodeURIComponent(type)}/start`;
13531
+ return this.streamClient.post(`${this.streamClientBasePath}${endpoint}`, dataOrType);
13403
13532
  };
13404
13533
  /**
13405
13534
  * Stops recording the call
13406
13535
  */
13407
- this.stopRecording = async () => {
13408
- return this.streamClient.post(`${this.streamClientBasePath}/stop_recording`, {});
13536
+ this.stopRecording = async (type) => {
13537
+ const endpoint = !type
13538
+ ? `/stop_recording`
13539
+ : `/recordings/${encodeURIComponent(type)}/stop`;
13540
+ return this.streamClient.post(`${this.streamClientBasePath}${endpoint}`);
13409
13541
  };
13410
13542
  /**
13411
13543
  * Starts the transcription of the call.
@@ -13802,6 +13934,9 @@ class Call {
13802
13934
  * @internal
13803
13935
  */
13804
13936
  this.applyDeviceConfig = async (settings, publish) => {
13937
+ globalThis.streamRNVideoSDK?.callManager.setup({
13938
+ default_device: settings.audio.default_device,
13939
+ });
13805
13940
  await this.camera.apply(settings.video, publish).catch((err) => {
13806
13941
  this.logger.warn('Camera init failed', err);
13807
13942
  });
@@ -15113,7 +15248,7 @@ class StreamClient {
15113
15248
  this.getUserAgent = () => {
15114
15249
  if (!this.cachedUserAgent) {
15115
15250
  const { clientAppIdentifier = {} } = this.options;
15116
- const { sdkName = 'js', sdkVersion = "1.40.2", ...extras } = clientAppIdentifier;
15251
+ const { sdkName = 'js', sdkVersion = "1.41.0", ...extras } = clientAppIdentifier;
15117
15252
  this.cachedUserAgent = [
15118
15253
  `stream-video-${sdkName}-v${sdkVersion}`,
15119
15254
  ...Object.entries(extras).map(([key, value]) => `${key}=${value}`),
@@ -15749,5 +15884,5 @@ const humanize = (n) => {
15749
15884
  return String(n);
15750
15885
  };
15751
15886
 
15752
- export { AudioSettingsRequestDefaultDeviceEnum, AudioSettingsResponseDefaultDeviceEnum, browsers as Browsers, Call, CallState, CallType, CallTypes, CallingState, CameraManager, CameraManagerState, CreateDeviceRequestPushProviderEnum, DebounceType, DeviceManager, DeviceManagerState, DynascaleManager, ErrorFromResponse, FrameRecordingSettingsRequestModeEnum, FrameRecordingSettingsRequestQualityEnum, FrameRecordingSettingsResponseModeEnum, IngressAudioEncodingOptionsRequestChannelsEnum, IngressSourceRequestFpsEnum, IngressVideoLayerRequestCodecEnum, LayoutSettingsRequestNameEnum, MicrophoneManager, MicrophoneManagerState, NoiseCancellationSettingsModeEnum, OwnCapability, RNSpeechDetector, RTMPBroadcastRequestQualityEnum, RTMPSettingsRequestQualityEnum, RecordSettingsRequestModeEnum, RecordSettingsRequestQualityEnum, rxUtils as RxUtils, ScreenShareManager, ScreenShareState, events as SfuEvents, SfuJoinError, models as SfuModels, SpeakerManager, SpeakerState, StartClosedCaptionsRequestLanguageEnum, StartTranscriptionRequestLanguageEnum, StreamSfuClient, StreamVideoClient, StreamVideoReadOnlyStateStore, StreamVideoWriteableStateStore, TranscriptionSettingsRequestClosedCaptionModeEnum, TranscriptionSettingsRequestLanguageEnum, TranscriptionSettingsRequestModeEnum, TranscriptionSettingsResponseClosedCaptionModeEnum, TranscriptionSettingsResponseLanguageEnum, TranscriptionSettingsResponseModeEnum, VideoSettingsRequestCameraFacingEnum, VideoSettingsResponseCameraFacingEnum, ViewportTracker, VisibilityState, checkIfAudioOutputChangeSupported, combineComparators, conditional, createSoundDetector, defaultSortPreset, descending, deviceIds$, disposeOfMediaStream, dominantSpeaker, getAudioBrowserPermission, getAudioDevices, getAudioOutputDevices, getAudioStream, getClientDetails, getDeviceState, getScreenShareStream, getSdkInfo, getVideoBrowserPermission, getVideoDevices, getVideoStream, getWebRTCInfo, hasAudio, hasPausedTrack, hasScreenShare, hasScreenShareAudio, hasVideo, humanize, isPinned, livestreamOrAudioRoomSortPreset, logToConsole, name, noopComparator, paginatedLayoutSortPreset, pinned, publishingAudio, publishingVideo, reactionType, resolveDeviceId, role, screenSharing, setDeviceInfo, setOSInfo, setPowerState, setSdkInfo, setThermalState, setWebRTCInfo, speakerLayoutSortPreset, speaking, videoLoggerSystem, withParticipantSource };
15887
+ export { AudioSettingsRequestDefaultDeviceEnum, AudioSettingsResponseDefaultDeviceEnum, browsers as Browsers, Call, CallRecordingFailedEventRecordingTypeEnum, CallRecordingReadyEventRecordingTypeEnum, CallRecordingStartedEventRecordingTypeEnum, CallRecordingStoppedEventRecordingTypeEnum, CallState, CallType, CallTypes, CallingState, CameraManager, CameraManagerState, CreateDeviceRequestPushProviderEnum, DebounceType, DeviceManager, DeviceManagerState, DynascaleManager, ErrorFromResponse, FrameRecordingSettingsRequestModeEnum, FrameRecordingSettingsRequestQualityEnum, FrameRecordingSettingsResponseModeEnum, IndividualRecordingSettingsRequestModeEnum, IndividualRecordingSettingsResponseModeEnum, IngressAudioEncodingOptionsRequestChannelsEnum, IngressSourceRequestFpsEnum, IngressVideoLayerRequestCodecEnum, LayoutSettingsRequestNameEnum, MicrophoneManager, MicrophoneManagerState, NoiseCancellationSettingsModeEnum, OwnCapability, RNSpeechDetector, RTMPBroadcastRequestQualityEnum, RTMPSettingsRequestQualityEnum, RawRecordingSettingsRequestModeEnum, RawRecordingSettingsResponseModeEnum, RecordSettingsRequestModeEnum, RecordSettingsRequestQualityEnum, rxUtils as RxUtils, ScreenShareManager, ScreenShareState, events as SfuEvents, SfuJoinError, models as SfuModels, SpeakerManager, SpeakerState, StartClosedCaptionsRequestLanguageEnum, StartTranscriptionRequestLanguageEnum, StreamSfuClient, StreamVideoClient, StreamVideoReadOnlyStateStore, StreamVideoWriteableStateStore, TranscriptionSettingsRequestClosedCaptionModeEnum, TranscriptionSettingsRequestLanguageEnum, TranscriptionSettingsRequestModeEnum, TranscriptionSettingsResponseClosedCaptionModeEnum, TranscriptionSettingsResponseLanguageEnum, TranscriptionSettingsResponseModeEnum, VideoSettingsRequestCameraFacingEnum, VideoSettingsResponseCameraFacingEnum, ViewportTracker, VisibilityState, checkIfAudioOutputChangeSupported, combineComparators, conditional, createSoundDetector, defaultSortPreset, descending, deviceIds$, disposeOfMediaStream, dominantSpeaker, getAudioBrowserPermission, getAudioDevices, getAudioOutputDevices, getAudioStream, getClientDetails, getDeviceState, getScreenShareStream, getSdkInfo, getVideoBrowserPermission, getVideoDevices, getVideoStream, getWebRTCInfo, hasAudio, hasPausedTrack, hasScreenShare, hasScreenShareAudio, hasVideo, humanize, isPinned, livestreamOrAudioRoomSortPreset, logToConsole, name, noopComparator, paginatedLayoutSortPreset, pinned, publishingAudio, publishingVideo, reactionType, resolveDeviceId, role, screenSharing, setDeviceInfo, setOSInfo, setPowerState, setSdkInfo, setThermalState, setWebRTCInfo, speakerLayoutSortPreset, speaking, videoLoggerSystem, withParticipantSource };
15753
15888
  //# sourceMappingURL=index.es.js.map