UNPKG

@r3l/app

Version:
341 lines (273 loc) 11 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.uploadFile = uploadFile; exports.getBase64ImageFromUrl = getBase64ImageFromUrl; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _env = require("./env"); var _reactNativeWeb = require("react-native-web"); var _multihash = require("./multihash"); var _storage = require("./storage"); var RNFetchBlob; if (process.env.WEB !== 'true' && _reactNativeWeb.Platform.OS !== 'ios') { // eslint-disable-next-line @typescript-eslint/no-var-requires RNFetchBlob = require('rn-fetch-blob').default; } function uploadFile(_x, _x2, _x3) { return _uploadFile.apply(this, arguments); } function _uploadFile() { _uploadFile = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(imgData, fileType, uri) { var signedPutUrl, _yield$processFile, _yield$processFile2, file, name, token, res, signedRequest; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: signedPutUrl = _env.API_URL + '/api/s3/sign'; _context2.next = 3; return processFile(imgData, fileType, uri); case 3: _yield$processFile = _context2.sent; _yield$processFile2 = (0, _slicedToArray2.default)(_yield$processFile, 2); file = _yield$processFile2[0]; name = _yield$processFile2[1]; _context2.next = 9; return (0, _storage.getToken)(); case 9: token = _context2.sent; _context2.next = 12; return fetch(signedPutUrl + "?file_name=".concat(name), { credentials: 'include', method: 'GET', headers: { Authorization: "Bearer ".concat(token) } }); case 12: res = _context2.sent; _context2.next = 15; return res.json(); case 15: signedRequest = _context2.sent; if (signedRequest) { _context2.next = 18; break; } throw new Error('Could not get sigend image upload request.'); case 18: _context2.next = 20; return uploadToS3(file, signedRequest); case 20: return _context2.abrupt("return", _context2.sent); case 21: case "end": return _context2.stop(); } } }, _callee2); })); return _uploadFile.apply(this, arguments); } function uploadToS3(_x4, _x5) { return _uploadToS.apply(this, arguments); } function _uploadToS() { _uploadToS = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(file, signedRequest) { var S3_BUCKET, fields, url, form, options, res; return _regenerator.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.prev = 0; if (_reactNativeWeb.Platform.OS === 'android') RNFetchBlob.session('uploads').dispose(); S3_BUCKET = signedRequest.S3_BUCKET, fields = signedRequest.fields, url = signedRequest.url; form = new FormData(); form.append('Content-Type', file.type); Object.entries(fields).forEach(function (_ref2) { var _ref3 = (0, _slicedToArray2.default)(_ref2, 2), k = _ref3[0], v = _ref3[1]; form.append(k, v); }); form.append('file', file); options = { method: 'POST', Accept: 'application/json, application/xml, text/plain, text/html, *.*', 'Content-Type': 'multipart/form-data', body: form }; _context3.next = 10; return fetch(url, options); case 10: res = _context3.sent; if (res.ok) { _context3.next = 13; break; } throw new Error("".concat(res.status, ": ").concat(res.statusText)); case 13: return _context3.abrupt("return", "https://".concat(S3_BUCKET, ".s3.amazonaws.com/").concat(fields.Key)); case 16: _context3.prev = 16; _context3.t0 = _context3["catch"](0); if (_reactNativeWeb.Platform.OS === 'android') RNFetchBlob.session('uploads').dispose(); throw _context3.t0; case 20: case "end": return _context3.stop(); } } }, _callee3, null, [[0, 16]]); })); return _uploadToS.apply(this, arguments); } var processFile = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(uri, type, localUri) { var res, _type$split, fileBuffer, hash, name, file, _type$split2, _dataURItoBlob, _dataURItoBlob2, _file, _fileBuffer, _hash, _name, _file2, _hash2, _type, _name2, _file3; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(_reactNativeWeb.Platform.OS === 'android' && typeof localUri === 'string' && (localUri.match('http://') || localUri.match('https://')))) { _context.next = 5; break; } _context.next = 3; return RNFetchBlob.config({ fileCache: true, session: 'uploads' }).fetch('GET', localUri); case 3: res = _context.sent; localUri = 'file://' + res.path(); case 5: if (!(uri instanceof ArrayBuffer)) { _context.next = 15; break; } fileBuffer = Buffer.from(uri); _context.next = 9; return (0, _multihash.getHash)(fileBuffer); case 9: hash = _context.sent; name = "".concat(hash, ".").concat((type === null || type === void 0 ? void 0 : (_type$split = type.split('/')) === null || _type$split === void 0 ? void 0 : _type$split[1]) || ''); file = new Blob([uri], { type: type }); return _context.abrupt("return", [file, name]); case 15: if (!isDataURL(uri)) { _context.next = 23; break; } _dataURItoBlob = dataURItoBlob(uri), _dataURItoBlob2 = (0, _slicedToArray2.default)(_dataURItoBlob, 2), _file = _dataURItoBlob2[0], _fileBuffer = _dataURItoBlob2[1]; _context.next = 19; return (0, _multihash.getHash)(_fileBuffer); case 19: _hash = _context.sent; _name = "".concat(_hash, ".").concat((type === null || type === void 0 ? void 0 : (_type$split2 = type.split('/')) === null || _type$split2 === void 0 ? void 0 : _type$split2[1]) || ''); // This allows uploads from react-native // otherwise blog doesn't work so well _file2 = localUri ? { uri: localUri, name: _name, type: type } : _file; return _context.abrupt("return", [_file2, _name]); case 23: if (!(typeof uri === 'string')) { _context.next = 31; break; } _context.next = 26; return (0, _multihash.getHash)(Buffer.from(uri, 'utf8')); case 26: _hash2 = _context.sent; _type = ext(uri); _name2 = _hash2 + '.' + _type; _file3 = { uri: uri, name: _name2, type: 'image/' + _type }; return _context.abrupt("return", [_file3, _name2]); case 31: throw new Error('Error processing file'); case 32: case "end": return _context.stop(); } } }, _callee); })); return function processFile(_x6, _x7, _x8) { return _ref.apply(this, arguments); }; }(); function dataURItoBlob(dataURI) { // convert base64/URLEncoded data component to raw binary data held in a string var byteString; if (dataURI.split(',')[0].indexOf('base64') >= 0) { byteString = atob(dataURI.split(',')[1]); } else { byteString = unescape(dataURI.split(',')[1]); } // separate out the mime component var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to a typed array var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } var fileBuffer = Buffer.from(byteString); var file = new Blob([ia], { type: mimeString }); return [file, fileBuffer]; } // eslint-disable-next-line var DATA_URL_REGEX = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i; function isDataURL(s) { return (s === null || s === void 0 ? void 0 : s.match) && s.match(DATA_URL_REGEX); } function ext(url) { return (url = url.substr(1 + url.lastIndexOf('/')).split('?')[0]).split('#')[0].substr(url.lastIndexOf('.') + 1); } function getBase64ImageFromUrl(_x9) { return _getBase64ImageFromUrl.apply(this, arguments); } function _getBase64ImageFromUrl() { _getBase64ImageFromUrl = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(imageUrl) { var res, blob; return _regenerator.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return fetch(imageUrl); case 2: res = _context4.sent; _context4.next = 5; return res.blob(); case 5: blob = _context4.sent; return _context4.abrupt("return", new Promise(function (resolve, reject) { var reader = new FileReader(); reader.onload = function () { return resolve(reader.result); }; reader.onerror = function (err) { return reject(err); }; reader.readAsDataURL(blob); })); case 7: case "end": return _context4.stop(); } } }, _callee4); })); return _getBase64ImageFromUrl.apply(this, arguments); } //# sourceMappingURL=s3.js.map