§
    !ß·i«9  ã                   ó�   — d dl Z d dl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j
        d¦  «        Z G d„ d¦  «        ZdS )é    Né   )Úpacket)Úpayloadzengineio.serverc                   óÜ   — e Zd ZddgZg d¢ZddgZdZdZ G d„ d	¦  «        Z	 	 	 	 	 	 d%d„Z	d„ Z
d„ Zd&d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd'd„Zd&d„Zd„ Zd&d„Zd „ Zd!„ Zd"„ Zd#„ Zd$„ Zd
S )(Ú
BaseServerÚgzipÚdeflate)ÚconnectÚ
disconnectÚmessageÚpollingÚ	websocketTr   c                   ó&   — e Zd ZdZdZdZdZdZdZdS )úBaseServer.reasonzDisconnection reasons.zserver disconnectzclient disconnectzping timeoutztransport closeztransport errorN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚSERVER_DISCONNECTÚCLIENT_DISCONNECTÚPING_TIMEOUTÚTRANSPORT_CLOSEÚTRANSPORT_ERROR© ó    úY/home/mmwave/public_html/mmwave/venv/lib/python3.11/site-packages/engineio/base_server.pyÚreasonr      s/   € € € € € Ø$Ð$à/Ðà/Ðà%ˆà+ˆà+ˆˆˆr   r   Né   é   é@B é   Fc                 ó0  ‡ — |‰ _         t          |t          ¦  «        r|d         ‰ _        |d         ‰ _        n|‰ _        d‰ _        |‰ _        |‰ _        |‰ _        |‰ _        |‰ _	        |	‰ _
        |
‰ _        |‰ _        i ‰ _        i ‰ _        t          ¦   «         ‰ _        |�|n‰ j        ‰ _        d ‰ _        d ‰ _        |�|t*          j        _        t          |t0          ¦  «        s|‰ _        nœt4          ‰ _        ‰ j        j        t8          j        k    rv|r%‰ j                             t8          j        ¦  «         n$‰ j                             t8          j         ¦  «         ‰ j         !                    t9          j"        ¦   «         ¦  «         ‰  #                    ¦   «         }|�	||v r|gng }d ‰ _$        d ‰ _%        |D ]m}	 tM          j'        d|z   ¦  «        j$        ‰ _$        d‰ j$        v r‰ j$        d         nd}|‰  (                    ¦   «         k    rŒU|‰ _%         n# tR          $ r Y Œjw xY w‰ j%        €tU          d¦  «        ‚‰  (                    ¦   «         r%d‰ j$        vs‰ j$        d         stU          d¦  «        ‚‰  (                    ¦   «         s%d‰ j$        v r‰ j$        d         rtU          d¦  «        ‚|�7t          |tV          ¦  «        r|g}ˆ fd	„|D ¦   «         }|stU          d
¦  «        ‚|p‰ j,        ‰ _-        ‰ j         .                    d‰ j%        ¦  «         d S )Nr   r   zengineio.async_drivers.ÚasyncioFzInvalid async_mode specifiedz1The selected async_mode is not asyncio compatiblezKThe selected async_mode requires asyncio and must use the AsyncServer classc                 ó&   •— g | ]}|‰j         v ¯|‘ŒS r   )Úvalid_transports)Ú.0Ú	transportÚselfs     €r   ú
<listcomp>z'BaseServer.__init__.<locals>.<listcomp>k   s3   ø€ ð Að Að A¨	Ø&¨$Ô*?Ð?Ð?ð $Ø?Ð?Ð?r   zNo valid transports providedzServer initialized for %s.)/Úping_timeoutÚ
isinstanceÚtupleÚping_intervalÚping_interval_grace_periodÚmax_http_buffer_sizeÚallow_upgradesÚhttp_compressionÚcompression_thresholdÚcookieÚcors_allowed_originsÚcors_credentialsÚasync_handlersÚsocketsÚhandlersÚsetÚlog_message_keysÚ_default_monitor_clientsÚstart_service_taskÚservice_task_handleÚservice_task_eventr   ÚPacketÚjsonÚboolÚloggerÚdefault_loggerÚlevelÚloggingÚNOTSETÚsetLevelÚINFOÚERRORÚ
addHandlerÚStreamHandlerÚasync_modesÚ_asyncÚ
async_modeÚ	importlibÚimport_moduleÚis_asyncio_basedÚImportErrorÚ
ValueErrorÚstrr%   Ú
transportsÚinfo)r(   rN   r-   r*   r/   r0   r1   r2   r3   r4   r5   rB   r@   r6   Úmonitor_clientsrU   ÚkwargsÚmodesÚmodeÚasyncio_baseds   `                   r   Ú__init__zBaseServer.__init__#   s…  ø€ ð )ˆÔÝ�m¥UÑ+Ô+ð 	0Ø!.¨qÔ!1ˆDÔØ.;¸AÔ.>ˆDÔ+Ð+à!.ˆDÔØ./ˆDÔ+Ø$8ˆÔ!Ø,ˆÔØ 0ˆÔØ%:ˆÔ"ØˆŒØ$8ˆÔ!Ø 0ˆÔØ,ˆÔØˆŒØˆŒÝ #¡¤ˆÔàÐ*ð #2 /Ø04Ô0Mð 	Ôà#'ˆÔ Ø"&ˆÔØÐØ!%�FŒMÔÝ˜&¥$Ñ'Ô'ð 		@Ø ˆDŒKˆKå(ˆDŒKØŒ{Ô ¥G¤NÒ2Ð2Øð 8Ø”K×(Ò(­¬Ñ6Ô6Ð6Ð6à”K×(Ò(­¬Ñ7Ô7Ð7Ø”×&Ò&¥wÔ'<Ñ'>Ô'>Ñ?Ô?Ð?Ø× Ò Ñ"Ô"ˆØÐ!Ø$.°%Ð$7Ð$7�Z�L�L¸RˆEØˆŒØˆŒØð 	ð 	ˆDð
Ý'Ô5Ø-°Ñ4ñ6ô 6Ü6<ð ”ð ! D¤KÐ/Ð/ð !%¤¨IÔ 6Ð 6Ø5:ð à  D×$9Ò$9Ñ$;Ô$;Ò;Ð;ØØ"&�”Ø�øÝð ð ð Ø�ðøøøàŒ?Ð"ÝÐ;Ñ<Ô<Ð<Ø× Ò Ñ"Ô"ð 	+Ø $¤+Ð-Ð-Ø”˜YÔ'ð .åð *ñ +ô +ð +à×$Ò$Ñ&Ô&ð 	?¨9¸¼Ð+CÐ+CØ”˜IÔ&ð ,Dåð >ñ ?ô ?ð ?àÐ!Ý˜*¥cÑ*Ô*ð *Ø(˜\�
ðAð Að Að A°Zð Añ Aô AˆJàð AÝ Ð!?Ñ@Ô@Ð@Ø$Ð=¨Ô(=ˆŒØŒ×ÒÐ5°t´ÑGÔGÐGÐGÐGs   Æ<AHÈHÈ
H$È#H$c                 ó   — dS )NFr   ©r(   s    r   rQ   zBaseServer.is_asyncio_basedr   s   € Øˆur   c                 ó
   — g d¢S )N)ÚeventletÚgevent_uwsgiÚgeventÚ	threadingr   r^   s    r   rL   zBaseServer.async_modesu   s   € ØBÐBÐBÐBr   c                 ód   ‡ ‡— ‰‰ j         vrt          d¦  «        ‚ˆˆ fd„}|€|S  ||¦  «         dS )aù  Register an event handler.

        :param event: The event name. Can be ``'connect'``, ``'message'`` or
                      ``'disconnect'``.
        :param handler: The function that should be invoked to handle the
                        event. When this parameter is not given, the method
                        acts as a decorator for the handler function.

        Example usage::

            # as a decorator:
            @eio.on('connect')
            def connect_handler(sid, environ):
                print('Connection request')
                if environ['REMOTE_ADDR'] in blacklisted:
                    return False  # reject

            # as a method:
            def message_handler(sid, msg):
                print('Received message: ', msg)
                eio.send(sid, 'response')
            eio.on('message', message_handler)

        The handler function receives the ``sid`` (session ID) for the
        client as first argument. The ``'connect'`` event handler receives the
        WSGI environment as a second argument, and can return ``False`` to
        reject the connection. The ``'message'`` handler receives the message
        payload as a second argument. The ``'disconnect'`` handler does not
        take a second argument.
        zInvalid eventc                 ó   •— | ‰j         ‰<   | S ©N)r8   )ÚhandlerÚeventr(   s    €€r   Úset_handlerz"BaseServer.on.<locals>.set_handlerš   s   ø€ Ø#*ˆDŒM˜%Ñ ØˆNr   N)Úevent_namesrS   )r(   rh   rg   ri   s   ``  r   ÚonzBaseServer.onx   sc   øø€ ð> ˜Ô(Ð(Ð(Ý˜_Ñ-Ô-Ð-ð	ð 	ð 	ð 	ð 	ð 	ð ˆ?ØÐØˆ�GÑÔÐÐÐr   c                 ó>   — |                       |¦  «        j        rdndS )z×Return the name of the transport used by the client.

        The two possible values returned by this function are ``'polling'``
        and ``'websocket'``.

        :param sid: The session of the client.
        r   r   )Ú_get_socketÚupgraded)r(   Úsids     r   r'   zBaseServer.transport¢   s$   € ð #×.Ò.¨sÑ3Ô3Ô<ÐKˆ{ˆ{À)ÐKr   c                 ó(   —  | j         d         |i |¤ŽS )zóCreate a queue object using the appropriate async model.

        This is a utility function that applications can use to create a queue
        without having to worry about using the correct call for the selected
        async mode.
        Úqueue©rM   ©r(   ÚargsrX   s      r   Úcreate_queuezBaseServer.create_queue¬   ó    € ð $ˆtŒ{˜7Ô# TÐ4¨VÐ4Ð4Ð4r   c                 ó   — | j         d         S )zÿReturn the queue empty exception for the appropriate async model.

        This is a utility function that applications can use to work with a
        queue without having to worry about using the correct call for the
        selected async mode.
        Úqueue_emptyrr   r^   s    r   Úget_queue_empty_exceptionz$BaseServer.get_queue_empty_exceptionµ   s   € ð Œ{˜=Ô)Ð)r   c                 ó(   —  | j         d         |i |¤ŽS )zõCreate an event object using the appropriate async model.

        This is a utility function that applications can use to create an
        event without having to worry about using the correct call for the
        selected async mode.
        rh   rr   rs   s      r   Úcreate_eventzBaseServer.create_event¾   rv   r   c                 ó$  — t          j        t          j        d¦  «        | j                             dd¦  «        z   ¦  «        }| j        dz   dz  | _        |                     d¦  «                             dd¦  «                             d	d
¦  «        S )zGenerate a unique session id.é   é   Úbigr   iÿÿÿ úutf-8ú/Ú_ú+Ú-)Úbase64Ú	b64encodeÚsecretsÚtoken_bytesÚsequence_numberÚto_bytesÚdecodeÚreplace)r(   Úids     r   Úgenerate_idzBaseServer.generate_idÇ   sƒ   € åÔÝÔ Ñ#Ô# dÔ&:×&CÒ&CÀAÀuÑ&MÔ&MÑMñOô Oˆà $Ô 4°qÑ 8¸HÑDˆÔØ�yŠy˜Ñ!Ô!×)Ò)¨#¨sÑ3Ô3×;Ò;¸CÀÑEÔEÐEr   c                 óè   — |                      dd¦  «        dz   |z   }|                     ¦   «         D ]@\  }}|dk    rŒt          |¦  «        r
 |¦   «         }|du r	|d|z   z  }Œ2|d|z   dz   |z   z  }ŒA|S )zGenerate the sid cookie.ÚnameÚioÚ=Tz; )ÚgetÚitemsÚcallable)r(   ro   Ú
attributesr3   Ú	attributeÚvalues         r   Ú_generate_sid_cookiezBaseServer._generate_sid_cookieÎ   s    € à—’ ¨Ñ-Ô-°Ñ3°cÑ9ˆØ *× 0Ò 0Ñ 2Ô 2ð 	9ð 	9ÑˆI�uØ˜FÒ"Ð"ØÝ˜‰Œð  Ø˜™œ�Ø˜ˆ}ˆ}Ø˜$ Ñ*Ñ*��à˜$ Ñ*¨SÑ0°5Ñ8Ñ8��Øˆr   c                 ó¤   — | j         r |                      |¦  «        j        s|dk    rg S | j        d         €|                      dd¦  «         g S dgS )z=Return the list of possible upgrades for a client connection.r   Nz¦The WebSocket transport is not available, you must install a WebSocket server that is compatible with your async mode to enable it. See the documentation for details.zno-websocket)r0   rm   rn   rM   Ú_log_error_once)r(   ro   r'   s      r   Ú	_upgradeszBaseServer._upgradesÜ   st   € àÔ"ð 	 d×&6Ò&6°sÑ&;Ô&;Ô&Dð 	Ø˜[Ò(Ð(ØˆIØŒ;�{Ô#Ð+Ø× Ò ð@ð ñ	 ô  ð  ð
 ˆIØˆ}Ðr   c                 óš   — 	 | j         |         }n# t          $ r t          d¦  «        ‚w xY w|j        r| j         |= t          d¦  «        ‚|S )z-Return the socket object for a given session.zSession not foundzSession is disconnected)r7   ÚKeyErrorÚclosed)r(   ro   Úss      r   rm   zBaseServer._get_socketê   sg   € ð	0Ø”˜SÔ!ˆAˆAøÝð 	0ð 	0ð 	0ÝÐ.Ñ/Ô/Ð/ð	0øøøàŒ8ð 	6Ø”˜SÐ!ÝÐ4Ñ5Ô5Ð5Øˆs   ‚ �*c                 ó¨   — |�J|€g }|dgz  }d|t          j        |¬¦  «                             |¬¦  «                             d¦  «        dœS ddgd	dœS )
z$Generate a successful HTTP response.N)úContent-Typeztext/plain; charset=UTF-8z200 OK)Úpackets)Újsonp_indexr€   ©ÚstatusÚheadersÚresponse©r¢   z
text/plains   OK)r   ÚPayloadÚencode)r(   r£   r§   r¤   s       r   Ú_okzBaseServer._okõ   s‰   € àÐØˆØ�ØÐEÐFÑFˆGØ&Ø&Ý '¤¸Ð @Ñ @Ô @× GÒ GØ$/ð !Hñ !1ô !1ß17²¸±´ðBð Bð Bð
 'Ø >Ð?Ø %ð'ð 'ð 'r   c                 ó†   — |€d}t           j        j                             |¦  «        }ddg|                     d¦  «        dœS )z+Generate a bad request HTTP error response.NzBad Requestz400 BAD REQUESTr©   r€   r¥   ©r   r?   r@   Údumpsr«   ©r(   r   s     r   Ú_bad_requestzBaseServer._bad_request  sK   € àˆ?Ø#ˆGÝ”-Ô$×*Ò*¨7Ñ3Ô3ˆØ+Ø:Ð;Ø#ŸNšN¨7Ñ3Ô3ð5ð 5ð 	5r   c                 ó   — ddgddœS )z0Generate a method not found HTTP error response.z405 METHOD NOT FOUNDr©   s   Method Not Foundr¥   r   r^   s    r   Ú_method_not_foundzBaseServer._method_not_found  s   € à0Ø:Ð;Ø/ð1ð 1ð 	1r   c                 ó†   — |€d}t           j        j                             |¦  «        }ddg|                     d¦  «        dœS )z,Generate a unauthorized HTTP error response.NÚUnauthorizedz401 UNAUTHORIZED)r¢   zapplication/jsonr€   r¥   r®   r°   s     r   Ú_unauthorizedzBaseServer._unauthorized  sK   € àˆ?Ø$ˆGÝ”-Ô$×*Ò*¨7Ñ3Ô3ˆØ,Ø@ÐAØ#ŸNšN¨7Ñ3Ô3ð5ð 5ð 	5r   c           
      óv  — | j         €ÿg }d|v rød|v rô|                     d                     |d         |d         ¬¦  «        ¦  «         d|v sd|v r¶|                     d|d         ¦  «                             d¦  «        d                              ¦   «         }|                     d                     ||                     d|d         ¦  «                             d¦  «        d                              ¦   «         ¬¦  «        ¦  «         n²| j         d	k    rd }n¤t          | j         t          ¦  «        r	| j         g}n�t          | j         ¦  «        rZ|                     d
¦  «        }	 |                       ||¦  «        }n%# t          $ r |                       |¦  «        }Y nw xY w|r|gng }nd	| j         v rd }n| j         }|S )Nzwsgi.url_schemeÚ	HTTP_HOSTz{scheme}://{host})ÚschemeÚhostÚHTTP_X_FORWARDED_PROTOÚHTTP_X_FORWARDED_HOSTÚ,r   Ú*ÚHTTP_ORIGIN)
r4   ÚappendÚformatr“   ÚsplitÚstripr+   rT   r•   Ú	TypeError)r(   ÚenvironÚallowed_originsr¹   ÚoriginÚ
is_alloweds         r   Ú_cors_allowed_originsz BaseServer._cors_allowed_origins  s  € ØÔ$Ð,Ø ˆOØ  GÐ+Ð+°¸wÐ0FÐ0FØ×&Ò&Ð':×'AÒ'AØ"Ð#4Ô5Ø  Ô-ð (Bñ (/ô (/ñ 0ô 0ð 0ð ,¨wÐ6Ð6Ø/°7Ð:Ð:Ø$Ÿ[š[Ø0ØÐ 1Ô2ñ4ô 4ç49²E¸#±J´J¸qôBçBGÂ%Á'Ä'ð ð $×*Ò*Ð+>×+EÒ+EØ%¨G¯KªKØ3Ø# KÔ0ñ-2ô -2ç27²%Ø #ñ3%ô 3%Ø%&ô-(÷ ).ª©¬ð	 ,Fñ ,1ô ,1ñ 2ô 2ð 2øð
 Ô&¨#Ò-Ð-Ø"ˆOˆOÝ˜Ô1µ3Ñ7Ô7ð 	<Ø#Ô8Ð9ˆOˆOÝ�dÔ/Ñ0Ô0ð 	<Ø—[’[ Ñ/Ô/ˆFð?Ø!×6Ò6°v¸wÑGÔG�
�
øÝð ?ð ?ð ?Ø!×6Ò6°vÑ>Ô>�
�
�
ð?øøøà*4Ð<˜v˜h˜h¸"ˆOˆOà�dÔ/Ð/Ð/Ø"&��à"&Ô";�ØÐs   Å"E9 Å9FÆFc                 óæ   — | j         g k    rg S g }|                      |¦  «        }d|v r|�
|d         |v rd|d         fg}|d         dk    r|dgz  }d|v r|d|d         fgz  }| j        r|d	gz  }|S )
z1Return the cross-origin-resource-sharing headers.r¿   NzAccess-Control-Allow-OriginÚREQUEST_METHODÚOPTIONS)zAccess-Control-Allow-MethodszOPTIONS, GET, POSTÚ#HTTP_ACCESS_CONTROL_REQUEST_HEADERSzAccess-Control-Allow-Headers)z Access-Control-Allow-CredentialsÚtrue)r4   rÉ   r5   )r(   rÅ   r§   rÆ   s       r   Ú_cors_headerszBaseServer._cors_headers?  sÐ   € àÔ$¨Ò*Ð*àˆIØˆØ×4Ò4°WÑ=Ô=ˆØ˜GÐ#Ð#Ø Ð(¨G°MÔ,BØ ð-!ð -!à5°w¸}Ô7MÐNÐOˆGØÐ#Ô$¨	Ò1Ð1ØÐNÐOÑOˆGØ0°GÐ;Ð;ØÐ7ØÐ EÔFðHð Iñ IˆGàÔ ð 	FØÐDÐEÑEˆGØˆr   c                 óÖ   — t          j        ¦   «         }t          j        |d¬¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   |                     ¦   «         S )z%Apply gzip compression to a response.Úw)ÚfileobjrZ   N)r‘   ÚBytesIOr   ÚGzipFileÚwriteÚgetvalue)r(   r¨   ÚbytesioÚgzs       r   Ú_gzipzBaseServer._gzipS  s˜   € å”*‘,”,ˆÝŒ] 7°Ð5Ñ5Ô5ð 	¸Ø�HŠH�XÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	à×ÒÑ!Ô!Ð!s   ªAÁAÁAc                 ó*   — t          j        |¦  «        S )z(Apply deflate compression to a response.)ÚzlibÚcompress)r(   r¨   s     r   Ú_deflatezBaseServer._deflateZ  s   € åŒ}˜XÑ&Ô&Ð&r   c                 ó¾   — || j         vr9| j                             |dz   ¦  «         | j                              |¦  «         dS | j                             |¦  «         dS )zWLog message with logging.ERROR level the first time, then log
        with given level.zC (further occurrences of this error will be logged with level INFO)N)r:   rB   ÚerrorÚaddrV   )r(   r   Úmessage_keys      r   r›   zBaseServer._log_error_once^  sv   € ð ˜dÔ3Ð3Ð3ØŒK×Ò˜gð )@ñ @ñ Aô Að AàÔ!×%Ò% kÑ2Ô2Ð2Ð2Ð2àŒK×Ò˜WÑ%Ô%Ð%Ð%Ð%r   )Nr   r   r    TTr!   NNTFNTNNrf   )NNN)r   r   r   Úcompression_methodsrj   r%   r;   r‰   r   r\   rQ   rL   rk   r'   ru   ry   r{   rŽ   r™   rœ   rm   r¬   r±   r³   r¶   rÉ   rÏ   rÙ   rÝ   r›   r   r   r   r   r      sæ  € € € € € Ø! 9Ð-ÐØ6Ð6Ð6€KØ! ;Ð/ÐØ#ÐØ€Oð,ð ,ð ,ð ,ð ,ñ ,ô ,ð ,ð HJØ>BØ>BØ37Ø;?ØGKðMHð MHð MHð MHð^ð ð ðCð Cð Cð(ð (ð (ð (ðTLð Lð Lð5ð 5ð 5ð*ð *ð *ð5ð 5ð 5ðFð Fð Fðð ð ðð ð ð	ð 	ð 	ð'ð 'ð 'ð 'ð5ð 5ð 5ð 5ð1ð 1ð 1ð5ð 5ð 5ð 5ð!ð !ð !ðFð ð ð("ð "ð "ð'ð 'ð 'ð&ð &ð &ð &ð &r   r   )r…   r   rO   r‘   rE   r‡   rÛ   Ú r   r   Ú	getLoggerrC   r   r   r   r   ú<module>rå      sº   ðØ €€€Ø €€€Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø €€€Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à"�Ô"Ð#4Ñ5Ô5€ðW&ð W&ð W&ð W&ð W&ñ W&ô W&ð W&ð W&ð W&r   