realPath(remotePath, addListeners = true) {
    let listeners;
    return new Promise((resolve, reject) => {
      if (addListeners) {
        listeners = addTempListeners(this, 'realPath', reject);
      }
      this.sftp.realpath(remotePath, (err, absPath) => {
        if (err) {
          if (err.code === 2) {
            resolve('');
          } else {
            reject(this.fmtError(`${err.message} ${remotePath}`, 'realPath', err.code));
          }
        }
        resolve(absPath);
      });
    }).finally(() => {
      if (addListeners) {
        removeTempListeners(this, listeners, 'realPath');
      }
    });
  }
@async

Returns the real absolute path on the remote server. Is able to handle
both '.' and '..' in path names, but not '~'. If the path is relative
then the current working directory is prepended to create an absolute path.
Returns undefined if the path does not exists.

@param {String} remotePath - remote path, may be relative
@param {Boolean} addListeners - (Optional) add event listeners. Default = true
@returns {Promise<String>} - remote absolute path or ''