docs: async def disconnect(self):
          """
              Disconnect coroutine
          """
  
          async with self._disconnect_lock:
              if self._state == ConnectionState.DISCONNECTED:
                  return
  
              self._set_state(ConnectionState.DISCONNECTING)
  
              logger.info('%s Disconnecting...', self.fingerprint)
              if self._reconnect_task:
                  self._reconnect_task.cancel()
                  self._reconnect_task = None
  
              if self._ping_task and not self._ping_task.done():
                  self._ping_task.cancel()
                  self._ping_task = None
  
              self._db = _DbMock()
              if self._transport:
                  self._disconnect_waiter = _create_future(self._loop)
                  self._transport.close()
                  self._transport = None
                  self._protocol = None
  
                  await self._disconnect_waiter
                  self._disconnect_waiter = None
                  self._set_state(ConnectionState.DISCONNECTED)
              else:
                  self._transport = None
                  self._protocol = None
                  self._disconnect_waiter = None
                  self._set_state(ConnectionState.DISCONNECTED)