
    ^j                         d Z ddl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  ed          Z G d de          Ze                    d           e                    d	            G d
 de          Ze                    d           e                    d	            G d de          Ze                    d           e                    d	           dS )a  Experimental networking

This module contains experiments in making user-friendly Server and Client
classes that integrate with pyglet's event system. These are very basic,
socket server/client examples, and are not ready to be used in production.
They are included here to solicit feedback, and possibly spark further
development. Basic Server usage::

    server = net.Server(address='0.0.0.0', port=1234)
    active_connections = weakref.WeakSet()

    def pong(connection, message):
        print(f"Received '{message}' from '{connection}'")
        connection.send(b'pong')

    @server.event
    def on_connection(connection):
        print(f"New client connected: {connection}")
        connection.set_handler('on_receive', pong)
        active_connections.add(connection)

    @server.event
    def on_disconnect(connection):
        print(f"Client disconnected: {connection}")
        active_connections.discard(connection)


Basic Client example::

    client = net.Client(address='localhost', port=1234)

    @client.event
    def on_receive(client, message):
        print(f"Received: {message}")

    @client.event
    def on_disconnect(client):
        print(f"Disconnected: {client}")

    client.send(b'ping')

    N)EventDispatcher)debug_print	debug_netc                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
Clientc                    t          j        ||f          | _         || _        || _        t	          j                    | _        t          j                    | _        t	          j	        | j
        d                                           t	          j	        | j        d                                           t                      | _        dS )z'Create a Client connection to a Server.TtargetdaemonN)_socketcreate_connection_address_port
_threadingEvent
_terminate_queueQueueThread_recvstart_sendobject	_sentinal)selfaddressports      R/home/agentuser/manim-venv/lib/python3.11/site-packages/pyglet/experimental/net.py__init__zClient.__init__;   s    0'4AA
$*,,lnnD999??AAAD999??AAA    c                    | j                             | j                   | j                            d           | j                                        s1| j                                         |                     d|            dS dS )zClose the connection.   on_disconnectN)	r   putr   r   shutdownr   is_setsetdispatch_eventr   s    r   closezClient.closeI   s~    '''a   %%'' 	7O!!!66666	7 	7r    c                     | j                                         rt          d          | j                            |           dS )a  Queue a message to send.

        Put a string of bytes into the queue to send.
        raises a `ConnectionError` if the connection
        has been closed or dropped.

       :Parameters:
            `message` : bytes
                A string of bytes to send.
        zConnection is closed.N)r   r&   ConnectionErrorr   r$   )r   messages     r   sendzClient.sendQ   sC     ?!!## 	;!"9:::     r    c                    | j                                         s| j                                        }|| j        k    rn	 t          j        dt          |                    |z   }| j        	                    |           n+# t          t          f$ r |                                  Y nw xY w| j                                         t          d          sJ dS )z2Background Thread to send messages from the queue.IzExiting _send threadN)r   r&   r   getr   _structpacklenr   sendallr,   OSErrorr*   
_debug_netr   r-   packets      r   r   zClient._send`   s    /((** 
	koo''G$.(( c3w<<887B$$V,,,,#W-   

 /((** 
	 01111111s    ?B   %B('B(c                    | j         }| j                                        s/	 |                    d          }t	          |          dk     r;||                    dt	          |          z
            z  }t	          |          dk     ;t          j        d|          d         }|                    |          }t	          |          |k     r+||                    |          z  }t	          |          |k     +|                     d| |           n+# t          t          f$ r | 
                                 Y nw xY w| j                                        /t          d          sJ d S )N   r0   r   
on_receivezExiting _recv thread)r   r   r&   recvr4   r2   unpackr(   r,   r6   r*   r7   )r   socketheadersizer-   s        r   r   zClient._recvq   sV   /((** 	Q&kkAoofkk!c&kk/:::F &kkAoo~c62215 ++d++'llT))v{{4000G 'llT))##L$@@@@#W-   

 /((** 	 01111111s   C(D %D43D4c                     dS zEvent for received messages.N r   
connectionr-   s      r   r<   zClient.on_receive         r    c                     dS zEvent for disconnection. NrD   r   rF   s     r   r#   zClient.on_disconnect   rG   r    c                 (    d| j          d| j         dS )NzClient(address=z, port=))r   r   r)   s    r   __repr__zClient.__repr__   s    DDDtzDDDDr    N)__name__
__module____qualname__r   r*   r.   r   r   r<   r#   rM   rD   r    r   r   r   :   s        " " "7 7 7! ! !2 2 2"2 2 2(+ + +( ( (E E E E Er    r   r<   r#   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )ClientConnectionc                     || _         || _        d| _        t          j                    | _        t          j        |                                 | j                   d S )NF)_reader_writer_closed_asyncioget_event_loop_looprun_coroutine_threadsafer   )r   readerwriters      r   r   zClientConnection.__init__   sJ    ,..
)$**,,
CCCCCr    c                     | j         s=| j        j                                         d| _         |                     d|            d S d S )NTr#   )rV   rU   	transportr*   r(   r)   s    r   r*   zClientConnection.close   sP    | 	7L"((***DL66666	7 	7r    c                 |  K   | j         s	 | j                            d           d {V }t          j        d|          d         }| j                            |           d {V }| j                            | j        d| |           n*# t          j	        $ r | 
                                 Y d S w xY w| j         d S d S )Nr;   r0   r   r<   )rV   rT   readexactlyr2   r>   rY   	call_soonr(   rW   IncompleteReadErrorr*   )r   r@   rA   r-   s       r   r   zClientConnection._recv   s      , 		#|77::::::::~c62215 $ 8 8 > >>>>>>>
$$T%8,gVVVV/   

 , 		 		 		 		 		s   A=B	 	#B0/B0c                   K   	 t          j        dt          |                    |z   }| j                            |           | j                                         d {V  d S # t          $ r |                                  Y d S w xY w)Nr0   )r2   r3   r4   rU   writedrainConnectionResetErrorr*   r8   s      r   r   zClientConnection._send   s      	\#s7||44w>FLv&&&,$$&&&&&&&&&&&# 	 	 	JJLLLLLL	s   AA$ $BBc                     | j         j        | j         j                                        r|                                  d S t	          j        |                     |          | j                  }d S N)rU   r^   
is_closingr*   rW   rZ   r   rY   )r   r-   _futures      r   r.   zClientConnection.send   sY    <!)T\-C-N-N-P-P)JJLLLF3DJJw4G4GTTr    c                     dS rC   rD   rE   s      r   r<   zClientConnection.on_receive   rG   r    c                     dS rI   rD   rJ   s     r   r#   zClientConnection.on_disconnect   rG   r    c                 .    t          d|            sJ d S )NzConnection garbage collected: r7   r)   s    r   __del__zClientConnection.__del__   s%    A4AABBBBBBBr    c                 @    | j         j         dt          |            dS )N(rL   )	__class__rN   idr)   s    r   rM   zClientConnection.__repr__   s$    .)77BtHH7777r    N)rN   rO   rP   r   r*   r   r   r.   r<   r#   ro   rM   rD   r    r   rR   rR      s        D D D7 7 7
 
 
  U U U+ + +( ( (C C C8 8 8 8 8r    rR   c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )Serverc           
      $   || _         || _        d | _        t          j        | j        d          | _        | j                                         d| d| }t          dt          |          z   d| ddt          |          z             sJ d S )NTr	   zServer listening on :-
)
r   r   _serverr   r   _run_threadr   r7   r4   )r   r   r   blurbs       r   r   zServer.__init__   s    
!(	$GGG7w7777S3u::-LLLL#E

:JLLMMMMMMMr    c                 V   K   t          ||          }|                     d|           d S )Non_connection)rR   r(   )r   r[   r\   rF   s       r   handle_connectionzServer.handle_connection   s1      %ff55
OZ88888r    c                   K   t          j        | j        | j        | j                   d {V | _        | j        4 d {V  | j                                         d {V  d d d           d {V  d S # 1 d {V swxY w Y   d S rh   )rW   start_serverr   r   r   rz   serve_foreverr)   s    r   _start_serverzServer._start_server   s#     %243I4=Z^Zdeeeeeeee< 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/,,,.........	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s     A33
A= A=c                     	 t          j        |                                            d S # t          $ r | j                                         Y d S w xY wrh   )rW   runr   KeyboardInterruptrz   r*   r)   s    r   r{   zServer._run   sa    	!L++--.....  	! 	! 	!L      	!s   &* #AAc                 d    t          d|           sJ |                    d| j                   dS )z!Event for new Client connections.zConnected <--- r#   N)r7   set_handlerr#   rJ   s     r   r   zServer.on_connection   s>    8J88999990BCCCCCr    c                 .    t          d|           sJ dS )zEvent for disconnected Clients.zDisconnected ---> Nrn   rJ   s     r   r#   zServer.on_disconnect   s%    ;z;;<<<<<<<r    N)	rN   rO   rP   r   r   r   r{   r   r#   rD   r    r   ru   ru      st        
N 
N 
N9 9 9/ / /
! ! !D D D
= = = = =r    ru   r   )__doc__queuer   structr2   r?   r   asynciorW   	threadingr   pyglet.eventr   _EventDispatcherpyglet.utilr   r7   r   register_event_typerR   ru   rD   r    r   <module>r      s  ) )X                     < < < < < < # # # # # #[%%
RE RE RE RE RE RE RE REj   < ( ( (   ? + + +48 48 48 48 48' 48 48 48n  $ $\ 2 2 2  $ $_ 5 5 5%= %= %= %= %= %= %= %=P   ? + + +   ? + + + + +r    