@canlooks/ajax
Version:
A private tool
114 lines (113 loc) • 2.71 kB
JavaScript
export 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
*/
export 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
*/
export 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)
};
});
}
export 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;
}
if (/^([a-z]+:)?\/\//i.test(next)) {
return next;
}
prev = prev.replace(/\/+$/, '');
next = next.replace(/^\/+/, '');
return `${prev}/${next}`;
}
export function mergeParams(prev, next) {
const params = new URLSearchParams(prev);
if (!(next instanceof URLSearchParams)) {
next = new URLSearchParams(next);
}
if (!prev) {
return next;
}
if (!next) {
return params;
}
for (const [name, value] of next) {
params.set(name, value);
}
return params;
}
export function mergeHeaders(prev, next) {
const headers = new Headers(prev);
if (!(next instanceof Headers)) {
next = new Headers(next);
}
if (!prev) {
return next;
}
if (!next) {
return headers;
}
for (const [name, value] of next) {
headers.set(name, value);
}
return headers;
}
export 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;
}