'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;