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).
Локальная настройка
- Скопируйте
.env.exampleв.envи при необходимости измените переменные (SG_API_BASE_PATH,SG_API_FALLBACK_ORIGIN,SG_INTERACTIVE_PREROLL_MS, для dev —SG_DEV_PROXY_TARGET). - Установите зависимости:
npm installилиmake install. - Сгенерируйте
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_typeentries 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:
SessionsApiServicecalls/sessions,/sessions/:id/events, etc. The API prefix comes fromAPI_BASE_URL. Relative HLS playlist URLs are resolved withAPI_ORIGIN. - Environment:
src/environments/environment.tsis generated bynpm run env:syncfrom.env(defaults match.env.example). Production builds useenvironment.prod.ts. - Dev proxy:
ng serveloadsproxy.conf.cjs:/api/**is forwarded toSG_DEV_PROXY_TARGETfrom.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
packageManagerinpackage.json).
Local setup
- Copy
.env.exampleto.envand adjust variables (SG_API_BASE_PATH,SG_API_FALLBACK_ORIGIN,SG_INTERACTIVE_PREROLL_MS, and for local devSG_DEV_PROXY_TARGET). - Install dependencies:
npm installormake install. - Generate
environment.ts:npm run env:syncormake env-sync(also runs automatically beforestart/buildvia npmprestart/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 assync-env.cjs.