Same cause as #1099 on the hosted side. src/hosted-loop.js only reacts to a frozen position through isStuck (stuckAfterMs, 300000), which uploads one idle state. Until then every poll uploads the session as playing with a frozen positionMs, so the hosted card shows a live track after the player has closed without a clean stop.
Repro: createHostedLoop with a getPresence that returns a playing presence with a fixed positionMs; every tick before 300s pushes state: "playing".
Expected: once the position has not moved for the same stall window as the Discord loop, upload the item as paused at that position, then keep the existing idle upload at 300s. Moving playback goes back to playing.
Fix: same shape as the Discord change for #1099: a stallAfterMs option below stuckAfterMs, with a loop test that fails on current main.
Priority: Medium.
Same cause as #1099 on the hosted side.
src/hosted-loop.jsonly reacts to a frozen position throughisStuck(stuckAfterMs, 300000), which uploads one idle state. Until then every poll uploads the session asplayingwith a frozenpositionMs, so the hosted card shows a live track after the player has closed without a clean stop.Repro:
createHostedLoopwith agetPresencethat returns aplayingpresence with a fixedpositionMs; every tick before 300s pushesstate: "playing".Expected: once the position has not moved for the same stall window as the Discord loop, upload the item as
pausedat that position, then keep the existing idle upload at 300s. Moving playback goes back toplaying.Fix: same shape as the Discord change for #1099: a
stallAfterMsoption belowstuckAfterMs, with a loop test that fails on current main.Priority: Medium.