@if (vm$ | async; as state) { @switch (state.status) { @case ('loading') {
} @case ('error') {

Не удалось загрузить сессию.

} @case ('ok') {

Сессия {{ state.id }}

@if (telemetry$ | async; as telemetryState) { @if (activeTabIndex() === 0) {
@if (state.detail.session.title) {

{{ state.detail.session.title }}

}
{{ state.detail.session.status | sessionStatus }}
Начало: {{ formatDate(state.detail.session.started_at) }} · Окончание: {{ formatDate(state.detail.session.ended_at) }}

Трансляция

@if (state.detail.streams.length === 0) {

Потоки ещё не готовы.

} @else {
@for (s of state.detail.streams; track s.stream_type) { }
@if (playlistUrl(state.detail); as src) { } }

События телеметрии ({{ filteredTelemetryEvents(telemetryState.telemetry).length }})

{{ telemetryRangeLabel(telemetryState.toMs) }}

@if (telemetryState.status === 'loading') {
} @else if (telemetryState.status === 'error') {

События телеметрии временно недоступны.

} @else { @if (telemetryState.telemetry.length === 0) {

Событий пока нет.

} @else {
@for (t of uniqueTelemetryEventTypes(telemetryState.telemetry); track t) { }
@if (filteredTelemetryEvents(telemetryState.telemetry).length === 0) {

Нет событий выбранного типа.

} @else {
@for ( row of filteredTelemetryEvents(telemetryState.telemetry); track $index; let i = $index ) { @if (isTelemetryRowExpanded(row, i)) { } }
Время Тип Сводка
{{ formatUnixMs(row.timestamp) }} {{ row.event_type | telemetryEventType }} {{ telemetryEventSummary(row) }}
} } }
} @if (activeTabIndex() === 1) {

Сессия

Идентификатор
{{ state.detail.session.id }}
ID пользователя
{{ state.detail.session.user_id ?? '—' }}
Статус
{{ state.detail.session.status }}
Начало
{{ state.detail.session.started_at ?? '—' }}
Окончание
{{ state.detail.session.ended_at ?? '—' }}
Всего чанков
{{ state.detail.session.chunks_total ?? '—' }}
Всего событий
{{ state.detail.session.events_total ?? '—' }}
Название
{{ state.detail.session.title ?? '—' }}

Потоки

@if (state.detail.streams.length === 0) {

Нет записей о потоках.

} @else {
@for (s of state.detail.streams; track s.stream_type) { }
Тип Чанки Длительность URL видеозаписи
{{ s.stream_type }} {{ s.chunk_count ?? '—' }} {{ formatDurationMs(s.duration_ms) }} {{ streamResolvedPlaylistUrl(s) }}
}

Запрос событий

От (мс)
{{ telemetryState.fromMs }}
До (мс)
{{ telemetryState.toMs }}
ID сессии
@if (telemetryState.parsedMeta) { {{ telemetryState.parsedMeta.session_id }} } @else { — }
Количество
@if (telemetryState.parsedMeta) { {{ telemetryState.parsedMeta.count }} } @else { — }
Строк в выборке
{{ telemetryState.telemetry.length }}
Статус загрузки
{{ telemetryState.status }}

Исходный JSON

} } } } }