From d32179deb10e798a55872487834612ba582926be Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 18 Jul 2025 23:00:27 -0400 Subject: [PATCH] Switch over to using a token for demo/ --- .env.development | 4 +- .env.production | 5 +- CLAUDE.md | 72 +++++++++++ astro.config.ts | 3 - env.d.ts | 4 +- package.json | 6 +- pnpm-lock.yaml | 241 +++-------------------------------- src/components/publish.tsx | 6 +- src/components/watch.tsx | 14 +- src/pages/watch/[name].astro | 2 +- src/pages/watch/index.astro | 2 +- 11 files changed, 112 insertions(+), 247 deletions(-) create mode 100644 CLAUDE.md diff --git a/.env.development b/.env.development index d0c22d8..b426343 100644 --- a/.env.development +++ b/.env.development @@ -1,2 +1,2 @@ -PUBLIC_RELAY_SCHEME="http" -PUBLIC_RELAY_HOST="localhost:4443" +PUBLIC_RELAY_URL="http://localhost:4443" +PUBLIC_RELAY_TOKEN="" diff --git a/.env.production b/.env.production index a04c130..a74d18c 100644 --- a/.env.production +++ b/.env.production @@ -1,2 +1,3 @@ -PUBLIC_RELAY_SCHEME="https" -PUBLIC_RELAY_HOST="relay.quic.video" +PUBLIC_RELAY_URL="https://relay.quic.video" +# Generate with: cargo run --bin moq-token -- --key root.jwk sign --root "demo" --publish "" +PUBLIC_RELAY_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb290IjoiZGVtbyIsInB1YiI6IiIsInN1YiI6bnVsbCwiZXhwIjpudWxsLCJpYXQiOm51bGx9.vizGIT2tLZLnYWkov6XHrzwt5YoKpi0jS9oIskXxhqA" diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..b51d654 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,72 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +quic.video is a web blog and demo for Media over QUIC (MoQ) protocol. It's built with Astro, Solid.js, and uses WebTransport to connect to MoQ relay servers for live streaming. + +## Essential Commands + +```bash +# Development +npm run dev # Start dev server with auto-open and HTTPS + +# Build & Production +npm run build # Production build +npm run prod # Build and preview production + +# Code Quality +npm run check # Run Biome linting and TypeScript checking +npm run fix # Auto-fix code issues and audit dependencies +``` + +## Architecture Overview + +### Technology Stack +- **Framework**: Astro with SSR via Node.js adapter +- **UI Components**: Solid.js for interactive elements +- **Styling**: Tailwind CSS +- **Build**: Vite with WASM and mkcert plugins +- **Code Quality**: Biome for linting/formatting +- **Package Manager**: pnpm v10.11.0 + +### Key Components + +1. **MoQ Client Implementation** (`@kixelated/hang` package): + - Custom web components: ``, ``, `` + - WebTransport protocol for relay connections + - Publishing: `src/components/publish.tsx` - Creates broadcasts with random names + - Watching: `src/components/watch.tsx` - Connects to broadcasts by name + +2. **Routing Structure**: + - `/publish` - Create new broadcasts + - `/watch/{name}` - View specific broadcast + - `/blog/` - MDX-based blog posts + - Dynamic routes use `export const prerender = false` for SSR + +3. **Environment Configuration**: + - `PUBLIC_RELAY_URL` - WebTransport URL + - Separate `.env` files for dev/production + +### Important Patterns + +- **No REST APIs**: Uses WebTransport directly for streaming +- **Stateless**: No database or user management +- **Error Handling**: Component-level with `src/components/fail.tsx` +- **Authentication**: Basic JWT support via query parameters for demo broadcasts +- **Content Management**: MDX files in `src/pages/blog/` for documentation + +### Deployment + +- Docker multi-stage builds +- Terraform infrastructure in `/infra/` +- Production entry: `dist/server/entry.mjs` + +## Development Tips + +- WebTransport requires HTTPS even in development (handled by vite-plugin-mkcert) +- Broadcasts are ephemeral - no persistence layer +- The `@kixelated/hang` package handles all MoQ protocol implementation +- For new blog posts, add MDX files to `src/pages/blog/` +- Component changes in `src/components/` automatically reload with HMR diff --git a/astro.config.ts b/astro.config.ts index 847ad6e..ee0ee7b 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -6,8 +6,6 @@ import solidJs from "@astrojs/solid-js"; import tailwind from "@astrojs/tailwind"; import { defineConfig } from "astro/config"; -import mkcert from "vite-plugin-mkcert"; - // https://astro.build/config export default defineConfig({ site: "https://quic.video", @@ -37,7 +35,6 @@ export default defineConfig({ ], }, }, - plugins: [mkcert()], resolve: { alias: { "@": "/src", diff --git a/env.d.ts b/env.d.ts index b573170..f7f2ace 100644 --- a/env.d.ts +++ b/env.d.ts @@ -1,8 +1,8 @@ /// interface ImportMetaEnv { - readonly PUBLIC_RELAY_SCHEME: "http" | "https"; - readonly PUBLIC_RELAY_HOST: string; + readonly PUBLIC_RELAY_URL: string; + readonly PUBLIC_RELAY_TOKEN: string; } interface ImportMeta { diff --git a/package.json b/package.json index 07db7ef..149fbd8 100644 --- a/package.json +++ b/package.json @@ -16,16 +16,14 @@ "@astrojs/rss": "^4.0.12", "@astrojs/solid-js": "5.1.0", "@astrojs/tailwind": "6.0.2", - "@kixelated/hang": "^0.2.5", + "@kixelated/hang": "^0.3.0", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/typography": "^0.5.16", "astro": "^5.8.2", "solid-js": "^1.9.7", "tailwindcss": "^3.4.17", "unique-names-generator": "^4.7.1", - "vite-plugin-mkcert": "^1.17.8", - "vite-plugin-static-copy": "^2.3.1", - "vite-plugin-wasm": "^3.4.1" + "vite-plugin-static-copy": "^2.3.1" }, "devDependencies": { "@biomejs/biome": "2.0.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ac0025..a7f58bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: 6.0.2 version: 6.0.2(astro@5.8.2(@types/node@22.15.29)(jiti@1.21.7)(rollup@4.41.1)(typescript@5.8.3)(yaml@2.8.0))(tailwindcss@3.4.17) '@kixelated/hang': - specifier: ^0.2.5 - version: 0.2.5(@types/react@19.1.8)(solid-js@1.9.7) + specifier: ^0.3.0 + version: 0.3.0(@types/react@19.1.8)(solid-js@1.9.7) '@tailwindcss/forms': specifier: ^0.5.10 version: 0.5.10(tailwindcss@3.4.17) @@ -44,15 +44,9 @@ importers: unique-names-generator: specifier: ^4.7.1 version: 4.7.1 - vite-plugin-mkcert: - specifier: ^1.17.8 - version: 1.17.8(vite@6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0)) vite-plugin-static-copy: specifier: ^2.3.1 version: 2.3.1(vite@6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0)) - vite-plugin-wasm: - specifier: ^3.4.1 - version: 3.4.1(vite@6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0)) devDependencies: '@biomejs/biome': specifier: 2.0.5 @@ -531,16 +525,16 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@kixelated/hang@0.2.5': - resolution: {integrity: sha512-Uw7qFrJ34zvX/cVh97TtHFhY1nxdDEqBp+ckG6t+V+BmSg0AgwUOWPFISl1uDjkCsR84IkFw+zN3HSt4bYvXgw==} + '@kixelated/hang@0.3.0': + resolution: {integrity: sha512-FFdiiKYgV4Og4IE5n6PgKGBTpHgzNAd41UQ2u4Ega9RS/pyoO7dLmW2MS5bFPvoGuaRWduK35to3G4VYHNbSDQ==} peerDependencies: solid-js: ^1.9.7 - '@kixelated/moq@0.6.1': - resolution: {integrity: sha512-fdEbFghz0NwrDYmjntDVvYYAvIFpgtxrY5MzM7uexFimyEtMCfIt9Th4bcL54vpZm6l5R6gsL1IEBUHo4AdOfg==} + '@kixelated/moq@0.7.0': + resolution: {integrity: sha512-y0S/M4lKjz5UwcNlX1bRlAoNgGDL+AMq2YJPQ2uHAPlLHqODYx8ihqBWf76/JHbJSdyaP/UwE+xAnT5ujIOrTQ==} - '@kixelated/signals@0.3.0': - resolution: {integrity: sha512-oLBrY27OKyyB5d4++HE2GGyR5siIlWWc8ZHNcGyKKk+kMY2AEAwpJnA8IvyUaJkfQvc6VMTYXRSDS7YON14QRQ==} + '@kixelated/signals@0.3.1': + resolution: {integrity: sha512-ZtCps9UwqVi94nVGydzxP4FAwGKvDV3YSZvDaXCXyuCvthy04LOpxmLo1nT3TS1IcSTOqv5v6ZbiPSdYtkv9Ew==} peerDependencies: '@types/react': ^19.1.8 react: ^19.0.0 @@ -828,9 +822,6 @@ packages: engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - autoprefixer@10.4.21: resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} @@ -838,9 +829,6 @@ packages: peerDependencies: postcss: ^8.1.0 - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -896,10 +884,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -971,10 +955,6 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1032,10 +1012,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1078,10 +1054,6 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1108,25 +1080,9 @@ packages: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -1213,15 +1169,6 @@ packages: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - fontace@0.3.0: resolution: {integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==} @@ -1232,10 +1179,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -1263,14 +1206,6 @@ packages: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -1290,24 +1225,12 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} h3@1.15.3: resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1516,10 +1439,6 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} @@ -1691,18 +1610,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mime-types@3.0.1: resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} engines: {node: '>= 0.6'} @@ -1914,9 +1825,6 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2353,12 +2261,6 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-plugin-mkcert@1.17.8: - resolution: {integrity: sha512-S+4tNEyGqdZQ3RLAG54ETeO2qyURHWrVjUWKYikLAbmhh/iJ+36gDEja4OWwFyXNuvyXcZwNt5TZZR9itPeG5Q==} - engines: {node: '>=v16.7.0'} - peerDependencies: - vite: '>=3' - vite-plugin-solid@2.11.6: resolution: {integrity: sha512-Sl5CTqJTGyEeOsmdH6BOgalIZlwH3t4/y0RQuFLMGnvWMBvxb4+lq7x3BSiAw6etf0QexfNJW7HSOO/Qf7pigg==} peerDependencies: @@ -2375,11 +2277,6 @@ packages: peerDependencies: vite: ^5.0.0 || ^6.0.0 - vite-plugin-wasm@3.4.1: - resolution: {integrity: sha512-ja3nSo2UCkVeitltJGkS3pfQHAanHv/DqGatdI39ja6McgABlpsZ5hVgl6wuR8Qx5etY3T5qgDQhOWzc5RReZA==} - peerDependencies: - vite: ^2 || ^3 || ^4 || ^5 || ^6 - vite@6.3.5: resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2503,8 +2400,8 @@ packages: zod@3.25.51: resolution: {integrity: sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==} - zod@3.25.67: - resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -2960,22 +2857,20 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@kixelated/hang@0.2.5(@types/react@19.1.8)(solid-js@1.9.7)': + '@kixelated/hang@0.3.0(@types/react@19.1.8)(solid-js@1.9.7)': dependencies: - '@kixelated/moq': 0.6.1 - '@kixelated/signals': 0.3.0(@types/react@19.1.8)(solid-js@1.9.7) + '@kixelated/moq': 0.7.0 + '@kixelated/signals': 0.3.1(@types/react@19.1.8)(solid-js@1.9.7) buffer: 6.0.3 solid-js: 1.9.7 - zod: 3.25.67 + zod: 3.25.76 transitivePeerDependencies: - '@types/react' - react - '@kixelated/moq@0.6.1': - dependencies: - buffer: 6.0.3 + '@kixelated/moq@0.7.0': {} - '@kixelated/signals@0.3.0(@types/react@19.1.8)(solid-js@1.9.7)': + '@kixelated/signals@0.3.1(@types/react@19.1.8)(solid-js@1.9.7)': dependencies: '@types/react': 19.1.8 dequal: 2.0.3 @@ -3349,8 +3244,6 @@ snapshots: - uploadthing - yaml - asynckit@0.4.0: {} - autoprefixer@10.4.21(postcss@8.5.4): dependencies: browserslist: 4.25.0 @@ -3361,14 +3254,6 @@ snapshots: postcss: 8.5.4 postcss-value-parser: 4.2.0 - axios@1.9.0(debug@4.4.1): - dependencies: - follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.2 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axobject-query@4.1.0: {} babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.27.4): @@ -3433,11 +3318,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - camelcase-css@2.0.1: {} camelcase@8.0.0: {} @@ -3500,10 +3380,6 @@ snapshots: color-string: 1.9.1 optional: true - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - comma-separated-tokens@2.0.3: {} commander@4.1.1: {} @@ -3551,8 +3427,6 @@ snapshots: defu@6.1.4: {} - delayed-stream@1.0.0: {} - depd@2.0.0: {} dequal@2.0.3: {} @@ -3582,12 +3456,6 @@ snapshots: dset@3.1.4: {} - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -3604,23 +3472,8 @@ snapshots: entities@6.0.0: {} - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - esast-util-from-estree@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -3738,10 +3591,6 @@ snapshots: flattie@1.1.1: {} - follow-redirects@1.15.9(debug@4.4.1): - optionalDependencies: - debug: 4.4.1 - fontace@0.3.0: dependencies: '@types/fontkit': 2.0.8 @@ -3764,13 +3613,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 - fraction.js@4.3.7: {} fresh@2.0.0: {} @@ -3790,24 +3632,6 @@ snapshots: get-east-asian-width@1.3.0: {} - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -3829,8 +3653,6 @@ snapshots: globals@11.12.0: {} - gopd@1.2.0: {} - graceful-fs@4.2.11: {} h3@1.15.3: @@ -3845,12 +3667,6 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -4117,8 +3933,6 @@ snapshots: markdown-table@3.0.4: {} - math-intrinsics@1.1.0: {} - mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.4 @@ -4565,14 +4379,8 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - mime-db@1.54.0: {} - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mime-types@3.0.1: dependencies: mime-db: 1.54.0 @@ -4755,8 +4563,6 @@ snapshots: property-information@7.1.0: {} - proxy-from-env@1.1.0: {} - queue-microtask@1.2.3: {} radix3@1.1.2: {} @@ -5307,15 +5113,6 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-plugin-mkcert@1.17.8(vite@6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0)): - dependencies: - axios: 1.9.0(debug@4.4.1) - debug: 4.4.1 - picocolors: 1.1.1 - vite: 6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0) - transitivePeerDependencies: - - supports-color - vite-plugin-solid@2.11.6(solid-js@1.9.7)(vite@6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0)): dependencies: '@babel/core': 7.27.4 @@ -5338,10 +5135,6 @@ snapshots: picocolors: 1.1.1 vite: 6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0) - vite-plugin-wasm@3.4.1(vite@6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0)): - dependencies: - vite: 6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0) - vite@6.3.5(@types/node@22.15.29)(jiti@1.21.7)(yaml@2.8.0): dependencies: esbuild: 0.25.5 @@ -5424,6 +5217,6 @@ snapshots: zod@3.25.51: {} - zod@3.25.67: {} + zod@3.25.76: {} zwitch@2.0.4: {} diff --git a/src/components/publish.tsx b/src/components/publish.tsx index 295bab6..e110ab8 100644 --- a/src/components/publish.tsx +++ b/src/components/publish.tsx @@ -5,9 +5,7 @@ import "@kixelated/hang/publish/element"; export default function () { const name = uniqueNamesGenerator({ dictionaries: [adjectives, animals], separator: "-" }); - const url = new URL( - `${import.meta.env.PUBLIC_RELAY_SCHEME}://${import.meta.env.PUBLIC_RELAY_HOST}/anon/${name}.hang`, - ); + const url = new URL(`${import.meta.env.PUBLIC_RELAY_URL}/anon`); return (
@@ -19,7 +17,7 @@ export default function () {

Preview:

- +