I'm using service worker as a proxy, and it throws TypeError: Failed to fetch randomly and in a strange way.
Sometimes, const formData = await request.formData(); fails and throws TypeError: Failed to fetch.
I store the file in FormData and await request.formData() work just fine for most of the cases. But, if it fails for specific file one time, it will fail for all the next times, only for this specific file. The rest files would work(except this rare case occurs for them).
I would appreciate any idea what could be possibly wrong, is it a Service worker bug, or maybe there a specific set of conditions that could potentially cause this behaviour.
async function handleUploadFileRequest(request) {
const formData = await request.formData();
const file = formData.get('file');
const response = await fetch(`${endpoint}/api/v2/uploads.json?filename=${file.name}`, {
method: 'POST',
headers: {
'Content-Type': 'application/binary'
},
body: file,
});
return response.clone();
}
self.addEventListener('fetch', (event) => {
if (!token || !endpoint) {
const params = new URL(location).searchParams;
endpoint = params.get('endpoint');
token = params.get('token');
}
const handleRequest = async () => {
try {
const { request } = event;
if (request.method === 'POST') {
const isUploadFileRequest = request.url.includes('/request_uploads');
const isSubmitFormRequest = request.url.includes('/request');
if (isUploadFileRequest) {
return handleUploadFileRequest(request);
}
if (isSubmitFormRequest) {
return handleSubmitRequest(request);
}
}
if (request.method === 'DELETE') {
const isDeleteFileRequest = request.url.includes('/requests/new');
if (isDeleteFileRequest) {
return new Response(true, { status: 200 });
}
}
if (request.method === 'GET') {
const isSuggestionsRequest = request.url.includes('/suggestions');
if (isSuggestionsRequest) {
const url = request.url;
const newUrl = `${url}&jwt=${token}`;
const newRequest = new Request(newUrl, request);
const response = await fetch(newRequest);
return new Response(await response.text(), {
status: response.status,
headers: { 'content-type': 'application/json' }
});
}
const isAnswerBotRequest = request.url.includes('/answerBot.js');
if (isAnswerBotRequest) {
return new Response('var answerBot = { init: (locale) => {}};', { status: 200 });
}
}
return fetch(request);
} catch (error) {
return fetch(request);
}
};
event.respondWith(handleRequest());
});