from __future__ import annotations
from dataclasses import dataclass
from enum import Enum
from typing import Any
import uuid
from .config import Config, ServerConfig
class ServerStatus(Enum):
CONNECTING = "connecting"
CONNECTED = "connected"
DISCONNECTED = "disconnected"
ERROR = "error"
@dataclass
class ServerInfo:
id: str
name: str
url: str
status: ServerStatus
class Gateway:
def __init__(self, config: Config | None = None) -> None:
self.config = config or Config()
self._servers: dict[str, tuple[ServerConfig, ServerStatus]] = {}
async def add_server(self, name: str, url: str, config: ServerConfig) -> str:
server_id = str(uuid.uuid4())[:8]
self._servers[server_id] = (config, ServerStatus.CONNECTING)
self._servers[server_id] = (config, ServerStatus.CONNECTED)
return server_id
def remove_server(self, server_id: str) -> None:
self._servers.pop(server_id, None)
def list_servers(self) -> list[ServerInfo]:
return [
ServerInfo(
id=sid,
name=cfg.name,
url=cfg.url,
status=status,
)
for sid, (cfg, status) in self._servers.items()
]
async def run(self) -> None:
addr = f"{self.config.listen}:{self.config.port}"
print(f"ZAP gateway listening on {addr}")
for server_config in self.config.servers:
await self.add_server(
server_config.name,
server_config.url,
server_config,
)
import asyncio
await asyncio.Event().wait()