integratedhub/static/fetch_sw.js

86 lines
2.6 KiB
JavaScript

const CACHE_NAME = "page-cache";
// JavaScript equivalent of TypeScript hashText function
async function hashText(text) {
const encoder = new TextEncoder();
const data = encoder.encode(text);
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join(
"",
);
return hashHex;
}
// Listen for postMessage to prefetch-and-cache any specified URL
self.addEventListener("message", async (event) => {
const data = event.data;
if (data && data.type === "prefetch" && data.url) {
let prefectchSuccess = false;
const cache = await caches.open(CACHE_NAME);
const cachedResponse = await cache.match(data.url);
if (cachedResponse) {
const originalUrl = new URL(cachedResponse.url);
const data1Url = originalUrl.toString().replace(
"portal.cyberhybridhub.com",
"data1.cyberhybridhub.com",
);
const checkData1Url = new URL(data1Url);
checkData1Url.searchParams.set("naunce", await hashText(data.naunce));
const checkRequest = new Request(checkData1Url, {
method: cachedResponse.method,
headers: cachedResponse.headers,
credentials: "include",
body: cachedResponse.body,
});
const checkResponse = await fetch(checkRequest);
if (checkResponse.ok) {
const cloneResponse = checkResponse.clone();
const cloneText = await cloneResponse.text();
if (cloneText && cloneText.length > 0) {
await cache.put(data.url, checkResponse);
}
prefectchSuccess = true;
} else {
console.warn(
`[Prefetch] Failed to fetch from data1: ${response.status} ${response.statusText}`,
);
}
} else {
const networkResponse = await fetch(event.request, {
credentials: "include",
});
if (networkResponse.ok) {
prefectchSuccess = true;
await cache.put(event.request, networkResponse);
}
}
if (prefectchSuccess) {
const clients = await self.clients.matchAll();
clients.forEach((client) =>
client.postMessage({ type: "prefetch-complete", url: data.url })
);
} else {
const clients = await self.clients.matchAll();
clients.forEach((client) =>
client.postMessage({
type: "prefetch-failed",
url: data.url,
error: "Failed to fetch from data1",
})
);
}
}
});
self.addEventListener("fetch", (event) => {
event.respondWith(fetch(event.request));
});