プラグインライフサイクル
プラグインは定義されたライフサイクルを進みます: インストール、同意、有効化、アクティブ、そして最後にティアダウンです。すべての遷移はホストによって強制されます。
インストール
インストールはプラグインマネージャーを通じて行われます。境界のある .stplugin ZIP アーカイブか、公開リポジトリリンク(github.com または gitlab.com、HTTPS のみ)をインストールできます。ホストは git バイナリを決して呼び出しません。リポジトリアーカイブをダウンロードし、ZIP とまったく同じ検証にかけます: パストラバーサル、シンボリックリンク、実行可能ペイロード、サイズ、マニフェストフィールド、エントリポイント、権限です。インストールはアトミックで、エラーがあればロールバックされます。
パッケージが依存関係付きの package.json を同梱する場合、組み込みリゾルバーがインストールスクリプトを実行せずに npm レジストリから依存関係を取得します。可能な場合は依存関係をバンドルしてください。リゾルバーは、バンドルが現実的でない重い WASM ライブラリのために存在します。
同意
検証後、プラグインは needs-consent 状態に入ります。ユーザーが要求されたすべての権限を確認する(npm 依存関係の一覧がある場合はそれを確認する)までその状態が続きます。このフェーズではエントリポイントは実行されません。完全なモデルは権限 を参照してください。
有効化
有効化は 2 フェーズの操作です:
- バックエンドとレガシーの登録が最初に開始されます。
- フロントエンドエントリが読み込まれ、その API を受け取ります。
有効化が途中で失敗した場合、ホストは部分的な登録をロールバックし、読み込み失敗を記録します。失敗した有効化が半分登録されたサーフェスを残すことはありません。
アクティブランタイム
アクティブな間、プラグインが行うすべての登録 — UI サーフェス、ルート、イベント購読、i18n リソース、通知、プロバイダー、トークナイザー、コンテキスト戦略、後処理 — はランタイムによって収集されます。プラグインは deactivate() で自身のリソースを管理することもできます。
ティアダウン
無効化、セーフモード、削除、クラッシュ、アプリケーションのシャットダウンはすべて、ホストが強制するクリーンアップをトリガーします。ランタイムは収集された登録を逆順で破棄し、保証は厳格です: プラグインが無効化された後、何も残りません。
- イベントハンドラーやサブスクリプションはありません。
- タイマーはありません。
- DOM ノードはありません。
- マウントされたルートはありません。
- バックグラウンドリクエストはありません。
- 登録されたプロバイダー、トークナイザー、戦略はありません。
プラグイン自身の deactivate() がエラーを投げても、必要なクリーンアップはキャンセルされません — ホストは追跡するすべてを破棄します。ティアダウンは冪等です: 2 回呼び出しても効果はありません。
アップデート
アップデートはパッケージをアトミックに置き換え、現在の有効化状態を保持します。1 つの例外を除きます: 新しいマニフェストが権限を追加する場合、ランタイムは即座に無効化され、ユーザーが新しい権限に同意するまで無効のままです。以前のバージョンへのロールバックは、そのバージョンを再度インストールすることで行われます。プラグインストレージのユーザーデータは両方向で生き残ります。
クラッシュ処理
バックエンドプラグインは自身のプロセスで実行されます。そのプロセスがクラッシュした場合、ホストはそのプラグインのすべての登録を削除し、失敗を報告します。クラッシュしたプラグインが孤児のルートやイベント購読を残すことはありません。それらはプロセスではなくホストが所有するためです。
これらの保証を可能にするセキュリティモデルについてはサンドボックス化 を、ライフサイクルを駆動するマニフェストフィールドについてはマニフェスト を参照してください。