commit 0d56918b562867dc96bf443ba5b56e3349450739
parent c3c5a9b4e04d2461e2919d8aa70e2cbf14d9a620
Author: triesap <triesap@radroots.dev>
Date: Fri, 21 Nov 2025 01:14:48 +0000
Upgrade environment configuration, wire API and default relay settings across the app, persist the NIP-05 key into state, and disable service worker precaching.
Diffstat:
8 files changed, 79 insertions(+), 32 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
@@ -71,12 +71,12 @@ yarn
Configure local environment variables:
```bash
-echo 'PUBLIC_NOSTR_RELAY_DEFAULTS=ws://localhost:8080,ws://localhost:8081
+echo 'VITE_PUBLIC_DEFAULT_RELAYS=ws://localhost:8080,ws://localhost:8081
VITE_PUBLIC_RADROOTS_RELAY=ws://localhost:8082
VITE_PUBLIC_RADROOTS_API=https://radroots.org
VITE_PUBLIC_KEYVAL_NAME=rad-roots-pwa-dev-v1
-VITE_PUBLIC_NDK_CACHE_NAME=rad-roots-pwa-dev-v1
-VITE_PUBLIC_NDK_CLIENT_NAME=rad roots' > app/.env.development
+VITE_PUBLIC_NDK_CACHE=rad-roots-pwa-dev-v1
+VITE_PUBLIC_NDK_CLIENT=rad roots' > app/.env.development
```
Build the application:
diff --git a/app/.env.example b/app/.env.example
@@ -1,8 +1,8 @@
-PUBLIC_NOSTR_RELAY_DEFAULTS=
+VITE_PUBLIC_DEFAULT_RELAYS=
VITE_PUBLIC_RADROOTS_API=
VITE_PUBLIC_KEYVAL_NAME=
-VITE_PUBLIC_NDK_CACHE_NAME=
-VITE_PUBLIC_NDK_CLIENT_NAME=
+VITE_PUBLIC_NDK_CACHE=
+VITE_PUBLIC_NDK_CLIENT=
PORT=
VITE_PUBLIC_RADROOTS_RELAY=
VITE_PLATFORM_NAME=
diff --git a/app/src/lib/_env.ts b/app/src/lib/_env.ts
@@ -0,0 +1,41 @@
+const DEFAULT_RELAYS = import.meta.env.VITE_PUBLIC_DEFAULT_RELAYS;
+if (!DEFAULT_RELAYS || typeof DEFAULT_RELAYS !== 'string') throw new Error('Missing env var: VITE_PUBLIC_DEFAULT_RELAYS');
+
+const RADROOTS_API = import.meta.env.VITE_PUBLIC_RADROOTS_API;
+if (!RADROOTS_API || typeof RADROOTS_API !== 'string') throw new Error('Missing env var: VITE_PUBLIC_RADROOTS_API');
+
+const KEYVAL_NAME = import.meta.env.VITE_PUBLIC_KEYVAL_NAME;
+if (!KEYVAL_NAME || typeof KEYVAL_NAME !== 'string') throw new Error('Missing env var: VITE_PUBLIC_KEYVAL_NAME');
+
+const NDK_CACHE = import.meta.env.VITE_PUBLIC_NDK_CACHE;
+if (!NDK_CACHE || typeof NDK_CACHE !== 'string') throw new Error('Missing env var: VITE_PUBLIC_NDK_CACHE');
+
+const NDK_CLIENT = import.meta.env.VITE_PUBLIC_NDK_CLIENT;
+if (!NDK_CLIENT || typeof NDK_CLIENT !== 'string') throw new Error('Missing env var: VITE_PUBLIC_NDK_CLIENT');
+
+const RADROOTS_RELAY = import.meta.env.VITE_PUBLIC_RADROOTS_RELAY;
+if (!RADROOTS_RELAY || typeof RADROOTS_RELAY !== 'string') throw new Error('Missing env var: VITE_PUBLIC_RADROOTS_RELAY');
+
+const PLATFORM_NAME = import.meta.env.VITE_PLATFORM_NAME;
+if (!PLATFORM_NAME || typeof PLATFORM_NAME !== 'string') throw new Error('Missing env var: VITE_PLATFORM_NAME');
+
+const PLATFORM_ACCENT = import.meta.env.VITE_PLATFORM_ACCENT;
+if (!PLATFORM_ACCENT || typeof PLATFORM_ACCENT !== 'string') throw new Error('Missing env var: VITE_PLATFORM_ACCENT');
+
+const PLATFORM_DESCRIPTION = import.meta.env.VITE_PLATFORM_DESCRIPTION;
+if (!PLATFORM_DESCRIPTION || typeof PLATFORM_DESCRIPTION !== 'string') throw new Error('Missing env var: VITE_PLATFORM_DESCRIPTION');
+
+const PROD = import.meta.env.MODE === 'production';
+
+export const _env = {
+ PROD,
+ DEFAULT_RELAYS,
+ KEYVAL_NAME,
+ NDK_CACHE,
+ NDK_CLIENT,
+ PLATFORM_ACCENT,
+ PLATFORM_DESCRIPTION,
+ PLATFORM_NAME,
+ RADROOTS_API,
+ RADROOTS_RELAY,
+} as const;
diff --git a/app/src/lib/utils/app/index.ts b/app/src/lib/utils/app/index.ts
@@ -1,4 +1,5 @@
import { goto } from "$app/navigation";
+import { _env } from "$lib/_env";
import { cfg_data, cfg_datastore_key_map, cfg_datastore_key_obj_map, cfg_datastore_key_param_map } from "$lib/utils/config";
import { ls } from "$lib/utils/i18n";
import { create_router, get_store, handle_err } from "@radroots/apps-lib";
@@ -29,7 +30,7 @@ export const geol = new WebGeolocation();
export const geoc = new Geocoder();
export const http = new WebHttp();
export const notif = new WebNotifications();
-export const radroots = new WebClientRadroots();
+export const radroots = new WebClientRadroots(_env.RADROOTS_API);
export const nostr_keys = new WebKeystoreNostr({
database: "radroots-pwa-v1-keystore-nostr"
});
@@ -88,4 +89,3 @@ export const message_callback = async (message: string, callback: CallbackPromis
notif.alert(message);
await callback();
};
-
diff --git a/app/src/lib/utils/config.ts b/app/src/lib/utils/config.ts
@@ -61,13 +61,14 @@ export type ConfigData = {
nostr_profile?: string;
role?: AppConfigRole;
nip05_request?: boolean;
- nip05_result?: string;
+ nip05_key?: string;
};
export type AppData = {
active_key: string;
role: AppConfigRole;
eula_date: string;
+ nip05_key?: string;
};
export type cfg_datastore_key_obj_map_types = {
diff --git a/app/src/lib/utils/nostr/lib.ts b/app/src/lib/utils/nostr/lib.ts
@@ -1,9 +1,9 @@
-import { PUBLIC_NOSTR_RELAY_DEFAULTS } from "$env/static/public";
+import { _env } from "$lib/_env";
export const get_default_nostr_relays = (): string[] => {
return Array.from(
new Set(
- PUBLIC_NOSTR_RELAY_DEFAULTS.split(",")
+ _env.DEFAULT_RELAYS.split(",")
.map((url) => url.trim())
.filter((url) => url.length > 0),
),
diff --git a/app/src/routes/(cfg)/setup/+page.svelte b/app/src/routes/(cfg)/setup/+page.svelte
@@ -259,15 +259,14 @@
return void (await notif.alert(
`${$ls(`error.configuration.profile.name_min_length`)}`,
));
- // nip-05 request
profile_name_loading = true;
- const profile_req = await radroots.accounts_request({
+ const accounts_req = await radroots.accounts_request({
profile_name: profile_name_val,
secret_key: ks_nostr_key.secret_key,
});
- if ("err" in profile_req)
+ if ("err" in accounts_req)
return void (await notif.alert(
- `${$ls(profile_req.err, {
+ `${$ls(accounts_req.err, {
default: `${$ls(
`error.client.http.request_failure`,
)}`,
@@ -283,13 +282,13 @@
ok: `${$ls(`common.yes`)}`,
});
if (!confirm) return;
- const profile_create = await radroots.accounts_create({
- tok: profile_req.result,
+ const accounts_create = await radroots.accounts_create({
+ tok: accounts_req.result,
secret_key: ks_nostr_key.secret_key,
});
- if (`err` in profile_create)
+ if (`err` in accounts_create)
return void (await notif.alert(
- `${$ls(profile_create.err, {
+ `${$ls(accounts_create.err, {
default: `${$ls(
`error.client.http.request_failure`,
)}`,
@@ -297,7 +296,7 @@
));
await datastore.update_obj<ConfigData>("cfg_data", {
nip05_request: true,
- nip05_result: profile_create.result,
+ nip05_key: accounts_create.result,
});
}
@@ -383,8 +382,9 @@
if ("err" in ks_nostr_key) return handle_config_err(ks_nostr_key);
const configure_result = await configure_device(
active_key,
- ds_cfg_data.result.role || "personal",
- ds_cfg_data.result.nostr_profile,
+ ds_cfg_data.result,
+ //ds_cfg_data.result.role || "personal",
+ //ds_cfg_data.result.nostr_profile,
);
if ("err" in configure_result) {
return void (await notif.alert(configure_result.err));
@@ -406,13 +406,16 @@
const configure_device = async (
public_key: string,
- role: AppConfigRole,
- profile_name?: string,
+ config_data: ConfigData,
): Promise<ResultPass | IError<string>> => {
const nostr_profile_add = await db.nostr_profile_create({
public_key,
- name: profile_name ? profile_name : `${$ls(`common.default`)}`,
- display_name: profile_name ? profile_name : undefined,
+ name: config_data.nostr_profile
+ ? config_data.nostr_profile
+ : `${$ls(`common.default`)}`,
+ display_name: config_data.nostr_profile
+ ? config_data.nostr_profile
+ : undefined,
});
if ("err" in nostr_profile_add)
return err_msg(
@@ -439,12 +442,14 @@
)}`,
);
}
- await datastore.del_obj("cfg_data");
- await datastore.set_obj<AppData>("app_data", {
+ const set_app_data = await datastore.set_obj<AppData>("app_data", {
active_key: public_key,
- role,
+ role: config_data.role || "personal",
eula_date: new Date().toISOString(),
+ nip05_key: config_data.nip05_key,
});
+ if ("err" in set_app_data) return err_msg(set_app_data);
+ await datastore.del_obj("cfg_data");
return { pass: true };
};
</script>
diff --git a/app/src/service-worker.js b/app/src/service-worker.js
@@ -1,9 +1,9 @@
import { build, files, prerendered, version } from '$service-worker'
-import { precacheAndRoute } from 'workbox-precaching'
+//import { precacheAndRoute } from 'workbox-precaching'
const precache_list = [...build, ...files, ...prerendered].map((s) => ({
url: s,
revision: version,
}))
-precacheAndRoute(precache_list)
-\ No newline at end of file
+//precacheAndRoute(precache_list)
+\ No newline at end of file