| """Control-plane proxy domain models.""" |
|
|
| from enum import IntEnum, StrEnum |
| from typing import Self |
|
|
| from pydantic import BaseModel |
|
|
|
|
| class ProxyScope(StrEnum): |
| APP = "app" |
| ASSET = "asset" |
|
|
|
|
| class RequestKind(StrEnum): |
| HTTP = "http" |
| WEBSOCKET = "websocket" |
| GRPC = "grpc" |
|
|
|
|
| class EgressMode(StrEnum): |
| DIRECT = "direct" |
| SINGLE_PROXY = "single_proxy" |
| PROXY_POOL = "proxy_pool" |
|
|
|
|
| class ClearanceMode(StrEnum): |
| NONE = "none" |
| MANUAL = "manual" |
| FLARESOLVERR = "flaresolverr" |
|
|
| @classmethod |
| def parse(cls, value: str | Self) -> Self: |
| if isinstance(value, cls): |
| return value |
| normalized = str(value or "").strip().lower() |
| if not normalized: |
| return cls.NONE |
| return cls(normalized) |
|
|
|
|
| class EgressNodeState(IntEnum): |
| HEALTHY = 0 |
| DEGRADED = 1 |
| UNHEALTHY = 2 |
|
|
|
|
| class ClearanceBundleState(IntEnum): |
| VALID = 0 |
| STALE = 1 |
| INVALID = 2 |
|
|
|
|
| class ProxyFeedbackKind(StrEnum): |
| SUCCESS = "success" |
| CHALLENGE = "challenge" |
| UNAUTHORIZED = "unauthorized" |
| FORBIDDEN = "forbidden" |
| RATE_LIMITED = "rate_limited" |
| UPSTREAM_5XX = "upstream_5xx" |
| TRANSPORT_ERROR = "transport_error" |
|
|
|
|
| class EgressNode(BaseModel): |
| node_id: str |
| proxy_url: str | None = None |
| scope: ProxyScope = ProxyScope.APP |
| state: EgressNodeState = EgressNodeState.HEALTHY |
| health: float = 1.0 |
| inflight: int = 0 |
| last_used: int | None = None |
|
|
|
|
| class ClearanceBundle(BaseModel): |
| bundle_id: str |
| cf_cookies: str = "" |
| user_agent: str = "" |
| state: ClearanceBundleState = ClearanceBundleState.VALID |
| affinity_key: str = "" |
| clearance_host: str = "grok.com" |
| last_refresh_at: int | None = None |
|
|
|
|
| class ProxyLease(BaseModel): |
| lease_id: str |
| proxy_url: str | None = None |
| cf_cookies: str = "" |
| user_agent: str = "" |
| clearance_host: str = "grok.com" |
| scope: ProxyScope = ProxyScope.APP |
| kind: RequestKind = RequestKind.HTTP |
| acquired_at: int = 0 |
|
|
| @property |
| def has_proxy(self) -> bool: |
| return bool(self.proxy_url) |
|
|
|
|
| class ProxyFeedback(BaseModel): |
| kind: ProxyFeedbackKind |
| status_code: int | None = None |
| reason: str = "" |
| retry_after_ms: int | None = None |
|
|
|
|
| __all__ = [ |
| "ProxyScope", "RequestKind", "EgressMode", "ClearanceMode", |
| "EgressNodeState", "ClearanceBundleState", "ProxyFeedbackKind", |
| "EgressNode", "ClearanceBundle", "ProxyLease", "ProxyFeedback", |
| ] |
|
|