UNPKG

stream-chat-react-native-core

Version:

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

213 lines 7.17 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"); 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 rawHeaders = headers?.toJSON() ?? {}; var normalizedHeaders = {}; Object.entries(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 _ref of entries) { 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 cap = toFiniteNumber(config.uploadProgressOptions?.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 normalizedBytes = toFiniteNumber(bytes) ?? 0; var normalizedLoaded = toFiniteNumber(loaded) ?? 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 uploadProgressCallbacks = getUploadProgressCallbacks(config); var completionProgressCap = getCompletionProgressCap(config); var lastLoaded = 0; var response = yield _native.NativeHandlers.multipartUpload({ ...request, onProgress: uploadProgressCallbacks.length ? ({ loaded, total }) => { var normalizedLoaded = toFiniteNumber(loaded) ?? 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 ?? {}, request: null, status: response.status, statusText: 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