UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

183 lines (181 loc) 17.9 kB
import { __awaiter, __generator } from "tslib"; /* * Copyright (c) 2019 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 { File as FsFile } from './file'; import { getMimetype } from './../../utils'; import { FilestackError } from './../../../filestack_error'; var base64Regexp = /data:([a-zA-Z]*\/[a-zA-Z]*);base64,([^\"]*)/i; /** * Check if file is blob * @param input */ var isFileBlob = function (input) { return input.toString() === '[object Blob]'; }; /** * Check if input is instance of browser file * * @browser * @param input */ var isFileBrowser = function (input) { return input instanceof File; }; /** * Check if file is base64 string * * @param input */ var isFileBase = function (input) { if (typeof input !== 'string') { return false; } if (input.indexOf('base64') > -1) { input = input.match(base64Regexp).pop(); } try { return btoa(atob(input)) === input; } catch (err) { /* istanbul ignore next */ return false; } }; /** * Check if file is instance of named interface * * @param input */ var isFileNamed = function (input) { return input && input['file'] && input['name']; }; /** * Convert encoded base64 string or dataURI to blob * * @browser * @param b64data String to decode * @param sliceSize Byte quantity to split data into * @private * @returns {Blob} */ var b64toBlob = function (b64Data, sliceSize) { if (sliceSize === void 0) { sliceSize = 512; } var contentType = ''; if (b64Data.indexOf('base64') > -1) { var matches = b64Data.match(base64Regexp); b64Data = matches.pop(); contentType = matches[1]; } var byteCharacters = atob(b64Data); var byteArrays = []; for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { var slice = byteCharacters.slice(offset, offset + sliceSize); var byteNumbers = new Array(slice.length); for (var i = 0; i < slice.length; i += 1) { byteNumbers[i] = slice.charCodeAt(i); } byteArrays.push(new Uint8Array(byteNumbers)); } return new Blob(byteArrays, { type: contentType }); }; /** * Read file as array buffer * * @browser * @private * @param blob * @returns {Boolean} */ var readFile = function (file) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { /* istanbul ignore next */ if (!File || !FileReader || !Blob) { return [2 /*return*/, Promise.reject(new FilestackError('The File APIs are not fully supported by your browser'))]; } return [2 /*return*/, Promise.resolve({ slice: function (start, end) { return readPart(start, end, file); }, release: function () { file = null; }, })]; }); }); }; /** * Read file par instead of whole file to avoid browser crashing * * @param start - star byte * @param end - end byte * @param file - file to slice */ var readPart = function (start, end, file) { return new Promise(function (resolve, reject) { var r = new FileReader(); var blob = file.slice(start, end); r.onload = function () { return resolve(r.result); }; r.onerror = reject; r.readAsArrayBuffer(blob); }); }; /** * Accepts b64string or blob file * * @browser * @param {*} fileOrString * @returns {Promise<File>} */ export var getFile = function (input, sanitizeOptions, mimetype) { var filename; var file; if (isFileNamed(input)) { filename = input.name; input = input.file; } if (isFileBrowser(input)) { file = input; filename = input.name; } else if (isFileBase(input)) { file = b64toBlob(input); } else if (isFileBlob(input)) { file = input; } else { return Promise.reject(new FilestackError('Unsupported input file type')); } return readFile(file).then(function (res) { return __awaiter(void 0, void 0, void 0, function () { var mime, minimumBytes, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: mime = file.type; minimumBytes = 4100; if (!(!file.type || file.type.length === 0 || file.type === 'text/plain')) return [3 /*break*/, 3]; _a = getMimetype; return [4 /*yield*/, res.slice(0, minimumBytes)]; case 1: return [4 /*yield*/, _a.apply(void 0, [_b.sent(), filename])]; case 2: mime = _b.sent(); _b.label = 3; case 3: return [2 /*return*/, new FsFile({ name: filename, size: file.size, type: mimetype || mime, slice: res.slice, release: res.release, }, sanitizeOptions)]; } }); }); }); }; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLmJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3hDLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQVU1RCxJQUFNLFlBQVksR0FBRyw4Q0FBOEMsQ0FBQztBQUVwRTs7O0dBR0c7QUFDSCxJQUFNLFVBQVUsR0FBRyxVQUFDLEtBQWdCLElBQW9CLE9BQUEsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLGVBQWUsRUFBcEMsQ0FBb0MsQ0FBQztBQUU3Rjs7Ozs7R0FLRztBQUNILElBQU0sYUFBYSxHQUFHLFVBQUMsS0FBZ0IsSUFBb0IsT0FBQSxLQUFLLFlBQVksSUFBSSxFQUFyQixDQUFxQixDQUFDO0FBRWpGOzs7O0dBSUc7QUFDSCxJQUFNLFVBQVUsR0FBRyxVQUFDLEtBQWdCO0lBQ2xDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDaEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO0tBQ3BDO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWiwwQkFBMEI7UUFDMUIsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxJQUFNLFdBQVcsR0FB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Q0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFBO3dCQUFsRCxxQkFBTSxrQkFBWSxTQUFnQyxFQUFFLFFBQVEsRUFBQyxFQUFBOztvQkFBcEUsSUFBSSxHQUFHLFNBQTZELENBQUM7O3dCQUd2RSxzQkFBTyxJQUFJLE1BQU0sQ0FDZjt3QkFDRSxJQUFJLEVBQUUsUUFBUTt3QkFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsSUFBSSxFQUFFLFFBQVEsSUFBSSxJQUFJO3dCQUN0QixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7d0JBQ2hCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztxQkFDckIsRUFDRCxlQUFlLENBQ2hCLEVBQUM7OztTQUNILENBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImZpbGUiOiJsaWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLmJyb3dzZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgRmlsZSBhcyBGc0ZpbGUgfSBmcm9tICcuL2ZpbGUnO1xuaW1wb3J0IHsgU2FuaXRpemVPcHRpb25zLCBnZXRNaW1ldHlwZSB9IGZyb20gJy4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRmlsZXN0YWNrRXJyb3IgfSBmcm9tICcuLy4uLy4uLy4uL2ZpbGVzdGFja19lcnJvcic7XG5cbmV4cG9ydCB0eXBlIFJhd0ZpbGUgPSBCbG9iIHwgQnVmZmVyIHwgRmlsZSB8IHN0cmluZztcbmV4cG9ydCB0eXBlIE5hbWVkSW5wdXRGaWxlID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICBmaWxlOiBSYXdGaWxlO1xufTtcblxudHlwZSBJbnB1dEZpbGUgPSBSYXdGaWxlIHwgTmFtZWRJbnB1dEZpbGU7XG5cbmNvbnN0IGJhc2U2NFJlZ2V4cCA9IC9kYXRhOihbYS16QS1aXSpcXC9bYS16QS1aXSopO2Jhc2U2NCwoW15cXFwiXSopL2k7XG5cbi8qKlxuICogQ2hlY2sgaWYgZmlsZSBpcyBibG9iXG4gKiBAcGFyYW0gaW5wdXRcbiAqL1xuY29uc3QgaXNGaWxlQmxvYiA9IChpbnB1dDogSW5wdXRGaWxlKTogaW5wdXQgaXMgQmxvYiA9PiBpbnB1dC50b1N0cmluZygpID09PSAnW29iamVjdCBCbG9iXSc7XG5cbi8qKlxuICogQ2hlY2sgaWYgaW5wdXQgaXMgaW5zdGFuY2Ugb2YgYnJvd3NlciBmaWxlXG4gKlxuICogQGJyb3dzZXJcbiAqIEBwYXJhbSBpbnB1dFxuICovXG5jb25zdCBpc0ZpbGVCcm93c2VyID0gKGlucHV0OiBJbnB1dEZpbGUpOiBpbnB1dCBpcyBGaWxlID0+IGlucHV0IGluc3RhbmNlb2YgRmlsZTtcblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIGlzIGJhc2U2NCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0gaW5wdXRcbiAqL1xuY29uc3QgaXNGaWxlQmFzZSA9IChpbnB1dDogSW5wdXRGaWxlKTogaW5wdXQgaXMgc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaW5wdXQuaW5kZXhPZignYmFzZTY0JykgPiAtMSkge1xuICAgIGlucHV0ID0gaW5wdXQubWF0Y2goYmFzZTY0UmVnZXhwKS5wb3AoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJ0b2EoYXRvYihpbnB1dCkpID09PSBpbnB1dDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgZmlsZSBpcyBpbnN0YW5jZSBvZiBuYW1lZCBpbnRlcmZhY2VcbiAqXG4gKiBAcGFyYW0gaW5wdXRcbiAqL1xuY29uc3QgaXNGaWxlTmFtZWQgPSAoaW5wdXQ6IElucHV0RmlsZSk6IGlucHV0IGlzIE5hbWVkSW5wdXRGaWxlID0+IGlucHV0ICYmIGlucHV0WydmaWxlJ10gJiYgaW5wdXRbJ25hbWUnXTtcblxuLyoqXG4gKiBDb252ZXJ0IGVuY29kZWQgYmFzZTY0IHN0cmluZyBvciBkYXRhVVJJIHRvIGJsb2JcbiAqXG4gKiBAYnJvd3NlclxuICogQHBhcmFtIGI2NGRhdGEgICAgIFN0cmluZyB0byBkZWNvZGVcbiAqIEBwYXJhbSBzbGljZVNpemUgICBCeXRlIHF1YW50aXR5IHRvIHNwbGl0IGRhdGEgaW50b1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtCbG9ifVxuICovXG5jb25zdCBiNjR0b0Jsb2IgPSAoYjY0RGF0YTogc3RyaW5nLCBzbGljZVNpemUgPSA1MTIpOiBCbG9iID0+IHtcbiAgbGV0IGNvbnRlbnRUeXBlID0gJyc7XG5cbiAgaWYgKGI2NERhdGEuaW5kZXhPZignYmFzZTY0JykgPiAtMSkge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBiNjREYXRhLm1hdGNoKGJhc2U2NFJlZ2V4cCk7XG4gICAgYjY0RGF0YSA9IG1hdGNoZXMucG9wKCk7XG4gICAgY29udGVudFR5cGUgPSBtYXRjaGVzWzFdO1xuICB9XG5cbiAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKGI2NERhdGEpO1xuICBjb25zdCBieXRlQXJyYXlzOiBhbnlbXSA9IFtdO1xuXG4gIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkge1xuICAgIGNvbnN0IHNsaWNlID0gYnl0ZUNoYXJhY3RlcnMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzbGljZVNpemUpO1xuICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KHNsaWNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGljZS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgYnl0ZU51bWJlcnNbaV0gPSBzbGljZS5jaGFyQ29kZUF0KGkpO1xuICAgIH1cblxuICAgIGJ5dGVBcnJheXMucHVzaChuZXcgVWludDhBcnJheShieXRlTnVtYmVycykpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBCbG9iKGJ5dGVBcnJheXMsIHsgdHlwZTogY29udGVudFR5cGUgfSk7XG59O1xuXG4vKipcbiAqIFJlYWQgZmlsZSBhcyBhcnJheSBidWZmZXJcbiAqXG4gKiBAYnJvd3NlclxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBibG9iXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuY29uc3QgcmVhZEZpbGUgPSBhc3luYyAoZmlsZSk6IFByb21pc2U8YW55PiA9PiB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghRmlsZSB8fCAhRmlsZVJlYWRlciB8fCAhQmxvYikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRmlsZXN0YWNrRXJyb3IoJ1RoZSBGaWxlIEFQSXMgYXJlIG5vdCBmdWxseSBzdXBwb3J0ZWQgYnkgeW91ciBicm93c2VyJykpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgc2xpY2U6IGZ1bmN0aW9uKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcmVhZFBhcnQoc3RhcnQsIGVuZCwgZmlsZSk7XG4gICAgfSxcbiAgICByZWxlYXNlOiAoKSA9PiB7XG4gICAgICBmaWxlID0gbnVsbDtcbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogUmVhZCBmaWxlIHBhciBpbnN0ZWFkIG9mIHdob2xlIGZpbGUgdG8gYXZvaWQgYnJvd3NlciBjcmFzaGluZ1xuICpcbiAqIEBwYXJhbSBzdGFydCAtIHN0YXIgYnl0ZVxuICogQHBhcmFtIGVuZCAgLSBlbmQgYnl0ZVxuICogQHBhcmFtIGZpbGUgLSBmaWxlIHRvIHNsaWNlXG4gKi9cbmNvbnN0IHJlYWRQYXJ0ID0gKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBmaWxlKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIGNvbnN0IGJsb2IgPSBmaWxlLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShyLnJlc3VsdCk7XG4gICAgci5vbmVycm9yID0gcmVqZWN0O1xuICAgIHIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBBY2NlcHRzIGI2NHN0cmluZyBvciBibG9iIGZpbGVcbiAqXG4gKiBAYnJvd3NlclxuICogQHBhcmFtIHsqfSBmaWxlT3JTdHJpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEZpbGU+fVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmlsZSA9IChpbnB1dDogSW5wdXRGaWxlLCBzYW5pdGl6ZU9wdGlvbnM/OiBTYW5pdGl6ZU9wdGlvbnMsIG1pbWV0eXBlPzogc3RyaW5nKTogUHJvbWlzZTxGc0ZpbGU+ID0+IHtcbiAgbGV0IGZpbGVuYW1lO1xuICBsZXQgZmlsZTogQmxvYjtcblxuICBpZiAoaXNGaWxlTmFtZWQoaW5wdXQpKSB7XG4gICAgZmlsZW5hbWUgPSBpbnB1dC5uYW1lO1xuICAgIGlucHV0ID0gaW5wdXQuZmlsZTtcbiAgfVxuXG4gIGlmIChpc0ZpbGVCcm93c2VyKGlucHV0KSkge1xuICAgIGZpbGUgPSBpbnB1dDtcbiAgICBmaWxlbmFtZSA9IGlucHV0Lm5hbWU7XG4gIH0gZWxzZSBpZiAoaXNGaWxlQmFzZShpbnB1dCkpIHtcbiAgICBmaWxlID0gYjY0dG9CbG9iKGlucHV0KTtcbiAgfSBlbHNlIGlmIChpc0ZpbGVCbG9iKGlucHV0KSkge1xuICAgIGZpbGUgPSBpbnB1dDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEZpbGVzdGFja0Vycm9yKCdVbnN1cHBvcnRlZCBpbnB1dCBmaWxlIHR5cGUnKSk7XG4gIH1cblxuICByZXR1cm4gcmVhZEZpbGUoZmlsZSkudGhlbihcbiAgICBhc3luYyByZXMgPT4ge1xuICAgICAgbGV0IG1pbWUgPSBmaWxlLnR5cGU7XG4gICAgICBsZXQgbWluaW11bUJ5dGVzID0gNDEwMDtcbiAgICAgIGlmICghZmlsZS50eXBlICB8fCBmaWxlLnR5cGUubGVuZ3RoID09PSAwIHx8IGZpbGUudHlwZSA9PT0gJ3RleHQvcGxhaW4nKSB7XG4gICAgICAgIG1pbWUgPSBhd2FpdCBnZXRNaW1ldHlwZShhd2FpdCByZXMuc2xpY2UoMCwgbWluaW11bUJ5dGVzKSwgZmlsZW5hbWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEZzRmlsZShcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICB0eXBlOiBtaW1ldHlwZSB8fCBtaW1lLFxuICAgICAgICAgIHNsaWNlOiByZXMuc2xpY2UsXG4gICAgICAgICAgcmVsZWFzZTogcmVzLnJlbGVhc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHNhbml0aXplT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICk7XG59O1xuIl19