diff --git a/web/src/client/components/session-list.ts b/web/src/client/components/session-list.ts index 385e8d06..4897cec7 100644 --- a/web/src/client/components/session-list.ts +++ b/web/src/client/components/session-list.ts @@ -47,7 +47,7 @@ export class SessionList extends LitElement { // Just mark as loaded and create the player with the endpoint URL this.loadedSnapshots.set(sessionId, sessionId); this.requestUpdate(); - + // Create asciinema player after the element is rendered setTimeout(() => this.createPlayer(sessionId), 10); } catch (error) { @@ -72,16 +72,16 @@ export class SessionList extends LitElement { const newSessionIdsList = this.sessions .filter(session => !prevSessions.find((prev: Session) => prev.id === session.id)) .map(session => session.id); - + // Track new sessions newSessionIdsList.forEach(id => this.newSessionIds.add(id)); - + // Load existing sessions immediately - const existingSessions = this.sessions.filter(session => + const existingSessions = this.sessions.filter(session => !newSessionIdsList.includes(session.id) ); existingSessions.forEach(session => this.loadSnapshot(session.id)); - + // Load new sessions after a delay to let them generate some output if (newSessionIdsList.length > 0) { setTimeout(() => { @@ -99,9 +99,9 @@ export class SessionList extends LitElement { const playerElement = this.querySelector(`#player-${sessionId}`) as HTMLElement; if (playerElement && (window as any).AsciinemaPlayer) { try { - const snapshotUrl = `/api/sessions/${sessionId}/snapshot`; - - (window as any).AsciinemaPlayer.create(snapshotUrl, playerElement, { + const streamUrl = `/api/sessions/${sessionId}/stream`; + + (window as any).AsciinemaPlayer.create({driver: "eventsource", url: streamUrl}, playerElement, { autoPlay: true, loop: false, controls: false, @@ -191,7 +191,7 @@ export class SessionList extends LitElement { private async handleCleanExited() { const exitedSessions = this.sessions.filter(session => session.status === 'exited'); - + if (exitedSessions.length === 0) { this.dispatchEvent(new CustomEvent('error', { detail: 'No exited sessions to clean' @@ -211,20 +211,20 @@ export class SessionList extends LitElement { const response = await fetch('/api/cleanup-exited', { method: 'POST' }); - + if (!response.ok) { throw new Error('Failed to cleanup exited sessions'); } - + this.dispatchEvent(new CustomEvent('error', { detail: `Successfully cleaned ${exitedSessions.length} exited session${exitedSessions.length > 1 ? 's' : ''}` })); - + // Refresh the list after cleanup setTimeout(() => { this.handleRefresh(); }, 500); - + } catch (error) { console.error('Error cleaning exited sessions:', error); this.dispatchEvent(new CustomEvent('error', { @@ -237,14 +237,14 @@ export class SessionList extends LitElement { } private get filteredSessions() { - return this.hideExited + return this.hideExited ? this.sessions.filter(session => session.status === 'running') : this.sessions; } render() { const sessionsToShow = this.filteredSessions; - + return html`
@@ -252,14 +252,14 @@ export class SessionList extends LitElement {
- - -
- +