SDK
Тонкие помощники интегратора; публичные примеры — в SDK. Версия пакетов 0.3.0. Публикация в реестры — отдельное действие.
| Путь | Назначение |
|---|---|
sdk/js/playflow.js | Браузерные mount, progress и destroy; alias RetentionPlay, VERSION |
sdk/php/PlayFlow.php | Серверные SessionTokens::issue и Webhook::verify |
sdk/python/playflow.py | Серверные issue_session_token и verify_webhook |
JS SDK не выдаёт токены: оставлен бросающий ошибку migration shim issueSessionToken() с указанием серверной замены. Параметр apiKey отклоняется до сети. PHP/Python запрашивают подписанный токен у платформы ключом проекта со scope session:issue; локальное подписание клиентским секретом не поддерживается.
Жизненный цикл
Каждый экземпляр удерживает собственный script и wrapper. Повторный mount ничего не дублирует. Destroy отменяет собственный progress-fetch и запросы loader, удаляет listeners, iframe и script, очищает ссылку на токен, сохраняя контейнер и соседний DOM. Уничтожение до загрузки script тоже окончательно: поздний loader проверяет маркер. Для нового mount нужен новый экземпляр. Контракт focus/handshake — в widget.
Progress использует Authorization и отклоняет HTTP-ошибки. Идентифицированный токен обновляет backend интегратора; после destroy/remount та же личность продолжает серверную партию. Автоматический refresh loader относится к анонимной сессии, а не к переданному токену.
Сборка и подпись
games/scripts/build-sdk.mjs минифицирует установленным Rolldown/Oxc без новой runtime-зависимости. Docker копирует минифицированный loader на штатный путь. Версионированные хэшированные файлы и gzip/Brotli идут через существующий asset-маршрут; стабильный /v1/widget.js требует revalidation и поддерживает ETag/304. Политика обновлений — versioning.
Webhook подписан HMAC-SHA256 по timestamp.raw_body; версия передана в v=. Оба заголовка Signature содержат одинаковую подпись. Секрет проекта выводится из WEBHOOK_SIGNING_MASTER_KEY, раскрывается владельцу отдельно и меняется при rotate. Каждая отправка заново читает текущую версию; receiver проверяет 300-секундный skew и сохраняет идемпотентность выдачи. Подробности — webhooks.