
    @OOf]                       d Z ddlm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 dd
l	mZ  ed      Z ed      ZddZ G d d      Z G d dee   e      Z G d dee   e      ZddZddZy)aq  
This module provides signals, which are a simple dispatching system that allows any number of interested parties
to subscribe to events ("signals").

This is similar to the Blinker library (https://pypi.org/project/blinker/), with the following changes:
  - provides only a small subset of Blinker's functionality
  - supports type hints
  - supports async receivers.
    )annotationsN)	Awaitable)Callable)Any)cast)Generic)	ParamSpec)TypeVarPRc                    t        | d      r-t        t        j                  t        j                  |             S t        j                  |       S )zM
    Like weakref.ref(), but using weakref.WeakMethod for bound methods.
    __self__)hasattrr   weakrefref
WeakMethod)objs    X/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/utils/signals.pymake_weak_refr      s9     sJGKK!3!3C!899{{3    c                  *    e Zd ZddZddZddZd Zy)_SignalMixinc                    g | _         y N	receivers)selfs    r   __init__z_SignalMixin.__init__)   s	    68r   c                P    t        |      }| j                  j                  |       y)z{
        Register a signal receiver.

        The signal will only hold a weak reference to the receiver function.
        N)r   r   append)r   receivers     r   connectz_SignalMixin.connect,   s      !*h'r   c                b    | j                   D cg c]  } |       |k7  s| c}| _         y c c}w r   r   )r   r!   rs      r   
disconnectz_SignalMixin.disconnect5   s#    %)^^Gqsh!GGs   ,,c              /     K   d}| j                   D ]  } |       }| ||i | d} |r(| j                   D cg c]  } |       | c}| _         y y c c}w w)NFTr   )r   argskwargscleanupr   r$   s         r   notifyz_SignalMixin.notify8   sh     >> 	CA}(((	 )-KA13?aKDN Ks   :AA	AAN)returnNone)r!   r   r+   r,   )__name__
__module____qualname__r   r"   r%   r*    r   r   r   r   (   s    9(H	Lr   r   c                  8     e Zd Zd fdZd fdZd fdZ xZS )_SyncSignalc                R    t        j                  |      rJ t        |   |       y r   )asyncioiscoroutinefunctionsuperr"   r   r!   	__class__s     r   r"   z_SyncSignal.connectE   s#    ..x888!r   c                $    t         |   |       y r   r6   r%   r7   s     r   r%   z_SyncSignal.disconnectI       8$r   c                b    t        |   |i |D ]  }|t        j                  |      sJ  y r   )r6   r*   inspectisawaitable)r   r'   r(   retr8   s       r   sendz_SyncSignal.sendL   s8    7>4262 	?C;g&9&9#&>>>	?r   )r!   Callable[P, None]r+   r,   r'   zP.argsr(   zP.kwargsr+   r,   r-   r.   r/   r"   r%   r@   __classcell__r8   s   @r   r2   r2   D   s    "%? ?r   r2   c                  8     e Zd Zd fdZd fdZd fdZ xZS )_AsyncSignalc                $    t         |   |       y r   )r6   r"   r7   s     r   r"   z_AsyncSignal.connectR   s    !r   c                $    t         |   |       y r   r:   r7   s     r   r%   z_AsyncSignal.disconnectU   r;   r   c                   K   t        j                  t        |   |i |D cg c]  }|t	        j
                  |      r| c}  d {    y c c}w 7 
wr   )r4   gatherr6   r*   r=   r>   )r   r'   r(   awsr8   s       r   r@   z_AsyncSignal.sendX   s_     nn !7>4:6:?w':':3'? 
 	
 	
	
s   !A AAAA)r!   #Callable[P, Awaitable[None] | None]r+   r,   rB   rC   rE   s   @r   rG   rG   Q   s    "%
 
r   rG   c                @    t        t        t           t                     S )aK  
    Create a synchronous signal with the given function signature for receivers.

    Example:

        s = SyncSignal(lambda event: None)  # all receivers must accept a single "event" argument.
        def receiver(event):
            print(event)

        s.connect(receiver)
        s.send("foo")  # prints foo
        s.send(event="bar")  # prints bar

        def receiver2():
            ...

        s.connect(receiver2)  # mypy complains about receiver2 not having the right signature

        s2 = SyncSignal(lambda: None)  # this signal has no arguments
        s2.send()
    )r   r2   r   receiver_specs    r   
SyncSignalrQ   c   s    , A..r   c                @    t        t        t           t                     S )a  
    Create an signal that supports both regular and async receivers:

    Example:

        s = AsyncSignal(lambda event: None)
        async def receiver(event):
            print(event)
        s.connect(receiver)
        await s.send("foo")  # prints foo
    )r   rG   r   rO   s    r   AsyncSignalrS   }   s     Q00r   )r   r   r+   zweakref.ReferenceType)rP   rA   r+   z_SyncSignal[P])rP   rM   r+   z_AsyncSignal[P])__doc__
__future__r   r4   r=   r   collections.abcr   r   typingr   r   r   r	   r
   r   r   r   r   r2   rG   rQ   rS   r0   r   r   <module>rX      s~    #    % $     cNCL L L8
?'!*l 
?
71:| 
$/41r   