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