@r3l/app
Version:
341 lines (273 loc) • 11 kB
JavaScript
;
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