You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
7.1 KiB
218 lines
7.1 KiB
|
2 years ago
|
'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;
|