81 lines
1.9 KiB
Python
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"]
|
|
)
|