@@ -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