UNPKG

parse

Version:
414 lines 13.4 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.b64Digit = b64Digit; exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _CoreManager = _interopRequireDefault(require("./CoreManager")); var _ParseError = _interopRequireDefault(require("./ParseError")); function b64Digit(number) { if (number < 26) { return String.fromCharCode(65 + number); } if (number < 52) { return String.fromCharCode(97 + (number - 26)); } if (number < 62) { return String.fromCharCode(48 + (number - 52)); } if (number === 62) { return '+'; } if (number === 63) { return '/'; } throw new TypeError('Tried to encode large digit ' + number + ' in base64.'); } var ParseFile = function () { function ParseFile(name, data, type, metadata, tags) { (0, _classCallCheck2.default)(this, ParseFile); var specifiedType = type || ''; this._name = name; this._metadata = metadata || {}; this._tags = tags || {}; if (data !== undefined) { if (Array.isArray(data) || data instanceof Uint8Array) { this._data = ParseFile.encodeBase64(data); this._source = { format: 'base64', base64: this._data, type: specifiedType }; } else if (typeof Blob !== 'undefined' && data instanceof Blob) { this._source = { format: 'file', file: data, type: specifiedType }; } else if (data && typeof data.uri === 'string' && data.uri !== undefined) { this._source = { format: 'uri', uri: data.uri, type: specifiedType }; } else if (data && typeof data.base64 === 'string') { var base64 = data.base64.split(',').slice(-1)[0]; var dataType = specifiedType || data.base64.split(';').slice(0, 1)[0].split(':').slice(1, 2)[0] || 'text/plain'; this._data = base64; this._source = { format: 'base64', base64: base64, type: dataType }; } else { throw new TypeError('Cannot create a Parse.File with that data.'); } } } return (0, _createClass2.default)(ParseFile, [{ key: "getData", value: function () { var _getData = (0, _asyncToGenerator2.default)(function* (options) { var _this = this; options = options || {}; if (this._data) { return this._data; } if (!this._url) { throw new Error('Cannot retrieve data for unsaved ParseFile.'); } options.requestTask = function (task) { return _this._requestTask = task; }; var controller = _CoreManager.default.getFileController(); var result = yield controller.download(this._url, options); this._data = result.base64; return this._data; }); function getData() { return _getData.apply(this, arguments); } return getData; }() }, { key: "name", value: function () { return this._name; } }, { key: "url", value: function (options) { options = options || {}; if (!this._url) { return; } if (options.forceSecure) { return this._url.replace(/^http:\/\//i, 'https://'); } else { return this._url; } } }, { key: "metadata", value: function () { return this._metadata; } }, { key: "tags", value: function () { return this._tags; } }, { key: "save", value: function (options) { var _this2 = this; options = options || {}; options.requestTask = function (task) { return _this2._requestTask = task; }; options.metadata = this._metadata; options.tags = this._tags; var controller = _CoreManager.default.getFileController(); if (!this._previousSave) { if (this._source.format === 'file') { this._previousSave = controller.saveFile(this._name, this._source, options).then(function (res) { _this2._name = res.name; _this2._url = res.url; _this2._data = null; _this2._requestTask = null; return _this2; }); } else if (this._source.format === 'uri') { this._previousSave = controller.download(this._source.uri, options).then(function (result) { if (!(result && result.base64)) { return {}; } var newSource = { format: 'base64', base64: result.base64, type: result.contentType }; _this2._data = result.base64; _this2._requestTask = null; return controller.saveBase64(_this2._name, newSource, options); }).then(function (res) { _this2._name = res.name; _this2._url = res.url; _this2._requestTask = null; return _this2; }); } else { this._previousSave = controller.saveBase64(this._name, this._source, options).then(function (res) { _this2._name = res.name; _this2._url = res.url; _this2._requestTask = null; return _this2; }); } } if (this._previousSave) { return this._previousSave; } } }, { key: "cancel", value: function () { if (this._requestTask && typeof this._requestTask.abort === 'function') { this._requestTask._aborted = true; this._requestTask.abort(); } this._requestTask = null; } }, { key: "destroy", value: function () { var _this3 = this; var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (!this._name) { throw new _ParseError.default(_ParseError.default.FILE_DELETE_UNNAMED_ERROR, 'Cannot delete an unnamed file.'); } var destroyOptions = { useMasterKey: true }; if (Object.hasOwn(options, 'useMasterKey')) { destroyOptions.useMasterKey = !!options.useMasterKey; } var controller = _CoreManager.default.getFileController(); return controller.deleteFile(this._name, destroyOptions).then(function () { _this3._data = undefined; _this3._requestTask = null; return _this3; }); } }, { key: "toJSON", value: function () { return { __type: 'File', name: this._name, url: this._url }; } }, { key: "equals", value: function (other) { if (this === other) { return true; } return other instanceof ParseFile && this.name() === other.name() && this.url() === other.url() && typeof this.url() !== 'undefined'; } }, { key: "setMetadata", value: function (metadata) { var _this4 = this; if (metadata && typeof metadata === 'object') { Object.keys(metadata).forEach(function (key) { _this4.addMetadata(key, metadata[key]); }); } } }, { key: "addMetadata", value: function (key, value) { if (typeof key === 'string') { this._metadata[key] = value; } } }, { key: "setTags", value: function (tags) { var _this5 = this; if (tags && typeof tags === 'object') { Object.keys(tags).forEach(function (key) { _this5.addTag(key, tags[key]); }); } } }, { key: "addTag", value: function (key, value) { if (typeof key === 'string') { this._tags[key] = value; } } }], [{ key: "fromJSON", value: function (obj) { if (obj.__type !== 'File') { throw new TypeError('JSON object does not represent a ParseFile'); } var file = new ParseFile(obj.name); file._url = obj.url; return file; } }, { key: "encodeBase64", value: function (bytes) { var chunks = []; chunks.length = Math.ceil(bytes.length / 3); for (var i = 0; i < chunks.length; i++) { var b1 = bytes[i * 3]; var b2 = bytes[i * 3 + 1] || 0; var b3 = bytes[i * 3 + 2] || 0; var has2 = i * 3 + 1 < bytes.length; var has3 = i * 3 + 2 < bytes.length; chunks[i] = [b64Digit(b1 >> 2 & 0x3f), b64Digit(b1 << 4 & 0x30 | b2 >> 4 & 0x0f), has2 ? b64Digit(b2 << 2 & 0x3c | b3 >> 6 & 0x03) : '=', has3 ? b64Digit(b3 & 0x3f) : '='].join(''); } return chunks.join(''); } }]); }(); var DefaultController = { saveFile: function () { var _saveFile = (0, _asyncToGenerator2.default)(function* (name, source, options) { if (source.format !== 'file') { throw new Error('saveFile can only be used with File-type sources.'); } var base64Data = yield new Promise(function (res, rej) { var reader = new FileReader(); reader.onload = function () { return res(reader.result); }; reader.onerror = function (error) { return rej(error); }; reader.readAsDataURL(source.file); }); var _base64Data$split = base64Data.split(','), _base64Data$split2 = (0, _slicedToArray2.default)(_base64Data$split, 2), first = _base64Data$split2[0], second = _base64Data$split2[1]; var data = second ? second : first; var newSource = { format: 'base64', base64: data, type: source.type || (source.file ? source.file.type : undefined) }; return yield DefaultController.saveBase64(name, newSource, options); }); function saveFile() { return _saveFile.apply(this, arguments); } return saveFile; }(), saveBase64: function (name, source) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (source.format !== 'base64') { throw new Error('saveBase64 can only be used with Base64-type sources.'); } var data = { base64: source.base64, fileData: { metadata: Object.assign({}, options.metadata), tags: Object.assign({}, options.tags) } }; delete options.metadata; delete options.tags; if (source.type) { data._ContentType = source.type; } return _CoreManager.default.getRESTController().request('POST', 'files/' + name, data, options); }, download: function () { var _download = (0, _asyncToGenerator2.default)(function* (uri, options) { var controller = new AbortController(); options.requestTask(controller); var signal = controller.signal; try { var response = yield fetch(uri, { signal: signal }); var reader = response.body.getReader(); var length = +response.headers.get('Content-Length') || 0; var contentType = response.headers.get('Content-Type'); if (length === 0) { options.progress == null ? void 0 : options.progress(null, null, null); return { base64: '', contentType: contentType }; } var recieved = 0; var chunks = []; while (true) { var _yield$reader$read = yield reader.read(), done = _yield$reader$read.done, value = _yield$reader$read.value; if (done) { break; } chunks.push(value); recieved += (value == null ? void 0 : value.length) || 0; options.progress == null ? void 0 : options.progress(recieved / length, recieved, length); } var body = new Uint8Array(recieved); var offset = 0; for (var chunk of chunks) { body.set(chunk, offset); offset += chunk.length; } return { base64: ParseFile.encodeBase64(body), contentType: contentType }; } catch (error) { if (error.name === 'AbortError') { return {}; } else { throw error; } } }); function download() { return _download.apply(this, arguments); } return download; }(), deleteFile: function (name, options) { var headers = { 'X-Parse-Application-ID': _CoreManager.default.get('APPLICATION_ID') }; if (options.useMasterKey) { headers['X-Parse-Master-Key'] = _CoreManager.default.get('MASTER_KEY'); } var url = _CoreManager.default.get('SERVER_URL'); if (url[url.length - 1] !== '/') { url += '/'; } url += 'files/' + name; return _CoreManager.default.getRESTController().ajax('DELETE', url, '', headers).catch(function (response) { if (!response || response.toString() === 'SyntaxError: Unexpected end of JSON input') { return Promise.resolve(); } else { return _CoreManager.default.getRESTController().handleError(response); } }); } }; _CoreManager.default.setFileController(DefaultController); var _default = exports.default = ParseFile;