Ë
    ÚŠ±jI  ã            	       ó†   — d Z ddlZddlZ G d„ de«      Z G d„ d«      Zddeded	ed
e	fd„Z
ddede	d
e	fd„Zdeded
e	fd„Zy)a°  
Control Socket Protocol

JSON-based protocol with length-prefixed framing for the control interface.

Message Format:
    +----------------+------------------+
    | Length (4B BE) |  JSON Payload    |
    +----------------+------------------+

Request Format:
    {"id": 1, "command": "show", "args": ["workers"]}

Response Format:
    {"id": 1, "status": "ok", "data": {...}}
    {"id": 1, "status": "error", "error": "message"}
é    Nc                   ó   — e Zd ZdZy)ÚProtocolErrorzProtocol-level error.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úZ/var/www/io.vulcan-creative.com/venv/lib/python3.12/site-packages/gunicorn/ctl/protocol.pyr   r      s   „ Úr
   r   c                   ó    — e Zd ZdZdZededefd„«       Zededefd„«       Z	edefd„«       Z
edefd„«       Zedefd	„«       Zedefd
„«       Zy)ÚControlProtocolz‡
    Protocol implementation for control socket communication.

    Uses 4-byte big-endian length prefix followed by JSON payload.
    i   ÚdataÚreturnc                 ó’   — t        j                  | «      j                  d«      }t        j                  dt        |«      «      }||z   S )z£
        Encode a message for transmission.

        Args:
            data: Dictionary to encode

        Returns:
            Length-prefixed JSON bytes
        úutf-8ú>I)ÚjsonÚdumpsÚencodeÚstructÚpackÚlen)r   ÚpayloadÚlengths      r   Úencode_messagezControlProtocol.encode_message)   s<   € ô —*‘*˜TÓ"×)Ñ)¨'Ó2ˆÜ—‘˜T¤3 w£<Ó0ˆØ˜ÑÐr
   c                 óü   — t        | «      dk  rt        d«      ‚t        j                  d| dd «      d   }t        | «      d|z   k  rt        d«      ‚| dd|z    }t	        j
                  |j                  d«      «      S )z©
        Decode a message from bytes.

        Args:
            data: Raw bytes (length prefix + JSON payload)

        Returns:
            Decoded dictionary
        é   zMessage too shortr   Nr   zIncomplete messager   )r   r   r   Úunpackr   ÚloadsÚdecode)r   r   r   s      r   Údecode_messagezControlProtocol.decode_message8   sz   € ô ˆt‹9�qŠ=ÜÐ 3Ó4Ð4ä—‘˜t T¨"¨1 XÓ.¨qÑ1ˆÜˆt‹9�q˜6‘zÒ!ÜÐ 4Ó5Ð5à�q˜˜V™Ð$ˆÜ�z‰z˜'Ÿ.™.¨Ó1Ó2Ð2r
   c                 óx  — d}t        |«      dk  rK| j                  dt        |«      z
  «      }|s|st        d«      ‚t        d«      ‚||z  }t        |«      dk  rŒKt	        j
                  d|«      d   }|t        j                  kD  rt        d|› �«      ‚d}t        |«      |k  rH| j                  t        |t        |«      z
  d«      «      }|st        d	«      ‚||z  }t        |«      |k  rŒH	 t        j                  |j                  d
«      «      S # t        j                  $ r}t        d|› �«      ‚d}~ww xY w)a  
        Read one message from a socket.

        Args:
            sock: Socket to read from

        Returns:
            Decoded message dictionary

        Raises:
            ProtocolError: If message is malformed
            ConnectionError: If connection is closed
        r
   r   zConnection closedzIncomplete length prefixr   r   úMessage too large: i   zIncomplete payloadr   úInvalid JSON: N)r   ÚrecvÚConnectionErrorr   r   r   r   ÚMAX_MESSAGE_SIZEÚminr   r   r    ÚJSONDecodeError)ÚsockÚlength_dataÚchunkr   Úpayload_dataÚes         r   Úread_messagezControlProtocol.read_messageM   s?  € ð  ˆÜ�+Ó Ò"Ø—I‘I˜a¤# kÓ"2Ñ2Ó3ˆEÙÙ"Ü)Ð*=Ó>Ð>Ü#Ð$>Ó?Ð?Ø˜5Ñ ˆKô �+Ó Ó"ô —‘˜t [Ó1°!Ñ4ˆà”O×4Ñ4Ò4ÜÐ"5°f°XÐ >Ó?Ð?ð ˆÜ�,Ó &Ò(Ø—I‘Iœc &¬3¨|Ó+<Ñ"<¸eÓDÓEˆEÙÜ#Ð$8Ó9Ð9Ø˜EÑ!ˆLô	 �,Ó &Ó(ð	6Ü—:‘:˜l×1Ñ1°'Ó:Ó;Ð;øÜ×#Ñ#ò 	6Ü .°°Ð 4Ó5Ð5ûð	6ús   Ã/#D ÄD9Ä&D4Ä4D9c                 óP   — t         j                  |«      }| j                  |«       y)z‘
        Write one message to a socket.

        Args:
            sock: Socket to write to
            data: Message dictionary to send
        N)r   r   Úsendall)r*   r   Úmessages      r   Úwrite_messagezControlProtocol.write_messagex   s    € ô "×0Ñ0°Ó6ˆØ�‰�WÕr
   c              ƒ   ó†  K  — | j                  d«      ƒ d{  –—† }t        j                  d|«      d   }|t        j                  kD  rt        d|› �«      ‚| j                  |«      ƒ d{  –—† }	 t        j                  |j                  d«      «      S 7 Œ|7 Œ+# t        j                  $ r}t        d|› �«      ‚d}~ww xY w­w)z©
        Read one message from an async reader.

        Args:
            reader: asyncio StreamReader

        Returns:
            Decoded message dictionary
        r   Nr   r   r#   r   r$   )
Úreadexactlyr   r   r   r'   r   r   r   r    r)   )Úreaderr+   r   r-   r.   s        r   Úread_message_asyncz"ControlProtocol.read_message_async„   s¹   è ø€ ð #×.Ñ.¨qÓ1×1ˆÜ—‘˜t [Ó1°!Ñ4ˆà”O×4Ñ4Ò4ÜÐ"5°f°XÐ >Ó?Ð?ð $×/Ñ/°Ó7×7ˆð	6Ü—:‘:˜l×1Ñ1°'Ó:Ó;Ð;ð 2øð 8ùô ×#Ñ#ò 	6Ü .°°Ð 4Ó5Ð5ûð	6üsF   ‚C—B˜ACÁ*BÁ+CÁ0#B ÂCÂCÂB>Â+B9Â9B>Â>Cc              ƒ   óŒ   K  — t         j                  |«      }| j                  |«       | j                  «       ƒ d{  –—†  y7 Œ­w)zœ
        Write one message to an async writer.

        Args:
            writer: asyncio StreamWriter
            data: Message dictionary to send
        N)r   r   ÚwriteÚdrain)Úwriterr   r2   s      r   Úwrite_message_asyncz#ControlProtocol.write_message_asyncž   s3   è ø€ ô "×0Ñ0°Ó6ˆØ�‰�WÔØ�l‰l‹n×Òús   ‚:A¼A½AN)r   r   r   r   r'   ÚstaticmethodÚdictÚbytesr   r!   r/   r3   r7   r<   r	   r
   r   r   r      s¾   „ ñð (Ðàð ˜Tð   eò  ó ð ð ð3˜Uð 3 tò 3ó ð3ð( ð(6˜dò (6ó ð(6ðT ð	 $ò 	ó ð	ð ð6¨Dò 6ó ð6ð2 ð
°ò 
ó ñ
r
   r   Ú
request_idÚcommandÚargsr   c                 ó   — | ||xs g dœS )zã
    Create a request message.

    Args:
        request_id: Unique request identifier
        command: Command name (e.g., "show workers")
        args: Optional list of arguments

    Returns:
        Request dictionary
    )ÚidrA   rB   r	   )r@   rA   rB   s      r   Úmake_requestrE   ¬   s   € ð ØØ’
˜ñð r
   r   c                 ó   — | d|xs i dœS )z·
    Create a success response message.

    Args:
        request_id: Request identifier being responded to
        data: Response data

    Returns:
        Response dictionary
    Úok)rD   Ústatusr   r	   )r@   r   s     r   Úmake_responserI   ¿   s   € ð ØØ’
˜ñð r
   Úerrorc                 ó   — | d|dœS )z½
    Create an error response message.

    Args:
        request_id: Request identifier being responded to
        error: Error message

    Returns:
        Error response dictionary
    rJ   )rD   rH   rJ   r	   )r@   rJ   s     r   Úmake_error_responserL   Ñ   s   € ð ØØñð r
   )N)r   r   r   Ú	Exceptionr   r   ÚintÚstrÚlistr>   rE   rI   rL   r	   r
   r   ú<module>rQ      s€   ðñ
ó$ Û ô �Iô  ÷Jñ JñZ˜Sð ¨3ð °dð Àdó ñ&˜cð ¨ð ¸ó ð$ Cð °ð ¸ô r
   