@canlooks/ajax
Version:
125 lines (124 loc) • 3.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.bodyTransform = bodyTransform;
exports.findBodyFiles = findBodyFiles;
exports.mergeConfig = mergeConfig;
exports.mergeUrl = mergeUrl;
exports.mergeParams = mergeParams;
exports.mergeHeaders = mergeHeaders;
exports.mergeAbortSignal = mergeAbortSignal;
exports.catchCommonError = catchCommonError;
const error_1 = require("./error");
function bodyTransform(body) {
if (typeof body === 'object') {
if (!(body instanceof ReadableStream)
&& !(body instanceof Blob)
&& !(body instanceof ArrayBuffer)
&& !(body instanceof FormData)
&& !(body instanceof URLSearchParams)) {
try {
return JSON.stringify(body);
}
catch (e) {
}
}
}
return body;
}
/**
* 查找请求体中的Blob对象
* @param body
*/
function findBodyFiles(body) {
if (body instanceof Blob) {
return body;
}
if (typeof body === 'object' && body !== null) {
for (const k in body) {
const file = findBodyFiles(body[k]);
if (file) {
return file;
}
}
}
return;
}
/**
* 合并配置
* @param config
*/
function mergeConfig(...config) {
return config.reduce((prev, next) => {
return {
...prev,
...next,
url: mergeUrl(prev?.url, next?.url),
params: mergeParams(prev?.params, next?.params),
headers: mergeHeaders(prev?.headers, next?.headers),
signal: mergeAbortSignal(prev?.signal, next?.signal)
};
});
}
function mergeUrl(prev, next) {
if (prev instanceof URL) {
prev = prev.href;
}
if (next instanceof URL) {
next = next.href;
}
if (!prev) {
return next;
}
if (!next) {
return prev;
}
// next开头带协议,则抛弃prev,直接使用next
if (/^([a-z]+:)?\/\//i.test(next)) {
return next;
}
// prev去掉末尾的'/',next去掉开头的'/'
prev = prev.replace(/\/+$/, '');
next = next.replace(/^\/+/, '');
return `${prev}/${next}`;
}
function mergeParams(prev, next) {
return mergeParamsOrHeaders(URLSearchParams, prev, next);
}
function mergeHeaders(prev, next) {
return mergeParamsOrHeaders(Headers, prev, next);
}
function mergeParamsOrHeaders(objectClass, prev, next) {
// prev无论如何都要new,避免直接修改prev
const obj = new objectClass(prev);
if (!next) {
return obj;
}
if (!(next instanceof objectClass)) {
next = new objectClass(next);
}
if (!prev) {
return next;
}
for (const [name, value] of next) {
obj.set(name, value);
}
return obj;
}
function mergeAbortSignal(prev, next) {
if (!prev) {
return next;
}
if (!next) {
return prev;
}
const abortController = new AbortController();
prev.onabort = next.onabort = () => abortController.abort();
return abortController.signal;
}
function catchCommonError(e, newError) {
return e instanceof error_1.AjaxError
? e
: newError(e instanceof Error ? e.message
: 'toString' in e ? e.toString()
: void 0);
}