44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import threading
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
|
|
class SessionStore:
|
|
def __init__(self, base_dir: Path) -> None:
|
|
self.base_dir = base_dir
|
|
self.base_dir.mkdir(parents=True, exist_ok=True)
|
|
self._lock = threading.Lock()
|
|
|
|
def _path(self, session_id: str) -> Path:
|
|
return self.base_dir / f"{session_id}.json"
|
|
|
|
def load(self, session_id: str) -> dict[str, Any]:
|
|
path = self._path(session_id)
|
|
if not path.exists():
|
|
return {"session_id": session_id, "messages": []}
|
|
return json.loads(path.read_text(encoding="utf-8"))
|
|
|
|
def save(self, session_id: str, payload: dict[str, Any]) -> None:
|
|
with self._lock:
|
|
self._path(session_id).write_text(
|
|
json.dumps(payload, ensure_ascii=False, indent=2),
|
|
encoding="utf-8",
|
|
)
|
|
|
|
def append_message(self, session_id: str, message: dict[str, Any]) -> dict[str, Any]:
|
|
with self._lock:
|
|
payload = self.load(session_id)
|
|
payload.setdefault("messages", []).append(message)
|
|
self.save(session_id, payload)
|
|
return payload
|
|
|
|
def clear(self, session_id: str) -> None:
|
|
with self._lock:
|
|
path = self._path(session_id)
|
|
if path.exists():
|
|
path.unlink()
|
|
|