2020-05-05 12:16:51 +00:00
|
|
|
import { precacheAndRoute } from "workbox-precaching";
|
|
|
|
|
import { clientsClaim, setCacheNameDetails, skipWaiting } from "workbox-core";
|
2022-11-18 09:33:23 +00:00
|
|
|
import { registerRoute, Route } from "workbox-routing";
|
2020-05-05 12:16:51 +00:00
|
|
|
import {
|
|
|
|
|
CacheFirst,
|
|
|
|
|
NetworkOnly,
|
|
|
|
|
StaleWhileRevalidate,
|
|
|
|
|
} from "workbox-strategies";
|
2024-05-16 12:33:28 +00:00
|
|
|
import {
|
|
|
|
|
getPrefetchConsolidatedApiRequest,
|
|
|
|
|
ConsolidatedApiCacheStrategy,
|
|
|
|
|
} from "utils/serviceWorkerUtils";
|
2020-05-05 12:16:51 +00:00
|
|
|
|
|
|
|
|
setCacheNameDetails({
|
|
|
|
|
prefix: "appsmith",
|
2024-05-16 12:33:28 +00:00
|
|
|
suffix: "",
|
2020-05-05 12:16:51 +00:00
|
|
|
precache: "precache-v1",
|
|
|
|
|
runtime: "runtime",
|
|
|
|
|
googleAnalytics: "appsmith-ga",
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const regexMap = {
|
|
|
|
|
appViewPage: new RegExp(/api\/v1\/pages\/\w+\/view$/),
|
|
|
|
|
static3PAssets: new RegExp(
|
|
|
|
|
/(tiny.cloud|googleapis|gstatic|cloudfront).*.(js|css|woff2)/,
|
|
|
|
|
),
|
|
|
|
|
shims: new RegExp(/shims\/.*.js/),
|
2022-06-15 15:37:41 +00:00
|
|
|
profile: new RegExp(/v1\/(users\/profile|workspaces)/),
|
2020-05-05 12:16:51 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* eslint-disable no-restricted-globals */
|
2023-05-24 07:20:26 +00:00
|
|
|
// Note: if you need to filter out some files from precaching,
|
|
|
|
|
// do that in craco.build.config.js → workbox webpack plugin options
|
|
|
|
|
const toPrecache = self.__WB_MANIFEST;
|
2022-09-05 03:24:44 +00:00
|
|
|
precacheAndRoute(toPrecache);
|
|
|
|
|
|
2020-05-05 12:16:51 +00:00
|
|
|
self.__WB_DISABLE_DEV_DEBUG_LOGS = false;
|
|
|
|
|
skipWaiting();
|
|
|
|
|
clientsClaim();
|
|
|
|
|
|
2024-05-16 12:33:28 +00:00
|
|
|
const consolidatedApiCacheStrategy = new ConsolidatedApiCacheStrategy();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param {ExtendableEvent} event
|
|
|
|
|
* @param {Request} request
|
|
|
|
|
* @param {URL} url
|
|
|
|
|
* @returns
|
|
|
|
|
*/
|
|
|
|
|
const handleFetchHtml = async (event, request, url) => {
|
|
|
|
|
// Get the prefetch consolidated api request if the url matches the builder or viewer path
|
|
|
|
|
const prefetchConsolidatedApiRequest = getPrefetchConsolidatedApiRequest(url);
|
|
|
|
|
|
|
|
|
|
if (prefetchConsolidatedApiRequest) {
|
|
|
|
|
consolidatedApiCacheStrategy
|
|
|
|
|
.cacheConsolidatedApi(prefetchConsolidatedApiRequest)
|
|
|
|
|
.catch(() => {
|
|
|
|
|
// Silently fail
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const networkHandler = new NetworkOnly();
|
|
|
|
|
return networkHandler.handle({ event, request });
|
|
|
|
|
};
|
|
|
|
|
|
2020-05-05 12:16:51 +00:00
|
|
|
// This route's caching seems too aggressive.
|
|
|
|
|
// TODO(abhinav): Figure out if this is really necessary.
|
|
|
|
|
// Maybe add the assets locally?
|
|
|
|
|
registerRoute(({ url }) => {
|
|
|
|
|
return (
|
|
|
|
|
regexMap.shims.test(url.pathname) || regexMap.static3PAssets.test(url.href)
|
|
|
|
|
);
|
|
|
|
|
}, new CacheFirst());
|
|
|
|
|
|
|
|
|
|
registerRoute(({ url }) => {
|
|
|
|
|
return regexMap.profile.test(url.pathname);
|
|
|
|
|
}, new NetworkOnly());
|
|
|
|
|
|
|
|
|
|
registerRoute(({ url }) => {
|
|
|
|
|
return regexMap.appViewPage.test(url.pathname);
|
|
|
|
|
}, new StaleWhileRevalidate());
|
|
|
|
|
|
2022-11-18 09:33:23 +00:00
|
|
|
registerRoute(
|
2024-05-16 12:33:28 +00:00
|
|
|
new Route(
|
|
|
|
|
({ request, sameOrigin }) => {
|
|
|
|
|
return sameOrigin && request.destination === "document";
|
|
|
|
|
},
|
|
|
|
|
async ({ event, request, url }) => handleFetchHtml(event, request, url),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Route for fetching the API directly
|
|
|
|
|
registerRoute(
|
|
|
|
|
new RegExp("/api/v1/consolidated-api/"),
|
|
|
|
|
async ({ event, request }) => {
|
|
|
|
|
// Check for cached response
|
|
|
|
|
const cachedResponse =
|
|
|
|
|
await consolidatedApiCacheStrategy.getCachedResponse(request);
|
|
|
|
|
|
|
|
|
|
// If the response is cached, return the response
|
|
|
|
|
if (cachedResponse) {
|
|
|
|
|
return cachedResponse;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If the response is not cached, fetch the response
|
|
|
|
|
const networkHandler = new NetworkOnly();
|
|
|
|
|
return networkHandler.handle({ event, request });
|
|
|
|
|
},
|
|
|
|
|
"GET",
|
2022-11-18 09:33:23 +00:00
|
|
|
);
|