
    YHhH#                    |   d dl m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	 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 d dl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# d dl$m%Z%m&Z& d dl'Z'd dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5 d dl4m6Z7 d dl8m9Z9 d dl:m;Z;m<Z< d dl=m>Z>  ej~                  e@      ZAe	 G d de-             ZB	 d#	 	 	 	 	 	 	 d$dZCd%dZD	 d#	 	 	 	 	 	 	 	 	 d&dZEd'dZFd(dZGd)dZ6	 	 	 	 	 	 	 	 d*dZH	 	 	 	 	 	 	 	 d+dZI	 	 	 	 	 	 	 	 	 	 	 	 d,dZJ G d d e      ZKe	 G d! d"             ZLy)-    )annotationsN)Queue)	dataclass)Event)Thread)AnyCallable
NamedTupleNoReturncast)	BlueprintFlaskRequestcopy_current_request_contextrequest	send_file)CORS)Sock)Server)BaseWSGIServermake_server)ASSETS_PATHMODULES_PATHPATH_PREFIXSTREAM_PATHCommonOptionsread_client_index_htmlsafe_client_build_dir_pathsafe_web_modules_dir_path)
ConnectionLocation)ConnectionContext)use_connection)serve_layout)ComponentTypeRootComponentConstructor)Refc                       e Zd ZU dZdZded<   y)Optionsz@Render server config for :func:`reactpy.backend.flask.configure`Fzbool | dict[str, Any]corsN)__name__
__module____qualname____doc__r*   __annotations__     N/var/www/html/planif/env/lib/python3.12/site-packages/reactpy/backend/flask.pyr)   r)   1   s    J"'D
'r1   r)   c                >   |xs
 t               }t        dt        |        t        t	        t
                    }t        dt        |        t        |j                        }t        |||       t        |||       | j                  |       | j                  |       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
    reactpy_api_)
url_prefixreactpy_spa_N)
r)   r   idr+   strr   r5   #_setup_single_view_dispatcher_route_setup_common_routesregister_blueprint)app	componentoptionsapi_bpspa_bps        r2   	configurerA   =   s     "GbgY/c+FVWF
r#wi (w7I7IF (C16"6"r1   c                 F    dt         j                  d<   t        t              S )z7Create an application instance for development purposestrueFLASK_DEBUG)osenvironr   r+   r0   r1   r2   create_development_apprG   V   s     &BJJ}?r1   c                l   	K   t        j                         t        j                         	t               d 	fd}t	        |d      }|j                          rj                          d{    	 	j                          d{    j                  j                          |j                  d       |j                         rd}t        |      y7 g7 P# j                  j                          |j                  d       |j                         rd}t        |      w xY ww)	z$Run a development server for FastAPIc                    t         d      _        rj                  j                         	 j                  j	                          j                  j                         y # j                  j                         w xY w)NT)threaded)r   currentcall_soon_threadsafesetserve_forever)r<   hostloopportserverstartedstoppeds   r2   
run_serverz)serve_development_app.<locals>.run_serveri   sd    $T4tD%%gkk2	3NN((*%%gkk2D%%gkk2s   A* *BTtargetdaemonN   )timeoutzFailed to shutdown server.returnNone)asyncioget_running_loopr   r'   r   startwaitrK   shutdownjoinis_aliveRuntimeError)
r<   rO   rQ   rS   rU   threadmsgrP   rR   rT   s
   ````   @@@r2   serve_development_apprh   ]   s      ##%DmmoG"%%F3 3 :d3F
LLNlln
$lln 	!A??.Cs##  	 	 	!A??.Cs## s>   A1D4:C";D4 C& C$C& AD4$C& &AD11D4c                 >    t               j                  j                  S )z!A handle to the current websocket)r#   carrier	websocketr0   r1   r2   use_websocketrl      s    ##---r1   c                 >    t               j                  j                  S )zGet the current ``Request``)r#   rj   r   r0   r1   r2   use_requestrn      s    ##+++r1   c                     t               } t        | j                  t              sd| j                   d}t	        |      | S )z#Get the current :class:`Connection`z"Connection has unexpected carrier z&. Are you running with a Flask server?)_use_connection
isinstancerj   _FlaskCarrier	TypeError)connrg   s     r2   r#   r#      s:    DdllM224<<.@fgnKr1   c                   |j                   }|r t        |t              r|ni }t        | fi | | j	                  dt
        j                   d      ddd       }| j	                  dt        j                   d      ddd       }t        |      |j                  r0|j	                  d      |j	                  d      dd	fd              }y y )
N//<path:path>c                0    t        t        d|              S )Nzassets/)r   r   paths    r2   send_assets_dirz-_setup_common_routes.<locals>.send_assets_dir   s    3gdV4DEFFr1   c                .    t        t        |       d      S )Nztext/javascript)mimetype)r   r   ry   s    r2   send_modules_dirz._setup_common_routes.<locals>.send_modules_dir   s    248CTUUr1   z	/<path:_>c                    S Nr0   )_
index_htmls    r2   send_client_dirz-_setup_common_routes.<locals>.send_client_dir   s     r1    )rz   r8   r\   r   )r   r8   r\   r   )
r*   rq   dictr   router   namer   r   serve_index_route)	api_blueprintspa_blueprintr>   cors_optionscors_paramsr{   r~   r   r   s	           @r2   r:   r:      s    
 <<L&0t&Dl"]*k*1[--.l;<G =G 1\../|<=V >V (0J  			S	!			[	)	 
* 
"		 !r1   c                    t        |       }ddfd} |j                  t        j                  d      |        |j                  t        j                   dd      |       y )Nc                t     d fd}d fd}t         |t        j                        d          ||       y )Nc                N    j                  t        j                  |              y r   )sendjsondumps)valuewss    r2   r   zG_setup_single_view_dispatcher_route.<locals>.model_stream.<locals>.send   s    GGDJJu%&r1   c                 J    t        j                   j                               S r   )r   loadsreceive)r   s   r2   recvzG_setup_single_view_dispatcher_route.<locals>.model_stream.<locals>.recv   s    ::bjjl++r1   r   r   r\   r]   )r\   r   )_dispatch_in_threadlenr5   )r   rz   r   r   constructorr>   s   `   r2   model_streamz9_setup_single_view_dispatcher_route.<locals>.model_stream   s;    	'	, 	W''(*+M	
r1   without_path)endpointrw   	with_pathr   )r   	WebSocketrz   r8   r\   r]   )r   r   r   r   )r   r>   r   sockr   s    ``  r2   r9   r9      sX     D
  :DJJ{.J9,GGDJJ+""#<0;JGUr1   c                P   	
 t               	t        j                  d       
t        d	
 fd       }t	        |d      j                          	j                          t        t        
j                        t        d      t               dfd}t	        |d      j                          	 	  |       }j                  j                  j                  j                  |       8# j                  j                  j                  j                          w xY w)Nc                 H   t        j                         } t        j                  |        t               t	               dfdd	
fd}t        j
                   |       |       }t        | |      _        j                          | j                  |       y )Nc                0   K   j                  |        y wr   )put)r   thread_send_queues    r2   	send_coroz>_dispatch_in_thread.<locals>.run_dispatcher.<locals>.send_coro   s     !!%(s   c                 B  K   t         j                  j                         } t        t	        j
                  t        t        t         j                  t        d | rd|  nd      t        t                                 j                         d {    y 7 w)Nrv   ?r   )pathnamesearch)scopelocationrj   )r   )r   query_stringdecoder$   reactpyLayoutr"   r    rF   r!   rr   get)r   async_recv_queuer=   rz   r   rk   s    r2   mainz9_dispatch_in_thread.<locals>.run_dispatcher.<locals>.main   s     ))002F%!(")//%-+,TF7=6(|2& %2'9$E
  $$  s   BBBB)rP   )dispatch_loopdispatch_futurer   r   r   r[   )
r^   new_event_loopset_event_loopThreadQueue
AsyncQueueensure_future_DispatcherThreadInforK   rM   run_until_complete)rP   r   main_futurer   r   r   r=   dispatch_thread_info_createddispatch_thread_info_refrz   rk   s      @@@r2   run_dispatcherz+_dispatch_in_thread.<locals>.run_dispatcher   s    %%'t$.9m,6L	)	 	( ++DF>+@'/-	,
 ( 	%((*,r1   TrV   z"Failed to create dispatcher threadc                     j                         s2  j                  j                                j                         s1y y r   )is_setr   r   )dispatch_thread_infor   stops   r2   run_sendz%_dispatch_in_thread.<locals>.run_send  s/    ++-%77;;=> ++-r1   r[   )ThreadEventr   r'   r   r   r`   ra   r   r   rK   re   r   rL   r   
put_nowaitr   cancel)rk   rz   r=   r   r   r   r   r   r   r   r   r   s   ````    @@@@r2   r   r      s    $/= JQ++K "(- (- "(-T ..446 %%' 57O7W7WX#?@@=D? (4(..0	
FE ..CC$55@@%  	**?? 0077	
s   ;9C4 41D%c                  6    e Zd ZU ded<   ded<   ded<   ded<   y	)
r   zasyncio.AbstractEventLoopr   zasyncio.Future[Any]r   zThreadQueue[Any]r   zAsyncQueue[Any]r   N)r+   r,   r-   r/   r0   r1   r2   r   r      s    ,,((''%%r1   r   c                  (    e Zd ZU dZded<   	 ded<   y)rr   z:A simple wrapper for holding a Flask request and WebSocketr   r   r   rk   N)r+   r,   r-   r.   r/   r0   r1   r2   rr   rr   '  s    D$+r1   rr   r   )r<   r   r=   r&   r>   zOptions | Noner\   r]   )r\   r   )
r<   r   rO   r8   rQ   intrS   zasyncio.Event | Noner\   r]   )r\   r   )r\   r   )r\   zConnection[_FlaskCarrier])r   r   r   r   r>   r)   r\   r]   )r   r   r>   r)   r   r&   r\   r]   )rk   r   rz   r8   r=   r%   r   zCallable[[Any], None]r   zCallable[[], Any | None]r\   r   )M
__future__r   r^   r   loggingrE   r   r   dataclassesr   queuer   	threadingr   r   r   typingr   r	   r
   r   r   flaskr   r   r   r   r   r   
flask_corsr   
flask_sockr   simple_websocketr   r   werkzeug.servingr   r   r   reactpy.backend._commonr   r   r   r   r   r   r   r   reactpy.backend.typesr    r!   reactpy.core.hooksr"   r#   rp   reactpy.core.server$   reactpy.core.typesr%   r&   reactpy.utilsr'   	getLoggerr+   loggerr)   rA   rG   rh   rl   rn   r:   r9   r   r   rr   r0   r1   r2   <module>r      s   "    	 ' ! & *  < <    0 8 	 	 	 7 0 @ + F 			8	$ m   PT#	#3#>L#	#2 %)	%$	%$
%$ %$ "	%$
 
%$P.
,
  
	8VV'.V=UV	V2P
P

P
 P
  	P

 #P
 P
f&J & , , ,r1   