Ë
    úmxi‹-  ã                  ó2  — U d dl mZ d dlZd dl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mZmZmZmZ d dlmZmZmZmZmZmZmZ er"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%  e	e&«      Z'de(d<   dZ)de(d<   dZ*de(d<   dZ+de(d<    G d„ dee«      Z,y)é    )ÚannotationsN)ÚTYPE_CHECKINGÚFinalÚcast)Ú
get_logger)Ú
AppSession)ÚActiveSessionInfoÚSessionClientÚSessionInfoÚSessionManagerÚSessionStorage)ÚACTIVE_SESSIONS_FAMILYÚSESSION_DURATION_FAMILYÚSESSION_EVENTS_FAMILYÚCounterStatÚ	GaugeStatÚStatÚStatsProvider)ÚCallableÚMappingÚSequence)Ú
ScriptData)ÚScriptCache)ÚUserInfoType)ÚUploadedFileManagerr   Ú_LOGGERÚconnectÚ_EVENT_TYPE_CONNECTÚ	reconnectÚ_EVENT_TYPE_RECONNECTÚ
disconnectÚ_EVENT_TYPE_DISCONNECTc                  ó´   — e Zd ZdZedd„«       Z	 	 	 	 	 	 	 	 	 	 dd„Z	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Z	dd„Z
dd	„Zdd
„Zdd„Zdd„Zdd„Z	 d	 	 	 dd„Zy)ÚWebsocketSessionManageraÕ  A SessionManager used to manage sessions with lifecycles tied to those of a
    browser tab's websocket connection.

    WebsocketSessionManagers differentiate between "active" and "inactive" sessions.
    Active sessions are those with a currently active websocket connection. Inactive
    sessions are sessions without. Eventual cleanup of inactive sessions is a detail left
    to the specific SessionStorage that a WebsocketSessionManager is instantiated with.
    c                ó$   — t         t        t        fS ©N)r   r   r   ©Úselfs    úb/home/htdocs/ttos/venv/lib/python3.12/site-packages/streamlit/runtime/websocket_session_manager.pyÚstats_familiesz&WebsocketSessionManager.stats_familiesB   s   € ä%Ô'>Ô@VÐWÐWó    c                óÂ   — || _         || _        || _        || _        i | _        t        j                  «       | _        d| _        d| _	        d| _
        i | _        d| _        y )Nr   )Ú_session_storageÚ_uploaded_file_mgrÚ_script_cacheÚ_message_enqueued_callbackÚ_active_session_info_by_idÚ	threadingÚLockÚ_stats_lockÚ_connect_countÚ_reconnect_countÚ_disconnect_countÚ_session_connect_timesÚ_total_session_duration_seconds)r(   Úsession_storageÚuploaded_file_managerÚscript_cacheÚmessage_enqueued_callbacks        r)   Ú__init__z WebsocketSessionManager.__init__F   sk   € ð !0ˆÔØ"7ˆÔØ)ˆÔØ*CˆÔ'ð IKˆÔ'ô %Ÿ>™>Ó+ˆÔØ#$ˆÔØ%&ˆÔØ&'ˆÔð 9;ˆÔ#Ø67ˆÕ,r+   Nc                óþ  — |r|rt        d«      ‚|| j                  v rt        j                  d|«       |xr+ || j                  vxr | j                  j                  |«      }t        |t        «      rÐ|j                  }|j                  «        t        |||j                  «      | j                  |j                  <   | j                  j                  |j                  «       | j                  5  | xj                  dz  c_        t!        j"                  «       | j$                  |j                  <   d d d «       |j                  S t'        || j(                  | j*                  | j,                  ||¬«      }t        j/                  dt        |«      |j                  «       |j                  | j                  v rt        d|j                  › d�«      ‚t        ||«      | j                  |j                  <   | j                  5  | xj0                  dz  c_        t!        j"                  «       | j$                  |j                  <   d d d «       |j                  S # 1 sw Y   |j                  S xY w# 1 sw Y   |j                  S xY w)NzcOnly one of existing_session_id and session_id_override should be truthy. This should never happen.zESession with id %s is already connected! Connecting to a new session.é   )Úscript_datar;   r<   r=   Ú	user_infoÚsession_id_overridez1Created new session for client %s. Session ID: %szsession.id 'z6' registered multiple times. This should never happen.)ÚRuntimeErrorr1   r   Úwarningr-   ÚgetÚ
isinstancer   ÚsessionÚregister_file_watchersr	   Úscript_run_countÚidÚdeleter4   r6   ÚtimeÚ	monotonicr8   r   r.   r/   r0   Údebugr5   )	r(   ÚclientrA   rB   Úexisting_session_idrC   Úsession_infoÚexisting_sessionrH   s	            r)   Úconnect_sessionz'WebsocketSessionManager.connect_session_   sI  € ñ Ñ#6Üð,óð ð
  $×"AÑ"AÑAÜ�O‰OØWØ#ôð  ò ?Ø#¨4×+JÑ+JÐJò?à×%Ñ%×)Ñ)Ð*=Ó>ð 	ô �l¤KÔ0Ø+×3Ñ3ÐØ×3Ñ3Ô5äCTØØ Ø×-Ñ-óDˆD×+Ñ+Ð,<×,?Ñ,?Ñ@ð
 ×!Ñ!×(Ñ(Ð)9×)<Ñ)<Ô=à×!Ñ!ñ TØ×%Ò%¨Ñ*Õ%ÜCGÇ>Á>ÓCS�×+Ñ+Ð,<×,?Ñ,?Ñ@÷Tð $×&Ñ&Ð&äØ#Ø"&×"9Ñ"9Ø×+Ñ+Ø&*×&EÑ&EØØ 3ô
ˆô 	�‰Ø?ÄÀFÃÈWÏZÉZô	
ð �:‰:˜×8Ñ8Ñ8ÜØ˜wŸz™z˜lð +,ð ,óð ô
 7HÈÐPWÓ6Xˆ×'Ñ'¨¯
©
Ñ3Ø×Ññ 	GØ×Ò 1Ñ$ÕÜ6:·n±nÓ6FˆD×'Ñ'¨¯
©
Ñ3÷	Gð �z‰zÐ÷9Tð $×&Ñ&Ð&ú÷,	Gð �z‰zÐús   Ã.AIÇ<AI(ÉI%É(I<c                ó  — || j                   v rÄ| j                   |   }|j                  }|j                  «        |j                  «        |j	                  «        | j
                  j                  t        d ||j                  ¬«      «       | j                   |= | j                  5  | xj                  dz  c_
        | j                  |«       d d d «       | j                   s| j                  j                  «        y y # 1 sw Y   Œ1xY w)N)rP   rH   rJ   r@   )r1   rH   Úrequest_script_stopÚdisconnect_file_watchersÚclear_session_cachesr-   Úsaver   rJ   r4   r7   Ú_accumulate_session_durationr/   Úclear)r(   Ú
session_idÚactive_session_inforH   s       r)   Údisconnect_sessionz*WebsocketSessionManager.disconnect_session¢   sê   € Ø˜×8Ñ8Ñ8Ø"&×"AÑ"AÀ*Ñ"MÐØ)×1Ñ1ˆGà×'Ñ'Ô)Ø×,Ñ,Ô.Ø×(Ñ(Ô*à×!Ñ!×&Ñ&ÜØØ#Ø%8×%IÑ%Iôôð ×/Ñ/°
Ð;Ø×!Ñ!ñ >Ø×&Ò&¨!Ñ+Õ&Ø×1Ñ1°*Ô=÷>ð ×.Ò.à×Ñ×$Ñ$Õ&ð /÷	>ð >ús   Â$'C;Ã;Dc                ó8   — | j                   j                  |«      S r&   )r1   rF   ©r(   r\   s     r)   Úget_active_session_infoz/WebsocketSessionManager.get_active_session_info»   s   € Ø×.Ñ.×2Ñ2°:Ó>Ð>r+   c                ó   — || j                   v S r&   )r1   r`   s     r)   Úis_active_sessionz)WebsocketSessionManager.is_active_session¾   s   € Ø˜T×<Ñ<Ð<Ð<r+   c                óH   — t        | j                  j                  «       «      S r&   )Úlistr1   Úvaluesr'   s    r)   Úlist_active_sessionsz,WebsocketSessionManager.list_active_sessionsÁ   s   € Ü�D×3Ñ3×:Ñ:Ó<Ó=Ð=r+   c                ór  — || j                   v r˜| j                   |   }| j                   |= |j                  j                  «        | j                  5  | xj                  dz  c_        | j                  |«       d d d «       | j                   s| j                  j                  «        y | j                  j                  |«      }|r\| j                  j                  |«       |j                  j                  «        | j                  5  | j                  |«       d d d «       y y # 1 sw Y   ŒªxY w# 1 sw Y   y xY w)Nr@   )r1   rH   Úshutdownr4   r7   rZ   r/   r[   r-   rF   rL   )r(   r\   r]   rR   s       r)   Úclose_sessionz%WebsocketSessionManager.close_sessionÄ   s  € Ø˜×8Ñ8Ñ8Ø"&×"AÑ"AÀ*Ñ"MÐØ×/Ñ/°
Ð;Ø×'Ñ'×0Ñ0Ô2à×!Ñ!ñ >Ø×&Ò&¨!Ñ+Õ&Ø×1Ñ1°*Ô=÷>ð ×2Ò2à×"Ñ"×(Ñ(Ô*Øð ×,Ñ,×0Ñ0°Ó<ˆÙØ×!Ñ!×(Ñ(¨Ô4Ø× Ñ ×)Ñ)Ô+Ø×!Ñ!ñ >Ø×1Ñ1°*Ô=÷>ð >ð ÷>ð >ú÷>ð >ús   Á'D!ÄD-Ä!D*Ä-D6c                óš   — | j                   j                  |d«      }|�-t        j                  «       |z
  }| xj                  |z  c_        yy)z‚Accumulate the session duration for a closed session.

        This method must be called while holding self._stats_lock.
        N)r8   ÚpoprM   rN   r9   )r(   r\   Úconnect_timeÚdurations       r)   rZ   z4WebsocketSessionManager._accumulate_session_durationÜ   sI   € ð
 ×2Ñ2×6Ñ6°zÀ4ÓHˆØÐ#Ü—~‘~Ó'¨,Ñ6ˆHØ×0Ò0°HÑ<Ö0ð $r+   c                óv   — | j                  |«      }|rt        d|«      S | j                  j                  |«      S )Nr   )ra   r   r-   rF   )r(   r\   rR   s      r)   Úget_session_infoz(WebsocketSessionManager.get_session_infoæ   s9   € Ø×3Ñ3°JÓ?ˆÙÜ˜ |Ó4Ð4Ø×$Ñ$×(Ñ(¨Ó4Ð4r+   c                ól   — t        d| j                  «       «      | j                  j                  «       z   S )Núlist[SessionInfo])r   rg   r-   re   r'   s    r)   Úlist_sessionsz%WebsocketSessionManager.list_sessionsì   s2   € äÐ$ d×&?Ñ&?Ó&AÓBØ×#Ñ#×(Ñ(Ó*ñ+ð	
r+   c                ón  — i }|�t         |v rŠ| j                  5  | j                  }| j                  }| j                  }ddd«       t        t         dt        id¬«      t        t         dt        id¬«      t        t         dt        id¬«      g|t         <   |�t        |v rE| j                  5  t        | j                  «      }ddd«       t        t        dd¬«      g|t        <   |�t        |v r-t        t        t        | j                  «      d¬	«      g|t        <   |S # 1 sw Y   ŒâxY w# 1 sw Y   ŒixY w)
z¯Return session-related metrics.

        Returns session event counters (connections, reconnections, disconnections)
        and the current count of active sessions.
        NÚtypez&Total count of session events by type.)Úfamily_nameÚvalueÚlabelsÚhelpÚsecondsz0Total time spent in active sessions, in seconds.)rv   rw   Úunitry   z"Current number of active sessions.)rv   rw   ry   )r   r4   r5   r6   r7   r   r   r    r"   r   Úintr9   r   r   Úlenr1   )r(   Úfamily_namesÚresultÚconnect_countÚreconnect_countÚdisconnect_countÚtotal_durations          r)   Ú	get_statsz!WebsocketSessionManager.get_statsò   s^  € ð )+ˆàÐÔ#8¸LÑ#HØ×!Ñ!ñ :Ø $× 3Ñ 3�Ø"&×"7Ñ"7�Ø#'×#9Ñ#9Ð ÷:ô Ü 5Ø'Ø"Ô$7Ð8ØAô	ô Ü 5Ø)Ø"Ô$9Ð:ØAô	ô Ü 5Ø*Ø"Ô$:Ð;ØAô	ð-ˆFÔ(Ñ)ð* ÐÔ#:¸lÑ#JØ×!Ñ!ñ KÜ!$ T×%IÑ%IÓ!J�÷Kô Ü 7Ø(Ø"ØKô	ð/ˆFÔ*Ñ+ð ÐÔ#9¸\Ñ#IäÜ 6Ü˜d×=Ñ=Ó>Ø=ôð.ˆFÔ)Ñ*ð ˆ÷a:ð :ú÷6Kð Kús   ™%DÂ-D+ÄD(Ä+D4)ÚreturnzSequence[str])
r:   r   r;   r   r<   r   r=   zCallable[[], None] | Noner…   ÚNone)NN)rP   r
   rA   r   rB   r   rQ   ú
str | NonerC   r‡   r…   Ústr)r\   rˆ   r…   r†   )r\   rˆ   r…   zActiveSessionInfo | None)r\   rˆ   r…   Úbool)r…   zlist[ActiveSessionInfo])r\   rˆ   r…   zSessionInfo | None)r…   rr   r&   )r~   zSequence[str] | Noner…   zMapping[str, Sequence[Stat]])Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr*   r>   rT   r^   ra   rc   rg   rj   rZ   rp   rs   r„   © r+   r)   r$   r$   8   sã   „ ñð òXó ðXð8à'ð8ð  3ð8ð "ð	8ð
 $=ð8ð 
ó8ð< +/Ø*.ðAàðAð  ðAð  ð	Að
 (ðAð (ðAð 
óAóF'ó2?ó=ó>ó>ó0=ó5ó
ð 48ð;Ø0ð;à	%ô;r+   r$   )-Ú
__future__r   r2   rM   Útypingr   r   r   Ústreamlit.loggerr   Ústreamlit.runtime.app_sessionr   Ú!streamlit.runtime.session_managerr	   r
   r   r   r   Ústreamlit.runtime.statsr   r   r   r   r   r   r   Úcollections.abcr   r   r   Ústreamlit.runtime.script_datar   Ú+streamlit.runtime.scriptrunner.script_cacher   Ú7streamlit.runtime.scriptrunner_utils.script_run_contextr   Ú'streamlit.runtime.uploaded_file_managerr   rŠ   r   Ú__annotations__r   r    r"   r$   r�   r+   r)   ú<module>rœ      sŽ   ðö #ã Û ß -Ñ -å 'Ý 4÷õ ÷÷ ñ ñ ß;Ñ;å8ÝGÝTÝKá˜HÓ%€ˆÓ %ð 'Ð �UÓ &Ø*Ð �uÓ *Ø ,Ð ˜Ó ,ôu˜n¨mõ ur+   