Add standalone browser mode: no daemon required

BrowserAdapter speaks yaw/2.1 signaling + WebRTC protocol entirely in
the browser (libsodium-wrappers for Ed25519/X25519). Identity stored in
localStorage; peers connect via any waste/yaw2 anchor.

When served from a non-localhost origin the app defaults to browser
mode. On localhost the daemon adapter is tried first with a one-click
switch to browser mode. config.js (gitignored, served by anchor) lets
the host pre-inject signalURL and other defaults.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Fredrik Johansson
2026-06-23 00:06:41 +02:00
parent add7c5fea8
commit 5bc16daae1
8 changed files with 820 additions and 35 deletions

View File

@@ -4,15 +4,21 @@ import { Onboarding } from './pages/Onboarding'
import { Chat } from './pages/Chat'
import './App.css'
// Default to local daemon WS IPC. Override with VITE_DAEMON_WS env var.
// When served from the anchor (non-localhost), default to browser mode.
// When running locally, try the daemon first.
const isLocal = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'
const DAEMON_WS = import.meta.env.VITE_DAEMON_WS ?? 'ws://127.0.0.1:17338'
export default function App() {
const { connect, daemonStatus, localPeer } = useWaste()
const { connect, connectBrowser, daemonStatus, localPeer } = useWaste()
useEffect(() => {
connect(DAEMON_WS)
}, [connect])
if (isLocal) {
connect(DAEMON_WS)
} else {
connectBrowser()
}
}, [connect, connectBrowser])
if (daemonStatus !== 'connected' || !localPeer) {
return <Onboarding status={daemonStatus} />