import json from datetime import datetime, timezone from typing import Any import redis.asyncio as redis from ..config import settings _redis_client: redis.Redis | None = None def _session_key(session_token: str) -> str: return f"voice:session:{session_token}" async def get_redis() -> redis.Redis: global _redis_client if _redis_client is None: _redis_client = redis.from_url(settings.redis_url, decode_responses=True) return _redis_client async def save_session(session_token: str, data: dict[str, Any]) -> None: client = await get_redis() payload = dict(data) payload["session_token"] = session_token payload.setdefault("created_at", datetime.now(timezone.utc).isoformat()) await client.set(_session_key(session_token), json.dumps(payload), ex=settings.voice_session_ttl_seconds) async def get_session(session_token: str) -> dict[str, Any] | None: client = await get_redis() raw = await client.get(_session_key(session_token)) if not raw: return None return json.loads(raw) async def update_session(session_token: str, **fields: Any) -> dict[str, Any] | None: session = await get_session(session_token) if not session: return None session.update(fields) await save_session(session_token, session) return session async def delete_session(session_token: str) -> None: client = await get_redis() await client.delete(_session_key(session_token))