Перейти к основному содержимому

Жизненный цикл плагина

Плагин проходит определённый жизненный цикл: установка, согласие, активация, активное состояние и, наконец, разбор. Каждый переход обеспечивается хостом.

Установка

Установка выполняется через менеджер плагинов. Вы можете установить ограниченный ZIP-архив .stplugin или ссылку на публичный репозиторий (github.com или gitlab.com, только HTTPS). Хост никогда не вызывает бинарник git; он скачивает архив репозитория и прогоняет его через ровно ту же проверку, что и ZIP: traversal-пути, симлинки, исполняемые нагрузки, размеры, поля манифеста, точки входа и разрешения. Установка атомарна и откатывается при любой ошибке.

Если пакет поставляет package.json с зависимостями, встроенный резолвер забирает их из npm-реестра без выполнения скриптов установки. По возможности включайте зависимости в пакет; резолвер существует для тяжёлых WASM-библиотек, которые невозможно разумно включить.

Согласие

После проверки плагин входит в состояние needs-consent. Он остаётся в нём, пока пользователь не подтвердит каждое запрошенное разрешение (и не просмотрит список npm-зависимостей, если он есть). Ни одна точка входа не выполняется в этой фазе. Полную модель см. в Разрешения.

Активация

Активация — двухфазная операция:

  1. Сначала запускаются backend- и устаревшие регистрации.
  2. Затем загружается frontend-точка входа и получает свой API.

Если активация падает на полпути, хост откатывает частичные регистрации и фиксирует ошибку загрузки. Неудачная активация никогда не оставляет наполовину зарегистрированные поверхности.

Активный рантайм

Пока плагин активен, каждая его регистрация — поверхности UI, маршруты, подписки на события, ресурсы i18n, уведомления, провайдеры, токенизаторы, стратегии контекста и пост-процессоры — собирается рантаймом. Плагин также может управлять собственными ресурсами в deactivate().

Разбор

Отключение, безопасный режим, удаление, сбой или завершение приложения — всё это запускает обеспечиваемую хостом очистку. Рантайм разбирает собранные регистрации в обратном порядке, и гарантии строгие: после отключения плагина не остаётся ничего.

  • Никаких обработчиков событий или подписок.
  • Никаких таймеров.
  • Никаких узлов DOM.
  • Никаких смонтированных маршрутов.
  • Никаких фоновых запросов.
  • Никаких зарегистрированных провайдеров, токенизаторов или стратегий.

Ошибка, брошенная собственным deactivate() плагина, не отменяет обязательную очистку — хост всё равно разбирает всё, что отслеживает. Разбор идемпотентен: повторный вызов не имеет эффекта.

Обновление

Обновление атомарно заменяет пакет и сохраняет текущее состояние активации, с одним исключением: если новый манифест добавляет разрешения, рантайм немедленно отключается и остаётся отключённым, пока пользователь не даст согласие на новые разрешения. Откат к предыдущей версии выполняется повторной установкой этой версии; пользовательские данные в хранилище плагина переживают оба направления.

Обработка сбоев

Backend-плагин выполняется в собственном процессе. Если этот процесс падает, хост удаляет все регистрации плагина и сообщает о сбое. Упавший плагин не может оставить осиротевшие маршруты или подписки на события, потому что они принадлежат хосту, а не процессу.

О модели безопасности, делающей эти гарантии возможными, см. Песочница. О полях манифеста, управляющих жизненным циклом, см. Манифест.