# Sparkguardian

Клиентское веб-приложение для просмотра записанных сессий, HLS-потоков и телеметрии (клавиатура, мышь и др.), работающее поверх REST API Sparkguardian.

A single-page web client for reviewing recorded sessions, HLS streams, and telemetry (keyboard, mouse, and more), built on top of the Sparkguardian REST API.

---

## О проекте

Приложение предназначено для операторов и разработчиков, которым нужно открыть список сессий, перейти к деталям конкретной записи и синхронно смотреть видео с разбором событий на временной шкале. Бэкенд отвечает за хранение чанков, плейлистов и событий; фронтенд подставляет базовый URL API, подгружает данные и отображает их в интерфейсе на базе Taiga UI.

## Основные возможности

- **Список сессий** с пагинацией и созданием новой сессии по названию.
- **Карточка сессии** с вкладками: сводная информация, просмотр записи и телеметрии, интерактивный режим с визуализацией клавиатуры и курсора поверх видео.
- **HLS-воспроизведение** через hls.js, выбор потока (например, экран или веб-камера), если бэкенд отдаёт несколько `stream_type`.
- **Телеметрия**: загрузка разобранных событий с фильтрацией по типу и времени, привязка к окну записи (`started_at` / `ended_at`).
- **Уведомления об ошибках** HTTP с понятными сообщениями для пользователя.

## Технологии

| Область | Выбор |
|--------|--------|
| Фреймворк | Angular 21, TypeScript |
| UI | Taiga UI, анимации через `@angular/animations` |
| HTTP | `HttpClient`, интерсептор базового URL API |
| Тесты | Vitest через `@angular/build:unit-test`, jsdom |
| Линт | ESLint (`angular-eslint`) |
| Видео | hls.js |

Стили опираются на дизайн-токены (CSS-переменные); для компонентов по возможности используются примитивы Taiga UI.

## Как устроен код

- **Маршруты**: главная страница — список сессий (`/`); детали — `/sessions/:id`. Остальные пути перенаправляются на список.
- **Слой API**: `SessionsApiService` ходит на эндпоинты вида `/sessions`, `/sessions/:id/events` и т.д.; префикс API задаётся через `API_BASE_URL` (см. ниже). Относительные URL плейлистов HLS разрешаются к origin через `API_ORIGIN`.
- **Окружение**: `src/environments/environment.ts` генерируется скриптом `npm run env:sync` из переменных в `.env` (значения по умолчанию совпадают с `.env.example`). Production-сборка подменяет файл на `environment.prod.ts`.
- **Прокси в разработке**: `ng serve` использует `proxy.conf.cjs`: запросы к `/api/**` уходят на хост из `SG_DEV_PROXY_TARGET` в `.env` (по умолчанию указан в примере).

Подробная схема REST описана в `docs/doc_v1.json` (OpenAPI).

## Требования

- Node.js версии, совместимой с Angular 21 (см. рекомендации в документации Angular CLI).
- npm (в проекте зафиксирован `packageManager` в `package.json`).

## Локальная настройка

1. Скопируйте `.env.example` в `.env` и при необходимости измените переменные (`SG_API_BASE_PATH`, `SG_API_FALLBACK_ORIGIN`, `SG_INTERACTIVE_PREROLL_MS`, для dev — `SG_DEV_PROXY_TARGET`).
2. Установите зависимости: `npm install` или `make install`.
3. Сгенерируйте `environment.ts`: `npm run env:sync` или `make env-sync` (перед `start` и `build` это выполняется автоматически через npm-скрипты `prestart` / `prebuild`).

## Запуск и сборка

| Задача | Команда |
|--------|---------|
| Dev-сервер с прокси | `npm start` или `make start` |
| Production-сборка | `npm run build` или `make build` |
| Сборка development | `make build-dev` |
| Unit-тесты | `npm test` (в режиме разработки без CI обычно удобен интерактивный режим) |
| Линт | `npm run lint` |
| Очистка артефактов | `make clean` |

После `npm start` приложение доступно по адресу, который выводит Angular CLI (по умолчанию `http://localhost:4200/`).

## CI

В репозитории описан workflow Gitea Actions: `.gitea/workflows/ci.yml` — линт, тесты с `--watch=false`, production build. На сервере должны быть включены Actions и настроен runner.

## Структура каталогов (кратко)

- `src/app/core` — API, HTTP, модели, уведомления, разбор телеметрии клавиатуры/мыши, подсветка SVG.
- `src/app/features/sessions` — список сессий, детальная страница и вкладки, плеер HLS, выбор потока, детали события.
- `src/environments` — конфигурация окружения.
- `public` — статические ассеты (иконки, SVG для визуализации и т.д.).
- `scripts` — вспомогательные скрипты (`sync-env.cjs`).

---

## About the project

The app is aimed at operators and developers who need a session list, a focused session view, and a way to watch video while inspecting timed telemetry. The backend owns chunks, playlists, and events; the frontend configures the API base URL, loads data, and presents it through Taiga UI.

## Features

- **Session list** with pagination and creating a session with a title.
- **Session detail** with tabs: summary, combined playback and telemetry, and an interactive view with keyboard and cursor overlays on top of the video.
- **HLS playback** via hls.js, with stream selection when multiple `stream_type` entries exist.
- **Telemetry**: parsed events with type and time filters, aligned with the recording window (`started_at` / `ended_at`).
- **HTTP error notifications** with user-facing messages.

## Tech stack

| Area | Choice |
|------|--------|
| Framework | Angular 21, TypeScript |
| UI | Taiga UI, `@angular/animations` for motion |
| HTTP | `HttpClient`, API base URL interceptor |
| Tests | Vitest via `@angular/build:unit-test`, jsdom |
| Lint | ESLint (`angular-eslint`) |
| Video | hls.js |

Styling relies on CSS variables (design tokens); Taiga UI components are preferred where they fit.

## Architecture

- **Routes**: home is the session list (`/`); details live at `/sessions/:id`. Unknown paths redirect to the list.
- **API layer**: `SessionsApiService` calls `/sessions`, `/sessions/:id/events`, etc. The API prefix comes from `API_BASE_URL`. Relative HLS playlist URLs are resolved with `API_ORIGIN`.
- **Environment**: `src/environments/environment.ts` is generated by `npm run env:sync` from `.env` (defaults match `.env.example`). Production builds use `environment.prod.ts`.
- **Dev proxy**: `ng serve` loads `proxy.conf.cjs`: `/api/**` is forwarded to `SG_DEV_PROXY_TARGET` from `.env`.

The REST contract is summarized in `docs/doc_v1.json` (OpenAPI).

## Prerequisites

- A Node.js version compatible with Angular 21 (see Angular CLI docs).
- npm (see `packageManager` in `package.json`).

## Local setup

1. Copy `.env.example` to `.env` and adjust variables (`SG_API_BASE_PATH`, `SG_API_FALLBACK_ORIGIN`, `SG_INTERACTIVE_PREROLL_MS`, and for local dev `SG_DEV_PROXY_TARGET`).
2. Install dependencies: `npm install` or `make install`.
3. Generate `environment.ts`: `npm run env:sync` or `make env-sync` (also runs automatically before `start` / `build` via npm `prestart` / `prebuild`).

## Running and building

| Task | Command |
|------|---------|
| Dev server with proxy | `npm start` or `make start` |
| Production build | `npm run build` or `make build` |
| Development build | `make build-dev` |
| Unit tests | `npm test` |
| Lint | `npm run lint` |
| Clean artifacts | `make clean` |

After `npm start`, open the URL printed by the CLI (typically `http://localhost:4200/`).

## CI

Gitea Actions workflow: `.gitea/workflows/ci.yml` — lint, tests with `--watch=false`, production build. Actions must be enabled and a runner must be available.

## Repository layout

- `src/app/core` — API client, HTTP, models, notifications, keyboard/mouse telemetry parsing and SVG highlighting.
- `src/app/features/sessions` — session list, detail page and tabs, HLS player, stream selector, telemetry event drill-down.
- `src/environments` — environment configuration.
- `public` — static assets (fonts, SVG overlays, favicon).
- `scripts` — helpers such as `sync-env.cjs`.
