a
    KDf9                     @  s  d Z ddlmZ ddlZeeZddlZddlm	Z	m
Z
mZmZmZ ddlmZ e	rnddlmZ ddlmZ dd	l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	rddlmZ ddl m!Z! ddlm"Z" dZ#G dd deZ$G dd deZ%G dd dZ&G dd dZ'dS )zA Provides the Application, Server, and Session context classes.

    )annotationsN)TYPE_CHECKINGAny	AwaitableCallableIterable)gen)HTTPServerRequest)IOLoop   )ServerContextSessionContext)Document)ProtocolError)get_token_payload   )ServerSession)Application)ID)TokenPayload)ApplicationContextBokehServerContextBokehSessionContextc                   @  s@   e Zd ZdddddZedddd	Zed
dddZdS )r   r   None)application_contextreturnc                 C  s   t || _d S N)weakrefref_application_context)selfr    r!   b/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/bokeh/server/contexts.py__init__K   s    zBokehServerContext.__init__zApplicationContext | Noner   c                 C  s   |   S r   )r   r    r!   r!   r"   r   N   s    z&BokehServerContext.application_contextzlist[ServerSession]c                 C  s(   g }| j }|r$|jD ]}|| q|S r   )r   sessionsappend)r    resultcontextsessionr!   r!   r"   r&   R   s    
zBokehServerContext.sessionsN)__name__
__module____qualname__r#   propertyr   r&   r!   r!   r!   r"   r   J   s
   r   c                      s   e Zd ZU ded< ded< ded< d$dd	d
ddd fddZdddddZdddddZeddddZeddddZ	eddddZ
eddd d!Zeddd"d#Z  ZS )%r   zServerSession | None_sessionz_RequestProxy | None_request
str | None_tokenNr   r   r   r   )
session_idserver_contextdocument
logout_urlr   c                   s0   || _ d | _|| _t || d | _d | _d S r   )	_documentr/   _logout_urlsuperr#   r0   r2   )r    r3   r4   r5   r6   	__class__r!   r"   r#   a   s    zBokehSessionContext.__init__r   r*   r   c                 C  s
   || _ d S r   r/   )r    r*   r!   r!   r"   _set_sessionk   s    z BokehSessionContext._set_sessionz%Callable[[Document], Awaitable[None]])funcr   c                   s6   | j d u r|| jI d H  n| j || jI d H  d S r   )r/   r7   with_document_locked)r    r?   r!   r!   r"   with_locked_documentn   s    
z(BokehSessionContext.with_locked_documentboolr$   c                 C  s   | j d u rdS | j jS d S )NF)r/   	destroyedr%   r!   r!   r"   rC   v   s    
zBokehSessionContext.destroyedc                 C  s   | j S r   )r8   r%   r!   r!   r"   r6   ~   s    zBokehSessionContext.logout_urlc                 C  s   | j S r   )r0   r%   r!   r!   r"   request   s    zBokehSessionContext.requestr   c                 C  s   | j d usJ t| j S r   )r2   r   r%   r!   r!   r"   token_payload   s    z!BokehSessionContext.token_payloadc                 C  s   | j S r   r=   r%   r!   r!   r"   r*      s    zBokehSessionContext.session)N)r+   r,   r-   __annotations__r#   r>   rA   r.   rC   r6   rD   rE   r*   __classcell__r!   r!   r:   r"   r   [   s"   
 
r   c                   @  s  e Zd ZU dZded< ded< ded< ded	< d3dddddddZeddddZeddddZeddddZ	eddddZ
eddddZddddZddd d!Zd4d"d#dd$d%d&d'Zd"d$d(d)d*Zd$d+dd,d-d.Zd/dd0d1d2Zd
S )5r   z Server-side holder for ``bokeh.application.Application`` plus any associated data.
        This holds data that's global to all sessions, while ``ServerSession`` holds
        data specific to an "instance" of the application.

    zdict[ID, ServerSession]	_sessionsz#dict[ID, gen.Future[ServerSession]]_pending_sessionszdict[ID, SessionContext]_session_contextsr   _server_contextNr   zIOLoop | Noner1   )applicationio_loopurlr6   c                 C  s8   || _ || _i | _i | _i | _t| | _|| _|| _d S r   )	_application_looprH   rI   rJ   r   rK   _urlr8   )r    rL   rM   rN   r6   r!   r!   r"   r#      s    
zApplicationContext.__init__r$   c                 C  s   | j S r   )rP   r%   r!   r!   r"   rM      s    zApplicationContext.io_loopc                 C  s   | j S r   )rO   r%   r!   r!   r"   rL      s    zApplicationContext.applicationc                 C  s   | j S r   )rQ   r%   r!   r!   r"   rN      s    zApplicationContext.urlc                 C  s   | j S r   )rK   r%   r!   r!   r"   r4      s    z!ApplicationContext.server_contextzIterable[ServerSession]c                 C  s
   | j  S r   )rH   valuesr%   r!   r!   r"   r&      s    zApplicationContext.sessionsr   c              
   C  sP   z| j | j W n8 tyJ } z tjd|dd W Y d }~n
d }~0 0 d S )NzError in server loaded hook Texc_info)rO   Zon_server_loadedr4   	Exceptionlogerrorr    er!   r!   r"   run_load_hook   s    z ApplicationContext.run_load_hookc              
   C  sP   z| j | j W n8 tyJ } z tjd|dd W Y d }~n
d }~0 0 d S )NzError in server unloaded hook TrS   )rO   Zon_server_unloadedr4   rU   rV   rW   rX   r!   r!   r"   run_unload_hook   s    z"ApplicationContext.run_unload_hookr   zHTTPServerRequest | Noner   )r3   rD   tokenr   c           
   
     s  t |dkrtd|| jvr|| jvrt  }| j|< t }t|| j|| j	d}|d ur|rlt
|ni }d|v rd|v rd|d vrddd	 |d  D |d d< t||d
|d|dd|_||_t||_z| j|I d H  W n6 ty2 } ztjd|dd W Y d }~n
d }~0 0 | j| t||| j|d}	| j|= |	| j|< ||	 || j|< ||	 || jv r| j| I d H }	n
| j| }	|	S )Nr   zSession ID must not be empty)r6   cookiesheadersCookiez; c                 S  s   g | ]\}}| d | qS )=r!   .0kvr!   r!   r"   
<listcomp>   s   z?ApplicationContext.create_session_if_needed.<locals>.<listcomp>	arguments)rf   r]   r^   z'Failed to run session creation hooks %rTrS   )rM   r\   )lenr   rH   rI   r   ZFuturer   r   r4   r8   r   joinitems_RequestProxygetr0   r2   r   r   Z_session_contextrO   Zon_session_createdrU   rV   rW   Zinitialize_documentr   rP   r>   rJ   Z
set_result)
r    r3   rD   r\   futuredocsession_contextpayloadrY   r*   r!   r!   r"   create_session_if_needed   sT    


&




z+ApplicationContext.create_session_if_needed)r3   r   c                 C  s(   || j v r| j | }|S td| d S )NzNo such session )rH   r   )r    r3   r*   r!   r!   r"   get_session  s    

zApplicationContext.get_sessionzCallable[[ServerSession], bool])r*   should_discardr   c              
     s   j dkrtdtdjj  jj }dd fdd}|I d H  |jrz j	
|I d H  W n4 ty } ztjd|d	d
 W Y d }~n
d }~0 0 d S )Nr   z8Should not be discarding a session with open connectionsz5Discarding session %r last in use %r milliseconds agor   r$   c                     s\   rDj dkrD   jj=  jj= tdjd ntdjd d S )Nr   zSession z was successfully discardedz/ was scheduled to discard but came back to life)Zexpiration_blocked_countdestroyrH   idrJ   rV   tracewarningr!   r    r*   rr   r!   r"   
do_discard  s    

z7ApplicationContext._discard_session.<locals>.do_discardz&Failed to run session destroy hooks %rTrS   )connection_countRuntimeErrorrV   debugrt   #milliseconds_since_last_unsubscriberJ   r@   rC   rO   Zon_session_destroyedrU   rW   )r    r*   rr   rn   rx   rY   r!   rw   r"   _discard_session  s    
&z#ApplicationContext._discard_sessionint)"unused_session_linger_millisecondsr   c                   s   ddd fdd}g }| j  D ]}||r"|js"|| q"t|dkr^tdt|  |D ]$}||rb|jsb| ||I d H  qbd S )Nr   rB   r<   c                   s   | j dko| j kp| jS )Nr   )ry   r|   Zexpiration_requested)r*   r   r!   r"   should_discard_ignoring_block.  s    

zKApplicationContext._cleanup_sessions.<locals>.should_discard_ignoring_blockr   z!Scheduling %s sessions to discard)rH   rR   Zexpiration_blockedr'   rg   rV   r{   r}   )r    r   r   Z
to_discardr*   r!   r   r"   _cleanup_sessions-  s    z$ApplicationContext._cleanup_sessions)NNN)NN)r+   r,   r-   __doc__rF   r#   r.   rM   rL   rN   r4   r&   rZ   r[   rp   rq   r}   r   r!   r!   r!   r"   r      s4   
    ="r   c                      s   e Zd ZU ded< ded< ded< ddd	d
dddddZeddddZeddddZeddddZddd fddZ	  Z
S )rj   zdict[str, list[bytes]]
_argumentszdict[str, str]_cookieszdict[str, str | list[str]]_headersNr	   z%dict[str, bytes | list[bytes]] | Nonezdict[str, str] | Nonez!dict[str, str | list[str]] | Noner   )rD   rf   r]   r^   r   c                 C  s   || _ |d ur|| _nt|dr.t|j| _ni | _d| jv rF| jd= |d urV|| _n(t|drxdd |j D | _ni | _|d ur|| _nt|drt|j	| _ni | _d S )Nrf   zbokeh-session-idr]   c                 S  s&   i | ]\}}|t |tr|n|jqS r!   )
isinstancestrvaluera   r!   r!   r"   
<dictcomp>a      z*_RequestProxy.__init__.<locals>.<dictcomp>r^   )
r0   r   hasattrdictrf   r   r]   ri   r   r^   )r    rD   rf   r]   r^   r!   r!   r"   r#   K  s$    



z_RequestProxy.__init__r$   c                 C  s   | j S r   )r   r%   r!   r!   r"   rf   l  s    z_RequestProxy.argumentsc                 C  s   | j S r   )r   r%   r!   r!   r"   r]   p  s    z_RequestProxy.cookiesc                 C  s   | j S r   )r   r%   r!   r!   r"   r^   t  s    z_RequestProxy.headersr   r   )namer   c                   s0   | ds$t| j|d }|d ur$|S t |S )N_)
startswithgetattrr0   r9   __getattr__)r    r   valr:   r!   r"   r   x  s
    
z_RequestProxy.__getattr__)NNN)r+   r,   r-   rF   r#   r.   rf   r]   r^   r   rG   r!   r!   r:   r"   rj   E  s   
   !rj   )(r   
__future__r   logging	getLoggerr+   rV   r   typingr   r   r   r   r   Ztornador   Ztornado.httputilr	   Ztornado.ioloopr
   Zapplication.applicationr   r   r5   r   Zprotocol.exceptionsr   Z
util.tokenr   r*   r   r   Z
core.typesr   r   __all__r   r   r   rj   r!   r!   r!   r"   <module>   s0   
	5 6