UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

222 lines 8.92 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.wrapAxiosAdapterWithNativeMultipart = exports.installNativeMultipartAdapter = void 0; var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _axios = _interopRequireDefault(require("axios")); var _native = require("../native"); function _createForOfIteratorHelperLoose(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (t) return (t = t.call(r)).next.bind(t); if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var o = 0; return function () { return o >= r.length ? { done: !0 } : { done: !1, value: r[o++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var DEFAULT_COMPLETION_PROGRESS_CAP = 90; var installedAdapters = new WeakSet(); var getFormDataEntries = data => { if (!data || typeof data !== 'object') { return null; } if ('entries' in data && typeof data.entries === 'function') { return Array.from(data.entries()); } var parts = Reflect.get(data, '_parts'); if (Array.isArray(parts)) { return parts; } return null; }; var normalizeHeaders = headers => { var _headers$toJSON; var rawHeaders = (_headers$toJSON = headers == null ? void 0 : headers.toJSON()) != null ? _headers$toJSON : {}; var normalizedHeaders = {}; Object.entries(rawHeaders != null ? rawHeaders : {}).forEach(([key, value]) => { if (value == null) { return; } normalizedHeaders[key] = Array.isArray(value) ? value.join(', ') : String(value); }); return normalizedHeaders; }; var getFileNameFromUri = uri => uri.split('/').filter(Boolean).pop() || 'file'; var getNativeProgressOptions = progress => { if (!progress) { return undefined; } var nativeProgressOptions = { ...progress }; delete nativeProgressOptions.completionProgressCap; return Object.keys(nativeProgressOptions).length ? nativeProgressOptions : undefined; }; var createNativeMultipartRequest = (client, config) => { var entries = getFormDataEntries(config.data); if (!entries) { return null; } var parts = []; for (var _iterator = _createForOfIteratorHelperLoose(entries), _step; !(_step = _iterator()).done;) { var _ref = _step.value; var _ref2 = (0, _slicedToArray2.default)(_ref, 2); var fieldName = _ref2[0]; var value = _ref2[1]; if (typeof value === 'string') { parts.push({ fieldName, kind: 'text', value }); continue; } if (value && typeof value === 'object' && 'uri' in value && typeof value.uri === 'string') { parts.push({ fieldName, fileName: value.name || getFileNameFromUri(value.uri), kind: 'file', mimeType: value.type || value.contentType, uri: value.uri }); continue; } return null; } if (!parts.some(part => part.kind === 'file')) { return null; } return { headers: normalizeHeaders(config.headers), method: (config.method || 'POST').toUpperCase(), parts, progress: getNativeProgressOptions(config.uploadProgressOptions), signal: config.signal, timeoutMs: config.timeout, url: client.axiosInstance.getUri(config) }; }; var toFiniteNumber = value => { if (typeof value === 'number') { return Number.isFinite(value) ? value : undefined; } if (typeof value === 'string' && value.trim()) { var parsed = Number(value); return Number.isFinite(parsed) ? parsed : undefined; } return undefined; }; var getCompletionProgressCap = config => { var _config$uploadProgres; var cap = toFiniteNumber((_config$uploadProgres = config.uploadProgressOptions) == null ? void 0 : _config$uploadProgres.completionProgressCap); if (cap === undefined) { return DEFAULT_COMPLETION_PROGRESS_CAP; } return Math.min(100, Math.max(0, cap)); }; var getDisplayLoaded = ({ completionProgressCap, loaded, total }) => { if (typeof total !== 'number' || total <= 0) { return loaded; } return Math.min(loaded, total * (completionProgressCap / 100)); }; var getUploadProgressCallbacks = config => { var callbacks = [config.onUploadProgress, config.uploadProgress].filter(callback => typeof callback === 'function'); return Array.from(new Set(callbacks)); }; var createUploadProgressEvent = ({ bytes, loaded, total }) => { var _toFiniteNumber, _toFiniteNumber2; var normalizedBytes = (_toFiniteNumber = toFiniteNumber(bytes)) != null ? _toFiniteNumber : 0; var normalizedLoaded = (_toFiniteNumber2 = toFiniteNumber(loaded)) != null ? _toFiniteNumber2 : 0; var normalizedTotal = toFiniteNumber(total); return { bytes: normalizedBytes, download: false, event: undefined, lengthComputable: typeof normalizedTotal === 'number' && normalizedTotal > 0, loaded: normalizedLoaded, progress: typeof normalizedTotal === 'number' && normalizedTotal > 0 ? normalizedLoaded / normalizedTotal : undefined, total: normalizedTotal, upload: true }; }; var nativeMultipartAxiosAdapter = function () { var _ref3 = (0, _asyncToGenerator2.default)(function* (request, config) { var _response$headers, _response$statusText; var uploadProgressCallbacks = getUploadProgressCallbacks(config); var completionProgressCap = getCompletionProgressCap(config); var lastLoaded = 0; var response = yield _native.NativeHandlers.multipartUpload({ ...request, onProgress: uploadProgressCallbacks.length ? ({ loaded, total }) => { var _toFiniteNumber3; var normalizedLoaded = (_toFiniteNumber3 = toFiniteNumber(loaded)) != null ? _toFiniteNumber3 : 0; var normalizedTotal = toFiniteNumber(total); var displayLoaded = getDisplayLoaded({ completionProgressCap, loaded: normalizedLoaded, total: normalizedTotal }); var event = createUploadProgressEvent({ bytes: Math.max(0, displayLoaded - lastLoaded), loaded: displayLoaded, total: normalizedTotal }); lastLoaded = displayLoaded; uploadProgressCallbacks.forEach(callback => callback(event)); } : undefined }); if (!response) { throw new Error('Native multipart upload did not return a response'); } return { config, data: response.body, headers: (_response$headers = response.headers) != null ? _response$headers : {}, request: null, status: response.status, statusText: (_response$statusText = response.statusText) != null ? _response$statusText : '' }; }); return function nativeMultipartAxiosAdapter(_x, _x2) { return _ref3.apply(this, arguments); }; }(); var resolveAxiosAdapter = adapter => _axios.default.getAdapter(adapter); var createNativeMultipartAwareAdapter = (client, fallbackAdapter) => { var resolvedFallbackAdapter = resolveAxiosAdapter(fallbackAdapter); return config => { var nativeMultipartRequest = createNativeMultipartRequest(client, config); if (!nativeMultipartRequest) { return resolvedFallbackAdapter(config); } return nativeMultipartAxiosAdapter(nativeMultipartRequest, config); }; }; var wrapAxiosAdapterWithNativeMultipart = (client, fallbackAdapter) => { if (!(0, _native.isNativeMultipartUploadAvailable)()) { return resolveAxiosAdapter(fallbackAdapter); } return createNativeMultipartAwareAdapter(client, fallbackAdapter); }; exports.wrapAxiosAdapterWithNativeMultipart = wrapAxiosAdapterWithNativeMultipart; var installNativeMultipartAdapter = client => { if (!(0, _native.isNativeMultipartUploadAvailable)()) { return; } if (installedAdapters.has(client)) { return; } var previousAdapter = client.axiosInstance.defaults.adapter; client.axiosInstance.defaults.adapter = wrapAxiosAdapterWithNativeMultipart(client, previousAdapter); installedAdapters.add(client); }; exports.installNativeMultipartAdapter = installNativeMultipartAdapter; //# sourceMappingURL=installNativeMultipartAdapter.js.map