a
    (ñ»j‡  ã                   @  sÚ   d dl mZ d dlZd dlmZmZmZ d dlZddlm	Z	 edƒZ
erdd dlmZmZ ddlmZ d	de	d
œdddddddœdd„Zdd	ddœdddddddœdd„Zdd	ddejdœddddddddd d!œ	d"d#„ZdS )$é    )ÚannotationsN)ÚTYPE_CHECKINGÚNoReturnÚTypeVaré   )ÚDEFAULT_DELAYÚT)Ú	AwaitableÚCallable)ÚSocketStreamF)Úhttps_compatibleÚssl_contextÚhappy_eyeballs_delayzstr | bytesÚintÚboolzssl.SSLContext | Nonezfloat | Noneztrio.SSLStream[SocketStream])ÚhostÚportr   r   r   Úreturnc                Ã  sT   t j| ||d�I dH }|du rBt ¡ }ttdƒrB| jtj M  _t j||| |d�S )aT  Make a TLS-encrypted Connection to the given host and port over TCP.

    This is a convenience wrapper that calls :func:`open_tcp_stream` and
    wraps the result in an :class:`~trio.SSLStream`.

    This function does not perform the TLS handshake; you can do it
    manually by calling :meth:`~trio.SSLStream.do_handshake`, or else
    it will be performed automatically the first time you send or receive
    data.

    Args:
      host (bytes or str): The host to connect to. We require the server
          to have a TLS certificate valid for this hostname.
      port (int): The port to connect to.
      https_compatible (bool): Set this to True if you're connecting to a web
          server. See :class:`~trio.SSLStream` for details. Default:
          False.
      ssl_context (:class:`~ssl.SSLContext` or None): The SSL context to
          use. If None (the default), :func:`ssl.create_default_context`
          will be called to create a context.
      happy_eyeballs_delay (float): See :func:`open_tcp_stream`.

    Returns:
      trio.SSLStream: the encrypted connection to the server.

    )r   NÚOP_IGNORE_UNEXPECTED_EOF)Úserver_hostnamer   )ÚtrioZopen_tcp_streamÚsslÚcreate_default_contextÚhasattrÚoptionsr   Z	SSLStream)r   r   r   r   r   Z
tcp_stream© r   úAE:\soccer\ml_env\Lib\site-packages\trio/_highlevel_ssl_helpers.pyÚopen_ssl_over_tcp_stream   s    "ý
ür   ©r   r   Úbacklogzssl.SSLContextzstr | bytes | Nonez
int | Nonez$list[trio.SSLListener[SocketStream]])r   r   r   r   r   r   c                ƒ  s.   t j| ||d�I dH }‡ ‡fdd„|D ƒ}|S )a*  Start listening for SSL/TLS-encrypted TCP connections to the given port.

    Args:
      port (int): The port to listen on. See :func:`open_tcp_listeners`.
      ssl_context (~ssl.SSLContext): The SSL context to use for all incoming
          connections.
      host (str, bytes, or None): The address to bind to; use ``None`` to bind
          to the wildcard address. See :func:`open_tcp_listeners`.
      https_compatible (bool): See :class:`~trio.SSLStream` for details.
      backlog (int or None): See :func:`open_tcp_listeners` for details.

    )r   r   Nc                   s   g | ]}t j|ˆˆ d �‘qS ))r   )r   ZSSLListener)Ú.0Ztcp_listener©r   r   r   r   Ú
<listcomp>e   s   ÿz/open_ssl_over_tcp_listeners.<locals>.<listcomp>)r   Zopen_tcp_listeners)r   r   r   r   r   Ztcp_listenersZssl_listenersr   r!   r   Úopen_ssl_over_tcp_listenersP   s
    þr#   )r   r   r   Úhandler_nurseryÚtask_statusz;Callable[[trio.SSLStream[SocketStream]], Awaitable[object]]ztrio.Nursery | Nonez5trio.TaskStatus[list[trio.SSLListener[SocketStream]]]r   )	Úhandlerr   r   r   r   r   r$   r%   r   c          	      Ã  s6   t j|||||d�I dH }t j| |||d�I dH  dS )uO  Listen for incoming TCP connections, and for each one start a task
    running ``handler(stream)``.

    This is a thin convenience wrapper around
    :func:`open_ssl_over_tcp_listeners` and :func:`serve_listeners` â€“ see them
    for full details.

    .. warning::

       If ``handler`` raises an exception, then this function doesn't do
       anything special to catch it â€“ so by default the exception will
       propagate out and crash your server. If you don't want this, then catch
       exceptions inside your ``handler``, or use a ``handler_nursery`` object
       that responds to exceptions in some other way.

    When used with ``nursery.start`` you get back the newly opened listeners.
    See the documentation for :func:`serve_tcp` for an example where this is
    useful.

    Args:
      handler: The handler to start for each incoming connection. Passed to
          :func:`serve_listeners`.

      port (int): The port to listen on. Use 0 to let the kernel pick
          an open port. Ultimately passed to :func:`open_tcp_listeners`.

      ssl_context (~ssl.SSLContext): The SSL context to use for all incoming
          connections. Passed to :func:`open_ssl_over_tcp_listeners`.

      host (str, bytes, or None): The address to bind to; use ``None`` to bind
          to the wildcard address. Ultimately passed to
          :func:`open_tcp_listeners`.

      https_compatible (bool): Set this to True if you want to use
          "HTTPS-style" TLS. See :class:`~trio.SSLStream` for details.

      backlog (int or None): See :class:`~trio.SSLStream` for details.

      handler_nursery: The nursery to start handlers in, or None to use an
          internal nursery. Passed to :func:`serve_listeners`.

      task_status: This function can be used with ``nursery.start``.

    Returns:
      This function only returns when cancelled.

    r   N)r$   r%   )r   r#   Zserve_listeners)	r&   r   r   r   r   r   r$   r%   Z	listenersr   r   r   Úserve_ssl_over_tcpl   s    <ûür'   )Ú
__future__r   r   Útypingr   r   r   r   Z_highlevel_open_tcp_streamr   r   Úcollections.abcr	   r
   Z_highlevel_socketr   r   r#   ZTASK_STATUS_IGNOREDr'   r   r   r   r   Ú<module>   s,   ú9ú!õ