§
    Ètºf  ã                   ó�   — d Z ddlmZ ddlmZ  eej        ej        ¦  «         G d„ d¦  «        ¦   «         Z G d„ de¦  «        ZdS )	z
Producer-Consumer Proxy.
é    )Úimplementer)Ú
interfacesc                   ój   — 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efd„ZdS )ÚBasicProducerConsumerProxyaa  
    I can act as a man in the middle between any Producer and Consumer.

    @ivar producer: the Producer I subscribe to.
    @type producer: L{IProducer<interfaces.IProducer>}
    @ivar consumer: the Consumer I publish to.
    @type consumer: L{IConsumer<interfaces.IConsumer>}
    @ivar paused: As a Producer, am I paused?
    @type paused: bool
    NTFc                 ó`   — g | _         |�$|| _        |                     | | j        ¦  «         d S d S ©N)Ú_bufferÚconsumerÚregisterProducerÚiAmStreaming)Úselfr
   s     úT/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/protocols/pcp.pyÚ__init__z#BasicProducerConsumerProxy.__init__#   s=   € ØˆŒØÐØ$ˆDŒMØ×%Ò% d¨DÔ,=Ñ>Ô>Ð>Ð>Ð>ð  Ðó    c                 óX   — d| _         | j        r| j                             ¦   «          d S d S ©NT)ÚpausedÚproducerÚpauseProducing©r   s    r   r   z)BasicProducerConsumerProxy.pauseProducing+   s7   € ØˆŒØŒ=ð 	+ØŒM×(Ò(Ñ*Ô*Ð*Ð*Ð*ð	+ð 	+r   c                 ó   — d| _         | j        r?| j                             d                     | j        ¦  «        ¦  «         g | j        d d …<   n| j        sd| _        | j        �| j                             ¦   «          d S d S )NFÚ T)	r   r	   r
   ÚwriteÚjoinr   ÚoutstandingPullr   ÚresumeProducingr   s    r   r   z*BasicProducerConsumerProxy.resumeProducing0   s…   € ØˆŒØŒ<ð 	,àŒM×Ò §¢¨¬Ñ 5Ô 5Ñ6Ô6Ð6Ø ˆDŒL˜˜˜‰OˆOàÔ$ð ,Ø'+�Ô$àŒ=Ð$ØŒM×)Ò)Ñ+Ô+Ð+Ð+Ð+ð %Ð$r   c                 ó\   — | j         �| j                              ¦   «          | j        �| `d S d S r   )r   ÚstopProducingr
   r   s    r   r   z(BasicProducerConsumerProxy.stopProducing=   s7   € ØŒ=Ð$ØŒM×'Ò'Ñ)Ô)Ð)ØŒ=Ð$Ø���ð %Ð$r   c                 ó¼   — | j         s| j        s#| j        s| j                             |¦  «         d S | j        �#| j                             |¦  «         d| _        d S d S ©NF)r   r   r   r	   Úappendr
   r   ©r   Údatas     r   r   z BasicProducerConsumerProxy.writeE   sp   € ØŒ;ð 	)˜tÔ0ð 	)¸Ô9Mð 	)àŒL×Ò Ñ%Ô%Ð%Ð%Ð%àŒ]Ð&ØŒM×Ò Ñ%Ô%Ð%Ø#(ˆDÔ Ð Ð ð 'Ð&r   c                 ón   — | j         �| j                              ¦   «          |                      ¦   «          d S r   )r
   ÚfinishÚunregisterProducerr   s    r   r%   z!BasicProducerConsumerProxy.finishN   s6   € ØŒ=Ð$ØŒM× Ò Ñ"Ô"Ð"Ø×ÒÑ!Ô!Ð!Ð!Ð!r   c                 ó"   — || _         || _        d S r   )r   ÚproducerIsStreaming©r   r   Ú	streamings      r   r   z+BasicProducerConsumerProxy.registerProducerS   s   € Ø ˆŒØ#,ˆÔ Ð Ð r   c                 ó`   — | j         �| ` | `| j        r| j                             ¦   «          d S d S r   )r   r(   r
   r&   r   s    r   r&   z-BasicProducerConsumerProxy.unregisterProducerW   sC   € ØŒ=Ð$Ø�ØÐ(ØŒ=ð 	/ØŒM×,Ò,Ñ.Ô.Ð.Ð.Ð.ð	/ð 	/r   Úreturnc                 óJ   — d| j         › dt          | ¦  «        d›d| j        › d�S )Nú<ú@Úxz around ú>)Ú	__class__Úidr
   r   s    r   Ú__repr__z#BasicProducerConsumerProxy.__repr__^   s0   € ØH�4”>ÐHÐH¥B t¡H¤HÐHÐHÐH¸¼ÐHÐHÐHÐHr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r(   r   r   r   Ústoppedr   r   r   r   r   r%   r   r&   Ústrr4   © r   r   r   r      sÞ   € € € € € ð	ð 	ð €HØ€HØÐØ€LØ€OØ€FØ€Gð?ð ?ð ?ð+ð +ð +ð
,ð ,ð ,ðð ð ð)ð )ð )ð"ð "ð "ð
-ð -ð -ð/ð /ð /ðI˜#ð Ið Ið Ið Ið Ið Ir   r   c                   óB   — 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
S )ÚProducerConsumerProxyz˜ProducerConsumerProxy with a finite buffer.

    When my buffer fills up, I have my parent Producer pause until my buffer
    has room in it again.
    i   Fc                 ó   — d| _         d S r   )r   r   s    r   r   z$ProducerConsumerProxy.pauseProducingo   s   € ð ˆŒˆˆr   c                 óŽ  — d| _         | j        rxd                     | j        ¦  «        }|                      |¦  «        }|t	          |¦  «        k     r)||d …         }| j        r
J d¦   «         ‚|g| j        d d …<   ng | j        d d …<   nd}| j        r)|r'| j        s | j        �| j                             ¦   «          | j        s| | _	        | j
        �tt          d„ | j        D ¦   «         ¦  «        }| j        r-|| j        k     r"d| _        | j
                             ¦   «          d S | j	        r| j
                             ¦   «          d S d S d S )NFr   ú.Streaming producer did not write all its data.r   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   ©Úlen©Ú.0Úss     r   ú	<genexpr>z8ProducerConsumerProxy.resumeProducing.<locals>.<genexpr>�   ó(   è è € Ð=Ð=¨1¥ A¡¤Ð=Ð=Ð=Ð=Ð=Ð=r   )r   r	   r   Ú_writeSomeDatarC   r   Úunregisteredr
   r&   r   r   ÚsumÚproducerPausedÚ
bufferSizer   )r   r#   Ú	bytesSentÚunsentÚbytesBuffereds        r   r   z%ProducerConsumerProxy.resumeProducingt   s˜  € ØˆŒØŒ<ð 	Ø—7’7˜4œ<Ñ(Ô(ˆDØ×+Ò+¨DÑ1Ô1ˆIØ�3˜t™9œ9Ò$Ð$Ø˜i˜j˜jÔ)�àÔ)ðDð DàCñDô Dð Dð $* (�”˜Q˜Q˜Q‘�à"$�”˜Q˜Q˜Q‘�àˆIð Ôð	/àð	/ð ”Lð	/ð ”Ð)àŒM×,Ò,Ñ.Ô.Ð.àÔ ð 	1Ø'0 =ˆDÔ àŒ=Ð$ÝÐ=Ð=°´Ð=Ñ=Ô=Ñ=Ô=ˆMð Ô"ð 0¨¸¼Ò(GÐ(Gà&+�Ô#Ø”×-Ò-Ñ/Ô/Ð/Ð/Ð/ØÔ%ð 0ð ”×-Ò-Ñ/Ô/Ð/Ð/Ð/ð! %Ð$ð0ð 0r   c                 ó  — | j         s| j        s"| j        s| j                             |¦  «         nz| j        �s| j        r
J d¦   «         ‚|                      |¦  «        }d| _        |t          |¦  «        k    s3| j        r
J d¦   «         ‚| j                             ||d …         ¦  «         | j        �R| j	        rMt          d„ | j        D ¦   «         ¦  «        }|| j        k    r&| j                             ¦   «          d| _        d S d S d S d S )Nz9Writing fresh data to consumer before my buffer is empty!Fr@   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   rB   rD   s     r   rG   z.ProducerConsumerProxy.write.<locals>.<genexpr>¸   rH   r   T)r   r   r   r	   r!   r
   rI   rC   r   r(   rK   rM   r   rL   )r   r#   rN   rP   s       r   r   zProducerConsumerProxy.write¡   sN  € ØŒ;ð 	6˜tÔ0ð 	6¸Ô9Mð 	6àŒL×Ò Ñ%Ô%Ð%Ð%àŒ]Ð&à”LðKð KàJñKô Kð Kð ×+Ò+¨DÑ1Ô1ˆIØ#(ˆDÔ Ø¥ D¡	¤	Ò)Ð)àÔ)ðDð DàCñDô Dð Dð ”×#Ò# D¨¨¨Ô$4Ñ5Ô5Ð5àŒMÐ%¨4Ô+CÐ%ÝÐ=Ð=°´Ð=Ñ=Ô=Ñ=Ô=ˆMØ ¤Ò/Ð/Ø”×,Ò,Ñ.Ô.Ð.Ø&*�Ô#Ð#Ð#ð	 &Ð%Ð%Ð%à/Ð/r   c                 ó|   — d| _         t                               | ||¦  «         |s|                     ¦   «          d S d S r    )rJ   r   r   r   r)   s      r   r   z&ProducerConsumerProxy.registerProducer½   sL   € Ø!ˆÔÝ"×3Ò3°D¸(ÀIÑNÔNÐNØð 	'Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&ð	'ð 	'r   c                 ó€   — | j         �| ` | `d| _        | j        r"| j        s| j                             ¦   «          d S d S d S r   )r   r(   rJ   r
   r	   r&   r   s    r   r&   z(ProducerConsumerProxy.unregisterProducerÃ   s^   € ØŒ=Ð$Ø�ØÐ(Ø ˆÔØŒ=ð 	/ ¤ð 	/ØŒM×,Ò,Ñ.Ô.Ð.Ð.Ð.ð	/ð 	/ð 	/ð 	/r   c                 óf   — | j         €dS | j                              |¦  «         t          |¦  «        S )z`Write as much of this data as possible.

        @returns: The number of bytes written.
        Nr   )r
   r   rC   r"   s     r   rI   z$ProducerConsumerProxy._writeSomeDataË   s3   € ð
 Œ=Ð Ø�1ØŒ×Ò˜DÑ!Ô!Ð!Ý�4‰yŒyÐr   N)r5   r6   r7   r8   rM   rL   rJ   r   r   r   r   r&   rI   r;   r   r   r=   r=   b   sŠ   € € € € € ðð ð €Jà€NØ€Lðð ð ð
+0ð +0ð +0ðZ+ð +ð +ð8'ð 'ð 'ð/ð /ð /ðð ð ð ð r   r=   N)	r8   Úzope.interfacer   Útwisted.internetr   Ú	IProducerÚ	IConsumerr   r=   r;   r   r   ú<module>rZ      sÌ   ðð
ð ð 'Ð &Ð &Ð &Ð &Ð &à 'Ð 'Ð 'Ð 'Ð 'Ð 'ð €ˆZÔ! :Ô#7Ñ8Ô8ðPIð PIð PIð PIð PIñ PIô PIñ 9Ô8ðPIðfqð qð qð qð qÐ6ñ qô qð qð qð qr   