
    [jy                    D   U d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	m
Z
mZmZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZ erdd
lmZ ddlmZ ddlmZ  edd          Z eg g g g g           Z G d d          Z G d de          Z G d de          Z  G d de          Z! G d de          Z" G d de          Z#drdZ$dsd$Z%dtd'Z&h d(Z'd)e(d*<   dud/Z) G d0 d1          Z* G d2 d3e*          Z+ G d4 d5e*          Z, G d6 d7e*          Z- G d8 d9          Z. G d: d;e.          Z/ G d< d=e.          Z0 G d> d?e.          Z1 G d@ dAe.          Z2 G dB dC          Z3 G dD dE          Z4 G dF dG          Z5 G dH dIe5          Z6 G dJ dKe6          Z7 G dL dMe6          Z8 G dN dOe6          Z9 G dP dQe5          Z: G dR dSe5          Z; G dT dUe6          Z< G dV dWe6          Z= G dX dY          Z> G dZ d[e>          Z? G d\ d]e>          Z@ G d^ d_e>          ZA G d` da          ZB G db dceB          ZC G dd deeB          ZD G df dgeB          ZE G dh di          ZF G dj dkeF          ZG G dl dmeF          ZH G dn doeF          ZI G dp dq          ZJdS )va  Tools to monitor driver events.

.. versionadded:: 3.1

.. attention:: Starting in PyMongo 3.11, the monitoring classes outlined below
    are included in the PyMongo distribution under the
    :mod:`~pymongo.event_loggers` submodule.

Use :func:`register` to register global listeners for specific events.
Listeners must inherit from one of the abstract classes below and implement
the correct functions for that class.

For example, a simple command logger might be implemented like this::

    import logging

    from pymongo import monitoring

    class CommandLogger(monitoring.CommandListener):

        def started(self, event):
            logging.info("Command {0.command_name} with request id "
                         "{0.request_id} started on server "
                         "{0.connection_id}".format(event))

        def succeeded(self, event):
            logging.info("Command {0.command_name} with request id "
                         "{0.request_id} on server {0.connection_id} "
                         "succeeded in {0.duration_micros} "
                         "microseconds".format(event))

        def failed(self, event):
            logging.info("Command {0.command_name} with request id "
                         "{0.request_id} on server {0.connection_id} "
                         "failed in {0.duration_micros} "
                         "microseconds".format(event))

    monitoring.register(CommandLogger())

Server discovery and monitoring events are also available. For example::

    class ServerLogger(monitoring.ServerListener):

        def opened(self, event):
            logging.info("Server {0.server_address} added to topology "
                         "{0.topology_id}".format(event))

        def description_changed(self, event):
            previous_server_type = event.previous_description.server_type
            new_server_type = event.new_description.server_type
            if new_server_type != previous_server_type:
                # server_type_name was added in PyMongo 3.4
                logging.info(
                    "Server {0.server_address} changed type from "
                    "{0.previous_description.server_type_name} to "
                    "{0.new_description.server_type_name}".format(event))

        def closed(self, event):
            logging.warning("Server {0.server_address} removed from topology "
                            "{0.topology_id}".format(event))


    class HeartbeatLogger(monitoring.ServerHeartbeatListener):

        def started(self, event):
            logging.info("Heartbeat sent to server "
                         "{0.connection_id}".format(event))

        def succeeded(self, event):
            # The reply.document attribute was added in PyMongo 3.4.
            logging.info("Heartbeat to server {0.connection_id} "
                         "succeeded with reply "
                         "{0.reply.document}".format(event))

        def failed(self, event):
            logging.warning("Heartbeat to server {0.connection_id} "
                            "failed with error {0.reply}".format(event))

    class TopologyLogger(monitoring.TopologyListener):

        def opened(self, event):
            logging.info("Topology with id {0.topology_id} "
                         "opened".format(event))

        def description_changed(self, event):
            logging.info("Topology description updated for "
                         "topology id {0.topology_id}".format(event))
            previous_topology_type = event.previous_description.topology_type
            new_topology_type = event.new_description.topology_type
            if new_topology_type != previous_topology_type:
                # topology_type_name was added in PyMongo 3.4
                logging.info(
                    "Topology {0.topology_id} changed type from "
                    "{0.previous_description.topology_type_name} to "
                    "{0.new_description.topology_type_name}".format(event))
            # The has_writable_server and has_readable_server methods
            # were added in PyMongo 3.4.
            if not event.new_description.has_writable_server():
                logging.warning("No writable servers available.")
            if not event.new_description.has_readable_server():
                logging.warning("No readable servers available.")

        def closed(self, event):
            logging.info("Topology with id {0.topology_id} "
                         "closed".format(event))

Connection monitoring and pooling events are also available. For example::

    class ConnectionPoolLogger(ConnectionPoolListener):

        def pool_created(self, event):
            logging.info("[pool {0.address}] pool created".format(event))

        def pool_ready(self, event):
            logging.info("[pool {0.address}] pool is ready".format(event))

        def pool_cleared(self, event):
            logging.info("[pool {0.address}] pool cleared".format(event))

        def pool_closed(self, event):
            logging.info("[pool {0.address}] pool closed".format(event))

        def connection_created(self, event):
            logging.info("[pool {0.address}][connection #{0.connection_id}] "
                         "connection created".format(event))

        def connection_ready(self, event):
            logging.info("[pool {0.address}][connection #{0.connection_id}] "
                         "connection setup succeeded".format(event))

        def connection_closed(self, event):
            logging.info("[pool {0.address}][connection #{0.connection_id}] "
                         "connection closed, reason: "
                         "{0.reason}".format(event))

        def connection_check_out_started(self, event):
            logging.info("[pool {0.address}] connection check out "
                         "started".format(event))

        def connection_check_out_failed(self, event):
            logging.info("[pool {0.address}] connection check out "
                         "failed, reason: {0.reason}".format(event))

        def connection_checked_out(self, event):
            logging.info("[pool {0.address}][connection #{0.connection_id}] "
                         "connection checked out of pool".format(event))

        def connection_checked_in(self, event):
            logging.info("[pool {0.address}][connection #{0.connection_id}] "
                         "connection checked into pool".format(event))


Event listeners can also be registered per instance of
:class:`~pymongo.mongo_client.MongoClient`::

    client = MongoClient(event_listeners=[CommandLogger()])

Note that previously registered global listeners are automatically included
when configuring per client event listeners. Registering a new global listener
will not add that listener to existing client instances.

.. note:: Events are delivered **synchronously**. Application threads block
  waiting for event handlers (e.g. :meth:`~CommandListener.started`) to
  return. Care must be taken to ensure that your event handlers are efficient
  enough to not adversely affect overall application performance.

.. warning:: The command documents published through this API are *not* copies.
  If you intend to modify them in any way you must copy them in your event
  handler first.
    )annotationsN)abc
namedtuple)TYPE_CHECKINGAnyMappingOptionalSequence)ObjectId)HelloHelloCompat)_handle_exception)_Address_DocumentOut)	timedelta)ServerDescription)TopologyDescription
_Listeners)command_listenersserver_listenersserver_heartbeat_listenerstopology_listenerscmap_listenersc                      e Zd ZdZdS )_EventListenerz,Abstract base class for all event listeners.N)__name__
__module____qualname____doc__     V/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/pymongo/monitoring.pyr   r      s        6666r!   r   c                  *    e Zd ZdZddZddZdd
ZdS )CommandListenerzAbstract base class for command listeners.

    Handles `CommandStartedEvent`, `CommandSucceededEvent`,
    and `CommandFailedEvent`.
    eventCommandStartedEventreturnNonec                    t           )zAbstract method to handle a `CommandStartedEvent`.

        :Parameters:
          - `event`: An instance of :class:`CommandStartedEvent`.
        NotImplementedErrorselfr%   s     r"   startedzCommandListener.started   
     "!r!   CommandSucceededEventc                    t           )zAbstract method to handle a `CommandSucceededEvent`.

        :Parameters:
          - `event`: An instance of :class:`CommandSucceededEvent`.
        r*   r,   s     r"   	succeededzCommandListener.succeeded   r/   r!   CommandFailedEventc                    t           )zAbstract method to handle a `CommandFailedEvent`.

        :Parameters:
          - `event`: An instance of :class:`CommandFailedEvent`.
        r*   r,   s     r"   failedzCommandListener.failed   r/   r!   N)r%   r&   r'   r(   )r%   r0   r'   r(   )r%   r3   r'   r(   r   r   r   r   r.   r2   r5   r    r!   r"   r$   r$      sZ         " " " "" " " "" " " " " "r!   r$   c                  j    e Zd ZdZddZddZdd
ZddZd dZd!dZ	d"dZ
d#dZd$dZd%dZd&dZdS )'ConnectionPoolListenera-  Abstract base class for connection pool listeners.

    Handles all of the connection pool events defined in the Connection
    Monitoring and Pooling Specification:
    :class:`PoolCreatedEvent`, :class:`PoolClearedEvent`,
    :class:`PoolClosedEvent`, :class:`ConnectionCreatedEvent`,
    :class:`ConnectionReadyEvent`, :class:`ConnectionClosedEvent`,
    :class:`ConnectionCheckOutStartedEvent`,
    :class:`ConnectionCheckOutFailedEvent`,
    :class:`ConnectionCheckedOutEvent`,
    and :class:`ConnectionCheckedInEvent`.

    .. versionadded:: 3.9
    r%   PoolCreatedEventr'   r(   c                    t           )zAbstract method to handle a :class:`PoolCreatedEvent`.

        Emitted when a connection Pool is created.

        :Parameters:
          - `event`: An instance of :class:`PoolCreatedEvent`.
        r*   r,   s     r"   pool_createdz#ConnectionPoolListener.pool_created  
     "!r!   PoolReadyEventc                    t           )zAbstract method to handle a :class:`PoolReadyEvent`.

        Emitted when a connection Pool is marked ready.

        :Parameters:
          - `event`: An instance of :class:`PoolReadyEvent`.

        .. versionadded:: 4.0
        r*   r,   s     r"   
pool_readyz!ConnectionPoolListener.pool_ready  s
     "!r!   PoolClearedEventc                    t           )zAbstract method to handle a `PoolClearedEvent`.

        Emitted when a connection Pool is cleared.

        :Parameters:
          - `event`: An instance of :class:`PoolClearedEvent`.
        r*   r,   s     r"   pool_clearedz#ConnectionPoolListener.pool_cleared$  r<   r!   PoolClosedEventc                    t           )zAbstract method to handle a `PoolClosedEvent`.

        Emitted when a connection Pool is closed.

        :Parameters:
          - `event`: An instance of :class:`PoolClosedEvent`.
        r*   r,   s     r"   pool_closedz"ConnectionPoolListener.pool_closed.  r<   r!   ConnectionCreatedEventc                    t           )zAbstract method to handle a :class:`ConnectionCreatedEvent`.

        Emitted when a connection Pool creates a Connection object.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCreatedEvent`.
        r*   r,   s     r"   connection_createdz)ConnectionPoolListener.connection_created8  r<   r!   ConnectionReadyEventc                    t           )zAbstract method to handle a :class:`ConnectionReadyEvent`.

        Emitted when a connection has finished its setup, and is now ready to
        use.

        :Parameters:
          - `event`: An instance of :class:`ConnectionReadyEvent`.
        r*   r,   s     r"   connection_readyz'ConnectionPoolListener.connection_readyB  
     "!r!   ConnectionClosedEventc                    t           )zAbstract method to handle a :class:`ConnectionClosedEvent`.

        Emitted when a connection Pool closes a connection.

        :Parameters:
          - `event`: An instance of :class:`ConnectionClosedEvent`.
        r*   r,   s     r"   connection_closedz(ConnectionPoolListener.connection_closedM  r<   r!   ConnectionCheckOutStartedEventc                    t           )zAbstract method to handle a :class:`ConnectionCheckOutStartedEvent`.

        Emitted when the driver starts attempting to check out a connection.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCheckOutStartedEvent`.
        r*   r,   s     r"   connection_check_out_startedz3ConnectionPoolListener.connection_check_out_startedW  r<   r!   ConnectionCheckOutFailedEventc                    t           )zAbstract method to handle a :class:`ConnectionCheckOutFailedEvent`.

        Emitted when the driver's attempt to check out a connection fails.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCheckOutFailedEvent`.
        r*   r,   s     r"   connection_check_out_failedz2ConnectionPoolListener.connection_check_out_faileda  r<   r!   ConnectionCheckedOutEventc                    t           )zAbstract method to handle a :class:`ConnectionCheckedOutEvent`.

        Emitted when the driver successfully checks out a connection.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCheckedOutEvent`.
        r*   r,   s     r"   connection_checked_outz-ConnectionPoolListener.connection_checked_outk  r<   r!   ConnectionCheckedInEventc                    t           )a  Abstract method to handle a :class:`ConnectionCheckedInEvent`.

        Emitted when the driver checks in a connection back to the connection
        Pool.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCheckedInEvent`.
        r*   r,   s     r"   connection_checked_inz,ConnectionPoolListener.connection_checked_inu  rL   r!   N)r%   r9   r'   r(   )r%   r=   r'   r(   )r%   r@   r'   r(   )r%   rC   r'   r(   )r%   rF   r'   r(   )r%   rI   r'   r(   )r%   rM   r'   r(   )r%   rP   r'   r(   )r%   rS   r'   r(   )r%   rV   r'   r(   )r%   rY   r'   r(   )r   r   r   r   r;   r?   rB   rE   rH   rK   rO   rR   rU   rX   r[   r    r!   r"   r8   r8      s         " " " "
" 
" 
" 
"" " " "" " " "" " " "	" 	" 	" 	"" " " "" " " "" " " "" " " "	" 	" 	" 	" 	" 	"r!   r8   c                  *    e Zd ZdZddZddZdd
ZdS )ServerHeartbeatListenerzAbstract base class for server heartbeat listeners.

    Handles `ServerHeartbeatStartedEvent`, `ServerHeartbeatSucceededEvent`,
    and `ServerHeartbeatFailedEvent`.

    .. versionadded:: 3.3
    r%   ServerHeartbeatStartedEventr'   r(   c                    t           )zAbstract method to handle a `ServerHeartbeatStartedEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerHeartbeatStartedEvent`.
        r*   r,   s     r"   r.   zServerHeartbeatListener.started  r/   r!   ServerHeartbeatSucceededEventc                    t           )zAbstract method to handle a `ServerHeartbeatSucceededEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerHeartbeatSucceededEvent`.
        r*   r,   s     r"   r2   z!ServerHeartbeatListener.succeeded  r/   r!   ServerHeartbeatFailedEventc                    t           )zAbstract method to handle a `ServerHeartbeatFailedEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerHeartbeatFailedEvent`.
        r*   r,   s     r"   r5   zServerHeartbeatListener.failed  r/   r!   N)r%   r^   r'   r(   )r%   r`   r'   r(   )r%   rb   r'   r(   r6   r    r!   r"   r]   r]     sZ         " " " "" " " "" " " " " "r!   r]   c                  *    e Zd ZdZddZddZdd
ZdS )TopologyListenerzAbstract base class for topology monitoring listeners.
    Handles `TopologyOpenedEvent`, `TopologyDescriptionChangedEvent`, and
    `TopologyClosedEvent`.

    .. versionadded:: 3.3
    r%   TopologyOpenedEventr'   r(   c                    t           )zAbstract method to handle a `TopologyOpenedEvent`.

        :Parameters:
          - `event`: An instance of :class:`TopologyOpenedEvent`.
        r*   r,   s     r"   openedzTopologyListener.opened  r/   r!   TopologyDescriptionChangedEventc                    t           )zAbstract method to handle a `TopologyDescriptionChangedEvent`.

        :Parameters:
          - `event`: An instance of :class:`TopologyDescriptionChangedEvent`.
        r*   r,   s     r"   description_changedz$TopologyListener.description_changed  r/   r!   TopologyClosedEventc                    t           )zAbstract method to handle a `TopologyClosedEvent`.

        :Parameters:
          - `event`: An instance of :class:`TopologyClosedEvent`.
        r*   r,   s     r"   closedzTopologyListener.closed  r/   r!   N)r%   rf   r'   r(   )r%   ri   r'   r(   )r%   rl   r'   r(   r   r   r   r   rh   rk   rn   r    r!   r"   re   re     Z         " " " "" " " "" " " " " "r!   re   c                  *    e Zd ZdZddZddZdd
ZdS )ServerListenerzAbstract base class for server listeners.
    Handles `ServerOpeningEvent`, `ServerDescriptionChangedEvent`, and
    `ServerClosedEvent`.

    .. versionadded:: 3.3
    r%   ServerOpeningEventr'   r(   c                    t           )zAbstract method to handle a `ServerOpeningEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerOpeningEvent`.
        r*   r,   s     r"   rh   zServerListener.opened  r/   r!   ServerDescriptionChangedEventc                    t           )zAbstract method to handle a `ServerDescriptionChangedEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerDescriptionChangedEvent`.
        r*   r,   s     r"   rk   z"ServerListener.description_changed  r/   r!   ServerClosedEventc                    t           )zAbstract method to handle a `ServerClosedEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerClosedEvent`.
        r*   r,   s     r"   rn   zServerListener.closed  r/   r!   N)r%   rs   r'   r(   )r%   ru   r'   r(   )r%   rw   r'   r(   ro   r    r!   r"   rr   rr     rp   r!   rr   durr   r'   intc                J    t          |                                 dz            S )z'Convert duration 'dur' to microseconds.g    .A)rz   total_seconds)ry   s    r"   
_to_microsr}     s!    s  ""T)***r!   optionstr	listenersSequence[_EventListeners]c                    t          |t          j                  st          |  d          |D ]*}t          |t                    st          d|  d          +|S )zValidate event listenersz must be a list or tupleListeners for x must be either a CommandListener, ServerHeartbeatListener, ServerListener, TopologyListener, or ConnectionPoolListener.)
isinstancer   r
   	TypeErrorr   )r~   r   listeners      r"   _validate_event_listenersr     s     i.. =6;;;<<<  (N33 	* * * *  	 r!   r   r(   c                b   t          | t                    st          d|  d          t          | t                    rt          j                            |            t          | t                    rt          j                            |            t          | t                    rt          j
                            |            t          | t                    rt          j                            |            t          | t                    r!t          j                            |            dS dS )a   Register a global event listener.

    :Parameters:
      - `listener`: A subclasses of :class:`CommandListener`,
        :class:`ServerHeartbeatListener`, :class:`ServerListener`,
        :class:`TopologyListener`, or :class:`ConnectionPoolListener`.
    r   r   N)r   r   r   r$   
_LISTENERSr   appendr]   r   rr   r   re   r   r8   r   )r   s    r"   registerr     s     h// 
&X & & &
 
 	
 (O,, 6$++H555(344 ?-44X>>>(N++ 5#**8444(,-- 7%,,X666(233 3!((222223 3r!   >	   copydbgetnonce	saslstart
createuser
updateuserauthenticatesaslcontinuecopydbgetnoncecopydbsaslstartset_SENSITIVE_COMMANDScommand_namedocMapping[str, Any]boolc                V    |                                  dt          j        fv rd|v rdS dS )NhellospeculativeAuthenticateTF)lowerr   
LEGACY_CMD)r   r   s     r"   _is_speculative_authenticater   (  s6    +*@ AAA%,,t5r!   c                      e Zd ZdZdZ	 	 dddZedd            Zedd            Zedd            Z	edd            Z
edd            Zedd            ZdS ) _CommandEventzBase class for command events.)
__cmd_name	__rqst_id	__conn_id__op_id__service_id__dbN r   r   
request_idrz   connection_idr   operation_idOptional[int]
service_idOptional[ObjectId]database_namer'   r(   c                Z    || _         || _        || _        || _        || _        || _        d S N)_CommandEvent__cmd_name_CommandEvent__rqst_id_CommandEvent__conn_id_CommandEvent__op_id_CommandEvent__service_id_CommandEvent__db)r-   r   r   r   r   r   r   s          r"   __init__z_CommandEvent.__init__6  s3     '#&#&!			r!   c                    | j         S )zThe command name.)r   r-   s    r"   r   z_CommandEvent.command_nameF       r!   c                    | j         S )z"The request id for this operation.)r   r   s    r"   r   z_CommandEvent.request_idK       ~r!   c                    | j         S )z@The address (host, port) of the server this command was sent to.)r   r   s    r"   r   z_CommandEvent.connection_idP  r   r!   c                    | j         S )z^The service_id this command was sent to, or ``None``.

        .. versionadded:: 3.12
        )r   r   s    r"   r   z_CommandEvent.service_idU  s       r!   c                    | j         S )z(An id for this series of events or None.)r   r   s    r"   r   z_CommandEvent.operation_id]       |r!   c                    | j         S )z^The database_name this command was sent to, or ``""``.

        .. versionadded:: 4.6
        )r   r   s    r"   r   z_CommandEvent.database_nameb  s     yr!   Nr   )r   r   r   rz   r   r   r   r   r   r   r   r   r'   r(   r'   r   r'   rz   r'   r   r'   r   )r'   r   )r   r   r   r   	__slots__r   propertyr   r   r   r   r   r   r    r!   r"   r   r   1  s        (([I *." " " " "     X    X    X ! ! ! X!    X    X  r!   r   c                  h     e Zd ZdZdZ	 dd fdZedd            Zed fd            ZddZ	 xZ
S )r&   a  Event published when a command starts.

    :Parameters:
      - `command`: The command document.
      - `database_name`: The name of the database this command was run against.
      - `request_id`: The request id for this operation.
      - `connection_id`: The address (host, port) of the server this command
        was sent to.
      - `operation_id`: An optional identifier for a series of related events.
      - `service_id`: The service_id this command was sent to, or ``None``.
    )__cmdNcommandr   r   r   r   rz   r   r   r   r   r   r   r'   r(   c                0   |st          |d          t          t          |                    }t                                          ||||||           |                                }|t          v st          ||          r	i | _        d S || _        d S )Nz is not a valid commandr   r   )	
ValueErrornextitersuperr   r   r   r   _CommandStartedEvent__cmd)
r-   r   r   r   r   r   r   r   cmd_name	__class__s
            r"   r   zCommandStartedEvent.__init__z  s      	DBBBCCCDMM**!' 	 	
 	
 	
  %%''***.J8U\.].]*')DJJJ DJJJr!   c                    | j         S )zThe command document.)r   r   s    r"   r   zCommandStartedEvent.command  s     zr!   c                *    t                      j        S )z6The name of the database this command was run against.)r   r   r-   r   s    r"   r   z!CommandStartedEvent.database_name  s     ww$$r!   c                |    d                     | j        j        | j        | j        | j        | j        | j                  S )NzA<{} {} db: {!r}, command: {!r}, operation_id: {}, service_id: {}>)formatr   r   r   r   r   r   r   r   s    r"   __repr__zCommandStartedEvent.__repr__  s?    S[[N#O
 
 	
r!   r   )r   r   r   r   r   rz   r   r   r   r   r   r   r'   r(   r'   r   r   )r   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r"   r&   r&   k  s        
 
 I *.! ! ! ! ! ! !6    X % % % % % X%
 
 
 
 
 
 
 
r!   r&   c                  f     e Zd ZdZdZ	 	 dd fdZedd            Zedd            ZddZ	 xZ
S )r0   aX  Event published when a command succeeds.

    :Parameters:
      - `duration`: The command duration as a datetime.timedelta.
      - `reply`: The server reply document.
      - `command_name`: The command name.
      - `request_id`: The request id for this operation.
      - `connection_id`: The address (host, port) of the server this command
        was sent to.
      - `operation_id`: An optional identifier for a series of related events.
      - `service_id`: The service_id this command was sent to, or ``None``.
      - `database_name`: The database this command was sent to, or ``""``.
    )__duration_micros__replyNr   durationdatetime.timedeltareplyr   r   r   r   rz   r   r   r   r   r   r   r   r'   r(   c	                    t                                          ||||||           t          |          | _        |                                }	|	t
          v st          |	|          r	i | _        d S || _        d S Nr   )r   r   r}   '_CommandSucceededEvent__duration_microsr   r   r   _CommandSucceededEvent__reply)r-   r   r   r   r   r   r   r   r   r   r   s             r"   r   zCommandSucceededEvent.__init__  s     	!' 	 	
 	
 	
 ",H!5!5%%''***.J8UZ.[.[*)+DLLL DLLLr!   c                    | j         S z/The duration of this operation in microseconds.)r   r   s    r"   duration_microsz%CommandSucceededEvent.duration_micros       %%r!   c                    | j         S z/The server failure document for this operation.)r   r   s    r"   r   zCommandSucceededEvent.reply  r   r!   c           	         d                     | j        j        | j        | j        | j        | j        | j        | j                  S )NzV<{} {} db: {!r}, command: {!r}, operation_id: {}, duration_micros: {}, service_id: {}>)	r   r   r   r   r   r   r   r   r   r   s    r"   r   zCommandSucceededEvent.__repr__  sD    d
&N# O
 

	
r!   r   )r   r   r   r   r   r   r   rz   r   r   r   r   r   r   r   r   r'   r(   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   s   @r"   r0   r0     s          1I *.! ! ! ! ! ! !4 & & & X&    X
 
 
 
 
 
 
 
r!   r0   c                  f     e Zd ZdZdZ	 	 dd fdZedd            Zedd            ZddZ	 xZ
S )r3   aW  Event published when a command fails.

    :Parameters:
      - `duration`: The command duration as a datetime.timedelta.
      - `failure`: The server reply document.
      - `command_name`: The command name.
      - `request_id`: The request id for this operation.
      - `connection_id`: The address (host, port) of the server this command
        was sent to.
      - `operation_id`: An optional identifier for a series of related events.
      - `service_id`: The service_id this command was sent to, or ``None``.
      - `database_name`: The database this command was sent to, or ``""``.
    )r   	__failureNr   r   r   failurer   r   r   r   rz   r   r   r   r   r   r   r   r'   r(   c	                    t                                          ||||||           t          |          | _        || _        d S r   )r   r   r}   $_CommandFailedEvent__duration_micros_CommandFailedEvent__failure)
r-   r   r   r   r   r   r   r   r   r   s
            r"   r   zCommandFailedEvent.__init__  sU     	!' 	 	
 	
 	
 ",H!5!5 r!   c                    | j         S r   )r   r   s    r"   r   z"CommandFailedEvent.duration_micros  r   r!   c                    | j         S r   )r   r   s    r"   r   zCommandFailedEvent.failure  r   r!   c           
         d                     | j        j        | j        | j        | j        | j        | j        | j        | j	                  S )Nze<{} {} db: {!r}, command: {!r}, operation_id: {}, duration_micros: {}, failure: {!r}, service_id: {}>)
r   r   r   r   r   r   r   r   r   r   r   s    r"   r   zCommandFailedEvent.__repr__  sK    -
&N# LO	
 	
	
r!   r   )r   r   r   r   r   r   r   rz   r   r   r   r   r   r   r   r   r'   r(   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   s   @r"   r3   r3     s          3I *.! ! ! ! ! ! !, & & & X&    X
 
 
 
 
 
 
 
r!   r3   c                  >    e Zd ZdZdZddZedd            Zdd
ZdS )
_PoolEventzBase class for pool events.	__addressaddressr   r'   r(   c                    || _         d S r   _PoolEvent__addressr-   r   s     r"   r   z_PoolEvent.__init__3       r!   c                    | j         S )zbThe address (host, port) pair of the server the pool is attempting
        to connect to.
        r  r   s    r"   r   z_PoolEvent.address6      
 ~r!   r   c                0    | j         j         d| j        dS N())r   r   r  r   s    r"   r   z_PoolEvent.__repr__=       .)??DN????r!   Nr   r   r'   r(   r   r   	r   r   r   r   r   r   r   r   r   r    r!   r"   r   r   .  sm        %%I! ! ! !    X@ @ @ @ @ @r!   r   c                  H     e Zd ZdZdZd fd	Zedd
            ZddZ xZ	S )r9   zPublished when a Connection Pool is created.

    :Parameters:
     - `address`: The address (host, port) pair of the server this Pool is
       attempting to connect to.

    .. versionadded:: 3.9
    )	__optionsr   r   optionsdict[str, Any]r'   r(   c                X    t                                          |           || _        d S r   )r   r   _PoolCreatedEvent__options)r-   r   r  r   s      r"   r   zPoolCreatedEvent.__init__M  s&    !!! r!   c                    | j         S )zCAny non-default pool options that were set on this Connection Pool.)r  r   s    r"   r  zPoolCreatedEvent.optionsQ  r   r!   r   c                @    | j         j         d| j        d| j        dS Nr	  z, r
  )r   r   r   r  r   s    r"   r   zPoolCreatedEvent.__repr__V  s*    .)QQDLQQdnQQQQr!   r   r   r  r  r'   r(   )r'   r  r   )
r   r   r   r   r   r   r   r  r   r   r   s   @r"   r9   r9   A  s          I! ! ! ! ! !    XR R R R R R R Rr!   r9   c                      e Zd ZdZdZdS )r=   zPublished when a Connection Pool is marked ready.

    :Parameters:
     - `address`: The address (host, port) pair of the server this Pool is
       attempting to connect to.

    .. versionadded:: 4.0
    r    Nr   r   r   r   r   r    r!   r"   r=   r=   Z            IIIr!   r=   c                  J     e Zd ZdZdZdd fd
Zedd            ZddZ xZ	S )r@   a  Published when a Connection Pool is cleared.

    :Parameters:
     - `address`: The address (host, port) pair of the server this Pool is
       attempting to connect to.
     - `service_id`: The service_id this command was sent to, or ``None``.

    .. versionadded:: 3.9
    )r   Nr   r   r   r   r'   r(   c                X    t                                          |           || _        d S r   )r   r   _PoolClearedEvent__service_id)r-   r   r   r   s      r"   r   zPoolClearedEvent.__init__t  s)    !!!&r!   c                    | j         S )zConnections with this service_id are cleared.

        When service_id is ``None``, all connections in the pool are cleared.

        .. versionadded:: 3.12
        )r  r   s    r"   r   zPoolClearedEvent.service_idx  s       r!   r   c                @    | j         j         d| j        d| j        dS r  )r   r   r   r  r   s    r"   r   zPoolClearedEvent.__repr__  s+    .)TTDLTTd>OTTTTr!   r   r   r   r   r   r'   r(   r   r   )
r   r   r   r   r   r   r   r   r   r   r   s   @r"   r@   r@   g  s          "I' ' ' ' ' ' ' ! ! ! X!U U U U U U U Ur!   r@   c                      e Zd ZdZdZdS )rC   zPublished when a Connection Pool is closed.

    :Parameters:
     - `address`: The address (host, port) pair of the server this Pool is
       attempting to connect to.

    .. versionadded:: 3.9
    r    Nr  r    r!   r"   rC   rC     r  r!   rC   c                  (    e Zd ZdZdZ	 dZ	 dZ	 dZdS )ConnectionClosedReasonzqAn enum that defines values for `reason` on a
    :class:`ConnectionClosedEvent`.

    .. versionadded:: 3.9
    staleidleerror
poolClosedN)r   r   r   r   STALEIDLEERRORPOOL_CLOSEDr    r!   r"   r#  r#    s=          EFD EIKEEr!   r#  c                  "    e Zd ZdZdZ	 dZ	 dZdS )ConnectionCheckOutFailedReasonzyAn enum that defines values for `reason` on a
    :class:`ConnectionCheckOutFailedEvent`.

    .. versionadded:: 3.9
    timeoutr'  connectionErrorN)r   r   r   r   TIMEOUTr+  
CONN_ERRORr    r!   r"   r-  r-    s5          GJKM"J r!   r-  c                  >    e Zd ZdZdZddZedd            Zdd
ZdS )_ConnectionEventz)Private base class for connection events.r   r   r   r'   r(   c                    || _         d S r   _ConnectionEvent__addressr  s     r"   r   z_ConnectionEvent.__init__  r  r!   c                    | j         S )ziThe address (host, port) pair of the server this connection is
        attempting to connect to.
        r5  r   s    r"   r   z_ConnectionEvent.address  r  r!   r   c                0    | j         j         d| j        dS r  )r   r   r6  r   s    r"   r   z_ConnectionEvent.__repr__  r  r!   Nr  r   r   r  r    r!   r"   r3  r3    sm        33I! ! ! !    X@ @ @ @ @ @r!   r3  c                  H     e Zd ZdZdZd fd	Zedd
            ZddZ xZ	S )_ConnectionIdEventz4Private base class for connection events with an id.)__connection_idr   r   r   rz   r'   r(   c                X    t                                          |           || _        d S r   )r   r   !_ConnectionIdEvent__connection_id)r-   r   r   r   s      r"   r   z_ConnectionIdEvent.__init__  s)    !!!,r!   c                    | j         S )zThe ID of the connection.)r=  r   s    r"   r   z _ConnectionIdEvent.connection_id  s     ##r!   r   c                @    | j         j         d| j        d| j        dS r  )r   r   r   r=  r   s    r"   r   z_ConnectionIdEvent.__repr__  s+    .)WWDLWWd>RWWWWr!   r   r   r   rz   r'   r(   r   r   )
r   r   r   r   r   r   r   r   r   r   r   s   @r"   r:  r:    s        >>$I- - - - - - $ $ $ X$X X X X X X X Xr!   r:  c                      e Zd ZdZdZdS )rF   a  Published when a Connection Pool creates a Connection object.

    NOTE: This connection is not ready for use until the
    :class:`ConnectionReadyEvent` is published.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.

    .. versionadded:: 3.9
    r    Nr  r    r!   r"   rF   rF     s          IIIr!   rF   c                      e Zd ZdZdZdS )rI   a3  Published when a Connection has finished its setup, and is ready to use.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.

    .. versionadded:: 3.9
    r    Nr  r    r!   r"   rI   rI               IIIr!   rI   c                  H     e Zd ZdZdZd fd	Zedd            ZddZ xZ	S )rM   aV  Published when a Connection is closed.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.
     - `reason`: A reason explaining why this connection was closed.

    .. versionadded:: 3.9
    __reasonr   r   r   rz   reasonr   c                Z    t                                          ||           || _        d S r   )r   r   _ConnectionClosedEvent__reason)r-   r   r   rG  r   s       r"   r   zConnectionClosedEvent.__init__  s(    -000r!   r'   c                    | j         S )zA reason explaining why this connection was closed.

        The reason must be one of the strings from the
        :class:`ConnectionClosedReason` enum.
        )rI  r   s    r"   rG  zConnectionClosedEvent.reason       }r!   c                d    d                     | j        j        | j        | j        | j                  S )Nz{}({!r}, {!r}, {!r}))r   r   r   r   r   rI  r   s    r"   r   zConnectionClosedEvent.__repr__  s2    %,,N#LM	
 
 	
r!   )r   r   r   rz   rG  r   r   
r   r   r   r   r   r   r   rG  r   r   r   s   @r"   rM   rM     s        	 	 I         X
 
 
 
 
 
 
 
r!   rM   c                      e Zd ZdZdZdS )rP   zPublished when the driver starts attempting to check out a connection.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.

    .. versionadded:: 3.9
    r    Nr  r    r!   r"   rP   rP   #  r  r!   rP   c                  H     e Zd ZdZdZd fd	Zedd
            ZddZ xZ	S )rS   a.  Published when the driver's attempt to check out a connection fails.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `reason`: A reason explaining why connection check out failed.

    .. versionadded:: 3.9
    rE  r   r   rG  r   r'   r(   c                X    t                                          |           || _        d S r   )r   r   &_ConnectionCheckOutFailedEvent__reason)r-   r   rG  r   s      r"   r   z&ConnectionCheckOutFailedEvent.__init__=  s&    !!!r!   c                    | j         S )zA reason explaining why connection check out failed.

        The reason must be one of the strings from the
        :class:`ConnectionCheckOutFailedReason` enum.
        )rQ  r   s    r"   rG  z$ConnectionCheckOutFailedEvent.reasonA  rK  r!   c                @    | j         j         d| j        d| j        dS r  )r   r   r   rQ  r   s    r"   r   z&ConnectionCheckOutFailedEvent.__repr__J  s*    .)PPDLPPdmPPPPr!   r   r   rG  r   r'   r(   r   rM  r   s   @r"   rS   rS   0  s          I         XQ Q Q Q Q Q Q Qr!   rS   c                      e Zd ZdZdZdS )rV   a*  Published when the driver successfully checks out a connection.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.

    .. versionadded:: 3.9
    r    Nr  r    r!   r"   rV   rV   N  rC  r!   rV   c                      e Zd ZdZdZdS )rY   a*  Published when the driver checks in a Connection into the Pool.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.

    .. versionadded:: 3.9
    r    Nr  r    r!   r"   rY   rY   \  rC  r!   rY   c                  V    e Zd ZdZdZdd	Zedd
            Zedd            ZddZ	dS )_ServerEventzBase class for server events.)__server_address__topology_idserver_addressr   topology_idr   r'   r(   c                "    || _         || _        d S r   )_ServerEvent__server_address_ServerEvent__topology_id)r-   r[  r\  s      r"   r   z_ServerEvent.__init__o  s     .(r!   c                    | j         S )z+The address (host, port) pair of the server)r^  r   s    r"   r[  z_ServerEvent.server_addresss  s     $$r!   c                    | j         S z>A unique identifier for the topology this server is a part of.)r_  r   s    r"   r\  z_ServerEvent.topology_idx       !!r!   r   c                B    d| j         j         d| j         d| j         dS )N<  topology_id: >)r   r   r[  r\  r   s    r"   r   z_ServerEvent.__repr__}  s/    c4>*ccT-@ccPTP`ccccr!   Nr[  r   r\  r   r'   r(   r   r'   r   r   )
r   r   r   r   r   r   r   r[  r\  r   r    r!   r"   rX  rX  j  s        ''5I) ) ) ) % % % X% " " " X"d d d d d dr!   rX  c                  `     e Zd ZdZdZd fd
Zedd            Zedd            ZddZ	 xZ
S )ru   zJPublished when server description changes.

    .. versionadded:: 3.3
    __previous_description__new_descriptionprevious_descriptionr   new_descriptionargsr   r'   r(   c                P     t                      j        |  || _        || _        d S r   )r   r   4_ServerDescriptionChangedEvent__previous_description/_ServerDescriptionChangedEvent__new_descriptionr-   ro  rp  rq  r   s       r"   r   z&ServerDescriptionChangedEvent.__init__  /     	$&:#!0r!   c                    | j         S )zUThe previous
        :class:`~pymongo.server_description.ServerDescription`.
        )rs  r   s    r"   ro  z2ServerDescriptionChangedEvent.previous_description      
 **r!   c                    | j         S )zPThe new
        :class:`~pymongo.server_description.ServerDescription`.
        )rt  r   s    r"   rp  z-ServerDescriptionChangedEvent.new_description      
 %%r!   r   c                d    d                     | j        j        | j        | j        | j                  S )Nz <{} {} changed from: {}, to: {}>)r   r   r   r[  ro  rp  r   s    r"   r   z&ServerDescriptionChangedEvent.__repr__  s4    188N#% 	
 
 	
r!   )ro  r   rp  r   rq  r   r'   r(   )r'   r   r   r   r   r   r   r   r   r   ro  rp  r   r   r   s   @r"   ru   ru              
 @I1 1 1 1 1 1 + + + X+ & & & X&
 
 
 
 
 
 
 
r!   ru   c                      e Zd ZdZdZdS )rs   zEPublished when server is initialized.

    .. versionadded:: 3.3
    r    Nr  r    r!   r"   rs   rs              
 IIIr!   rs   c                      e Zd ZdZdZdS )rw   z@Published when server is closed.

    .. versionadded:: 3.3
    r    Nr  r    r!   r"   rw   rw     r  r!   rw   c                  >    e Zd ZdZdZddZedd            Zdd
ZdS )TopologyEventz+Base class for topology description events.)rZ  r\  r   r'   r(   c                    || _         d S r   _TopologyEvent__topology_id)r-   r\  s     r"   r   zTopologyEvent.__init__  s    (r!   c                    | j         S rb  r  r   s    r"   r\  zTopologyEvent.topology_id  rc  r!   r   c                2    d| j         j         d| j         dS )Nre  rg  rh  )r   r   r\  r   s    r"   r   zTopologyEvent.__repr__  s#    M4>*MM$:JMMMMr!   Nr\  r   r'   r(   rj  r   )	r   r   r   r   r   r   r   r\  r   r    r!   r"   r  r    sm        55"I) ) ) ) " " " X"N N N N N Nr!   r  c                  `     e Zd ZdZdZd fd
Zedd            Zedd            ZddZ	 xZ
S )ri   zPPublished when the topology description changes.

    .. versionadded:: 3.3
    rl  ro  r   rp  rq  r   r'   r(   c                P     t                      j        |  || _        || _        d S r   )r   r   6_TopologyDescriptionChangedEvent__previous_description1_TopologyDescriptionChangedEvent__new_descriptionru  s       r"   r   z(TopologyDescriptionChangedEvent.__init__  rv  r!   c                    | j         S )zYThe previous
        :class:`~pymongo.topology_description.TopologyDescription`.
        )r  r   s    r"   ro  z4TopologyDescriptionChangedEvent.previous_description  rx  r!   c                    | j         S )zTThe new
        :class:`~pymongo.topology_description.TopologyDescription`.
        )r  r   s    r"   rp  z/TopologyDescriptionChangedEvent.new_description  rz  r!   r   c                d    d                     | j        j        | j        | j        | j                  S )Nz-<{} topology_id: {} changed from: {}, to: {}>)r   r   r   r\  ro  rp  r   s    r"   r   z(TopologyDescriptionChangedEvent.__repr__  s4    >EEN#% 	
 
 	
r!   )ro  r   rp  r   rq  r   r'   r(   )r'   r   r   r|  r   s   @r"   ri   ri     r}  r!   ri   c                      e Zd ZdZdZdS )rf   zKPublished when the topology is initialized.

    .. versionadded:: 3.3
    r    Nr  r    r!   r"   rf   rf     r  r!   rf   c                      e Zd ZdZdZdS )rl   zFPublished when the topology is closed.

    .. versionadded:: 3.3
    r    Nr  r    r!   r"   rl   rl     r  r!   rl   c                  X    e Zd ZdZdZddd
Zedd            Zedd            ZddZ	dS )_ServerHeartbeatEventz'Base class for server heartbeat events.)r;  	__awaitedFr   r   awaitedr   r'   r(   c                "    || _         || _        d S r   )$_ServerHeartbeatEvent__connection_id_ServerHeartbeatEvent__awaited)r-   r   r  s      r"   r   z_ServerHeartbeatEvent.__init__  s    , r!   c                    | j         S )zSThe address (host, port) of the server this heartbeat was sent
        to.
        )r  r   s    r"   r   z#_ServerHeartbeatEvent.connection_id  s    
 ##r!   c                    | j         S )zgWhether the heartbeat was issued as an awaitable hello command.

        .. versionadded:: 4.6
        )r  r   s    r"   r  z_ServerHeartbeatEvent.awaited  s     ~r!   r   c                B    d| j         j         d| j         d| j         dS )Nre  rf  z
 awaited: rh  )r   r   r   r  r   s    r"   r   z_ServerHeartbeatEvent.__repr__   s-    Z4>*ZZT-?ZZ4<ZZZZr!   NFr   r   r  r   r'   r(   r   r'   r   r   )
r   r   r   r   r   r   r   r   r  r   r    r!   r"   r  r    s        110I! ! ! ! ! $ $ $ X$    X[ [ [ [ [ [r!   r  c                      e Zd ZdZdZdS )r^   zFPublished when a heartbeat is started.

    .. versionadded:: 3.3
    r    Nr  r    r!   r"   r^   r^   $  r  r!   r^   c                       e Zd ZdZdZ	 dd fdZedd            Zedd            Zed fd            Z	ddZ
 xZS )r`   zIFired when the server heartbeat succeeds.

    .. versionadded:: 3.3
    
__durationr   Fr   floatr   r   r   r   r  r   r'   r(   c                h    t                                          ||           || _        || _        d S r   )r   r   (_ServerHeartbeatSucceededEvent__duration%_ServerHeartbeatSucceededEvent__replyr-   r   r   r   r  r   s        r"   r   z&ServerHeartbeatSucceededEvent.__init__5  1     	000"r!   c                    | j         S z/The duration of this heartbeat in microseconds.)r  r   s    r"   r   z&ServerHeartbeatSucceededEvent.duration<  r   r!   c                    | j         S )z-An instance of :class:`~pymongo.hello.Hello`.)r  r   s    r"   r   z#ServerHeartbeatSucceededEvent.replyA  r   r!   c                *    t                      j        S zWhether the heartbeat was awaited.

        If true, then :meth:`duration` reflects the sum of the round trip time
        to the server and the time that the server waited before sending a
        response.

        .. versionadded:: 3.11
        r   r  r   s    r"   r  z%ServerHeartbeatSucceededEvent.awaitedF       wwr!   r   c                p    d                     | j        j        | j        | j        | j        | j                  S )Nz,<{} {} duration: {}, awaited: {}, reply: {}>r   r   r   r   r   r  r   r   s    r"   r   z&ServerHeartbeatSucceededEvent.__repr__R  s7    =DDN#MLJ
 
 	
r!   r  )
r   r  r   r   r   r   r  r   r'   r(   r'   r  )r'   r   r  r   r   r   r   r   r   r   r   r   r   r  r   r   r   s   @r"   r`   r`   -  s         
 *I W\          X    X 	 	 	 	 	 X	
 
 
 
 
 
 
 
r!   r`   c                       e Zd ZdZdZ	 dd fdZedd            Zedd            Zed fd            Z	ddZ
 xZS )rb   zxFired when the server heartbeat fails, either with an "ok: 0"
    or a socket exception.

    .. versionadded:: 3.3
    r  Fr   r  r   	Exceptionr   r   r  r   r'   r(   c                h    t                                          ||           || _        || _        d S r   )r   r   %_ServerHeartbeatFailedEvent__duration"_ServerHeartbeatFailedEvent__replyr  s        r"   r   z#ServerHeartbeatFailedEvent.__init__e  r  r!   c                    | j         S r  )r  r   s    r"   r   z#ServerHeartbeatFailedEvent.durationl  r   r!   c                    | j         S )zA subclass of :exc:`Exception`.)r  r   s    r"   r   z ServerHeartbeatFailedEvent.replyq  r   r!   c                *    t                      j        S r  r  r   s    r"   r  z"ServerHeartbeatFailedEvent.awaitedv  r  r!   r   c                p    d                     | j        j        | j        | j        | j        | j                  S )Nz.<{} {} duration: {}, awaited: {}, reply: {!r}>r  r   s    r"   r   z#ServerHeartbeatFailedEvent.__repr__  s7    ?FFN#MLJ
 
 	
r!   r  )
r   r  r   r  r   r   r  r   r'   r(   r  )r'   r  r  r   r  r   s   @r"   rb   rb   \  s          *I [`          X    X 	 	 	 	 	 X	
 
 
 
 
 
 
 
r!   rb   c                  j   e Zd ZdZdJdZedKd            ZedKd            ZedKd	            ZedKd
            Z	edKd            Z
dLdZ	 	 dMdNdZ	 	 	 	 dOdPd$Z	 	 	 dQdRd&ZdSd(ZdTd+ZdUd-ZdVd1ZdVd2ZdWd6ZdXd7ZdXd8ZdYd:ZdZd>Zd[d?Zd\d@Zd[dAZd]dBZd]dCZd^dEZd[dFZd_dGZ d]dHZ!d]dIZ"dS )`_EventListenerszConfigure event listeners for a client instance.

    Any event listeners registered globally are included by default.

    :Parameters:
      - `listeners`: A list of event listeners.
    r   "Optional[Sequence[_EventListener]]c                   t           j        d d          | _        t           j        d d          | _        t           j        }|d d          | _        t           j        d d          | _        t           j	        d d          | _
        ||D ]}t          |t                    r| j                            |           t          |t                    r| j                            |           t          |t                    r| j                            |           t          |t                     r| j                            |           t          |t"                    r| j
                            |           t%          | j                  | _        t%          | j                  | _        t%          | j                  | _        t%          | j                  | _        t%          | j
                  | _        d S r   )r   r   "_EventListeners__command_listenersr   !_EventListeners__server_listenersr   +_EventListeners__server_heartbeat_listenersr   #_EventListeners__topology_listenersr   _EventListeners__cmap_listenersr   r$   r   rr   r]   re   r8   r   %_EventListeners__enabled_for_commands#_EventListeners__enabled_for_server-_EventListeners__enabled_for_server_heartbeat%_EventListeners__enabled_for_topology!_EventListeners__enabled_for_cmap)r-   r   lsts      r"   r   z_EventListeners.__init__  s   #-#?#B ","=aaa"@3,/F)$.$A!!!$D! * 9!!! <   
6 
6c?33 9,33C888c>22 8+223777c#:;; B5<<SAAAc#344 :-44S999c#9:: 6)00555&*4+C&D&D#$()@$A$A!.243T.U.U+&*4+D&E&E#"&t'<"="=r!   r'   r   c                    | j         S )z-Are any CommandListener instances registered?)r  r   s    r"   enabled_for_commandsz$_EventListeners.enabled_for_commands       **r!   c                    | j         S )z,Are any ServerListener instances registered?)r  r   s    r"   enabled_for_serverz"_EventListeners.enabled_for_server  s     ((r!   c                    | j         S )z5Are any ServerHeartbeatListener instances registered?)r  r   s    r"   enabled_for_server_heartbeatz,_EventListeners.enabled_for_server_heartbeat  s     22r!   c                    | j         S )z.Are any TopologyListener instances registered?)r  r   s    r"   enabled_for_topologyz$_EventListeners.enabled_for_topology  r  r!   c                    | j         S )z4Are any ConnectionPoolListener instances registered?)r  r   s    r"   enabled_for_cmapz _EventListeners.enabled_for_cmap  s     &&r!   list[_EventListeners]c                P    | j         | j        z   | j        z   | j        z   | j        z   S )z#List of registered event listeners.)r  r  r  r  r  r   s    r"   event_listenersz_EventListeners.event_listeners  s?     $/0%& '( #	$	
r!   Nr   r   r   r   r   rz   r   r   op_idr   r   r   r(   c                    ||}t          ||||||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )a  Publish a CommandStartedEvent to all command listeners.

        :Parameters:
          - `command`: The command document.
          - `database_name`: The name of the database this command was run
            against.
          - `request_id`: The request id for this operation.
          - `connection_id`: The address (host, port) of the server this
            command was sent to.
          - `op_id`: The (optional) operation id for this operation.
          - `service_id`: The service_id this command was sent to, or ``None``.
        N)r   )r&   r  r.   r  r   )	r-   r   r   r   r   r  r   r%   
subscribers	            r"   publish_command_startz%_EventListeners.publish_command_start  s    * =E#]JuQ[
 
 
 2 	$ 	$J$""5)))) $ $ $!#####$	$ 	$s   :AAFr   r   r   r   r   speculative_helloc
           
         ||}|ri }t          ||||||||	          }
| j        D ]6}	 |                    |
           # t          $ r t	                       Y 3w xY wdS )a  Publish a CommandSucceededEvent to all command listeners.

        :Parameters:
          - `duration`: The command duration as a datetime.timedelta.
          - `reply`: The server reply document.
          - `command_name`: The command name.
          - `request_id`: The request id for this operation.
          - `connection_id`: The address (host, port) of the server this
            command was sent to.
          - `op_id`: The (optional) operation id for this operation.
          - `service_id`: The service_id this command was sent to, or ``None``.
          - `speculative_hello`: Was the command sent with speculative auth?
          - `database_name`: The database this command was sent to, or ``""``.
        N)r   )r0   r  r2   r  r   )r-   r   r   r   r   r   r  r   r  r   r%   r  s               r"   publish_command_successz'_EventListeners.publish_command_success  s    4 =E 	 E%'	
 	
 	
 2 	$ 	$J$$$U++++ $ $ $!#####$	$ 	$s   A  AAr   c	           
         ||}t          ||||||||          }	| j        D ]6}
	 |
                    |	           # t          $ r t	                       Y 3w xY wdS )a  Publish a CommandFailedEvent to all command listeners.

        :Parameters:
          - `duration`: The command duration as a datetime.timedelta.
          - `failure`: The server reply document or failure description
            document.
          - `command_name`: The command name.
          - `request_id`: The request id for this operation.
          - `connection_id`: The address (host, port) of the server this
            command was sent to.
          - `op_id`: The (optional) operation id for this operation.
          - `service_id`: The service_id this command was sent to, or ``None``.
          - `database_name`: The database this command was sent to, or ``""``.
        Nr   )r3   r  r5   r  r   )r-   r   r   r   r   r   r  r   r   r%   r  s              r"   publish_command_failurez'_EventListeners.publish_command_failure!  s    2 =E"!'	
 	
 	
 2 	$ 	$J$!!%(((( $ $ $!#####$	$ 	$s   <AAr  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )a  Publish a ServerHeartbeatStartedEvent to all server heartbeat
        listeners.

        :Parameters:
         - `connection_id`: The address (host, port) pair of the connection.
         - `awaited`: True if this heartbeat is part of an awaitable hello command.
        N)r^   r  r.   r  r   )r-   r   r  r%   r  s        r"    publish_server_heartbeat_startedz0_EventListeners.publish_server_heartbeat_startedL  sx     ,M7CC; 	$ 	$J$""5)))) $ $ $!#####$	$ 	$   1AAr  r   c                    t          ||||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )a  Publish a ServerHeartbeatSucceededEvent to all server heartbeat
        listeners.

        :Parameters:
         - `connection_id`: The address (host, port) pair of the connection.
         - `duration`: The execution time of the event in the highest possible
            resolution for the platform.
         - `reply`: The command reply.
         - `awaited`: True if the response was awaited.
        N)r`   r  r2   r  r   r-   r   r   r   r  r%   r  s          r"   "publish_server_heartbeat_succeededz2_EventListeners.publish_server_heartbeat_succeeded[  s|     .h}gVV; 	$ 	$J$$$U++++ $ $ $!#####$	$ 	$   3AAr  c                    t          ||||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )a  Publish a ServerHeartbeatFailedEvent to all server heartbeat
        listeners.

        :Parameters:
         - `connection_id`: The address (host, port) pair of the connection.
         - `duration`: The execution time of the event in the highest possible
            resolution for the platform.
         - `reply`: The command reply.
         - `awaited`: True if the response was awaited.
        N)rb   r  r5   r  r   r  s          r"   publish_server_heartbeat_failedz/_EventListeners.publish_server_heartbeat_failedo  s|     +8UM7SS; 	$ 	$J$!!%(((( $ $ $!#####$	$ 	$r  r[  r\  r   c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )a  Publish a ServerOpeningEvent to all server listeners.

        :Parameters:
         - `server_address`: The address (host, port) pair of the server.
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)rs   r  rh   r  r   r-   r[  r\  r%   r  s        r"   publish_server_openedz%_EventListeners.publish_server_opened  sx     #>;??1 	$ 	$J$!!%(((( $ $ $!#####$	$ 	$r  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )a  Publish a ServerClosedEvent to all server listeners.

        :Parameters:
         - `server_address`: The address (host, port) pair of the server.
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)rw   r  rn   r  r   r  s        r"   publish_server_closedz%_EventListeners.publish_server_closed  sx     ".+>>1 	$ 	$J$!!%(((( $ $ $!#####$	$ 	$r  ro  r   rp  c                    t          ||||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )a  Publish a ServerDescriptionChangedEvent to all server listeners.

        :Parameters:
         - `previous_description`: The previous server description.
         - `server_address`: The address (host, port) pair of the server.
         - `new_description`: The new server description.
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)ru   r  rk   r  r   )r-   ro  rp  r[  r\  r%   r  s          r"   "publish_server_description_changedz2_EventListeners.publish_server_description_changed  s      . />;
 
 1 	$ 	$J$..u5555 $ $ $!#####$	$ 	$r  c                    t          |          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )zPublish a TopologyOpenedEvent to all topology listeners.

        :Parameters:
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)rf   r  rh   r  r   r-   r\  r%   r  s       r"   publish_topology_openedz'_EventListeners.publish_topology_opened  v     $K003 	$ 	$J$!!%(((( $ $ $!#####$	$ 	$   0A
Ac                    t          |          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )zPublish a TopologyClosedEvent to all topology listeners.

        :Parameters:
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)rl   r  rn   r  r   r  s       r"   publish_topology_closedz'_EventListeners.publish_topology_closed  r  r  r   c                    t          |||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )aI  Publish a TopologyDescriptionChangedEvent to all topology listeners.

        :Parameters:
         - `previous_description`: The previous topology description.
         - `new_description`: The new topology description.
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)ri   r  rk   r  r   )r-   ro  rp  r\  r%   r  s         r"   $publish_topology_description_changedz4_EventListeners.publish_topology_description_changed  s|     00DoWbcc3 	$ 	$J$..u5555 $ $ $!#####$	$ 	$   2AAr   r  r  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )z:Publish a :class:`PoolCreatedEvent` to all pool listeners.N)r9   r  r;   r  r   )r-   r   r  r%   r  s        r"   publish_pool_createdz$_EventListeners.publish_pool_created  sv     '22/ 	$ 	$J$''.... $ $ $!#####$	$ 	$r  c                    t          |          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )z8Publish a :class:`PoolReadyEvent` to all pool listeners.N)r=   r  r?   r  r   r-   r   r%   r  s       r"   publish_pool_readyz"_EventListeners.publish_pool_ready  st    w''/ 	$ 	$J$%%e,,,, $ $ $!#####$	$ 	$r  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )z:Publish a :class:`PoolClearedEvent` to all pool listeners.N)r@   r  rB   r  r   )r-   r   r   r%   r  s        r"   publish_pool_clearedz$_EventListeners.publish_pool_cleared  sv     *55/ 	$ 	$J$''.... $ $ $!#####$	$ 	$r  c                    t          |          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )z9Publish a :class:`PoolClosedEvent` to all pool listeners.N)rC   r  rE   r  r   r   s       r"   publish_pool_closedz#_EventListeners.publish_pool_closed  st    ((/ 	$ 	$J$&&u---- $ $ $!#####$	$ 	$r  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )zWPublish a :class:`ConnectionCreatedEvent` to all connection
        listeners.
        N)rF   r  rH   r  r   r-   r   r   r%   r  s        r"   publish_connection_createdz*_EventListeners.publish_connection_created  sx     'w>>/ 	$ 	$J$--e4444 $ $ $!#####$	$ 	$r  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )zDPublish a :class:`ConnectionReadyEvent` to all connection listeners.N)rI   r  rK   r  r   r  s        r"   publish_connection_readyz(_EventListeners.publish_connection_ready  sv    $Wm<</ 	$ 	$J$++E2222 $ $ $!#####$	$ 	$r  rG  c                    t          |||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )zVPublish a :class:`ConnectionClosedEvent` to all connection
        listeners.
        N)rM   r  rO   r  r   )r-   r   r   rG  r%   r  s         r"   publish_connection_closedz)_EventListeners.publish_connection_closed#  sz     &g}fEE/ 	$ 	$J$,,U3333 $ $ $!#####$	$ 	$r  c                    t          |          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )z_Publish a :class:`ConnectionCheckOutStartedEvent` to all connection
        listeners.
        N)rP   r  rR   r  r   r   s       r"   $publish_connection_check_out_startedz4_EventListeners.publish_connection_check_out_started.  sv     /w77/ 	$ 	$J$77>>>> $ $ $!#####$	$ 	$r  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )z^Publish a :class:`ConnectionCheckOutFailedEvent` to all connection
        listeners.
        N)rS   r  rU   r  r   )r-   r   rG  r%   r  s        r"   #publish_connection_check_out_failedz3_EventListeners.publish_connection_check_out_failed9  sx     .gv>>/ 	$ 	$J$66u==== $ $ $!#####$	$ 	$r  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )zZPublish a :class:`ConnectionCheckedOutEvent` to all connection
        listeners.
        N)rV   r  rX   r  r   r  s        r"   publish_connection_checked_outz._EventListeners.publish_connection_checked_outD  sx     *'=AA/ 	$ 	$J$11%8888 $ $ $!#####$	$ 	$r  c                    t          ||          }| j        D ]6}	 |                    |           # t          $ r t	                       Y 3w xY wdS )zYPublish a :class:`ConnectionCheckedInEvent` to all connection
        listeners.
        N)rY   r  r[   r  r   r  s        r"   publish_connection_checked_inz-_EventListeners.publish_connection_checked_inO  sx     )-@@/ 	$ 	$J$007777 $ $ $!#####$	$ 	$r  )r   r  r  )r'   r  )NN)r   r   r   r   r   rz   r   r   r  r   r   r   r'   r(   )NNFr   )r   r   r   r   r   r   r   rz   r   r   r  r   r   r   r  r   r   r   r'   r(   )NNr   )r   r   r   r   r   r   r   rz   r   r   r  r   r   r   r   r   r'   r(   r  )
r   r   r   r  r   r   r  r   r'   r(   )
r   r   r   r  r   r  r  r   r'   r(   ri  )
ro  r   rp  r   r[  r   r\  r   r'   r(   r  )ro  r   rp  r   r\  r   r'   r(   r  r  r   r@  )r   r   r   rz   rG  r   r'   r(   rT  )#r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r    r!   r"   r  r    s        > > > >2 + + + X+ ) ) ) X) 3 3 3 X3 + + + X+ ' ' ' X'
 
 
 
   $)-$ $ $ $ $N  $)-"'.$ .$ .$ .$ .$n  $)-)$ )$ )$ )$ )$V$ $ $ $$ $ $ $($ $ $ $($ $ $ $$ $ $ $$ $ $ $2$ $ $ $$ $ $ $$ $ $ $*$ $ $ $$ $ $ $$ $ $ $$ $ $ $	$ 	$ 	$ 	$$ $ $ $	$ 	$ 	$ 	$	$ 	$ 	$ 	$	$ 	$ 	$ 	$	$ 	$ 	$ 	$	$ 	$ 	$ 	$ 	$ 	$r!   r  )ry   r   r'   rz   )r~   r   r   r   r'   r   )r   r   r'   r(   )r   r   r   r   r'   r   )Kr   
__future__r   datetimecollectionsr   r   typingr   r   r   r	   r
   bson.objectidr   pymongo.hellor   r   pymongo.helpersr   pymongo.typingsr   r   r   pymongo.server_descriptionr   pymongo.topology_descriptionr   r   r   r   r$   r8   r]   re   rr   r}   r   r   r   __annotations__r   r   r&   r0   r3   r   r9   r=   r@   rC   r#  r-  r3  r:  rF   rI   rM   rP   rS   rV   rY   rX  ru   rs   rw   r  ri   rf   rl   r  r^   r`   rb   r  r    r!   r"   <module>r      s  i i iV # " " " " "  ' ' ' ' ' ' ' ' B B B B B B B B B B B B B B " " " " " " , , , , , , , , - - - - - - 2 2 2 2 2 2 2 2 A""""""<<<<<<@@@@@@ Z	 	
 ZBB++
7 7 7 7 7 7 7 7" " " " "n " " "@@" @" @" @" @"^ @" @" @"F" " " " "n " " "D" " " " "~ " " "B" " " " "^ " " "B+ + + +
   "3 3 3 3<
 
 
  
 
 
 
   7 7 7 7 7 7 7 7t<
 <
 <
 <
 <
- <
 <
 <
~@
 @
 @
 @
 @
M @
 @
 @
F>
 >
 >
 >
 >
 >
 >
 >
B@ @ @ @ @ @ @ @&R R R R Rz R R R2
 
 
 
 
Z 
 
 
U U U U Uz U U U>
 
 
 
 
j 
 
 
F F F F F F F F*       &@ @ @ @ @ @ @ @&X X X X X) X X X$    /   "    -   !
 !
 !
 !
 !
. !
 !
 !
H
 
 
 
 
%5 
 
 
Q Q Q Q Q$4 Q Q Q<     2       1   d d d d d d d d.&
 &
 &
 &
 &
L &
 &
 &
R              N N N N N N N N"&
 &
 &
 &
 &
m &
 &
 &
R    -       -   [ [ [ [ [ [ [ [8    "7   ,
 ,
 ,
 ,
 ,
$9 ,
 ,
 ,
^-
 -
 -
 -
 -
!6 -
 -
 -
`L$ L$ L$ L$ L$ L$ L$ L$ L$ L$r!   