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
JavaScript
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