§
    —Q»jÁ
  ã                   ób   — d Z ddlZddlZddlmZmZmZ  G d„ d¦  «        Z G d„ d¦  «        ZdS )z³
Network Gateway and Frame Codec for FreeExile.
Handles raw binary stream framing (4-byte big-endian length prefix),
packet dispatching, and high-concurrency client multiplexing.
é    N)ÚTupleÚOptionalÚCallablec                   ór   — e Zd ZdZdZededefd„¦   «         Zededee	e         ef         fd„¦   «         Z
dS )	ÚPacketCodecz}
    Standard binary protocol framing:
    [4 Bytes: Payload Length (Big-Endian uint32)] + [N Bytes: Serialized Payload]
    é   ÚpayloadÚreturnc                 óT   — t          | ¦  «        }t          j        d|¦  «        }|| z   S )Nú>I)ÚlenÚstructÚpack)r	   ÚlengthÚheaders      ú7C:\Projects\FreeExile\server\gateway\network_gateway.pyÚencode_framezPacketCodec.encode_frame   s)   € å�W‘”ˆÝ”˜T 6Ñ*Ô*ˆØ˜ÑÐó    Úbufferc                 ó&  — t          | ¦  «        t          j        k     rd| fS t          j        d| dt          j        …         ¦  «        \  }t          j        |z   }t          | ¦  «        |k     rd| fS | t          j        |…         }| |d…         }||fS )z�
        Extracts a single frame from the buffer if complete.
        Returns: (payload_bytes or None, remaining_buffer)
        Nr   )r   r   ÚHEADER_SIZEr   Úunpack)r   r   Útotal_frame_lenr	   Ú	remainders        r   Údecode_framezPacketCodec.decode_frame   s˜   € õ ˆv‰;Œ;�Ô0Ò0Ð0Ø˜�<Ðå”M $¨Ð/GµÔ0GÐ/GÔ(HÑIÔI‰	ˆÝ%Ô1°FÑ:ˆåˆv‰;Œ;˜Ò(Ð(Ø˜�<Ðà�Ô0°Ð@ÔAˆØ˜?Ð+Ð+Ô,ˆ	Ø˜	Ð!Ð!r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstaticmethodÚbytesr   r   r   r   © r   r   r   r      s�   € € € € € ðð ð €Kàð ˜eð  ¨ð  ð  ð  ñ „\ð ð
 ð"˜Uð " u¨X°e¬_¸eÐ-CÔ'Dð "ð "ð "ñ „\ð"ð "ð "r   r   c                   óz   — e Zd Zddedefd„Zdeegdf         ddfd	„Zd
e	j
        de	j        ddfd„Zdd„Zdd„ZdS )ÚNetworkGatewayú0.0.0.0éa  ÚhostÚportc                 óL   — || _         || _        d| _        d | _        d | _        d S ©NF)r'   r(   Ú
is_runningÚserverÚpacket_handler)Úselfr'   r(   s      r   Ú__init__zNetworkGateway.__init__.   s,   € ØˆŒ	ØˆŒ	ØˆŒØ04ˆŒØAEˆÔÐÐr   ÚhandlerNr
   c                 ó   — || _         d S )N)r-   )r.   r0   s     r   Úset_packet_handlerz!NetworkGateway.set_packet_handler5   s   € Ø%ˆÔÐÐr   ÚreaderÚwriterc              ƒ   óÒ  K  — d}	 | j         rh|                     d¦  «        ƒ d {V —†}|snJ||z  }	 t                               |¦  «        \  }}|€n| j        r|                      |¦  «         Œ=| j         °hn# t
          $ r Y nw xY w|                     ¦   «          |                     ¦   «         ƒ d {V —† d S # |                     ¦   «          |                     ¦   «         ƒ d {V —† w xY w)Nr   i   )r+   Úreadr   r   r-   Ú	ExceptionÚcloseÚwait_closed)r.   r3   r4   r   Úchunkr	   s         r   Úhandle_clientzNetworkGateway.handle_client8   s;  è è € Øˆð	'Ø”/ð 5Ø$Ÿkšk¨$Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/�Øð ØØ˜%‘�ð5Ý&1×&>Ò&>¸vÑ&FÔ&F‘O�G˜VØ�ØØÔ*ð 5Ø×+Ò+¨GÑ4Ô4Ð4ð5ð ”/ð 5øøõ ð 	ð 	ð 	ØˆDð	øøøð �LŠL‰NŒNˆNØ×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øð �LŠL‰NŒNˆNØ×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøs*   †A/A6 Á5B6 Á6
BÂ B6 ÂBÂB6 Â60C&c              ƒ   óx   K  — d| _         t          j        | j        | j        | j        ¦  «        ƒ d {V —†| _        d S )NT)r+   ÚasyncioÚstart_serverr;   r'   r(   r,   ©r.   s    r   ÚstartzNetworkGateway.startM   sB   è è € ØˆŒÝ#Ô0°Ô1CÀTÄYÐPTÔPYÑZÔZÐZÐZÐZÐZÐZÐZˆŒˆˆr   c              ƒ   óš   K  — d| _         | j        r:| j                             ¦   «          | j                             ¦   «         ƒ d {V —† d S d S r*   )r+   r,   r8   r9   r?   s    r   ÚstopzNetworkGateway.stopQ   sa   è è € ØˆŒØŒ;ð 	,ØŒK×ÒÑÔÐØ”+×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ð	,ð 	,r   )r%   r&   )r
   N)r   r   r   ÚstrÚintr/   r   r!   r2   r=   ÚStreamReaderÚStreamWriterr;   r@   rB   r"   r   r   r$   r$   -   sË   € € € € € ðFð F˜Sð F°Cð Fð Fð Fð Fð&¨(°E°7¸D°=Ô*Að &Àdð &ð &ð &ð &ð'¨'Ô*>ð 'ÈÔH\ð 'Ðaeð 'ð 'ð 'ð 'ð*[ð [ð [ð [ð,ð ,ð ,ð ,ð ,ð ,r   r$   )	r   r   r=   Útypingr   r   r   r   r$   r"   r   r   ú<module>rH      sœ   ððð ð €€€Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ð"ð "ð "ð "ð "ñ "ô "ð "ðB(,ð (,ð (,ð (,ð (,ñ (,ô (,ð (,ð (,ð (,r   