
    &g                   p   S r SSKJr  SSKrSSKJrJr  SSKJrJ	r	J
r
JrJr  SSKJr  SSKJrJr  SSKJrJr  SS	KJrJr  \(       a  SS
KJr  SSKJr  SSKJr  \" SS5      r\" / / / / / 5      r " S S5      r " S S\5      r  " S S\5      r! " S S\5      r" " S S\5      r# " S S\5      r$ScS jr%      SdS jr&SeS jr'SfS jr( " S S 5      r) " S! S"\)5      r* " S# S$\)5      r+ " S% S&\)5      r, " S' S(5      r- " S) S*\-5      r. " S+ S,\-5      r/ " S- S.\-5      r0 " S/ S0\-5      r1 " S1 S25      r2 " S3 S45      r3 " S5 S65      r4 " S7 S8\45      r5 " S9 S:\55      r6 " S; S<\55      r7 " S= S>\65      r8 " S? S@\55      r9 " SA SB\45      r: " SC SD\65      r; " SE SF\65      r< " SG SH\55      r= " SI SJ5      r> " SK SL\>5      r? " SM SN\>5      r@ " SO SP\>5      rA " SQ SR5      rB " SS ST\B5      rC " SU SV\B5      rD " SW SX\B5      rE " SY SZ5      rF " S[ S\\F5      rG " S] S^\F5      rH " S_ S`\F5      rI " Sa Sb5      rJg)ga  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.

.. seealso:: This module is compatible with both the synchronous and asynchronous PyMongo APIs.


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)_SENSITIVE_COMMANDS_handle_exception)_Address_DocumentOut)	timedelta)ServerDescription)TopologyDescription
_Listeners)command_listenersserver_listenersserver_heartbeat_listenerstopology_listenerscmap_listenersc                      \ rS rSrSrSrg)_EventListener   z,Abstract base class for all event listeners. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       WC:\Suresh\moveshuttle\MDcreated\moveengine\venv\Lib\site-packages\pymongo/monitoring.pyr   r      s    6r%   r   c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)CommandListener   z~Abstract base class for command listeners.

Handles `CommandStartedEvent`, `CommandSucceededEvent`,
and `CommandFailedEvent`.
c                    [         e)zoAbstract method to handle a `CommandStartedEvent`.

:param event: An instance of :class:`CommandStartedEvent`.
NotImplementedErrorselfevents     r&   startedCommandListener.started   
    
 "!r%   c                    [         e)zsAbstract method to handle a `CommandSucceededEvent`.

:param event: An instance of :class:`CommandSucceededEvent`.
r+   r-   s     r&   	succeededCommandListener.succeeded   r2   r%   c                    [         e)zmAbstract method to handle a `CommandFailedEvent`.

:param event: An instance of :class:`CommandFailedEvent`.
r+   r-   s     r&   failedCommandListener.failed   r2   r%   r   N)r/   CommandStartedEventreturnNone)r/   CommandSucceededEventr:   r;   )r/   CommandFailedEventr:   r;   	r   r    r!   r"   r#   r0   r4   r7   r$   r   r%   r&   r(   r(      s    """r%   r(   c                      \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSrg)ConnectionPoolListener   a  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
c                    [         e)zAbstract method to handle a :class:`PoolCreatedEvent`.

Emitted when a connection Pool is created.

:param event: An instance of :class:`PoolCreatedEvent`.
r+   r-   s     r&   pool_created#ConnectionPoolListener.pool_created  
     "!r%   c                    [         e)zAbstract method to handle a :class:`PoolReadyEvent`.

Emitted when a connection Pool is marked ready.

:param event: An instance of :class:`PoolReadyEvent`.

.. versionadded:: 4.0
r+   r-   s     r&   
pool_ready!ConnectionPoolListener.pool_ready  s
     "!r%   c                    [         e)zAbstract method to handle a `PoolClearedEvent`.

Emitted when a connection Pool is cleared.

:param event: An instance of :class:`PoolClearedEvent`.
r+   r-   s     r&   pool_cleared#ConnectionPoolListener.pool_cleared"  rE   r%   c                    [         e)zAbstract method to handle a `PoolClosedEvent`.

Emitted when a connection Pool is closed.

:param event: An instance of :class:`PoolClosedEvent`.
r+   r-   s     r&   pool_closed"ConnectionPoolListener.pool_closed+  rE   r%   c                    [         e)zAbstract method to handle a :class:`ConnectionCreatedEvent`.

Emitted when a connection Pool creates a Connection object.

:param event: An instance of :class:`ConnectionCreatedEvent`.
r+   r-   s     r&   connection_created)ConnectionPoolListener.connection_created4  rE   r%   c                    [         e)zAbstract method to handle a :class:`ConnectionReadyEvent`.

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

:param event: An instance of :class:`ConnectionReadyEvent`.
r+   r-   s     r&   connection_ready'ConnectionPoolListener.connection_ready=  
     "!r%   c                    [         e)zAbstract method to handle a :class:`ConnectionClosedEvent`.

Emitted when a connection Pool closes a connection.

:param event: An instance of :class:`ConnectionClosedEvent`.
r+   r-   s     r&   connection_closed(ConnectionPoolListener.connection_closedG  rE   r%   c                    [         e)zAbstract method to handle a :class:`ConnectionCheckOutStartedEvent`.

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

:param event: An instance of :class:`ConnectionCheckOutStartedEvent`.
r+   r-   s     r&   connection_check_out_started3ConnectionPoolListener.connection_check_out_startedP  rE   r%   c                    [         e)zAbstract method to handle a :class:`ConnectionCheckOutFailedEvent`.

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

:param event: An instance of :class:`ConnectionCheckOutFailedEvent`.
r+   r-   s     r&   connection_check_out_failed2ConnectionPoolListener.connection_check_out_failedY  rE   r%   c                    [         e)zAbstract method to handle a :class:`ConnectionCheckedOutEvent`.

Emitted when the driver successfully checks out a connection.

:param event: An instance of :class:`ConnectionCheckedOutEvent`.
r+   r-   s     r&   connection_checked_out-ConnectionPoolListener.connection_checked_outb  rE   r%   c                    [         e)zAbstract method to handle a :class:`ConnectionCheckedInEvent`.

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

:param event: An instance of :class:`ConnectionCheckedInEvent`.
r+   r-   s     r&   connection_checked_in,ConnectionPoolListener.connection_checked_ink  rU   r%   r   N)r/   PoolCreatedEventr:   r;   )r/   PoolReadyEventr:   r;   )r/   PoolClearedEventr:   r;   )r/   PoolClosedEventr:   r;   )r/   ConnectionCreatedEventr:   r;   )r/   ConnectionReadyEventr:   r;   )r/   ConnectionClosedEventr:   r;   )r/   ConnectionCheckOutStartedEventr:   r;   )r/   ConnectionCheckOutFailedEventr:   r;   )r/   ConnectionCheckedOutEventr:   r;   )r/   ConnectionCheckedInEventr:   r;   )r   r    r!   r"   r#   rC   rG   rJ   rM   rP   rS   rW   rZ   r]   r`   rc   r$   r   r%   r&   r@   r@      s>    "	""""""""""r%   r@   c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)ServerHeartbeatListeneriv  zAbstract base class for server heartbeat listeners.

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

.. versionadded:: 3.3
c                    [         e)zAbstract method to handle a `ServerHeartbeatStartedEvent`.

:param event: An instance of :class:`ServerHeartbeatStartedEvent`.
r+   r-   s     r&   r0   ServerHeartbeatListener.started  r2   r%   c                    [         e)zAbstract method to handle a `ServerHeartbeatSucceededEvent`.

:param event: An instance of :class:`ServerHeartbeatSucceededEvent`.
r+   r-   s     r&   r4   !ServerHeartbeatListener.succeeded  r2   r%   c                    [         e)z}Abstract method to handle a `ServerHeartbeatFailedEvent`.

:param event: An instance of :class:`ServerHeartbeatFailedEvent`.
r+   r-   s     r&   r7   ServerHeartbeatListener.failed  r2   r%   r   N)r/   ServerHeartbeatStartedEventr:   r;   )r/   ServerHeartbeatSucceededEventr:   r;   )r/   ServerHeartbeatFailedEventr:   r;   r>   r   r%   r&   rq   rq   v  s    """r%   rq   c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)TopologyListeneri  zAbstract base class for topology monitoring listeners.
Handles `TopologyOpenedEvent`, `TopologyDescriptionChangedEvent`, and
`TopologyClosedEvent`.

.. versionadded:: 3.3
c                    [         e)zoAbstract method to handle a `TopologyOpenedEvent`.

:param event: An instance of :class:`TopologyOpenedEvent`.
r+   r-   s     r&   openedTopologyListener.opened  r2   r%   c                    [         e)zAbstract method to handle a `TopologyDescriptionChangedEvent`.

:param event: An instance of :class:`TopologyDescriptionChangedEvent`.
r+   r-   s     r&   description_changed$TopologyListener.description_changed  r2   r%   c                    [         e)zoAbstract method to handle a `TopologyClosedEvent`.

:param event: An instance of :class:`TopologyClosedEvent`.
r+   r-   s     r&   closedTopologyListener.closed  r2   r%   r   N)r/   TopologyOpenedEventr:   r;   )r/   TopologyDescriptionChangedEventr:   r;   )r/   TopologyClosedEventr:   r;   	r   r    r!   r"   r#   r~   r   r   r$   r   r%   r&   r|   r|         """r%   r|   c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)ServerListeneri  zAbstract base class for server listeners.
Handles `ServerOpeningEvent`, `ServerDescriptionChangedEvent`, and
`ServerClosedEvent`.

.. versionadded:: 3.3
c                    [         e)zmAbstract method to handle a `ServerOpeningEvent`.

:param event: An instance of :class:`ServerOpeningEvent`.
r+   r-   s     r&   r~   ServerListener.opened  r2   r%   c                    [         e)zAbstract method to handle a `ServerDescriptionChangedEvent`.

:param event: An instance of :class:`ServerDescriptionChangedEvent`.
r+   r-   s     r&   r   "ServerListener.description_changed  r2   r%   c                    [         e)zkAbstract method to handle a `ServerClosedEvent`.

:param event: An instance of :class:`ServerClosedEvent`.
r+   r-   s     r&   r   ServerListener.closed  r2   r%   r   N)r/   ServerOpeningEventr:   r;   )r/   ServerDescriptionChangedEventr:   r;   )r/   ServerClosedEventr:   r;   r   r   r%   r&   r   r     r   r%   r   c                :    [        U R                  5       S-  5      $ )z'Convert duration 'dur' to microseconds.g    .A)inttotal_seconds)durs    r&   
_to_microsr     s    s  "T)**r%   c           	         [        U[        R                  5      (       d  [        U  S[	        U5       35      eU H2  n[        U[
        5      (       a  M  [        SU  S[	        U5       35      e   U$ )zValidate event listenersz must be a list or tuple, not Listeners for | must be either a CommandListener, ServerHeartbeatListener, ServerListener, TopologyListener, or ConnectionPoolListener,not )
isinstancer   r
   	TypeErrortyper   )option	listenerslisteners      r&   _validate_event_listenersr     sz     i..6("@i@QRSS(N33  ) H~&	(   r%   c                l   [        U [        5      (       d  [        SU  S[        U 5       35      e[        U [        5      (       a  [
        R                  R                  U 5        [        U [        5      (       a  [
        R                  R                  U 5        [        U [        5      (       a  [
        R                  R                  U 5        [        U [        5      (       a  [
        R                  R                  U 5        [        U [        5      (       a   [
        R                  R                  U 5        gg)zRegister a global event listener.

:param listener: A subclasses of :class:`CommandListener`,
    :class:`ServerHeartbeatListener`, :class:`ServerListener`,
    :class:`TopologyListener`, or :class:`ConnectionPoolListener`.
r   r   N)r   r   r   r   r(   
_LISTENERSr   appendrq   r   r   r   r|   r   r@   r   )r   s    r&   registerr     s     h//XJ ' >"	$
 	
 (O,,$$++H5(344--44X>(N++##**84(,--%%,,X6(233!!((2 4r%   c                Z    U R                  5       S[        R                  4;   a  SU;   a  gg)NhellospeculativeAuthenticateTF)lowerr   
LEGACY_CMD)command_namedocs     r&   _is_speculative_authenticater     s,    +*@*@ AA%,r%   c                      \ rS rSrSrSr   S               SS jjr\SS j5       r\SS j5       r	\SS j5       r
\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       rSrg)_CommandEventi  zBase class for command events.)
__cmd_name	__rqst_id	__conn_id__op_id__service_id__db__server_conn_idNc                X    Xl         X l        X0l        X@l        XPl        X`l        Xpl        g N)_CommandEvent__cmd_name_CommandEvent__rqst_id_CommandEvent__conn_id_CommandEvent__op_id_CommandEvent__service_id_CommandEvent__db_CommandEvent__server_conn_id)r.   r   
request_idconnection_idoperation_id
service_iddatabase_nameserver_connection_ids           r&   __init___CommandEvent.__init__  s)     '#&#&!	 4r%   c                    U R                   $ )zThe command name.)r   r.   s    r&   r   _CommandEvent.command_name-       r%   c                    U R                   $ )z"The request id for this operation.)r   r   s    r&   r   _CommandEvent.request_id2       ~~r%   c                    U R                   $ )z@The address (host, port) of the server this command was sent to.)r   r   s    r&   r   _CommandEvent.connection_id7  r   r%   c                    U R                   $ )zNThe service_id this command was sent to, or ``None``.

.. versionadded:: 3.12
)r   r   s    r&   r   _CommandEvent.service_id<  s        r%   c                    U R                   $ )z(An id for this series of events or None.)r   r   s    r&   r   _CommandEvent.operation_idD       ||r%   c                    U R                   $ )zNThe database_name this command was sent to, or ``""``.

.. versionadded:: 4.6
)r   r   s    r&   r   _CommandEvent.database_nameI  s     yyr%   c                    U R                   $ )zoThe server-side connection id for the connection this command was sent on, or ``None``.

.. versionadded:: 4.7
)r   r   s    r&   r   "_CommandEvent.server_connection_idQ  s     $$$r%   )r   r   r   r   r   r   r   N N)r   strr   r   r   r   r   Optional[int]r   Optional[ObjectId]r   r   r   r   r:   r;   r:   r   r:   r   r:   r   r:   r   )r:   r   )r   r    r!   r"   r#   	__slots__r   propertyr   r   r   r   r   r   r   r$   r   r%   r&   r   r     s    (I  *..255 5  	5
 $5 '5 5 ,5 
5$       ! !     % %r%   r   c                     ^  \ rS rSrSrSr  S               S	U 4S jjjr\S
S j5       r\SU 4S jj5       r	SS jr
SrU =r$ )r9   iZ  a  Event published when a command starts.

:param command: The command document.
:param database_name: The name of the database this command was run against.
:param request_id: The request id for this operation.
:param connection_id: The address (host, port) of the server this command
    was sent to.
:param operation_id: An optional identifier for a series of related events.
:param service_id: The service_id this command was sent to, or ``None``.
)__cmdc           
        > U(       d  [        U< S35      e[        [        U5      5      n[        T
U ]  UUUUUUUS9  UR                  5       n	U	[        ;   d  [        X5      (       a  0 U l        g Xl        g )Nz is not a valid commandr   r   r   )	
ValueErrornextitersuperr   r   r   r   _CommandStartedEvent__cmd)r.   commandr   r   r   r   r   r   r   cmd_name	__class__s             r&   r   CommandStartedEvent.__init__h  s     {*ABCCDM*!'!5 	 	
  %%'**.J8.].]')DJ Jr%   c                    U R                   $ )zThe command document.)r   r   s    r&   r   CommandStartedEvent.command  s     zzr%   c                   > [         TU ]  $ )z6The name of the database this command was run against.)r   r   r.   r   s    r&   r   !CommandStartedEvent.database_name  s     w$$r%   c           	         SR                  U R                  R                  U R                  U R                  U R
                  U R                  U R                  U R                  5      $ )Nz[<{} {} db: {!r}, command: {!r}, operation_id: {}, service_id: {}, server_connection_id: {}>)	formatr   r   r   r   r   r   r   r   r   s    r&   __repr__CommandStartedEvent.__repr__  sU    i
&NN##OO%%

	
r%   NN)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$   __classcell__r   s   @r&   r9   r9   Z  s    	 I *..2!! ! 	!
  ! $! '! ,! 
! !:   % %
 
r%   r9   c                     ^  \ rS rSrSrSr   S                   S	U 4S jjjr\S
S j5       r\SS j5       r	SS jr
SrU =r$ )r<   i  a'  Event published when a command succeeds.

:param duration: The command duration as a datetime.timedelta.
:param reply: The server reply document.
:param command_name: The command name.
:param request_id: The request id for this operation.
:param connection_id: The address (host, port) of the server this command
    was sent to.
:param operation_id: An optional identifier for a series of related events.
:param service_id: The service_id this command was sent to, or ``None``.
:param database_name: The database this command was sent to, or ``""``.
)__duration_micros__replyc
           
        > [         TU ]  UUUUUUU	S9  [        U5      U l        UR	                  5       n
U
[
        ;   d  [        X5      (       a  0 U l        g X l        g Nr   )r   r   r   '_CommandSucceededEvent__duration_microsr   r   r   _CommandSucceededEvent__reply)r.   durationreplyr   r   r   r   r   r   r   r   r   s              r&   r   CommandSucceededEvent.__init__  si     	!'!5 	 	
 ",H!5%%'**.J8.[.[)+DL Lr%   c                    U R                   $ z/The duration of this operation in microseconds.)r  r   s    r&   duration_micros%CommandSucceededEvent.duration_micros       %%%r%   c                    U R                   $ z/The server failure document for this operation.)r  r   s    r&   r
  CommandSucceededEvent.reply  r   r%   c           
         SR                  U R                  R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  5      $ )Nzp<{} {} db: {!r}, command: {!r}, operation_id: {}, duration_micros: {}, service_id: {}, server_connection_id: {}>)
r   r   r   r   r   r   r   r  r   r   r   s    r&   r   CommandSucceededEvent.__repr__  s^    ~
&NN##  OO%%	
	
r%   r   )r	  datetime.timedeltar
  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   @r&   r<   r<     s     1I *..2!$! ! 	!
 !  ! $! '! ! ,! 
! !8 & &  
 
r%   r<   c                     ^  \ rS rSrSrSr   S                   S	U 4S jjjr\S
S j5       r\SS j5       r	SS jr
SrU =r$ )r=   i  a&  Event published when a command fails.

:param duration: The command duration as a datetime.timedelta.
:param failure: The server reply document.
:param command_name: The command name.
:param request_id: The request id for this operation.
:param connection_id: The address (host, port) of the server this command
    was sent to.
:param operation_id: An optional identifier for a series of related events.
:param service_id: The service_id this command was sent to, or ``None``.
:param database_name: The database this command was sent to, or ``""``.
)r  	__failurec
           
     X   > [         T
U ]  UUUUUUU	S9  [        U5      U l        X l        g r  )r   r   r   $_CommandFailedEvent__duration_micros_CommandFailedEvent__failure)r.   r	  failurer   r   r   r   r   r   r   r   s             r&   r   CommandFailedEvent.__init__  s@     	!'!5 	 	
 ",H!5 r%   c                    U R                   $ r  )r  r   s    r&   r  "CommandFailedEvent.duration_micros
  r  r%   c                    U R                   $ r  )r  r   s    r&   r  CommandFailedEvent.failure  r   r%   c                    SR                  U R                  R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  U R                  5	      $ )Nz<{} {} db: {!r}, command: {!r}, operation_id: {}, duration_micros: {}, failure: {!r}, service_id: {}, server_connection_id: {}>)r   r   r   r   r   r   r   r  r  r   r   r   s    r&   r   CommandFailedEvent.__repr__  sh    G
&NN##  LLOO%%

	
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   @r&   r=   r=     s     3I *..2!$! ! 	!
 !  ! $! '! ! ,! 
! !0 & &  
 
r%   r=   c                  D    \ rS rSrSrSrSS jr\S	S j5       rS
S jr	Sr
g)
_PoolEventi%  zBase class for pool events.	__addressc                    Xl         g r   _PoolEvent__addressr.   addresss     r&   r   _PoolEvent.__init__*       r%   c                    U R                   $ )zRThe address (host, port) pair of the server the pool is attempting
to connect to.
r)  r   s    r&   r,  _PoolEvent.address-      
 ~~r%   c                P    U R                   R                   SU R                  < S3$ N())r   r   r*  r   s    r&   r   _PoolEvent.__repr__4  %    ..))*!DNN+=Q??r%   Nr,  r   r:   r;   r   r   r   r    r!   r"   r#   r   r   r   r,  r   r$   r   r%   r&   r%  r%  %  s)    %I!  @r%   r%  c                  R   ^  \ rS rSrSrSrSU 4S jjr\SS j5       rS	S jr	Sr
U =r$ )
re   i8  zPublished when a Connection Pool is created.

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

.. versionadded:: 3.9
)	__optionsc                0   > [         TU ]  U5        X l        g r   )r   r   _PoolCreatedEvent__options)r.   r,  optionsr   s      r&   r   PoolCreatedEvent.__init__C  s    ! r%   c                    U R                   $ )zCAny non-default pool options that were set on this Connection Pool.)r=  r   s    r&   r>  PoolCreatedEvent.optionsG  r   r%   c                l    U R                   R                   SU R                  < SU R                  < S3$ Nr4  z, r5  )r   r   r,  r=  r   s    r&   r   PoolCreatedEvent.__repr__L  s0    ..))*!DLL+;2dnn=OqQQr%   r,  r   r>  dict[str, Any]r:   r;   )r:   rF  r   )r   r    r!   r"   r#   r   r   r   r>  r   r$   r   r  s   @r&   re   re   8  s4     I!  R Rr%   re   c                      \ rS rSrSrSrSrg)rf   iP  zPublished when a Connection Pool is marked ready.

:param 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&   rf   rf   P       Ir%   rf   c                  |   ^  \ rS rSrSrSr  S	       S
U 4S jjjr\SS j5       r\SS j5       r	SS jr
SrU =r$ )rg   i\  a_  Published when a Connection Pool is cleared.

:param address: The address (host, port) pair of the server this Pool is
   attempting to connect to.
:param service_id: The service_id this command was sent to, or ``None``.
:param interrupt_connections: True if all active connections were interrupted by the Pool during clearing.

.. versionadded:: 3.9
)r   __interrupt_connectionsc                <   > [         TU ]  U5        X l        X0l        g r   )r   r   _PoolClearedEvent__service_id(_PoolClearedEvent__interrupt_connections)r.   r,  r   interrupt_connectionsr   s       r&   r   PoolClearedEvent.__init__i  s     	!&'<$r%   c                    U R                   $ )zConnections with this service_id are cleared.

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

.. versionadded:: 3.12
)rM  r   s    r&   r   PoolClearedEvent.service_ids  s        r%   c                    U R                   $ )zTIf True, active connections are interrupted during clearing.

.. versionadded:: 4.7
)rN  r   s    r&   rO  &PoolClearedEvent.interrupt_connections}  s     +++r%   c                    U R                   R                   SU R                  < SU R                  < SU R                  < S3$ rC  )r   r   r,  rM  rN  r   s    r&   r   PoolClearedEvent.__repr__  sB    ..))*!DLL+;2d>O>O=RRTUYUqUqTttuvvr%   )rK  r   )NFr,  r   r   r   rO  boolr:   r;   r   r:   rX  r   )r   r    r!   r"   r#   r   r   r   r   rO  r   r$   r   r  s   @r&   rg   rg   \  s{     <I
 *.&+	== '=  $	=
 
= = ! ! , ,w wr%   rg   c                      \ rS rSrSrSrSrg)rh   i  zPublished when a Connection Pool is closed.

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

.. versionadded:: 3.9
r   NrH  r   r%   r&   rh   rh     rI  r%   rh   c                  .    \ rS rSrSrSr Sr Sr SrSr	g)	ConnectionClosedReasoni  zeAn enum that defines values for `reason` on a
:class:`ConnectionClosedEvent`.

.. versionadded:: 3.9
staleidleerror
poolClosedr   N)
r   r    r!   r"   r#   STALEIDLEERRORPOOL_CLOSEDr$   r   r%   r&   r\  r\    s-     EFD EIKEr%   r\  c                  (    \ rS rSrSrSr Sr SrSrg)ConnectionCheckOutFailedReasoni  zmAn enum that defines values for `reason` on a
:class:`ConnectionCheckOutFailedEvent`.

.. versionadded:: 3.9
timeoutr`  connectionErrorr   N)	r   r    r!   r"   r#   TIMEOUTrd  
CONN_ERRORr$   r   r%   r&   rf  rf    s#     GJKM"Jr%   rf  c                  D    \ rS rSrSrSrSS jr\S	S j5       rS
S jr	Sr
g)_ConnectionEventi  z)Private base class for connection events.r&  c                    Xl         g r   _ConnectionEvent__addressr+  s     r&   r   _ConnectionEvent.__init__  r.  r%   c                    U R                   $ )zYThe address (host, port) pair of the server this connection is
attempting to connect to.
rn  r   s    r&   r,  _ConnectionEvent.address  r1  r%   c                P    U R                   R                   SU R                  < S3$ r3  )r   r   ro  r   s    r&   r   _ConnectionEvent.__repr__  r7  r%   Nr8  r   r   r9  r   r%   r&   rl  rl    s)    3I!  @r%   rl  c                  R   ^  \ rS rSrSrSrSU 4S jjr\SS j5       rS	S jr	Sr
U =r$ )
_ConnectionIdEventi  z4Private base class for connection events with an id.)__connection_idc                0   > [         TU ]  U5        X l        g r   )r   r   !_ConnectionIdEvent__connection_id)r.   r,  r   r   s      r&   r   _ConnectionIdEvent.__init__  s    !,r%   c                    U R                   $ )zThe ID of the connection.)ry  r   s    r&   r    _ConnectionIdEvent.connection_id  s     ###r%   c                l    U R                   R                   SU R                  < SU R                  < S3$ rC  )r   r   r,  ry  r   s    r&   r   _ConnectionIdEvent.__repr__  s3    ..))*!DLL+;2d>R>R=UUVWWr%   r,  r   r   r   r:   r;   r   r   )r   r    r!   r"   r#   r   r   r   r   r   r$   r   r  s   @r&   rv  rv    s0    >$I- $ $X Xr%   rv  c                  R   ^  \ rS rSrSrSrSU 4S jjr\SS j5       rS	S jr	Sr
U =r$ )
_ConnectionDurationEventi  z9Private base class for connection events with a duration.)
__durationc                0   > [         TU ]  X5        X0l        g r   )r   r   "_ConnectionDurationEvent__duration)r.   r,  r   r	  r   s       r&   r   !_ConnectionDurationEvent.__init__  s    0"r%   c                    U R                   $ )z=The duration of the connection event.

.. versionadded:: 4.7
)r  r   s    r&   r	  !_ConnectionDurationEvent.duration  s     r%   c                    U R                   R                   SU R                  < SU R                  < SU R                  < S3$ rC  )r   r   r,  r   r  r   s    r&   r   !_ConnectionDurationEvent.__repr__  sB    ..))*!DLL+;2d>P>P=SSUVZVeVeUhhijjr%   )r,  r   r   r   r	  Optional[float]r:   r;   )r:   r  r   )r   r    r!   r"   r#   r   r   r   r	  r   r$   r   r  s   @r&   r  r    s0    CI#  k kr%   r  c                      \ rS rSrSrSrSrg)ri   i  ai  Published when a Connection Pool creates a Connection object.

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

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

.. versionadded:: 3.9
r   NrH  r   r%   r&   ri   ri     s    
 Ir%   ri   c                      \ rS rSrSrSrSrg)rj   i  a  Published when a Connection has finished its setup, and is ready to use.

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

.. versionadded:: 3.9
r   NrH  r   r%   r&   rj   rj          Ir%   rj   c                  R   ^  \ rS rSrSrSrSU 4S jjr\SS j5       rSS jr	Sr
U =r$ )	rk   i  a3  Published when a Connection is closed.

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

.. versionadded:: 3.9
__reasonc                0   > [         TU ]  X5        X0l        g r   )r   r   _ConnectionClosedEvent__reason)r.   r,  r   reasonr   s       r&   r   ConnectionClosedEvent.__init__!  s    0r%   c                    U R                   $ )zA reason explaining why this connection was closed.

The reason must be one of the strings from the
:class:`ConnectionClosedReason` enum.
)r  r   s    r&   r  ConnectionClosedEvent.reason%       }}r%   c                    SR                  U R                  R                  U R                  U R                  U R
                  5      $ )Nz{}({!r}, {!r}, {!r}))r   r   r   r,  r   r  r   s    r&   r   ConnectionClosedEvent.__repr__.  s9    %,,NN##LLMM	
 	
r%   )r,  r   r   r   r  r   r   r   r    r!   r"   r#   r   r   r   r  r   r$   r   r  s   @r&   rk   rk     s2     I  
 
r%   rk   c                      \ rS rSrSrSrSrg)rl   i7  zPublished when the driver starts attempting to check out a connection.

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

.. versionadded:: 3.9
r   NrH  r   r%   r&   rl   rl   7  rI  r%   rl   c                  R   ^  \ rS rSrSrSrSU 4S jjr\SS j5       rSS jr	Sr
U =r$ )	rm   iC  a  Published when the driver's attempt to check out a connection fails.

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

.. versionadded:: 3.9
r  c                0   > [         TU ]  USUS9  X l        g )Nr   )r,  r   r	  )r   r   &_ConnectionCheckOutFailedEvent__reason)r.   r,  r  r	  r   s       r&   r   &ConnectionCheckOutFailedEvent.__init__O  s    HMr%   c                    U R                   $ )zA reason explaining why connection check out failed.

The reason must be one of the strings from the
:class:`ConnectionCheckOutFailedReason` enum.
)r  r   s    r&   r  $ConnectionCheckOutFailedEvent.reasonS  r  r%   c                    U R                   R                   SU R                  < SU R                  < SU R                  < S3$ rC  )r   r   r,  r  r	  r   s    r&   r   &ConnectionCheckOutFailedEvent.__repr__\  s?    ..))*!DLL+;2dmm=NbQUQ^Q^Paabccr%   )r,  r   r  r   r	  r  r:   r;   r   r  r  s   @r&   rm   rm   C  s4     I  d dr%   rm   c                      \ rS rSrSrSrSrg)rn   i`  a	  Published when the driver successfully checks out a connection.

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

.. versionadded:: 3.9
r   NrH  r   r%   r&   rn   rn   `  r  r%   rn   c                      \ rS rSrSrSrSrg)ro   im  a	  Published when the driver checks in a Connection into the Pool.

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

.. versionadded:: 3.9
r   NrH  r   r%   r&   ro   ro   m  r  r%   ro   c                  X    \ rS rSrSrSrS	S jr\S
S j5       r\SS j5       r	SS jr
Srg)_ServerEventiz  zBase class for server events.)__server_address__topology_idc                    Xl         X l        g r   )_ServerEvent__server_address_ServerEvent__topology_id)r.   server_addresstopology_ids      r&   r   _ServerEvent.__init__  s     .(r%   c                    U R                   $ )z+The address (host, port) pair of the server)r  r   s    r&   r  _ServerEvent.server_address  s     $$$r%   c                    U R                   $ z>A unique identifier for the topology this server is a part of.)r  r   s    r&   r  _ServerEvent.topology_id       !!!r%   c                j    SU R                   R                   SU R                   SU R                   S3$ )N<  topology_id: >)r   r   r  r  r   s    r&   r   _ServerEvent.__repr__  s8    4>>**+1T-@-@,APTP`P`Oaab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   r%   r&   r  r  z  s=    '5I) % % " "dr%   r  c                  v   ^  \ rS rSrSrSr        S	U 4S jjr\S
S j5       r\S
S j5       r	SS jr
SrU =r$ )r   i  zBPublished when server description changes.

.. versionadded:: 3.3
__previous_description__new_descriptionc                8   > [         TU ]  " U6   Xl        X l        g r   )r   r   4_ServerDescriptionChangedEvent__previous_description/_ServerDescriptionChangedEvent__new_descriptionr.   previous_descriptionnew_descriptionargsr   s       r&   r   &ServerDescriptionChangedEvent.__init__       	$&:#!0r%   c                    U R                   $ )zEThe previous
:class:`~pymongo.server_description.ServerDescription`.
)r  r   s    r&   r  2ServerDescriptionChangedEvent.previous_description      
 ***r%   c                    U R                   $ )z@The new
:class:`~pymongo.server_description.ServerDescription`.
)r  r   s    r&   r  -ServerDescriptionChangedEvent.new_description      
 %%%r%   c                    SR                  U R                  R                  U R                  U R                  U R
                  5      $ )Nz <{} {} changed from: {}, to: {}>)r   r   r   r  r  r  r   s    r&   r   &ServerDescriptionChangedEvent.__repr__  s=    188NN##%%  	
 	
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     sm    
 @I1/1 +1 	1
 
1 + + & &
 
r%   r   c                      \ rS rSrSrSrSrg)r   i  z=Published when server is initialized.

.. versionadded:: 3.3
r   NrH  r   r%   r&   r   r         
 Ir%   r   c                      \ rS rSrSrSrSrg)r   i  z8Published when server is closed.

.. versionadded:: 3.3
r   NrH  r   r%   r&   r   r     r  r%   r   c                  D    \ rS rSrSrSrSS jr\S	S j5       rS
S jr	Sr
g)TopologyEventi  z+Base class for topology description events.)r  c                    Xl         g r   _TopologyEvent__topology_id)r.   r  s     r&   r   TopologyEvent.__init__  s    (r%   c                    U R                   $ r  r  r   s    r&   r  TopologyEvent.topology_id  r  r%   c                P    SU R                   R                   SU R                   S3$ )Nr  r  r  )r   r   r  r   s    r&   r   TopologyEvent.__repr__  s)    4>>**+>$:J:J9K1MMr%   Nr  r   r:   r;   r  r   )r   r    r!   r"   r#   r   r   r   r  r   r$   r   r%   r&   r  r    s)    5"I) " "Nr%   r  c                  v   ^  \ rS rSrSrSr        S	U 4S jjr\S
S j5       r\S
S j5       r	SS jr
SrU =r$ )r   i  zHPublished when the topology description changes.

.. versionadded:: 3.3
r  c                8   > [         TU ]  " U6   Xl        X l        g r   )r   r   6_TopologyDescriptionChangedEvent__previous_description1_TopologyDescriptionChangedEvent__new_descriptionr  s       r&   r   (TopologyDescriptionChangedEvent.__init__  r  r%   c                    U R                   $ )zIThe previous
:class:`~pymongo.topology_description.TopologyDescription`.
)r  r   s    r&   r  4TopologyDescriptionChangedEvent.previous_description  r  r%   c                    U R                   $ )zDThe new
:class:`~pymongo.topology_description.TopologyDescription`.
)r  r   s    r&   r  /TopologyDescriptionChangedEvent.new_description  r  r%   c                    SR                  U R                  R                  U R                  U R                  U R
                  5      $ )Nz-<{} topology_id: {} changed from: {}, to: {}>)r   r   r   r  r  r  r   s    r&   r   (TopologyDescriptionChangedEvent.__repr__  s=    >EENN##%%  	
 	
r%   r  )r  r   r  r   r  r   r:   r;   )r:   r   r   r  r  s   @r&   r   r     sm    
 @I111 -1 	1
 
1 + + & &
 
r%   r   c                      \ rS rSrSrSrSrg)r   i  zCPublished when the topology is initialized.

.. versionadded:: 3.3
r   NrH  r   r%   r&   r   r     r  r%   r   c                      \ rS rSrSrSrSrg)r   i  z>Published when the topology is closed.

.. versionadded:: 3.3
r   NrH  r   r%   r&   r   r     r  r%   r   c                  \    \ rS rSrSrSrS
SS jjr\SS j5       r\SS j5       r	SS jr
Srg	)_ServerHeartbeatEventi  z'Base class for server heartbeat events.)rw  	__awaitedc                    Xl         X l        g r   )$_ServerHeartbeatEvent__connection_id_ServerHeartbeatEvent__awaited)r.   r   awaiteds      r&   r   _ServerHeartbeatEvent.__init__  s    , r%   c                    U R                   $ )zCThe address (host, port) of the server this heartbeat was sent
to.
)r  r   s    r&   r   #_ServerHeartbeatEvent.connection_id!  s    
 ###r%   c                    U R                   $ )zWWhether the heartbeat was issued as an awaitable hello command.

.. versionadded:: 4.6
)r  r   s    r&   r  _ServerHeartbeatEvent.awaited(  s     ~~r%   c                j    SU R                   R                   SU R                   SU R                   S3$ )Nr  r  z
 awaited: r  )r   r   r   r  r   s    r&   r   _ServerHeartbeatEvent.__repr__0  s4    4>>**+1T-?-?,@
4<<.XYZZr%   )r  rw  NFr   r   r  rX  r:   r;   r   rY  r   )r   r    r!   r"   r#   r   r   r   r   r  r   r$   r   r%   r&   r  r    s=    10I! $ $  [r%   r  c                      \ rS rSrSrSrSrg)rx   i4  z>Published when a heartbeat is started.

.. versionadded:: 3.3
r   NrH  r   r%   r&   rx   rx   4  r  r%   rx   c                     ^  \ rS rSrSrSr S	         S
U 4S jjjr\SS j5       r\SS j5       r	\SU 4S jj5       r
SS jrSrU =r$ )ry   i=  zAFired when the server heartbeat succeeds.

.. versionadded:: 3.3
r  r  c                <   > [         TU ]  X45        Xl        X l        g r   )r   r   (_ServerHeartbeatSucceededEvent__duration%_ServerHeartbeatSucceededEvent__replyr.   r	  r
  r   r  r   s        r&   r   &ServerHeartbeatSucceededEvent.__init__E       	0"r%   c                    U R                   $ z/The duration of this heartbeat in microseconds.)r  r   s    r&   r	  &ServerHeartbeatSucceededEvent.durationL  r   r%   c                    U R                   $ )z-An instance of :class:`~pymongo.hello.Hello`.)r  r   s    r&   r
  #ServerHeartbeatSucceededEvent.replyQ  r   r%   c                   > [         TU ]  $ 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  %ServerHeartbeatSucceededEvent.awaitedV       wr%   c                    SR                  U R                  R                  U R                  U R                  U R
                  U R                  5      $ )Nz,<{} {} duration: {}, awaited: {}, reply: {}>r   r   r   r   r	  r  r
  r   s    r&   r   &ServerHeartbeatSucceededEvent.__repr__b  s@    =DDNN##MMLLJJ
 	
r%   r  )
r	  floatr
  r   r   r   r  rX  r:   r;   r:   r  )r:   r   rY  r   r   r    r!   r"   r#   r   r   r   r	  r
  r  r   r$   r   r  s   @r&   ry   ry   =  s    
 *I W\&+<DOS	      	 	
 
r%   ry   c                     ^  \ rS rSrSrSr S	         S
U 4S jjjr\SS j5       r\SS j5       r	\SU 4S jj5       r
SS jrSrU =r$ )rz   il  zlFired when the server heartbeat fails, either with an "ok: 0"
or a socket exception.

.. versionadded:: 3.3
r  c                <   > [         TU ]  X45        Xl        X l        g r   )r   r   %_ServerHeartbeatFailedEvent__duration"_ServerHeartbeatFailedEvent__replyr  s        r&   r   #ServerHeartbeatFailedEvent.__init__u  r  r%   c                    U R                   $ r
  )r  r   s    r&   r	  #ServerHeartbeatFailedEvent.duration|  r   r%   c                    U R                   $ )zA subclass of :exc:`Exception`.)r  r   s    r&   r
   ServerHeartbeatFailedEvent.reply  r   r%   c                   > [         TU ]  $ r  r  r   s    r&   r  "ServerHeartbeatFailedEvent.awaited  r  r%   c                    SR                  U R                  R                  U R                  U R                  U R
                  U R                  5      $ )Nz.<{} {} duration: {}, awaited: {}, reply: {!r}>r  r   s    r&   r   #ServerHeartbeatFailedEvent.__repr__  s@    ?FFNN##MMLLJJ
 	
r%   r  )
r	  r  r
  	Exceptionr   r   r  rX  r:   r;   r  )r:   r&  rY  r   r  r  s   @r&   rz   rz   l  s     *I [`&/@HSW	      	 	
 
r%   rz   c                     \ rS rSrSrS#S jr\S$S j5       r\S$S j5       r\S$S j5       r	\S$S j5       r
\S$S j5       rS%S	 jr  S&               S'S jjr    S(                     S)S jjr   S*                   S+S jjrS,S jr          S-S jr          S.S jrS/S jrS/S jr          S0S jrS1S jrS1S jr        S2S jrS3S jrS4S jr S5       S6S jjrS4S jrS7S jr        S8S jrS9S jrS4S jr         S:S jr!        S8S  jr"S7S! jr#S"r$g
);_EventListenersi  zConfigure event listeners for a client instance.

Any event listeners registered globally are included by default.

:param listeners: A list of event listeners.
c                   [         R                  S S  U l        [         R                  S S  U l        [         R
                  nUS S  U l        [         R                  S S  U l        [         R                  S S  U l
        Ub  U H  n[        U[        5      (       a  U R                  R                  U5        [        U[        5      (       a  U R                  R                  U5        [        U[        5      (       a  U R                  R                  U5        [        U[         5      (       a  U R                  R                  U5        [        U["        5      (       d  M  U R                  R                  U5        M     [%        U R                  5      U l        [%        U R                  5      U l        [%        U R                  5      U l        [%        U R                  5      U l        [%        U R                  5      U l        g r   )r   r   "_EventListeners__command_listenersr   !_EventListeners__server_listenersr   +_EventListeners__server_heartbeat_listenersr   #_EventListeners__topology_listenersr   _EventListeners__cmap_listenersr   r(   r   r   rq   r|   r@   rX  %_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   _EventListeners.__init__  s~   #-#?#?#B ","="=a"@33,/F)$.$A$A!$D! * 9 9! <  c?33,,33C8c>22++2237c#:;;55<<SAc#344--44S9c#9::))005 ! '+4+C+C&D#$()@)@$A!.243T3T.U+&*4+D+D&E#"&t'<'<"=r%   c                    U R                   $ )z-Are any CommandListener instances registered?)r/  r   s    r&   enabled_for_commands$_EventListeners.enabled_for_commands       ***r%   c                    U R                   $ )z,Are any ServerListener instances registered?)r0  r   s    r&   enabled_for_server"_EventListeners.enabled_for_server  s     (((r%   c                    U R                   $ )z5Are any ServerHeartbeatListener instances registered?)r1  r   s    r&   enabled_for_server_heartbeat,_EventListeners.enabled_for_server_heartbeat  s     222r%   c                    U R                   $ )z.Are any TopologyListener instances registered?)r2  r   s    r&   enabled_for_topology$_EventListeners.enabled_for_topology  r9  r%   c                    U R                   $ )z4Are any ConnectionPoolListener instances registered?)r3  r   s    r&   enabled_for_cmap _EventListeners.enabled_for_cmap  s     &&&r%   c                    U R                   U R                  -   U R                  -   U R                  -   U R                  -   $ )z#List of registered event listeners.)r*  r,  r+  r-  r.  r   s    r&   event_listeners_EventListeners.event_listeners  sN     $$//0%%& ''( ##	$	
r%   Nc           
         Uc  Un[        UUUUUUUS9nU R                   H  n	 U	R                  U5        M     g! [         a    [	        5          M1  f = f)a  Publish a CommandStartedEvent to all command listeners.

:param command: The command document.
:param database_name: The name of the database this command was run
    against.
:param request_id: The request id for this operation.
:param connection_id: The address (host, port) of the server this
    command was sent to.
:param op_id: The (optional) operation id for this operation.
:param service_id: The service_id this command was sent to, or ``None``.
N)r   r   )r9   r*  r0   r&  r   )
r.   r   r   r   r   r   op_idr   r/   
subscribers
             r&   publish_command_start%_EventListeners.publish_command_start  si    * =E#!!5
 22J$""5) 3  $!#$s   ;AAc                    Uc  UnU	(       a  0 n[        UUUUUUUU
US9	nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)ap  Publish a CommandSucceededEvent to all command listeners.

:param duration: The command duration as a datetime.timedelta.
:param reply: The server reply document.
:param command_name: The command name.
:param request_id: The request id for this operation.
:param connection_id: The address (host, port) of the server this
    command was sent to.
:param op_id: The (optional) operation id for this operation.
:param service_id: The service_id this command was sent to, or ``None``.
:param speculative_hello: Was the command sent with speculative auth?
:param database_name: The database this command was sent to, or ``""``.
N)r   r   )r<   r*  r4   r&  r   )r.   r	  r
  r   r   r   r   rJ  r   speculative_hellor   r/   rK  s                r&   publish_command_success'_EventListeners.publish_command_success  sy    4 =E E%'!5

 22J$$$U+ 3  $!#$s   AAAc
                    Uc  Un[        UUUUUUUU	US9	n
U R                   H  n UR                  U
5        M     g! [         a    [	        5          M1  f = f)aM  Publish a CommandFailedEvent to all command listeners.

:param duration: The command duration as a datetime.timedelta.
:param failure: The server reply document or failure description
    document.
:param command_name: The command name.
:param request_id: The request id for this operation.
:param connection_id: The address (host, port) of the server this
    command was sent to.
:param op_id: The (optional) operation id for this operation.
:param service_id: The service_id this command was sent to, or ``None``.
:param database_name: The database this command was sent to, or ``""``.
Nr   )r=   r*  r7   r&  r   )r.   r	  r  r   r   r   r   rJ  r   r   r/   rK  s               r&   publish_command_failure'_EventListeners.publish_command_failure7  so    2 =E"!'!5

 22J$!!%( 3  $!#$s   =AAc                    [        X5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zPublish a ServerHeartbeatStartedEvent to all server heartbeat
listeners.

:param connection_id: The address (host, port) pair of the connection.
:param awaited: True if this heartbeat is part of an awaitable hello command.
N)rx   r,  r0   r&  r   )r.   r   r  r/   rK  s        r&    publish_server_heartbeat_started0_EventListeners.publish_server_heartbeat_startedc  sH     ,MC;;J$""5) <  $!#$   2A
	A
c                    [        X#X5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)aP  Publish a ServerHeartbeatSucceededEvent to all server heartbeat
listeners.

:param connection_id: The address (host, port) pair of the connection.
:param duration: The execution time of the event in the highest possible
    resolution for the platform.
:param reply: The command reply.
:param awaited: True if the response was awaited.
N)ry   r,  r4   r&  r   r.   r   r	  r
  r  r/   rK  s          r&   "publish_server_heartbeat_succeeded2_EventListeners.publish_server_heartbeat_succeededq  sJ     .h}V;;J$$$U+ <  $!#$   3A
Ac                    [        X#X5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)aM  Publish a ServerHeartbeatFailedEvent to all server heartbeat
listeners.

:param connection_id: The address (host, port) pair of the connection.
:param duration: The execution time of the event in the highest possible
    resolution for the platform.
:param reply: The command reply.
:param awaited: True if the response was awaited.
N)rz   r,  r7   r&  r   rZ  s          r&   publish_server_heartbeat_failed/_EventListeners.publish_server_heartbeat_failed  sJ     +8MS;;J$!!%( <  $!#$r]  c                    [        X5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zPublish a ServerOpeningEvent to all server listeners.

:param server_address: The address (host, port) pair of the server.
:param topology_id: A unique identifier for the topology this server
   is a part of.
N)r   r+  r~   r&  r   r.   r  r  r/   rK  s        r&   publish_server_opened%_EventListeners.publish_server_opened  sH     #>?11J$!!%( 2  $!#$rX  c                    [        X5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zPublish a ServerClosedEvent to all server listeners.

:param server_address: The address (host, port) pair of the server.
:param topology_id: A unique identifier for the topology this server
   is a part of.
N)r   r+  r   r&  r   rb  s        r&   publish_server_closed%_EventListeners.publish_server_closed  sH     ".>11J$!!%( 2  $!#$rX  c                    [        XX45      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)aN  Publish a ServerDescriptionChangedEvent to all server listeners.

:param previous_description: The previous server description.
:param server_address: The address (host, port) pair of the server.
:param new_description: The new server description.
:param topology_id: A unique identifier for the topology this server
   is a part of.
N)r   r+  r   r&  r   )r.   r  r  r  r  r/   rK  s          r&   "publish_server_description_changed2_EventListeners.publish_server_description_changed  sO     . >
 11J$..u5 2  $!#$r]  c                    [        U5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zPublish a TopologyOpenedEvent to all topology listeners.

:param topology_id: A unique identifier for the topology this server
   is a part of.
N)r   r-  r~   r&  r   r.   r  r/   rK  s       r&   publish_topology_opened'_EventListeners.publish_topology_opened  H     $K033J$!!%( 4  $!#$rX  c                    [        U5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zPublish a TopologyClosedEvent to all topology listeners.

:param topology_id: A unique identifier for the topology this server
   is a part of.
N)r   r-  r   r&  r   rl  s       r&   publish_topology_closed'_EventListeners.publish_topology_closed  ro  rX  c                    [        XU5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)a  Publish a TopologyDescriptionChangedEvent to all topology listeners.

:param previous_description: The previous topology description.
:param new_description: The new topology description.
:param topology_id: A unique identifier for the topology this server
   is a part of.
N)r   r-  r   r&  r   )r.   r  r  r  r/   rK  s         r&   $publish_topology_description_changed4_EventListeners.publish_topology_description_changed  sL     00DWbc33J$..u5 4  $!#$r]  c                    [        X5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)z:Publish a :class:`PoolCreatedEvent` to all pool listeners.N)re   r.  rC   r&  r   )r.   r,  r>  r/   rK  s        r&   publish_pool_created$_EventListeners.publish_pool_created  sF     2//J$''. 0  $!#$rX  c                    [        U5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)z8Publish a :class:`PoolReadyEvent` to all pool listeners.N)rf   r.  rG   r&  r   r.   r,  r/   rK  s       r&   publish_pool_ready"_EventListeners.publish_pool_ready  sF    w'//J$%%e, 0  $!#$rX  c                    [        XU5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)z:Publish a :class:`PoolClearedEvent` to all pool listeners.N)rg   r.  rJ   r&  r   )r.   r,  r   rO  r/   rK  s         r&   publish_pool_cleared$_EventListeners.publish_pool_cleared  sK     !6KL//J$''. 0  $!#$r]  c                    [        U5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)z9Publish a :class:`PoolClosedEvent` to all pool listeners.N)rh   r.  rM   r&  r   rz  s       r&   publish_pool_closed#_EventListeners.publish_pool_closed  sF    (//J$&&u- 0  $!#$rX  c                    [        X5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zGPublish a :class:`ConnectionCreatedEvent` to all connection
listeners.
N)ri   r.  rP   r&  r   r.   r,  r   r/   rK  s        r&   publish_connection_created*_EventListeners.publish_connection_created"  sH     'w>//J$--e4 0  $!#$rX  c                    [        XU5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zDPublish a :class:`ConnectionReadyEvent` to all connection listeners.N)rj   r.  rS   r&  r   r.   r,  r   r	  r/   rK  s         r&   publish_connection_ready(_EventListeners.publish_connection_ready-  sJ     %WXF//J$++E2 0  $!#$r]  c                    [        XU5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zFPublish a :class:`ConnectionClosedEvent` to all connection
listeners.
N)rk   r.  rW   r&  r   )r.   r,  r   r  r/   rK  s         r&   publish_connection_closed)_EventListeners.publish_connection_closed8  sJ     &gfE//J$,,U3 0  $!#$r]  c                    [        U5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zOPublish a :class:`ConnectionCheckOutStartedEvent` to all connection
listeners.
N)rl   r.  rZ   r&  r   rz  s       r&   $publish_connection_check_out_started4_EventListeners.publish_connection_check_out_startedC  sH     /w7//J$77> 0  $!#$rX  c                    [        XU5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zNPublish a :class:`ConnectionCheckOutFailedEvent` to all connection
listeners.
N)rm   r.  r]   r&  r   )r.   r,  r  r	  r/   rK  s         r&   #publish_connection_check_out_failed3_EventListeners.publish_connection_check_out_failedN  sJ     .gxH//J$66u= 0  $!#$r]  c                    [        XU5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zJPublish a :class:`ConnectionCheckedOutEvent` to all connection
listeners.
N)rn   r.  r`   r&  r   r  s         r&   publish_connection_checked_out._EventListeners.publish_connection_checked_out[  sJ     *'(K//J$11%8 0  $!#$r]  c                    [        X5      nU R                   H  n UR                  U5        M     g! [         a    [	        5          M1  f = f)zIPublish a :class:`ConnectionCheckedInEvent` to all connection
listeners.
N)ro   r.  rc   r&  r   r  s        r&   publish_connection_checked_in-_EventListeners.publish_connection_checked_inh  sH     )@//J$007 0  $!#$rX  )
__cmap_listeners__command_listeners__enabled_for_cmap__enabled_for_commands__enabled_for_server__enabled_for_server_heartbeat__enabled_for_topology__server_heartbeat_listeners__server_listeners__topology_listeners)r   z"Optional[Sequence[_EventListener]]rY  )r:   zlist[_EventListeners]r   )r   r   r   r   r   r   r   r   r   r   rJ  r   r   r   r:   r;   )NNFr   )r	  r   r
  r   r   r   r   r   r   r   r   r   rJ  r   r   r   rO  rX  r   r   r:   r;   )NNr   )r	  r   r  r   r   r   r   r   r   r   r   r   rJ  r   r   r   r   r   r:   r;   r  )
r   r   r	  r  r
  r   r  rX  r:   r;   )
r   r   r	  r  r
  r&  r  rX  r:   r;   r  )
r  r   r  r   r  r   r  r   r:   r;   r  )r  r   r  r   r  r   r:   r;   rE  r8  r  rW  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   r7  r;  r>  rA  rD  rG  rL  rP  rS  rV  r[  r_  rc  rf  ri  rm  rq  rt  rw  r{  r~  r  r  r  r  r  r  r  r  r$   r   r%   r&   r(  r(    sY   >2 + + ) ) 3 3 + + ' '
"  $)-$$$$ $$ 	$$
  $$ ,$$ $$ '$$ 
$$\  $)-"'/$/$ /$ 	/$
 /$  /$ ,/$ /$ '/$  /$ /$ 
/$r  $)-*$*$ *$ 	*$
 *$  *$ ,*$ *$ '*$ *$ 
*$X$$%$16$?D$OS$	$&$%$16$?H$SW$	$&$$$/$ +$ !	$
 $ 
$0$$$1$ -$ 	$
 
$($$ ',	$$ '$  $	$
 
$$	$	$	$03	$?D	$		$	$	$$$),$8=$	$$$03$?D$	$	$r%   r(  )r   r   r:   r   )r   r   r   Sequence[_EventListeners]r:   r  )r   r   r:   r;   )r   r   r   zMapping[str, Any]r:   rX  )Kr#   
__future__r   datetimecollectionsr   r   typingr   r   r   r	   r
   bson.objectidr   pymongo.hellor   r   pymongo.helpers_sharedr   r   pymongo.typingsr   r   r   pymongo.server_descriptionr   pymongo.topology_descriptionr   r   r   r   r(   r@   rq   r|   r   r   r   r   r   r   r9   r<   r=   r%  re   rf   rg   rh   r\  rf  rl  rv  r  ri   rj   rk   rl   rm   rn   ro   r  r   r   r   r  r   r   r   r  rx   ry   rz   r(  r   r%   r&   <module>r     s  l\ #  ' B B " , I 2"<@ 	
 BB+
7 7"n ":u"^ u"p"n ">"~ "<"^ "<+
5$3:I% I%X@
- @
FB
M B
J@
 @
F@ @&Rz R0	Z 	*wz *wZ	j 	F F* &@ @&X) X$k1 k*/  
3 
 
.  
F	%5 	d$< d:
 8 

1 
d d.&
L &
R  N N"&
m &
R- - [ [8"7 ,
$9 ,
^-
!6 -
`U$ U$r%   