
    e1                    d   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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) ddl*m+Z+m,Z, ddl-m.Z.m-Z- erd dl/m0Z0  ej1        e2          Z3eeee fZ4g Z5 ej6                    Z7ej8         G d d                      Z9 G d de          Z:d Z;d8dZ<d9d Z=d! Z>d" Z?d# Z@d:d%ZAd:d&ZBd;d)ZCd<d*ZDd<d+ZEed=d-            ZFed>d?d/            ZGed@dAd7            ZHdS )B    )annotationsN)contextmanager)partialwraps)TYPE_CHECKINGAnyCallableDictIteratorListOptional)SessionContext)Document)ColumnDataChangedEventColumnsPatchedEventColumnsStreamedEventDocumentChangedEventModelChangedEvent) visit_immediate_value_references)CustomJS   )config)param_watchers   )LOADING_INDICATOR_CSS_CLASS)holdmonkeypatch_events)curdoc_lockedstate)HasPropsc                  .    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"   1   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__)selfr0   argskwargs	__class__s       r-   r6   zMockSessionContext.__init__:   s3    !$tOOOOOOOr,   c                    d S Nr+   )r7   r8   s     r-   with_locked_documentz'MockSessionContext.with_locked_document>   s    r,   returnboolc                    dS )NFr+   r7   s    r-   	destroyedzMockSessionContext.destroyedA   s    ur,   c                &    t          i i i           S )N)r$   r%   r&   )r"   rA   s    r-   requestzMockSessionContext.requestE   s    r2<<<<r,   )r>   r?   )	r'   r(   r)   r6   r=   propertyrB   rD   __classcell__)r:   s   @r-   r/   r/   8   s        '+ P P P P P P P      X = = X= = = = =r,   r/   c                P    | t           v rt                               |            d S d S r<   )WRITE_TASKSremove)tasks    r-   _cleanup_taskrK   I   s/    {4      r,   docr   eventsList[DocumentChangedEvent]r>   Nonec                D    |D ]}| j                             |           dS )z\
    Handles dispatch of events which could not be processed in
    unlocked decorator.
    N)	callbackstrigger_on_change)rL   rM   events      r-   _dispatch_eventsrT   M   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hasattrrQ   rV   viewablerW   listr   _viewsitems_cleanup
isinstance_hooksselectr   
_documents_internal_callbacks
_templatesdestroy)rL   rf   callbackrW   viewsrefpanerootvdoccommptmpls               r-   _cleanup_docrp   U   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   
$$c                @  K   ddl m} t          4 d{V  | D ]_}	 | d{V  # |$ r t                              d           Y -t
          $ r'}t                              d|            Y d}~Xd}~ww xY w	 ddd          d{V  dS # 1 d{V swxY w Y   dS )zF
    Ensure that all write_message calls are awaited and handled.
    r   )WebSocketClosedErrorNz/Failed sending message as connection was closedz/Failed sending message due to following error: )tornado.websocketrr   
WRITE_LOCKloggerwarningrY   )futuresrr   futurees       r-   _run_write_futuresrz      s      766666 V V V V V V V V 	V 	VFV' R R RPQQQQQ V V VTQRTTUUUUUUUUV	VV V V V V V V V V V V V V V V V V V V V V V V V V V V V V VsC   B%BA6B	A6A1,B1A66B
BBc                   	 t          j         ||i |          }t                              |           |                    t
                     dS # t          $ r' |                     t          |g|R i |           Y dS w xY w)z<
    Schedules tasks that write messages to the socket.
    N)	asyncioensure_futurerH   appendadd_done_callbackrK   RuntimeErroradd_next_tick_callbackr   )rL   funcr8   r9   rJ   s        r-   _dispatch_write_taskr      s    C$TT4%:6%:%:;;4   }----- C C C""74#A$#A#A#A&#A#ABBBBBBCs   AA -BBc                  K   ddl m} i }|                                D ]\  }}|j        }t	          |d          r|j        j        j        dk    r|||<   7t          |j        |          rt          ||          }nt          ||          }t          |           d{V  |sdS t          j        d           d{V  t          | t          | |           dS )z
    Writes messages to a socket, ensuring that the write_lock is not
    set, otherwise re-schedules the write task on the event loop.
    r   WebSocketHandler
write_lock)msgNg{Gz?)rs   r   r^   _socketrZ   r   _block_valuer`   dispatch_tornadodispatch_djangorz   r|   sleepr   _dispatch_msgs)rL   msgsr   	remainingconnr   socketrw   s           r-   r   r      s     
 322222IZZ\\ 	* 	*	c6<(( 	V->-E-LPQ-Q-Q!IdOdl$455 	5&t555GG%d444G )))))))))) 
-

nc9=====r,   Optional[Document]c                    | pt                      }|t                      }nt          |t                    s|j        }|S r<   )r   r   r`   _doc)rL   curdocs     r-   create_doc_if_none_existsr      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)r   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)rL   r   threadr3   r   s        r-   init_docr      s*   &s++F! %''F 1$*L&!$ 
h -#>- -DJDZ- - -   	
 	
 	
 '*J!*-H!!Z2;??$$..00!    OO$e&9:::Mr,   r   r	   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 r<   r+   r8   kwr   s     r-   wrapperzwith_lock.<locals>.wrapper   s.      t*r*********r,   c                      | i |S r<   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           	     <   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   r   ws_connectionF	PATCH-DOCT)binary)rs   r   r   getattr
is_closingprotocolcreatewrite_messageheader_jsonmetadata_jsoncontent_json_buffersjsondumpsri   to_bytesextend)
r   rM   r   r   r   ws_connrw   bufferheaderpayloads
             r-   r   r      s5   222222\Ffou55G g((** 	
{m"";77&&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   ri   r   r   )r   rM   r   r   rw   r   r   r   s           r-   r   r     s    \F
{m"";77co..c/00c.//G
 ,  FJ''//##KK&K))KKGK,,
 	 	 	 	 Nr,   r   c            	   #  t  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	} |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|rSt          j        |           rt/          | t0          |           n(|                     t5          t0          |                     |	| j        _        	 |                                  dS # t8          $ rH |	sY dS i }|D ]#}|	s|j                            d	|	          ||<   $t/          | t>          | |           Y dS w xY w# 	 |                                  w # t8          $ rI |	sY  Y dS i }|D ]#}|	s|j                            d	|	          ||<   $t/          | t>          | |           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.
    r   Nsessionr   r   Fr   Tr   ) r   r   r   _jupyter_kernel_contextrQ   
hold_valuer   _held_eventsrs   r   _subscribed_connectionsr   r   rZ   r   r   r   r`   DISPATCH_EVENTSr~   r   r   
_unblockedr   rz   r   r   unholdr   r   r   r   )r   r   r   r   connectionslockedr   r   rM   remaining_eventsdispatch_eventsrS   rw   r   s                 r-   unlockedr     s      \Ff&7>>Ooy$77G~0GOuGdO			$ 6+89992222221K
KKMMM0G 	 	D\Fv|,, 1B1I1PTU1U1U!.6""",./ 	/ 	/E%11 /& /&&u---- ''.... 	B 	BD" BDL*:;; B+D/BBB?4AAA 	T'' T$V-?IIII--g6H'.R.RSSS(8%	GMMOOOOO 
	G 
	G 
	G# D# Q Q' !]11+?OPPT

 FFFFFF
	G	GMMOOOO 
	G 
	G 
	G# D# Q Q' !]11+?OPPT

 FFFFF
	GsU   EI
 G5 5I?II
J7I! J7!J4-J72?J41J73J44J7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   r   _session_contextrQ   r   _holdr   r   )rL   
old_eventshelds      r-   immediate_dispatchr   a  s       
C  c* +J=D!#CMM	                CM!+CMs   +A<<B B Fmodelr    
propertiesDict[str, Any]forcer?   c              #  0  K   |rdnQddfd}|                                 D ]4\  }}t          t          ||d          |           t          ||           5r| j                                         dV  r| j                                         dS dS )zd
    Freezes the document model references if any of the properties
    are themselves a model.
    r   r   _r    c                    dz  d S )Nr   r+   )r   dirty_counts    r-   
mark_dirtyzfreeze_doc.<locals>.mark_dirty  s    1KKKr,   N)r   r    )r^   r   r   models_push_freeze_pop_freeze)rL   r   r   r   r   keyvaluer   s          @r-   
freeze_docr   }  s        	@	 	 	 	 	 	 %**,, 	@ 	@JC,WUC-F-F
SSS,UJ???? "
!!!	EEE !
     ! !r,   )rL   r   rM   rN   r>   rO   )T)rL   r   r>   r   )r   r	   r>   r	   )NN)r>   r   r<   )rL   r   )F)rL   r   r   r    r   r   r   r?   )I
__future__r   r|   dataclassesr   r   r   r   loggingr   
contextlibr   	functoolsr   r   typingr   r   r	   r
   r   r   r   bokeh.application.applicationr   bokeh.document.documentr   bokeh.document.eventsr   r   r   r   r   bokeh.model.utilr   bokeh.modelsr   r   utilr   loadingr   r   r   r   r   r   bokeh.core.has_propsr    	getLoggerr'   ru   r   rH   Lockrt   	dataclassr"   r/   rK   rT   rp   rz   r   r   r   r   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
 W\^^
       = = = = = = = ="! ! !/ / / /) ) ) )VV V V	C 	C 	C> > >4      8   4   ,   $ EG EG EG EGN , , , , ,6 ! ! ! ! ! ! !r,   