diff --git a/package.json b/package.json
index fa8439f53..b4814dbab 100644
--- a/package.json
+++ b/package.json
@@ -9,12 +9,12 @@
"src"
],
"dependencies": {
- "@100mslive/hls-player": "0.1.3",
- "@100mslive/hms-noise-suppression": "0.9.3",
- "@100mslive/hms-virtual-background": "1.11.3",
- "@100mslive/react-icons": "0.8.3",
- "@100mslive/react-sdk": "0.8.3",
- "@100mslive/react-ui": "0.8.3",
+ "@100mslive/hls-player": "0.1.5",
+ "@100mslive/hms-noise-suppression": "0.9.5",
+ "@100mslive/hms-virtual-background": "1.11.5",
+ "@100mslive/react-icons": "0.8.5",
+ "@100mslive/react-sdk": "0.8.5",
+ "@100mslive/react-ui": "0.8.5",
"@emoji-mart/data": "^1.0.6",
"@emoji-mart/react": "^1.0.1",
"@tldraw/tldraw": "^1.18.4",
diff --git a/src/common/PeersSorter.js b/src/common/PeersSorter.js
new file mode 100644
index 000000000..855277c9f
--- /dev/null
+++ b/src/common/PeersSorter.js
@@ -0,0 +1,97 @@
+import { selectDominantSpeaker } from "@100mslive/hms-video-store";
+
+class PeersSorter {
+ listeners = new Set();
+ storeUnsubscribe;
+
+ constructor(store) {
+ this.store = store;
+ this.peers = new Map();
+ this.lruPeers = new Set();
+ this.speaker = undefined;
+ }
+
+ setPeersAndTilesPerPage = ({ peers, tilesPerPage }) => {
+ this.tilesPerPage = tilesPerPage;
+ const peerIds = new Set(peers.map(peer => peer.id));
+ // remove existing peers which are no longer provided
+ this.peers.forEach((_, key) => {
+ if (!peerIds.has(key)) {
+ this.peers.delete(key);
+ }
+ });
+ this.lruPeers = new Set(
+ [...this.lruPeers].filter(peerId => peerIds.has(peerId))
+ );
+ peers.forEach(peer => {
+ this.peers.set(peer.id, peer);
+ if (this.lruPeers.size < tilesPerPage) {
+ this.lruPeers.add(peer.id);
+ }
+ });
+ if (!this.storeUnsubscribe) {
+ this.storeUnsubscribe = this.store.subscribe(
+ this.onDominantSpeakerChange,
+ selectDominantSpeaker
+ );
+ }
+ this.moveSpeakerToFront(this.speaker);
+ };
+
+ onUpdate = cb => {
+ this.listeners.add(cb);
+ };
+
+ stop = () => {
+ this.updateListeners();
+ this.listeners.clear();
+ this.storeUnsubscribe?.();
+ };
+
+ moveSpeakerToFront = speaker => {
+ if (!speaker) {
+ this.updateListeners();
+ return;
+ }
+ if (
+ this.lruPeers.has(speaker.id) &&
+ this.lruPeers.size <= this.tilesPerPage
+ ) {
+ this.updateListeners();
+ return;
+ }
+ // delete to insert at beginning
+ this.lruPeers.delete(speaker.id);
+ let lruPeerArray = Array.from(this.lruPeers);
+ while (lruPeerArray.length >= this.tilesPerPage) {
+ lruPeerArray.pop();
+ }
+ this.lruPeers = new Set([speaker.id, ...lruPeerArray]);
+ this.updateListeners();
+ };
+
+ onDominantSpeakerChange = speaker => {
+ if (speaker && speaker.id !== this?.speaker?.id) {
+ this.speaker = speaker;
+ this.moveSpeakerToFront(speaker);
+ }
+ };
+
+ updateListeners = () => {
+ const orderedPeers = [];
+ this.lruPeers.forEach(key => {
+ const peer = this.peers.get(key);
+ if (peer) {
+ orderedPeers.push(peer);
+ }
+ });
+ this.peers.forEach(peer => {
+ if (!this.lruPeers.has(peer.id) && peer) {
+ orderedPeers.push(peer);
+ }
+ });
+ this.listeners.forEach(listener => listener?.(orderedPeers));
+ };
+}
+
+export default PeersSorter;
diff --git a/src/common/constants.js b/src/common/constants.js
index e1eff3a69..cca633e54 100644
--- a/src/common/constants.js
+++ b/src/common/constants.js
@@ -142,6 +142,7 @@ export const UI_SETTINGS = {
showStatsOnTiles: "showStatsOnTiles",
enableAmbientMusic: "enableAmbientMusic",
mirrorLocalVideo: "mirrorLocalVideo",
+ activeSpeakerSorting: "activeSpeakerSorting",
hideLocalVideo: "hideLocalVideo",
};
diff --git a/src/common/useSortedPeers.js b/src/common/useSortedPeers.js
new file mode 100644
index 000000000..adb248bf7
--- /dev/null
+++ b/src/common/useSortedPeers.js
@@ -0,0 +1,28 @@
+import { useEffect, useRef, useState } from "react";
+import { useHMSVanillaStore } from "@100mslive/react-sdk";
+import PeersSorter from "./PeersSorter";
+import { useActiveSpeakerSorting } from "../components/AppData/useUISettings";
+
+function useSortedPeers({ peers, maxTileCount = 9 }) {
+ const [sortedPeers, setSortedPeers] = useState([]);
+ const store = useHMSVanillaStore();
+ const activeSpeakerSorting = useActiveSpeakerSorting();
+ const peerSortedRef = useRef(new PeersSorter(store));
+ peerSortedRef.current.onUpdate(setSortedPeers);
+
+ useEffect(() => {
+ const peersSorter = peerSortedRef.current;
+ if (peers?.length > 0 && maxTileCount && activeSpeakerSorting) {
+ peersSorter.setPeersAndTilesPerPage({
+ peers,
+ tilesPerPage: maxTileCount,
+ });
+ } else if (!activeSpeakerSorting) {
+ peersSorter.stop();
+ }
+ }, [maxTileCount, peers, activeSpeakerSorting]);
+
+ return activeSpeakerSorting ? sortedPeers : peers;
+}
+
+export default useSortedPeers;
diff --git a/src/components/AppData/AppData.jsx b/src/components/AppData/AppData.jsx
index 627db49f0..250958c11 100644
--- a/src/components/AppData/AppData.jsx
+++ b/src/components/AppData/AppData.jsx
@@ -56,6 +56,7 @@ const initialAppData = {
[UI_SETTINGS.enableAmbientMusic]: false,
[UI_SETTINGS.uiViewMode]: UI_MODE_GRID,
[UI_SETTINGS.mirrorLocalVideo]: true,
+ [UI_SETTINGS.activeSpeakerSorting]: process.env.REACT_APP_ENV === "qa",
[UI_SETTINGS.hideLocalVideo]: false,
},
[APP_DATA.subscribedNotifications]: {
diff --git a/src/components/AppData/useUISettings.js b/src/components/AppData/useUISettings.js
index 173244255..98363fb13 100644
--- a/src/components/AppData/useUISettings.js
+++ b/src/components/AppData/useUISettings.js
@@ -58,6 +58,11 @@ export const useIsHeadless = () => {
return isHeadless;
};
+export const useActiveSpeakerSorting = () => {
+ const activeSpeakerSorting = useUISettings(UI_SETTINGS.activeSpeakerSorting);
+ return activeSpeakerSorting;
+};
+
export const useHLSViewerRole = () => {
return useHMSStore(selectAppData(APP_DATA.hlsViewerRole));
};
diff --git a/src/components/Chat/ChatBody.jsx b/src/components/Chat/ChatBody.jsx
index 6d180a722..4f2ef8b2b 100644
--- a/src/components/Chat/ChatBody.jsx
+++ b/src/components/Chat/ChatBody.jsx
@@ -223,6 +223,7 @@ const ChatMessage = React.memo(
r: messageType ? "$1" : undefined,
px: messageType ? "$4" : "$2",
py: messageType ? "$4" : 0,
+ userSelect: "none",
}}
key={message.time}
data-testid="chat_msg"
@@ -274,7 +275,9 @@ const ChatMessage = React.memo(
mt: "$2",
wordBreak: "break-word",
whiteSpace: "pre-wrap",
+ userSelect: "all",
}}
+ onClick={e => e.stopPropagation()}
>
diff --git a/src/components/Notifications/ReconnectNotifications.jsx b/src/components/Notifications/ReconnectNotifications.jsx
index 311e0639c..1eabab275 100644
--- a/src/components/Notifications/ReconnectNotifications.jsx
+++ b/src/components/Notifications/ReconnectNotifications.jsx
@@ -1,9 +1,10 @@
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { logMessage } from "zipyai";
import {
HMSNotificationTypes,
useHMSNotifications,
} from "@100mslive/react-sdk";
+import { Dialog, Flex, Loading, Text } from "@100mslive/react-ui";
import { ToastConfig } from "../Toast/ToastConfig";
import { ToastManager } from "../Toast/ToastManager";
@@ -12,8 +13,11 @@ const notificationTypes = [
HMSNotificationTypes.RECONNECTING,
];
let notificationId = null;
+
+const isQA = process.env.REACT_APP_ENV === "qa";
export const ReconnectNotifications = () => {
const notification = useHMSNotifications(notificationTypes);
+ const [open, setOpen] = useState(false);
useEffect(() => {
if (notification?.type === HMSNotificationTypes.RECONNECTED) {
logMessage("Reconnected");
@@ -21,13 +25,47 @@ export const ReconnectNotifications = () => {
notificationId,
ToastConfig.RECONNECTED.single()
);
+ setOpen(false);
} else if (notification?.type === HMSNotificationTypes.RECONNECTING) {
logMessage("Reconnecting");
- notificationId = ToastManager.replaceToast(
- notificationId,
- ToastConfig.RECONNECTING.single(notification.data.message)
- );
+ if (isQA) {
+ ToastManager.removeToast(notificationId);
+ setOpen(true);
+ } else {
+ notificationId = ToastManager.replaceToast(
+ notificationId,
+ ToastConfig.RECONNECTING.single(notification.data.message)
+ );
+ }
}
}, [notification]);
- return null;
+ if (!open || !isQA) return null;
+ return (
+
+
+
+
+
+
+
+
+
+ You lost your network connection. Trying to reconnect.
+
+
+
+
+
+ );
};
diff --git a/src/components/Settings/LayoutSettings.jsx b/src/components/Settings/LayoutSettings.jsx
index 8e8ad9809..12d7f9613 100644
--- a/src/components/Settings/LayoutSettings.jsx
+++ b/src/components/Settings/LayoutSettings.jsx
@@ -20,7 +20,14 @@ export const LayoutSettings = () => {
const isLocalVideoEnabled = useHMSStore(selectIsLocalVideoEnabled);
const isLocalScreenShared = useHMSStore(selectIsLocalScreenShared);
const [
- { isAudioOnly, uiViewMode, maxTileCount, mirrorLocalVideo, hideLocalVideo },
+ {
+ isAudioOnly,
+ uiViewMode,
+ maxTileCount,
+ mirrorLocalVideo,
+ activeSpeakerSorting,
+ hideLocalVideo,
+ },
setUISettings,
] = useSetUiSettings();
const toggleIsAudioOnly = useCallback(
@@ -49,6 +56,16 @@ export const LayoutSettings = () => {
id="activeSpeakerMode"
label="Active Speaker Mode"
/>
+ {
+ setUISettings({
+ [UI_SETTINGS.activeSpeakerSorting]: value,
+ });
+ }}
+ />
{
value => `${value.rtmpURL}/${value.streamKey}`
)
: [];
- hmsActions.startRTMPOrRecording({
+ await hmsActions.startRTMPOrRecording({
rtmpURLs: urls,
meetingURL: recordingUrl,
resolution: getResolution(resolution),
diff --git a/src/components/VideoList.jsx b/src/components/VideoList.jsx
index 8c437b2d1..ba42b61d7 100644
--- a/src/components/VideoList.jsx
+++ b/src/components/VideoList.jsx
@@ -1,13 +1,14 @@
-import React, { useEffect, useState } from "react";
+import React, { Fragment, useEffect, useState } from "react";
import {
selectLocalPeerID,
useHMSStore,
useVideoList,
} from "@100mslive/react-sdk";
-import { getLeft, StyledVideoList, useTheme } from "@100mslive/react-ui";
+import { StyledVideoList, useTheme } from "@100mslive/react-ui";
import { Pagination } from "./Pagination";
import ScreenshareTile from "./ScreenshareTile";
import VideoTile from "./VideoTile";
+import useSortedPeers from "../common/useSortedPeers";
import { useAppConfig } from "./AppData/useAppConfig";
import { useIsHeadless, useUISettings } from "./AppData/useUISettings";
import { UI_SETTINGS } from "../common/constants";
@@ -24,11 +25,12 @@ const List = ({
const isHeadless = useIsHeadless();
const hideLocalVideo = useUISettings(UI_SETTINGS.hideLocalVideo);
const localPeerId = useHMSStore(selectLocalPeerID);
- if (hideLocalVideo && peers.length > 1) {
- peers = filterPeerId(peers, localPeerId);
+ let sortedPeers = useSortedPeers({ peers, maxTileCount });
+ if (hideLocalVideo && sortedPeers.length > 1) {
+ sortedPeers = filterPeerId(sortedPeers, localPeerId);
}
const { ref, pagesWithTiles } = useVideoList({
- peers,
+ peers: sortedPeers,
maxTileCount,
maxColCount,
maxRowCount,
@@ -45,40 +47,30 @@ const List = ({
}, [pagesWithTiles.length, page]);
return (
-
+
{pagesWithTiles && pagesWithTiles.length > 0
- ? pagesWithTiles.map((tiles, pageNo) => (
-
- {tiles.map(tile => {
- if (tile.width === 0 || tile.height === 0) {
- return null;
- }
- return tile.track?.source === "screen" ? (
+ ? pagesWithTiles[page]?.map(tile => {
+ return (
+
+ {tile.track?.source === "screen" ? (
) : (
- );
- })}
-
- ))
+ )}
+
+ );
+ })
: null}
{!isHeadless && pagesWithTiles.length > 1 ? (
diff --git a/src/components/VideoTile.jsx b/src/components/VideoTile.jsx
index 65b3068cb..f53387ce8 100644
--- a/src/components/VideoTile.jsx
+++ b/src/components/VideoTile.jsx
@@ -33,7 +33,6 @@ const Tile = ({
trackId,
width,
height,
- visible = true,
objectFit = "cover",
rootCSS = {},
containerCSS = {},
@@ -87,7 +86,6 @@ const Tile = ({
tileOffset: headlessConfig?.tileOffset,
hideAudioLevel: headlessConfig?.hideAudioLevel,
}),
- visibility: visible ? "visible" : "hidden",
...rootCSS,
}}
data-testid={`participant_tile_${peerName}`}
diff --git a/src/components/gridView.jsx b/src/components/gridView.jsx
index de26ff118..9f660483b 100644
--- a/src/components/gridView.jsx
+++ b/src/components/gridView.jsx
@@ -22,6 +22,7 @@ const webinarInfoLink = webinarProps?.LINK_HREF || "https://100ms.live/";
export const GridCenterView = ({ peers, maxTileCount }) => {
const mediaQueryLg = cssConfig.media.md;
const limitMaxTiles = useMedia(mediaQueryLg);
+
const headlessConfig = useAppConfig("headlessConfig");
const isHeadless = useIsHeadless();
return (
diff --git a/src/layouts/ActiveSpeakerView.jsx b/src/layouts/ActiveSpeakerView.jsx
index d83f0e01f..5a7035456 100755
--- a/src/layouts/ActiveSpeakerView.jsx
+++ b/src/layouts/ActiveSpeakerView.jsx
@@ -4,8 +4,9 @@ import {
selectPeers,
useHMSStore,
} from "@100mslive/react-sdk";
-import { Flex } from "@100mslive/react-ui";
-import { GridCenterView, GridSidePaneView } from "../components/gridView";
+import { Box, Flex } from "@100mslive/react-ui";
+import { GridSidePaneView } from "../components/gridView";
+import VideoTile from "../components/VideoTile";
const ActiveSpeakerView = () => {
const dominantSpeaker = useHMSStore(selectDominantSpeaker);
@@ -27,11 +28,9 @@ const ActiveSpeakerView = () => {
return (
-
+
+
+
{showSidePane && (
peer.id !== activeSpeaker.id)}
diff --git a/src/plugins/transcription/Transcriber.js b/src/plugins/transcription/Transcriber.js
index 4f8a27cc4..7c4c17906 100644
--- a/src/plugins/transcription/Transcriber.js
+++ b/src/plugins/transcription/Transcriber.js
@@ -5,11 +5,11 @@ import {
} from "@100mslive/react-sdk";
export class Transcriber {
- constructor(
+ constructor({
hmsStore,
setTranscriptAndSpeakingPeer,
- setIsTranscriptionEnabled
- ) {
+ setIsTranscriptionEnabled,
+ }) {
this.hmsStore = hmsStore;
this.enabled = false;
this.audioSocket = null; // this is the socket that will be used to send audio to the STT server
diff --git a/src/plugins/transcription/TranscriptionButton.jsx b/src/plugins/transcription/TranscriptionButton.jsx
index 09deca81b..759b00374 100644
--- a/src/plugins/transcription/TranscriptionButton.jsx
+++ b/src/plugins/transcription/TranscriptionButton.jsx
@@ -34,27 +34,31 @@ export function TranscriptionButton() {
useEffect(() => {
if (!transcriber.current) {
- transcriber.current = new Transcriber(
- rawStore,
- async (transcript, peerName) => {
+ // create transcriber with the current room state for transcription
+ transcriber.current = new Transcriber({
+ hmsStore: rawStore,
+ setTranscriptAndSpeakingPeer: async (transcript, peerName) => {
+ const transcriptionCurrentEnabledState = !!rawStore.getState(
+ selectSessionStore(SESSION_STORE_KEY.TRANSCRIPTION_STATE)
+ )?.enabled;
await hmsActions.sessionStore.set(
SESSION_STORE_KEY.TRANSCRIPTION_STATE,
{
- enabled: true,
+ enabled: transcriptionCurrentEnabledState,
transcript,
speakingPeer: peerName,
}
);
},
- async isEnabled => {
+ setIsTranscriptionEnabled: async newEnabledState => {
await hmsActions.sessionStore.set(
SESSION_STORE_KEY.TRANSCRIPTION_STATE,
{
- enabled: isEnabled,
+ enabled: newEnabledState,
}
);
- }
- );
+ },
+ });
}
return () => {
if (transcriber.current) {
diff --git a/src/plugins/whiteboard/Whiteboard.css b/src/plugins/whiteboard/Whiteboard.css
index cf0c07705..2486cbe0b 100644
--- a/src/plugins/whiteboard/Whiteboard.css
+++ b/src/plugins/whiteboard/Whiteboard.css
@@ -6,3 +6,7 @@
.c-bUEyht-jvfJsl-side-right > button:nth-child(2) {
display: none;
}
+
+#TD-PrimaryTools-Image {
+ display: none;
+}
diff --git a/src/services/FeatureFlags.jsx b/src/services/FeatureFlags.jsx
index dd4531785..f45be0431 100644
--- a/src/services/FeatureFlags.jsx
+++ b/src/services/FeatureFlags.jsx
@@ -1,4 +1,5 @@
import { useEffect } from "react";
+import { selectRoomID, useHMSStore } from "@100mslive/react-sdk";
export class FeatureFlags {
static enableTranscription =
@@ -12,7 +13,7 @@ export class FeatureFlags {
static enableBeamSpeakersLogging =
process.env.REACT_APP_ENABLE_BEAM_SPEAKERS_LOGGING === "true";
- static init() {
+ static init(roomId) {
if (!window.HMS) {
window.HMS = {};
}
@@ -21,6 +22,9 @@ export class FeatureFlags {
// ask permissions in preview even if role doesn't have it
window.HMS.ALWAYS_REQUEST_PERMISSIONS = false;
window.HMS.SHOW_NS = process.env.REACT_APP_ENV !== "prod";
+
+ this.enableTranscription =
+ process.env.REACT_APP_TRANSCRIPTION_ROOM_ID === roomId;
}
static showNS() {
@@ -37,8 +41,11 @@ export class FeatureFlags {
}
export function FeatureFlagsInit() {
+ const roomId = useHMSStore(selectRoomID);
useEffect(() => {
- FeatureFlags.init();
- }, []);
+ if (roomId) {
+ FeatureFlags.init(roomId);
+ }
+ }, [roomId]);
return null;
}
diff --git a/yarn.lock b/yarn.lock
index 4074fe30f..cb6cd24a3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,40 +2,40 @@
# yarn lockfile v1
-"@100mslive/hls-player@0.1.3":
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/@100mslive/hls-player/-/hls-player-0.1.3.tgz#475698af494c6e254b668890651ccbbd6c2e63fd"
- integrity sha512-ar7GT6Jy8mDPsrRx2ryuVXIk4im0mTqwP/60YlQ1ioXq/dK3PGuVevgR+VMOxLD1410m1sLuSbSAYJAyGzT2vw==
+"@100mslive/hls-player@0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/hls-player/-/hls-player-0.1.5.tgz#d395dbfba3888d64d283e1b2a6f8b78226cf3f57"
+ integrity sha512-GpOAhVhCKzoxkA7sOQ8GWt9G70gQtkQZjQ/SNnMU5qDZJgZRGG+eHx90rXsw9TfB7kPeeDFCfsA4/YOlYxgBEw==
dependencies:
- "@100mslive/hls-stats" "0.2.3"
+ "@100mslive/hls-stats" "0.2.5"
eventemitter2 "^6.4.7"
hls.js "^1.3.0"
-"@100mslive/hls-stats@0.2.3":
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/@100mslive/hls-stats/-/hls-stats-0.2.3.tgz#4dbd3296e81ca9199d1b27cdb62f76efb0a2ef88"
- integrity sha512-7LVwhQBQQy9FDTHKJICrCfOcpF8P2hqIYveVH7Dil33nGOpIZzJ3FCjIuCS6rni/dCBZfwxhoCWGRhhgL1XNHg==
+"@100mslive/hls-stats@0.2.5":
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/hls-stats/-/hls-stats-0.2.5.tgz#58d403ac7747759da57a6c4acb928f0f72fc9348"
+ integrity sha512-IMvIMZs5APNJJnweAC2j5yCT1vq8g7bYp6NaKQJfiXovUxfzjsFBYnO1PBU27yZZMzuyk9wDKaY+HsoDKGvgEw==
-"@100mslive/hms-noise-suppression@0.9.3":
- version "0.9.3"
- resolved "https://registry.yarnpkg.com/@100mslive/hms-noise-suppression/-/hms-noise-suppression-0.9.3.tgz#8b23fe0dddbe5a40ab16b3a143ae1989fba585f9"
- integrity sha512-jZ55QfZld5fuNTd7RszCHZ0uSQ/OPTw6sOCeVtQBgzsgmcex18HHSVXEIMvwGnHtnjJKYgxbtIvP2ELDaNmYig==
+"@100mslive/hms-noise-suppression@0.9.5":
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/hms-noise-suppression/-/hms-noise-suppression-0.9.5.tgz#e9e427a93aa8ba019dd3edc1eac4a751d321e8c3"
+ integrity sha512-d0cTYfXliG2XMNIkr5cP43YXbq0wi3I4MwICyoi0JjyyvVdeKdiSmr3iGtxu5wiaEGW0QYhetcyAzLuxTOu9Ag==
-"@100mslive/hms-video-store@0.10.3":
- version "0.10.3"
- resolved "https://registry.yarnpkg.com/@100mslive/hms-video-store/-/hms-video-store-0.10.3.tgz#88a6be019cab4ac1af3af324a7760d33cd5922a7"
- integrity sha512-b//IzVx0+F1ONSrkPtlEfR4JhjMdkV3Dh5/+R4vymsKju2preGBZKp0owbcdJ1fhz4SSkiN1a3bdfnW0s+IYwg==
+"@100mslive/hms-video-store@0.10.5":
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/hms-video-store/-/hms-video-store-0.10.5.tgz#c780327ab3f5e7727d3fa92d906c49e424c1d08e"
+ integrity sha512-4wHv2f6mi511ILV0yC0JKkz/H41i5/1jKN63q/s2CfMBYj8xYsaQLhPfCsiSti8zwZWDbd5Qh3S3Y4JvPxAYxg==
dependencies:
- "@100mslive/hms-video" "0.9.3"
+ "@100mslive/hms-video" "0.9.5"
eventemitter2 "^6.4.7"
immer "^9.0.6"
reselect "4.0.0"
zustand "3.5.7"
-"@100mslive/hms-video@0.9.3":
- version "0.9.3"
- resolved "https://registry.yarnpkg.com/@100mslive/hms-video/-/hms-video-0.9.3.tgz#6be80df95e76f36cfc89bc38895a4cb7cb6ce01c"
- integrity sha512-olp9SHEw3qY3Ugjo9BnfHsIyo4zeJbrI+OkoRtODPRTNO60+Vy/vPhlKBldlzIG5F+5GUlFXbNUAifZRZ43I+Q==
+"@100mslive/hms-video@0.9.5":
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/hms-video/-/hms-video-0.9.5.tgz#0f37f0a7415b56b77cff3bc5c1a36796c7cb88b5"
+ integrity sha512-/Df4x0eFYxW7yelTmqyQpbgTfl1rs3v6af3cmQhNbbj8xT7DshOmZCVjpQqlMbn5jpj8Iv8WVzvgbt/q6TWnEg==
dependencies:
eventemitter2 "^6.4.7"
sdp-transform "^2.14.1"
@@ -43,10 +43,10 @@
uuid "^8.3.2"
webrtc-adapter "^8.0.0"
-"@100mslive/hms-virtual-background@1.11.3":
- version "1.11.3"
- resolved "https://registry.yarnpkg.com/@100mslive/hms-virtual-background/-/hms-virtual-background-1.11.3.tgz#7b469490e3c719815b731b9349c05f3a092c1f4d"
- integrity sha512-zrKCLqv1spUIZ2WYBGhFrBU3WJgw3IIoNki+jnP1b3mxQzj0vYin4OPJTutimWcMoyx7gFvQQYdF4XPY2qcjug==
+"@100mslive/hms-virtual-background@1.11.5":
+ version "1.11.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/hms-virtual-background/-/hms-virtual-background-1.11.5.tgz#6539a735a68003249f8ba9c56a4e860940b5644b"
+ integrity sha512-NU9U2cuW1suitFSI7Q5nAlFv+FyiK3AA0ALmL2ynXRmuNds+F5Xo5IBmlS3AXWLcCl1Py04Qm3qJfcIywwKZJQ==
dependencies:
"@mediapipe/selfie_segmentation" "^0.1.1632777926"
"@tensorflow-models/body-segmentation" "^1.0.1"
@@ -58,27 +58,27 @@
gifuct-js "^2.1.2"
wasm-check "^2.0.2"
-"@100mslive/react-icons@0.8.3":
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/@100mslive/react-icons/-/react-icons-0.8.3.tgz#07e91764b9e08db20a59ee0d00cc2b393928747f"
- integrity sha512-B4gr3TQXfS4zlFOU6NYtFpHfd1VBgMj459PY57gVKkJ2JZRKFB1bZ3dh5AHcac7lL0j+GDgpoqVXS+qMD3jFrw==
+"@100mslive/react-icons@0.8.5":
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/react-icons/-/react-icons-0.8.5.tgz#f478c0d81134df31f38b7780d421521f2bba261e"
+ integrity sha512-ZTJ34omKEKmHRkyWageCCXLIGMkCGs1ooVeYFTNytgjynZvEH6PzoGfZ+BtJVXlTfQGQfQYlZa9oFu7cb/DOYA==
-"@100mslive/react-sdk@0.8.3":
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/@100mslive/react-sdk/-/react-sdk-0.8.3.tgz#2e1d626e8c43a8ee4566b670bbd2a83ab4880128"
- integrity sha512-epShtReOZiOppk+g2L8+eQRtnXZ9kW7ms8n9ewEONFtH/deeRZr7XUI9Vnaj65szKK4J+Xf6A7iiigEoNaU/FA==
+"@100mslive/react-sdk@0.8.5":
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/react-sdk/-/react-sdk-0.8.5.tgz#1c57477b8f158b11921ebd3cc3d9ca7ecab5dfd1"
+ integrity sha512-5loN523Lq8C+bkNIgiMgYLcbGkST7x9aRdrOAo8kt21BFeOEh4oUBuOKpjxkqenOKOx+u+SSy68gQ+PjC0z47Q==
dependencies:
- "@100mslive/hms-video-store" "0.10.3"
+ "@100mslive/hms-video-store" "0.10.5"
react-resize-detector "^7.0.0"
zustand "^3.6.2"
-"@100mslive/react-ui@0.8.3":
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/@100mslive/react-ui/-/react-ui-0.8.3.tgz#26c9b84187064244a397d90ce7e4394fb08e6b1b"
- integrity sha512-muNnNsDjQMU+xMYH2Z3wo7Hb6kghyGZ+XEy912pj40eoVmvqHvRiNLX+KoL/ohK4WCnBT9/AjHpYgscgx9lPKw==
+"@100mslive/react-ui@0.8.5":
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/@100mslive/react-ui/-/react-ui-0.8.5.tgz#53a83ea7e508192acebc7ec263265b86e6b919f1"
+ integrity sha512-5y+tFysiHUR5mTKL65SCACwL3oYvCbi823Tnxtdu5vUhjGtJxgyUfwDDiKn21sVpI2k6YQWFKT7Bx++RLIZwGw==
dependencies:
- "@100mslive/react-icons" "0.8.3"
- "@100mslive/react-sdk" "0.8.3"
+ "@100mslive/react-icons" "0.8.5"
+ "@100mslive/react-sdk" "0.8.5"
"@radix-ui/react-accordion" "1.0.0"
"@radix-ui/react-checkbox" "1.0.0"
"@radix-ui/react-collapsible" "^1.0.1"