52 lines
1.3 KiB
Python
52 lines
1.3 KiB
Python
|
|
"""In-memory browser session ownership (single-operator; primary worker only)."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import time
|
||
|
|
from dataclasses import dataclass, field
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class BridgeSession:
|
||
|
|
session_id: str
|
||
|
|
admin_id: int
|
||
|
|
viewport_w: int
|
||
|
|
viewport_h: int
|
||
|
|
created_at: float = field(default_factory=time.time)
|
||
|
|
last_activity: float = field(default_factory=time.time)
|
||
|
|
|
||
|
|
|
||
|
|
_sessions: dict[str, BridgeSession] = {}
|
||
|
|
|
||
|
|
|
||
|
|
def register(session_id: str, admin_id: int, viewport_w: int, viewport_h: int) -> BridgeSession:
|
||
|
|
sess = BridgeSession(session_id, admin_id, viewport_w, viewport_h)
|
||
|
|
_sessions[session_id] = sess
|
||
|
|
return sess
|
||
|
|
|
||
|
|
|
||
|
|
def get(session_id: str) -> BridgeSession | None:
|
||
|
|
return _sessions.get(session_id)
|
||
|
|
|
||
|
|
|
||
|
|
def touch(session_id: str) -> None:
|
||
|
|
sess = _sessions.get(session_id)
|
||
|
|
if sess:
|
||
|
|
sess.last_activity = time.time()
|
||
|
|
|
||
|
|
|
||
|
|
def remove(session_id: str) -> BridgeSession | None:
|
||
|
|
return _sessions.pop(session_id, None)
|
||
|
|
|
||
|
|
|
||
|
|
def count_for_admin(admin_id: int) -> int:
|
||
|
|
return sum(1 for s in _sessions.values() if s.admin_id == admin_id)
|
||
|
|
|
||
|
|
|
||
|
|
def session_ids_for_admin(admin_id: int) -> list[str]:
|
||
|
|
return [sid for sid, s in _sessions.items() if s.admin_id == admin_id]
|
||
|
|
|
||
|
|
|
||
|
|
def total_count() -> int:
|
||
|
|
return len(_sessions)
|