export function getAdaptiveImageQueueOwnerLimit(params: { maxConcurrent: number; hasCompetingOwner: boolean; }) { const maxConcurrent = Math.max(1, Math.floor(params.maxConcurrent || 1)); if (!params.hasCompetingOwner) { return maxConcurrent; } return Math.max(1, Math.ceil(maxConcurrent / 2)); } export function estimateImageDispatchWaitMs(params: { queuePosition: number; dispatchIntervalMs: number; delayRemainingMs?: number; }) { const queuePosition = Math.max(0, Math.floor(params.queuePosition || 0)); const dispatchIntervalMs = Math.max(0, params.dispatchIntervalMs || 0); const delayRemainingMs = Math.max(0, params.delayRemainingMs || 0); return delayRemainingMs + queuePosition * dispatchIntervalMs; }