
    8Cf:                       d dl m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mZmZmZmZmZ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 d dl m!Z!  G d de      Z"e"jF                  jH                  e"jJ                  jH                  e"jL                  jH                  e"jN                  jH                  e"jP                  jH                  fe"jR                  jH                  e"jT                  jH                  e"jV                  jH                  e"jX                  jH                  e"jZ                  jH                  e"j\                  jH                  e"j^                  jH                  e"j`                  jH                  e"jb                  jH                  e"jd                  jH                  e"jf                  jH                  e"jh                  jH                  e"jj                  jH                  e"jl                  jH                  e"jn                  jH                  fe"jp                  jH                  e"jr                  jH                  e"jt                  jH                  hdZ;dZ<d Z= G d de      Z>e G d d             Z? G d de      Z@ G d de      ZAy)    )annotationsN)deque)	dataclass)Enum)isawaitable)AnyDictListOptionalTupleUnioncast)
BaseRouterRoute
RouteGroup)NotFound)path_to_parts)InvalidSignal)error_loggerlogger)SignalHandlerc                  l    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZy)Eventz Event names for the SignalRouterzserver.exception.reportzserver.init.afterzserver.init.beforezserver.shutdown.afterzserver.shutdown.beforezhttp.lifecycle.beginzhttp.lifecycle.completezhttp.lifecycle.exceptionzhttp.lifecycle.handlezhttp.lifecycle.read_bodyzhttp.lifecycle.read_headzhttp.lifecycle.requestzhttp.lifecycle.responsezhttp.routing.afterzhttp.routing.beforezhttp.handler.afterzhttp.handler.beforezhttp.lifecycle.sendzhttp.middleware.afterzhttp.middleware.beforezwebsocket.handler.afterzwebsocket.handler.beforezwebsocket.handler.exceptionN)__name__
__module____qualname____doc__SERVER_EXCEPTION_REPORTSERVER_INIT_AFTERSERVER_INIT_BEFORESERVER_SHUTDOWN_AFTERSERVER_SHUTDOWN_BEFOREHTTP_LIFECYCLE_BEGINHTTP_LIFECYCLE_COMPLETEHTTP_LIFECYCLE_EXCEPTIONHTTP_LIFECYCLE_HANDLEHTTP_LIFECYCLE_READ_BODYHTTP_LIFECYCLE_READ_HEADHTTP_LIFECYCLE_REQUESTHTTP_LIFECYCLE_RESPONSEHTTP_ROUTING_AFTERHTTP_ROUTING_BEFOREHTTP_HANDLER_AFTERHTTP_HANDLER_BEFOREHTTP_LIFECYCLE_SENDHTTP_MIDDLEWARE_AFTERHTTP_MIDDLEWARE_BEFOREWEBSOCKET_HANDLER_AFTERWEBSOCKET_HANDLER_BEFOREWEBSOCKET_HANDLER_EXCEPTION     M/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/sanic/signals.pyr   r      s    *7+-3517939957-/-//3579"?r6   r   )serverhttp	websocketz__generic__.__signal__.%sc                      y Nr5   r5   r6   r7   _blankr=   S   s    r6   c                      e Zd ZdZy)Signalz6A `Route` that is used to dispatch signals to handlersNr   r   r   r   r5   r6   r7   r?   r?   W   s    @r6   r?   c                  j    e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   dZded<   dZded<   d Z	d Z
y)SignalWaiterz3A record representing a future waiting for a signalr?   signalstrevent_definition triggerNOptional[Dict[str, str]]requirementsTbool	exclusivezOptional[asyncio.Future]futurec                  K   t        j                         }|j                         | _        | j                  j
                  j                  j                  |        	 | j                   d{   | j                  j
                  j                  j                  |        S 7 3# | j                  j
                  j                  j                  |        w xY ww)zoBlock until the signal is next dispatched.

        Return the context of the signal dispatch, if any.
        N)	asyncioget_running_loopcreate_futurerL   rC   ctxwaitersappendremove)selfloops     r7   waitzSignalWaiter.waitg   s     
 '')((*&&t,	1$KKOO##**40 %KKOO##**40s0   ACB! +B,B! /0CB! !1CCc                    |d u xr | j                    xs$ |d u xr | j                   xs || j                  k(  xr | j                  xs || j                  k(  S r<   )rK   rI   rG   rE   )rU   event	conditions      r7   matcheszSignalWaiter.matchest   sg    $5t~~#5 .T!;$*;*;&;.D---? ||=u(=(==		?r6   )r   r   r   r   __annotations__rG   rI   rK   rL   rW   r[   r5   r6   r7   rB   rB   [   sD    =NGS-1L*1It'+F$+1?r6   rB   c                      e Zd ZdZy)SignalGroupz;A `RouteGroup` that is used to dispatch signals to handlersNr@   r5   r6   r7   r^   r^   |   s    Er6   r^   c                      e Zd ZdZd fdZedd       Z	 d	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZdddddd		 	 	 	 	 	 	 	 	 	 	 	 	 dd
Z		 	 d	 	 	 	 	 	 	 ddZ
ddZ	 	 ddd	 	 	 	 	 	 	 	 	 	 	 d fdZdd fdZddZd dZ xZS )!SignalRouterz;A `BaseRouter` that is used to dispatch signals to handlersc                l    t         |   dt        t        d       d| _        d | j
                  _        y )N.T)	delimiterroute_classgroup_classstacking)super__init__r?   r^   allow_fail_builtinrQ   rV   )rU   	__class__s    r7   rh   zSignalRouter.__init__   s6    #	 	 	
 #'r6   c                j    t        | t              rt        | j                        } d| vr	t        | z  } | S )zEnsure event strings in proper format

        Args:
            event (str): event string

        Returns:
            str: formatted event string
        rb   )
isinstancer   rD   valueGENERIC_SIGNAL_FORMAT)rY   s    r7   format_eventzSignalRouter.format_event   s3     eT"$Ee)E1Er6   Nc                   | j                  |      }|xs i }	 | j                  d| | j                  | i i d|      \  }}|d   }|s=|j                  j                         D 	
ci c]  \  }	}
|
j                  |d   |	    }}	}
||D cg c]  }|j                   c}|fS # t        $ r5 d}|g}|r|dz  }|j	                  |       t        |t        |      z        w xY wc c}
}	w c c}w )a  Get the handlers for a signal

        Args:
            event (str): The event to get the handlers for
            condition (Optional[Dict[str, str]], optional): A dictionary of conditions to match against the handlers. Defaults to `None`.

        Returns:
            Tuple[SignalGroup, List[SignalHandler], Dict[str, Any]]: A tuple of the `SignalGroup` that matched, a list of the handlers that matched, and a dictionary of the params that matched

        Raises:
            NotFound: If no handlers are found
        rb   )
__params____matches__extrazCould not find signal %sz with %srq   rr   )
ro   
find_routeDEFAULT_METHODr   rS   tupleparamsitemsnamehandler)rU   rY   rZ   rt   groupparam_basketmessagetermsrx   idxparamroutes               r7   getzSignalRouter.get   s   " !!%(R	3"&//E7##!"5 #2 #E<" l+ #(,,"4"4"6C 

L7<<F 
 %8u}}8&@@)  	30GAFE:%U#7U5\122	3
 9s   )B# &C$C*#>C!TFc                  K   | j                  |      }	 | j                  ||      \  }}}|r|j                  |       |j                  dd        |j                   }|s|d d d   }	 |D ]T  }|j                  j"                  D ]9  }|j%                  ||      s|j&                  j)                  t+        |             ; V |D ]  }|j,                  j.                  }||j                  j0                  du s
||r||k(  s=|j                  j2                  s||j                  j4                  k(  sm |j6                  di |}t9        |      r| d {   }|s|c S |s|c S  y # t        $ r}	|j                  dd      d   t        v }
|r|
r| j
                  r|	| j                  j                  j                  rK| j                  j                  j                  j                  dk\  rt        j                  t        |	             Y d }	~	y d }	~	ww xY w7 # t:        $ r}	| j                  j                  j                  rB| j                  j                  j                  j                  dk\  rt        j<                  |	       |t>        j@                  jB                  k7  rC| jE                  t>        j@                  jB                  d|	i	       d {  7   tG        |	d
d       |	d }	~	ww xY ww)N)rZ   rb      r   __trigger__F	exception)context__dispatched__Tr5   )$ro   r   r   splitRESERVED_NAMESPACESri   rQ   appdebugstate	verbosityr   warningrD   updatepoproutesrR   r[   rL   
set_resultdictrt   rI   rK   rG   
definitionr{   r   	Exceptionr   r   r   rm   dispatchsetattr)rU   rY   r   rZ   fail_not_foundreverser|   handlersrx   eis_reservedsignalsrC   waiterrI   maybe_coroutineretvals                    r7   	_dispatchzSignalRouter._dispatch   s     !!%(		&*hhu	h&J#E8V MM'"

=$',,ddmG	! ?$jj00 ?F~~eY700f>??
 " /%||88&6::+?+?5+H!),!\1zz))Ufjj6K6K-K&4fnn&>v&>O"?3'6!6!#)M(../ I  	++c1-a04GGK{d6M6M88<<%%$((,,*<*<*F*F!*K ((Q0	> "7  
	xx||!!dhhll&8&8&B&Ba&G&&q)55;;;mm1177(!, $    +T2G
	s   K,E' ;K,(0H A&H  /H 0"H HH H K,H !H $K,%H &K,'	H0BHK,HK,H 	K) B/K$KK$$K))K,)r   rZ   r   inliner   c               <  K   | j                  |      }| j                  ||||xr ||      }t        j                  d| ddi       |r
| d{   S t	        j
                         j                  |      }t	        j                  d       d{    |S 7 F7 w)a  Dispatch a signal to all handlers that match the event

        Args:
            event (str): The event to dispatch
            context (Optional[Dict[str, Any]], optional): A dictionary of context to pass to the handlers. Defaults to `None`.
            condition (Optional[Dict[str, str]], optional): A dictionary of conditions to match against the handlers. Defaults to `None`.
            fail_not_found (bool, optional): Whether to raise an exception if no handlers are found. Defaults to `True`.
            inline (bool, optional): Whether to run the handlers inline. An inline run means it will return the value of the signal handler. When `False` (which is the default) the signal handler will run in a background task. Defaults to `False`.
            reverse (bool, optional): Whether to run the handlers in reverse order. Defaults to `False`.

        Returns:
            Union[asyncio.Task, Any]: If `inline` is `True` then the return value of the signal handler will be returned. If `inline` is `False` then an `asyncio.Task` will be returned.

        Raises:
            RuntimeError: If the signal is dispatched outside of an event loop
        )r   rZ   r   r   zDispatching signal: r   r   rs   Nr   )ro   r   r   r   rN   rO   create_tasksleep)	rU   rY   r   rZ   r   r   r   r   tasks	            r7   r   zSignalRouter.dispatch
  s     6 !!%(>>)4f " 
 	+E73K;KL!>!'')55h?mmA	 " 	s$   ABB?BBBBc           	        | j                  |      }| j                  |      \  }}}t        t        | j                  j                  |            }|sy |j                  d      r|sd}t        ||||t        |            S )Nz.**)rC   rE   rG   rI   rK   )	ro   _get_event_partsr   r?   
name_indexr   endswithrB   rJ   )	rU   rY   rZ   rK   rE   rz   rG   _rC   s	            r7   
get_waiterzSignalRouter.get_waiter6  s      ,,U3001ABgqfdoo11$78$$T*7G-"9o
 	
r6   c                    | j                  |      }|d   j                  d      r-dj                  g |d d d      }| j                  |d         }n|}d}|sdj                  g |d d d      }|||fS )N   <rb   r   r   rF   z<__trigger__>)_build_event_parts
startswithjoin_clean_trigger)rU   rY   partsrz   rG   s        r7   r   zSignalRouter._get_event_partsL  s    ''.8s#88.eCRj.#./D))%(3GDGHH:uRay:/:;EWe##r6   r   )priorityc                   | j                  |      }| j                  |      \  }}}	t        |   |	||d|      }
||
j                  _        ||
j                  _        ||
j                  _        ||
j                  _	        t        t        |
      S )NT)rz   rS   r   )ro   r   rg   addrQ   rK   rG   r   rt   rI   r   r?   )rU   r{   rY   rZ   rK   r   rE   rz   rG   event_stringrC   rj   s              r7   r   zSignalRouter.addZ  s      ,,U3&*&;&;<L&M#g|  
  )

$

 0

$-!FF##r6   c                   | j                  t        d       	 t        j                         | j                  _        | j                  D ]  }t               |j                  _	         t        | -  ||      S # t        $ r t        d      w xY w)a  Finalize the router and compile the routes

        Args:
            do_compile (bool, optional): Whether to compile the routes. Defaults to `True`.
            do_optimize (bool, optional): Whether to optimize the routes. Defaults to `False`.

        Returns:
            SignalRouter: The router

        Raises:
            RuntimeError: If the router is finalized outside of an event loop
        zsanic.__signal__.__init__z-Cannot finalize signals outside of event loop)
do_compiledo_optimize)r   r=   rN   rO   rQ   rV   RuntimeErrorr   r   rR   rg   finalize)rU   r   r   rC   rj   s       r7   r   zSignalRouter.finalizeu  s     	45	P#446DHHM kk 	)F!&FJJ	) w:;OO  	PNOO	Ps   #A7 7Bc                X   t        || j                        }t        |      dk7  s(|d   j                  d      s|d   j                  d      rt	        d|z        |d   t
        v rD|t
        |d      vr6|d   j                  d      r|d   j                  d      st	        d|z        |S )	N   r   r   r   zInvalid signal event: %sr   >z(Cannot declare reserved signal event: %s)r   rc   lenr   r   r   r   )rU   rY   r   s      r7   r   zSignalRouter._build_event_parts  s    eT^^4J!OQx""3'Qx""3' :U BCC !H++0q::1X((-%(2C2CC2H:UB  r6   c                @    |dd }d|v r|j                  d      \  }}|S )Nr   r   :)r   )rU   rG   r   s      r7   r   zSignalRouter._clean_trigger  s+    !B-'> s+JGQr6   )returnNone)rY   Union[str, Enum]r   rD   r<   )rY   r   rZ   rH   )NNTF)rY   rD   r   Optional[Dict[str, Any]]rZ   rH   r   rJ   r   rJ   r   r   )rY   r   r   r   rZ   rH   r   rJ   r   rJ   r   rJ   r   zUnion[asyncio.Task, Any])NT)rY   r   rZ   r   rK   rJ   r   zOptional[SignalWaiter])rY   rD   r   zTuple[str, str, str])r{   r   rY   r   rZ   r   rK   rJ   r   intr   r?   )TF)r   rJ   r   rJ   )rG   rD   r   rD   )r   r   r   r   rh   staticmethodro   r   r   r   r   r   r   r   r   r   __classcell__)rj   s   @r7   r`   r`      s   E  $ /3/A/A ,/Ah -1.2#:: *: ,	:
 : : 
:@ -1.2#** *	*
 ,* * * * 
"*^ /3	

 ,
 	

 
 
,$$ /3$ $$  $ ,	$
 $ $ 
$6P2&r6   r`   )B
__future__r   rN   collectionsr   dataclassesr   enumr   inspectr   typingr   r	   r
   r   r   r   r   sanic_routingr   r   r   sanic_routing.exceptionsr   sanic_routing.utilsr   sanic.exceptionsr   	sanic.logr   r   sanic.models.handler_typesr   r   r   rm   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r   rn   r=   r?   rB   r^   r`   r5   r6   r7   <module>r      s   "   !   @ @ @ 7 7 - - * * 4@D @< 	%%++%%  &&##))$$** 	""((%%++&&,,##))&&,,&&,,$$**%%++  &&!!''  &&!!''!!''##))$$**$ 	%%++&&,,))//3 @ 4 AU A ? ? ?@F* Fe: er6   