
    Be)'                       d dl mZ d dlZd dlZd dl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 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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$ ddl%m&Z&m'Z' ddl(m)Z)m(Z(  ej*        e+          Z,eeeefZ-ej.         G d d                      Z/ G d de          Z0d*dZ1d+dZ2d,dZ3d,d Z4d-d#Z5d$ Z6d% Z7ed.d'            Z8ed/d0d)            Z9dS )1    )annotationsN)contextmanager)partialwraps)CallableIteratorListOptional)SessionContext)Document)ColumnDataChangedEventColumnsPatchedEventColumnsStreamedEventDocumentChangedEventModelChangedEvent)CustomJS   )config)param_watchers   )LOADING_INDICATOR_CSS_CLASS)holdmonkeypatch_events)curdoc_lockedstatec                  .    e Zd ZU ded<   ded<   ded<   dS )Requestdictheaderscookies	argumentsN)__name__
__module____qualname____annotations__     1lib/python3.11/site-packages/panel/io/document.pyr   r   *   s0         NNNNNNr'   r   c                  X     e Zd Zdd fd
Zd Zed	d            Zed             Z xZS )
MockSessionContextN)documentc               N    || _          t                      j        |d d d| d S )N)server_context
session_id)	_documentsuper__init__)selfr+   argskwargs	__class__s       r(   r1   zMockSessionContext.__init__3   s3    !$tOOOOOOOr'   c                    d S Nr&   )r2   r3   s     r(   with_locked_documentz'MockSessionContext.with_locked_document7   s    r'   returnboolc                    dS )NFr&   r2   s    r(   	destroyedzMockSessionContext.destroyed:   s    ur'   c                &    t          i i i           S )N)r   r    r!   )r   r<   s    r(   requestzMockSessionContext.request>   s    r2<<<<r'   )r9   r:   )	r"   r#   r$   r1   r8   propertyr=   r?   __classcell__)r5   s   @r(   r*   r*   1   s        '+ P P P P P P P      X = = X= = = = =r'   r*   docr   eventsList[DocumentChangedEvent]r9   Nonec                D    |D ]}| j                             |           dS )z\
    Handles dispatch of events which could not be processed in
    unlocked decorator.
    N)	callbackstrigger_on_change)rB   rC   events      r(   _dispatch_eventsrJ   C   s6    
  / /''..../ /r'   Tc                   | j         D ]}	  |d            # t          $ r Y w xY wt          | j        d          ri | j        j        d <   ddlm} i }t          t          j	        
                                          D ]\  }\  }}}}	|| u r|                    |           t          ||          rCg |_        |                                D ]'}
g |
_        t          |
i            i |
_        i |
_        (t          |i            i |_        i |_        ||| |	f||<   |t          _	        |sd S | t          j        v r&t          j        |          }i |_        t          j        | = |                     d            d S )N_change_callbacksr   )Viewable)session_destroyed_callbacks	ExceptionhasattrrG   rL   viewablerM   listr   _viewsitems_cleanup
isinstance_hooksselectr   
_documents_internal_callbacks
_templatesdestroy)rB   r\   callbackrM   viewsrefpanerootvdoccommptmpls               r(   _cleanup_docrf   K   s   3  	HTNNNN 	 	 	D	s}122 302'- $#####E)-el.@.@.B.B)C)C 1 1%%dD$3;;MM$$)) /  / /A!AH"1b)))#%AL,.A))4$$$ DO')D$$c40E#JJEL   e$S! KKs   
$$Optional[Document]c                    | pt                      }|t                      }nt          |t                    s|j        }|S r7   )r   r   rV   _doc)rB   curdocs     r(   create_doc_if_none_existsrk   z   s>    #MOOF~)) Mr'   c           
     2   t          |           }|j        s|S t          j                    }|r|j        t
          j        |<   t          j        r:|	                    dt          dt          dt          j        d                     |j        j        }t
          j        d         }||vr|S ||                             dt           j                                                                        i           |                    dt
          j                   |S )Ndocument_readyze
            const body = document.getElementsByTagName('body')[0]
            body.classList.remove(z, z)
            )codesessionsstarted)rk   session_context	threadingcurrent_threadidentr   _thread_id_r   global_loading_spinnerjs_on_eventr   r   loading_spinneridsession_infoupdatedtdatetimenow	timestampon_event_init_session)rB   rj   threadr.   ro   s        r(   init_docr      s*   &s++F! %''F 1$*L&!$ 
h -#>- -DJDZ- - -   	
 	
 	
 '*J!*-H!!Z2;??$$..00!    OO$e&9:::Mr'   funcr   c                     t          j                   rt                      fd            }nt                      fd            }d|_        |S )a)  
    Wrap a callback function to execute with a lock allowing the
    function to modify bokeh models directly.

    Arguments
    ---------
    func: callable
      The callable to wrap

    Returns
    -------
    wrapper: callable
      Function wrapped to execute without a Document lock.
    c                 $   K    | i | d {V S r7   r&   r3   kwr   s     r(   wrapperzwith_lock.<locals>.wrapper   s.      t*r*********r'   c                      | i |S r7   r&   r   s     r(   r   zwith_lock.<locals>.wrapper   s    4$$$$r'   T)inspectiscoroutinefunctionr   lock)r   r   s   ` r(   	with_lockr      s}     "4(( %	t	+ 	+ 	+ 	+ 
	+ 	+ 
t	% 	% 	% 	% 
	%GLNr'   c           	     8   ddl m} | j        }t          |dd          }|r|                                rg S | j                            d|          }|                    ||j                  |                    ||j	                  |                    ||j
                  g}|j        D ]p}t          j        |j                  }|                                }	|                    |                    ||          |                    ||	d          g           q|S )Nr   )WebSocketHandlerws_connectionF	PATCH-DOCT)binary)tornado.websocketr   _socketgetattr
is_closingprotocolcreatewrite_messageheader_jsonmetadata_jsoncontent_json_buffersjsondumpsr_   to_bytesextend)
connrC   r   socketws_connmsgfuturesbufferheaderpayloads
             r(   dispatch_tornador      s0   222222\Ffou55G g((** 	
-

{F
3
3C&&vs??&&vs/@AA&&vs/?@@G
 ,  FJ''//##**66::**674*HH
 	 	 	 	 Nr'   c                   | j         }| j                            d|          }|                    |j                  |                    |j                  |                    |j                  g}|j        D ]n}t          j	        |j
                  }|                                }|                    |                    |          |                    |          g           o|S )Nr   )	text_data)binary_data)r   r   r   sendr   r   r   r   r   r   r_   r   r   )r   rC   r   r   r   r   r   r   s           r(   dispatch_djangor      s    \F
-

{F
3
3Cco..c/00c.//G
 ,  FJ''//##KK&K))KKGK,,
 	 	 	 	 Nr'   r   c            
   #  \  K   t           j        } t          | dd          }t          |dd          }| ||t           j        rdV  dS | j        j        rdV  t          | j        j                   dS ddlm	m
} |j        }|                                  	 dV  d}|D ]2}|j        }t          |d          r|j        j        j        dk    rd} n3| j        j        }t          |           g g }
}	|D ]D}t%          |t&                    r|s|
                    |           /|	                    |           Eg |D ]A}|
st%          |j        |          rt+          ||
          z  .t-          ||
          z  Bfd	}rlt          j        |           rC	 t1          j         |                       n:# t4          $ r |                     |           Y nw xY w|                     |           |	| j        _        	 |                                  dS # t4          $ r2 |	r,|                     t;          t<          | |	                     Y dS Y dS w xY w# 	 |                                  w # t4          $ r0 |	r+|                     t;          t<          | |	                     Y w Y w w xY wxY w)
z
    Context manager which unlocks a Document and dispatches
    ModelChangedEvents triggered in the context body to all sockets
    on current sessions.
    rq   Nsessionr   )WebSocketClosedErrorr   F
write_lockTc                    K   D ]_} 	 |  d {V  # $ r t                               d           Y -t          $ r'}t                               d|            Y d }~Xd }~ww xY wd S )Nz/Failed sending message as connection was closedz/Failed sending message due to following error: )loggerwarningrO   )futureer   r   s     r(   handle_write_errorsz%unlocked.<locals>.handle_write_errors  s      ! Z ZZ LLLLLLLL+ V V VNN#TUUUUU  Z Z ZNN#XUV#X#XYYYYYYYYZZ Zs   A#	A#AA#)r   rj   r   _jupyter_kernel_contextrG   
hold_valuer   _held_eventsr   r   r   _subscribed_connectionsr   r   rP   r   _block_valuerV   DISPATCH_EVENTSappendr   r   
_unblockedasyncioensure_futureRuntimeErroradd_next_tick_callbackunholdr   rJ   )rj   rq   r   r   connectionslockedr   r   rC   remaining_eventsdispatch_eventsrI   r   r   r   s                @@r(   unlockedr      s      \Ff&7>>Ooy$77G~0GOuGdO			$ 6+8999HHHHHHHH1K
KKMMM5c 	 	D\Fv|,, 1B1I1PTU1U1U!.6""",./ 	/ 	/E%11 /& /&&u---- ''.... 	B 	BD" BDL*:;; B+D/BBB?4AAA	Z 	Z 	Z 	Z 	Z 	Z  	C'' CG)*=*=*?*?@@@@# G G G112EFFFFFG --.ABBB(8%	cMMOOOOO 	c 	c 	c c--g6FP`.a.abbbbbbc c c	c	cMMOOOO 	c 	c 	c c--g6FP`.a.abbbbbc c	csg   DI F; :I ;GI G$I H 5IIJ+I.-J+.5J(#J+'J((J+Document | Nonec              #  B  K   | pt           j        } | r| j        sdV  dS | j        j        }| j        j        }g | j        _        | j                                         t                      5  dV  ddd           n# 1 swxY w Y   || j        _        || j        _        dS )a$  
    Context manager to trigger immediate dispatch of events triggered
    inside the execution context even when Document events are
    currently on hold.

    Arguments
    ---------
    doc: Document
        The document to dispatch events on (if `None` then `state.curdoc` is used).
    N)r   rj   _session_contextrG   r   _holdr   r   )rB   
old_eventshelds      r(   immediate_dispatchr   +  s       
C  c* +J=D!#CMM	                CM!+CMs   +A<<B B )rB   r   rC   rD   r9   rE   )T)rB   rg   r9   r   )r   r   r9   r   )r9   r   r7   )rB   r   ):
__future__r   r   dataclassesr}   r|   r   r   loggingrr   
contextlibr   	functoolsr   r   typingr   r   r	   r
   bokeh.application.applicationr   bokeh.document.documentr   bokeh.document.eventsr   r   r   r   r   bokeh.modelsr   r   utilr   loadingr   modelr   r   r   r   	getLoggerr"   r   r   	dataclassr   r*   rJ   rf   rk   r   r   r   r   r   r   r&   r'   r(   <module>r      s   " " " " " "                 % % % % % % $ $ $ $ $ $ $ $            9 8 8 8 8 8 , , , , , ,              " ! ! ! ! !       ! ! ! ! ! ! 0 0 0 0 0 0 + + + + + + + + ' ' ' ' ' ' ' '		8	$	$ /1E
        = = = = = = = =$/ / / /) ) ) )^      8   4  *  " Jc Jc Jc JcX , , , , , , ,r'   