import type { AudioQuality } from './types.js' export const LIMITS = { ROOM_PASSWORD_MAX_LENGTH: 32, ROOM_NAME_MAX_LENGTH: 30, NICKNAME_MAX_LENGTH: 20, CHAT_CONTENT_MAX_LENGTH: 500, CHAT_HISTORY_MAX: 200, CHAT_RATE_LIMIT_PER_SECOND: 5, QUEUE_MAX_SIZE: 1000, QUEUE_BATCH_MAX_SIZE: 200, PLAYLIST_PAGE_SIZE: 100, SEARCH_KEYWORD_MAX_LENGTH: 100, BILIBILI_SEARCH_INPUT_MAX_LENGTH: 2000, SEARCH_PAGE_SIZE_MAX: 50, SEARCH_PAGE_MAX: 100, PLAYLIST_ID_MAX_LENGTH: 200, } as const /** 房间可选择的跨平台最高音质策略。 */ export const HIGHEST_AUDIO_QUALITY: AudioQuality = 'highest' export const TIMING = { ROOM_GRACE_PERIOD_MS: 60_000, STREAM_URL_REFRESH_INTERVAL_MS: 30 * 60_000, STREAM_URL_REFRESH_RETRY_INTERVAL_MS: 60_000, WEBSOCKET_HEARTBEAT_INTERVAL_MS: 25_000, PLAYER_NEXT_DEBOUNCE_MS: 500, VOTE_TIMEOUT_MS: 30_000, } as const /** QR code login status codes (shared between client polling and server responses) */ export const QR_STATUS = { EXPIRED: 800, WAITING_SCAN: 801, SCANNED: 802, SUCCESS: 803, } as const /** QR code polling timing */ export const QR_TIMING = { POLL_INTERVAL_MS: 2_000, SUCCESS_CLOSE_DELAY_MS: 1_000, } as const /** NTP clock synchronisation constants */ export const NTP = { /** Fast sampling interval during initial calibration (ms) */ INITIAL_INTERVAL_MS: 50, /** Steady-state heartbeat interval after initial calibration (ms) */ STEADY_STATE_INTERVAL_MS: 3_000, /** Number of rapid samples to collect during initial calibration */ MAX_INITIAL_SAMPLES: 20, /** Maximum stored measurements (sliding window) */ MAX_MEASUREMENTS: 60, /** Minimum scheduling delay for scheduled execution (ms) */ MIN_SCHEDULE_DELAY_MS: 300, /** Maximum scheduling delay cap (ms) */ MAX_SCHEDULE_DELAY_MS: 3_000, } as const