Skip to content

Architecture

Роман Зопиров edited this page Oct 29, 2026 · 2 revisions

Архитектура и устройство движка

OctoPublisher спроектирован как высокопроизводительное модульное решение на .NET 10 с нулевыми внешними нативными зависимостями и строгим разделением ответственности.


Структура модулей решения

graph TD
    CLI["OctoPublisher.Cli (octopublish)\n• Парсер командной строки\n• Предполётный линтер (MetadataLinter)\n• Сборщик шаблонов (PackagingScaffolder)\n• Инспектор локалей (PackagingInspector)"]
    
    subgraph Core ["Базовый уровень"]
        Common["Octo.Common\n• AnsiTerminal (Fluent ANSI вывод)\n• ImageTemplateGenerator (Генератор PNG без зависимостей)\n• LocaleRegistry (Нормализатор локалей и лимиты сторов)\n• PublisherResult (Строгие контракты ответов)"]
    end
    
    subgraph Modules ["Провайдеры магазинов"]
        PlayStore["Octo.PlayStore\n• GoogleAuthService (JWT PKCS#8)\n• PlayStoreClient (REST API v3, Safe-Merge)\n• PlayStoreListingManager (Многоязычные ассеты)"]
        MStore["Octo.MStore\n• MStoreTokenService (Azure AD OAuth2)\n• AzureBlobUploader (Блочная загрузка в Azure Blob)\n• MStoreClient (Dev Center Ingestion API)\n• MStoreListingManager (Парсер метаданных)"]
    end
    
    CLI --> Common
    CLI --> PlayStore
    CLI --> MStore
    PlayStore --> Common
    MStore --> Common
Loading

Ключевые инженерные решения

  1. Генератор растровой графики без зависимостей (ImageTemplateGenerator):

    • Формирует корректные файлы PNG со стандартизированным заголовком IHDR, потоком данных IDAT через сжатие System.IO.Compression.ZLibStream и контрольной суммой CRC32.
    • Читает размеры PNG и JPEG файлов непосредственно по сигнатурам заголовков без накладных расходов на полное декодирование растра.
    • Полностью независим от нативных библиотек (System.Drawing, SkiaSharp, ImageSharp).
  2. Защита Safe-Merge (Octo.PlayStore):

    • Предотвращает стирание названия приложения при отправке частичных обновлений карточки через Google Play Developer API.
    • Автоматически считывает активное название через GET и подставляет его в тело запроса.
  3. Блочная передача пакетов в Azure Blob (Octo.MStore):

    • Реализует параллельную передачу чанков пакетов .msix по SAS-ссылке Partner Center.
    • Автоматически оборачивает .msix во временный контейнер .zip.
    • Рассчитывает среднюю скорость загрузки и отрисовывает прогресс-бар в терминале.
  4. Клиент открытого каталога Microsoft Store (MStoreCatalogClient):

    • Позволяет выгружать метаданные и графику без предварительной авторизации через Display Catalog API (displaycatalog.mp.microsoft.com).
    • Автоматически находит и скачивает официальные логотипы, супергеройские баннеры (SuperHeroArt 1920x1080) и скриншоты в высоком разрешении.
  5. Тестовое покрытие:

    • 114 модульных и интеграционных тестов (OctoPublisher.Tests) с 100% успешным прохождением.
    • Покрыты парсер аргументов, валидатор линтера, чтение заголовков изображений, генерация PNG, инспекция таблиц, токенизация JWT, обратный импорт (pull) и жизненный цикл деплоя.

Clone this wiki locally