
    -e9                    b   d Z ddlmZ ddlZ ej        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	rd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	rddlmZ ddl m!Z! ddlm"Z" dZ# G d de          Z$ G d de          Z% G d d          Z& G 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                  F    e Zd ZddZedd            Zedd	            Zd
S )r   application_contextr   returnNonec                8    t          j        |          | _        d S N)weakrefref_application_context)selfr   s     5lib/python3.11/site-packages/bokeh/server/contexts.py__init__zBokehServerContext.__init__K   s    $+K0C$D$D!!!    ApplicationContext | Nonec                *    |                                  S r   )r"   r#   s    r$   r   z&BokehServerContext.application_contextN   s    ((***r&   list[ServerSession]c                Z    g }| j         }|r|j        D ]}|                    |           |S r   )r   sessionsappend)r#   resultcontextsessions       r$   r,   zBokehServerContext.sessionsR   sC    &(* 	'"+ ' 'g&&&&r&   N)r   r   r   r   )r   r'   )r   r*   )__name__
__module____qualname__r%   propertyr   r,    r&   r$   r   r   J   sl        E E E E + + + X+    X  r&   r   c                       e Zd ZU ded<   ded<   ded<   	 dd  fdZd!dZd"dZed#d            Zed$d            Z	ed%d            Z
ed&d            Zed'd            Z xZS )(r   ServerSession | None_session_RequestProxy | None_request
str | None_tokenN
session_idr   server_contextr   documentr   
logout_urlr   r   c                    || _         d | _        || _        t                                          ||           d | _        d | _        d S r   )	_documentr8   _logout_urlsuperr%   r:   r<   )r#   r=   r>   r?   r@   	__class__s        r$   r%   zBokehSessionContext.__init__a   sE    !%444r&   r0   r   c                    || _         d S r   r8   )r#   r0   s     r$   _set_sessionz BokehSessionContext._set_sessionk   s    r&   func%Callable[[Document], Awaitable[None]]c                   K   | j          || j                   d {V  d S | j                             || j                   d {V  d S r   )r8   rB   with_document_locked)r#   rI   s     r$   with_locked_documentz(BokehSessionContext.with_locked_documentn   sl      =  $t~&&&&&&&&&&&-44T4>JJJJJJJJJJJr&   boolc                ,    | j         dS | j         j        S )NF)r8   	destroyedr)   s    r$   rP   zBokehSessionContext.destroyedv   s    = 5=**r&   c                    | j         S r   )rC   r)   s    r$   r@   zBokehSessionContext.logout_url~   s    r&   c                    | j         S r   )r:   r)   s    r$   requestzBokehSessionContext.request   
    }r&   r   c                <    | j         J t          | j                   S r   )r<   r   r)   s    r$   token_payloadz!BokehSessionContext.token_payload   s     {&&& ---r&   c                    | j         S r   rG   r)   s    r$   r0   zBokehSessionContext.session   rT   r&   r   )
r=   r   r>   r   r?   r   r@   r;   r   r   )r0   r   r   r   )rI   rJ   r   r   )r   rN   r   r;   )r   r9   )r   r   )r   r7   )r1   r2   r3   __annotations__r%   rH   rM   r4   rP   r@   rS   rV   r0   __classcell__rE   s   @r$   r   r   [   s9        """""""" :>             K K K K + + + X+       X     X . . . X.    X    r&   r   c                      e Zd ZU dZded<   ded<   ded<   ded	<   	 	 d,d-dZed.d            Zed/d            Zed0d            Z	ed1d            Z
ed2d            Zd3dZd3dZ	 	 d4d5d#Zd6d$Zd7d(Zd8d+Zd
S )9r   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_contextNapplicationr   io_loopIOLoop | Noneurlr;   r@   c                    || _         || _        i | _        i | _        i | _        t          |           | _        || _        || _        d S r   )	_application_loopr]   r^   r_   r   r`   _urlrC   )r#   ra   rb   rd   r@   s        r$   r%   zApplicationContext.__init__   sM    '
!#!#1$77	%r&   r   c                    | j         S r   )rg   r)   s    r$   rb   zApplicationContext.io_loop   s
    zr&   c                    | j         S r   )rf   r)   s    r$   ra   zApplicationContext.application   s      r&   c                    | j         S r   )rh   r)   s    r$   rd   zApplicationContext.url   s
    yr&   c                    | j         S r   )r`   r)   s    r$   r>   z!ApplicationContext.server_context   s    ##r&   Iterable[ServerSession]c                4    | j                                         S r   )r]   valuesr)   s    r$   r,   zApplicationContext.sessions   s    ~$$&&&r&   r   c                    	 | j                             | j                   d S # t          $ r*}t                              d|d           Y d }~d S d }~ww xY w)NzError in server loaded hook Texc_info)rf   on_server_loadedr>   	Exceptionlogerrorr#   es     r$   run_load_hookz ApplicationContext.run_load_hook   s|    	K..t/BCCCCC 	K 	K 	KII:Q::TIJJJJJJJJJ	K   # 
AAAc                    	 | j                             | j                   d S # t          $ r*}t                              d|d           Y d }~d S d }~ww xY w)NzError in server unloaded hook Trq   )rf   on_server_unloadedr>   rt   ru   rv   rw   s     r$   run_unload_hookz"ApplicationContext.run_unload_hook   s|    	M001DEEEEE 	M 	M 	MII<q<<tILLLLLLLLL	Mrz   r=   r   rS   HTTPServerRequest | Nonetokenr   c                  K   t          |          dk    rt          d          || j        vr|| j        vrt	          j                    x}| j        |<   t                      }t          || j        || j	                  }||rt          |          ni }d|v rNd|v rJd|d         vr@d                    d |d                                         D                       |d         d<   t          ||                    d	          |                    d          |                    d          
          |_        ||_        t#          j        |          |_        	 | j                            |           d {V  n4# t,          $ r'}t.                              d|d           Y d }~nd }~ww xY w| j                            |           t5          ||| j        |          }	| j        |= |	| j        |<   |                    |	           || j        |<   |                    |	           || j        v r| j        |          d {V }	n| j        |         }	|	S )Nr   zSession ID must not be empty)r@   cookiesheadersCookiez; c                "    g | ]\  }}| d | S )=r5   .0kvs      r$   
<listcomp>z?ApplicationContext.create_session_if_needed.<locals>.<listcomp>   s3     > > >'+q!1

q

> > >r&   	arguments)r   r   r   z'Failed to run session creation hooks %rTrq   )rb   r   )lenr   r]   r^   r	   Futurer   r   r>   rC   r   joinitems_RequestProxygetr:   r<   r    r!   _session_contextrf   on_session_createdrt   ru   rv   initialize_documentr   rg   rH   r_   
set_result)
r#   r=   rS   r   futuredocsession_contextpayloadrx   r0   s
             r$   create_session_if_neededz+ApplicationContext.create_session_if_needed   s      z??a >???T^++T333:=*,,FFT+J7**C1*262E25=A=MO O OO "6;C+E222((Y'-A-A 	(:::3799 > >/6y/A/G/G/I/I> > > 4 4GI&x0 ,9CJ;;{C[C[AHYAWAWAHYAWAW,Y ,Y ,Y( &+O" $+;#?#?C W'::?KKKKKKKKKK W W W		CQQU	VVVVVVVVW 11#666#JTZuUUUG&z2)0DN:&((1111@D":. g&&&/// !2:>>>>>>>GGnZ0Gs    E; ;
F,F''F,c                V    || j         v r| j         |         }|S t          d|z             )NzNo such session )r]   r   )r#   r=   r0   s      r$   get_sessionzApplicationContext.get_session  s4    ''nZ0GN 2Z ?@@@r&   r0   should_discardCallable[[ServerSession], bool]c                   K   j         dk    rt          d          t                              dj        j                    j        j                 }d
 fd}                    |           d {V  |j        rV	  j	        
                    |           d {V  n4# t          $ r'}t                              d|d	           Y d }~nd }~ww xY wd S )Nr   z8Should not be discarding a session with open connectionsz5Discarding session %r last in use %r milliseconds agor   r   c                                r^j         dk    rS                                  j        j        =  j        j        = t
                              dj        d           d S t
                              dj        d           d S )Nr   zSession z was successfully discardedz/ was scheduled to discard but came back to life)expiration_blocked_countdestroyr]   idr_   ru   tracewarning)r#   r0   r   s   r$   
do_discardz7ApplicationContext._discard_session.<locals>.do_discard  s     ~g&& f7+Kq+P+P!!!N7:.*7:6		NWZNNNOOOOOdwzdddeeeeer&   z&Failed to run session destroy hooks %rTrq   r   r   )connection_countRuntimeErrorru   debugr   #milliseconds_since_last_unsubscriber_   rL   rP   rf   on_session_destroyedrt   rv   )r#   r0   r   r   r   rx   s   ```   r$   _discard_sessionz#ApplicationContext._discard_session  sJ     #a''YZZZ		I7:W^  XC  	D  	D  	D0<	f 	f 	f 	f 	f 	f 	f 	f **:666666666 $ 	VV'<<_MMMMMMMMMM V V V		BAPT	UUUUUUUUV ts    B$ $
C.CC"unused_session_linger_millisecondsintc                  K   dfd}g }| j                                         D ])} ||          r|j        s|                    |           *t	          |          dk    r*t
                              dt	          |          z             |D ]0} ||          r#|j        s|                     ||           d {V  1d S )	Nr0   r   r   rN   c                >    | j         dk    o| j        k    p| j        S )Nr   )r   r   expiration_requested)r0   r   s    r$   should_discard_ignoring_blockzKApplicationContext._cleanup_sessions.<locals>.should_discard_ignoring_block.  s/    +q0 /<?aa .-/r&   r   z!Scheduling %s sessions to discard)r0   r   r   rN   )r]   ro   expiration_blockedr-   r   ru   r   r   )r#   r   r   
to_discardr0   s    `   r$   _cleanup_sessionsz$ApplicationContext._cleanup_sessions-  s	     	/ 	/ 	/ 	/ 	/ 	/
 +-
~,,.. 	+ 	+G,,W55 +g>X +!!'***z??QII9C
OOKLLL! 	T 	TG,,W55 Tg>X T++G5RSSSSSSSSStr&   NNN)ra   r   rb   rc   rd   r;   r@   r;   )r   rc   )r   r   rX   )r   r   )r   rm   r   )NN)r=   r   rS   r~   r   r;   r   r   )r=   r   r   r   )r0   r   r   r   r   r   )r   r   r   r   )r1   r2   r3   __doc__rY   r%   r4   rb   ra   rd   r>   r,   ry   r}   r   r   r   r   r5   r&   r$   r   r      s          '&&&::::////''''JN=A	& 	& 	& 	& 	&    X ! ! ! X!    X $ $ $ X$ ' ' ' X'K K K KM M M M bf $; ; ; ; ;zA A A A       D     r&   r   c                       e Zd ZU ded<   ded<   ded<   	 	 	 dddZedd            Zedd            Zedd            Zd fdZ	 xZ
S ) r   dict[str, list[bytes]]
_argumentsdict[str, str]_cookiesdict[str, str | list[str]]_headersNrS   r
   r   %dict[str, bytes | list[bytes]] | Noner   dict[str, str] | Noner   !dict[str, str | list[str]] | Noner   r   c                   || _         ||| _        n1t          |d          rt          |j                  | _        ni | _        d| j        v r| j        d= ||| _        n@t          |d          r)d |j                                        D             | _        ni | _        |	|| _        d S t          |d          rt          |j	                  | _        d S i | _        d S )Nr   zbokeh-session-idr   c                R    i | ]$\  }}|t          |t                    r|n|j        %S r5   )
isinstancestrvaluer   s      r$   
<dictcomp>z*_RequestProxy.__init__.<locals>.<dictcomp>a  s3    iiiAQZ3%7%7 DQWiiir&   r   )
r:   r   hasattrdictr   r   r   r   r   r   )r#   rS   r   r   r   s        r$   r%   z_RequestProxy.__init__K  s       'DOOWk** 	!"7#455DOO DO00 23#DMMWi(( 	iiQXQ`QfQfQhQhiiiDMMDM#DMMMWi(( 	 11DMMMDMMMr&   c                    | j         S r   )r   r)   s    r$   r   z_RequestProxy.argumentsl  s
    r&   c                    | j         S r   )r   r)   s    r$   r   z_RequestProxy.cookiesp  rT   r&   c                    | j         S r   )r   r)   s    r$   r   z_RequestProxy.headerst  rT   r&   namer   r   c                    |                     d          st          | j        |d           }||S t                                          |          S )N_)
startswithgetattrr:   rD   __getattr__)r#   r   valrE   s      r$   r   z_RequestProxy.__getattr__x  sL    s## 	$-t44C
ww""4(((r&   r   )
rS   r
   r   r   r   r   r   r   r   r   )r   r   )r   r   )r   r   )r   r   r   r   )r1   r2   r3   rY   r%   r4   r   r   r   r   rZ   r[   s   @r$   r   r   E  s         &&&&((((
 <@)-59    B    X    X    X) ) ) ) ) ) ) ) ) )r&   r   )(r   
__future__r   logging	getLoggerr1   ru   r    typingr   r   r   r   r   tornador	   tornado.httputilr
   tornado.ioloopr   application.applicationr   r   r?   r   protocol.exceptionsr   
util.tokenr   r0   r   r   
core.typesr   r   __all__r   r   r   r   r5   r&   r$   <module>r      s/    # " " " " " g!!                     &222222%%%%%% D C C C C C C C       / / / / / / * * * * * * " " " " " " *555555))))))$       "2 2 2 2 2. 2 2 2jo o o o o o o oj8) 8) 8) 8) 8) 8) 8) 8) 8) 8)r&   