From 4ce26d337abb34ed3395430b0216372af741554e Mon Sep 17 00:00:00 2001 From: Til Schmitter Date: Fri, 19 Jun 2026 22:45:37 +0200 Subject: [PATCH] PWA: serviceworker wip --- copyparty/httpcli.py | 1 + copyparty/web/sw.js | 45 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index dfd7616b..d04ea45c 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -336,6 +336,7 @@ class HttpCli(object): """returns true if connection can be reused""" self.out_headers = { "Cache-Control": "no-store, max-age=0", + "Service-Worker-Allowed": "/", } if self.args.early_ban and self.is_banned(): diff --git a/copyparty/web/sw.js b/copyparty/web/sw.js index 5f8b48f3..cdd012c6 100644 --- a/copyparty/web/sw.js +++ b/copyparty/web/sw.js @@ -1,10 +1,13 @@ // service worker. required for PWAs // https://www.digitalapplied.com/blog/progressive-web-apps-2026-pwa-performance-guide // Register service worker on page load +console.log('sw.js') if ('serviceWorker' in navigator) { + console.log('sw load') self.addEventListener("fetch", (event) => { // Regular requests not related to Web Share Target. if (event.request.method !== "POST" || !event.request.action.has("share-target")) { + console.log('normal response') event.respondWith(fetch(event.request)); return; } @@ -12,15 +15,41 @@ if ('serviceWorker' in navigator) { // Requests related to Web Share Target. event.respondWith( (async () => { - const formData = await event.request.formData(); - const files = formData.get("files") || ""; - const responseUrl = '/'; // (ToDo: remember last upload dir) - // ToDo: keep file references in clipboard - // -> upload on paste - event.respondWith(fetch(event.request)); - alert(files); - return; + const formData = await event.request.formData(); + const files = formData.get("files") || ""; + console.log('sw share:') + console.log(files) + await addResourcesToCache(files) + + // const responseUrl = '/'; // (ToDo: remember last upload dir) + // ToDo: keep file references in clipboard + // (maybe read from cache on page load somehow) + // -> upload on paste + + // Copy existing headers + const headers = new Headers(event.request.headers); + + // Set a new header + var pw = await CookieStore.get('cppwd'); + headers.set('pw', pw); + + headers.delete('origin'); // 99% sure this doesn't work, but hey + + const newRequest = new Request(event.request, { + mode: 'cors', + credentials: 'omit', + headers: headers + }) + return fetch(newRequest) })(), ); }); + self.addEventListener('install', (event) => { + console.log('sw wait skip') + self.skipWaiting(); // insta replace old service workers (helpful for dev) + }); + const addResourcesToCache = async (resources) => { + const cache = await caches.open("files"); + await cache.addAll(resources); + }; } \ No newline at end of file