UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

120 lines (118 loc) 14.5 kB
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==