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) { 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: mime, slice: res.slice, release: res.release, }, sanitizeOptions)]; } }); }); }); }; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLmJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3hDLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQVU1RCxJQUFNLFlBQVksR0FBRyw4Q0FBOEMsQ0FBQztBQUVwRTs7O0dBR0c7QUFDSCxJQUFNLFVBQVUsR0FBRyxVQUFDLEtBQWdCLElBQW9CLE9BQUEsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLGVBQWUsRUFBcEMsQ0FBb0MsQ0FBQztBQUU3Rjs7Ozs7R0FLRztBQUNILElBQU0sYUFBYSxHQUFHLFVBQUMsS0FBZ0IsSUFBb0IsT0FBQSxLQUFLLFlBQVksSUFBSSxFQUFyQixDQUFxQixDQUFDO0FBRWpGOzs7O0dBSUc7QUFDSCxJQUFNLFVBQVUsR0FBRyxVQUFDLEtBQWdCO0lBQ2xDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDaEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO0tBQ3BDO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWiwwQkFBMEI7UUFDMUIsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxJQUFNLFdBQVcsR0FB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QUFZLENBQUMsRUFBQTt3QkFBbEQscUJBQU0sa0JBQVksU0FBZ0MsRUFBRSxRQUFRLEVBQUMsRUFBQTs7b0JBQXBFLElBQUksR0FBRyxTQUE2RCxDQUFDOzt3QkFHdkUsc0JBQU8sSUFBSSxNQUFNLENBQ2Y7d0JBQ0UsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNmLElBQUksRUFBRSxJQUFJO3dCQUNWLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSzt3QkFDaEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO3FCQUNyQixFQUNELGVBQWUsQ0FDaEIsRUFBQzs7O1NBQ0gsQ0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6ImxpYi9hcGkvdXBsb2FkL2ZpbGVfdG9vbHMuYnJvd3Nlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBGaWxlIGFzIEZzRmlsZSB9IGZyb20gJy4vZmlsZSc7XG5pbXBvcnQgeyBTYW5pdGl6ZU9wdGlvbnMsIGdldE1pbWV0eXBlIH0gZnJvbSAnLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBGaWxlc3RhY2tFcnJvciB9IGZyb20gJy4vLi4vLi4vLi4vZmlsZXN0YWNrX2Vycm9yJztcblxuZXhwb3J0IHR5cGUgUmF3RmlsZSA9IEJsb2IgfCBCdWZmZXIgfCBGaWxlIHwgc3RyaW5nO1xuZXhwb3J0IHR5cGUgTmFtZWRJbnB1dEZpbGUgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGZpbGU6IFJhd0ZpbGU7XG59O1xuXG50eXBlIElucHV0RmlsZSA9IFJhd0ZpbGUgfCBOYW1lZElucHV0RmlsZTtcblxuY29uc3QgYmFzZTY0UmVnZXhwID0gL2RhdGE6KFthLXpBLVpdKlxcL1thLXpBLVpdKik7YmFzZTY0LChbXlxcXCJdKikvaTtcblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIGlzIGJsb2JcbiAqIEBwYXJhbSBpbnB1dFxuICovXG5jb25zdCBpc0ZpbGVCbG9iID0gKGlucHV0OiBJbnB1dEZpbGUpOiBpbnB1dCBpcyBCbG9iID0+IGlucHV0LnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IEJsb2JdJztcblxuLyoqXG4gKiBDaGVjayBpZiBpbnB1dCBpcyBpbnN0YW5jZSBvZiBicm93c2VyIGZpbGVcbiAqXG4gKiBAYnJvd3NlclxuICogQHBhcmFtIGlucHV0XG4gKi9cbmNvbnN0IGlzRmlsZUJyb3dzZXIgPSAoaW5wdXQ6IElucHV0RmlsZSk6IGlucHV0IGlzIEZpbGUgPT4gaW5wdXQgaW5zdGFuY2VvZiBGaWxlO1xuXG4vKipcbiAqIENoZWNrIGlmIGZpbGUgaXMgYmFzZTY0IHN0cmluZ1xuICpcbiAqIEBwYXJhbSBpbnB1dFxuICovXG5jb25zdCBpc0ZpbGVCYXNlID0gKGlucHV0OiBJbnB1dEZpbGUpOiBpbnB1dCBpcyBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpbnB1dC5pbmRleE9mKCdiYXNlNjQnKSA+IC0xKSB7XG4gICAgaW5wdXQgPSBpbnB1dC5tYXRjaChiYXNlNjRSZWdleHApLnBvcCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYnRvYShhdG9iKGlucHV0KSkgPT09IGlucHV0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIGlzIGluc3RhbmNlIG9mIG5hbWVkIGludGVyZmFjZVxuICpcbiAqIEBwYXJhbSBpbnB1dFxuICovXG5jb25zdCBpc0ZpbGVOYW1lZCA9IChpbnB1dDogSW5wdXRGaWxlKTogaW5wdXQgaXMgTmFtZWRJbnB1dEZpbGUgPT4gaW5wdXQgJiYgaW5wdXRbJ2ZpbGUnXSAmJiBpbnB1dFsnbmFtZSddO1xuXG4vKipcbiAqIENvbnZlcnQgZW5jb2RlZCBiYXNlNjQgc3RyaW5nIG9yIGRhdGFVUkkgdG8gYmxvYlxuICpcbiAqIEBicm93c2VyXG4gKiBAcGFyYW0gYjY0ZGF0YSAgICAgU3RyaW5nIHRvIGRlY29kZVxuICogQHBhcmFtIHNsaWNlU2l6ZSAgIEJ5dGUgcXVhbnRpdHkgdG8gc3BsaXQgZGF0YSBpbnRvXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge0Jsb2J9XG4gKi9cbmNvbnN0IGI2NHRvQmxvYiA9IChiNjREYXRhOiBzdHJpbmcsIHNsaWNlU2l6ZSA9IDUxMik6IEJsb2IgPT4ge1xuICBsZXQgY29udGVudFR5cGUgPSAnJztcblxuICBpZiAoYjY0RGF0YS5pbmRleE9mKCdiYXNlNjQnKSA+IC0xKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGI2NERhdGEubWF0Y2goYmFzZTY0UmVnZXhwKTtcbiAgICBiNjREYXRhID0gbWF0Y2hlcy5wb3AoKTtcbiAgICBjb250ZW50VHlwZSA9IG1hdGNoZXNbMV07XG4gIH1cblxuICBjb25zdCBieXRlQ2hhcmFjdGVycyA9IGF0b2IoYjY0RGF0YSk7XG4gIGNvbnN0IGJ5dGVBcnJheXM6IGFueVtdID0gW107XG5cbiAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBvZmZzZXQgKz0gc2xpY2VTaXplKSB7XG4gICAgY29uc3Qgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoc2xpY2UubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgYnl0ZUFycmF5cy5wdXNoKG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEJsb2IoYnl0ZUFycmF5cywgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcbn07XG5cbi8qKlxuICogUmVhZCBmaWxlIGFzIGFycmF5IGJ1ZmZlclxuICpcbiAqIEBicm93c2VyXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGJsb2JcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5jb25zdCByZWFkRmlsZSA9IGFzeW5jIChmaWxlKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFGaWxlIHx8ICFGaWxlUmVhZGVyIHx8ICFCbG9iKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBGaWxlc3RhY2tFcnJvcignVGhlIEZpbGUgQVBJcyBhcmUgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXInKSk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICBzbGljZTogZnVuY3Rpb24oc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiByZWFkUGFydChzdGFydCwgZW5kLCBmaWxlKTtcbiAgICB9LFxuICAgIHJlbGVhc2U6ICgpID0+IHtcbiAgICAgIGZpbGUgPSBudWxsO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZWFkIGZpbGUgcGFyIGluc3RlYWQgb2Ygd2hvbGUgZmlsZSB0byBhdm9pZCBicm93c2VyIGNyYXNoaW5nXG4gKlxuICogQHBhcmFtIHN0YXJ0IC0gc3RhciBieXRlXG4gKiBAcGFyYW0gZW5kICAtIGVuZCBieXRlXG4gKiBAcGFyYW0gZmlsZSAtIGZpbGUgdG8gc2xpY2VcbiAqL1xuY29uc3QgcmVhZFBhcnQgPSAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGZpbGUpOiBQcm9taXNlPGFueT4gPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgY29uc3QgYmxvYiA9IGZpbGUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHIucmVzdWx0KTtcbiAgICByLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEFjY2VwdHMgYjY0c3RyaW5nIG9yIGJsb2IgZmlsZVxuICpcbiAqIEBicm93c2VyXG4gKiBAcGFyYW0geyp9IGZpbGVPclN0cmluZ1xuICogQHJldHVybnMge1Byb21pc2U8RmlsZT59XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWxlID0gKGlucHV0OiBJbnB1dEZpbGUsIHNhbml0aXplT3B0aW9ucz86IFNhbml0aXplT3B0aW9ucyk6IFByb21pc2U8RnNGaWxlPiA9PiB7XG4gIGxldCBmaWxlbmFtZTtcbiAgbGV0IGZpbGU6IEJsb2I7XG5cbiAgaWYgKGlzRmlsZU5hbWVkKGlucHV0KSkge1xuICAgIGZpbGVuYW1lID0gaW5wdXQubmFtZTtcbiAgICBpbnB1dCA9IGlucHV0LmZpbGU7XG4gIH1cblxuICBpZiAoaXNGaWxlQnJvd3NlcihpbnB1dCkpIHtcbiAgICBmaWxlID0gaW5wdXQ7XG4gICAgZmlsZW5hbWUgPSBpbnB1dC5uYW1lO1xuICB9IGVsc2UgaWYgKGlzRmlsZUJhc2UoaW5wdXQpKSB7XG4gICAgZmlsZSA9IGI2NHRvQmxvYihpbnB1dCk7XG4gIH0gZWxzZSBpZiAoaXNGaWxlQmxvYihpbnB1dCkpIHtcbiAgICBmaWxlID0gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBGaWxlc3RhY2tFcnJvcignVW5zdXBwb3J0ZWQgaW5wdXQgZmlsZSB0eXBlJykpO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRGaWxlKGZpbGUpLnRoZW4oXG4gICAgYXN5bmMgcmVzID0+IHtcbiAgICAgIGxldCBtaW1lID0gZmlsZS50eXBlO1xuICAgICAgbGV0IG1pbmltdW1CeXRlcyA9IDQxMDA7XG4gICAgICBpZiAoIWZpbGUudHlwZSAgfHwgZmlsZS50eXBlLmxlbmd0aCA9PT0gMCB8fCBmaWxlLnR5cGUgPT09ICd0ZXh0L3BsYWluJykge1xuICAgICAgICBtaW1lID0gYXdhaXQgZ2V0TWltZXR5cGUoYXdhaXQgcmVzLnNsaWNlKDAsIG1pbmltdW1CeXRlcyksIGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBGc0ZpbGUoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgdHlwZTogbWltZSxcbiAgICAgICAgICBzbGljZTogcmVzLnNsaWNlLFxuICAgICAgICAgIHJlbGVhc2U6IHJlcy5yZWxlYXNlLFxuICAgICAgICB9LFxuICAgICAgICBzYW5pdGl6ZU9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICApO1xufTtcbiJdfQ==