Skip to content

Commit 4c2c04b

Browse files
committed
fix(react-client): await pending addTrack to fix track ops race
1 parent b68ff22 commit 4c2c04b

1 file changed

Lines changed: 13 additions & 8 deletions

File tree

packages/react-client/src/hooks/internal/useTrackManager.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export const useTrackManager = ({
2626
logger,
2727
}: TrackManagerConfig): TrackManager => {
2828
const currentTrackIdRef = useRef<string | null>(null);
29+
const connectionPromiseRef = useRef<Promise<string> | null>(null);
2930

3031
const {
3132
startDevice,
@@ -38,7 +39,10 @@ export const useTrackManager = ({
3839
selectDevice: _selectDevice,
3940
} = deviceManager;
4041

41-
const getCurrentTrackId = useCallback(() => {
42+
const getCurrentTrackId = useCallback(async () => {
43+
if (connectionPromiseRef.current) {
44+
await connectionPromiseRef.current;
45+
}
4246
const refTrackId = currentTrackIdRef.current;
4347
if (!refTrackId) return null;
4448
const currentTrack = getRemoteOrLocalTrack(tsClient, refTrackId);
@@ -53,7 +57,7 @@ export const useTrackManager = ({
5357
const [newTrack, error] = result;
5458
if (error) return error;
5559

56-
const currentTrackId = getCurrentTrackId();
60+
const currentTrackId = await getCurrentTrackId();
5761
if (!currentTrackId) return;
5862

5963
await tsClient.replaceTrack(currentTrackId, newTrack);
@@ -65,7 +69,7 @@ export const useTrackManager = ({
6569
async (middleware: TrackMiddleware) => {
6670
const processedTrack = await applyMiddleware(middleware);
6771

68-
const currentTrackId = getCurrentTrackId();
72+
const currentTrackId = await getCurrentTrackId();
6973
if (!currentTrackId) return;
7074

7175
await tsClient.replaceTrack(currentTrackId, processedTrack);
@@ -91,8 +95,9 @@ export const useTrackManager = ({
9195
const [maxBandwidth, simulcastConfig] = getConfigAndBandwidthFromProps(props.sentQualities, bandwidthLimits);
9296

9397
try {
94-
const remoteTrackId = await tsClient.addTrack(track, trackMetadata, simulcastConfig, maxBandwidth);
95-
98+
const addTrackJob = tsClient.addTrack(track, trackMetadata, simulcastConfig, maxBandwidth);
99+
connectionPromiseRef.current = addTrackJob;
100+
const remoteTrackId = await addTrackJob;
96101
currentTrackIdRef.current = remoteTrackId;
97102
} catch (err) {
98103
if (err instanceof TrackTypeError) {
@@ -127,7 +132,7 @@ export const useTrackManager = ({
127132
* @see {@link TrackManager#toggleMute} for more details.
128133
*/
129134
const toggleMute = useCallback(async () => {
130-
const currentTrackId = getCurrentTrackId();
135+
const currentTrackId = await getCurrentTrackId();
131136
const isTrackCurrentlyEnabled = Boolean(deviceTrack?.enabled);
132137
if (!currentTrackId) {
133138
logger.warn("Toggling mute is only possible while connected to a room.");
@@ -147,11 +152,11 @@ export const useTrackManager = ({
147152
* @see {@link TrackManager#toggleDevice} for more details.
148153
*/
149154
const toggleDevice = useCallback(async () => {
150-
const currentTrackId = getCurrentTrackId();
155+
const currentTrackId = await getCurrentTrackId();
151156
if (deviceTrack) {
152157
stopDevice();
153158
if (currentTrackId) {
154-
pauseStreaming(currentTrackId);
159+
await pauseStreaming(currentTrackId);
155160
}
156161
} else {
157162
const [newTrack, error] = await startDevice();

0 commit comments

Comments
 (0)