fix: service worker caching and ghostscript loader path issues

This commit is contained in:
alam00000
2026-01-30 14:58:18 +05:30
parent a85f21dcb5
commit 981aff3c5a
4 changed files with 64 additions and 13 deletions

14
package-lock.json generated
View File

@@ -76,6 +76,7 @@
"@types/pdfkit": "^0.17.3", "@types/pdfkit": "^0.17.3",
"@types/sortablejs": "^1.15.8", "@types/sortablejs": "^1.15.8",
"@types/utif": "^3.0.6", "@types/utif": "^3.0.6",
"@vitejs/plugin-basic-ssl": "^2.1.4",
"@vitest/coverage-v8": "^3.2.4", "@vitest/coverage-v8": "^3.2.4",
"@vitest/ui": "^3.2.4", "@vitest/ui": "^3.2.4",
"eslint": "^9.39.2", "eslint": "^9.39.2",
@@ -3932,6 +3933,19 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/@vitejs/plugin-basic-ssl": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz",
"integrity": "sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^18.0.0 || ^20.0.0 || >=22.0.0"
},
"peerDependencies": {
"vite": "^6.0.0 || ^7.0.0"
}
},
"node_modules/@vitest/coverage-v8": { "node_modules/@vitest/coverage-v8": {
"version": "3.2.4", "version": "3.2.4",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz",

View File

@@ -44,6 +44,7 @@
"@types/pdfkit": "^0.17.3", "@types/pdfkit": "^0.17.3",
"@types/sortablejs": "^1.15.8", "@types/sortablejs": "^1.15.8",
"@types/utif": "^3.0.6", "@types/utif": "^3.0.6",
"@vitejs/plugin-basic-ssl": "^2.1.4",
"@vitest/coverage-v8": "^3.2.4", "@vitest/coverage-v8": "^3.2.4",
"@vitest/ui": "^3.2.4", "@vitest/ui": "^3.2.4",
"eslint": "^9.39.2", "eslint": "^9.39.2",

View File

@@ -146,12 +146,20 @@ async function cacheFirstStrategyWithDedup(request, isCDN) {
const networkResponse = await fetch(request); const networkResponse = await fetch(request);
if (networkResponse && networkResponse.status === 200) { if (networkResponse && networkResponse.status === 200) {
const clone = networkResponse.clone();
const buffer = await clone.arrayBuffer();
if (buffer.byteLength > 0) {
const cache = await caches.open(CACHE_NAME); const cache = await caches.open(CACHE_NAME);
await removeDuplicateCache(cache, fileName, isCDN); await removeDuplicateCache(cache, fileName, isCDN);
await cache.put(
await cache.put(request, networkResponse.clone()); request,
// console.log(`💾 [Cached from ${isCDN ? 'CDN' : 'local'}] Saved:`, fileName); new Response(buffer, {
status: networkResponse.status,
statusText: networkResponse.statusText,
headers: networkResponse.headers,
})
);
}
} }
return networkResponse; return networkResponse;
@@ -166,9 +174,19 @@ async function cacheFirstStrategyWithDedup(request, isCDN) {
try { try {
const fallbackResponse = await fetch(localUrl); const fallbackResponse = await fetch(localUrl);
if (fallbackResponse && fallbackResponse.status === 200) { if (fallbackResponse && fallbackResponse.status === 200) {
const fbClone = fallbackResponse.clone();
const fbBuffer = await fbClone.arrayBuffer();
if (fbBuffer.byteLength > 0) {
const cache = await caches.open(CACHE_NAME); const cache = await caches.open(CACHE_NAME);
await cache.put(localUrl, fallbackResponse.clone()); await cache.put(
// console.log('✅ [Fallback Success] Cached local version:', fileName); localUrl,
new Response(fbBuffer, {
status: fallbackResponse.status,
statusText: fallbackResponse.statusText,
headers: fallbackResponse.headers,
})
);
}
return fallbackResponse; return fallbackResponse;
} }
} catch (fallbackError) { } catch (fallbackError) {
@@ -187,9 +205,14 @@ async function findCachedFile(fileName, requestUrl) {
const cache = await caches.open(CACHE_NAME); const cache = await caches.open(CACHE_NAME);
const exactMatch = await cache.match(requestUrl); const exactMatch = await cache.match(requestUrl);
if (exactMatch && exactMatch.headers.get('content-length') !== '0') { if (exactMatch) {
const clone = exactMatch.clone();
const buffer = await clone.arrayBuffer();
if (buffer.byteLength > 0) {
return exactMatch; return exactMatch;
} }
await cache.delete(requestUrl);
}
const requests = await cache.keys(); const requests = await cache.keys();
for (const req of requests) { for (const req of requests) {
@@ -234,8 +257,19 @@ async function networkFirstStrategy(request) {
const networkResponse = await fetch(request); const networkResponse = await fetch(request);
if (networkResponse && networkResponse.status === 200) { if (networkResponse && networkResponse.status === 200) {
const clone = networkResponse.clone();
const buffer = await clone.arrayBuffer();
if (buffer.byteLength > 0) {
const cache = await caches.open(CACHE_NAME); const cache = await caches.open(CACHE_NAME);
cache.put(request, networkResponse.clone()); cache.put(
request,
new Response(buffer, {
status: networkResponse.status,
statusText: networkResponse.statusText,
headers: networkResponse.headers,
})
);
}
} }
return networkResponse; return networkResponse;

View File

@@ -1,6 +1,7 @@
import { defineConfig, Plugin } from 'vitest/config'; import { defineConfig, Plugin } from 'vitest/config';
import type { IncomingMessage, ServerResponse } from 'http'; import type { IncomingMessage, ServerResponse } from 'http';
import type { Connect } from 'vite'; import type { Connect } from 'vite';
import basicSsl from '@vitejs/plugin-basic-ssl';
import tailwindcss from '@tailwindcss/vite'; import tailwindcss from '@tailwindcss/vite';
import { nodePolyfills } from 'vite-plugin-node-polyfills'; import { nodePolyfills } from 'vite-plugin-node-polyfills';
import { viteStaticCopy } from 'vite-plugin-static-copy'; import { viteStaticCopy } from 'vite-plugin-static-copy';
@@ -283,6 +284,7 @@ export default defineConfig(() => {
return { return {
base: (process.env.BASE_URL || '/').replace(/\/?$/, '/'), base: (process.env.BASE_URL || '/').replace(/\/?$/, '/'),
plugins: [ plugins: [
// basicSsl(),
handlebars({ handlebars({
partialDirectory: resolve(__dirname, 'src/partials'), partialDirectory: resolve(__dirname, 'src/partials'),
context: { context: {