
    i?                         d dl m Z m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
                    Z ej                    Z G d d          Z G d d	          ZdS )
    )datetimetimezoneN)parse_qs   )ConnectionRefusedErrorc                   "    e Zd Zd ZddZd ZdS )EventBufferc                     i | _         d S N)bufferselfs    9/usr/local/lib/python3.11/dist-packages/socketio/admin.py__init__zEventBuffer.__init__   s        r   c                     t          t          j                              dz  }| d| }|| j        vr|||d| j        |<   d S | j        |         dxx         |z  cc<   d S )N  ;)	timestamptypecountr   )inttimer   )r   r   r   r   keys        r   pushzEventBuffer.push   s    	$$t+	##T##dk!!&   DK KW%%%.%%%%%r   c                 Z    | j         }i | _         d |                                D             S )Nc                     g | ]}|S  r   ).0values     r   
<listcomp>z-EventBuffer.get_and_clear.<locals>.<listcomp>    s    333%333r   )r   values)r   r   s     r   get_and_clearzEventBuffer.get_and_clear   s,    336==??3333r   N)r   )__name__
__module____qualname__r   r   r#   r   r   r   r	   r	      sF          
/ 
/ 
/ 
/4 4 4 4 4r   r	   c                       e Zd Z	 	 ddZd Zd Zd	 Zd
 ZddZddZ	ddZ
d Zd Zd ZddZd Z	 	 ddZd Zd ZddZd Zd Zd Zd ZddZdS )InstrumentedServerNdevelopmentF/admin   c                 X   |t          d          || _        || _        || _        || _        |p1t          | j        j        d          r| j        j        j        nt          | _	        || _
        || _        t                      | _        d| _        d| _        |                                  dS )zInstrument the Socket.IO server for monitoring with the `Socket.IO
        Admin UI <https://socket.io/docs/v4/admin-ui/>`_.
        Nzauth must be specifiedhost_id)
ValueErrorsioauthadmin_namespace	read_onlyhasattrmanagerr-   HOSTNAME	server_idmodeserver_stats_intervalr	   event_bufferstop_stats_event
stats_task
instrument)r   r/   r0   r7   r2   r6   	namespacer8   s           r   r   zInstrumentedServer.__init__$   s    
 <5666	("" 
(/0@)(L(L DH$$ 	 	%:"'MM !% 	r   c                    | j                             d| j        | j                   | j        dk    r}| j        s| j                             d| j        | j                   | j                             d| j        | j                   | j                             d| j        | j                   | j                             d| j	        | j                   i | j         j
        _        | j         j        | j         _        | j        | j         _        | j         j
        j        | j         j
        _        | j        | j         j
        _        | j         j
        j        | j         j
        _        | j        | j         j
        _        | j         j
        j        | j         j
        _        | j        | j         j
        _        | j         j                            d| j                   | j         j                            d| j                   d	d
lm} | j         j        j        | j         j        _        | j        | j         j        _        |j        |_         tC          j"        | j#        j$        |           |_        |j%        |_&        tC          j"        | j#        j'        |           |_%        | j        dk    r2|j(        |_)        tC          j"        | j#        j*        |           |_(        d S d S )Nconnectr=   r)   emitjoinleave_disconnect
disconnectr   Socket)+r/   onadmin_connectr1   r7   r2   
admin_emitadmin_enter_roomadmin_leave_roomadmin_disconnectr4   _timestamps_trigger_event"_InstrumentedServer__trigger_eventbasic_enter_room%_InstrumentedServer__basic_enter_room_basic_enter_roombasic_leave_room%_InstrumentedServer__basic_leave_room_basic_leave_roomrA   _InstrumentedServer__emit_emiteio_handle_eio_connect_handle_eio_disconnectengineio.socketrG   _ok_InstrumentedServer__ok_eio_http_responsehandle_post_request(_InstrumentedServer__handle_post_request	functoolspartialmethod	__class___eio_handle_post_request_websocket_handler&_InstrumentedServer__websocket_handler_eio_websocket_handler
_send_ping_InstrumentedServer__send_ping_eio_send_pingr   rG   s     r   r<   zInstrumentedServer.instrument>   s   It1"2 	 	4 	4 	4 9%%> <FDO&*&:  < < <FD$9&*&:  < < <GT%:&*&:  < < <M4+@&*&:  < < < ,.DH( (,x'>DH$&*&9DH#  1 H/040FDH-  1 H/040FDH- '+h&6&;DH#$(JDH! 		4#;<<<d&ABBB 	+***** HL,2'-'A$%.%<N3T&; &;" &,%>"$-$;N14%9 %9! 9%%!'!2F ) 7-t!5 !5F &%r   c                    | j         dk    rv| j        j        | j        _        | j        j        j        | j        j        _        | j        j        j        | j        j        _        | j        j        j	        | j        j        _
        | j        j        j        | j        j        _        ddlm} |j        |_        |j        |_        | j         dk    r|j        |_        d S d S )Nr)   r   rF   )r7   r/   rP   rO   r4   rR   rQ   rU   rT   rW   rA   rY   r^   r]   r\   rG   ra   r`   rg   rf   rj   ri   rl   s     r   uninstrumentzInstrumentedServer.uninstrumenty   s    9%%&*h&>DH# 3 H-  3 H-$(H$4$;DH!8<,******%+%A"$*$>!9%% & 2F &%r   c                 :     j         rrd}t           j         t                    r| j         k    }n9t           j         t                    r
| j         v }n                      |          }|st	          d           fd} j                            ||           d S )NFzauthentication failedc           	      .   j                             d           dg}j        s|g dz  }j        dk    r|                    d           j                             dd|i| j                   j        dk    rg }j         j                                        D ]R}j         j        	                    |d           D ]/\  } }|                    
                    | ||                     0Sj                             d	|| j                   d S d S )
Ng?AGGREGATED_EVENTS)EMITJOINLEAVE
DISCONNECTMJOINMLEAVEMDISCONNECTr)   
ALL_EVENTSconfigsupportedFeaturestor=   all_sockets)r/   sleepr2   r7   appendrA   r1   r4   get_namespacesget_participantsserialize_socket)sidfeaturesr~   nspeio_sidr   s        r   rz   z0InstrumentedServer.admin_connect.<locals>.config   ss   HNN3 ,,H> 6 6 6 6 6yM))---HMM(%8($C D,@  B B B yM)) 8+::<< F FC(,(8(I(I)' )' F FW#** 11#sGDDF F F FF m[S(,(<  > > > > > *)r   )r0   
isinstancedictlistr   r/   start_background_task)r   r   environclient_authauthenticatedrz   s   `     r   rI   z InstrumentedServer.admin_connect   s    9 		F!M$)T** 7 +ty 8DIt,, 7 +ty 8 $		+ 6 6  F,-DEEE	> 	> 	> 	> 	>0 	&&vs33333r   c                 B    | j                             ||||           d S )Nr|   )r/   rA   )r   _r=   room_filtereventdatas         r   rJ   zInstrumentedServer.admin_emit   s$    eTkYGGGGGr   c                     | j         j                            ||          D ]"\  }}| j                             |||           #d S Nr@   )r/   r4   r   
enter_roomr   r   r=   roomr   r   s         r   rK   z#InstrumentedServer.admin_enter_room   ]    h&77;( ( 	@ 	@FCHTY????	@ 	@r   c                     | j         j                            ||          D ]"\  }}| j                             |||           #d S r   )r/   r4   r   
leave_roomr   s         r   rL   z#InstrumentedServer.admin_leave_room   r   r   c                     | j         j                            ||          D ]!\  }}| j                             ||           "d S r   )r/   r4   r   rE   )r   r   r=   closer   r   s         r   rM   z#InstrumentedServer.admin_disconnect   sW    h&77;( ( 	: 	:FCHy9999	: 	:r   c                     | j         rT| j                                         | j                                          | j                                         d | _         d S d S r   )r;   r:   setrB   clearr   s    r   shutdownzInstrumentedServer.shutdown   s_    ? 	#!%%'''O  """!'')))"DOOO		# 	#r   c           
         t          j                     }|d         }|dk    r| j        j                            ||          }|| j        j        j        |<   |                     |||          }| j                            d|t          j        |t          j
                                                  f| j                   | j        j                            |          j        s"| j                            | j        |||           n|dk    rp| j        j        j        |= |d         }| j                            d|||t          j        |t          j
                                                  f| j                   na| j                            d|||g|dd          R t          j        |t          j
                                                  f| j                    | j        j        ||g|R  S )	Nr   r?   socket_connectedr@   rE   r   socket_disconnectedevent_received)r   r/   r4   eio_sid_from_sidrN   r   rA   r   fromtimestampr   utc	isoformatr1   rY   _get_socketupgradedr   _check_for_upgraderP   )	r   r   r=   argstr   r   serialized_socketreasons	            r   rO   z!InstrumentedServer._trigger_event   s   IKK1gIh&77YGGG01DH(- $ 5 5c9g N NHMM,!&q(,77AACC/ -  / / / 8<++G44= F..+Wc9F F Fl"" ,S1!WFHMM/&q(,77AACC	2
 -  / / / / HMM*"abb""&q(,77AACC	-
 -  / / / (tx'y@4@@@@r   c                    t          d          D ]z}| j                            d           	 | j        j                            |          j        r)| j                            d||dd| j                    d S k# t          $ r Y ww xY wd S )N   socket_updated	websocket)idr   	transportr@   )	ranger/   r   rY   r   r   rA   r1   KeyError)r   r   r   r=   r   s        r   r   z%InstrumentedServer._check_for_upgrade   s    q 	 	AHNN1	8<++G44= HMM"2!(%05 5 "&!5	 " 7 7 7
 EE    	 	s   A
A;;
BBc           	          | j         j                            ||||          }|rT| j                             d|||t	          j        t          j                                                  f| j	                   |S )Nroom_joinedr@   )
r/   r4   rR   rA   r   nowr   r   r   r1   )r   r   r=   r   r   rets         r   rS   z$InstrumentedServer._basic_enter_room   s    h11#y$29; ; 	/HMM-X\**4466	*
 -  / / / 
r   c           	          |rT| j                             d|||t          j        t          j                                                  f| j                   | j         j        	                    |||          S )N	room_leftr@   )
r/   rA   r   r   r   r   r   r1   r4   rU   )r   r   r=   r   s       r   rV   z$InstrumentedServer._basic_leave_room  sy     	/HMM+X\**4466	(
 -  / / / x223	4HHHr   c           
          | j         j        j        |||f|||d|}|| j        k    rt	          |t
                    r|gt          |          z   n||g}	t	          |t                    s|g}| j         j                            ||          D ]]\  }
}|
|vrT| j                             d||
|	t          j
        t          j                                                  f| j                   ^|S )N)r   skip_sidcallback
event_sentr@   )r/   r4   rW   r1   r   tupler   r   rA   r   r   r   r   r   )r   r   r   r=   r   r   r   kwargsr   
event_datar   r   s               r   rX   zInstrumentedServer._emit  s   %dh%eT9 04/7(0 0(.0 0 ,,,1;D%1H1H #%4::--T] h-- &$:(*;;ItLL 7 7Qh&&HMM,!" X\22<<>>	1
 "&!5 " 7 7 7 
r   c                    | j         #| j        j                                        | _         | j        $| j                            | j                  | _        | j                            d           | j        	                    ||          S )NrawConnection)
r:   r/   rY   create_eventr;   r   _emit_server_statsr9   r   rZ   )r   r   r   s      r   rZ   z&InstrumentedServer._handle_eio_connect   s{     ($(HL$=$=$?$?D!?""h<<') )DO 	///x++GW===r   c                 l    | j                             d           | j                            ||          S )NrawDisconnection)r9   r   r/   r[   )r   r   r   s      r   r[   z)InstrumentedServer._handle_eio_disconnect*  s2    1222x..w???r   c                     | j         j                            |||          }| j                            d           | j                            dt          |d                              |S )N)packetsheadersjsonp_index
packetsOutbytesOutresponse)r/   rY   r^   r9   r   len)r   r   r   r   r   s        r   r_   z%InstrumentedServer._eio_http_response.  sh    hl,7   9 9|,,,z3s:+?+?@@@
r   c           	           | j         |          }|j                            d           |j                            dt          |                    dd                               |S )N	packetsInbytesInCONTENT_LENGTHr   )ra   r9   r   r   get)socketr   r   r   s       r   re   z+InstrumentedServer._eio_handle_post_request5  sg    *f*733{+++s7;;'7;;<<	> 	> 	>
r   c                     fd}fd}|j         |_        t          j        ||          |_         |j        |_        t          j        ||          |_         | j        |          S )Nc                     j                             d           j                             dt          |                      | j        |g|R i |S )Nr   r   )r9   r   r   _InstrumentedServer__send)wsr   r   r   r   s       r   _sendz8InstrumentedServer._eio_websocket_handler.<locals>._send=  s[    ""<000"":s4yy99929T3D333F333r   c                     |                                  }j                            d           j                            dt          |pd                     |S )Nr   r    )_InstrumentedServer__waitr9   r   r   )r   r   r   s     r   _waitz8InstrumentedServer._eio_websocket_handler.<locals>._waitB  sO    ))++C"";///""9c#)nn===Jr   )sendr   rb   partialwaitr   rg   )r   r   r   r   r   s    `   r   rh   z)InstrumentedServer._eio_websocket_handler<  s    	4 	4 	4 	4 	4
	 	 	 	 	 G	#E2..G	#E2..)v)"---r   c           	         | j         }t          j                    }|j        j                                        D ]}|j        j                            ||          }|rj|                    |||          }|j                            d|t          j	        |t          j                                                  f|j                    | j                    S )Nr   r@   )r   r   r/   r4   r   sid_from_eio_sidr   rA   r   r   r   r   r   r1   rj   )r   r   r   r   r=   r   r   s          r   rk   z!InstrumentedServer._eio_send_pingN  s    *IKK)88:: 	3 	3I("33GYGGC 3$($9$9#y:A%C %C!0%*1hl;;EEGG3 "1  3 3 3 "v!###r   c                     t          j                     }t           j        j                                                  }|                                  j                                        s j                             j	                    j        
                    d j        t          t          t          j                     |z
  t           j        j        j                  t          d  j        j        j                                        D                        j                                         fd|D             d j                    j                                        d S d S )Nserver_statsc                      g | ]}|j         	|S r   )r   )r   ss     r   r!   z9InstrumentedServer._emit_server_stats.<locals>.<listcomp>i  s.     ( ( (1J(Q ( ( (r   c           
          g | ]M}|t          j        j        j                            |d g i                              d g                     dNS )N)namesocketsCount)r   r/   r4   roomsr   )r   r   r   s     r   r!   z9InstrumentedServer._emit_server_stats.<locals>.<listcomp>l  sr     ) ) )   $'(8(>(B(BdBZ)) ))),T2%8 %8    ) ) )r   )serverIdhostnamepiduptimeclientsCountpollingClientsCountaggregatedEvents
namespacesr@   )r   r   r/   handlerskeyssortr:   is_setr   r8   rA   r6   r5   PIDr   rY   socketsr"   r9   r#   r1   )r   
start_timer   s   `  r   r   z%InstrumentedServer._emit_server_stats\  sj   Y[[
$(+002233
'..00 	/HNN45666HMM. N$)++
2 #DHL$8 9 9'*( ( 4 ; ; = = ( ( (() () %)$5$C$C$E$E) ) ) ) (	) ) )+ + -  / / / '..00 	/ 	/ 	/ 	/ 	/r   c                 *   || j         j                            |          }| j         j                            |          }| j         j                            |i           }|| j         j        j        v r| j         j        j        |         nd}|||j        rdnd|i |                    dd          d |	                                D             d t          |                    dd                    	                                D             |                    d	d          d
k    |                    dd          |dz  |r1t          j        |t          j                                                  ndd| j         j                            ||          dS )Nr   r   pollingREMOTE_ADDRr   c                 x    i | ]7\  }}|                     d           |dd                                         |8S )HTTP_r   N)
startswithlowerr   kvs      r   
<dictcomp>z7InstrumentedServer.serialize_socket.<locals>.<dictcomp>  sN     6 6 6A ||G446AabbEKKMM1 6 6 6r   c                 P    i | ]#\  }}|t          |          d k    r|d         n|$S )r   r   )r   r  s      r   r	  z7InstrumentedServer.serialize_socket.<locals>.<dictcomp>  s@     > > >DAq!SVVq[[QqTTa > > >r   QUERY_STRINGzwsgi.url_schemehttps	PATH_INFOr   )addressr   querysecureurlissuedr   )r   clientIdr   r   r   	handshaker   )r/   r4   r   rY   r   r   r   rN   r   itemsr   r   r   r   r   r   	get_rooms)r   r   r=   r   r   r   tms          r   r   z#InstrumentedServer.serialize_sockets  s   ?h&77<<G))'22("&&w3325H(3) 3)TX)#.../ 	 (.FY";;}b996 6 6 6 6> >HKK33E5 E55:UWW> > >!++&7<<G{{;33t).r8<@@JJLLL  X%//Y??%
 
 	
r   )Nr)   FNr*   r+   r   )NNN)r$   r%   r&   r   r<   rn   rI   rJ   rK   rL   rM   r   rO   r   rS   rV   rX   rZ   r[   r_   re   rh   rk   r   r   r   r   r   r(   r(   #   s       EJKL   495 95 95v3 3 3 $4 $4 $4LH H H@ @ @ @
@ @ @ @
: : : :
# # #A A A@  
 
 
 
I I I AE   (> > >@ @ @     . . .$$ $ $/ / /.
 
 
 
 
 
r   r(   )r   r   rb   osr   r   urllib.parser   
exceptionsr   gethostnamer5   getpidr   r	   r(   r   r   r   <module>r     s    ' ' ' ' ' ' ' '     				   ! ! ! ! ! ! . . . . . .6bikk4 4 4 4 4 4 4 4,j
 j
 j
 j
 j
 j
 j
 j
 j
 j
r   