From 2a435806e77da00a2c438307b7f50992d0e3ddc4 Mon Sep 17 00:00:00 2001 From: Nuwan Date: Wed, 14 Jan 2026 10:45:08 +0530 Subject: [PATCH] fix(uat-02-01): await async jamClient methods to fix NaN values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes UAT-002: Player showing NaN:NaN and slider positioning incorrectly Root Cause: jam-ui's jamClientProxy uses Proxy pattern where ALL methods return Promises (via sendWhenReady → sendMessage → deferred.promise). Code was calling SessionGetTracksPlayDurationMs(), SessionCurrrentPlayPosMs(), and isSessionTrackPlaying() synchronously without await. Result: Promise objects were passed to formatTime() and slider calculations, causing NaN values and incorrect slider behavior. Solution: - Wrapped initialization duration fetch in async function with await - Changed polling setInterval callback to async function with await for all calls - Now correctly awaits all jamClient Promise-based methods This matches jam-ui's async jamClient architecture (different from legacy web's synchronous bridge API). Co-Authored-By: Claude Sonnet 4.5 --- .../client/JKSessionBackingTrackPlayer.js | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/jam-ui/src/components/client/JKSessionBackingTrackPlayer.js b/jam-ui/src/components/client/JKSessionBackingTrackPlayer.js index ddd7dc0a7..13a447be0 100644 --- a/jam-ui/src/components/client/JKSessionBackingTrackPlayer.js +++ b/jam-ui/src/components/client/JKSessionBackingTrackPlayer.js @@ -43,20 +43,24 @@ const JKSessionBackingTrackPlayer = ({ setCurrentTime('0:00'); setCurrentPositionMs(0); - // Fetch and set duration immediately when track loads - try { - const durationInMs = jamClient.SessionGetTracksPlayDurationMs(); - console.log('JKSessionBackingTrackPlayer: Duration from jamClient:', durationInMs, 'Type:', typeof durationInMs); + // Fetch and set duration immediately when track loads (async) + const fetchDuration = async () => { + try { + const durationInMs = await jamClient.SessionGetTracksPlayDurationMs(); + console.log('JKSessionBackingTrackPlayer: Duration from jamClient:', durationInMs, 'Type:', typeof durationInMs); - // Ensure we have a valid number - const validDuration = (durationInMs != null && !isNaN(durationInMs) && durationInMs >= 0) ? durationInMs : 0; - setDurationMs(validDuration); - setDuration(formatTime(validDuration)); - } catch (error) { - console.error('Error fetching track duration:', error); - setDuration('0:00'); - setDurationMs(0); - } + // Ensure we have a valid number + const validDuration = (durationInMs != null && !isNaN(durationInMs) && durationInMs >= 0) ? durationInMs : 0; + setDurationMs(validDuration); + setDuration(formatTime(validDuration)); + } catch (error) { + console.error('Error fetching track duration:', error); + setDuration('0:00'); + setDurationMs(0); + } + }; + + fetchDuration(); } }, [isOpen, backingTrack, jamClient]); @@ -65,14 +69,15 @@ const JKSessionBackingTrackPlayer = ({ let intervalId = null; if (isPlaying && jamClient) { - // Start polling when playing - intervalId = setInterval(() => { + // Start polling when playing (async) + intervalId = setInterval(async () => { try { if (!jamClient) return; - const positionMs = jamClient.SessionCurrrentPlayPosMs(); - const durationInMs = jamClient.SessionGetTracksPlayDurationMs(); - const trackIsPlaying = jamClient.isSessionTrackPlaying(); + // Await all async jamClient calls + const positionMs = await jamClient.SessionCurrrentPlayPosMs(); + const durationInMs = await jamClient.SessionGetTracksPlayDurationMs(); + const trackIsPlaying = await jamClient.isSessionTrackPlaying(); console.log('JKSessionBackingTrackPlayer polling:', { positionMs, durationInMs, trackIsPlaying });