class UptimeCard extends HTMLElement { constructor() { super(); this.source = null; } connectedCallback() { this.innerHTML = `

Live uptime

Server-Sent Events
--s
Disconnected
`; window.addEventListener('app:login', event => this.start(event.detail.token)); window.addEventListener('beforeunload', () => this.stop()); if (window.App && window.App.token()) this.start(window.App.token()); } disconnectedCallback() { this.stop(); } setState(text, connected) { this.querySelector('#state').textContent = text; this.querySelector('#dot').classList.toggle('on', !!connected); } start(token) { this.stop(); if (!token || !window.EventSource) { this.setState('Unavailable', false); return; } this.setState('Connecting', false); this.source = new EventSource('/api/uptime/events?token=' + encodeURIComponent(token)); this.source.addEventListener('open', () => this.setState('Connected', true)); this.source.addEventListener('uptime', event => { try { const json = JSON.parse(event.data); this.querySelector('#seconds').textContent = json.uptimeSeconds; this.setState('Connected', true); } catch (error) { this.setState('Invalid event', false); } }); this.source.addEventListener('error', () => this.setState('Reconnecting', false)); } stop() { if (this.source) this.source.close(); this.source = null; } } customElements.define('uptime-card', UptimeCard);