Files
live-hub-py/web/backend/services/yyb_worker_client.py
T

83 lines
2.7 KiB
Python

"""应用宝 Worker HTTP 客户端。"""
from __future__ import annotations
import os
from typing import Any
import requests
class YybWorkerError(RuntimeError):
"""Worker 返回业务错误。"""
class YybWorkerClient:
def __init__(self) -> None:
self.base_url = os.getenv("YYB_WORKER_URL", "http://127.0.0.1:8810").rstrip("/")
self.key = os.getenv("YYB_WORKER_KEY", "")
self.timeout = float(os.getenv("YYB_WORKER_TIMEOUT", "30"))
def _request(
self, method: str, path: str, payload: dict[str, Any] | None = None
) -> dict[str, Any]:
headers = {"Accept": "application/json"}
if self.key:
headers["Authorization"] = f"Bearer {self.key}"
try:
response = requests.request(
method,
self.base_url + path,
json=payload,
headers=headers,
timeout=self.timeout,
)
data = response.json()
except (requests.RequestException, ValueError) as exc:
raise YybWorkerError(f"应用宝 Worker 不可用: {exc}") from exc
if response.status_code >= 400:
raise YybWorkerError(str(data.get("detail", "Worker 请求失败")))
return data
def create_job(self) -> dict[str, Any]:
return self._request("POST", "/v1/jobs")
def login(
self, worker_job_id: str, provider: str, timeout: int = 600
) -> dict[str, Any]:
return self._request(
"POST",
f"/v1/jobs/{worker_job_id}/login",
{"provider": provider, "timeout": timeout},
)
def get_job(self, worker_job_id: str) -> dict[str, Any]:
return self._request("GET", f"/v1/jobs/{worker_job_id}")
def selection_options(
self,
worker_job_id: str,
platform: str,
points: int | None = None,
zone_id: str | None = None,
) -> dict[str, Any]:
return self._request(
"POST",
f"/v1/jobs/{worker_job_id}/selection-options",
{"platform": platform, "points": points, "zone_id": zone_id},
)
def selection(
self, worker_job_id: str, selection: dict[str, Any]
) -> dict[str, Any]:
return self._request("POST", f"/v1/jobs/{worker_job_id}/selection", selection)
def payment(self, worker_job_id: str) -> dict[str, Any]:
return self._request("POST", f"/v1/jobs/{worker_job_id}/payment")
def payment_check(self, worker_job_id: str) -> dict[str, Any]:
return self._request("POST", f"/v1/jobs/{worker_job_id}/payment/check")
def stop(self, worker_job_id: str) -> dict[str, Any]:
return self._request("POST", f"/v1/jobs/{worker_job_id}/stop")