| 1 |
|
| 2 |
const v = new URL(import.meta.url).search; |
| 3 |
const canvas = document.getElementById("backdrop"); |
| 4 |
const chosen = document.cookie.match(/(?:^|; )backdrop=(moving|still|off)/); |
| 5 |
const touch = matchMedia("(pointer: coarse)").matches && !matchMedia("(pointer: fine)").matches; |
| 6 |
const pick = chosen ? chosen[1] : (touch || (navigator.connection && navigator.connection.saveData) ? "still" : "moving"); |
| 7 |
if (pick === "off") { |
| 8 |
canvas.remove(); |
| 9 |
} else { |
| 10 |
try { |
| 11 |
const bd = await import(`/static/backdrop/backdrop.js${v}`); |
| 12 |
await bd.default({ module_or_path: `/static/backdrop/backdrop_bg.wasm${v}` }); |
| 13 |
const data = JSON.parse(document.getElementById("backdrop-data").textContent); |
| 14 |
bd.start(canvas, data, pick === "still"); |
| 15 |
|
| 16 |
|
| 17 |
if (data.live) { |
| 18 |
let since = data.now; |
| 19 |
const poll = async () => { |
| 20 |
if (document.hidden) return; |
| 21 |
try { |
| 22 |
const r = await fetch(`/sky/arrivals?scene=${data.live}&since=${since}`, { headers: { accept: "application/json" } }); |
| 23 |
if (!r.ok) return; |
| 24 |
const got = await r.json(); |
| 25 |
since = got.now; |
| 26 |
if (got.events.length) bd.arrive(got); |
| 27 |
} catch (e) {} |
| 28 |
}; |
| 29 |
setInterval(poll, 30000); |
| 30 |
document.addEventListener("visibilitychange", poll); |
| 31 |
} |
| 32 |
} catch (e) { |
| 33 |
canvas.remove(); |
| 34 |
} |
| 35 |
} |