urmi-ai/backend/app/voice/session_store.py
2026-10-02 11:22:40 +05:30

50 lines
1.4 KiB
Python

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))