@whereby.com/core 1.9.2 → 1.9.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.
@@ -1156,7 +1156,7 @@ const createReactor = (selectors, callback) => {
1156
1156
  });
1157
1157
  };
1158
1158
 
1159
- const coreVersion = "1.9.2";
1159
+ const coreVersion = "1.9.3";
1160
1160
 
1161
1161
  const initialState$1 = {
1162
1162
  displayName: null,
@@ -1726,7 +1726,7 @@ const doToggleCamera = createAppAsyncThunk("localMedia/doToggleCamera", (_1, _a)
1726
1726
  else {
1727
1727
  const constraintsOptions = selectLocalMediaConstraintsOptions(state);
1728
1728
  const cameraDeviceId = selectCurrentCameraDeviceId(state);
1729
- yield getStream(Object.assign(Object.assign({}, constraintsOptions), { audioId: false, videoId: cameraDeviceId || true, type: "exact" }), { replaceStream: stream });
1729
+ yield getStream(Object.assign(Object.assign({}, constraintsOptions), { audioId: false, videoId: cameraDeviceId, type: "exact" }), { replaceStream: stream });
1730
1730
  track = stream.getVideoTracks()[0];
1731
1731
  }
1732
1732
  }
@@ -1791,6 +1791,7 @@ const doSetDevice = createAppAsyncThunk("localMedia/reactSetDevice", (_a, _b) =>
1791
1791
  }
1792
1792
  }));
1793
1793
  const doUpdateDeviceList = createAppAsyncThunk("localMedia/doUpdateDeviceList", (_1, _a) => __awaiter(void 0, [_1, _a], void 0, function* (_, { getState, dispatch, rejectWithValue }) {
1794
+ var _b, _c, _d, _e;
1794
1795
  const state = getState();
1795
1796
  let newDevices = [];
1796
1797
  let oldDevices = [];
@@ -1806,29 +1807,19 @@ const doUpdateDeviceList = createAppAsyncThunk("localMedia/doUpdateDeviceList",
1806
1807
  if (!shouldHandleDeviceUpdate) {
1807
1808
  return { devices: newDevices };
1808
1809
  }
1809
- const { currentCameraDeviceId, currentMicrophoneDeviceId, currentSpeakerDeviceId } = state.localMedia;
1810
- const { changedDevices, removedDevices } = getUpdatedDevices({
1810
+ const { changedDevices, addedDevices } = getUpdatedDevices({
1811
1811
  oldDevices,
1812
1812
  newDevices,
1813
- currentVideoId: currentCameraDeviceId,
1814
- currentAudioId: currentMicrophoneDeviceId,
1815
- currentSpeakerId: currentSpeakerDeviceId,
1816
1813
  });
1817
- let autoSwitchAudioId;
1818
- let autoSwitchVideoId;
1819
- if (removedDevices.audioinput) {
1820
- autoSwitchAudioId = true;
1814
+ let autoSwitchAudioId = (_b = changedDevices.audioinput) === null || _b === void 0 ? void 0 : _b.deviceId;
1815
+ let autoSwitchVideoId = (_c = changedDevices.videoinput) === null || _c === void 0 ? void 0 : _c.deviceId;
1816
+ if (autoSwitchAudioId === undefined) {
1817
+ autoSwitchAudioId = (_d = addedDevices.audioinput) === null || _d === void 0 ? void 0 : _d.deviceId;
1821
1818
  }
1822
- if (removedDevices.videoinput) {
1823
- autoSwitchVideoId = true;
1819
+ if (autoSwitchVideoId === undefined) {
1820
+ autoSwitchVideoId = (_e = addedDevices.videoinput) === null || _e === void 0 ? void 0 : _e.deviceId;
1824
1821
  }
1825
- if (!autoSwitchAudioId && changedDevices.audioinput) {
1826
- autoSwitchAudioId = changedDevices.audioinput.deviceId;
1827
- }
1828
- if (!autoSwitchVideoId && changedDevices.videoinput) {
1829
- autoSwitchVideoId = changedDevices.videoinput.deviceId;
1830
- }
1831
- if (autoSwitchAudioId || autoSwitchVideoId) {
1822
+ if (autoSwitchAudioId !== undefined || autoSwitchVideoId !== undefined) {
1832
1823
  dispatch(doSwitchLocalStream({ audioId: autoSwitchAudioId, videoId: autoSwitchVideoId }));
1833
1824
  }
1834
1825
  return { devices: newDevices };
@@ -1846,29 +1837,28 @@ const doSwitchLocalStream = createAppAsyncThunk("localMedia/doSwitchLocalStream"
1846
1837
  return;
1847
1838
  }
1848
1839
  const beforeEffectTracks = selectLocalMediaBeforeEffectTracks(state);
1849
- if (audioId && (beforeEffectTracks === null || beforeEffectTracks === void 0 ? void 0 : beforeEffectTracks.audio)) {
1840
+ if (audioId !== undefined && (beforeEffectTracks === null || beforeEffectTracks === void 0 ? void 0 : beforeEffectTracks.audio)) {
1850
1841
  beforeEffectTracks.audio.stop();
1851
1842
  beforeEffectTracks.audio = undefined;
1852
1843
  }
1853
- if (videoId && (beforeEffectTracks === null || beforeEffectTracks === void 0 ? void 0 : beforeEffectTracks.video)) {
1844
+ if (videoId !== undefined && (beforeEffectTracks === null || beforeEffectTracks === void 0 ? void 0 : beforeEffectTracks.video)) {
1854
1845
  beforeEffectTracks.video.stop();
1855
1846
  beforeEffectTracks.video = undefined;
1856
1847
  }
1857
1848
  try {
1858
- const { replacedTracks, error } = yield getStream(Object.assign(Object.assign({}, constraintsOptions), { audioId: audioId || false, videoId: videoId || false, type: "exact" }), { replaceStream });
1859
- if (error) {
1860
- const deviceId = audioId || videoId;
1861
- if (onlySwitchingOne && typeof deviceId === "string") {
1862
- dispatch(deviceBusy({
1863
- deviceId,
1864
- }));
1865
- }
1849
+ const { replacedTracks } = yield getStream(Object.assign(Object.assign({}, constraintsOptions), { audioId: audioId === undefined ? false : audioId, videoId: videoId === undefined ? false : videoId, type: "exact" }), { replaceStream });
1850
+ const deviceId = audioId || videoId;
1851
+ if (onlySwitchingOne && deviceId) {
1852
+ dispatch(deviceBusy({
1853
+ deviceId,
1854
+ }));
1866
1855
  }
1867
1856
  return { replacedTracks, beforeEffectTracks };
1868
1857
  }
1869
1858
  catch (error) {
1859
+ console.error(error);
1870
1860
  const deviceId = audioId || videoId;
1871
- if (onlySwitchingOne && typeof deviceId === "string") {
1861
+ if (onlySwitchingOne && deviceId) {
1872
1862
  dispatch(deviceBusy({
1873
1863
  deviceId,
1874
1864
  }));
@@ -2008,17 +1998,13 @@ createReactor([selectLocalMediaShouldStartWithOptions], ({ dispatch }, options)
2008
1998
  dispatch(doStartLocalMedia(options));
2009
1999
  }
2010
2000
  });
2011
- startAppListening({
2012
- predicate: (_action, currentState, previousState) => {
2013
- const oldValue = selectAppIsActive(previousState);
2014
- const newValue = selectAppIsActive(currentState);
2015
- const localMediaOptions = selectLocalMediaOptions(currentState);
2016
- const localMediaStatus = selectLocalMediaStatus(currentState);
2017
- return (oldValue === true && newValue === false) && localMediaStatus !== "inactive" && !!localMediaOptions;
2018
- },
2019
- effect: (_, { dispatch }) => {
2001
+ const selectLocalMediaShouldStop = createSelector(selectAppIsActive, selectLocalMediaStatus, selectLocalMediaOptions, (appIsActive, localMediaStatus, localMediaOptions) => {
2002
+ return !appIsActive && localMediaStatus !== "inactive" && !!localMediaOptions;
2003
+ });
2004
+ createReactor([selectLocalMediaShouldStop], ({ dispatch }, localMediaShouldStop) => {
2005
+ if (localMediaShouldStop) {
2020
2006
  dispatch(doStopLocalMedia());
2021
- },
2007
+ }
2022
2008
  });
2023
2009
  startAppListening({
2024
2010
  predicate: (_action, currentState, previousState) => {
@@ -2059,25 +2045,10 @@ startAppListening({
2059
2045
  });
2060
2046
  startAppListening({
2061
2047
  predicate: (_action, currentState, previousState) => {
2062
- var _a, _b;
2063
- const oldDeviceId = selectCurrentCameraDeviceId(previousState);
2064
- const newDeviceId = selectCurrentCameraDeviceId(currentState);
2048
+ const oldValue = selectCurrentCameraDeviceId(previousState);
2049
+ const newValue = selectCurrentCameraDeviceId(currentState);
2065
2050
  const isReady = selectLocalMediaStatus(previousState) === "started";
2066
- const isSwitchingStream = selectLocalMediaIsSwitchingStream(currentState);
2067
- if (isSwitchingStream) {
2068
- return false;
2069
- }
2070
- if (!newDeviceId) {
2071
- return false;
2072
- }
2073
- const currentTrack = (_b = (_a = selectLocalMediaStream(currentState)) === null || _a === void 0 ? void 0 : _a.getVideoTracks()) === null || _b === void 0 ? void 0 : _b[0];
2074
- if (currentTrack && currentTrack.readyState === "live") {
2075
- const currentDeviceId = currentTrack.getSettings().deviceId;
2076
- if (currentDeviceId === newDeviceId) {
2077
- return false;
2078
- }
2079
- }
2080
- return isReady && oldDeviceId !== newDeviceId;
2051
+ return isReady && oldValue !== newValue;
2081
2052
  },
2082
2053
  effect: (_action, { dispatch }) => {
2083
2054
  dispatch(doSetDevice({ audio: false, video: true }));
@@ -2085,25 +2056,10 @@ startAppListening({
2085
2056
  });
2086
2057
  startAppListening({
2087
2058
  predicate: (_action, currentState, previousState) => {
2088
- var _a, _b;
2089
- const oldDeviceId = selectCurrentMicrophoneDeviceId(previousState);
2090
- const newDeviceId = selectCurrentMicrophoneDeviceId(currentState);
2059
+ const oldValue = selectCurrentMicrophoneDeviceId(previousState);
2060
+ const newValue = selectCurrentMicrophoneDeviceId(currentState);
2091
2061
  const isReady = selectLocalMediaStatus(previousState) === "started";
2092
- const isSwitchingStream = selectLocalMediaIsSwitchingStream(currentState);
2093
- if (isSwitchingStream) {
2094
- return false;
2095
- }
2096
- if (!newDeviceId) {
2097
- return false;
2098
- }
2099
- const currentTrack = (_b = (_a = selectLocalMediaStream(currentState)) === null || _a === void 0 ? void 0 : _a.getVideoTracks()) === null || _b === void 0 ? void 0 : _b[0];
2100
- if (currentTrack && currentTrack.readyState === "live") {
2101
- const currentDeviceId = currentTrack.getSettings().deviceId;
2102
- if (currentDeviceId === newDeviceId) {
2103
- return false;
2104
- }
2105
- }
2106
- return isReady && oldDeviceId !== newDeviceId;
2062
+ return isReady && oldValue !== newValue;
2107
2063
  },
2108
2064
  effect: (_action, { dispatch }) => {
2109
2065
  dispatch(doSetDevice({ audio: true, video: false }));
@@ -2922,6 +2878,15 @@ startAppListening({
2922
2878
  },
2923
2879
  });
2924
2880
 
2881
+ function isDeferrable({ client, breakoutCurrentId }) {
2882
+ if (!client)
2883
+ return false;
2884
+ if (!breakoutCurrentId && client.breakoutGroup)
2885
+ return true;
2886
+ if (!client.isAudioEnabled && !client.isVideoEnabled)
2887
+ return true;
2888
+ return false;
2889
+ }
2925
2890
  const createWebRtcEmitter = (dispatch) => {
2926
2891
  return {
2927
2892
  emit: (eventName, data) => {
@@ -3009,12 +2974,22 @@ const doConnectRtc = createAppThunk(() => (dispatch, getState) => {
3009
2974
  const state = getState();
3010
2975
  const socket = selectSignalConnectionRaw(state).socket;
3011
2976
  const dispatcher = selectRtcConnectionRaw(state).rtcManagerDispatcher;
2977
+ const isCameraEnabled = selectIsCameraEnabled(state);
2978
+ const isMicrophoneEnabled = selectIsMicrophoneEnabled(state);
3012
2979
  const isNodeSdk = selectAppIsNodeSdk(state);
3013
2980
  if (dispatcher || !socket) {
3014
2981
  return;
3015
2982
  }
3016
2983
  const webrtcProvider = {
3017
- getMediaConstraints: () => selectLocalMediaConstraintsOptions(state),
2984
+ getMediaConstraints: () => ({
2985
+ audio: isMicrophoneEnabled,
2986
+ video: isCameraEnabled,
2987
+ }),
2988
+ deferrable(clientId) {
2989
+ const client = selectRemoteParticipants(getState()).find((p) => p.id === clientId);
2990
+ const breakoutCurrentId = selectBreakoutCurrentId(getState()) || "";
2991
+ return isDeferrable({ client, breakoutCurrentId });
2992
+ },
3018
2993
  };
3019
2994
  const rtcManagerDispatcher = new RtcManagerDispatcher({
3020
2995
  emitter: createWebRtcEmitter(dispatch),
@@ -4644,10 +4619,6 @@ class LocalMediaClient extends BaseClient {
4644
4619
  }
4645
4620
  startMedia() {
4646
4621
  return __awaiter(this, arguments, void 0, function* (options = { audio: true, video: true }) {
4647
- const localMediaStatus = this.store.getState().localMedia.status;
4648
- if (["started", "starting"].includes(localMediaStatus)) {
4649
- return;
4650
- }
4651
4622
  return yield this.store.dispatch(doStartLocalMedia(options));
4652
4623
  });
4653
4624
  }
@@ -75,7 +75,7 @@ const createReactor = (selectors, callback) => {
75
75
  });
76
76
  };
77
77
 
78
- const coreVersion = "1.9.2";
78
+ const coreVersion = "1.9.3";
79
79
 
80
80
  const initialState$1 = {
81
81
  displayName: null,
@@ -619,7 +619,7 @@ const doToggleCamera = createAppAsyncThunk("localMedia/doToggleCamera", (_1, _a)
619
619
  else {
620
620
  const constraintsOptions = selectLocalMediaConstraintsOptions(state);
621
621
  const cameraDeviceId = selectCurrentCameraDeviceId(state);
622
- yield media.getStream(Object.assign(Object.assign({}, constraintsOptions), { audioId: false, videoId: cameraDeviceId || true, type: "exact" }), { replaceStream: stream });
622
+ yield media.getStream(Object.assign(Object.assign({}, constraintsOptions), { audioId: false, videoId: cameraDeviceId, type: "exact" }), { replaceStream: stream });
623
623
  track = stream.getVideoTracks()[0];
624
624
  }
625
625
  }
@@ -684,6 +684,7 @@ const doSetDevice = createAppAsyncThunk("localMedia/reactSetDevice", (_a, _b) =>
684
684
  }
685
685
  }));
686
686
  const doUpdateDeviceList = createAppAsyncThunk("localMedia/doUpdateDeviceList", (_1, _a) => __awaiter(void 0, [_1, _a], void 0, function* (_, { getState, dispatch, rejectWithValue }) {
687
+ var _b, _c, _d, _e;
687
688
  const state = getState();
688
689
  let newDevices = [];
689
690
  let oldDevices = [];
@@ -699,29 +700,19 @@ const doUpdateDeviceList = createAppAsyncThunk("localMedia/doUpdateDeviceList",
699
700
  if (!shouldHandleDeviceUpdate) {
700
701
  return { devices: newDevices };
701
702
  }
702
- const { currentCameraDeviceId, currentMicrophoneDeviceId, currentSpeakerDeviceId } = state.localMedia;
703
- const { changedDevices, removedDevices } = media.getUpdatedDevices({
703
+ const { changedDevices, addedDevices } = media.getUpdatedDevices({
704
704
  oldDevices,
705
705
  newDevices,
706
- currentVideoId: currentCameraDeviceId,
707
- currentAudioId: currentMicrophoneDeviceId,
708
- currentSpeakerId: currentSpeakerDeviceId,
709
706
  });
710
- let autoSwitchAudioId;
711
- let autoSwitchVideoId;
712
- if (removedDevices.audioinput) {
713
- autoSwitchAudioId = true;
707
+ let autoSwitchAudioId = (_b = changedDevices.audioinput) === null || _b === void 0 ? void 0 : _b.deviceId;
708
+ let autoSwitchVideoId = (_c = changedDevices.videoinput) === null || _c === void 0 ? void 0 : _c.deviceId;
709
+ if (autoSwitchAudioId === undefined) {
710
+ autoSwitchAudioId = (_d = addedDevices.audioinput) === null || _d === void 0 ? void 0 : _d.deviceId;
714
711
  }
715
- if (removedDevices.videoinput) {
716
- autoSwitchVideoId = true;
712
+ if (autoSwitchVideoId === undefined) {
713
+ autoSwitchVideoId = (_e = addedDevices.videoinput) === null || _e === void 0 ? void 0 : _e.deviceId;
717
714
  }
718
- if (!autoSwitchAudioId && changedDevices.audioinput) {
719
- autoSwitchAudioId = changedDevices.audioinput.deviceId;
720
- }
721
- if (!autoSwitchVideoId && changedDevices.videoinput) {
722
- autoSwitchVideoId = changedDevices.videoinput.deviceId;
723
- }
724
- if (autoSwitchAudioId || autoSwitchVideoId) {
715
+ if (autoSwitchAudioId !== undefined || autoSwitchVideoId !== undefined) {
725
716
  dispatch(doSwitchLocalStream({ audioId: autoSwitchAudioId, videoId: autoSwitchVideoId }));
726
717
  }
727
718
  return { devices: newDevices };
@@ -739,29 +730,28 @@ const doSwitchLocalStream = createAppAsyncThunk("localMedia/doSwitchLocalStream"
739
730
  return;
740
731
  }
741
732
  const beforeEffectTracks = selectLocalMediaBeforeEffectTracks(state);
742
- if (audioId && (beforeEffectTracks === null || beforeEffectTracks === void 0 ? void 0 : beforeEffectTracks.audio)) {
733
+ if (audioId !== undefined && (beforeEffectTracks === null || beforeEffectTracks === void 0 ? void 0 : beforeEffectTracks.audio)) {
743
734
  beforeEffectTracks.audio.stop();
744
735
  beforeEffectTracks.audio = undefined;
745
736
  }
746
- if (videoId && (beforeEffectTracks === null || beforeEffectTracks === void 0 ? void 0 : beforeEffectTracks.video)) {
737
+ if (videoId !== undefined && (beforeEffectTracks === null || beforeEffectTracks === void 0 ? void 0 : beforeEffectTracks.video)) {
747
738
  beforeEffectTracks.video.stop();
748
739
  beforeEffectTracks.video = undefined;
749
740
  }
750
741
  try {
751
- const { replacedTracks, error } = yield media.getStream(Object.assign(Object.assign({}, constraintsOptions), { audioId: audioId || false, videoId: videoId || false, type: "exact" }), { replaceStream });
752
- if (error) {
753
- const deviceId = audioId || videoId;
754
- if (onlySwitchingOne && typeof deviceId === "string") {
755
- dispatch(deviceBusy({
756
- deviceId,
757
- }));
758
- }
742
+ const { replacedTracks } = yield media.getStream(Object.assign(Object.assign({}, constraintsOptions), { audioId: audioId === undefined ? false : audioId, videoId: videoId === undefined ? false : videoId, type: "exact" }), { replaceStream });
743
+ const deviceId = audioId || videoId;
744
+ if (onlySwitchingOne && deviceId) {
745
+ dispatch(deviceBusy({
746
+ deviceId,
747
+ }));
759
748
  }
760
749
  return { replacedTracks, beforeEffectTracks };
761
750
  }
762
751
  catch (error) {
752
+ console.error(error);
763
753
  const deviceId = audioId || videoId;
764
- if (onlySwitchingOne && typeof deviceId === "string") {
754
+ if (onlySwitchingOne && deviceId) {
765
755
  dispatch(deviceBusy({
766
756
  deviceId,
767
757
  }));
@@ -901,17 +891,13 @@ createReactor([selectLocalMediaShouldStartWithOptions], ({ dispatch }, options)
901
891
  dispatch(doStartLocalMedia(options));
902
892
  }
903
893
  });
904
- startAppListening({
905
- predicate: (_action, currentState, previousState) => {
906
- const oldValue = selectAppIsActive(previousState);
907
- const newValue = selectAppIsActive(currentState);
908
- const localMediaOptions = selectLocalMediaOptions(currentState);
909
- const localMediaStatus = selectLocalMediaStatus(currentState);
910
- return (oldValue === true && newValue === false) && localMediaStatus !== "inactive" && !!localMediaOptions;
911
- },
912
- effect: (_, { dispatch }) => {
894
+ const selectLocalMediaShouldStop = toolkit.createSelector(selectAppIsActive, selectLocalMediaStatus, selectLocalMediaOptions, (appIsActive, localMediaStatus, localMediaOptions) => {
895
+ return !appIsActive && localMediaStatus !== "inactive" && !!localMediaOptions;
896
+ });
897
+ createReactor([selectLocalMediaShouldStop], ({ dispatch }, localMediaShouldStop) => {
898
+ if (localMediaShouldStop) {
913
899
  dispatch(doStopLocalMedia());
914
- },
900
+ }
915
901
  });
916
902
  startAppListening({
917
903
  predicate: (_action, currentState, previousState) => {
@@ -952,25 +938,10 @@ startAppListening({
952
938
  });
953
939
  startAppListening({
954
940
  predicate: (_action, currentState, previousState) => {
955
- var _a, _b;
956
- const oldDeviceId = selectCurrentCameraDeviceId(previousState);
957
- const newDeviceId = selectCurrentCameraDeviceId(currentState);
941
+ const oldValue = selectCurrentCameraDeviceId(previousState);
942
+ const newValue = selectCurrentCameraDeviceId(currentState);
958
943
  const isReady = selectLocalMediaStatus(previousState) === "started";
959
- const isSwitchingStream = selectLocalMediaIsSwitchingStream(currentState);
960
- if (isSwitchingStream) {
961
- return false;
962
- }
963
- if (!newDeviceId) {
964
- return false;
965
- }
966
- const currentTrack = (_b = (_a = selectLocalMediaStream(currentState)) === null || _a === void 0 ? void 0 : _a.getVideoTracks()) === null || _b === void 0 ? void 0 : _b[0];
967
- if (currentTrack && currentTrack.readyState === "live") {
968
- const currentDeviceId = currentTrack.getSettings().deviceId;
969
- if (currentDeviceId === newDeviceId) {
970
- return false;
971
- }
972
- }
973
- return isReady && oldDeviceId !== newDeviceId;
944
+ return isReady && oldValue !== newValue;
974
945
  },
975
946
  effect: (_action, { dispatch }) => {
976
947
  dispatch(doSetDevice({ audio: false, video: true }));
@@ -978,25 +949,10 @@ startAppListening({
978
949
  });
979
950
  startAppListening({
980
951
  predicate: (_action, currentState, previousState) => {
981
- var _a, _b;
982
- const oldDeviceId = selectCurrentMicrophoneDeviceId(previousState);
983
- const newDeviceId = selectCurrentMicrophoneDeviceId(currentState);
952
+ const oldValue = selectCurrentMicrophoneDeviceId(previousState);
953
+ const newValue = selectCurrentMicrophoneDeviceId(currentState);
984
954
  const isReady = selectLocalMediaStatus(previousState) === "started";
985
- const isSwitchingStream = selectLocalMediaIsSwitchingStream(currentState);
986
- if (isSwitchingStream) {
987
- return false;
988
- }
989
- if (!newDeviceId) {
990
- return false;
991
- }
992
- const currentTrack = (_b = (_a = selectLocalMediaStream(currentState)) === null || _a === void 0 ? void 0 : _a.getVideoTracks()) === null || _b === void 0 ? void 0 : _b[0];
993
- if (currentTrack && currentTrack.readyState === "live") {
994
- const currentDeviceId = currentTrack.getSettings().deviceId;
995
- if (currentDeviceId === newDeviceId) {
996
- return false;
997
- }
998
- }
999
- return isReady && oldDeviceId !== newDeviceId;
955
+ return isReady && oldValue !== newValue;
1000
956
  },
1001
957
  effect: (_action, { dispatch }) => {
1002
958
  dispatch(doSetDevice({ audio: true, video: false }));
@@ -1828,6 +1784,15 @@ startAppListening({
1828
1784
  },
1829
1785
  });
1830
1786
 
1787
+ function isDeferrable({ client, breakoutCurrentId }) {
1788
+ if (!client)
1789
+ return false;
1790
+ if (!breakoutCurrentId && client.breakoutGroup)
1791
+ return true;
1792
+ if (!client.isAudioEnabled && !client.isVideoEnabled)
1793
+ return true;
1794
+ return false;
1795
+ }
1831
1796
  const createWebRtcEmitter = (dispatch) => {
1832
1797
  return {
1833
1798
  emit: (eventName, data) => {
@@ -1915,12 +1880,22 @@ const doConnectRtc = createAppThunk(() => (dispatch, getState) => {
1915
1880
  const state = getState();
1916
1881
  const socket = selectSignalConnectionRaw(state).socket;
1917
1882
  const dispatcher = selectRtcConnectionRaw(state).rtcManagerDispatcher;
1883
+ const isCameraEnabled = selectIsCameraEnabled(state);
1884
+ const isMicrophoneEnabled = selectIsMicrophoneEnabled(state);
1918
1885
  const isNodeSdk = selectAppIsNodeSdk(state);
1919
1886
  if (dispatcher || !socket) {
1920
1887
  return;
1921
1888
  }
1922
1889
  const webrtcProvider = {
1923
- getMediaConstraints: () => selectLocalMediaConstraintsOptions(state),
1890
+ getMediaConstraints: () => ({
1891
+ audio: isMicrophoneEnabled,
1892
+ video: isCameraEnabled,
1893
+ }),
1894
+ deferrable(clientId) {
1895
+ const client = selectRemoteParticipants(getState()).find((p) => p.id === clientId);
1896
+ const breakoutCurrentId = selectBreakoutCurrentId(getState()) || "";
1897
+ return isDeferrable({ client, breakoutCurrentId });
1898
+ },
1924
1899
  };
1925
1900
  const rtcManagerDispatcher = new media.RtcManagerDispatcher({
1926
1901
  emitter: createWebRtcEmitter(dispatch),
@@ -4244,6 +4219,7 @@ exports.selectLocalMediaOptions = selectLocalMediaOptions;
4244
4219
  exports.selectLocalMediaOwnsStream = selectLocalMediaOwnsStream;
4245
4220
  exports.selectLocalMediaRaw = selectLocalMediaRaw;
4246
4221
  exports.selectLocalMediaShouldStartWithOptions = selectLocalMediaShouldStartWithOptions;
4222
+ exports.selectLocalMediaShouldStop = selectLocalMediaShouldStop;
4247
4223
  exports.selectLocalMediaStartError = selectLocalMediaStartError;
4248
4224
  exports.selectLocalMediaStatus = selectLocalMediaStatus;
4249
4225
  exports.selectLocalMediaStream = selectLocalMediaStream;
@@ -1789,8 +1789,8 @@ declare const localMediaSlice: _reduxjs_toolkit.Slice<LocalMediaState, {
1789
1789
  }> | undefined;
1790
1790
  };
1791
1791
  localStreamMetadataUpdated(state: immer.WritableDraft<LocalMediaState>, action: PayloadAction<ReturnType<typeof getDeviceData>>): {
1792
- currentCameraDeviceId: string | undefined;
1793
- currentMicrophoneDeviceId: string | undefined;
1792
+ currentCameraDeviceId: string;
1793
+ currentMicrophoneDeviceId: string;
1794
1794
  busyDeviceIds: string[];
1795
1795
  cameraDeviceError?: unknown;
1796
1796
  cameraEnabled: boolean;
@@ -1863,8 +1863,8 @@ declare const doSwitchLocalStream: _reduxjs_toolkit.AsyncThunk<{
1863
1863
  video?: MediaStreamTrack;
1864
1864
  } | undefined;
1865
1865
  } | undefined, {
1866
- audioId?: string | boolean;
1867
- videoId?: string | boolean;
1866
+ audioId?: string | null;
1867
+ videoId?: string | null;
1868
1868
  }, ThunkConfig>;
1869
1869
  declare const doStartLocalMedia: _reduxjs_toolkit.AsyncThunk<{
1870
1870
  stream: MediaStream;
@@ -2276,6 +2276,51 @@ declare const selectLocalMediaShouldStartWithOptions: ((state: {
2276
2276
  argsMemoize: typeof reselect.weakMapMemoize;
2277
2277
  memoize: typeof reselect.weakMapMemoize;
2278
2278
  };
2279
+ declare const selectLocalMediaShouldStop: ((state: {
2280
+ app: AppState;
2281
+ authorization: AuthorizationState;
2282
+ breakout: BreakoutState;
2283
+ cameraEffects: CameraEffectsState;
2284
+ chat: ChatState;
2285
+ cloudRecording: CloudRecordingState;
2286
+ connectionMonitor: ConnectionMonitorState;
2287
+ deviceCredentials: DeviceCredentialsState;
2288
+ liveTranscription: LiveTranscriptionState;
2289
+ localMedia: LocalMediaState;
2290
+ localParticipant: LocalParticipantState;
2291
+ localScreenshare: LocalScreenshareState;
2292
+ notifications: NotificationsState;
2293
+ organization: OrganizationState;
2294
+ remoteParticipants: RemoteParticipantSliceState;
2295
+ room: RoomState;
2296
+ roomConnection: RoomConnectionState;
2297
+ rtcAnalytics: rtcAnalyticsState;
2298
+ rtcConnection: RtcConnectionState;
2299
+ signalConnection: SignalConnectionState;
2300
+ spotlights: SpotlightsState;
2301
+ streaming: StreamingState;
2302
+ waitingParticipants: WaitingParticipantsState;
2303
+ }) => boolean) & {
2304
+ clearCache: () => void;
2305
+ resultsCount: () => number;
2306
+ resetResultsCount: () => void;
2307
+ } & {
2308
+ resultFunc: (resultFuncArgs_0: boolean, resultFuncArgs_1: "error" | "inactive" | "stopped" | "starting" | "started", resultFuncArgs_2: LocalMediaOptions | undefined) => boolean;
2309
+ memoizedResultFunc: ((resultFuncArgs_0: boolean, resultFuncArgs_1: "error" | "inactive" | "stopped" | "starting" | "started", resultFuncArgs_2: LocalMediaOptions | undefined) => boolean) & {
2310
+ clearCache: () => void;
2311
+ resultsCount: () => number;
2312
+ resetResultsCount: () => void;
2313
+ };
2314
+ lastResult: () => boolean;
2315
+ dependencies: [(state: RootState) => boolean, (state: RootState) => "error" | "inactive" | "stopped" | "starting" | "started", (state: RootState) => LocalMediaOptions | undefined];
2316
+ recomputations: () => number;
2317
+ resetRecomputations: () => void;
2318
+ dependencyRecomputations: () => number;
2319
+ resetDependencyRecomputations: () => void;
2320
+ } & {
2321
+ argsMemoize: typeof reselect.weakMapMemoize;
2322
+ memoize: typeof reselect.weakMapMemoize;
2323
+ };
2279
2324
 
2280
2325
  interface OrganizationState {
2281
2326
  data: Organization | null | undefined;
@@ -4921,5 +4966,5 @@ declare const selectRoomConnectionSessionId: (state: RootState) => string | unde
4921
4966
  declare const selectRoomConnectionStatus: (state: RootState) => ConnectionStatus;
4922
4967
  declare const selectRoomConnectionError: (state: RootState) => string | null;
4923
4968
 
4924
- export { addAppListener, addSpotlight, appSlice, authorizationSlice, authorizationSliceInitialState, breakoutSlice, breakoutSliceInitialState, chatSlice, chatSliceInitialState, cloudRecordingSlice, connectionMonitorSlice, connectionMonitorSliceInitialState, connectionMonitorStarted, connectionMonitorStopped, createAppAsyncThunk, createAppAuthorizedThunk, createAppThunk, createAsyncRoomConnectedThunk, createAuthorizedRoomConnectedThunk, createReactor, createRemoteParticipant, createRoomConnectedThunk, createServices, createStore, createWebRtcEmitter, deviceBusy, deviceCredentialsSlice, deviceCredentialsSliceInitialState, deviceIdentified, deviceIdentifying, doAcceptWaitingParticipant, doAppStart, doAppStop, doBreakoutJoin, doCancelKnock, doClearNotifications, doConnectRoom, doConnectRtc, doDisconnectRtc, doEnableAudio, doEnableVideo, doEndMeeting, doGetDeviceCredentials, doHandleAcceptStreams, doHandleStreamingStarted, doHandleStreamingStopped, doKickParticipant, doKnockRoom, doLocalStreamEffect, doLockRoom, doOrganizationFetch, doRejectWaitingParticipant, doRemoveSpotlight, doRequestAudioEnable, doRequestVideoEnable, doRtcAnalyticsCustomEventsInitialize, doRtcManagerCreated, doRtcManagerInitialize, doRtcReportStreamResolution, doSendChatMessage, doSendClientMetadata, doSetDevice, doSetDisplayName, doSetLocalStickyReaction, doSetNotification, doSignalConnect, doSignalDisconnect, doSignalIdentifyDevice, doSpotlightParticipant, doStartCloudRecording, doStartConnectionMonitor, doStartLiveTranscription, doStartLocalMedia, doStartScreenshare, doStopCloudRecording, doStopConnectionMonitor, doStopLiveTranscription, doStopLocalMedia, doStopScreenshare, doSwitchLocalStream, doToggleCamera, doToggleLowDataMode, doUpdateDeviceList, initialCloudRecordingState, initialLiveTranscriptionState, initialLocalMediaState, initialNotificationsState, initialState, isAcceptingStreams, isClientSpotlighted, listenerMiddleware, liveTranscriptionSlice, localMediaSlice, localMediaStopped, localParticipantSlice, localParticipantSliceInitialState, localScreenshareSlice, localScreenshareSliceInitialState, localStreamMetadataUpdated, notificationsSlice, observeStore, organizationSlice, organizationSliceInitialState, participantStreamAdded, participantStreamIdAdded, recordingRequestStarted, remoteParticipantsSlice, remoteParticipantsSliceInitialState, removeSpotlight, resolutionReported, roomConnectionSlice, roomConnectionSliceInitialState, roomSlice, roomSliceInitialState, rootReducer, rtcAnalyticsCustomEvents, rtcAnalyticsSlice, rtcAnalyticsSliceInitialState, rtcClientConnectionStatusChanged, rtcConnectionSlice, rtcConnectionSliceInitialState, rtcDisconnected, rtcDispatcherCreated, rtcEvents, rtcManagerCreated, rtcManagerDestroyed, rtcManagerInitialized, selectAllClientViews, selectAllClientViewsInCurrentGroup, selectAppDisplayName, selectAppExternalId, selectAppIgnoreBreakoutGroups, selectAppInitialConfig, selectAppIsActive, selectAppIsAssistant, selectAppIsAudioRecorder, selectAppIsDialIn, selectAppIsNodeSdk, selectAppRaw, selectAppRoomName, selectAppRoomUrl, selectAppUserAgent, selectAssistantKey, selectAuthorizationRoleName, selectBreakoutActive, selectBreakoutAssignments, selectBreakoutCurrentGroup, selectBreakoutCurrentId, selectBreakoutGroupedParticipants, selectBreakoutGroups, selectBreakoutInitiatedBy, selectBreakoutRaw, selectBusyDeviceIds, selectCameraDeviceError, selectCameraDevices, selectChatMessages, selectChatRaw, selectCloudRecordingError, selectCloudRecordingIsInitiator, selectCloudRecordingRaw, selectCloudRecordingStartedAt, selectCloudRecordingStatus, selectConnectionMonitorIsRunning, selectCurrentCameraDeviceId, selectCurrentMicrophoneDeviceId, selectCurrentSpeakerDeviceId, selectDeviceCredentialsRaw, selectDeviceId, selectHasFetchedDeviceCredentials, selectIsAcceptingStreams, selectIsAuthorizedToAskToSpeak, selectIsAuthorizedToEndMeeting, selectIsAuthorizedToKickClient, selectIsAuthorizedToLockRoom, selectIsAuthorizedToRequestAudioEnable, selectIsAuthorizedToRequestVideoEnable, selectIsAuthorizedToSpotlight, selectIsCameraEnabled, selectIsCloudRecording, selectIsLiveTranscription, selectIsLocalMediaStarting, selectIsLocalParticipantSpotlighted, selectIsLowDataModeEnabled, selectIsMicrophoneEnabled, selectIsSettingCameraDevice, selectIsSettingMicrophoneDevice, selectIsToggleCamera, selectLiveTranscriptionError, selectLiveTranscriptionIsInitiator, selectLiveTranscriptionRaw, selectLiveTranscriptionStartedAt, selectLiveTranscriptionStatus, selectLocalMediaBeforeEffectTracks, selectLocalMediaConstraintsOptions, selectLocalMediaDevices, selectLocalMediaIsSwitchingStream, selectLocalMediaOptions, selectLocalMediaOwnsStream, selectLocalMediaRaw, selectLocalMediaShouldStartWithOptions, selectLocalMediaStartError, selectLocalMediaStatus, selectLocalMediaStream, selectLocalParticipantBreakoutAssigned, selectLocalParticipantBreakoutGroup, selectLocalParticipantClientClaim, selectLocalParticipantDisplayName, selectLocalParticipantIsScreenSharing, selectLocalParticipantRaw, selectLocalParticipantStickyReaction, selectLocalParticipantView, selectLocalScreenshareRaw, selectLocalScreenshareStatus, selectLocalScreenshareStream, selectMicrophoneDeviceError, selectMicrophoneDevices, selectNotificationsEmitter, selectNotificationsEvents, selectNotificationsRaw, selectNumClients, selectNumParticipants, selectOrganizationId, selectOrganizationPreferences, selectOrganizationRaw, selectRemoteClientViews, selectRemoteClients, selectRemoteParticipants, selectRemoteParticipantsRaw, selectRoomConnectionError, selectRoomConnectionRaw, selectRoomConnectionSession, selectRoomConnectionSessionId, selectRoomConnectionStatus, selectRoomIsLocked, selectRoomKey, selectRtcConnectionRaw, selectRtcDispatcherCreated, selectRtcIsCreatingDispatcher, selectRtcManager, selectRtcManagerInitialized, selectRtcStatus, selectScreenshares, selectSelfId, selectShouldConnectRoom, selectShouldConnectRtc, selectShouldConnectSignal, selectShouldDisconnectRtc, selectShouldFetchDeviceCredentials, selectShouldFetchOrganization, selectShouldIdentifyDevice, selectShouldInitializeRtc, selectShouldStartConnectionMonitor, selectShouldStopConnectionMonitor, selectSignalConnectionDeviceIdentified, selectSignalConnectionRaw, selectSignalConnectionSocket, selectSignalIsIdentifyingDevice, selectSignalStatus, selectSpeakerDevices, selectSpotlightedClientViews, selectSpotlights, selectSpotlightsRaw, selectStopCallbackFunction, selectStreamingRaw, selectStreamsToAccept, selectWaitingParticipants, selectWaitingParticipantsRaw, setBreakoutGroupAssigned, setCurrentCameraDeviceId, setCurrentMicrophoneDeviceId, setCurrentSpeakerDeviceId, setDisplayName, setLocalMediaOptions, setLocalMediaStream, setRoomKey, signalConnectionSlice, signalConnectionSliceInitialState, signalEvents, socketConnected, socketConnecting, socketDisconnected, socketReconnecting, spotlightsSlice, spotlightsSliceInitialState, startAppListening, stopScreenshare, streamIdForClient, streamStatusUpdated, streamingSlice, streamingSliceInitialState, toggleCameraEnabled, toggleLowDataModeEnabled, toggleMicrophoneEnabled, transcribingRequestStarted, updateReportedValues, waitingParticipantsSlice, waitingParticipantsSliceInitialState };
4969
+ export { addAppListener, addSpotlight, appSlice, authorizationSlice, authorizationSliceInitialState, breakoutSlice, breakoutSliceInitialState, chatSlice, chatSliceInitialState, cloudRecordingSlice, connectionMonitorSlice, connectionMonitorSliceInitialState, connectionMonitorStarted, connectionMonitorStopped, createAppAsyncThunk, createAppAuthorizedThunk, createAppThunk, createAsyncRoomConnectedThunk, createAuthorizedRoomConnectedThunk, createReactor, createRemoteParticipant, createRoomConnectedThunk, createServices, createStore, createWebRtcEmitter, deviceBusy, deviceCredentialsSlice, deviceCredentialsSliceInitialState, deviceIdentified, deviceIdentifying, doAcceptWaitingParticipant, doAppStart, doAppStop, doBreakoutJoin, doCancelKnock, doClearNotifications, doConnectRoom, doConnectRtc, doDisconnectRtc, doEnableAudio, doEnableVideo, doEndMeeting, doGetDeviceCredentials, doHandleAcceptStreams, doHandleStreamingStarted, doHandleStreamingStopped, doKickParticipant, doKnockRoom, doLocalStreamEffect, doLockRoom, doOrganizationFetch, doRejectWaitingParticipant, doRemoveSpotlight, doRequestAudioEnable, doRequestVideoEnable, doRtcAnalyticsCustomEventsInitialize, doRtcManagerCreated, doRtcManagerInitialize, doRtcReportStreamResolution, doSendChatMessage, doSendClientMetadata, doSetDevice, doSetDisplayName, doSetLocalStickyReaction, doSetNotification, doSignalConnect, doSignalDisconnect, doSignalIdentifyDevice, doSpotlightParticipant, doStartCloudRecording, doStartConnectionMonitor, doStartLiveTranscription, doStartLocalMedia, doStartScreenshare, doStopCloudRecording, doStopConnectionMonitor, doStopLiveTranscription, doStopLocalMedia, doStopScreenshare, doSwitchLocalStream, doToggleCamera, doToggleLowDataMode, doUpdateDeviceList, initialCloudRecordingState, initialLiveTranscriptionState, initialLocalMediaState, initialNotificationsState, initialState, isAcceptingStreams, isClientSpotlighted, listenerMiddleware, liveTranscriptionSlice, localMediaSlice, localMediaStopped, localParticipantSlice, localParticipantSliceInitialState, localScreenshareSlice, localScreenshareSliceInitialState, localStreamMetadataUpdated, notificationsSlice, observeStore, organizationSlice, organizationSliceInitialState, participantStreamAdded, participantStreamIdAdded, recordingRequestStarted, remoteParticipantsSlice, remoteParticipantsSliceInitialState, removeSpotlight, resolutionReported, roomConnectionSlice, roomConnectionSliceInitialState, roomSlice, roomSliceInitialState, rootReducer, rtcAnalyticsCustomEvents, rtcAnalyticsSlice, rtcAnalyticsSliceInitialState, rtcClientConnectionStatusChanged, rtcConnectionSlice, rtcConnectionSliceInitialState, rtcDisconnected, rtcDispatcherCreated, rtcEvents, rtcManagerCreated, rtcManagerDestroyed, rtcManagerInitialized, selectAllClientViews, selectAllClientViewsInCurrentGroup, selectAppDisplayName, selectAppExternalId, selectAppIgnoreBreakoutGroups, selectAppInitialConfig, selectAppIsActive, selectAppIsAssistant, selectAppIsAudioRecorder, selectAppIsDialIn, selectAppIsNodeSdk, selectAppRaw, selectAppRoomName, selectAppRoomUrl, selectAppUserAgent, selectAssistantKey, selectAuthorizationRoleName, selectBreakoutActive, selectBreakoutAssignments, selectBreakoutCurrentGroup, selectBreakoutCurrentId, selectBreakoutGroupedParticipants, selectBreakoutGroups, selectBreakoutInitiatedBy, selectBreakoutRaw, selectBusyDeviceIds, selectCameraDeviceError, selectCameraDevices, selectChatMessages, selectChatRaw, selectCloudRecordingError, selectCloudRecordingIsInitiator, selectCloudRecordingRaw, selectCloudRecordingStartedAt, selectCloudRecordingStatus, selectConnectionMonitorIsRunning, selectCurrentCameraDeviceId, selectCurrentMicrophoneDeviceId, selectCurrentSpeakerDeviceId, selectDeviceCredentialsRaw, selectDeviceId, selectHasFetchedDeviceCredentials, selectIsAcceptingStreams, selectIsAuthorizedToAskToSpeak, selectIsAuthorizedToEndMeeting, selectIsAuthorizedToKickClient, selectIsAuthorizedToLockRoom, selectIsAuthorizedToRequestAudioEnable, selectIsAuthorizedToRequestVideoEnable, selectIsAuthorizedToSpotlight, selectIsCameraEnabled, selectIsCloudRecording, selectIsLiveTranscription, selectIsLocalMediaStarting, selectIsLocalParticipantSpotlighted, selectIsLowDataModeEnabled, selectIsMicrophoneEnabled, selectIsSettingCameraDevice, selectIsSettingMicrophoneDevice, selectIsToggleCamera, selectLiveTranscriptionError, selectLiveTranscriptionIsInitiator, selectLiveTranscriptionRaw, selectLiveTranscriptionStartedAt, selectLiveTranscriptionStatus, selectLocalMediaBeforeEffectTracks, selectLocalMediaConstraintsOptions, selectLocalMediaDevices, selectLocalMediaIsSwitchingStream, selectLocalMediaOptions, selectLocalMediaOwnsStream, selectLocalMediaRaw, selectLocalMediaShouldStartWithOptions, selectLocalMediaShouldStop, selectLocalMediaStartError, selectLocalMediaStatus, selectLocalMediaStream, selectLocalParticipantBreakoutAssigned, selectLocalParticipantBreakoutGroup, selectLocalParticipantClientClaim, selectLocalParticipantDisplayName, selectLocalParticipantIsScreenSharing, selectLocalParticipantRaw, selectLocalParticipantStickyReaction, selectLocalParticipantView, selectLocalScreenshareRaw, selectLocalScreenshareStatus, selectLocalScreenshareStream, selectMicrophoneDeviceError, selectMicrophoneDevices, selectNotificationsEmitter, selectNotificationsEvents, selectNotificationsRaw, selectNumClients, selectNumParticipants, selectOrganizationId, selectOrganizationPreferences, selectOrganizationRaw, selectRemoteClientViews, selectRemoteClients, selectRemoteParticipants, selectRemoteParticipantsRaw, selectRoomConnectionError, selectRoomConnectionRaw, selectRoomConnectionSession, selectRoomConnectionSessionId, selectRoomConnectionStatus, selectRoomIsLocked, selectRoomKey, selectRtcConnectionRaw, selectRtcDispatcherCreated, selectRtcIsCreatingDispatcher, selectRtcManager, selectRtcManagerInitialized, selectRtcStatus, selectScreenshares, selectSelfId, selectShouldConnectRoom, selectShouldConnectRtc, selectShouldConnectSignal, selectShouldDisconnectRtc, selectShouldFetchDeviceCredentials, selectShouldFetchOrganization, selectShouldIdentifyDevice, selectShouldInitializeRtc, selectShouldStartConnectionMonitor, selectShouldStopConnectionMonitor, selectSignalConnectionDeviceIdentified, selectSignalConnectionRaw, selectSignalConnectionSocket, selectSignalIsIdentifyingDevice, selectSignalStatus, selectSpeakerDevices, selectSpotlightedClientViews, selectSpotlights, selectSpotlightsRaw, selectStopCallbackFunction, selectStreamingRaw, selectStreamsToAccept, selectWaitingParticipants, selectWaitingParticipantsRaw, setBreakoutGroupAssigned, setCurrentCameraDeviceId, setCurrentMicrophoneDeviceId, setCurrentSpeakerDeviceId, setDisplayName, setLocalMediaOptions, setLocalMediaStream, setRoomKey, signalConnectionSlice, signalConnectionSliceInitialState, signalEvents, socketConnected, socketConnecting, socketDisconnected, socketReconnecting, spotlightsSlice, spotlightsSliceInitialState, startAppListening, stopScreenshare, streamIdForClient, streamStatusUpdated, streamingSlice, streamingSliceInitialState, toggleCameraEnabled, toggleLowDataModeEnabled, toggleMicrophoneEnabled, transcribingRequestStarted, updateReportedValues, waitingParticipantsSlice, waitingParticipantsSliceInitialState };
4925
4970
  export type { AppConfig, AppDispatch, AppReducer, AppStartListening, AppState, AppThunk, AuthorizationState, BreakoutState, ChatMessage, ChatMessageEvent, ChatMessageEventProps, ChatState, ClientView, CloudRecordingState, ConnectionMonitorStart, ConnectionMonitorState, ConnectionStatus, DeviceCredentialsState, LiveTranscriptionState, LocalMediaOptions, LocalMediaState, LocalParticipantState, LocalScreenshareState, Notification, NotificationEvent, NotificationEventMap, NotificationEvents, NotificationsEventEmitter, NotificationsState, OrganizationState, RemoteParticipantSliceState, RequestAudioEvent, RequestAudioEventProps, RequestVideoEvent, RequestVideoEventProps, RoomConnectionState, RoomState, RootState, RtcConnectionState, SignalClientEvent, SignalClientEventProps, SignalConnectionState, SignalStatusEvent, SignalStatusEventProps, SpotlightsState, StickyReactionEvent, StickyReactionEventProps, Store, StreamingState, ThunkConfig, WaitingParticipantsState, rtcAnalyticsState };