filestack-js
Version:
Official JavaScript library for Filestack
120 lines (118 loc) • 14.5 kB
JavaScript
import { __awaiter, __generator } from "tslib";
/*
* Copyright (c) 2018 by Filestack
* Some rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { isURLSearchParams, isObject, isStream, isFormData, isArrayBuffer, isFile, isBlob, isBuffer } from './../utils';
import { getVersion, uniqueId } from './../../utils';
import { set } from './headers';
import { XMLParser, XMLValidator } from 'fast-xml-parser';
import Debug from 'debug';
var debug = Debug('fs:request:data');
/**
* Prepare request and set content-type header based on data
*
* @param headers
* @param data
*/
export var prepareData = function (config) {
// set filestack debug headers first
config = filestackHeaders(config);
if (isFormData(config.data) || isBuffer(config.data) || isStream(config.data) || isFile(config.data) || isBlob(config.data)) {
return config;
}
// @todo convert it to ArrayBufferView for browser
if (isArrayBuffer(config.data)) {
return config;
}
if (isURLSearchParams(config.data)) {
config.headers = set(config.headers, 'content-type', 'application/x-www-form-urlencoded;charset=utf-8');
config.data = config.data.toString();
}
else if (isObject(config.data)) {
config.headers = set(config.headers, 'content-type', 'application/json', true);
config.data = JSON.stringify(config.data);
}
return config;
};
/**
* Add filestack debug headers to request
*
* @param config
*/
export var filestackHeaders = function (config) {
if (!config.filestackHeaders) {
return config;
}
config.headers = set(config.headers, 'filestack-source', getVersion());
config.headers = set(config.headers, 'filestack-trace-id', "".concat(Math.floor(Date.now() / 1000), "-").concat(uniqueId()));
config.headers = set(config.headers, 'filestack-trace-span', "jssdk-".concat(uniqueId()));
return config;
};
/**
* Prepare response data based on content type
*
* @param response
*/
export var parseResponse = function (response) { return __awaiter(void 0, void 0, void 0, function () {
var contentType, data;
return __generator(this, function (_a) {
if (!response.headers || !response.headers['content-type']) {
return [2 /*return*/, Promise.resolve(response)];
}
contentType = response.headers['content-type'];
if (/application\/json/.test(contentType)) {
try {
response.data = JSON.parse(response.data);
}
catch (e) {
debug('Cannot parse response %O - %O', response.data, response.headers);
}
}
else if (/text\/(plain|html)/.test(contentType)) {
if (isBuffer(response.data)) {
response.data = bufferToString(response.data);
}
}
else if (/application\/xml/.test(contentType)) {
data = response.data;
if (isBuffer(response.data)) {
data = bufferToString(response.data);
}
if (XMLValidator.validate(data) === true) {
response.data = new XMLParser({
ignoreDeclaration: true,
ignoreAttributes: true,
trimValues: true,
}).parse(data);
}
}
return [2 /*return*/, Promise.resolve(response)];
});
}); };
function bufferToString(buffer) {
var bufView = new Uint16Array(buffer);
var length = bufView.length;
var result = '';
var addition = Math.pow(2, 16) - 1;
for (var i = 0; i < length; i += addition) {
if (i + addition > length) {
addition = length - i;
}
result += String.fromCharCode.apply(null, bufView.subarray(i, i + addition));
}
return result;
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcmVxdWVzdC9oZWxwZXJzL2RhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUV2Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxJQUFNLFdBQVcsR0FBRyxVQUFDLE1BQXdCO0lBQ2xELG9DQUFvQztJQUNwQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbEMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDM0gsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUVELGtEQUFrRDtJQUNsRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDOUIsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUVELElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxF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LENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDO29CQUM1QixpQkFBaUIsRUFBRSxJQUFJO29CQUN2QixnQkFBZ0IsRUFBRyxJQUFJO29CQUN2QixVQUFVLEVBQUUsSUFBSTtpQkFDakIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNoQjtTQUNGO1FBRUQsc0JBQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBQzs7S0FDbEMsQ0FBQztBQUVGLFNBQVMsY0FBYyxDQUFDLE1BQU07SUFDNUIsSUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUU5QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRW5DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRTtRQUN6QyxJQUFJLENBQUMsR0FBRyxRQUFRLEdBQUcsTUFBTSxFQUFFO1lBQ3pCLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztLQUM5RTtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJmaWxlIjoibGliL3JlcXVlc3QvaGVscGVycy9kYXRhLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOCBieSBGaWxlc3RhY2tcbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgaXNVUkxTZWFyY2hQYXJhbXMsIGlzT2JqZWN0LCBpc1N0cmVhbSwgaXNGb3JtRGF0YSwgaXNBcnJheUJ1ZmZlciwgaXNGaWxlLCBpc0Jsb2IsIGlzQnVmZmVyIH0gZnJvbSAnLi8uLi91dGlscyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uLCB1bmlxdWVJZCB9IGZyb20gJy4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRnNSZXF1ZXN0T3B0aW9ucywgRnNSZXNwb25zZSB9IGZyb20gJy4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnLi9oZWFkZXJzJztcbmltcG9ydCB7IFhNTFBhcnNlciwgWE1MVmFsaWRhdG9yIH0gZnJvbSAnZmFzdC14bWwtcGFyc2VyJztcbmltcG9ydCBEZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5cbmNvbnN0IGRlYnVnID0gRGVidWcoJ2ZzOnJlcXVlc3Q6ZGF0YScpO1xuXG4vKipcbiAqIFByZXBhcmUgcmVxdWVzdCBhbmQgc2V0IGNvbnRlbnQtdHlwZSBoZWFkZXIgYmFzZWQgb24gZGF0YVxuICpcbiAqIEBwYXJhbSBoZWFkZXJzXG4gKiBAcGFyYW0gZGF0YVxuICovXG5leHBvcnQgY29uc3QgcHJlcGFyZURhdGEgPSAoY29uZmlnOiBGc1JlcXVlc3RPcHRpb25zKSA9PiB7XG4gIC8vIHNldCBmaWxlc3RhY2sgZGVidWcgaGVhZGVycyBmaXJzdFxuICBjb25maWcgPSBmaWxlc3RhY2tIZWFkZXJzKGNvbmZpZyk7XG5cbiAgaWYgKGlzRm9ybURhdGEoY29uZmlnLmRhdGEpIHx8IGlzQnVmZmVyKGNvbmZpZy5kYXRhKSB8fCBpc1N0cmVhbShjb25maWcuZGF0YSkgfHwgaXNGaWxlKGNvbmZpZy5kYXRhKSB8fCBpc0Jsb2IoY29uZmlnLmRhdGEpKSB7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8vIEB0b2RvIGNvbnZlcnQgaXQgdG8gQXJyYXlCdWZmZXJWaWV3IGZvciBicm93c2VyXG4gIGlmIChpc0FycmF5QnVmZmVyKGNvbmZpZy5kYXRhKSkge1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBpZiAoaXNVUkxTZWFyY2hQYXJhbXMoY29uZmlnLmRhdGEpKSB7XG4gICAgY29uZmlnLmhlYWRlcnMgPSBzZXQoY29uZmlnLmhlYWRlcnMsICdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICBjb25maWcuZGF0YSA9IGNvbmZpZy5kYXRhLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoY29uZmlnLmRhdGEpKSB7XG4gICAgY29uZmlnLmhlYWRlcnMgPSBzZXQoY29uZmlnLmhlYWRlcnMsICdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicsIHRydWUpO1xuICAgIGNvbmZpZy5kYXRhID0gSlNPTi5zdHJpbmdpZnkoY29uZmlnLmRhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZztcbn07XG5cbi8qKlxuICogQWRkIGZpbGVzdGFjayBkZWJ1ZyBoZWFkZXJzIHRvIHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0gY29uZmlnXG4gKi9cbmV4cG9ydCBjb25zdCBmaWxlc3RhY2tIZWFkZXJzID0gKGNvbmZpZzogRnNSZXF1ZXN0T3B0aW9ucykgPT4ge1xuICBpZiAoIWNvbmZpZy5maWxlc3RhY2tIZWFkZXJzKSB7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIGNvbmZpZy5oZWFkZXJzID0gc2V0KGNvbmZpZy5oZWFkZXJzLCAnZmlsZXN0YWNrLXNvdXJjZScsIGdldFZlcnNpb24oKSk7XG4gIGNvbmZpZy5oZWFkZXJzID0gc2V0KGNvbmZpZy5oZWFkZXJzLCAnZmlsZXN0YWNrLXRyYWNlLWlkJywgYCR7TWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCl9LSR7dW5pcXVlSWQoKX1gKTtcbiAgY29uZmlnLmhlYWRlcnMgPSBzZXQoY29uZmlnLmhlYWRlcnMsICdmaWxlc3RhY2stdHJhY2Utc3BhbicsIGBqc3Nkay0ke3VuaXF1ZUlkKCl9YCk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn07XG5cbi8qKlxuICogUHJlcGFyZSByZXNwb25zZSBkYXRhIGJhc2VkIG9uIGNvbnRlbnQgdHlwZVxuICpcbiAqIEBwYXJhbSByZXNwb25zZVxuICovXG5leHBvcnQgY29uc3QgcGFyc2VSZXNwb25zZSA9IGFzeW5jIChyZXNwb25zZTogRnNSZXNwb25zZSk6IFByb21pc2U8RnNSZXNwb25zZT4gPT4ge1xuICBpZiAoIXJlc3BvbnNlLmhlYWRlcnMgfHwgIXJlc3BvbnNlLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gIH1cblxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddO1xuXG4gIGlmICgvYXBwbGljYXRpb25cXC9qc29uLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZS5kYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZS5kYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1ZygnQ2Fubm90IHBhcnNlIHJlc3BvbnNlICVPIC0gJU8nLCByZXNwb25zZS5kYXRhLCByZXNwb25zZS5oZWFkZXJzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoL3RleHRcXC8ocGxhaW58aHRtbCkvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgaWYgKGlzQnVmZmVyKHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICByZXNwb25zZS5kYXRhID0gYnVmZmVyVG9TdHJpbmcocmVzcG9uc2UuZGF0YSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKC9hcHBsaWNhdGlvblxcL3htbC8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICBsZXQgZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICBpZiAoaXNCdWZmZXIocmVzcG9uc2UuZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBidWZmZXJUb1N0cmluZyhyZXNwb25zZS5kYXRhKTtcbiAgICB9XG5cbiAgICBpZiAoWE1MVmFsaWRhdG9yLnZhbGlkYXRlKGRhdGEpID09PSB0cnVlKSB7XG4gICAgICByZXNwb25zZS5kYXRhID0gbmV3IFhNTFBhcnNlcih7XG4gICAgICAgIGlnbm9yZURlY2xhcmF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVBdHRyaWJ1dGVzIDogdHJ1ZSxcbiAgICAgICAgdHJpbVZhbHVlczogdHJ1ZSxcbiAgICAgIH0pLnBhcnNlKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xufTtcblxuZnVuY3Rpb24gYnVmZmVyVG9TdHJpbmcoYnVmZmVyKSB7XG4gIGNvbnN0IGJ1ZlZpZXcgPSBuZXcgVWludDE2QXJyYXkoYnVmZmVyKTtcbiAgY29uc3QgbGVuZ3RoID0gYnVmVmlldy5sZW5ndGg7XG5cbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgYWRkaXRpb24gPSBNYXRoLnBvdygyLCAxNikgLSAxO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IGFkZGl0aW9uKSB7XG4gICAgaWYgKGkgKyBhZGRpdGlvbiA+IGxlbmd0aCkge1xuICAgICAgYWRkaXRpb24gPSBsZW5ndGggLSBpO1xuICAgIH1cbiAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBidWZWaWV3LnN1YmFycmF5KGksIGkgKyBhZGRpdGlvbikpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==