
    YHh                       U d dl mZ d dlZd dl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 d d	lmZ d d
lm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 d dlmZm Z m!Z!m"Z"m#Z#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/ d dl0m1Z1 d dl2m3Z3 e#Z4	 d'	 	 	 	 	 	 	 d(dZ5d)dZ6	 d'	 	 	 	 	 	 	 	 	 d*dZ7d+dZ8d,dZ,dZ9de:d<   d-dZ;	 	 	 	 	 	 	 	 d.d Z<	 	 	 	 	 	 d/d!Z= G d" d#e      Z> G d$ d%e      Z? ed&       Z@y)0    )annotationsN)Queue)Future)Any)urljoin)
HTTPServer)HTTPServerRequest)enable_pretty_logging)AsyncIOMainLoop)ApplicationRequestHandlerStaticFileHandler)WebSocketHandler)WSGIContainer)	TypeAlias)ASSETS_PATHCLIENT_BUILD_DIRMODULES_PATHSTREAM_PATHCommonOptionsread_client_index_html)
ConnectionLocation)REACTPY_WEB_MODULES_DIR)ConnectionContext)use_connection)Layout)serve_layout)ComponentConstructorc                f    |xs
 t               }t        | |t        ||      t        |      z          y)zConfigure the necessary ReactPy routes on the given app.

    Parameters:
        app: An application instance
        component: A component constructor
        options: Options for configuring server behavior
    N)Options_add_handler#_setup_single_view_dispatcher_route_setup_common_routes)app	componentoptionss      P/var/www/html/planif/env/lib/python3.12/site-packages/reactpy/backend/tornado.py	configurer)   (   s7     "G 0	7C"7+,    c                     t        d      S )NT)debug)r    r*   r(   create_development_appr.   A   s    T""r*   c                  K   t                t        j                         j                          t	        |       }|j                  ||       |r|j                          	 t        j                         j                          d {    |j                          |j                          d {    y 7 -7 # |j                          |j                          d {  7   w xY wwN)r
   r   currentinstallr   listensetasyncioget_running_loopcreate_futurestopclose_all_connections)r%   hostportstartedservers        r(   serve_development_appr>   F   s      %%'_F
MM$-&&(66888 	**,,, 	9
 	- 	**,,,sN   AC$%B6 B2B6 	#C$,B4-C$2B6 4C$6$C!CC!!C$c                 *    t               j                  S )z%Get the current ``HTTPServerRequest``)r   carrierr-   r*   r(   use_requestrA   a   s    ###r*   c                     t               } t        | j                  t              sd| j                   d}t	        |      | S )Nz"Connection has unexpected carrier z&. Are you running with a Flask server?)_use_connection
isinstancer@   r	   	TypeError)connmsgs     r(   r   r   f   s;    Ddll$5624<<.@fgnKr*   z+list[tuple[str, type[RequestHandler], Any]]r   _RouteHandlerSpecsc                    t          dt        dt        t        j                        ift
         dt        dt        t        dz        ifg| j                  rdt        dt        |       ifgz   S g z   S )N/(.*)pathassets
index_html)
r   r   strr   r1   r   r   serve_index_routeIndexHandlerr   )r'   s    r(   r$   r$   q   s     ~U#S0889:	
 }E"S)H456	
& $$ 5g>?	
 ( ) r*   c                    |D cg c]'  ^}}t        |j                  |      gt        |      ) }}}| j                  d|       y c c}}w )Nz.*)r   
url_prefixtupleadd_handlers)r%   r'   handlersroute_patternhandler_infoprefixed_handlerss         r(   r"   r"      sX    
 -5$(ML 
##]	3JeL6IJ$ $ U-.	$s   ,Ac                    t          dt        | |j                  dft        t               t        | |j                  dfgS )NrJ   )component_constructorrR   )r   ModelStreamHandlerrR   rN   )constructorr'   s     r(   r#   r#      sN    
 }E"&1ASAST	
 &1ASAST	
 r*   c                  (    e Zd ZU ded<   ddZddZy)rP   rN   _index_htmlc                    || _         y r0   )r^   )selfrM   s     r(   
initializezIndexHandler.initialize   s
    %r*   c                B   K   | j                  | j                         y wr0   )finishr^   )r`   _s     r(   getzIndexHandler.get   s     D$$%s   N)rM   rN   returnNone)rd   rN   rf   rg   )__name__
__module____qualname____annotations__ra   re   r-   r*   r(   rP   rP      s    &&r*   rP   c                  T    e Zd ZU dZded<   ded<   	 	 	 	 	 	 ddZdddZddZdd	Zy
)r[   zIA web-socket handler that serves up a new model stream to each new clientzFuture[None]_dispatch_futurezAsyncQueue[str]_message_queuec                     || _         || _        y r0   )_component_constructor_url_prefix)r`   rZ   rR   s      r(   ra   zModelStreamHandler.initialize   s     '<#%r*   c                   K   t               d	 fd}d
fd} _        t        j                  t	        t        t         j                         t        t        j                   j                        t        d|t         j                        d    j                  j                  rd j                  j                   nd       j                                    ||             _        y w)Nc                j   K   j                  t        j                  |              d {    y 7 wr0   )write_messagejsondumps)valuer`   s    r(   sendz%ModelStreamHandler.open.<locals>.send   s$     $$TZZ%6777s   (313c                 f   K   t        j                   j                          d {         S 7 wr0   )ru   loadsre   )message_queues   r(   recvz%ModelStreamHandler.open.<locals>.recv   s%     ::M$5$5$77887s   #1/	1/? )pathnamesearch)scopelocationr@   )rw   )rw   r   rf   rg   )rf   r   )
AsyncQueuern   r5   ensure_futurer   r   r   rp   r   _FAKE_WSGI_CONTAINERenvironrequestr   lenrq   queryrm   )r`   rK   argskwargsrx   r|   r{   s   `     @r(   openzModelStreamHandler.open   s     )3	8	9 , ' 5 5%335("6">">t||"L%-+,T#d6F6F2G2H-I,J)K (,||'9'9 '((:(:';$<)+& %)LL" '!
s   C,C0c                   K   | j                   j                  t        |t              r|n|j	                                d {    y 7 wr0   )rn   putrD   rN   decode)r`   messages     r(   
on_messagezModelStreamHandler.on_message   s9     !!%%!'3/GW^^5E
 	
 	
s   ?A	AA	c                n    | j                   j                         s| j                   j                          y y r0   )rm   donecancel)r`   s    r(   on_closezModelStreamHandler.on_close   s+    $$))+!!((* ,r*   N)rZ   r   rR   rN   rf   rg   )r   )rK   rN   r   r   r   r   rf   rg   )r   zstr | bytesrf   rg   )rf   rg   )	rh   ri   rj   __doc__rk   ra   r   r   r   r-   r*   r(   r[   r[      s>    S""##&%9&GJ&	& 
D

+r*   r[   c                     t        g       S r0   )iter)akws     r(   <lambda>r      s
    d2h r*   r0   )r%   r   r&   r   r'   zCommonOptions | Nonerf   rg   )rf   r   )
r%   r   r:   rN   r;   intr<   zasyncio.Event | Nonerf   rg   )rf   r	   )rf   zConnection[HTTPServerRequest])r'   r!   rf   rH   )r%   r   r'   r!   rU   rH   rf   rg   )r\   r   r'   r!   rf   rH   )A
__future__r   r5   ru   r   r   asyncio.futuresr   typingr   urllib.parser   tornado.httpserverr   tornado.httputilr	   tornado.logr
   tornado.platform.asyncior   tornado.webr   r   r   tornado.websocketr   tornado.wsgir   typing_extensionsr   reactpy.backend._commonr   r   r   r   r   r   reactpy.backend.typesr   r   reactpy.configr   reactpy.core.hooksr   r   rC   reactpy.core.layoutr   reactpy.core.server   reactpy.core.typesr   r!   r)   r.   r>   rA   rH   rk   r$   r"   r#   rP   r[   r   r-   r*   r(   <module>r      sO   "   ' "    ) . - 4 F F . & '  7 2 0 @ & + 3  %)	# " 
	2# %)	-	-
- - "	-
 
-6$
 !N I M2/	/&/2D/	/%07"&> &5+) 5+x %%>? r*   