218 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
let _Symbol$for;
 | 
						|
 | 
						|
function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
 | 
						|
 | 
						|
var id = 0;
 | 
						|
 | 
						|
function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
 | 
						|
 | 
						|
const fetchWithNetworkError = require("@uppy/utils/lib/fetchWithNetworkError");
 | 
						|
 | 
						|
const ErrorWithCause = require("@uppy/utils/lib/ErrorWithCause");
 | 
						|
 | 
						|
const AuthError = require("./AuthError.js");
 | 
						|
 | 
						|
const packageJson = {
 | 
						|
  "version": "2.2.2"
 | 
						|
}; // Remove the trailing slash so we can always safely append /xyz.
 | 
						|
 | 
						|
function stripSlash(url) {
 | 
						|
  return url.replace(/\/$/, '');
 | 
						|
}
 | 
						|
 | 
						|
async function handleJSONResponse(res) {
 | 
						|
  if (res.status === 401) {
 | 
						|
    throw new AuthError();
 | 
						|
  }
 | 
						|
 | 
						|
  const jsonPromise = res.json();
 | 
						|
 | 
						|
  if (res.status < 200 || res.status > 300) {
 | 
						|
    let errMsg = `Failed request with status: ${res.status}. ${res.statusText}`;
 | 
						|
 | 
						|
    try {
 | 
						|
      const errData = await jsonPromise;
 | 
						|
      errMsg = errData.message ? `${errMsg} message: ${errData.message}` : errMsg;
 | 
						|
      errMsg = errData.requestId ? `${errMsg} request-Id: ${errData.requestId}` : errMsg;
 | 
						|
    } finally {
 | 
						|
      // eslint-disable-next-line no-unsafe-finally
 | 
						|
      throw new Error(errMsg);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return jsonPromise;
 | 
						|
}
 | 
						|
 | 
						|
var _companionHeaders = /*#__PURE__*/_classPrivateFieldLooseKey("companionHeaders");
 | 
						|
 | 
						|
var _getPostResponseFunc = /*#__PURE__*/_classPrivateFieldLooseKey("getPostResponseFunc");
 | 
						|
 | 
						|
var _getUrl = /*#__PURE__*/_classPrivateFieldLooseKey("getUrl");
 | 
						|
 | 
						|
var _errorHandler = /*#__PURE__*/_classPrivateFieldLooseKey("errorHandler");
 | 
						|
 | 
						|
_Symbol$for = Symbol.for('uppy test: getCompanionHeaders');
 | 
						|
 | 
						|
class RequestClient {
 | 
						|
  constructor(uppy, opts) {
 | 
						|
    Object.defineProperty(this, _errorHandler, {
 | 
						|
      value: _errorHandler2
 | 
						|
    });
 | 
						|
    Object.defineProperty(this, _getUrl, {
 | 
						|
      value: _getUrl2
 | 
						|
    });
 | 
						|
    Object.defineProperty(this, _companionHeaders, {
 | 
						|
      writable: true,
 | 
						|
      value: void 0
 | 
						|
    });
 | 
						|
    Object.defineProperty(this, _getPostResponseFunc, {
 | 
						|
      writable: true,
 | 
						|
      value: skip => response => skip ? response : this.onReceiveResponse(response)
 | 
						|
    });
 | 
						|
    this.uppy = uppy;
 | 
						|
    this.opts = opts;
 | 
						|
    this.onReceiveResponse = this.onReceiveResponse.bind(this);
 | 
						|
    this.allowedHeaders = ['accept', 'content-type', 'uppy-auth-token'];
 | 
						|
    this.preflightDone = false;
 | 
						|
    _classPrivateFieldLooseBase(this, _companionHeaders)[_companionHeaders] = opts == null ? void 0 : opts.companionHeaders;
 | 
						|
  }
 | 
						|
 | 
						|
  setCompanionHeaders(headers) {
 | 
						|
    _classPrivateFieldLooseBase(this, _companionHeaders)[_companionHeaders] = headers;
 | 
						|
  }
 | 
						|
 | 
						|
  [_Symbol$for]() {
 | 
						|
    return _classPrivateFieldLooseBase(this, _companionHeaders)[_companionHeaders];
 | 
						|
  }
 | 
						|
 | 
						|
  get hostname() {
 | 
						|
    const {
 | 
						|
      companion
 | 
						|
    } = this.uppy.getState();
 | 
						|
    const host = this.opts.companionUrl;
 | 
						|
    return stripSlash(companion && companion[host] ? companion[host] : host);
 | 
						|
  }
 | 
						|
 | 
						|
  headers() {
 | 
						|
    return Promise.resolve({ ...RequestClient.defaultHeaders,
 | 
						|
      ..._classPrivateFieldLooseBase(this, _companionHeaders)[_companionHeaders]
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  onReceiveResponse(response) {
 | 
						|
    const state = this.uppy.getState();
 | 
						|
    const companion = state.companion || {};
 | 
						|
    const host = this.opts.companionUrl;
 | 
						|
    const {
 | 
						|
      headers
 | 
						|
    } = response; // Store the self-identified domain name for the Companion instance we just hit.
 | 
						|
 | 
						|
    if (headers.has('i-am') && headers.get('i-am') !== companion[host]) {
 | 
						|
      this.uppy.setState({
 | 
						|
        companion: { ...companion,
 | 
						|
          [host]: headers.get('i-am')
 | 
						|
        }
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    return response;
 | 
						|
  }
 | 
						|
 | 
						|
  preflight(path) {
 | 
						|
    if (this.preflightDone) {
 | 
						|
      return Promise.resolve(this.allowedHeaders.slice());
 | 
						|
    }
 | 
						|
 | 
						|
    return fetch(_classPrivateFieldLooseBase(this, _getUrl)[_getUrl](path), {
 | 
						|
      method: 'OPTIONS'
 | 
						|
    }).then(response => {
 | 
						|
      if (response.headers.has('access-control-allow-headers')) {
 | 
						|
        this.allowedHeaders = response.headers.get('access-control-allow-headers').split(',').map(headerName => headerName.trim().toLowerCase());
 | 
						|
      }
 | 
						|
 | 
						|
      this.preflightDone = true;
 | 
						|
      return this.allowedHeaders.slice();
 | 
						|
    }).catch(err => {
 | 
						|
      this.uppy.log(`[CompanionClient] unable to make preflight request ${err}`, 'warning');
 | 
						|
      this.preflightDone = true;
 | 
						|
      return this.allowedHeaders.slice();
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  preflightAndHeaders(path) {
 | 
						|
    return Promise.all([this.preflight(path), this.headers()]).then(_ref => {
 | 
						|
      let [allowedHeaders, headers] = _ref;
 | 
						|
      // filter to keep only allowed Headers
 | 
						|
      Object.keys(headers).forEach(header => {
 | 
						|
        if (!allowedHeaders.includes(header.toLowerCase())) {
 | 
						|
          this.uppy.log(`[CompanionClient] excluding disallowed header ${header}`);
 | 
						|
          delete headers[header]; // eslint-disable-line no-param-reassign
 | 
						|
        }
 | 
						|
      });
 | 
						|
      return headers;
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  get(path, skipPostResponse) {
 | 
						|
    const method = 'get';
 | 
						|
    return this.preflightAndHeaders(path).then(headers => fetchWithNetworkError(_classPrivateFieldLooseBase(this, _getUrl)[_getUrl](path), {
 | 
						|
      method,
 | 
						|
      headers,
 | 
						|
      credentials: this.opts.companionCookiesRule || 'same-origin'
 | 
						|
    })).then(_classPrivateFieldLooseBase(this, _getPostResponseFunc)[_getPostResponseFunc](skipPostResponse)).then(handleJSONResponse).catch(_classPrivateFieldLooseBase(this, _errorHandler)[_errorHandler](method, path));
 | 
						|
  }
 | 
						|
 | 
						|
  post(path, data, skipPostResponse) {
 | 
						|
    const method = 'post';
 | 
						|
    return this.preflightAndHeaders(path).then(headers => fetchWithNetworkError(_classPrivateFieldLooseBase(this, _getUrl)[_getUrl](path), {
 | 
						|
      method,
 | 
						|
      headers,
 | 
						|
      credentials: this.opts.companionCookiesRule || 'same-origin',
 | 
						|
      body: JSON.stringify(data)
 | 
						|
    })).then(_classPrivateFieldLooseBase(this, _getPostResponseFunc)[_getPostResponseFunc](skipPostResponse)).then(handleJSONResponse).catch(_classPrivateFieldLooseBase(this, _errorHandler)[_errorHandler](method, path));
 | 
						|
  }
 | 
						|
 | 
						|
  delete(path, data, skipPostResponse) {
 | 
						|
    const method = 'delete';
 | 
						|
    return this.preflightAndHeaders(path).then(headers => fetchWithNetworkError(`${this.hostname}/${path}`, {
 | 
						|
      method,
 | 
						|
      headers,
 | 
						|
      credentials: this.opts.companionCookiesRule || 'same-origin',
 | 
						|
      body: data ? JSON.stringify(data) : null
 | 
						|
    })).then(_classPrivateFieldLooseBase(this, _getPostResponseFunc)[_getPostResponseFunc](skipPostResponse)).then(handleJSONResponse).catch(_classPrivateFieldLooseBase(this, _errorHandler)[_errorHandler](method, path));
 | 
						|
  }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
function _getUrl2(url) {
 | 
						|
  if (/^(https?:|)\/\//.test(url)) {
 | 
						|
    return url;
 | 
						|
  }
 | 
						|
 | 
						|
  return `${this.hostname}/${url}`;
 | 
						|
}
 | 
						|
 | 
						|
function _errorHandler2(method, path) {
 | 
						|
  return err => {
 | 
						|
    var _err;
 | 
						|
 | 
						|
    if (!((_err = err) != null && _err.isAuthError)) {
 | 
						|
      // eslint-disable-next-line no-param-reassign
 | 
						|
      err = new ErrorWithCause(`Could not ${method} ${_classPrivateFieldLooseBase(this, _getUrl)[_getUrl](path)}`, {
 | 
						|
        cause: err
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    return Promise.reject(err);
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
RequestClient.VERSION = packageJson.version;
 | 
						|
RequestClient.defaultHeaders = {
 | 
						|
  Accept: 'application/json',
 | 
						|
  'Content-Type': 'application/json',
 | 
						|
  'Uppy-Versions': `@uppy/companion-client=${RequestClient.VERSION}`
 | 
						|
};
 | 
						|
module.exports = RequestClient; |