diff --git a/.env.production b/.env.production index 78d6f0b..a0ca6c7 100644 --- a/.env.production +++ b/.env.production @@ -1,3 +1,3 @@ PUBLIC_RELAY_URL="https://relay.quic.video" # Generate with: cargo run --bin moq-token -- --key root.jwk sign --root "demo" --subscribe "" -PUBLIC_RELAY_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb290IjoiZGVtbyIsInB1YiI6bnVsbCwic3ViIjoiIiwiZXhwIjpudWxsLCJpYXQiOm51bGx9.w6NCqef736qNYCC1KAovUbTaJb8bvHnY-QwXZ_p3vTw" +PUBLIC_RELAY_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb290IjoiZGVtbyIsImdldCI6WyIiXSwiZXhwIjpudWxsLCJpYXQiOm51bGx9.6EoN-Y1Ouj35_qV5FokcdcdderrE2navNbYQjJyR2Ac" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index f31222b..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: main - -on: - push: - branches: ["main"] - -env: - REGISTRY: docker.io - IMAGE: ${{ github.repository }} - SERVICE: web - -jobs: - deploy: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - id-token: write - - # Only one release at a time and cancel prior releases - concurrency: - group: release - cancel-in-progress: true - - steps: - - uses: actions/checkout@v4 - - # I'm paying for Depot for faster ARM builds. - - uses: depot/setup-action@v1 - - # Log into the docker registry via the GCP token - - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - # Build and push Docker image with Depot - - uses: docker/build-push-action@v3 - id: docker - with: - context: . - push: true - tags: ${{env.REGISTRY}}/${{env.IMAGE}} - - # Log in to GCP - - uses: google-github-actions/auth@v1 - with: - credentials_json: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }} - - # Deploy to cloud run - - uses: google-github-actions/deploy-cloudrun@v1 - with: - service: web - image: ${{env.REGISTRY}}/${{env.IMAGE}}@${{steps.docker.outputs.digest}} diff --git a/.gitignore b/.gitignore index 22399fa..d68d7f5 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,7 @@ bun.lockb .env.production *.jwt *.jwk + +# Cloudflare +.wrangler/ +.dev.vars diff --git a/CLAUDE.md b/CLAUDE.md index b51d654..c024ad5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## 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. +moq.dev 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 diff --git a/README.md b/README.md index f2ccbfe..b18bdfa 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@

- Media over QUIC + Media over QUIC

-This repository contains the code for [quic.video](https://quic.video). +This repository contains the code for [moq.dev](https://moq.dev). This is a client only. -You'll either need to run a local server using [moq-rs](https://github.com/kixelated/moq-rs) or use a public server such as [relay.quic.video](https://quic.video/relay). +You'll either need to run a local server using [moq-rs](https://github.com/kixelated/moq-rs) or use a public server such as [relay.moq.dev](https://moq.dev/relay). Join the [Discord](https://discord.gg/FCYF3p99mr) for updates and discussion. diff --git a/astro.config.ts b/astro.config.ts index ee0ee7b..dd3656c 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -1,14 +1,14 @@ import fs from "node:fs"; import path from "node:path"; import mdx from "@astrojs/mdx"; -import nodejs from "@astrojs/node"; import solidJs from "@astrojs/solid-js"; import tailwind from "@astrojs/tailwind"; import { defineConfig } from "astro/config"; // https://astro.build/config export default defineConfig({ - site: "https://quic.video", + site: "https://moq.dev", + output: "static", integrations: [ mdx(), solidJs(), @@ -17,10 +17,6 @@ export default defineConfig({ applyBaseStyles: false, }), ], - // Renders any non-static pages using node - adapter: nodejs({ - mode: "standalone", - }), vite: { build: { target: "esnext", diff --git a/infra/.terraform.lock.hcl b/infra/.terraform.lock.hcl index 8f74aff..e6ad5ed 100644 --- a/infra/.terraform.lock.hcl +++ b/infra/.terraform.lock.hcl @@ -3,7 +3,7 @@ provider "registry.opentofu.org/hashicorp/google" { version = "5.45.2" - constraints = ">= 4.50.0, ~> 5.0, < 6.0.0" + constraints = "~> 5.0" hashes = [ "h1:YEQOp7Ou1+GtpcKyCX6Cr/mAGqKIogpi85MX51GuG4s=", "zh:0931f08e81f220ae3132169cfa4ed8e9d8d2045f29ca914afd8ee9e3e9cf56e0", @@ -20,8 +20,7 @@ provider "registry.opentofu.org/hashicorp/google" { } provider "registry.opentofu.org/hashicorp/google-beta" { - version = "5.45.2" - constraints = ">= 4.50.0, < 6.0.0" + version = "5.45.2" hashes = [ "h1:D157MMCsE8DIpK60goSgECYMsWfJb+E2ZH7bDSLSVG4=", "zh:2df6e40591ceee7ee77d429ea072c9d51fef2dd04015b2604ff332a2af4ac819", @@ -37,24 +36,6 @@ provider "registry.opentofu.org/hashicorp/google-beta" { ] } -provider "registry.opentofu.org/hashicorp/random" { - version = "3.7.1" - constraints = ">= 2.1.0" - hashes = [ - "h1:mV0IpNNTXywcEHuCRfvvjsaaVPPDFRrH7YQmd7/FD24=", - "zh:1011387a5127d46e2bf0bd5124a8469506272b2110613d9eb80d178f94bd67a9", - "zh:28785c36d6dc331d49e8bf6a30d4ba21ae4378f5d98c43c0aeb42f51efb2e42f", - "zh:50fc0e52f0255950404681455420344a16263f91622bd481954606e6e3be9eb2", - "zh:563f22c53f40e41cfffdcfac32a9292292c10582183c3f1dd85770cf806bfce9", - "zh:586a5615898d369374d4bd7d70bc013cffe7553d3e14638f169a3f745665fee1", - "zh:6275f6e5697993048ac088715484a9a5e919682651e098a5ac31e567216bf102", - "zh:95a44bb3f012da1e036936d60df2d08f5942a96cb912fc23432d2ee050857527", - "zh:a5fe6b0e586645a88d98738739fec40fd7ad83dbc63fe66ff6327aee2dc07f11", - "zh:ea57886899b6baf466f3ff978f4482d2fd7fa049c42509cc819431375cddd5bd", - "zh:f021cfbe23bdb32738f170c1ae736ffb769a2fa3dcafd0f9906155c2e21377e4", - ] -} - provider "registry.opentofu.org/hashicorp/tls" { version = "4.0.6" hashes = [ diff --git a/infra/domain.tf b/infra/domain.tf index 63a3e01..6e44067 100644 --- a/infra/domain.tf +++ b/infra/domain.tf @@ -1,21 +1,7 @@ // Set up a DNS zone for our domain. -resource "google_dns_managed_zone" "public" { - name = "public" - dns_name = "${var.domain}." -} - -// Create a managed certificate for the domain. -resource "google_compute_managed_ssl_certificate" "root" { - name = "root" - description = "Cert for ${var.domain}." - - managed { - domains = ["${var.domain}."] - } - - lifecycle { - create_before_destroy = true - } +resource "google_dns_managed_zone" "relay" { + name = "relay" + dns_name = "relay.${var.domain}." } // We also need an unmanaged certificate for the relay, since there's no QUIC LBs available yet. @@ -39,13 +25,13 @@ resource "acme_certificate" "relay" { subject_alternative_names = ["*.relay.${var.domain}"] key_type = tls_private_key.relay.ecdsa_curve - recursive_nameservers = ["8.8.8.8:53"] + revoke_certificate_on_destroy = false dns_challenge { provider = "gcloud" - config = { GCE_PROJECT = var.project + GCE_ZONE_ID = google_dns_managed_zone.relay.name } } } diff --git a/infra/input.tf b/infra/input.tf index b3c65ff..6e71623 100644 --- a/infra/input.tf +++ b/infra/input.tf @@ -15,22 +15,32 @@ variable "zone" { variable "email" { description = "Your email address, used for LetsEncrypt" - default = "kixelated@gmail.com" + default = "admin@moq.dev" } variable "domain" { description = "domain name" - default = "quic.video" + default = "moq.dev" } variable "docker_relay" { description = "Docker image for moq-relay" - default = "docker.io/kixelated/moq-relay:0.8.7" + default = "docker.io/kixelated/moq-relay:0.8.8" } variable "docker_hang" { description = "Docker image for hang" - default = "docker.io/kixelated/hang:0.2.4" + default = "docker.io/kixelated/hang:0.2.5" +} + +variable "cloudflare_dns_token" { + description = "Cloudflare DNS API token - edit permissions for moq.dev" + sensitive = true +} + +variable "cloudflare_zone_token" { + description = "Cloudflare Zone API token - read permissions for all zones" + sensitive = true } # Too complicated to specify via flags, so do it here. diff --git a/infra/main.tf b/infra/main.tf index 90205bc..99bd500 100644 --- a/infra/main.tf +++ b/infra/main.tf @@ -33,12 +33,7 @@ variable "gcp_service_list" { "storage.googleapis.com", "compute.googleapis.com", "dns.googleapis.com", - "appengine.googleapis.com", "iamcredentials.googleapis.com", - "sourcerepo.googleapis.com", - "run.googleapis.com", - "vpcaccess.googleapis.com", - "redis.googleapis.com", ] } diff --git a/infra/output.tf b/infra/output.tf new file mode 100644 index 0000000..b7c7be2 --- /dev/null +++ b/infra/output.tf @@ -0,0 +1,4 @@ + output "relay_nameservers" { + value = google_dns_managed_zone.relay.name_servers + description = "Add these as NS records in Cloudflare for relay.moq.dev" + } diff --git a/infra/pub.yml.tpl b/infra/pub.yml.tpl index e3b62f5..0a81269 100644 --- a/infra/pub.yml.tpl +++ b/infra/pub.yml.tpl @@ -56,7 +56,7 @@ write_files: --cap-add=SYS_PTRACE \ -e RUST_LOG=debug -e RUST_BACKTRACE=1 \ ${docker_image} \ - publish --url https://relay.quic.video/demo?jwt=${demo_token} --name bbb' + publish --url https://relay.moq.dev/demo?jwt=${demo_token} --name bbb' ExecStop=docker stop hang-bbb diff --git a/infra/relay-lb.tf b/infra/relay-lb.tf index bb4f172..1b833c7 100644 --- a/infra/relay-lb.tf +++ b/infra/relay-lb.tf @@ -1,9 +1,9 @@ # Global Geo DNS, routing to the closest region. resource "google_dns_record_set" "relay_global" { - name = "relay.${var.domain}." + name = google_dns_managed_zone.relay.dns_name + managed_zone = google_dns_managed_zone.relay.name type = "A" ttl = 60 - managed_zone = google_dns_managed_zone.public.name routing_policy { dynamic "geo" { @@ -26,10 +26,10 @@ resource "google_dns_record_set" "relay_global" { /* # Get a domain name for the anycast address. resource "google_dns_record_set" "relay_lb" { - name = "relay.quic.video." + name = "relay.moq.dev." type = "A" ttl = 300 - managed_zone = google_dns_managed_zone.public.name + managed_zone = google_dns_managed_zone.relay.name rrdatas = [google_compute_global_forwarding_rule.relay_lb.ip_address] } diff --git a/infra/relay.tf b/infra/relay.tf index 9918657..ea8b974 100644 --- a/infra/relay.tf +++ b/infra/relay.tf @@ -82,10 +82,10 @@ resource "google_compute_address" "relay" { resource "google_dns_record_set" "relay" { for_each = local.relays - name = "${each.key}.relay.${var.domain}." + name = "${each.key}.${google_dns_managed_zone.relay.dns_name}" + managed_zone = google_dns_managed_zone.relay.name type = "A" ttl = 300 - managed_zone = google_dns_managed_zone.public.name rrdatas = [google_compute_address.relay[each.key].address] } diff --git a/infra/web.tf b/infra/web.tf deleted file mode 100644 index 4a71788..0000000 --- a/infra/web.tf +++ /dev/null @@ -1,90 +0,0 @@ -# Host a mostly-static website on Cloud Run. -resource "google_cloud_run_v2_service" "web" { - name = "web" - location = var.region - ingress = "INGRESS_TRAFFIC_INTERNAL_LOAD_BALANCER" - - template { - containers { - image = "docker.io/kixelated/quic.video" - } - } - - traffic { - type = "TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST" - percent = 100 - } -} - -# Create a HTTPS load balancer that points to the web service. -module "web_lb" { - source = "GoogleCloudPlatform/lb-http/google//modules/serverless_negs" - version = "~> 9.0" - - project = var.project - name = "web" - - ssl = true - managed_ssl_certificate_domains = [var.domain] - https_redirect = true - backends = { - default = { - protocol = "HTTP" - custom_response_headers = ["Cross-Origin-Opener-Policy: same-origin", "Cross-Origin-Embedder-Policy: require-corp"] - - groups = [ - { - group = google_compute_region_network_endpoint_group.web.id - } - ] - - iap_config = { - enable = false - } - - log_config = { - enable = false - } - - enable_cdn = true - cdn_policy = { - cache_mode = "USE_ORIGIN_HEADERS" - cache_key_policy = { - include_query_string = false - } - - # Allow serving stale content up to a minute old while revalidating with origin. - # The next page refresh will likely be served from the new cache. - serve_while_stale = 60 - } - } - } -} - -# Create a network endpoint group that points to the web service. -resource "google_compute_region_network_endpoint_group" "web" { - name = "web" - network_endpoint_type = "SERVERLESS" - region = var.region - cloud_run { - service = google_cloud_run_v2_service.web.name - } -} - -// Create a DNS record that points to the web load balancer. -resource "google_dns_record_set" "web" { - managed_zone = google_dns_managed_zone.public.name - name = "${var.domain}." - type = "A" - ttl = 600 - - rrdatas = [module.web_lb.external_ip] -} - -// Make it public -resource "google_cloud_run_service_iam_policy" "web" { - service = google_cloud_run_v2_service.web.name - location = google_cloud_run_v2_service.web.location - project = google_cloud_run_v2_service.web.project - policy_data = data.google_iam_policy.noauth.policy_data -} diff --git a/justfile b/justfile new file mode 100644 index 0000000..c76eebd --- /dev/null +++ b/justfile @@ -0,0 +1,64 @@ +#!/usr/bin/env just --justfile + +# Using Just: https://github.com/casey/just?tab=readme-ov-file#installation + +# List all of the available commands. +default: + just --list + +# Run the CI checks +check: + pnpm i + + # Lint the JS packages + pnpm exec biome check + + # Make sure Typescript compiles + pnpm run check + + # Make sure the JS packages are not vulnerable + # pnpm exec pnpm audit + + # TODO: Check for unused imports (fix the false positives) + # pnpm exec knip --no-exit-code + +# Automatically fix some issues. +fix: + # Fix the JS packages + pnpm i + + # Format and lint + pnpm exec biome check --fix + + # Some additional linting. + pnpm exec eslint . --fix + + # Make sure the JS packages are not vulnerable + # pnpm exec pnpm audit --fix + +# Run any CI tests +test: + # Run the JS tests via node. + pnpm test + +# Upgrade any tooling +upgrade: + # Update the NPM dependencies + pnpm self-update + pnpm update + pnpm outdated + +# Build the packages +build: + pnpm i + pnpm astro build + +# Deploy the site to Cloudflare Pages +deploy: build + pnpm wrangler deploy + +dev: + pnpm i + + # Run the web development server + pnpm astro dev --open diff --git a/package.json b/package.json index eac46d8..44db2c8 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,35 @@ { - "name": "quic.video", + "name": "moq.dev", "type": "module", "version": "0.0.1", "private": true, "scripts": { "dev": "astro dev --open", "build": "astro build --production", - "prod": "astro build --production && astro preview --production --open", + "preview": "wrangler pages dev ./dist", + "deploy": "wrangler deploy", + "prod": "astro build --production && wrangler pages dev ./dist --open", "check": "biome ci && tsc --noEmit", "fix": "biome check --write && pnpm audit fix" }, "dependencies": { + "@kixelated/hang": "^0.3.9", + "astro": "^5.8.2", + "solid-js": "^1.9.7", + "unique-names-generator": "^4.7.1" + }, + "devDependencies": { + "@biomejs/biome": "2.0.5", + "vite-plugin-static-copy": "^2.3.1", "@astrojs/mdx": "4.3.0", - "@astrojs/node": "9.2.2", "@astrojs/rss": "^4.0.12", "@astrojs/solid-js": "5.1.0", "@astrojs/tailwind": "6.0.2", - "@kixelated/hang": "^0.3.8", "@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-static-copy": "^2.3.1" - }, - "devDependencies": { - "@biomejs/biome": "2.0.5", - "@types/node": "^22.15.29" + "@types/node": "^22.15.29", + "wrangler": "^4.29.1" }, "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b2f784..5dc3f10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,22 @@ importers: .: dependencies: + '@kixelated/hang': + specifier: ^0.3.9 + version: 0.3.9(@types/react@19.1.9)(solid-js@1.9.7) + astro: + specifier: ^5.8.2 + version: 5.8.2(@types/node@22.15.29)(jiti@1.21.7)(rollup@4.41.1)(typescript@5.8.3)(yaml@2.8.0) + solid-js: + specifier: ^1.9.7 + version: 1.9.7 + unique-names-generator: + specifier: ^4.7.1 + version: 4.7.1 + devDependencies: '@astrojs/mdx': specifier: 4.3.0 version: 4.3.0(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)) - '@astrojs/node': - specifier: 9.2.2 - version: 9.2.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)) '@astrojs/rss': specifier: ^4.0.12 version: 4.0.12 @@ -23,37 +33,27 @@ importers: '@astrojs/tailwind': 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.3.8 - version: 0.3.8(@types/react@19.1.9)(solid-js@1.9.7) + '@biomejs/biome': + specifier: 2.0.5 + version: 2.0.5 '@tailwindcss/forms': specifier: ^0.5.10 version: 0.5.10(tailwindcss@3.4.17) '@tailwindcss/typography': specifier: ^0.5.16 version: 0.5.16(tailwindcss@3.4.17) - astro: - specifier: ^5.8.2 - version: 5.8.2(@types/node@22.15.29)(jiti@1.21.7)(rollup@4.41.1)(typescript@5.8.3)(yaml@2.8.0) - solid-js: - specifier: ^1.9.7 - version: 1.9.7 + '@types/node': + specifier: ^22.15.29 + version: 22.15.29 tailwindcss: specifier: ^3.4.17 version: 3.4.17 - unique-names-generator: - specifier: ^4.7.1 - version: 4.7.1 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)) - devDependencies: - '@biomejs/biome': - specifier: 2.0.5 - version: 2.0.5 - '@types/node': - specifier: ^22.15.29 - version: 22.15.29 + wrangler: + specifier: ^4.29.1 + version: 4.29.1(@cloudflare/workers-types@4.20250813.0) packages: @@ -80,11 +80,6 @@ packages: peerDependencies: astro: ^5.0.0 - '@astrojs/node@9.2.2': - resolution: {integrity: sha512-PtLPuuojmcl9O3CEvXqL/D+wB4x5DlbrGOvP0MeTAh/VfKFprYAzgw1+45xsnTO+QvPWb26l1cT+ZQvvohmvMw==} - peerDependencies: - astro: ^5.3.0 - '@astrojs/prism@3.3.0': resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} @@ -245,156 +240,356 @@ packages: '@capsizecss/unpack@2.4.0': resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + + '@cloudflare/unenv-preset@2.6.1': + resolution: {integrity: sha512-48rC6jo9CkSRkImfu5KU4zKyoPJx7b9GTUpZn0Emr6J+jkmrLhwCY3BI10QS+fhOt1NkJNlxIcYrBgvWeCpKOw==} + peerDependencies: + unenv: 2.0.0-rc.19 + workerd: ^1.20250802.0 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20250813.0': + resolution: {integrity: sha512-Pka37/jqLy7ZaQlwpBy79A/BLH+qpRPSEX2h/zWND+qRfoCVCCaZQPdknHZO0pcvHPzK8E2Z4j5QI1IafPA5UA==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20250813.0': + resolution: {integrity: sha512-QnaJbmhcA32+4uZ+or1hXZjdxGqrFUuh6Ye+skEGu3iB/xzq9CmyVyoKoshiUOcWGKndQb7KRo56dq0bVvVLFw==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20250813.0': + resolution: {integrity: sha512-6pokgBQmujJsAuqOme2wBX5ol/1YW3d7kV7wp0Y1/tFi46TnmWcEy08B4FD5t2AARQJ68a7XMxIJKWChcaJ9Cg==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20250813.0': + resolution: {integrity: sha512-lFwqohi8fkR98OwjHT69sbThx4BJem7vu6N8kqrge7wuKJWrMDNbzOTdyBA8adV9DmE07ELuN2vcbbu8ZjaL2Q==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20250813.0': + resolution: {integrity: sha512-Fs62NvUajtoXb+4W8jaRXzw64Nbmb8X+PbRLZbxUFv68sGhxKPw1nB1YEmNNZ215ma47hTlSdF3UQh4FOmz7NA==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20250813.0': + resolution: {integrity: sha512-RFFjomDndGR+p7ug1HWDlW21qOJyRZbmI99dUtuR9tmwJbSZhUUnSFmzok9lBYVfkMMrO1O5vmB+IlgiecgLEA==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.5': resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.5': resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.5': resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.5': resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.5': resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.5': resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.5': resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.5': resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.5': resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.5': resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.5': resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.5': resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.5': resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.5': resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.5': resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.5': resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.5': resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.25.5': resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.5': resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.25.5': resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.5': resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.5': resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.5': resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.5': resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.5': resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} @@ -661,14 +856,17 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@kixelated/hang@0.3.8': - resolution: {integrity: sha512-4dT2RwHOBqREhlIWkd4u6sYnh086zYXDLcrU+Xdzs1QZR/ij2d0AIiTp7X1t797Xk7MNMGOMxip35zSqdVBWDg==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@kixelated/moq@0.7.3': - resolution: {integrity: sha512-tbiY7SaIA0jdwWI2hih+aH1Kn/vK4hZHVfamT+J9SARRdEONOFJ/Y3vK3OIZB52LLNjB6+iGE35xrhd/dFFYpQ==} + '@kixelated/hang@0.3.9': + resolution: {integrity: sha512-V1SEwZTg7NeEaVMVkBmosQUKRtwBf+l9Pb5qMHA7sTOUhSw/zJddo/DzWk5AVzFbkD06aH1dVlttv/YrIyi6Wg==} - '@kixelated/signals@0.5.3': - resolution: {integrity: sha512-wfy6asUobO0e3eJ0M//drB8yG+cTg9U22TBFljmNgH7Ci5kbOdhyNOaLycG8+IKVMszf7EtyhfbD6OrirEy8kA==} + '@kixelated/moq@0.7.4': + resolution: {integrity: sha512-sAkRMxEPofRGl+MLs7EOunKjBKxGsaVcGFDrawUakaa2KwTEpqiej/e27kxWWh7jzD4OcQ+oVyRVsNoynGiscQ==} + + '@kixelated/signals@0.5.4': + resolution: {integrity: sha512-Llm0tUHWYkFTMVJuv5l4JKjva3ekaUKjn/1Qly1UEZxEMy3a1SVm7zXQ+ctvHJTQARz2Z/UPea8joXxi9zZxlw==} peerDependencies: '@types/react': ^19.1.8 react: ^19.0.0 @@ -701,6 +899,15 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + + '@poppinss/dumper@0.6.4': + resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} + + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -861,6 +1068,13 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sindresorhus/is@7.0.2': + resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} @@ -933,6 +1147,15 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} @@ -1023,6 +1246,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + blob-to-buffer@1.2.9: resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} @@ -1127,6 +1353,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + comlink@4.4.2: + resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1192,10 +1421,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1240,9 +1465,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.165: resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==} @@ -1255,14 +1477,13 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - entities@6.0.0: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1283,6 +1504,11 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.25.5: resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} @@ -1292,9 +1518,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1327,13 +1550,16 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1383,10 +1609,6 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - fs-extra@11.3.0: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} @@ -1418,6 +1640,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -1502,19 +1727,12 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} @@ -1839,18 +2057,20 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true + miniflare@4.20250813.0: + resolution: {integrity: sha512-PsAGaNpdKXZvnaOvw2dpWWszhHtOX5ZwHLf7fEtW/g6QBSzdS707vFFbBBaew63hcpgo33CbuXZc0Z0P/5jNWQ==} + engines: {node: '>=18.0.0'} + hasBin: true + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -1934,10 +2154,6 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} @@ -2002,6 +2218,12 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2093,10 +2315,6 @@ packages: radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -2211,10 +2429,6 @@ packages: engines: {node: '>=10'} hasBin: true - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} - serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} @@ -2229,12 +2443,6 @@ packages: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} - server-destroy@1.0.1: - resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2290,9 +2498,9 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -2331,6 +2539,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@10.1.0: + resolution: {integrity: sha512-GBuewsPrhJPftT+fqDa9oI/zc5HNsG9nREqwzoSFDOIqf0NggOZbHQj2TE1P1CDJK8ZogFnlZY9hWoUiur7I/A==} + engines: {node: '>=18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2365,10 +2577,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -2419,6 +2627,13 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@7.13.0: + resolution: {integrity: sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==} + engines: {node: '>=20.18.1'} + + unenv@2.0.0-rc.19: + resolution: {integrity: sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==} + unicode-properties@1.4.1: resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} @@ -2635,6 +2850,21 @@ packages: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} + workerd@1.20250813.0: + resolution: {integrity: sha512-bDlPGSnb/KESpGFE57cDjgP8mEKDM4WBTd/uGJBsQYCB6Aokk1eK3ivtHoxFx3MfJNo3v6/hJy6KK1b6rw1gvg==} + engines: {node: '>=16'} + hasBin: true + + wrangler@4.29.1: + resolution: {integrity: sha512-PAGFQ6SS3fbpu0wrc4zO9wHYKWqIo7KmoAe66LGS3QdP3318O+dF1jL4d/kwNaj9Gh7HYQeGnTjeihqnhp9YWQ==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20250813.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2647,6 +2877,18 @@ packages: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} @@ -2678,6 +2920,12 @@ packages: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + zod-to-json-schema@3.24.5: resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} peerDependencies: @@ -2689,6 +2937,9 @@ packages: typescript: ^4.9.4 || ^5.0.2 zod: ^3 + zod@3.22.3: + resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + zod@3.25.51: resolution: {integrity: sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==} @@ -2756,15 +3007,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@9.2.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))': - dependencies: - '@astrojs/internal-helpers': 0.6.1 - 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) - send: 1.2.0 - server-destroy: 1.0.1 - transitivePeerDependencies: - - supports-color - '@astrojs/prism@3.3.0': dependencies: prismjs: 1.30.0 @@ -2968,6 +3210,38 @@ snapshots: transitivePeerDependencies: - encoding + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + + '@cloudflare/unenv-preset@2.6.1(unenv@2.0.0-rc.19)(workerd@1.20250813.0)': + dependencies: + unenv: 2.0.0-rc.19 + optionalDependencies: + workerd: 1.20250813.0 + + '@cloudflare/workerd-darwin-64@1.20250813.0': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20250813.0': + optional: true + + '@cloudflare/workerd-linux-64@1.20250813.0': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20250813.0': + optional: true + + '@cloudflare/workerd-windows-64@1.20250813.0': + optional: true + + '@cloudflare/workers-types@4.20250813.0': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 @@ -2978,78 +3252,153 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.25.4': + optional: true + '@esbuild/aix-ppc64@0.25.5': optional: true + '@esbuild/android-arm64@0.25.4': + optional: true + '@esbuild/android-arm64@0.25.5': optional: true + '@esbuild/android-arm@0.25.4': + optional: true + '@esbuild/android-arm@0.25.5': optional: true + '@esbuild/android-x64@0.25.4': + optional: true + '@esbuild/android-x64@0.25.5': optional: true + '@esbuild/darwin-arm64@0.25.4': + optional: true + '@esbuild/darwin-arm64@0.25.5': optional: true + '@esbuild/darwin-x64@0.25.4': + optional: true + '@esbuild/darwin-x64@0.25.5': optional: true + '@esbuild/freebsd-arm64@0.25.4': + optional: true + '@esbuild/freebsd-arm64@0.25.5': optional: true + '@esbuild/freebsd-x64@0.25.4': + optional: true + '@esbuild/freebsd-x64@0.25.5': optional: true + '@esbuild/linux-arm64@0.25.4': + optional: true + '@esbuild/linux-arm64@0.25.5': optional: true + '@esbuild/linux-arm@0.25.4': + optional: true + '@esbuild/linux-arm@0.25.5': optional: true + '@esbuild/linux-ia32@0.25.4': + optional: true + '@esbuild/linux-ia32@0.25.5': optional: true + '@esbuild/linux-loong64@0.25.4': + optional: true + '@esbuild/linux-loong64@0.25.5': optional: true + '@esbuild/linux-mips64el@0.25.4': + optional: true + '@esbuild/linux-mips64el@0.25.5': optional: true + '@esbuild/linux-ppc64@0.25.4': + optional: true + '@esbuild/linux-ppc64@0.25.5': optional: true + '@esbuild/linux-riscv64@0.25.4': + optional: true + '@esbuild/linux-riscv64@0.25.5': optional: true + '@esbuild/linux-s390x@0.25.4': + optional: true + '@esbuild/linux-s390x@0.25.5': optional: true + '@esbuild/linux-x64@0.25.4': + optional: true + '@esbuild/linux-x64@0.25.5': optional: true + '@esbuild/netbsd-arm64@0.25.4': + optional: true + '@esbuild/netbsd-arm64@0.25.5': optional: true + '@esbuild/netbsd-x64@0.25.4': + optional: true + '@esbuild/netbsd-x64@0.25.5': optional: true + '@esbuild/openbsd-arm64@0.25.4': + optional: true + '@esbuild/openbsd-arm64@0.25.5': optional: true + '@esbuild/openbsd-x64@0.25.4': + optional: true + '@esbuild/openbsd-x64@0.25.5': optional: true + '@esbuild/sunos-x64@0.25.4': + optional: true + '@esbuild/sunos-x64@0.25.5': optional: true + '@esbuild/win32-arm64@0.25.4': + optional: true + '@esbuild/win32-arm64@0.25.5': optional: true + '@esbuild/win32-ia32@0.25.4': + optional: true + '@esbuild/win32-ia32@0.25.5': optional: true + '@esbuild/win32-x64@0.25.4': + optional: true + '@esbuild/win32-x64@0.25.5': optional: true @@ -3253,21 +3602,27 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@kixelated/hang@0.3.8(@types/react@19.1.9)(solid-js@1.9.7)': + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@kixelated/hang@0.3.9(@types/react@19.1.9)(solid-js@1.9.7)': dependencies: '@huggingface/transformers': 3.7.1 - '@kixelated/moq': 0.7.3 - '@kixelated/signals': 0.5.3(@types/react@19.1.9)(solid-js@1.9.7) + '@kixelated/moq': 0.7.4 + '@kixelated/signals': 0.5.4(@types/react@19.1.9)(solid-js@1.9.7) buffer: 6.0.3 + comlink: 4.4.2 zod: 4.0.14 transitivePeerDependencies: - '@types/react' - react - solid-js - '@kixelated/moq@0.7.3': {} + '@kixelated/moq@0.7.4': {} - '@kixelated/signals@0.5.3(@types/react@19.1.9)(solid-js@1.9.7)': + '@kixelated/signals@0.5.4(@types/react@19.1.9)(solid-js@1.9.7)': dependencies: '@types/react': 19.1.9 dequal: 2.0.3 @@ -3321,6 +3676,18 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.4': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.0.2 + supports-color: 10.1.0 + + '@poppinss/exception@1.2.2': {} + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -3445,6 +3812,10 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sindresorhus/is@7.0.2': {} + + '@speed-highlight/core@1.2.7': {} + '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 @@ -3531,6 +3902,10 @@ snapshots: dependencies: acorn: 8.14.1 + acorn-walk@8.3.2: {} + + acorn@8.14.0: {} + acorn@8.14.1: {} ansi-align@3.0.1: @@ -3701,6 +4076,8 @@ snapshots: binary-extensions@2.3.0: {} + blake3-wasm@2.1.5: {} + blob-to-buffer@1.2.9: {} boolean@3.2.0: {} @@ -3802,6 +4179,8 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 + comlink@4.4.2: {} + comma-separated-tokens@2.0.3: {} commander@4.1.1: {} @@ -3861,8 +4240,6 @@ snapshots: defu@6.1.4: {} - depd@2.0.0: {} - dequal@2.0.3: {} destr@2.0.5: {} @@ -3893,8 +4270,6 @@ snapshots: eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} - electron-to-chromium@1.5.165: {} emoji-regex@10.4.0: {} @@ -3903,10 +4278,10 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@2.0.0: {} - entities@6.0.0: {} + error-stack-parser-es@1.0.5: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -3929,6 +4304,34 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + esbuild@0.25.5: optionalDependencies: '@esbuild/aix-ppc64': 0.25.5 @@ -3959,8 +4362,6 @@ snapshots: escalade@3.2.0: {} - escape-html@1.0.3: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -4000,10 +4401,12 @@ snapshots: dependencies: '@types/estree': 1.0.7 - etag@1.8.1: {} - eventemitter3@5.0.1: {} + exit-hook@2.2.1: {} + + exsolve@1.0.7: {} + extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -4060,8 +4463,6 @@ snapshots: fraction.js@4.3.7: {} - fresh@2.0.0: {} - fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 @@ -4087,6 +4488,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -4274,20 +4677,10 @@ snapshots: http-cache-semantics@4.2.0: {} - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - ieee754@1.2.1: {} import-meta-resolve@4.1.0: {} - inherits@2.0.4: {} - inline-style-parser@0.2.4: {} iron-webcrypto@1.2.1: {} @@ -4853,14 +5246,28 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.54.0: {} - - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 + mime@3.0.0: {} mini-svg-data-uri@1.4.4: {} + miniflare@4.20250813.0: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + sharp: 0.33.5 + stoppable: 1.1.0 + undici: 7.13.0 + workerd: 1.20250813.0 + ws: 8.18.0 + youch: 4.1.0-beta.10 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -4919,10 +5326,6 @@ snapshots: ohash@2.0.11: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - oniguruma-parser@0.12.1: {} oniguruma-to-es@4.3.3: @@ -5001,6 +5404,10 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@6.3.0: {} + + pathe@2.0.3: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -5085,8 +5492,6 @@ snapshots: radix3@1.1.2: {} - range-parser@1.2.1: {} - read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -5298,22 +5703,6 @@ snapshots: semver@7.7.2: {} - send@1.2.0: - dependencies: - debug: 4.4.1 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - serialize-error@7.0.1: dependencies: type-fest: 0.13.1 @@ -5324,10 +5713,6 @@ snapshots: seroval@1.3.2: {} - server-destroy@1.0.1: {} - - setprototypeof@1.2.0: {} - sharp@0.33.5: dependencies: color: 4.2.3 @@ -5353,7 +5738,6 @@ snapshots: '@img/sharp-wasm32': 0.33.5 '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - optional: true sharp@0.34.3: dependencies: @@ -5434,7 +5818,7 @@ snapshots: sprintf-js@1.1.3: {} - statuses@2.0.1: {} + stoppable@1.1.0: {} string-width@4.2.3: dependencies: @@ -5487,6 +5871,8 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 + supports-color@10.1.0: {} + supports-preserve-symlinks-flag@1.0.0: {} tailwindcss@3.4.17: @@ -5546,8 +5932,6 @@ snapshots: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} - tr46@0.0.3: {} trim-lines@3.0.1: {} @@ -5576,6 +5960,16 @@ snapshots: undici-types@6.21.0: {} + undici@7.13.0: {} + + unenv@2.0.0-rc.19: + dependencies: + defu: 6.1.4 + exsolve: 1.0.7 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.1 + unicode-properties@1.4.1: dependencies: base64-js: 1.5.1 @@ -5746,6 +6140,31 @@ snapshots: dependencies: string-width: 7.2.0 + workerd@1.20250813.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20250813.0 + '@cloudflare/workerd-darwin-arm64': 1.20250813.0 + '@cloudflare/workerd-linux-64': 1.20250813.0 + '@cloudflare/workerd-linux-arm64': 1.20250813.0 + '@cloudflare/workerd-windows-64': 1.20250813.0 + + wrangler@4.29.1(@cloudflare/workers-types@4.20250813.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.6.1(unenv@2.0.0-rc.19)(workerd@1.20250813.0) + blake3-wasm: 2.1.5 + esbuild: 0.25.4 + miniflare: 4.20250813.0 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.19 + workerd: 1.20250813.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20250813.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -5764,6 +6183,8 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 + ws@8.18.0: {} + xxhash-wasm@1.1.0: {} yallist@3.1.1: {} @@ -5782,6 +6203,19 @@ snapshots: yoctocolors@2.1.1: {} + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 + cookie: 1.0.2 + youch-core: 0.3.3 + zod-to-json-schema@3.24.5(zod@3.25.51): dependencies: zod: 3.25.51 @@ -5791,6 +6225,8 @@ snapshots: typescript: 5.8.3 zod: 3.25.51 + zod@3.22.3: {} + zod@3.25.51: {} zod@4.0.14: {} diff --git a/src/components/publish.tsx b/src/components/publish.tsx index 9de4883..398d16d 100644 --- a/src/components/publish.tsx +++ b/src/components/publish.tsx @@ -12,7 +12,7 @@ export default function () {

Watch URL:

- + {name} diff --git a/src/components/watch.tsx b/src/components/watch.tsx index dced1f3..bf5b853 100644 --- a/src/components/watch.tsx +++ b/src/components/watch.tsx @@ -2,16 +2,14 @@ import "@kixelated/hang/support/element"; import "@kixelated/hang/watch/element"; -export default function (props: { name: string; token?: string }) { - // The signed token is only needed for the demo/ prefix just to prevent abuse. - // All other broadcasts go to anon/ which is super easy to spoof. +export default function () { + const params = new URLSearchParams(window.location.search); + const name = params.get("name") ?? "bbb"; - // Determine the path based on whether it's a demo broadcast or anonymous let url: URL; - if (props.token) { - url = new URL(`${import.meta.env.PUBLIC_RELAY_URL}/demo?jwt=${props.token}`); + if (name === "bbb") { + url = new URL(`${import.meta.env.PUBLIC_RELAY_URL}/demo?jwt=${import.meta.env.PUBLIC_RELAY_TOKEN}`); } else { - // Anonymous broadcasts use /anon path without token url = new URL(`${import.meta.env.PUBLIC_RELAY_URL}/anon`); } @@ -19,7 +17,7 @@ export default function (props: { name: string; token?: string }) { <> - + diff --git a/src/layouts/global.astro b/src/layouts/global.astro index 5ad7ff8..4c3433e 100644 --- a/src/layouts/global.astro +++ b/src/layouts/global.astro @@ -25,7 +25,7 @@ if (frontmatter?.description) description = frontmatter.description; - + {title ? `${title} - Media over QUIC` : "Media over QUIC"} diff --git a/src/pages/blog/application-first.mdx b/src/pages/blog/application-first.mdx index 169cf05..a351287 100644 --- a/src/pages/blog/application-first.mdx +++ b/src/pages/blog/application-first.mdx @@ -31,7 +31,7 @@ But before I explain more, I have to bore you with some history. I've been working on Media over QUIC for a long time. My fateful project to reduce latency at Twitch was over 5 years ago (!). We tried using WebRTC, but it just kind of sucked; it wasn't designed for our use case. -I eventually stumbled upon QUIC/WebTransport and [pivoted once more](https://quic.video/blog/distribution-at-twitch). +I eventually stumbled upon QUIC/WebTransport and [pivoted once more](https://moq.dev/blog/distribution-at-twitch). I built something called Warp as a LL-HLS replacement for Twitch and it was pretty good. We needed more browser support and somehow had to convince Apple this was worth adding to Safari. @@ -41,7 +41,7 @@ And when I say "permission", I mean we needed to get Twitch lawyers to fight aga Unfortunately, priorities at Twitch changed and Warp was only briefly in production for 10% of Chrome users. Amazon finally noticed that we were losing a ton of money and the post-Covid downsizing began. -But hey, I got severance and used it to build this crude [quic.video](https://quic.video) website while in a coffee shop in Tokyo. +But hey, I got severance and used it to build this crude [moq.dev](https://moq.dev) website while in a coffee shop in Tokyo. I'm back in San Francisco now; a huge downgrade. ## Standardization @@ -53,7 +53,7 @@ It's apparently the most active working group [with a variety of drafts](https:/ However. HOWEVER. -[I decided this was not the most productive path](https://quic.video/blog/transfork). +[I decided this was not the most productive path](https://moq.dev/blog/transfork). I stopped my involvement, and I'm no longer listed as an author on the [latest moq-transport draft](https://www.ietf.org/archive/id/draft-ietf-moq-transport-11.html). It would have been cool to put *author of RFC9876* on my resume. Oh well. @@ -150,7 +150,7 @@ Super cringe, something that a serious company would never touch. It's a little disappointing because I primarily enjoy Rust and backend services. But it's time to swallow my pride and double down on the front-end via **Typescript**. -This demo currently uses [Rust+WASM](https://quic.video/blog/to-wasm) but it's time to hit the revert button. +This demo currently uses [Rust+WASM](https://moq.dev/blog/to-wasm) but it's time to hit the revert button. Oops. @@ -210,4 +210,4 @@ I'm down to scheme too if any companies have a partnership in mind. Hoping to have a public demo in 3-6 months. -![@kixelated](/blog/avatar.png) \ No newline at end of file +![@kixelated](/blog/avatar.png) diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro index 8f790fa..f80f9e2 100644 --- a/src/pages/blog/index.astro +++ b/src/pages/blog/index.astro @@ -10,7 +10,9 @@ interface Frontmatter { date: string; } -const posts = await Astro.glob("./*.mdx"); +const posts = Object.values( + await import.meta.glob<{ frontmatter: Frontmatter; url: string }>("./*.mdx", { eager: true }), +); posts.sort((a, b) => { const dateA = Date.parse(a.frontmatter.date); const dateB = Date.parse(b.frontmatter.date); diff --git a/src/pages/blog/replacing-hls-dash.mdx b/src/pages/blog/replacing-hls-dash.mdx index 6935d5d..cd2f44c 100644 --- a/src/pages/blog/replacing-hls-dash.mdx +++ b/src/pages/blog/replacing-hls-dash.mdx @@ -11,7 +11,7 @@ date: 2023-11-21 Low-latency, high bitrate, mass fan-out is hard. Who knew? -See [Replacing WebRTC](https://quic.video/blog/replacing-webrtc) for the previous post in this series. +See [Replacing WebRTC](https://moq.dev/blog/replacing-webrtc) for the previous post in this series. ## tl;dr @@ -369,4 +369,4 @@ Join the [Discord](https://discord.gg/FCYF3p99mr) if you want to help! Written by [@kixelated](https://github.com/kixelated). -![@kixelated](/blog/avatar.png) \ No newline at end of file +![@kixelated](/blog/avatar.png) diff --git a/src/pages/blog/tls-and-quic.mdx b/src/pages/blog/tls-and-quic.mdx index 284138c..892dc02 100644 --- a/src/pages/blog/tls-and-quic.mdx +++ b/src/pages/blog/tls-and-quic.mdx @@ -60,7 +60,7 @@ It's good stuff, much better than TLS 1.2 in my opinion. There is no way to disable encryption but depending on the client, you can modify certificate validation. The IETF grey-beards decreed that the protocol can never be insecure, lest a lowly application developer shoot themselves in the foot. -- HTTP/3, WebTransport, and of course, [Media over QUIC](https://quic.video) all use QUIC under the hood. +- HTTP/3, WebTransport, and of course, [Media over QUIC](https://moq.dev) all use QUIC under the hood. - HTTP/2 *technically* does not require TLS but browsers require it as a forcing function. - HTTP/1 is the lone exception, allowing you to choose if you want to connect to `http://example.com` (insecure) or `https://example.com` (TLS). @@ -141,7 +141,7 @@ That means adding a way to reload certificates, or periodically hitting the good It would be remiss of me to not mention that LetsEncrypt uses [ACME v2](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment). You don't need to use `certbot` and in fact you could integrate ACME directly into your workflow. -In fact, I'm using a [terraform module](https://github.com/vancluever/terraform-provider-acme) to generate certificates for `relay.quic.video`. +In fact, I'm using a [terraform module](https://github.com/vancluever/terraform-provider-acme) to generate certificates for `relay.moq.dev`. It's **not recommended** because if I forget to run terraform every so often, then oops, my certificate will expire and users can no longer connect to my server. But it's easy and it works for now so I'm embracing my folly. diff --git a/src/pages/blog/transfork.mdx b/src/pages/blog/transfork.mdx index da71921..3fbb619 100644 --- a/src/pages/blog/transfork.mdx +++ b/src/pages/blog/transfork.mdx @@ -84,7 +84,7 @@ And let's not forget the existing features that have been migrated over: - [Gstreamer plugin](https://github.com/kixelated/moq-gst) - [ffmpeg integration](https://github.com/kixelated/moq-rs/tree/main/moq-pub) - [Relay server](https://github.com/kixelated/moq-rs/tree/main/moq-relay) -- [GCP infrastructure](https://github.com/kixelated/quic.video/tree/main/infra) +- [GCP infrastructure](https://github.com/kixelated/moq.dev/tree/main/infra) The combined Rust+JS changes currently clock in at +8,602 -16,457 lines (...including this blog post). I know line counts are a terrible metric, but it's a testiment to how annoying MoqTransport is to both use and implement, especially considering we were using an old and half-implemented draft (version 4\*). diff --git a/src/pages/publish.astro b/src/pages/publish.astro index 94fe6d1..e22bc19 100644 --- a/src/pages/publish.astro +++ b/src/pages/publish.astro @@ -1,6 +1,4 @@ --- -export const prerender = false; - import Issues from "@/components/issues.astro"; import Element from "@/components/publish.tsx"; import Layout from "@/layouts/global.astro"; diff --git a/src/pages/rss.xml.js b/src/pages/rss.xml.js index 2391ad9..c5906ce 100644 --- a/src/pages/rss.xml.js +++ b/src/pages/rss.xml.js @@ -21,7 +21,7 @@ export async function GET(context) { })); return rss({ - title: "quic.video | Blog", + title: "moq.dev | Blog", description: "Latest posts about Media over QUIC and real-time media streaming", site: context.site, items: sortedPosts, diff --git a/src/pages/source.mdx b/src/pages/source.mdx index 9830c15..3f492c8 100644 --- a/src/pages/source.mdx +++ b/src/pages/source.mdx @@ -8,7 +8,7 @@ title: Source Everything is open source and broken into two repositories: - [kixelated/moq](https://github.com/kixelated/moq): The core MoQ library, with implementations in Rust and Typescript. -- [kixelated/quic.video](https://github.com/kixelated/quic.video): This website. Includes terraform to run multiple relays on GCP. +- [kixelated/moq.dev](https://github.com/kixelated/moq.dev): This website. Includes terraform to run multiple relays on GCP. ## Rust Native code is written in [Rust](https://github.com/kixelated/moq/tree/main/rs) and is split into a few notable crates: @@ -62,4 +62,4 @@ If you do end up using MoQ for your project, let me know! I will never get tired of DMs. `@kixelated` on Discord. -![@kixelated](/blog/avatar.png) \ No newline at end of file +![@kixelated](/blog/avatar.png) diff --git a/src/pages/watch.astro b/src/pages/watch.astro new file mode 100644 index 0000000..0400a55 --- /dev/null +++ b/src/pages/watch.astro @@ -0,0 +1,11 @@ +--- +import Issues from "@/components/issues.astro"; +import Watch from "@/components/watch.tsx"; +import Layout from "@/layouts/global.astro"; +--- + + + + + + diff --git a/src/pages/watch/[name].astro b/src/pages/watch/[name].astro deleted file mode 100644 index c52a6a1..0000000 --- a/src/pages/watch/[name].astro +++ /dev/null @@ -1,20 +0,0 @@ ---- -export const prerender = false; - -const { name } = Astro.params; -if (!name) return Astro.redirect("/404"); - -import Issues from "@/components/issues.astro"; -import Watch from "@/components/watch.tsx"; -import Layout from "@/layouts/global.astro"; ---- - - - - -

- Watching a PUBLIC broadcast. Pls report any abuse on Discord. -

- - -
diff --git a/src/pages/watch/index.astro b/src/pages/watch/index.astro deleted file mode 100644 index da0ff08..0000000 --- a/src/pages/watch/index.astro +++ /dev/null @@ -1,13 +0,0 @@ ---- -export const prerender = false; - -import Issues from "@/components/issues.astro"; -import Watch from "@/components/watch.tsx"; -import Layout from "@/layouts/global.astro"; ---- - - - - - - diff --git a/wrangler.jsonc b/wrangler.jsonc new file mode 100644 index 0000000..591efc5 --- /dev/null +++ b/wrangler.jsonc @@ -0,0 +1,23 @@ +{ + // Check the configuration file schema, the main reason why we're not using TOML. + "$schema": "./node_modules/wrangler/config-schema.json", + + "name": "moq-dev", + "compatibility_date": "2025-08-13", + "account_id": "dd618f5dbd5da77b8296f1613c301f5c", + + "assets": { + "directory": "./dist", + "not_found_handling": "404-page" + }, + + "vars": { + "PUBLIC_RELAY_URL": "https://relay.moq.dev", + "PUBLIC_RELAY_TOKEN": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb290IjoiZGVtbyIsInB1YiI6bnVsbCwic3ViIjoiIiwiZXhwIjpudWxsLCJpYXQiOm51bGx9.w6NCqef736qNYCC1KAovUbTaJb8bvHnY-QwXZ_p3vTw" + }, + + "route": { + "pattern": "moq.dev", + "custom_domain": true + } +}