mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 07:27:15 +08:00
refactor: unify message ingress forwarding
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
"""消息渠道回环进入宿主消息 API 的统一适配边界。"""
|
||||
|
||||
from collections.abc import Callable, Mapping
|
||||
from typing import Any
|
||||
from urllib.parse import urlencode
|
||||
|
||||
from app.adapters.network.http import AsyncRequestUtils, RequestUtils
|
||||
from app.runtime.log import logger
|
||||
from app.runtime.settings import RuntimeSettingsCompat
|
||||
|
||||
settings = RuntimeSettingsCompat()
|
||||
|
||||
BackgroundSubmitter = Callable[..., object]
|
||||
|
||||
|
||||
def build_message_ingress_url(source: str | None) -> str:
|
||||
"""按当前运行配置构造安全编码的本地消息入口 URL。"""
|
||||
query = {"token": settings.API_TOKEN}
|
||||
if source:
|
||||
query["source"] = source
|
||||
return f"http://127.0.0.1:{settings.PORT}/api/v1/message?{urlencode(query)}"
|
||||
|
||||
|
||||
def forward_message_to_host(
|
||||
payload: Mapping[str, Any],
|
||||
source: str | None,
|
||||
*,
|
||||
timeout: float = 15,
|
||||
) -> bool:
|
||||
"""同步转发渠道 payload,统一判断本地入口是否确认接收。"""
|
||||
response = None
|
||||
try:
|
||||
response = RequestUtils(timeout=timeout).post_res(
|
||||
build_message_ingress_url(source),
|
||||
json=dict(payload),
|
||||
)
|
||||
if response is None:
|
||||
logger.error(f"转发渠道消息到本地入口失败:source={source or '-'} - 无响应")
|
||||
return False
|
||||
if response.status_code >= 400:
|
||||
logger.error(
|
||||
"转发渠道消息到本地入口失败:"
|
||||
f"source={source or '-'} - HTTP {response.status_code}"
|
||||
)
|
||||
return False
|
||||
return True
|
||||
except Exception as error:
|
||||
logger.error(f"转发渠道消息到本地入口失败:source={source or '-'} - {error}")
|
||||
return False
|
||||
finally:
|
||||
close = getattr(response, "close", None)
|
||||
if callable(close):
|
||||
try:
|
||||
close()
|
||||
except Exception as error:
|
||||
logger.debug(
|
||||
f"释放本地消息入口响应失败:source={source or '-'} - {error}"
|
||||
)
|
||||
|
||||
|
||||
async def async_forward_message_to_host(
|
||||
payload: Mapping[str, Any],
|
||||
source: str | None,
|
||||
*,
|
||||
timeout: float = 15,
|
||||
) -> bool:
|
||||
"""异步转发渠道 payload,供自有事件循环的消息 SDK 复用同一确认语义。"""
|
||||
response = None
|
||||
try:
|
||||
response = await AsyncRequestUtils(timeout=timeout).post_res(
|
||||
build_message_ingress_url(source),
|
||||
json=dict(payload),
|
||||
)
|
||||
if response is None:
|
||||
logger.error(f"转发渠道消息到本地入口失败:source={source or '-'} - 无响应")
|
||||
return False
|
||||
if response.status_code >= 400:
|
||||
logger.error(
|
||||
"转发渠道消息到本地入口失败:"
|
||||
f"source={source or '-'} - HTTP {response.status_code}"
|
||||
)
|
||||
return False
|
||||
return True
|
||||
except Exception as error:
|
||||
logger.error(f"转发渠道消息到本地入口失败:source={source or '-'} - {error}")
|
||||
return False
|
||||
finally:
|
||||
if response is not None:
|
||||
try:
|
||||
await response.aclose()
|
||||
except Exception as error:
|
||||
logger.debug(
|
||||
f"释放本地消息入口响应失败:source={source or '-'} - {error}"
|
||||
)
|
||||
|
||||
|
||||
def submit_message_to_host(
|
||||
payload: Mapping[str, Any],
|
||||
source: str | None,
|
||||
*,
|
||||
submit: BackgroundSubmitter,
|
||||
timeout: float = 15,
|
||||
) -> bool:
|
||||
"""把同步回环转发提交给调用方注入的受管后台执行器。"""
|
||||
try:
|
||||
submit(
|
||||
forward_message_to_host,
|
||||
dict(payload),
|
||||
source,
|
||||
timeout=timeout,
|
||||
)
|
||||
except Exception as error:
|
||||
logger.error(f"提交渠道消息转发任务失败:source={source or '-'} - {error}")
|
||||
return False
|
||||
return True
|
||||
Reference in New Issue
Block a user