app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 88ef2e39972d37b177fb8be06114c23fd8f53f8e
parent eadf584a26b8489e58a9393478a87d96b7f3f51a
Author: triesap <triesap@radroots.dev>
Date:   Tue, 13 Jan 2026 13:48:09 +0000

app: unify asset caching and update build graph

- Route app init asset fetch through asset_cache_fetch with force-cache
- Preserve RADROOTS_ASSET_CACHE_NAME while clearing stale caches on reset
- Share asset cache constants between service worker and utils exports
- Update turbo build dependencies and bump packages submodule

Diffstat:
Mapp/src/lib/utils/app/index.ts | 4++--
Mapp/src/routes/+layout.svelte | 5+++--
Mapp/src/service-worker.js | 5+++--
Mturbo.json | 62++++++++++++++++++++++++++++++++++++++++++++++++--------------
4 files changed, 56 insertions(+), 20 deletions(-)

diff --git a/app/src/lib/utils/app/index.ts b/app/src/lib/utils/app/index.ts @@ -14,7 +14,7 @@ import { WebClientRadroots } from "@radroots/client/radroots"; import { WebTangleDatabase } from "@radroots/client/tangle"; import { Geocoder } from "@radroots/geocoder"; import { WebHttp } from "@radroots/http"; -import type { CallbackPromise } from "@radroots/utils"; +import { asset_cache_fetch, type CallbackPromise } from "@radroots/utils"; import { writable } from "svelte/store"; import { reset_sql_cipher } from "./cipher"; import type { NavigationRoute } from "./routes"; @@ -130,7 +130,7 @@ const app_init_total_unknown = (): void => { const app_init_fetch_asset = async (url: string, stage: AppInitStage): Promise<void> => { app_init_state_update({ stage }); - const response = await fetch(url, { cache: "force-cache" }); + const response = await asset_cache_fetch(url, { request_init: { cache: "force-cache" } }); if (!response.ok && response.type !== "opaque") throw new Error(`asset_fetch_failed:${url}`); const content_length = response.headers.get("content-length"); if (content_length) app_init_total_add(Number(content_length)); diff --git a/app/src/routes/+layout.svelte b/app/src/routes/+layout.svelte @@ -27,7 +27,7 @@ import type { LibContext } from "@radroots/apps-lib-pwa/types/context"; import { CFG_APP } from "@radroots/apps-lib-pwa/utils/app"; import { parse_theme_key, parse_theme_mode } from "@radroots/themes"; - import { str_cap_words } from "@radroots/utils"; + import { RADROOTS_ASSET_CACHE_NAME, str_cap_words } from "@radroots/utils"; import "css-paint-polyfill"; import { onMount } from "svelte"; import "../app.css"; @@ -112,7 +112,8 @@ await Promise.all(registrations.map((registration) => registration.unregister())); if (!("caches" in globalThis)) return; const cache_names = await caches.keys(); - await Promise.all(cache_names.map((name) => caches.delete(name))); + const stale_cache_names = cache_names.filter((name) => name !== RADROOTS_ASSET_CACHE_NAME); + await Promise.all(stale_cache_names.map((name) => caches.delete(name))); }; onMount(async () => { diff --git a/app/src/service-worker.js b/app/src/service-worker.js @@ -2,6 +2,7 @@ import { build, files, prerendered, version } from "$service-worker"; import { _env } from "$lib/_env"; import { DEFAULT_SQL_WASM_PATH } from "@radroots/client/sql/constants"; import { DEFAULT_GEOCODER_DATABASE_PATH } from "@radroots/geocoder/constants"; +import { RADROOTS_ASSET_CACHE_NAME, RADROOTS_ASSET_CACHE_PREFIX } from "@radroots/utils"; const APP_SHELL_URL = new URL(self.registration.scope).pathname; const normalize_env_path = (value) => @@ -46,8 +47,8 @@ const PRECACHE_LIST = PRECACHE_URLS.map((url) => ({ })); const APP_CACHE = `cache-app-shell-v${version}`; const APP_CACHE_PREFIX = "cache-app-shell-v"; -const ASSET_CACHE = "cache-app-assets-v1"; -const ASSET_CACHE_PREFIX = "cache-app-assets-v"; +const ASSET_CACHE = RADROOTS_ASSET_CACHE_NAME; +const ASSET_CACHE_PREFIX = RADROOTS_ASSET_CACHE_PREFIX; const normalize_asset_url = (url) => { const resolved = new URL(url, self.location.origin); diff --git a/turbo.json b/turbo.json @@ -40,6 +40,7 @@ "@radroots/geocoder#build", "@radroots/http#build", "@radroots/locales#build", + "@radroots/nfc#build", "@radroots/nostr#build", "@radroots/tangle-db-schema-bindings#build", "@radroots/themes#build", @@ -74,38 +75,48 @@ "@radroots/nostr#build", "@radroots/tangle-db-schema-bindings#build", "@radroots/tangle-db-wasm#build", + "@radroots/tangle-events-wasm#build", "@radroots/types-bindings#build", - "@radroots/utils#build" + "@radroots/utils#build", + "@radroots/tsconfig#build" ] }, "@radroots/geo#build": { "dependsOn": [ "@radroots/tangle-db-schema-bindings#build", - "@radroots/utils#build" + "@radroots/utils#build", + "@radroots/tsconfig#build" ] }, "@radroots/geocoder#build": { "dependsOn": [ "@radroots/geo#build", "@radroots/types-bindings#build", - "@radroots/utils#build" + "@radroots/utils#build", + "@radroots/tsconfig#build" ] }, "@radroots/http#build": { "dependsOn": [ "@radroots/types-bindings#build", - "@radroots/utils#build" + "@radroots/utils#build", + "@radroots/tsconfig#build" ] }, "@radroots/locales#build": { - "dependsOn": [] + "dependsOn": [ + "@radroots/tsconfig#build" + ] }, "@radroots/themes#build": { - "dependsOn": [] + "dependsOn": [ + "@radroots/tsconfig#build" + ] }, "@radroots/utils#build": { "dependsOn": [ - "@radroots/types-bindings#build" + "@radroots/types-bindings#build", + "@radroots/tsconfig#build" ] }, "@radroots/nostr#build": { @@ -117,7 +128,8 @@ "@radroots/utils#build", "@welshman/net#build", "@welshman/signer#build", - "@welshman/util#build" + "@welshman/util#build", + "@radroots/tsconfig#build" ] }, "@radroots/apps-nostr#build": { @@ -126,7 +138,8 @@ "@welshman/app#build", "@welshman/net#build", "@welshman/signer#build", - "@welshman/store#build" + "@welshman/store#build", + "@radroots/tsconfig#build" ] }, "@radroots/apps-lib-market#build": { @@ -140,22 +153,28 @@ ] }, "@radroots/core-bindings#build": { - "dependsOn": [] + "dependsOn": [ + "@radroots/tsconfig#build" + ] }, "@radroots/events-bindings#build": { "dependsOn": [ - "@radroots/core-bindings#build" + "@radroots/core-bindings#build", + "@radroots/tsconfig#build" ] }, "@radroots/events-codec-wasm#build": { "dependsOn": [] }, "@radroots/events-indexed-bindings#build": { - "dependsOn": [] + "dependsOn": [ + "@radroots/tsconfig#build" + ] }, "@radroots/tangle-db-schema-bindings#build": { "dependsOn": [ - "@radroots/types-bindings#build" + "@radroots/types-bindings#build", + "@radroots/tsconfig#build" ] }, "@radroots/tangle-db-wasm#build": { @@ -164,10 +183,25 @@ "@radroots/trade-bindings#build": { "dependsOn": [ "@radroots/core-bindings#build", - "@radroots/events-bindings#build" + "@radroots/events-bindings#build", + "@radroots/tsconfig#build" ] }, "@radroots/types-bindings#build": { + "dependsOn": [ + "@radroots/tsconfig#build" + ] + }, + "@radroots/nfc#build": { + "dependsOn": [ + "@radroots/utils#build", + "@radroots/tsconfig#build" + ] + }, + "@radroots/tsconfig#build": { + "dependsOn": [] + }, + "@radroots/tangle-events-wasm#build": { "dependsOn": [] } }