shell bypass 403
import { sleep } from '@shared/lib/utils';
const MAX_RETRIES = 2;
const RETRY_DELAY = 1000; // 1 second in milliseconds
export const fetchFontFaceFile = async (url) => {
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
try {
// Add delay if this is not the first attempt
if (attempt > 0) await sleep(RETRY_DELAY);
const response = await fetch(url);
if (!response.ok) {
throw new Error('Failed to fetch font file.');
}
const blob = await response.blob();
const filename = url.split('/').pop();
return new File([blob], filename, {
type: blob.type,
});
} catch (_) {
if (attempt <= MAX_RETRIES) continue;
console.error(
`Failed to fetch font file after ${MAX_RETRIES + 1} attempts.`,
);
return;
}
}
};
export function makeFontFamilyFormData({ name, slug, fontFamily }) {
const formData = new FormData();
const fontFamilySettings = { name, slug, fontFamily };
formData.append('font_family_settings', JSON.stringify(fontFamilySettings));
return formData;
}
export function makeFontFaceFormData({
fontFamilySlug,
fontFamily,
fontStyle,
fontWeight,
fontDisplay,
unicodeRange,
src = [],
file = [],
}) {
const formData = new FormData();
const fontFaceSettings = {
fontFamily,
fontStyle,
fontWeight,
fontDisplay,
unicodeRange,
src: Array.isArray(src) ? src : [src],
};
const files = Array.isArray(file) ? file : [file];
// Add each font file to the form data.
files.forEach((file) => {
const fileId = `${fontFamilySlug}-${fontWeight}-${fontStyle}`;
formData.append(fileId, file, file.name);
// Use the file ids as src for WP to match and upload the files.
if (!src?.length) {
fontFaceSettings.src.push(fileId);
} else {
fontFaceSettings.src = [fileId];
}
});
formData.append('font_face_settings', JSON.stringify(fontFaceSettings));
return formData;
}