fix(uat-02-01): await async jamClient methods to fix NaN values

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 <noreply@anthropic.com>
This commit is contained in:
Nuwan 2026-01-14 10:45:08 +05:30
parent 0561c8988b
commit 2a435806e7
1 changed files with 23 additions and 18 deletions

View File

@ -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 });