{"version":3,"file":"game-status.js","names":["root","active","key","used","failures","stopped","phase","timer","inFlight","epoch","controller","regions","store","clearBudget","revealRefresh","el","stop","done","delay","ok","schedule","run","ms","attempt","requestEpoch","current","timedOut","deadline","url","response","parse","value","error","retry","refreshTerminal","request","source","text","from","id","to","pair","status","body","manual","event","fallback"],"sources":["src/game-status.ts"],"sourcesContent":["(function() {\n  var root = document.getElementById('game-live-state');\n  if (!root) return;\n  var active = root.dataset.status;\n  if (active !== 'waiting' && active !== 'running') return;\n  var key = 'arena-game-poll-' + root.dataset.gameId;\n  var used = 0, failures = 0, stopped = false, phase = 'status';\n  let timer: ReturnType<typeof setTimeout> | null = null;\n  var inFlight = false, epoch = 0;\n  let controller: AbortController | null = null;\n  var regions = ['game-status-region', 'game-outcome-region', 'game-actions-region', 'game-results-region', 'game-metadata-region'];\n  try { used = Number(sessionStorage.getItem(key)) || 0; } catch (_) {}\n  function store() { try { sessionStorage.setItem(key, String(used)); } catch (_) {} }\n  function clearBudget() { try { sessionStorage.removeItem(key); } catch (_) {} }\n  function revealRefresh() { var el = document.getElementById('game-manual-refresh'); if (el) el.hidden = false; }\n  function stop(done: boolean) {\n    stopped = true;\n    if (timer) clearTimeout(timer);\n    timer = null;\n    if (controller) controller.abort();\n    epoch += 1;\n    inFlight = false;\n    controller = null;\n    if (done) clearBudget();\n  }\n  function delay(ok: boolean) { if (ok) failures = 0; else failures += 1; return ok ? 2000 : Math.min(30000, 2000 * Math.pow(2, failures)); }\n  function schedule(ms: number) { if (!stopped && !timer) timer = setTimeout(run, ms); }\n  function attempt<T>(url: string, parse: (response: Response) => Promise<T>): Promise<T> | null {\n    if (used >= 600) { stop(false); revealRefresh(); return null; }\n    used += 1; store();\n    var requestEpoch = epoch;\n    var current = new AbortController();\n    var timedOut = false;\n    var deadline = setTimeout(function() {\n      timedOut = true;\n      current.abort();\n    }, 15000);\n    controller = current;\n    inFlight = true;\n    return fetch(url, { credentials: 'same-origin', signal: current.signal })\n      .then(function(response) {\n        if (stopped || requestEpoch !== epoch) throw new DOMException('stale request', 'AbortError');\n        if (!response.ok) throw new Error('request failed');\n        return parse(response);\n      })\n      .then(function(value) {\n        if (stopped || requestEpoch !== epoch) throw new DOMException('stale request', 'AbortError');\n        return value;\n      })\n      .catch(function(error) {\n        if (timedOut && !stopped && requestEpoch === epoch) throw new Error('request timed out');\n        throw error;\n      })\n      .finally(function() {\n        clearTimeout(deadline);\n        if (controller === current && requestEpoch === epoch) {\n          inFlight = false;\n          controller = null;\n        }\n      });\n  }\n  function retry() { schedule(delay(false)); }\n  function refreshTerminal() {\n    phase = 'terminal';\n    var request = attempt(window.location.href, function(response: Response) { return response.text(); });\n    if (!request) return;\n    request.then(function(text) {\n      var source = new DOMParser().parseFromString(text, 'text/html');\n      var pairs = regions.map(function(id) {\n        var from = source.querySelectorAll('#' + id);\n        var to = document.querySelectorAll('#' + id);\n        if (from.length !== 1 || to.length !== 1) throw new Error('invalid refresh regions');\n        return [to[0], from[0]];\n      });\n      pairs.forEach(function(pair) { pair[0].innerHTML = pair[1].innerHTML; });\n      stop(true);\n    }).catch(function(error) {\n      if (stopped || error.name === 'AbortError') return;\n      retry();\n    });\n  }\n  function run() {\n    timer = null;\n    if (stopped || inFlight) return;\n    if (document.hidden) { schedule(1000); return; }\n    if (phase === 'terminal') { refreshTerminal(); return; }\n    var request = attempt('/api/games/' + root!.dataset.gameId, function(response: Response) { return response.json() as Promise<{ Game?: { ArenaStatus?: string } }>; });\n    if (!request) return;\n    request.then(function(body) {\n      var status = body && body.Game && body.Game.ArenaStatus;\n      if (!status || ['waiting', 'running', 'finished', 'failed'].indexOf(status) === -1) throw new Error('invalid status');\n      failures = 0;\n      if (active === 'waiting' && status !== 'waiting') { window.location.reload(); return; }\n      if (active === 'running' && (status === 'finished' || status === 'failed')) {\n        phase = 'terminal';\n        schedule(0);\n        return;\n      }\n      schedule(delay(true));\n    }).catch(function(error) {\n      if (stopped || error.name === 'AbortError') return;\n      retry();\n    });\n  }\n  var manual = document.getElementById('game-manual-refresh');\n  if (manual) manual.hidden = true;\n  document.addEventListener('visibilitychange', function() {\n    if (!document.hidden && !timer && !inFlight && !stopped) schedule(0);\n  });\n  window.addEventListener('pagehide', function() { stop(false); });\n  window.addEventListener('pageshow', function(event) {\n    if (!event.persisted) return;\n    stopped = false;\n    timer = null;\n    phase = 'status';\n    var fallback = document.getElementById('game-manual-refresh');\n    if (fallback) fallback.hidden = true;\n    schedule(0);\n  });\n  schedule(2000);\n})();\n"],"mappings":"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"}