diff --git a/app/package.json b/app/package.json index b635c37..ede350c 100644 --- a/app/package.json +++ b/app/package.json @@ -35,6 +35,7 @@ "vite": "^6.0.7", "vite-plugin-pwa": "^1.2.0", "vite-plugin-solid": "^2.11.10", - "vite-plugin-wasm": "^3.4.1" + "vite-plugin-wasm": "^3.4.1", + "workbox-window": "^7.4.0" } } diff --git a/app/src/index.tsx b/app/src/index.tsx index 4b2a2f7..ed36e5e 100644 --- a/app/src/index.tsx +++ b/app/src/index.tsx @@ -15,16 +15,14 @@ import Debug from "./routes/debug"; import Invite from "./routes/invite"; import Join from "./routes/join"; import { runSocketProxy } from "./socketProxy.ts"; +import { register } from "./service-worker/register"; +register(); void runSocketProxy(); -/** - * Defined in the vite configuration vite.config.ts - */ -declare const __GIT_COMMIT_HASH__: string; -render( - () => ( +function App() { + return ( @@ -47,6 +45,11 @@ render( {version}+{__GIT_COMMIT_HASH__} - ), - document.body -); + ); +} + +/** + * Defined in the vite configuration vite.config.ts + */ +declare const __GIT_COMMIT_HASH__: string; +render(App, document.body); diff --git a/app/src/service-worker/register.ts b/app/src/service-worker/register.ts new file mode 100644 index 0000000..7649c4a --- /dev/null +++ b/app/src/service-worker/register.ts @@ -0,0 +1,11 @@ +export function register() { + if (!("serviceWorker" in navigator)) return; + + // Be carefult changing these paths + const swPath = import.meta.env.DEV + ? "/dev-sw.js?dev-sw" + : "/serviceWorker.js"; + + console.debug("Registering service worker:", swPath); + navigator.serviceWorker.register(swPath, { type: "module", scope: "/" }); +} diff --git a/app/src/service-worker/serviceWorker.ts b/app/src/service-worker/serviceWorker.ts index cef4633..7925cec 100644 --- a/app/src/service-worker/serviceWorker.ts +++ b/app/src/service-worker/serviceWorker.ts @@ -1,5 +1,7 @@ import { precacheAndRoute } from "workbox-precaching"; import init, { Client, DecodedPackage, Friend } from "meal-core"; +import wasm from "../../../core/pkg/meal_core_bg.wasm?url"; + import { expose } from "../crackle"; import { Group, IncomingMessage, OutgoingMessage } from "../database/schema"; import { broadcastMessage } from "../broadcast"; @@ -12,6 +14,9 @@ import { } from "../database"; import { messagesUrl } from "../messagesUrl"; +console.debug("Initializing service worker", wasm); +const initialization = init({ module_or_path: wasm }); + // Reduce noise // @ts-expect-error self.__WB_DISABLE_DEV_LOGS = true; @@ -88,7 +93,7 @@ async function initializeClient(): Promise { // Have to use wasm-pack --target web to build the wasm package to get the init function because with the bundler target // it is included as a top level await which is not supported by service workers according to the web spec // Has to be initialized before we do anything with the Rust code. It also needs to be initialized if a client exists - await init(); + await initialization; // Try to load existing client const directory = await navigator.storage.getDirectory(); diff --git a/app/src/vite-env.d.ts b/app/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/app/tsconfig.json b/app/tsconfig.json index 20b22fd..e523359 100644 --- a/app/tsconfig.json +++ b/app/tsconfig.json @@ -21,7 +21,6 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "checkJs": true - // "types": ["vite/client"] }, "include": ["src"], "exclude": ["src/workers"], diff --git a/app/vite.config.ts b/app/vite.config.ts index 5327abd..3733c78 100644 --- a/app/vite.config.ts +++ b/app/vite.config.ts @@ -7,6 +7,9 @@ import { execSync } from "node:child_process"; /** @import { defineConfig } from "vite"; */ const gitHash = execSync("git rev-parse --short HEAD").toString().trim(); + +// Source code is public so source maps can be included +const IS_SOURCE_MAPS_ENABLED = true; export default defineConfig({ define: { __GIT_COMMIT_HASH__: JSON.stringify(gitHash), @@ -16,17 +19,25 @@ export default defineConfig({ solid(), wasm(), vitePwa({ - registerType: "autoUpdate", + /** + * Plugin does not support module registration in production which is baseline beginning 13.01.2026 + * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker#browser_compatibility + */ + injectRegister: null, + strategies: "injectManifest", + srcDir: "./src/service-worker", + filename: "serviceWorker.ts", + // Has to be kept or service worker will not work in development even if we register it manually devOptions: { enabled: true, type: "module", }, - strategies: "injectManifest", - srcDir: "./src/service-worker", - filename: "serviceWorker.ts", pwaAssets: { image: "./public/logo-04.svg", }, + workbox: { + sourcemap: IS_SOURCE_MAPS_ENABLED, + }, }), ], server: { @@ -50,8 +61,8 @@ export default defineConfig({ build: { // Fixes top level await build error and support should be fine, right?...right? target: "esnext", - // Source code is public so source maps can be included - sourcemap: true, + sourcemap: IS_SOURCE_MAPS_ENABLED, + minify: false, }, optimizeDeps: { exclude: ["@sqlite.org/sqlite-wasm"], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b8efcb..e22b7dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,13 +70,16 @@ importers: version: 6.0.7(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1) vite-plugin-pwa: specifier: ^1.2.0 - version: 1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@6.0.7(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + version: 1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@6.0.7(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.4.0) vite-plugin-solid: specifier: ^2.11.10 version: 2.11.10(solid-js@1.9.10)(vite@6.0.7(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) vite-plugin-wasm: specifier: ^3.4.1 version: 3.4.1(vite@6.0.7(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) + workbox-window: + specifier: ^7.4.0 + version: 7.4.0 tugboat: devDependencies: @@ -3269,6 +3272,9 @@ packages: workbox-core@7.3.0: resolution: {integrity: sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==} + workbox-core@7.4.0: + resolution: {integrity: sha512-6BMfd8tYEnN4baG4emG9U0hdXM4gGuDU3ectXuVHnj71vwxTFI7WOpQJC4siTOlVtGqCUtj0ZQNsrvi6kZZTAQ==} + workbox-expiration@7.3.0: resolution: {integrity: sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==} @@ -3302,6 +3308,9 @@ packages: workbox-window@7.3.0: resolution: {integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==} + workbox-window@7.4.0: + resolution: {integrity: sha512-/bIYdBLAVsNR3v7gYGaV4pQW3M3kEPx5E8vDxGvxo6khTrGtSSCS7QiFKv9ogzBgZiy0OXLP9zO28U/1nF1mfw==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -6598,14 +6607,14 @@ snapshots: validate-html-nesting@1.2.2: {} - vite-plugin-pwa@1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@6.0.7(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@6.0.7(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.4.0): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 tinyglobby: 0.2.12 vite: 6.0.7(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1) workbox-build: 7.3.0(@types/babel__core@7.20.5) - workbox-window: 7.3.0 + workbox-window: 7.4.0 optionalDependencies: '@vite-pwa/assets-generator': 1.0.2 transitivePeerDependencies: @@ -6778,6 +6787,8 @@ snapshots: workbox-core@7.3.0: {} + workbox-core@7.4.0: {} + workbox-expiration@7.3.0: dependencies: idb: 7.1.1 @@ -6833,6 +6844,11 @@ snapshots: '@types/trusted-types': 2.0.7 workbox-core: 7.3.0 + workbox-window@7.4.0: + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.4.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0