@stream-io/video-client 0.6.2 → 0.6.3

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 (33) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/index.browser.es.js +269 -20
  3. package/dist/index.browser.es.js.map +1 -1
  4. package/dist/index.cjs.js +270 -19
  5. package/dist/index.cjs.js.map +1 -1
  6. package/dist/index.es.js +269 -20
  7. package/dist/index.es.js.map +1 -1
  8. package/dist/src/Call.d.ts +1 -0
  9. package/dist/src/StreamSfuClient.d.ts +2 -1
  10. package/dist/src/client-details.d.ts +10 -1
  11. package/dist/src/gen/coordinator/index.d.ts +19 -0
  12. package/dist/src/gen/video/sfu/signal_rpc/signal.client.d.ts +9 -1
  13. package/dist/src/gen/video/sfu/signal_rpc/signal.d.ts +58 -0
  14. package/dist/src/rtc/flows/join.d.ts +1 -0
  15. package/dist/src/stats/SfuStatsReporter.d.ts +25 -0
  16. package/dist/src/stats/index.d.ts +3 -0
  17. package/dist/src/stats/utils.d.ts +6 -0
  18. package/dist/src/store/CallState.d.ts +1 -1
  19. package/package.json +1 -1
  20. package/src/Call.ts +26 -9
  21. package/src/StreamSfuClient.ts +12 -0
  22. package/src/client-details.ts +18 -1
  23. package/src/gen/coordinator/index.ts +19 -0
  24. package/src/gen/video/sfu/signal_rpc/signal.client.ts +26 -0
  25. package/src/gen/video/sfu/signal_rpc/signal.ts +250 -0
  26. package/src/helpers/RNSpeechDetector.ts +1 -1
  27. package/src/rtc/flows/join.ts +4 -2
  28. package/src/stats/SfuStatsReporter.ts +88 -0
  29. package/src/stats/index.ts +3 -0
  30. package/src/stats/{state-store-stats-reporter.ts → stateStoreStatsReporter.ts} +1 -13
  31. package/src/stats/utils.ts +12 -0
  32. package/src/store/CallState.ts +1 -1
  33. /package/dist/src/stats/{state-store-stats-reporter.d.ts → stateStoreStatsReporter.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ### [0.6.3](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-client-0.6.2...@stream-io/video-client-0.6.3) (2024-03-25)
6
+
7
+
8
+ ### Features
9
+
10
+ * SFU stats reporting ([#1297](https://github.com/GetStream/stream-video-js/issues/1297)) ([f46e927](https://github.com/GetStream/stream-video-js/commit/f46e927cbd650bc9af64a01cd5ebcec6cf2cfda8)), closes [#1276](https://github.com/GetStream/stream-video-js/issues/1276)
11
+
5
12
  ### [0.6.2](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-client-0.6.1...@stream-io/video-client-0.6.2) (2024-03-25)
6
13
 
7
14
 
@@ -2446,6 +2446,159 @@ var models = /*#__PURE__*/Object.freeze({
2446
2446
  // @generated from protobuf file "video/sfu/signal_rpc/signal.proto" (package "stream.video.sfu.signal", syntax proto3)
2447
2447
  // tslint:disable
2448
2448
  // @generated message type with reflection information, may provide speed optimized methods
2449
+ class SendStatsRequest$Type extends MessageType {
2450
+ constructor() {
2451
+ super('stream.video.sfu.signal.SendStatsRequest', [
2452
+ { no: 1, name: 'session_id', kind: 'scalar', T: 9 /*ScalarType.STRING*/ },
2453
+ {
2454
+ no: 2,
2455
+ name: 'subscriber_stats',
2456
+ kind: 'scalar',
2457
+ T: 9 /*ScalarType.STRING*/,
2458
+ },
2459
+ {
2460
+ no: 3,
2461
+ name: 'publisher_stats',
2462
+ kind: 'scalar',
2463
+ T: 9 /*ScalarType.STRING*/,
2464
+ },
2465
+ {
2466
+ no: 4,
2467
+ name: 'webrtc_version',
2468
+ kind: 'scalar',
2469
+ T: 9 /*ScalarType.STRING*/,
2470
+ },
2471
+ { no: 5, name: 'sdk', kind: 'scalar', T: 9 /*ScalarType.STRING*/ },
2472
+ {
2473
+ no: 6,
2474
+ name: 'sdk_version',
2475
+ kind: 'scalar',
2476
+ T: 9 /*ScalarType.STRING*/,
2477
+ },
2478
+ ]);
2479
+ }
2480
+ create(value) {
2481
+ const message = globalThis.Object.create(this.messagePrototype);
2482
+ message.sessionId = '';
2483
+ message.subscriberStats = '';
2484
+ message.publisherStats = '';
2485
+ message.webrtcVersion = '';
2486
+ message.sdk = '';
2487
+ message.sdkVersion = '';
2488
+ if (value !== undefined)
2489
+ reflectionMergePartial(this, message, value);
2490
+ return message;
2491
+ }
2492
+ internalBinaryRead(reader, length, options, target) {
2493
+ let message = target ?? this.create(), end = reader.pos + length;
2494
+ while (reader.pos < end) {
2495
+ let [fieldNo, wireType] = reader.tag();
2496
+ switch (fieldNo) {
2497
+ case /* string session_id */ 1:
2498
+ message.sessionId = reader.string();
2499
+ break;
2500
+ case /* string subscriber_stats */ 2:
2501
+ message.subscriberStats = reader.string();
2502
+ break;
2503
+ case /* string publisher_stats */ 3:
2504
+ message.publisherStats = reader.string();
2505
+ break;
2506
+ case /* string webrtc_version */ 4:
2507
+ message.webrtcVersion = reader.string();
2508
+ break;
2509
+ case /* string sdk */ 5:
2510
+ message.sdk = reader.string();
2511
+ break;
2512
+ case /* string sdk_version */ 6:
2513
+ message.sdkVersion = reader.string();
2514
+ break;
2515
+ default:
2516
+ let u = options.readUnknownField;
2517
+ if (u === 'throw')
2518
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
2519
+ let d = reader.skip(wireType);
2520
+ if (u !== false)
2521
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
2522
+ }
2523
+ }
2524
+ return message;
2525
+ }
2526
+ internalBinaryWrite(message, writer, options) {
2527
+ /* string session_id = 1; */
2528
+ if (message.sessionId !== '')
2529
+ writer.tag(1, WireType.LengthDelimited).string(message.sessionId);
2530
+ /* string subscriber_stats = 2; */
2531
+ if (message.subscriberStats !== '')
2532
+ writer.tag(2, WireType.LengthDelimited).string(message.subscriberStats);
2533
+ /* string publisher_stats = 3; */
2534
+ if (message.publisherStats !== '')
2535
+ writer.tag(3, WireType.LengthDelimited).string(message.publisherStats);
2536
+ /* string webrtc_version = 4; */
2537
+ if (message.webrtcVersion !== '')
2538
+ writer.tag(4, WireType.LengthDelimited).string(message.webrtcVersion);
2539
+ /* string sdk = 5; */
2540
+ if (message.sdk !== '')
2541
+ writer.tag(5, WireType.LengthDelimited).string(message.sdk);
2542
+ /* string sdk_version = 6; */
2543
+ if (message.sdkVersion !== '')
2544
+ writer.tag(6, WireType.LengthDelimited).string(message.sdkVersion);
2545
+ let u = options.writeUnknownFields;
2546
+ if (u !== false)
2547
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
2548
+ return writer;
2549
+ }
2550
+ }
2551
+ /**
2552
+ * @generated MessageType for protobuf message stream.video.sfu.signal.SendStatsRequest
2553
+ */
2554
+ const SendStatsRequest = new SendStatsRequest$Type();
2555
+ // @generated message type with reflection information, may provide speed optimized methods
2556
+ class SendStatsResponse$Type extends MessageType {
2557
+ constructor() {
2558
+ super('stream.video.sfu.signal.SendStatsResponse', [
2559
+ { no: 1, name: 'error', kind: 'message', T: () => Error$2 },
2560
+ ]);
2561
+ }
2562
+ create(value) {
2563
+ const message = globalThis.Object.create(this.messagePrototype);
2564
+ if (value !== undefined)
2565
+ reflectionMergePartial(this, message, value);
2566
+ return message;
2567
+ }
2568
+ internalBinaryRead(reader, length, options, target) {
2569
+ let message = target ?? this.create(), end = reader.pos + length;
2570
+ while (reader.pos < end) {
2571
+ let [fieldNo, wireType] = reader.tag();
2572
+ switch (fieldNo) {
2573
+ case /* stream.video.sfu.models.Error error */ 1:
2574
+ message.error = Error$2.internalBinaryRead(reader, reader.uint32(), options, message.error);
2575
+ break;
2576
+ default:
2577
+ let u = options.readUnknownField;
2578
+ if (u === 'throw')
2579
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
2580
+ let d = reader.skip(wireType);
2581
+ if (u !== false)
2582
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
2583
+ }
2584
+ }
2585
+ return message;
2586
+ }
2587
+ internalBinaryWrite(message, writer, options) {
2588
+ /* stream.video.sfu.models.Error error = 1; */
2589
+ if (message.error)
2590
+ Error$2.internalBinaryWrite(message.error, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
2591
+ let u = options.writeUnknownFields;
2592
+ if (u !== false)
2593
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
2594
+ return writer;
2595
+ }
2596
+ }
2597
+ /**
2598
+ * @generated MessageType for protobuf message stream.video.sfu.signal.SendStatsResponse
2599
+ */
2600
+ const SendStatsResponse = new SendStatsResponse$Type();
2601
+ // @generated message type with reflection information, may provide speed optimized methods
2449
2602
  class ICERestartRequest$Type extends MessageType {
2450
2603
  constructor() {
2451
2604
  super('stream.video.sfu.signal.ICERestartRequest', [
@@ -3336,6 +3489,12 @@ const SignalServer = new ServiceType('stream.video.sfu.signal.SignalServer', [
3336
3489
  I: ICERestartRequest,
3337
3490
  O: ICERestartResponse,
3338
3491
  },
3492
+ {
3493
+ name: 'SendStats',
3494
+ options: {},
3495
+ I: SendStatsRequest,
3496
+ O: SendStatsResponse,
3497
+ },
3339
3498
  ]);
3340
3499
 
3341
3500
  /**
@@ -5631,6 +5790,13 @@ class SignalServerClient {
5631
5790
  const method = this.methods[5], opt = this._transport.mergeOptions(options);
5632
5791
  return stackIntercept('unary', this._transport, method, opt, input);
5633
5792
  }
5793
+ /**
5794
+ * @generated from protobuf rpc: SendStats(stream.video.sfu.signal.SendStatsRequest) returns (stream.video.sfu.signal.SendStatsResponse);
5795
+ */
5796
+ sendStats(input, options) {
5797
+ const method = this.methods[6], opt = this._transport.mergeOptions(options);
5798
+ return stackIntercept('unary', this._transport, method, opt, input);
5799
+ }
5634
5800
  }
5635
5801
 
5636
5802
  const defaultOptions = {
@@ -5885,6 +6051,7 @@ function getIceCandidate(candidate) {
5885
6051
  let sdkInfo;
5886
6052
  let osInfo;
5887
6053
  let deviceInfo;
6054
+ let webRtcInfo;
5888
6055
  const setSdkInfo = (info) => {
5889
6056
  sdkInfo = info;
5890
6057
  };
@@ -5903,6 +6070,12 @@ const setDeviceInfo = (info) => {
5903
6070
  const getDeviceInfo = () => {
5904
6071
  return deviceInfo;
5905
6072
  };
6073
+ const getWebRTCInfo = () => {
6074
+ return webRtcInfo;
6075
+ };
6076
+ const setWebRTCInfo = (info) => {
6077
+ webRtcInfo = info;
6078
+ };
5906
6079
  const getClientDetails = () => {
5907
6080
  if (isReactNative()) {
5908
6081
  // Since RN doesn't support web, sharing browser info is not required
@@ -8486,6 +8659,12 @@ class StreamSfuClient {
8486
8659
  sessionId: this.sessionId,
8487
8660
  }), this.logger);
8488
8661
  };
8662
+ this.sendStats = async (stats) => {
8663
+ return retryable(() => this.rpc.sendStats({
8664
+ ...stats,
8665
+ sessionId: this.sessionId,
8666
+ }), this.logger);
8667
+ };
8489
8668
  this.join = async (data) => {
8490
8669
  const joinRequest = JoinRequest.create({
8491
8670
  ...data,
@@ -9020,8 +9199,7 @@ const registerRingingCallEventHandlers = (call) => {
9020
9199
  * @param data the data for the call.
9021
9200
  */
9022
9201
  const join = async (httpClient, type, id, data) => {
9023
- const joinCallResponse = await doJoin(httpClient, type, id, data);
9024
- const { call, credentials, members, own_capabilities } = joinCallResponse;
9202
+ const { call, credentials, members, own_capabilities, stats_options } = await doJoin(httpClient, type, id, data);
9025
9203
  return {
9026
9204
  connectionConfig: toRtcConfiguration(credentials.ice_servers),
9027
9205
  sfuServer: credentials.server,
@@ -9029,6 +9207,7 @@ const join = async (httpClient, type, id, data) => {
9029
9207
  metadata: call,
9030
9208
  members,
9031
9209
  ownCapabilities: own_capabilities,
9210
+ statsOptions: stats_options,
9032
9211
  };
9033
9212
  };
9034
9213
  const doJoin = async (httpClient, type, id, data) => {
@@ -9052,6 +9231,19 @@ const toRtcConfiguration = (config) => {
9052
9231
  return rtcConfig;
9053
9232
  };
9054
9233
 
9234
+ /**
9235
+ * Flatten the stats report into an array of stats objects.
9236
+ *
9237
+ * @param report the report to flatten.
9238
+ */
9239
+ const flatten$1 = (report) => {
9240
+ const stats = [];
9241
+ report.forEach((s) => {
9242
+ stats.push(s);
9243
+ });
9244
+ return stats;
9245
+ };
9246
+
9055
9247
  /**
9056
9248
  * Creates a new StatsReporter instance that collects metrics about the ongoing call and reports them to the state store
9057
9249
  */
@@ -9272,18 +9464,58 @@ const aggregate = (stats) => {
9272
9464
  }
9273
9465
  return report;
9274
9466
  };
9275
- /**
9276
- * Flatten the stats report into an array of stats objects.
9277
- *
9278
- * @param report the report to flatten.
9279
- */
9280
- const flatten$1 = (report) => {
9281
- const stats = [];
9282
- report.forEach((s) => {
9283
- stats.push(s);
9284
- });
9285
- return stats;
9286
- };
9467
+
9468
+ class SfuStatsReporter {
9469
+ constructor(sfuClient, { options, clientDetails, subscriber, publisher }) {
9470
+ this.logger = getLogger(['SfuStatsReporter']);
9471
+ this.run = async () => {
9472
+ const [subscriberStats, publisherStats] = await Promise.all([
9473
+ this.subscriber.getStats().then(flatten$1).then(JSON.stringify),
9474
+ this.publisher.getStats().then(flatten$1).then(JSON.stringify),
9475
+ ]);
9476
+ await this.sfuClient.sendStats({
9477
+ sdk: this.sdkName,
9478
+ sdkVersion: this.sdkVersion,
9479
+ webrtcVersion: this.webRTCVersion,
9480
+ subscriberStats,
9481
+ publisherStats,
9482
+ });
9483
+ };
9484
+ this.start = () => {
9485
+ if (this.options.reporting_interval_ms <= 0)
9486
+ return;
9487
+ this.intervalId = setInterval(() => {
9488
+ this.run().catch((err) => {
9489
+ this.logger('warn', 'Failed to report stats', err);
9490
+ });
9491
+ }, this.options.reporting_interval_ms);
9492
+ };
9493
+ this.stop = () => {
9494
+ clearInterval(this.intervalId);
9495
+ this.intervalId = undefined;
9496
+ };
9497
+ this.sfuClient = sfuClient;
9498
+ this.options = options;
9499
+ this.subscriber = subscriber;
9500
+ this.publisher = publisher;
9501
+ const webRTCInfo = getWebRTCInfo();
9502
+ const { sdk, browser } = clientDetails;
9503
+ this.sdkName =
9504
+ sdk && sdk.type === SdkType.REACT
9505
+ ? 'stream-react'
9506
+ : sdk && sdk.type === SdkType.REACT_NATIVE
9507
+ ? 'stream-react-native'
9508
+ : 'stream-js';
9509
+ this.sdkVersion = sdk
9510
+ ? `${sdk.major}.${sdk.minor}.${sdk.patch}`
9511
+ : '0.0.0-development';
9512
+ // The WebRTC version if passed from the SDK, it is taken else the browser info is sent.
9513
+ this.webRTCVersion =
9514
+ webRTCInfo?.version ||
9515
+ `${browser?.name || ''}-${browser?.version || ''}` ||
9516
+ 'N/A';
9517
+ }
9518
+ }
9287
9519
 
9288
9520
  const DEFAULT_THRESHOLD = 0.35;
9289
9521
  class ViewportTracker {
@@ -11217,6 +11449,8 @@ class Call {
11217
11449
  }
11218
11450
  this.statsReporter?.stop();
11219
11451
  this.statsReporter = undefined;
11452
+ this.sfuStatsReporter?.stop();
11453
+ this.sfuStatsReporter = undefined;
11220
11454
  this.subscriber?.close();
11221
11455
  this.subscriber = undefined;
11222
11456
  this.publisher?.close();
@@ -11356,12 +11590,14 @@ class Call {
11356
11590
  let sfuServer;
11357
11591
  let sfuToken;
11358
11592
  let connectionConfig;
11593
+ let statsOptions;
11359
11594
  try {
11360
11595
  if (this.sfuClient?.isFastReconnecting) {
11361
11596
  // use previous SFU configuration and values
11362
11597
  connectionConfig = this.publisher?.connectionConfiguration;
11363
11598
  sfuServer = this.sfuClient.sfuServer;
11364
11599
  sfuToken = this.sfuClient.token;
11600
+ statsOptions = this.sfuStatsReporter?.options;
11365
11601
  }
11366
11602
  else {
11367
11603
  // full join flow - let the Coordinator pick a new SFU for us
@@ -11372,6 +11608,7 @@ class Call {
11372
11608
  connectionConfig = call.connectionConfig;
11373
11609
  sfuServer = call.sfuServer;
11374
11610
  sfuToken = call.token;
11611
+ statsOptions = call.statsOptions;
11375
11612
  }
11376
11613
  if (this.streamClient._hasConnectionID()) {
11377
11614
  this.watching = true;
@@ -11428,6 +11665,8 @@ class Call {
11428
11665
  this.publisher = undefined;
11429
11666
  this.statsReporter?.stop();
11430
11667
  this.statsReporter = undefined;
11668
+ this.sfuStatsReporter?.stop();
11669
+ this.sfuStatsReporter = undefined;
11431
11670
  // clean up current connection
11432
11671
  sfuClient.close(StreamSfuClient.NORMAL_CLOSURE, 'js-client: attempting full reconnect');
11433
11672
  }
@@ -11568,10 +11807,10 @@ class Call {
11568
11807
  connectionConfig,
11569
11808
  });
11570
11809
  }
11571
- const audioSettings = this.state.settings?.audio;
11572
- const isDtxEnabled = !!audioSettings?.opus_dtx_enabled;
11573
- const isRedEnabled = !!audioSettings?.redundant_coding_enabled;
11574
11810
  if (!this.publisher) {
11811
+ const audioSettings = this.state.settings?.audio;
11812
+ const isDtxEnabled = !!audioSettings?.opus_dtx_enabled;
11813
+ const isRedEnabled = !!audioSettings?.redundant_coding_enabled;
11575
11814
  this.publisher = new Publisher({
11576
11815
  sfuClient,
11577
11816
  dispatcher: this.dispatcher,
@@ -11588,6 +11827,16 @@ class Call {
11588
11827
  state: this.state,
11589
11828
  });
11590
11829
  }
11830
+ const clientDetails = getClientDetails();
11831
+ if (!this.sfuStatsReporter && statsOptions) {
11832
+ this.sfuStatsReporter = new SfuStatsReporter(sfuClient, {
11833
+ clientDetails,
11834
+ options: statsOptions,
11835
+ subscriber: this.subscriber,
11836
+ publisher: this.publisher,
11837
+ });
11838
+ this.sfuStatsReporter.start();
11839
+ }
11591
11840
  try {
11592
11841
  // 1. wait for the signal server to be ready before sending "joinRequest"
11593
11842
  sfuClient.signalReady
@@ -11607,7 +11856,7 @@ class Call {
11607
11856
  : undefined;
11608
11857
  return sfuClient.join({
11609
11858
  subscriberSdp: sdp || '',
11610
- clientDetails: getClientDetails(),
11859
+ clientDetails,
11611
11860
  migration,
11612
11861
  fastReconnect: previousSfuClient?.isFastReconnecting ?? false,
11613
11862
  });
@@ -14105,7 +14354,7 @@ class StreamClient {
14105
14354
  });
14106
14355
  };
14107
14356
  this.getUserAgent = () => {
14108
- const version = "0.6.2" ;
14357
+ const version = "0.6.3" ;
14109
14358
  return (this.userAgent ||
14110
14359
  `stream-video-javascript-client-${this.node ? 'node' : 'browser'}-${version}`);
14111
14360
  };
@@ -14653,5 +14902,5 @@ class StreamVideoServerClient extends StreamVideoClient {
14653
14902
  }
14654
14903
  }
14655
14904
 
14656
- export { AudioSettingsDefaultDeviceEnum, AudioSettingsRequestDefaultDeviceEnum, browsers as Browsers, Call, CallState, CallType, CallTypes, CallingState, CameraManager, CameraManagerState, CreateDeviceRequestPushProviderEnum, DebounceType, DynascaleManager, ErrorFromResponse, InputMediaDeviceManager, InputMediaDeviceManagerState, LayoutSettingsNameEnum, LayoutSettingsRequestNameEnum, MicrophoneManager, MicrophoneManagerState, OwnCapability, RecordSettingsRequestModeEnum, RecordSettingsRequestQualityEnum, rxUtils as RxUtils, ScreenShareManager, ScreenShareState, events as SfuEvents, models as SfuModels, SpeakerManager, SpeakerState, StreamSfuClient, StreamVideoClient, StreamVideoReadOnlyStateStore, StreamVideoServerClient, StreamVideoWriteableStateStore, TranscriptionSettingsModeEnum, TranscriptionSettingsRequestModeEnum, VideoSettingsCameraFacingEnum, VideoSettingsRequestCameraFacingEnum, ViewportTracker, VisibilityState, checkIfAudioOutputChangeSupported, combineComparators, conditional, createSoundDetector, defaultSortPreset, descending, deviceIds$, disposeOfMediaStream, dominantSpeaker, getAudioDevices, getAudioOutputDevices, getAudioStream, getClientDetails, getDeviceInfo, getLogger, getOSInfo, getScreenShareStream, getSdkInfo, getVideoDevices, getVideoStream, livestreamOrAudioRoomSortPreset, logLevels, logToConsole, name, noopComparator, paginatedLayoutSortPreset, pinned, publishingAudio, publishingVideo, reactionType, role, screenSharing, setDeviceInfo, setLogLevel, setLogger, setOSInfo, setSdkInfo, speakerLayoutSortPreset, speaking };
14905
+ export { AudioSettingsDefaultDeviceEnum, AudioSettingsRequestDefaultDeviceEnum, browsers as Browsers, Call, CallState, CallType, CallTypes, CallingState, CameraManager, CameraManagerState, CreateDeviceRequestPushProviderEnum, DebounceType, DynascaleManager, ErrorFromResponse, InputMediaDeviceManager, InputMediaDeviceManagerState, LayoutSettingsNameEnum, LayoutSettingsRequestNameEnum, MicrophoneManager, MicrophoneManagerState, OwnCapability, RecordSettingsRequestModeEnum, RecordSettingsRequestQualityEnum, rxUtils as RxUtils, ScreenShareManager, ScreenShareState, events as SfuEvents, models as SfuModels, SpeakerManager, SpeakerState, StreamSfuClient, StreamVideoClient, StreamVideoReadOnlyStateStore, StreamVideoServerClient, StreamVideoWriteableStateStore, TranscriptionSettingsModeEnum, TranscriptionSettingsRequestModeEnum, VideoSettingsCameraFacingEnum, VideoSettingsRequestCameraFacingEnum, ViewportTracker, VisibilityState, checkIfAudioOutputChangeSupported, combineComparators, conditional, createSoundDetector, defaultSortPreset, descending, deviceIds$, disposeOfMediaStream, dominantSpeaker, getAudioDevices, getAudioOutputDevices, getAudioStream, getClientDetails, getDeviceInfo, getLogger, getOSInfo, getScreenShareStream, getSdkInfo, getVideoDevices, getVideoStream, getWebRTCInfo, livestreamOrAudioRoomSortPreset, logLevels, logToConsole, name, noopComparator, paginatedLayoutSortPreset, pinned, publishingAudio, publishingVideo, reactionType, role, screenSharing, setDeviceInfo, setLogLevel, setLogger, setOSInfo, setSdkInfo, setWebRTCInfo, speakerLayoutSortPreset, speaking };
14657
14906
  //# sourceMappingURL=index.browser.es.js.map