mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-10-29 03:18:14 +08:00
98 lines
2.9 KiB
Python
98 lines
2.9 KiB
Python
"""
|
||
托管资源 Runtime 与站点资源安装的宿主组合根。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import threading
|
||
from collections.abc import Callable
|
||
from typing import Optional
|
||
|
||
from app.adapters.system.resource import (
|
||
configure_resource_version_provider,
|
||
reset_resource_version_provider,
|
||
)
|
||
from app.runtime.capabilities.runtime import CapabilityRuntime
|
||
from app.runtime.extensions.resource import (
|
||
AsyncManagedResourceAdapter,
|
||
SyncManagedResourceAdapter,
|
||
build_managed_resource_registry,
|
||
)
|
||
from app.runtime.resources import (
|
||
MANAGED_RESOURCE_ASYNC_KIND,
|
||
MANAGED_RESOURCE_SYNC_KIND,
|
||
configure_managed_resource_runtime,
|
||
reset_managed_resource_runtime,
|
||
)
|
||
|
||
_runtime_lock = threading.RLock()
|
||
_managed_resource_runtime: Optional[CapabilityRuntime] = None
|
||
|
||
|
||
def configure_managed_resource_composition() -> CapabilityRuntime:
|
||
"""
|
||
构建并注入资源 Runtime;只发现声明,不提前启动具体资源。
|
||
"""
|
||
global _managed_resource_runtime
|
||
with _runtime_lock:
|
||
if _managed_resource_runtime is None:
|
||
_managed_resource_runtime = CapabilityRuntime(
|
||
build_managed_resource_registry(),
|
||
adapters={
|
||
MANAGED_RESOURCE_SYNC_KIND: SyncManagedResourceAdapter(),
|
||
MANAGED_RESOURCE_ASYNC_KIND: AsyncManagedResourceAdapter(),
|
||
},
|
||
)
|
||
configure_managed_resource_runtime(_managed_resource_runtime)
|
||
return _managed_resource_runtime
|
||
|
||
|
||
async def stop_managed_resource_composition() -> bool:
|
||
"""
|
||
关闭已初始化的资源 Runtime,并返回 owner 是否收敛。
|
||
"""
|
||
with _runtime_lock:
|
||
runtime = _managed_resource_runtime
|
||
if runtime is None:
|
||
return True
|
||
return await runtime.shutdown_async(reason="application_shutdown")
|
||
|
||
|
||
def reset_managed_resource_composition() -> None:
|
||
"""
|
||
释放已关闭的具体 Runtime 及其门面引用。
|
||
"""
|
||
global _managed_resource_runtime
|
||
with _runtime_lock:
|
||
runtime = _managed_resource_runtime
|
||
if runtime is not None and not runtime.is_shutdown:
|
||
raise RuntimeError("Managed Resource Runtime 尚未关闭,不能释放 owner")
|
||
reset_managed_resource_runtime()
|
||
_managed_resource_runtime = None
|
||
|
||
|
||
def configure_site_resource_versions(
|
||
version_provider: Callable[[], tuple[str, str]],
|
||
) -> None:
|
||
"""
|
||
装配运行期资源版本读取器,不在应用启动后下载或替换资源。
|
||
"""
|
||
configure_resource_version_provider(version_provider)
|
||
|
||
|
||
def install_site_resources(
|
||
version_provider: Callable[[], tuple[str, str]],
|
||
) -> bool:
|
||
"""
|
||
兼容旧调用方,仅装配版本读取器并禁止启动阶段直接安装资源。
|
||
"""
|
||
configure_site_resource_versions(version_provider)
|
||
return False
|
||
|
||
|
||
def reset_site_resource_composition() -> None:
|
||
"""
|
||
撤销当前 lifespan 的资源版本读取器。
|
||
"""
|
||
reset_resource_version_provider()
|