
    wg^>                         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y)
    )datetimetimezoneN)parse_qs   )ConnectionRefusedErrorc                        e Zd Zd ZddZd Zy)EventBufferc                     i | _         y N)bufferselfs    S/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/socketio/admin.py__init__zEventBuffer.__init__   s	        c                     t        t        j                               dz  }| d| }|| j                  vr|||d| j                  |<   y | j                  |   dxx   |z  cc<   y )N  ;)	timestamptypecountr   )inttimer   )r   r   r   r   keys        r   pushzEventBuffer.push   sg    		$t+	1TF#dkk!& DKK KKW%.%r   c                 n    | j                   }i | _         |j                         D cg c]  }| c}S c c}w r   )r   values)r   r   values      r   get_and_clearzEventBuffer.get_and_clear   s,    #)==?3%333s   	2N)r   )__name__
__module____qualname__r   r   r    r   r   r	   r	      s    
/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y)InstrumentedServerNc                 j   |t        d      || _        || _        || _        || _        |xsF t        | j                  j                  d      r | j                  j                  j                  nt        | _	        || _
        || _        t               | _        d| _        d| _        | j!                          y)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)   r*   r1   r,   r0   	namespacer2   s           r   r   zInstrumentedServer.__init__$   s    
 <566	("" 
(/0@0@)(LDHH$$ 	 	%:"'M !% 	r   c                 B   | j                   j                  d| j                  | j                         | j                  dk(  rI| j
                  s| j                   j                  d| j                  | j                         | j                   j                  d| j                  | j                         | j                   j                  d| j                  | 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.                  j                  d| j0                         | j                   j.                  j                  d| j2                         d	d
lm} | j                   j.                  j8                  | j                   j.                  _        | j<                  | j                   j.                  _        |j>                  |_         tC        jD                  | jF                  jH                  |       |_        |jJ                  |_&        tC        jD                  | jF                  jN                  |       |_%        | j                  dk(  rA|jP                  |_)        tC        jD                  | jF                  jT                  |       |_(        y y )Nconnectr7   developmentemitjoinleave_disconnect
disconnectr   Socket)+r)   onadmin_connectr+   r1   r,   
admin_emitadmin_enter_roomadmin_leave_roomadmin_disconnectr.   _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_roomr<   _InstrumentedServer__emit_emiteio_handle_eio_connect_handle_eio_disconnectengineio.socketrB   _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   rB   s     r   r6   zInstrumentedServer.instrument>   s   It11"22 	 	4 99%>>FDOO&*&:&:  <FD$9$9&*&:&:  <GT%:%:&*&:&:  <M4+@+@&*&:&:  < ,.DHH( (,xx'>'>DHH$&*&9&9DHH#   11 HH/040F0FDHH-   11 HH/040F0FDHH- '+hh&6&6&;&;DHH#$(JJDHH! 		4#;#;<d&A&AB 	+ HHLL,,22'-'A'A$%.%<%<NN33T&;" &,%>%>"$-$;$;NN114%9! 99%!'!2!2F ) 7 7--t!5F &r   c                    | j                   dk(  r| 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(                  |_        y y )Nr;   r   rA   )r1   r)   rK   rJ   r.   rM   rL   rP   rO   rR   r<   rT   rY   rX   rW   rB   r\   r[   rb   ra   re   rd   rg   s     r   uninstrumentzInstrumentedServer.uninstrumenty   s    99%&*hh&>&>DHH#  33 HH-   33 HH-$(HH$4$4$;$;DHH!88<<,,*%+%A%A"$*$>$>!99% & 2 2F &r   c                 F     j                   rsd}t         j                   t              r| j                   k(  }n:t         j                   t              r| j                   v }n j                  |      }|st	        d       fd} j
                  j                  ||       y )NFzauthentication failedc           	      f   j                   j                  d       dg}j                  s|g dz  }j                  dk(  r|j	                  d       j                   j                  dd|i| j                         j                  dk(  rg }j                   j                  j                         D ]R  }j                   j                  j                  |d       D ]'  \  } }|j	                  j                  | ||             ) T j                   j                  d	|| j                         y y )
Ng?AGGREGATED_EVENTS)EMITJOINLEAVE
DISCONNECTMJOINMLEAVEMDISCONNECTr;   
ALL_EVENTSconfigsupportedFeaturestor7   all_sockets)r)   sleepr,   r1   appendr<   r+   r.   get_namespacesget_participantsserialize_socket)sidfeaturesry   nspeio_sidr   s        r   ru   z0InstrumentedServer.admin_connect.<locals>.config   s(   HHNN3 ,,H>> 6 6yyM)-HHMM(%8($C D,@,@  B yyM) 88++::< FC(,(8(8(I(I)' FW#** 11#sGDFFF
 m[S(,(<(<  > *r   )r*   
isinstancedictlistr   r)   start_background_task)r   r   environclient_authauthenticatedru   s   `     r   rD   z InstrumentedServer.admin_connect   s    99!M$))T* +tyy 8DIIt, +tyy 8 $		+ 6 ,-DEE	>0 	&&vs3r   c                 B    | j                   j                  ||||       y )Nrw   )r)   r<   )r   _r7   room_filtereventdatas         r   rE   zInstrumentedServer.admin_emit   s    eTkYGr   c                     | j                   j                  j                  ||      D ]#  \  }}| j                   j                  |||       % y Nr:   )r)   r.   r}   
enter_roomr   r   r7   roomr   r   s         r   rF   z#InstrumentedServer.admin_enter_room   J    hh&&77;( 	@FCHHTY?	@r   c                     | j                   j                  j                  ||      D ]#  \  }}| j                   j                  |||       % y r   )r)   r.   r}   
leave_roomr   s         r   rG   z#InstrumentedServer.admin_leave_room   r   r   c                     | j                   j                  j                  ||      D ]"  \  }}| j                   j                  ||       $ y r   )r)   r.   r}   r@   )r   r   r7   closer   r   s         r   rH   z#InstrumentedServer.admin_disconnect   sF    hh&&77;( 	:FCHHy9	:r   c                     | j                   r5| j                  j                          | j                   j                          y y r   )r5   r4   setr=   r   s    r   shutdownzInstrumentedServer.shutdown   s0    ??!!%%'OO  " r   c           
         t        j                          }|d   }|dk(  r| j                  j                  j                  ||      }|| j                  j                  j                  |<   | j                  |||      }| j                  j                  d|t        j                  |t        j                        j                         f| j                         n|dk(  r| j                  j                  j                  |= |d   }| j                  j                  d|||t        j                  |t        j                        j                         f| j                         nc| j                  j                  d|||g|dd  t        j                  |t        j                        j                         f| j                          | j                  j                  ||g| S )	Nr   r9   socket_connectedr:   r@   r   socket_disconnectedevent_received)r   r)   r.   eio_sid_from_sidrI   r~   r<   r   fromtimestampr   utc	isoformatr+   rK   )	r   r   r7   argstr   r   serialized_socketreasons	            r   rJ   z!InstrumentedServer._trigger_event   s   IIK1gIhh&&77YGG01DHH((- $ 5 5c9g NHHMM,!&&q(,,7AAC/ --  / l"  ,,S1!WFHHMM/&&q(,,7AAC	2
 --  / HHMM*"ab"&&q(,,7AAC	-
 --  / (txx''y@4@@r   c                 4   t        d      D ]{  }| j                  j                  d       	 | j                  j                  j	                  |      j
                  r.| j                  j                  d||dd| j                          y } y # t        $ r Y w xY w)N   socket_updated	websocket)idr   	transportr:   )	ranger)   rz   rT   _get_socketupgradedr<   r+   KeyError)r   r   r   r7   r   s        r   _check_for_upgradez%InstrumentedServer._check_for_upgrade   s    q 	AHHNN1	88<<++G4==HHMM"2!(%05 "&!5!5	 " 7
  >	  s   AB	BBc           	         | j                   j                  j                  ||||      }|r[| j                   j                  d|||t	        j
                  t        j                        j                         f| j                         |S )Nroom_joinedr:   )
r)   r.   rM   r<   r   nowr   r   r   r+   )r   r   r7   r   r   rets         r   rN   z$InstrumentedServer._basic_enter_room   sx    hh11#y$29;HHMM-X\\*446	*
 --  / 
r   c           	      
   |r[| j                   j                  d|||t        j                  t        j
                        j                         f| j                         | j                   j                  j                  |||      S )N	room_leftr:   )
r)   r<   r   r   r   r   r   r+   r.   rP   )r   r   r7   r   s       r   rQ   z$InstrumentedServer._basic_leave_room   so    HHMM+X\\*446	(
 --  / xx223	4HHr   c           
          | j                   j                  j                  |||f|||d|}|| j                  k7  rt	        |t
              r|gt        |      z   n||g}	t	        |t              s|g}| j                   j                  j                  ||      D ]e  \  }
}|
|vs| j                   j                  d||
|	t        j                  t        j                        j                         f| j                         g |S )N)r   skip_sidcallback
event_sentr:   )r)   r.   rR   r+   r   tupler   r}   r<   r   r   r   r   r   )r   r   r   r7   r   r   r   kwargsr   
event_datar   r   s               r   rS   zInstrumentedServer._emit  s    %dhh%%eT9 04/7(0(.0 ,,,1;D%1H%4:-T] h-$:((**;;ItL 7Qh&HHMM,!" X\\2<<>	1
 "&!5!5 " 77 
r   c                 .   | j                   S| j                  j                  j                         | _         | j                  j	                  | j
                        | _        | j                  j                  d       | j                  j                  ||      S )NrawConnection)
r4   r)   rT   create_eventr   _emit_server_statsr5   r3   r   rU   )r   r   r   s      r   rU   z&InstrumentedServer._handle_eio_connect  ss      ($(HHLL$=$=$?D!"hh<<'')DO 	/xx++GW==r   c                 p    | j                   j                  d       | j                  j                  ||      S )NrawDisconnection)r3   r   r)   rV   )r   r   r   s      r   rV   z)InstrumentedServer._handle_eio_disconnect$  s.    12xx..w??r   c                     | j                   j                  j                  |||      }| j                  j	                  d       | j                  j	                  dt        |d                |S )N)packetsheadersjsonp_index
packetsOutbytesOutresponse)r)   rT   rY   r3   r   len)r   r   r   r   r   s        r   rZ   z%InstrumentedServer._eio_http_response(  s^    hhll,7   9|,z3s:+?@
r   c           	           | j                   |      }|j                  j                  d       |j                  j                  dt        |j	                  dd                   |S )N	packetsInbytesInCONTENT_LENGTHr   )r\   r3   r   r   get)socketr   r   r   s       r   r`   z+InstrumentedServer._eio_handle_post_request/  sW    *f**73{+s7;;'7;<	>
r   c                     fd}fd}|j                   |_        t        j                  ||      |_         |j                  |_        t        j                  ||      |_         | j                  |      S )Nc                     j                   j                  d       j                   j                  dt        |              | j                  |g|i |S )Nr   r   )r3   r   r   _InstrumentedServer__send)wsr   r   r   r   s       r   _sendz8InstrumentedServer._eio_websocket_handler.<locals>._send7  sL    ""<0"":s4y9299T3D3F33r   c                     | j                         }j                  j                  d       j                  j                  dt        |xs d             |S )Nr   r    )_InstrumentedServer__waitr3   r   r   )r   r   r   s     r   _waitz8InstrumentedServer._eio_websocket_handler.<locals>._wait<  sE    ))+C"";/""9c#)n=Jr   )sendr   r]   partialwaitr   rb   )r   r   r   r   r   s    `   r   rc   z)InstrumentedServer._eio_websocket_handler6  s`    	4
	 GG	##E2.GG	##E2.)v))"--r   c           	         | j                   }t        j                         }|j                  j                  j	                         D ]  }|j                  j                  j                  ||      }|s,|j                  |||      }|j                  j                  d|t        j                  |t        j                        j                         f|j                           | j                         S )Nr   r:   )r   r   r)   r.   r|   sid_from_eio_sidr~   r<   r   r   r   r   r   r+   re   )r   r   r   r   r7   r   r   s          r   rf   z!InstrumentedServer._eio_send_pingH  s    **IIK))88: 	3I((""33GYGC$($9$9#y:A%C!0%**1hll;EEG3 "11  3	3 "v!!##r   c                    t        j                          }t        | j                  j                  j	                               }|j                          | j                  j                         s| j                  j                  | j                         | j                  j                  d| j                  t        t        t        j                          |z
  t        | j                  j                  j                         t        | j                  j                  j                   j#                         D cg c]  }|j$                  s| c}      | j&                  j)                         |D cg c]P  }|t        | j                  j*                  j,                  j/                  |d g i      j/                  d g             dR c}d| j0                         | j                  j                         sy y c c}w c c}w )Nserver_stats)namesocketsCount)serverIdhostnamepiduptimeclientsCountpollingClientsCountaggregatedEvents
namespacesr:   )r   r   r)   handlerskeyssortr4   is_setrz   r2   r<   r0   r/   PIDr   rT   socketsr   r   r3   r   r.   roomsr   r+   )r   
start_timer   sr   s        r   r   z%InstrumentedServer._emit_server_statsV  s|   YY[
$((++0023
''..0HHNN4556HHMM. NN$))+
2 #DHHLL$8$8 9'* $ 4 4 ; ; = (1JJ  (() %)$5$5$C$C$E
 (	)   $'(8(8(>(>(B(BdBZ))),T2%8  )+ --  / ''..00()s   0G0(AG5c                    |%| j                   j                  j                  |      }| j                   j                  j	                  |      }| j                   j
                  j                  |i       }|| j                   j                  j                  v r#| j                   j                  j                  |   nd}|||j                  rdnd|i |j                  dd      |j                         D ci c]*  \  }}|j                  d      r|dd  j                         |, c}}t        |j                  dd            j                         D ci c]  \  }}|t        |      d	k(  r|d   n| c}}|j                  d
d      dk(  |j                  dd      |dz  |r2t        j                  |t         j"                        j%                         ndd| j                   j                  j'                  ||      dS c c}}w c c}}w )Nr   r   pollingREMOTE_ADDRr   HTTP_r   QUERY_STRINGr   zwsgi.url_schemehttps	PATH_INFOr   )addressr   querysecureurlissuedr   )r   clientIdr   r   r   	handshaker   )r)   r.   r   rT   r   r   r   rI   r   items
startswithlowerr   r   r   r   r   r   r   	get_rooms)	r   r   r7   r   r   r   tmkvs	            r   r~   z#InstrumentedServer.serialize_socketm  s   ?hh&&77<G))'2((""&&w325HH((3)TXX))#../ 	 (.Y";;}b99@ 6A ||G4 abEKKM1, 6DLKK3E55:UW>DAq!SVq[QqTa7 >!++&7<G{{;3t) !..r8<<@JJL XX%%//Y?%
 	
6>s   1/G: H )Nr;   FNz/admin   r   )NNN)r    r!   r"   r   r6   ri   rD   rE   rF   rG   rH   r   rJ   r   rN   rQ   rS   rU   rV   rZ   r`   rc   rf   r   r~   r#   r   r   r%   r%   #   s    EJKL495v3 $4LH@
@
:
#
A:
I AE(>@.$$/.
r   r%   )r   r   r]   osr   r   urllib.parser   
exceptionsr   gethostnamer/   getpidr   r	   r%   r#   r   r   <module>r     sM    '  	   ! .6biik4 4,d
 d
r   