Жизненный цикл плагина
Плагин проходит определённый жизненный цикл: установка, согласие, активация, активное состояние и, наконец, разбор. Каждый переход обеспечивается хостом.
Установка
Установка выполняется через менеджер плагинов. Вы можете установить
ограниченный ZIP-архив .stplugin или ссылку на публичный репозиторий
(github.com или gitlab.com, только HTTPS). Хост никогда не вызывает
бинарник git; он скачивает архив репозитория и прогоняет его через ровно ту
же проверку, что и ZIP: traversal-пути, симлинки, исполняемые нагрузки,
размеры, поля манифеста, точки входа и разрешения. Установка атомарна и
откатывается при любой ошибке.
Если пакет поставляет package.json с зависимостями, встроенный резолвер
забирает их из npm-реестра без выполнения скриптов установки. По возможности
включайте зависимости в пакет; резолвер существует для тяжёлых WASM-библиотек,
которые невозможно разумно включить.
Согласие
После проверки плагин входит в состояние needs-consent. Он остаётся в нём,
пока пользователь не подтвердит каждое запрошенное разрешение (и не
просмотрит список npm-зависимостей, если он есть). Ни одна точка входа не
выполняется в этой фазе. Полную модель см. в Разрешения.
Активация
Активация — двухфазная операция:
- Сначала запускаются backend- и устаревшие регистрации.
- Затем загружается frontend-точка входа и получает свой API.
Если активация падает на полпути, хост откатывает частичные регистрации и фиксирует ошибку загрузки. Неудачная активация никогда не оставляет наполовину зарегистрированные поверхности.
Активный рантайм
Пока плагин активен, каждая его регистрация — поверхности UI, маршруты,
подписки на события, ресурсы i18n, уведомления, провайдеры, токенизаторы,
стратегии контекста и пост-процессоры — собирается рантаймом. Плагин также
может управлять собственными ресурсами в deactivate().
Разбор
Отключение, безопасный режим, удаление, сбой или завершение приложения — всё это запускает обеспечиваемую хостом очистку. Рантайм разбирает собранные регистрации в обратном порядке, и гарантии строгие: после отключения плагина не остаётся ничего.
- Никаких обработчиков событий или подписок.
- Никаких таймеров.
- Никаких узлов DOM.
- Никаких смонтированных маршрутов.
- Никаких фоновых запросов.
- Никаких зарегистрированных провайдеров, токенизаторов или стратегий.
Ошибка, брошенная собственным deactivate() плагина, не отменяет
обязательную очистку — хост всё равно разбирает всё, что отслеживает. Разбор
идемпотентен: повторный вызов не имеет эффекта.
Обновление
Обновление атомарно заменяет пакет и сохраняет текущее состояние активации, с одним исключением: если новый манифест добавляет разрешения, рантайм немедленно отключается и остаётся отключённым, пока пользователь не даст согласие на новые разрешения. Откат к предыдущей версии выполняется повторной установкой этой версии; пользовательские данные в хранилище плагина переживают оба направления.
Обработка сбоев
Backend-плагин выполняется в собственном процессе. Если этот процесс падает, хост удаляет все регистрации плагина и сообщает о сбое. Упавший плагин не может оставить осиротевшие маршруты или подписки на события, потому что они принадлежат хосту, а не процессу.
О модели безопасности, делающей эти гарантии возможными, см. Песочница. О полях манифеста, управляющих жизненным циклом, см. Манифест.