Files
Nexus/server/infrastructure/browser/session_registry.py
T
Nexus Agent e833b923c8 feat(browser): 远程浏览器 Worker 桥接与顶栏固定悬浮窗
接入 Playwright Worker、会话 WebSocket 与全局浏览器面板(固定于 App Bar 下);
含验证码 stealth、设置项默认音与 URL 安全校验;附带 worker 部署与设计文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-12 06:49:20 +08:00

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)