File size: 3,998 Bytes
a5784e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# --- browser_utils/initialization/debug.py ---
import logging

from playwright.async_api import Page as AsyncPage

logger = logging.getLogger("AIStudioProxyServer")


def setup_debug_listeners(page: AsyncPage) -> None:
    """
    Setup console and network logging listeners for comprehensive error snapshots.

    This function attaches event listeners to capture:
    - Browser console messages (log, warning, error, etc.)
    - Network requests and responses

    Args:
        page: Playwright page instance to attach listeners to
    """
    from datetime import datetime, timezone

    from api_utils.server_state import state

    def handle_console(msg):
        """Handle console messages from the browser."""
        try:
            # Extract location info if available
            location_str = ""
            if msg.location:
                url = msg.location.get("url", "")
                line = msg.location.get("lineNumber", 0)
                if url or line:
                    location_str = f"{url}:{line}"

            state.console_logs.append(
                {
                    "timestamp": datetime.now(timezone.utc).isoformat(),
                    "type": msg.type,
                    "text": msg.text,
                    "location": location_str,
                }
            )

            # Log errors to our logger as well
            if msg.type == "error":
                # Filter out known benign browser warnings - log at DEBUG level
                text_lower = msg.text.lower()
                if "cookie" in text_lower and "rejected" in text_lower:
                    # Known Google cookie warning (SIDCC, etc.) - benign but may indicate stale auth profile
                    # Log at DEBUG to reduce noise but preserve for troubleshooting
                    logger.debug(
                        f"[Browser Cookie Warning] {msg.text} - This may indicate the auth profile needs refresh"
                    )
                    return
                logger.warning(f"[Browser Console Error] {msg.text}")

        except Exception as e:
            logger.error(f"Failed to capture console message: {e}")

    def handle_request(request):
        """Handle network requests."""
        try:
            # Only log relevant requests (skip static assets, images, etc.)
            url_lower = request.url.lower()
            if any(
                ext in url_lower
                for ext in [".png", ".jpg", ".jpeg", ".gif", ".css", ".woff", ".woff2"]
            ):
                return  # Skip static assets

            state.network_log["requests"].append(
                {
                    "timestamp": datetime.now(timezone.utc).isoformat(),
                    "url": request.url,
                    "method": request.method,
                    "resource_type": request.resource_type,
                }
            )
        except Exception as e:
            logger.error(f"Failed to capture network request: {e}")

    def handle_response(response):
        """Handle network responses."""
        try:
            # Only log relevant responses
            url_lower = response.url.lower()
            if any(
                ext in url_lower
                for ext in [".png", ".jpg", ".jpeg", ".gif", ".css", ".woff", ".woff2"]
            ):
                return  # Skip static assets

            state.network_log["responses"].append(
                {
                    "timestamp": datetime.now(timezone.utc).isoformat(),
                    "url": response.url,
                    "status": response.status,
                    "status_text": response.status_text,
                }
            )
        except Exception as e:
            logger.error(f"Failed to capture network response: {e}")

    # Attach listeners
    page.on("console", handle_console)
    page.on("request", handle_request)
    page.on("response", handle_response)

    logger.debug("Debug listeners (console + network) attached to page")