
    sj'                       d dl 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Zd dl	m
Z d dlmZmZ  eej                   j#                  dd            a eej                   j#                  dd            a eej                   j#                  d	d
            aej                   j#                  d      at*        rD et*              j-                         r* ej.                   et*              j1                               a ej2                  de      Z ej8                  e      Zd Zd Z d Z!ejD                  dd       Z# G d de      Z$ G d de      Z%d Z&d Z' G d de      Z(y)    )annotationsN)Path)AbstractWebAppWslinkHandlerWSLINK_MSG_OVERHEAD4096WSLINK_MAX_MSG_SIZE4194304WSLINK_HEART_BEAT30WSLINK_HTTP_HEADERSstatec                 z   t        t        j                  j                  dt                    at        t        j                  j                  dt
                    at        t        j                  j                  dt        xs d            at        j                  j                  dt              at        dk  rd ay y )Nr   r	   r      r      )intosenvirongetMSG_OVERHEADMAX_MSG_SIZE
HEART_BEATHTTP_HEADERS     M/DATA/.local/lib/python3.12/site-packages/wslink/backends/aiohttp/__init__.pyreload_settingsr      s     rzz~~&;\JKLrzz~~&;\JKL


*J,<"=J ::>>"7FL A~
 r   c                   K   | j                   r,t        j                  j                  d| j                          S t        j                  j                  d      S w)Nzindex.html?z
index.html)query_stringaiohttpweb	HTTPFound)requests    r   _root_handlerr$   1   sG     {{$${73G3G2H%IJJ;;  ..s   AAc                2    | j                  d      sd|  S | S )N/)
startswith)paths    r   	_fix_pathr)   7   s    ??34&zKr   c                   K    ||        d {   }t         j                         D ]!  \  }}|j                  j                  ||       # |S 7 >wN)r   itemsheaders
setdefault)r#   handlerresponsekvs        r   http_headersr3   >   sL     +27+;%;H""$1##Aq) % O	 &<s   AA?Ac                  F    e Zd Zd Zed        Zed        Zd ZddZd Z	y)	WebAppServerc           	     P   t                t        j                  | |       t        r+| j	                  t        j                  t        g             n#| j	                  t        j                                g | _        d | _	        d | _
        d|v rg }|d   j                         D ]d  \  }}t        ||       }| j                  j                  |       |j                  t        j                  t        |      |j                                f | j"                  j%                  |       d|v r|d   }|j                  dd      }|xs2 t'        t)        t*        j,                  j                  dd                  }g }t/        |j1                         d	      D ]8  }||   }|j                  t        j2                  t        |      |d|
             : | j"                  j4                  j7                  ddt8               | j"                  j%                  |       i | j"                  t:        <   y )N)middlewareswsstaticstatic_follow_symlinksFWSLINK_FOLLOW_SYMLINKS0T)reverse)append_versionfollow_symlinksGETr&   )r   r   __init__r   set_appaiohttp_webApplicationr3   _ws_handlers_site_runnerr,   AioHttpWsHandlerappendr   r)   handleWsRequestapp
add_routesboolr   r   r   sortedkeysr9   router	add_router$   	STATE_KEY)	selfserver_configroutesrouteserver_protocolprotocol_handlerstatic_routesr?   server_paths	            r   rA   zWebAppServer.__init__I   s   m4LL00l^LMLL0023
= F*7*=*C*C*E&#3OT#J !!(()9:OOIe$46F6V6VW +F HH'}$)(3M+//0H%PO- BJJNN#;SAB2O F   2 2 4dC+E2&&!%(#'+(7	 D HHOO%%eS-@HH' r   c                    | j                   S r+   )rG   rS   s    r   runnerzWebAppServer.runner~   s    ||r   c                    | j                   S r+   )rF   r\   s    r   sitezWebAppServer.site   s    zzr   c                :    | j                   j                  d   d   S )z)Return the actual port used by the serverr   r   )r]   	addressesr\   s    r   get_portzWebAppServer.get_port   s    {{$$Q'**r   Nc                z  K   t        j                  | j                  | j                        | _        t
        j                  d       | j                  j                          d {    t        j                  | j                  | j                  | j                  | j                        | _        t
        j                  d       | j                  j                          d {    | || j                                t
        j                  d       t        j                   j#                  dd      }|r$t        j$                  d|j'                                t
        j                  d	| j(                         | j+                          t
        j                  d
       | j,                   d {    y 7 O7 7 
w)N)handle_signalszawaiting runner setup)ssl_contextzawaiting site startupzPrint WSLINK_READY_MSGWSLINK_READY_MSGzwslink: Starting factoryr   z&Schedule auto shutdown with timeout %szawaiting running future)rC   	AppRunnerrK   rd   rG   loggerinfosetupTCPSitehostportre   rF   startrb   r   r   r   writeencodetimeoutshutdown_schedule
completion)rS   port_callbackSTARTUP_MSGs      r   rn   zWebAppServer.start   s9    ",,HHT%8%8
 	+,ll  """ ((LL$))TYYD<L<L

 	+,jj   $$--/*,-jjnn%79STHHQ**,-<dllK -.oo- 	# 	! 	s8   A#F;%F4&A<F;"F7#CF;.F9/F;7F;9F;c                4  K   | j                   D ]  }|j                          d {     t        j                  d       | j                  j                          d {    t        j                  d       | j                  j                  d       y 7 n7 7w)NzPerforming runner.cleanup()zStopping serverT)rE   disconnectClientsrh   ri   r]   cleanuprs   
set_result)rS   r/   s     r   stopzWebAppServer.stop   sy     ((G++--- ) 	12kk!!### 	%&""4( . 	$s!   #BB8BB6BBr+   )
__name__
__module____qualname__rA   propertyr]   r_   rb   rn   rz   r   r   r   r5   r5   H   s?    /!j    +<)r   r5   c                  ,     e Zd Z fdZddZd Z xZS )ReverseWebAppServerc                    t                t        | 	  |       |j                  d      | _        |j                  d      | _        t        | j
                  |       | _        y )Nreverse_urlws_protocol)r   superrA   r   _url_server_protocolrH   _ws_handler)rS   rT   	__class__s     r   rA   zReverseWebAppServer.__init__   sP    '!%%m4	 - 1 1- @+D,A,A4Hr   c                ~   K   | |d       | j                   j                  | j                         d {    y 7 w)Nr   )r   reverse_connect_tor   )rS   rt   s     r   rn   zReverseWebAppServer.start   s2     $!11$))<<<s   3=;=c                   K   | j                   j                  }| j                   j                  |   }|j                          d {    y 7 wr+   )r   reverse_connection_client_idconnectionsclose)rS   	client_idr8   s      r   rz   zReverseWebAppServer.stop   s<     $$AA	)))4hhjs   AAAAr+   )r{   r|   r}   rA   rn   rz   __classcell__)r   s   @r   r   r      s    I=r   r   c                    | j                  d      r't        j                  d      j                  | d          d| v rt	        |       S t        |       S )Nlogging_levelwslinkr   )r   logging	getLoggersetLevelr   r5   )rT   s    r   create_webserverr      sP    )(#,,]?-KL %"=11 &&r   c                P    | j                   t        j                  j                  k(  S r+   )typer    	WSMsgTypeBINARY)msgs    r   	is_binaryr      s    88w((////r   c                      e Zd Zd Zd Zd Zy)rH   c                t  K   t         j                  d       t        | j                  j	                               }|D ]Z  }t         j                  d|       | j                  |   }|j                  t        j                  j                  d       d {    \ | j                  j                  |        y 7 "w)NzClosing client connections:z  %szServer shutdown)codemessage)rh   ri   listr   rO   r   r    WSCloseCode
GOING_AWAYpublishManagerunregisterProtocol)rS   rO   r   r8   s       r   rw   z"AioHttpWsHandler.disconnectClients   s     12D$$))+,IKK	*!!),B((((33=N      	..t4	s   BB8B6#B8c                f  K   t        t        j                               j                  dd      }t	        j
                  t        t        z   t              }|| j                  |<   t        j                  d|       | j                  j                          	 |j                  |       d {    | j                  ||       d {    |2 3 d {   }| j!                  t#        |      ||       d {    .7 N7 67 -7 6 	 | j%                  |       d {  7   | j                  |= | j&                  j)                  |       t        j                  d|       | j                  s/t        j                  d       | j                  j+                          |S # | j%                  |       d {  7   | j                  |= | j&                  j)                  |       t        j                  d|       | j                  s0t        j                  d       | j                  j+                          w w xY ww)N- )max_msg_size	heartbeatzclient %s connectedzclient %s disconnectedz(No more connections, scheduling shutdown)struuiduuid4replacerC   WebSocketResponser   r   r   r   rh   ri   web_appshutdown_cancelprepare	onConnect	onMessager   onCloseauthentified_client_idsdiscardrr   )rS   r#   r   
current_wsr   s        r   rJ   z AioHttpWsHandler.handleWsRequest   s    

%--c26	 22%4


 '1#)95$$&	1$$W---..)444' EcnnYs^S)DDD .4ED ( ,,y)))  +((00;KK0)<##FG..0 ,,y)))  +((00;KK0)<##FG..0 $s   BH1F *C9+F C;F DC=D F 3C?4F ;F =D?F F H1DB H1H.-F0.B H..H1c                \  K   t         j                  d|       | j                  }t        j                         4 d {   }t         j                  d       |j                  |      4 d {   }t         j                  d       || j                  |<   t         j                  d       | j                  ||       d {    |2 3 d {   }|j                  r| j                  t        |      ||       d {    ;7 7 7 E7 <7 6 t         j                  d       | j                  |       d {  7   | j                  |= d d d       d {  7   n# 1 d {  7  sw Y   nxY wd d d       d {  7   n# 1 d {  7  sw Y   nxY wt         j                  d       y w)Nz'reverse_connect_to: running with url %sz*reverse_connect_to: client session startedzreverse_connect_to: ws startedzreverse_connect_to: onConnectzreverse_connect_to: onClosezreverse_connect_to: exited)rh   debugr   r    ClientSession
ws_connectr   r   closedr   r   r   )rS   urlr   sessionr   r   s         r   r   z#AioHttpWsHandler.reverse_connect_to  s?    >D55	((**gLLEF))#..*=>.8  +<=nnS)444!+ M#%,,"nnYs^S)LLL +. 5ML ", :;ll9---$$Y/ /.... +****  	12s   ;F,DF,+F,D-F0AE?D ED
D
DEE;D	
<EF,FED	E*E5D86EFEFE,	 E#!E,	(F/F,:E=;F,FF
FF,N)r{   r|   r}   rw   rJ   r   r   r   r   rH   rH      s    
5<3r   rH   )r#   zaiohttp_web.Request))
__future__r   jsonr   r   r   pathlibr   r    aiohttp.webr!   rC   wslink.protocolr   r   r   r   r   r   r   r   r   existsloads	read_textAppKeyr   rR   r   r{   rh   r   r$   r)   
middlewarer3   r5   r   r   r   rH   r   r   r   <module>r      s6   "   	    ! 9 2::>>"7@A2::>>"7CD 3T:;
zz~~34D&--/4::d<0::<=LKw,				8	$(/  r)> r)j. (	'"0>3} >3r   