fester/backend/session/db.py

81 lines
1.9 KiB
Python

import time
import uuid
from collections import defaultdict
class SessionDB:
def __init__(self):
# session_id → full timeline
self.sessions = {}
# session_id → event log
self.events = defaultdict(list)
# session_id → snapshots (state checkpoints)
self.snapshots = defaultdict(list)
# -----------------------------
# CREATE SESSION
# -----------------------------
def create_session(self, project):
sid = str(uuid.uuid4())
self.sessions[sid] = {
"project": project,
"created_at": time.time(),
"status": "active"
}
return sid
# -----------------------------
# EVENT LOGGING (IMMUTABLE)
# -----------------------------
def log_event(self, session_id, event_type, payload):
event = {
"ts": time.time(),
"type": event_type,
"data": payload
}
self.events[session_id].append(event)
return event
# -----------------------------
# SNAPSHOT (STATE CHECKPOINT)
# -----------------------------
def snapshot(self, session_id, state):
snap = {
"ts": time.time(),
"state": state
}
self.snapshots[session_id].append(snap)
return snap
# -----------------------------
# GET FULL TIMELINE
# -----------------------------
def get_session(self, session_id):
return {
"session": self.sessions.get(session_id),
"events": self.events.get(session_id, []),
"snapshots": self.snapshots.get(session_id, [])
}
# -----------------------------
# REPLAY ENGINE INPUT
# -----------------------------
def get_replay_stream(self, session_id):
return sorted(
self.events[session_id],
key=lambda e: e["ts"]
)