
    xi_O                    ,   U d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZ d dlZd dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ d dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? d dl@mAZA e	rd dlBZBd dlCmDZD d dlEmFZF d dlGmHZH  eeI      ZJdeKd<   dNdZLdOdZMd ZNdeKd!<   d"ZOdeKd#<   d$ZPdeKd%<   d&ZQdeKd'<   d(ZRdeKd)<   d*ZSdeKd+<   d,ZTdeKd-<   d.ZUdeKd/<   d0ZVdeKd1<   d2ZWdeKd3<   d4ZXdeKd5<   d6eX d7ZYdeKd8<   d9ZZdeKd:<   d;Z[deKd<<   d=Z\deKd><   d?Z]deKd@<   dAZ^deKdB<    G dC dDe_      Z`dPdEZadPdFZbdQdGZcdRdHZddSdIZedSdJZf G dK dL      ZgdTdMZhy)U    )annotationsN)Path)TYPE_CHECKINGAnyFinal)
HTTPServer)cli_utilconfig	file_utilutil)is_authlib_installed)ConfigOption)
get_logger)RuntimeRuntimeConfigRuntimeState)MemoryMediaFileStorage)MemorySessionStorage)MemoryUploadedFileManager)get_max_message_size_bytes)$create_default_cache_storage_manager)AppStaticFileHandler)BidiComponentRequestHandler)BrowserWebSocketHandler)ComponentRequestHandler)MediaFileHandler)AddSlashHandlerHealthHandlerHostConfigHandlerRemoveSlashHandlerStaticFileHandler)get_cookie_secretis_tornado_version_less_thanis_xsrf_enabledmake_url_path_regex)StatsRequestHandler)UploadFileRequestHandler)	Awaitable)
SSLContextUvicornServerr   _LOGGERc                     t        j                  d      } | 6t        |       }t        d      s|dk  rt        j                  d||       ||fS t        d      rdnd}|dfS )zGet the websocket ping interval and timeout from config or defaults.

    Returns
    -------
        tuple: (ping_interval, ping_timeout)
    zserver.websocketPingIntervalz6.5.0   a  You have set server.websocketPingInterval to %s, but Tornado >= 6.5 requires websocket_ping_interval >= websocket_ping_timeout. To comply, we are setting both the ping interval and ping timeout to %s. Depending on the specific deployment setup, this may cause connection issues.   )r
   
get_optionintr#   r,   warning)configured_intervalintervaldefault_intervals      g/var/www/html/chatbot/card-advisor-bot/venv/lib/python3.12/site-packages/streamlit/web/server/server.py(_get_websocket_ping_interval_and_timeoutr7   H   sz     !++,JK&*+ ,G4BOO`  !! 9AqrR    c                 *    t               \  } }d| |ddS )zqGet Tornado settings for the server.

    This is a function to allow for testing and dynamic configuration.
    T_streamlit_xsrf)compress_responsewebsocket_ping_intervalwebsocket_ping_timeoutxsrf_cookie_name)r7   )ping_intervalping_timeouts     r6   get_tornado_settingsrA   h   s.    
 #K"LM< " $1 #/- r8   d   MAX_PORT_SEARCH_RETRIESzunix://UNIX_SOCKET_PREFIXz/mediaMEDIA_ENDPOINTz
/componentCOMPONENT_ENDPOINTz/_stcore/bidi-componentsBIDI_COMPONENT_ENDPOINTz/app/staticSTATIC_SERVING_ENDPOINTz/_stcore/upload_fileUPLOAD_FILE_ENDPOINTz_stcore/streamSTREAM_ENDPOINTz(?:st-metrics|_stcore/metrics)METRIC_ENDPOINTz_stcore/messageMESSAGE_ENDPOINTz_stcore/healthNEW_HEALTH_ENDPOINTz(?:healthz|)HEALTH_ENDPOINTz_stcore/host-configHOST_CONFIG_ENDPOINTz3(?:script-health-check|_stcore/script-health-check)SCRIPT_HEALTH_CHECK_ENDPOINTz/oauth2callbackOAUTH2_CALLBACK_ENDPOINTz/auth/loginAUTH_LOGIN_ENDPOINTz/auth/logoutAUTH_LOGOUT_ENDPOINTc                      e Zd Zy)RetriesExceededErrorN)__name__
__module____qualname__ r8   r6   rV   rV      s    r8   rV   c                 ,    t        j                  d      S )Nserver.port)r
   is_manually_setrZ   r8   r6   server_port_is_manually_setr^      s    !!-00r8   c                 b    t        j                  d      } | d uxr | j                  t              S )Nserver.address)r
   r0   
startswithrD   )addresss    r6   server_address_is_unix_socketrc      s/     01G$I7#5#56H#IIr8   c                    t        j                  d      }t        j                  d      }t        ||      }t        | t        j                  d      dz  dz  |      }t	               rt        |       yt        |       y)zMakes the server start listening at the configured port.

    In case the port is already taken it tries listening to the next available
    port.  It will error after MAX_PORT_SEARCH_RETRIES attempts.

    zserver.sslCertFilezserver.sslKeyFilezserver.maxUploadSizei   )max_buffer_sizessl_optionsN)r
   r0   _get_ssl_optionsr   rc   start_listening_unix_socketstart_listening_tcp_socket)app	cert_filekey_filerf   http_servers        r6   start_listeningrn      ss     !!"67I  !45H"9h7K))*@ADH4OK %&#K0";/r8   c                   t        |       t        |      k7  r*t        j                  d       t        j                  d       | r|rt        |       j                         s+t        j                  d|        t        j                  d       t        |      j                         s+t        j                  d|       t        j                  d       dd l}|j                  |j                  j                        }	 |j                  | |       |S y # |j                  $ r0 t        j                  d| |       t        j                  d       Y |S w xY w)NzzOptions 'server.sslCertFile' and 'server.sslKeyFile' must be set together. Set missing options or delete existing options.r/   zCert file '%s' does not exist.zKey file '%s' does not exist.r   zWFailed to load SSL certificate. Make sure cert file '%s' and key file '%s' are correct.)boolr,   errorsysexitr   existssslcreate_default_contextPurposeCLIENT_AUTHload_cert_chainSSLError	exception)rk   rl   ru   ssl_ctxs       r6   rg   rg      s	   I$x.(O	
 	X I%%'MM:IFHHQKH~$$&MM98DHHQK,,S[[-D-DE		##Ix8  || 	@	 HHQK	s   8D ;EEc                n   t        j                  d      }t        j                  j	                  |t        t              d        }dd l}t        |j                  d      r-|j                  j                  |      }| j                  |       y t        j                  d       t        j                  d       y )Nr`   r   bind_unix_socketz@Unix socket support is not available in this version of Tornado.r/   )r
   r0   ospath
expanduserlenrD   tornado.netutilhasattrnetutilr~   
add_socketr,   rq   rr   rs   )rm   rb   	file_nametornadounix_sockets        r6   rh   rh      s     01G""73/A+B+D#EFIw 23oo66yA{+N	
 	r8   c                n   d}d }|t         k  r>t        j                  d      }t        j                  d      }	 | j                  ||       	 |t         k\  rt#        d| dt          d	      y # t        $ r}|j
                  t
        j                  t
        j                  fv r|t               r,t        j                  d|       t        j                  d       nGt        j                  d|       |dz  }t        j                  d|t        j                          |dz  }n Y d }~nd }~ww xY w|t         k  r()
Nr   r`   r\   zPort %s is not availabler/   z2Port %s not available, trying to use the next one.z$Cannot start Streamlit server. Port zF is not available, and Streamlit was unable to find a free port after z
 attempts.)rC   r
   r0   listenOSErrorerrno
EADDRINUSEEACCESr^   r,   rq   rr   rs   debug
set_optionr   STREAMLIT_DEFINITIONrV   )rm   
call_countportrb   es        r6   ri   ri      s'   JD
.
.##$45  /	tW-, ,,"24& 9>>U=VV`b
 	
 -)  	 ww5++U\\::.0MM"<dCHHQKMMLd AID%%%t\-N-N !OJ%	 .
.s   A, ,	D(5B)D##D(c                      e Zd ZddZddZedd       ZddZedd       ZddZ	edd       Z
edd       Zdd	Zdd
Zy)Serverc                x   t                || _        t        t        j                  d            | _        d| _        d| _        t        t              }t        j                  |       t        t              }t        t        |d||t!               |t#        t        j                  d                        | _        y)z+Create the server. It won't be started yet.zserver.useStarletteNzserver.disconnectedSessionTTL)ttl_seconds)script_pathcommand_linemedia_file_storageuploaded_file_managercache_storage_manageris_hellosession_storage)_set_tornado_log_levels_main_script_pathrp   r
   r0   _use_starlette_starlette_server_bootstrap_taskr   rE   r   initialize_storager   rI   r   r   r   r   _runtime)selfmain_script_pathr   r   uploaded_file_mgrs        r6   __init__zServer.__init__#  s    !!1"6#4#45J#KL7;
 ;? 4NC++,>?56JK,!#5&7&J&L! 4 & 1 12Q R!

r8   c                ,    t        j                  |       S N)r   repr_r   s    r6   __repr__zServer.__repr__D  s    zz$r8   c                    | j                   S r   )r   r   s    r6   r   zServer.main_script_pathG  s    %%%r8   c                X  K   t         j                  d       | j                  r| j                          d{    y| j	                         }t        |       t        j                  d      }t         j                  d|       | j                  j                          d{    y7 n7 w)zaStart the server.

        When this returns, Streamlit is ready to accept new sessions.
        zStarting server...Nr\   zServer started on port %s)
r,   r   r   _start_starlette_create_apprn   r
   r0   r   start)r   rj   r   s      r6   r   zServer.startK  s      	*+'')))   /148mm!!### * 	$s"   5B*B&A(B* B(!B*(B*c                b      j                   d fd} |       S  j                  j                  S )z>A Future that completes when the Server's run loop has exited.c                    K    j                   , j                   j                  j                          d {     j                  j                   d {    y 7 #7 wr   )r   stoppedwaitr   r   s   r6   _wait_for_starlette_stopz0Server.stopped.<locals>._wait_for_starlette_stopf  sR     ))50088==??? mm++++ @ ,s!   4AAAAAAreturnNone)r   r   r   )r   r   s   ` r6   r   zServer.stopped`  s1     !!-, ,--}}$$$r8   c                    t        j                  d      }t        |t              t        d j
                  ift        |t              t        d fdift        |t              t        d j
                  j                  ift        |t              t        ft        |t         d      t         j
                  j                   j
                  j                   dft        |t"         d      t$        d	d
ift        |t&         d      t(        d j
                  j*                  ift        |t,         d      t.        d j
                  j0                  ifg}t        j                  d      r,|j3                  t        |t4              t        d fdifg       t        j                  d      rI|j3                  t        |t6         d      t8        d	t;        j<                   j>                        ifg       tA               rWddl!m"}m#}m$} |j3                  t        |tJ              |d|ift        |tL              |d|ift        |tN              |d|ifg       t        j                  d      rtP        jS                  d       nt;        jT                         }tP        jS                  d|       |j3                  t        |dd      tV        ft        |d      tX        | ddtZ        t        gdft        |d      t\        fg       t_        j`                  jb                  |fte               tg               ti               dtk               S )zCreate our tornado web app.zserver.baseUrlPathruntimecallbackc                 0     j                   j                  S r   )r   is_ready_for_browser_connectionr   s   r6   <lambda>z$Server._create_app.<locals>.<lambda>}  s    T]]%R%R r8   stats_managerz)/(?P<session_id>[^/]+)/(?P<file_id>[^/]+))file_mgris_active_sessionz/(.*)r    registrycomponent_managerzserver.scriptHealthCheckEnabledc                 8     j                   j                         S r   )r   does_script_run_without_errorr   s   r6   r   z$Server._create_app.<locals>.<lambda>  s    0[0[0] r8   zserver.enableStaticServingr   )AuthCallbackHandlerAuthLoginHandlerAuthLogoutHandlerbase_urlglobal.developmentModez/Serving static content from the Node dev serverzServing static content from %sz	(?!/)(.*)required)trailing_slashz(.*)/z
index.html)r   default_filenamereserved_paths
prohibited)cookie_secretxsrf_cookieswebsocket_max_message_size)6r
   r0   r%   rJ   r   r   rO   r   rK   r&   	stats_mgrrP   r   rI   r'   r   r   rE   r   rF   r   component_registryrG   r   bidi_component_registryextendrQ   rH   r   r   get_app_static_dirr   r   )streamlit.web.server.oauth_authlib_routesr   r   r   rR   rS   rT   r,   r   get_static_dirr    r!   rM   r   r   webApplicationr"   r$   r   rA   )r   baseroutesr   r   r   static_paths   `      r6   r   zServer._create_appp  s]     !56 $D/:'DMM* $D/:RS $D/:# $--"9"9: $D*>?!
 $,--VW ) $ ? ?)-)H)H
 $D^,<E*BC  $D-?,@*FG'T]]==> $D-D,EU*KL+$dmm&K&KLS.
` >?MM ,D2NO%&(]
 9:MM ,D5L4MU2ST,!=!=d>S>S!TU  !  MM ,D2JK+#T* ,D2EF(#T* ,D2FG)#T*( 56MMKL#224KMM:KHMM , +j + ,D&9)'2m1$50< !4 4	/	 ,DN'1@ {{&&
+-(*'A'C
 #$
 	
r8   c                P    | j                   j                  t        j                  k(  S r   )r   stater   ONE_OR_MORE_SESSIONS_CONNECTEDr   s    r6   browser_is_connectedzServer.browser_is_connected  s    }}""l&Q&QQQr8   c                @    ddl m} | j                  |j                  k(  S )Nr   )streamlit_app)streamlit.hellor   r   __file__)r   r   s     r6   is_running_hellozServer.is_running_hello
  s    1%%)?)???r8   c                    t        j                  dd       | j                  | j                  j                          y | j                  j                          y )Nz  Stopping...blue)fg)r	   print_to_clir   stopr   r   s    r6   r   zServer.stop  sB    o&9!!-""'') MM r8   c                   K   ddl m}  || j                        | _        | j                  j	                          d {    y 7 w)Nr   r*   )streamlit.web.server.starletter+   r   r   r   )r   r+   s     r6   r   zServer._start_starlette  s2     @!.t}}!=$$**,,,s   ;AAAN)r   strr   rp   r   r   )r   r   r   )r   zAwaitable[None])r   tornado.web.Applicationr   rp   )rW   rX   rY   r   r   propertyr   r   r   r   r   r   r   r   rZ   r8   r6   r   r   "  sw    
B  & &$* % %T
l R R @ @
!-r8   r   c                 \   t        j                  d      st        j                  d      j	                  t        j
                         t        j                  d      j	                  t        j
                         t        j                  d      j	                  t        j
                         y y )Nr   ztornado.accessztornado.applicationztornado.general)r
   r0   logging	getLoggersetLevelERRORrZ   r8   r6   r   r      sr    56 	*+44W]]C/099'--H+,55gmmD 7r8   )r   ztuple[int, int])r   zdict[str, Any]r   )rj   r   r   r   )rk   
str | Nonerl   r   r   zSSLContext | None)rm   r   r   r   r   )i
__future__r   r   r   r   rr   pathlibr   typingr   r   r   tornado.webr   tornado.httpserverr   	streamlitr	   r
   r   r   streamlit.auth_utilr   streamlit.config_optionr   streamlit.loggerr   streamlit.runtimer   r   r   +streamlit.runtime.memory_media_file_storager   (streamlit.runtime.memory_session_storager   .streamlit.runtime.memory_uploaded_file_managerr   streamlit.runtime.runtime_utilr   *streamlit.web.cache_storage_manager_configr   ,streamlit.web.server.app_static_file_handlerr   3streamlit.web.server.bidi_component_request_handlerr   .streamlit.web.server.browser_websocket_handlerr   .streamlit.web.server.component_request_handlerr   'streamlit.web.server.media_file_handlerr   streamlit.web.server.routesr   r   r   r    r!    streamlit.web.server.server_utilr"   r#   r$   r%   *streamlit.web.server.stats_request_handlerr&   0streamlit.web.server.upload_file_request_handlerr'   asynciocollections.abcr(   ru   r)   r   r+   rW   r,   __annotations__r7   rA   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rO   rP   rQ   rR   rS   rT   	ExceptionrV   r^   rc   rn   rg   rh   ri   r   r   rZ   r8   r6   <module>r     s   #   	 
  , ,  ) 7 7 4 0 ' B B N I T E N S R D   K U)<H% % @2 "%  $ & E % !  ( E (!;  ;!.  .4 e 4* *: :, % ,- U -'(;'<A> >4 e 4: e  #4 % 3* U *, e ,	9 	1J
0.$N $
N{- {-|Er8   