Ë
    :vžj=  ã                   óx   — d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZ d	Z G d
„ d«      Zy)zBase websocket classes.é    N)Úno_type_check)Úurlparse)ÚioloopÚweb)ÚIOStream)ÚJupyterHandler)ÚJupyterServerAuthWarningÚorigin_matches_pati0u  c                   óÐ   ‡ — e Zd ZU dZdZdZdZdZedz  e	d<   e
d„ «       Ze
d„ «       Zeddedz  defd	„«       Zd
„ Zed„ «       Zeˆ fd„«       Zeˆ fd„«       Zed„ «       Zd„ Zˆ xZS )ÚWebSocketMixinz"Mixin for common websocket optionsNg        Ústreamc                 óB   — | j                   j                  dt        «      S )ziThe interval for websocket keep-alive pings.

        Set ws_ping_interval = 0 to disable pings.
        Úws_ping_interval)ÚsettingsÚgetÚWS_PING_INTERVAL©Úselfs    ún/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_server/base/websocket.pyÚping_intervalzWebSocketMixin.ping_interval   s   € ð �}‰}× Ñ Ð!3Ô5EÓFÐFó    c                 óp   — | j                   j                  dt        d| j                  z  t        «      «      S )zÉIf no ping is received in this many milliseconds,
        close the websocket connection (VPNs, etc. can fail to cleanly close ws connections).
        Default is max of 3 pings or 30 seconds.
        Úws_ping_timeouté   )r   r   Úmaxr   r   r   s    r   Úping_timeoutzWebSocketMixin.ping_timeout!   s3   € ð �}‰}× Ñ Øœs 1 t×'9Ñ'9Ñ#9Ô;KÓLó
ð 	
r   ÚoriginÚreturnc                 óì  — | j                   dk(  st        | d«      r| j                  «       ry| j                  j                  j                  d«      }|€| j                  «       }|�|€y|j                  «       }t        |«      j                  }||k(  ry| j                   r| j                   |k(  }n%| j                  rt        | j                  |«      }nd}|s| j                  j                  d||«       |S )z•Check Origin == Host or Access-Control-Allow-Origin.

        Tornado >= 4 calls this method automatically, raising 403 if it returns False.
        Ú*Úskip_check_originTÚHostFz>Blocking Cross Origin WebSocket Attempt.  Origin: %s, Host: %s)Úallow_originÚhasattrr!   ÚrequestÚheadersr   Ú
get_originÚlowerr   ÚnetlocÚallow_origin_patr
   ÚlogÚwarning)r   r   ÚhostÚorigin_hostÚallows        r   Úcheck_originzWebSocketMixin.check_origin+   sî   € ð ×Ñ Ò#Ü�DÐ-Ô.°4×3IÑ3IÔ3Kàà�|‰|×#Ñ#×'Ñ'¨Ó/ˆØˆ>Ø—_‘_Ó&ˆFð ˆ>˜T˜\Øà—‘“ˆÜ˜vÓ&×-Ñ-ˆð ˜$ÒØð ×ÒØ×%Ñ%¨Ñ/‰EØ×"Ò"Ü& t×'<Ñ'<¸fÓE‰Eð ˆEÙØ�H‰H×ÑØPØØôð
 ˆr   c                  ó   — y)zmeaningless for websocketsN© )r   ÚargsÚkwargss      r   Úclear_cookiezWebSocketMixin.clear_cookieV   s   � r   c                 óˆ  — | j                   j                  dd«      s¦| j                  j                  st	        j
                  d«      ‚t        | | j                  j                  j                  «       «      }t        |dd«      s?| j                  }|€0| j                  j                  d«       t	        j
                  d«      ‚yyy)z}Verify authentication if required.

        Only used when the websocket class does not inherit from JupyterHandler.
        Úallow_unauthenticated_accessFi“  Ú__allow_unauthenticatedNz*Couldn't authenticate WebSocket connection)r   r   r%   Úmethodr   Ú	HTTPErrorÚgetattrr(   Úcurrent_userr+   r,   )r   r9   Úusers      r   Ú_maybe_authzWebSocketMixin._maybe_authY   s¦   € ð �}‰}× Ñ Ð!?ÀÔGØ—<‘<×&Ò&Ü—m‘m CÓ(Ð(Ü˜T 4§<¡<×#6Ñ#6×#<Ñ#<Ó#>Ó?ˆFÜ˜6Ð#<¸eÔDð ×(Ñ(�Ø�<Ø—H‘H×$Ñ$Ð%QÔRÜŸ-™-¨Ó,Ð,ð  ð	 Eð	 Hr   c                 ó  •— t        | t        «      sh| j                  j                  dd«       }d| j                  v r|rt	        j
                  dt        d¬«       | j                  «        t        ‰| �$  |i |¤ŽS t        ‰| �$  |i |¤ddi¤ŽS )zHandle a get request.r7   FÚidentity_providerz~WebSocketMixin sub-class does not inherit from JupyterHandler preventing proper authentication using custom identity provider.é   )Ú
stacklevelÚ_redirect_to_login)
Ú
isinstancer   r   r   ÚwarningsÚwarnr	   r>   ÚsuperÚprepare)r   r3   r4   Úshould_authenticateÚ	__class__s       €r   rH   zWebSocketMixin.preparek   s�   ø€ ô ˜$¤Ô/Ø&*§m¡m×&7Ñ&7Ð8VÐX]Ó&^Ð"^ÐØ" d§m¡mÑ3Ñ8KÜ—‘ðXä,Ø õ	ð ×ÑÔÜ‘7‘? DÐ3¨FÑ3Ð3Ü‰w‰ ÐI¨ÑIÀ5ÒIÐIr   c                 óº  •— | j                   j                  d| j                  j                  «       | j                  dkD  r�t
        j                  j                  «       }|j                  «       | _	        | j                  | _
        t        j                  | j                  | j                  «      | _        | j                  j                  «        t        ‰| �@  |i |¤ŽS )zOpen the websocket.zOpening websocket %sr   )r+   Údebugr%   Úpathr   r   ÚIOLoopÚcurrentÚtimeÚ	last_pingÚ	last_pongÚPeriodicCallbackÚ	send_pingÚping_callbackÚstartrG   Úopen)r   r3   r4   ÚlooprJ   s       €r   rW   zWebSocketMixin.open{   s§   ø€ ð 	�‰�‰Ð-¨t¯|©|×/@Ñ/@ÔAð ×Ñ Ò!Ü—=‘=×(Ñ(Ó*ˆDØ!ŸY™Y›[ˆDŒNØ!Ÿ^™^ˆDŒNÜ!'×!8Ñ!8Ø—‘Ø×"Ñ"ó"ˆDÔð ×Ñ×$Ñ$Ô&Ü‰w‰|˜TÐ, VÑ,Ð,r   c                 ó$  — | j                   €'| j                  �| j                  j                  «        y| j                   j                  r| j	                  «        yt
        j                  j                  «       j                  «       }d|| j                  z
  z  }d|| j                  z
  z  }|d| j                  z  k  r<|| j                  kD  r-| j                  j                  d|«       | j	                  «        y| j                  d«       || _
        y)z'send a ping to keep the websocket aliveNg     @�@rA   z#WebSocket ping timeout after %i ms.r   )Úws_connectionrU   ÚstopÚclient_terminatedÚcloser   rN   rO   rP   rR   rQ   r   r   r+   r,   Úping)r   ÚnowÚsince_last_pongÚsince_last_pings       r   rT   zWebSocketMixin.send_pingŒ   sá   € ð ×ÑÐ%¨$×*<Ñ*<Ð*HØ×Ñ×#Ñ#Ô%Øà×Ñ×/Ò/Ø�J‰JŒLØô �m‰m×#Ñ#Ó%×*Ñ*Ó,ˆØ  t§~¡~Ñ!5Ñ6ˆØ  t§~¡~Ñ!5Ñ6ˆØ˜Q ×!3Ñ!3Ñ3Ò3¸È$×J[ÑJ[Ò8[Ø�H‰H×ÑÐBÀOÔTØ�J‰JŒLØà�	‰	�#ŒØˆ�r   c                 óf   — t         j                  j                  «       j                  «       | _        y)zHandle a pong message.N)r   rN   rO   rP   rR   )r   Údatas     r   Úon_pongzWebSocketMixin.on_pong¤   s   € äŸ™×.Ñ.Ó0×5Ñ5Ó7ˆ�r   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rU   rQ   rR   r   r   Ú__annotations__Úpropertyr   r   r   ÚstrÚboolr0   r5   r>   rH   rW   rT   rd   Ú__classcell__)rJ   s   @r   r   r      sÎ   ø… Ù,à€MØ€IØ€IØ"€FˆH�t‰OÓ"àñGó ðGð ñ
ó ð
ð ñ( 3¨¡:ð (¸ò (ó ð(òT)ð ñ-ó ð-ð" óJó ðJð ó-ó ð-ð  ñó ðö.8r   r   )rh   rE   Útypingr   Úurllib.parser   Útornador   r   Útornado.iostreamr   Újupyter_server.base.handlersr   Újupyter_server.utilsr	   r
   r   r   r2   r   r   Ú<module>rt      s1   ðÙ ã Ý  Ý !ç Ý %å 7ß Mð Ð ÷U8ò U8r   