fix(plugin): serialize dynamic route projection (#6441)

This commit is contained in:
InfinityPacer
2026-08-25 06:40:43 +08:00
committed by GitHub
parent 880a1064e2
commit adbeff95d0
9 changed files with 365 additions and 4 deletions
+26 -1
View File
@@ -71,6 +71,7 @@ LegacyPluginImportPreparer = Callable[..., None]
PluginInstallReporter = Callable[..., None]
SiteAuthLevelProvider = Callable[[], int]
PluginCatalogFactory = Callable[["PluginManager"], Any]
PluginRouteRefresher = Callable[[str], None]
def _ignore_legacy_diagnostics(**_kwargs) -> None:
@@ -109,6 +110,11 @@ def _warn_if_plugin_enabled_gil(
)
def _unavailable_plugin_route_refresher(_plugin_id: str) -> None:
"""在 HTTP 组合尚未装配时拒绝发布不完整的热重载投影。"""
raise RuntimeError("插件动态路由刷新器尚未由启动组合根装配")
_legacy_diagnostics_configurator: LegacyDiagnosticsConfigurator = (
_ignore_legacy_diagnostics
)
@@ -119,6 +125,7 @@ _legacy_plugin_import_preparer: LegacyPluginImportPreparer = (
_plugin_install_reporter: PluginInstallReporter = _ignore_legacy_diagnostics
_site_auth_level_provider: SiteAuthLevelProvider = _unavailable_site_auth_level
_plugin_catalog_factory: PluginCatalogFactory = _unavailable_plugin_catalog_factory
_plugin_route_refresher: PluginRouteRefresher = _unavailable_plugin_route_refresher
def configure_plugin_legacy_import_services(
@@ -158,6 +165,12 @@ def configure_plugin_catalog_factory(factory: PluginCatalogFactory) -> None:
_plugin_catalog_factory = factory
def configure_plugin_route_refresher(refresher: PluginRouteRefresher) -> None:
"""由启动组合根注入热重载后的动态路由投影刷新器。"""
global _plugin_route_refresher
_plugin_route_refresher = refresher
@observe_compat_facade("PluginManager")
class PluginManager(ConfigReloadMixin, metaclass=Singleton):
"""插件管理器"""
@@ -656,7 +669,7 @@ class PluginManager(ConfigReloadMixin, metaclass=Singleton):
monitor_suppressed=self.is_plugin_monitor_suppressed,
local_candidate=self._get_local_plugin_candidate_from_path,
sync_local=self._sync_local_plugin_if_installed,
reload_plugin=self.reload_plugin_tree,
reload_plugin=self._reload_plugin_tree_from_monitor,
dependency_manifest_status=(
get_plugin_system().dependency_manifest_status
),
@@ -664,6 +677,18 @@ class PluginManager(ConfigReloadMixin, metaclass=Singleton):
log=logger,
).run()
def _reload_plugin_tree_from_monitor(
self,
plugin_id: str,
) -> PluginRuntimeStatus:
"""重载源码树,并发布源插件及虚拟实例的动态路由投影。"""
with self.mutation("热重载插件路由"):
status = self.reload_plugin_tree(plugin_id)
reload_targets = self.get_plugin_reload_targets(plugin_id)
for reload_target in reload_targets:
_plugin_route_refresher(reload_target)
return status
def _get_federated_plugin_change(
self,
event_path: Path,