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
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");
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