# 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`.