filestack-js
Version:
Official JavaScript library for Filestack
187 lines (185 loc) • 17.9 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFile = void 0;
var tslib_1 = require("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.
*/
var file_1 = require("./file");
var utils_1 = require("./../../utils");
var filestack_error_1 = require("./../../../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 tslib_1.__awaiter(void 0, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
/* istanbul ignore next */
if (!File || !FileReader || !Blob) {
return [2 /*return*/, Promise.reject(new filestack_error_1.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>}
*/
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 filestack_error_1.FilestackError('Unsupported input file type'));
}
return readFile(file).then(function (res) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var mime, minimumBytes, _a;
return tslib_1.__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 = utils_1.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 file_1.File({
name: filename,
size: file.size,
type: mime,
slice: res.slice,
release: res.release,
}, sanitizeOptions)];
}
});
}); });
};
exports.getFile = getFile;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLmJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILCtCQUF3QztBQUN4Qyx1Q0FBNkQ7QUFDN0QsOERBQTREO0FBVTVELElBQU0sWUFBWSxHQUFHLDhDQUE4QyxDQUFDO0FBRXBFOzs7R0FHRztBQUNILElBQU0sVUFBVSxHQUFHLFVBQUMsS0FBZ0IsSUFBb0IsT0FBQSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssZUFBZSxFQUFwQyxDQUFvQyxDQUFDO0FBRTdGOzs7OztHQUtHO0FBQ0gsSUFBTSxhQUFhLEdBQUcsVUFBQyxLQUFnQixJQUFvQixPQUFBLEtBQUssWUFBWSxJQUFJLEVBQXJCLENBQXFCLENBQUM7QUFFakY7Ozs7R0FJRztBQUNILElBQU0sVUFBVSxHQUFHLFVBQUMsS0FBZ0I7SUFDbEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUNoQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUN6QztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7S0FDcEM7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLDBCQUEwQjtRQUMxQixPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILElBQU0sV0FBVyxHQUFHLFVBQUMsS0FBZ0IsSUFBOEIsT0FBQSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBdkMsQ0FBdUMsQ0FB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LElBQUksV0FBTSxDQUNmO3dCQUNFLElBQUksRUFBRSxRQUFRO3dCQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDZixJQUFJLEVBQUUsSUFBSTt3QkFDVixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7d0JBQ2hCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztxQkFDckIsRUFDRCxlQUFlLENBQ2hCLEVBQUM7OztTQUNILENBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQztBQXhDVyxRQUFBLE9BQU8sV0F3Q2xCIiwiZmlsZSI6ImxpYi9hcGkvdXBsb2FkL2ZpbGVfdG9vbHMuYnJvd3Nlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBGaWxlIGFzIEZzRmlsZSB9IGZyb20gJy4vZmlsZSc7XG5pbXBvcnQgeyBTYW5pdGl6ZU9wdGlvbnMsIGdldE1pbWV0eXBlIH0gZnJvbSAnLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBGaWxlc3RhY2tFcnJvciB9IGZyb20gJy4vLi4vLi4vLi4vZmlsZXN0YWNrX2Vycm9yJztcblxuZXhwb3J0IHR5cGUgUmF3RmlsZSA9IEJsb2IgfCBCdWZmZXIgfCBGaWxlIHwgc3RyaW5nO1xuZXhwb3J0IHR5cGUgTmFtZWRJbnB1dEZpbGUgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGZpbGU6IFJhd0ZpbGU7XG59O1xuXG50eXBlIElucHV0RmlsZSA9IFJhd0ZpbGUgfCBOYW1lZElucHV0RmlsZTtcblxuY29uc3QgYmFzZTY0UmVnZXhwID0gL2RhdGE6KFthLXpBLVpdKlxcL1thLXpBLVpdKik7YmFzZTY0LChbXlxcXCJdKikvaTtcblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIGlzIGJsb2JcbiAqIEBwYXJhbSBpbnB1dFxuICovXG5jb25zdCBpc0ZpbGVCbG9iID0gKGlucHV0OiBJbnB1dEZpbGUpOiBpbnB1dCBpcyBCbG9iID0+IGlucHV0LnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IEJsb2JdJztcblxuLyoqXG4gKiBDaGVjayBpZiBpbnB1dCBpcyBpbnN0YW5jZSBvZiBicm93c2VyIGZpbGVcbiAqXG4gKiBAYnJvd3NlclxuICogQHBhcmFtIGlucHV0XG4gKi9cbmNvbnN0IGlzRmlsZUJyb3dzZXIgPSAoaW5wdXQ6IElucHV0RmlsZSk6IGlucHV0IGlzIEZpbGUgPT4gaW5wdXQgaW5zdGFuY2VvZiBGaWxlO1xuXG4vKipcbiAqIENoZWNrIGlmIGZpbGUgaXMgYmFzZTY0IHN0cmluZ1xuICpcbiAqIEBwYXJhbSBpbnB1dFxuICovXG5jb25zdCBpc0ZpbGVCYXNlID0gKGlucHV0OiBJbnB1dEZpbGUpOiBpbnB1dCBpcyBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpbnB1dC5pbmRleE9mKCdiYXNlNjQnKSA+IC0xKSB7XG4gICAgaW5wdXQgPSBpbnB1dC5tYXRjaChiYXNlNjRSZWdleHApLnBvcCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYnRvYShhdG9iKGlucHV0KSkgPT09IGlucHV0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIGlzIGluc3RhbmNlIG9mIG5hbWVkIGludGVyZmFjZVxuICpcbiAqIEBwYXJhbSBpbnB1dFxuICovXG5jb25zdCBpc0ZpbGVOYW1lZCA9IChpbnB1dDogSW5wdXRGaWxlKTogaW5wdXQgaXMgTmFtZWRJbnB1dEZpbGUgPT4gaW5wdXQgJiYgaW5wdXRbJ2ZpbGUnXSAmJiBpbnB1dFsnbmFtZSddO1xuXG4vKipcbiAqIENvbnZlcnQgZW5jb2RlZCBiYXNlNjQgc3RyaW5nIG9yIGRhdGFVUkkgdG8gYmxvYlxuICpcbiAqIEBicm93c2VyXG4gKiBAcGFyYW0gYjY0ZGF0YSAgICAgU3RyaW5nIHRvIGRlY29kZVxuICogQHBhcmFtIHNsaWNlU2l6ZSAgIEJ5dGUgcXVhbnRpdHkgdG8gc3BsaXQgZGF0YSBpbnRvXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge0Jsb2J9XG4gKi9cbmNvbnN0IGI2NHRvQmxvYiA9IChiNjREYXRhOiBzdHJpbmcsIHNsaWNlU2l6ZSA9IDUxMik6IEJsb2IgPT4ge1xuICBsZXQgY29udGVudFR5cGUgPSAnJztcblxuICBpZiAoYjY0RGF0YS5pbmRleE9mKCdiYXNlNjQnKSA+IC0xKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGI2NERhdGEubWF0Y2goYmFzZTY0UmVnZXhwKTtcbiAgICBiNjREYXRhID0gbWF0Y2hlcy5wb3AoKTtcbiAgICBjb250ZW50VHlwZSA9IG1hdGNoZXNbMV07XG4gIH1cblxuICBjb25zdCBieXRlQ2hhcmFjdGVycyA9IGF0b2IoYjY0RGF0YSk7XG4gIGNvbnN0IGJ5dGVBcnJheXM6IGFueVtdID0gW107XG5cbiAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBvZmZzZXQgKz0gc2xpY2VTaXplKSB7XG4gICAgY29uc3Qgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoc2xpY2UubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgYnl0ZUFycmF5cy5wdXNoKG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEJsb2IoYnl0ZUFycmF5cywgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcbn07XG5cbi8qKlxuICogUmVhZCBmaWxlIGFzIGFycmF5IGJ1ZmZlclxuICpcbiAqIEBicm93c2VyXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGJsb2JcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5jb25zdCByZWFkRmlsZSA9IGFzeW5jIChmaWxlKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFGaWxlIHx8ICFGaWxlUmVhZGVyIHx8ICFCbG9iKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBGaWxlc3RhY2tFcnJvcignVGhlIEZpbGUgQVBJcyBhcmUgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXInKSk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICBzbGljZTogZnVuY3Rpb24oc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiByZWFkUGFydChzdGFydCwgZW5kLCBmaWxlKTtcbiAgICB9LFxuICAgIHJlbGVhc2U6ICgpID0+IHtcbiAgICAgIGZpbGUgPSBudWxsO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZWFkIGZpbGUgcGFyIGluc3RlYWQgb2Ygd2hvbGUgZmlsZSB0byBhdm9pZCBicm93c2VyIGNyYXNoaW5nXG4gKlxuICogQHBhcmFtIHN0YXJ0IC0gc3RhciBieXRlXG4gKiBAcGFyYW0gZW5kICAtIGVuZCBieXRlXG4gKiBAcGFyYW0gZmlsZSAtIGZpbGUgdG8gc2xpY2VcbiAqL1xuY29uc3QgcmVhZFBhcnQgPSAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGZpbGUpOiBQcm9taXNlPGFueT4gPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgY29uc3QgYmxvYiA9IGZpbGUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHIucmVzdWx0KTtcbiAgICByLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEFjY2VwdHMgYjY0c3RyaW5nIG9yIGJsb2IgZmlsZVxuICpcbiAqIEBicm93c2VyXG4gKiBAcGFyYW0geyp9IGZpbGVPclN0cmluZ1xuICogQHJldHVybnMge1Byb21pc2U8RmlsZT59XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWxlID0gKGlucHV0OiBJbnB1dEZpbGUsIHNhbml0aXplT3B0aW9ucz86IFNhbml0aXplT3B0aW9ucyk6IFByb21pc2U8RnNGaWxlPiA9PiB7XG4gIGxldCBmaWxlbmFtZTtcbiAgbGV0IGZpbGU6IEJsb2I7XG5cbiAgaWYgKGlzRmlsZU5hbWVkKGlucHV0KSkge1xuICAgIGZpbGVuYW1lID0gaW5wdXQubmFtZTtcbiAgICBpbnB1dCA9IGlucHV0LmZpbGU7XG4gIH1cblxuICBpZiAoaXNGaWxlQnJvd3NlcihpbnB1dCkpIHtcbiAgICBmaWxlID0gaW5wdXQ7XG4gICAgZmlsZW5hbWUgPSBpbnB1dC5uYW1lO1xuICB9IGVsc2UgaWYgKGlzRmlsZUJhc2UoaW5wdXQpKSB7XG4gICAgZmlsZSA9IGI2NHRvQmxvYihpbnB1dCk7XG4gIH0gZWxzZSBpZiAoaXNGaWxlQmxvYihpbnB1dCkpIHtcbiAgICBmaWxlID0gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBGaWxlc3RhY2tFcnJvcignVW5zdXBwb3J0ZWQgaW5wdXQgZmlsZSB0eXBlJykpO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRGaWxlKGZpbGUpLnRoZW4oXG4gICAgYXN5bmMgcmVzID0+IHtcbiAgICAgIGxldCBtaW1lID0gZmlsZS50eXBlO1xuICAgICAgbGV0IG1pbmltdW1CeXRlcyA9IDQxMDA7XG4gICAgICBpZiAoIWZpbGUudHlwZSAgfHwgZmlsZS50eXBlLmxlbmd0aCA9PT0gMCB8fCBmaWxlLnR5cGUgPT09ICd0ZXh0L3BsYWluJykge1xuICAgICAgICBtaW1lID0gYXdhaXQgZ2V0TWltZXR5cGUoYXdhaXQgcmVzLnNsaWNlKDAsIG1pbmltdW1CeXRlcyksIGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBGc0ZpbGUoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgdHlwZTogbWltZSxcbiAgICAgICAgICBzbGljZTogcmVzLnNsaWNlLFxuICAgICAgICAgIHJlbGVhc2U6IHJlcy5yZWxlYXNlLFxuICAgICAgICB9LFxuICAgICAgICBzYW5pdGl6ZU9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICApO1xufTtcbiJdfQ==
;