1414from models import WebSocketConnectionManager
1515from logger import initialize_logging , restore_streams
1616from browser import _initialize_page_logic , _close_page_logic , load_excluded_models , _handle_initial_model_state_and_storage
17- import proxy
1817from asyncio import Queue , Lock
1918from . import auth_utils
2019playwright_manager : Optional [AsyncPlaywright ] = None
@@ -82,24 +81,30 @@ async def _wait_for_port(port: int, timeout: float = 10.0, interval: float = 0.3
8281 return False
8382
8483async def _start_stream_proxy ():
84+ import proxy
8585 import server
8686 STREAM_PORT = os .environ .get ('STREAM_PORT' )
8787 if STREAM_PORT != '0' :
8888 port = int (STREAM_PORT or 3120 )
8989 STREAM_PROXY_SERVER_ENV = os .environ .get ('UNIFIED_PROXY_CONFIG' ) or os .environ .get ('HTTPS_PROXY' ) or os .environ .get ('HTTP_PROXY' )
9090 server .logger .info (f'Starting STREAM proxy on port { port } with upstream proxy: { STREAM_PROXY_SERVER_ENV } ' )
91- server .STREAM_QUEUE = multiprocessing .Queue ()
92- server .STREAM_PROCESS = multiprocessing .Process (target = proxy .start , args = (server .STREAM_QUEUE , port , STREAM_PROXY_SERVER_ENV ))
93- server .STREAM_PROCESS .start ()
94- server .logger .info ('STREAM proxy process started. Waiting for port readiness...' )
95- if await _wait_for_port (port ):
96- server .logger .info (f'STREAM proxy port { port } is ready.' )
97- else :
98- server .logger .error (f'STREAM proxy port { port } not ready after timeout. Browser may fail to connect.' )
99- if server .STREAM_PROCESS and server .STREAM_PROCESS .is_alive ():
100- server .logger .warning ('STREAM proxy process is alive but port not listening.' )
91+ for attempt in range (3 ):
92+ current_port = port + attempt
93+ server .STREAM_QUEUE = multiprocessing .Queue ()
94+ server .STREAM_PROCESS = multiprocessing .Process (target = proxy .start , args = (server .STREAM_QUEUE , current_port , STREAM_PROXY_SERVER_ENV ))
95+ server .STREAM_PROCESS .start ()
96+ server .logger .info (f'STREAM proxy process started on port { current_port } . Waiting for port readiness...' )
97+ if await _wait_for_port (current_port , timeout = 30.0 ):
98+ server .STREAM_PORT_ACTUAL = current_port
99+ server .logger .info (f'STREAM proxy port { current_port } is ready.' )
100+ if current_port != port :
101+ server .logger .warning (f'STREAM proxy using fallback port { current_port } (requested { port } ).' )
102+ return
101103 else :
102- server .logger .error (f'STREAM proxy process died. Exit code: { server .STREAM_PROCESS .exitcode } ' )
104+ server .logger .warning (f'STREAM proxy port { current_port } not ready, killing process...' )
105+ server .STREAM_PROCESS .terminate ()
106+ server .STREAM_PROCESS .join (timeout = 3 )
107+ server .logger .error (f'STREAM proxy failed to start after 3 attempts.' )
103108
104109async def _initialize_browser_and_page ():
105110 import server
@@ -153,7 +158,7 @@ async def _shutdown_resources():
153158async def lifespan (app : FastAPI ):
154159 """FastAPI application life cycle management"""
155160 import server
156- from server import queue_worker
161+ from api import queue_worker
157162 original_streams = (sys .stdout , sys .stderr )
158163 initial_stdout , initial_stderr = _setup_logging ()
159164 logger = server .logger
@@ -175,7 +180,12 @@ async def lifespan(app: FastAPI):
175180 server .is_initializing = False
176181 yield
177182 except Exception as e :
178- logger .critical (f'Application startup failed: { e } ' , exc_info = True )
183+ if 'Target page, context or browser has been closed' in str (e ):
184+ logger .warning (f'Application startup failed (browser closed): { e } ' )
185+ elif 'NS_ERROR_PROXY' in str (e ) or 'PROXY_CONNECTION_REFUSED' in str (e ):
186+ logger .warning (f'Application startup failed (proxy error): { e } ' )
187+ else :
188+ logger .critical (f'Application startup failed: { e } ' , exc_info = True )
179189 await _shutdown_resources ()
180190 raise RuntimeError (f'Application startup failed: { e } ' ) from e
181191 finally :
0 commit comments