ghp / packages /server /src /services /syncService.ts
QSLY's picture
deploy: build Hugging Face Space from source
00a912e
Raw
History Blame Contribute Delete
1.14 kB
import { roomRepo } from '../repositories/roomRepository.js'
/** 估算房间当前播放位置 */
export function estimateCurrentTimeAt(roomId: string, serverTime: number): number {
const room = roomRepo.get(roomId)
if (!room) return 0
const { playState } = room
if (!playState.isPlaying) return playState.currentTime
// Clamp elapsed to 0 — serverTimestamp can be a future scheduleTime
// (set in playTrackInRoom/seekTrack), so Date.now() - serverTimestamp
// may be negative before the scheduled execution moment.
const elapsed = Math.max(0, (serverTime - playState.serverTimestamp) / 1000)
const estimated = playState.currentTime + elapsed
// Clamp to track duration so mid-song joiners don't receive a position
// beyond the song length when the conductor hasn't reported end-of-track.
const duration = room.currentTrack?.duration
if (duration && duration > 0) {
return Math.min(estimated, duration)
}
return estimated
}
/** Estimate the room position at the current server time. */
export function estimateCurrentTime(roomId: string): number {
return estimateCurrentTimeAt(roomId, Date.now())
}