docs: def transferReporter(self, xferId, message):
          ''' the callback method used by the Aspera sdk during transfer
              to notify progress, error or successful completion
          '''
          if self.is_stopped():
              return True
  
          _asp_message = AsperaMessage(message)
  
          if not _asp_message.is_msg_type(
              [enumAsperaMsgType.INIT,
               enumAsperaMsgType.DONE,
               enumAsperaMsgType.ERROR,
               enumAsperaMsgType.FILEERROR,
               enumAsperaMsgType.STATS]):
                  return
  
          _session_id = _asp_message.get_session_id()
  
          _msg = self.debug_id(xferId, _session_id) + " : " + _asp_message._msg_type
          logger.info(_msg)
  
          with self._session_lock:
              if _asp_message.is_msg_type([enumAsperaMsgType.INIT]):
                  assert(_session_id not in self._sessions)
                  _session = AsperaSession(_session_id)
                  self._sessions[_session_id] = _session
                  self.notify_init()
              else:
                  _session = self._sessions[_session_id]
  
          if _asp_message.is_msg_type([enumAsperaMsgType.DONE]):
              if _session.set_bytes_transferred(_asp_message.get_bytes_transferred()):
                  self.notify_progress()
              _session.set_success()
              self.notify_done()
          elif _asp_message.is_msg_type([enumAsperaMsgType.ERROR, enumAsperaMsgType.FILEERROR]):
              _session.set_error(_asp_message.get_error_descr())
              self.notify_done(error=True)
          elif _asp_message.is_msg_type([enumAsperaMsgType.STATS]):
              if _session.set_bytes_transferred(_asp_message.get_bytes_transferred()):
                  self.notify_progress()