ForcePilot/backend/package/yuxi/channel/sdk/dependencies.py
Kris b438af3ba8 feat(channel-sdk): 新增完整的渠道SDK工具链
本提交新增了全渠道SDK核心模块:
1.  异步锁、目标解析、动作调度等基础工具
2.  消息动作注册与统一调度系统
3.  测试套件与契约测试框架
4.  完整的目标解析流水线与工具函数
5.  资源依赖注入与生命周期管理
2026-05-21 10:29:12 +08:00

55 lines
1.6 KiB
Python

import asyncio
import contextvars
import logging
from dataclasses import dataclass, field
from typing import Any
_logger = logging.getLogger(__name__)
@dataclass
class PluginResourceProvider:
http_client: Any | None = None
db_session_factory: Any | None = None
redis_client: Any | None = None
config_provider: Any | None = None
metadata: dict[str, Any] = field(default_factory=dict)
async def cleanup(self) -> None:
for attr_name in ("http_client", "redis_client"):
resource = getattr(self, attr_name, None)
if resource is None:
continue
close_fn = getattr(resource, "close", None) or getattr(resource, "aclose", None)
if close_fn is None:
continue
try:
result = close_fn()
if asyncio.iscoroutine(result):
await result
_logger.debug("PluginResourceProvider: closed %s", attr_name)
except Exception:
_logger.warning("PluginResourceProvider: failed to close %s", attr_name)
self.http_client = None
self.db_session_factory = None
self.redis_client = None
self.config_provider = None
self.metadata.clear()
_resources_ctx: contextvars.ContextVar[PluginResourceProvider] = contextvars.ContextVar(
"plugin_resources", default=PluginResourceProvider()
)
def inject_resources(provider: PluginResourceProvider) -> None:
_resources_ctx.set(provider)
def get_resources() -> PluginResourceProvider:
return _resources_ctx.get()
def reset_resources() -> None:
_resources_ctx.set(PluginResourceProvider())