From 018a04770b32d9ef6b8ebeb871df0d934796a25f Mon Sep 17 00:00:00 2001 From: Robin Andeer Date: Tue, 26 May 2026 16:27:30 -0400 Subject: [PATCH] feat: add connection quality indicator and network preflight In-call warnings use LiveKit quality plus WebRTC RTT/loss when the server still reports good. Preflight is WebSocket-only and non-blocking; optional ConnectionQualityDevTools for local verification. --- CHANGELOG.md | 17 + Justfile | 58 +++- examples/vanilla-js/index.html | 28 +- examples/vanilla-js/styles.css | 7 + packages/core/README.md | 17 + packages/core/src/client.ts | 19 +- packages/core/src/connection-check.ts | 86 +++++ packages/core/src/connection-quality.test.ts | 83 +++++ packages/core/src/connection-quality.ts | 76 ++++ packages/core/src/connection-stats.test.ts | 93 +++++ packages/core/src/connection-stats.ts | 54 +++ packages/core/src/index.ts | 21 ++ packages/react/src/components/AvatarCall.tsx | 29 ++ .../react/src/components/AvatarSession.tsx | 2 +- .../src/components/ConnectionIndicator.tsx | 95 +++++ .../components/ConnectionQualityDevTools.tsx | 18 + .../react/src/hooks/useConnectionCheck.ts | 75 ++++ .../react/src/hooks/useConnectionQuality.ts | 327 ++++++++++++++++++ packages/react/src/index.test.ts | 4 + packages/react/src/index.ts | 20 ++ packages/react/src/styles.css | 101 +++++- packages/react/src/types.ts | 11 + 22 files changed, 1232 insertions(+), 9 deletions(-) create mode 100644 packages/core/src/connection-check.ts create mode 100644 packages/core/src/connection-quality.test.ts create mode 100644 packages/core/src/connection-quality.ts create mode 100644 packages/core/src/connection-stats.test.ts create mode 100644 packages/core/src/connection-stats.ts create mode 100644 packages/react/src/components/ConnectionIndicator.tsx create mode 100644 packages/react/src/components/ConnectionQualityDevTools.tsx create mode 100644 packages/react/src/hooks/useConnectionCheck.ts create mode 100644 packages/react/src/hooks/useConnectionQuality.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d7fe7b..2373e73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- **`checkAvatarConnection()`** — preflight WebSocket/WebRTC checks using LiveKit `ConnectionCheck`, with normalized results (no LiveKit types in the public API). +- **`useConnectionQuality()`** and **`ConnectionIndicator`** — composable in-call warning when the local network is degraded or reconnecting (debounced; local participant only). +- **`useConnectionCheck()`** and **`AvatarCall` `connectionCheck` prop** — optional silent background preflight (no UI; in-call warnings use `ConnectionIndicator`). +- **`session.connectionQuality`** getter on core `AvatarSession`. + +### Fixed + +- **`ConnectionQualityChanged`** in core now only reflects the **local** participant (avoids avatar quality updates being shown as the user's network issue). +- **Preflight `checkAvatarConnection`** defaults to WebSocket-only (no full WebRTC join on the session token before the call). +- **`useConnectionQuality`** treats LiveKit **`signalReconnecting`** like reconnecting for the in-call warning. +- **`AvatarSession` state** maps LiveKit **`signalReconnecting`** to `reconnecting` (was incorrectly treated as `ended`). +- **`ConnectionIndicator`** also uses inbound WebRTC stats (RTT / packet loss) when LiveKit still reports `good`, so slow links (e.g. DevTools 3G) can surface **Slow connection**. +- **`ConnectionQualityDevTools`** and **`connectionDebug`** / **`connectionPreviewWarning`** on `AvatarCall` — opt-in dev overlay (metrics top-right; does not affect control bar layout). +- Warning pill includes an amber **signal** dot; reconnecting uses a slightly warmer tone. + ## [0.16.0] - 2026-05-12 ### Added diff --git a/Justfile b/Justfile index a4ac928..10fb989 100644 --- a/Justfile +++ b/Justfile @@ -1,3 +1,8 @@ +# Run `just` or `just --list` to see recipes. Requires https://github.com/casey/just + +default: + @just --list + # Build build: build-core build-react build-core: @@ -15,15 +20,60 @@ typecheck: build-core cd packages/react && bun run typecheck lint: bun run lint +verify: typecheck lint test build -# Dev +# Dev (packages) dev-core: cd packages/core && bun run dev dev-react: build-core cd packages/react && bun run dev -# Examples +# Link workspace packages for local example development (run once per clone if needed) +link-packages: + cd packages/core && bun link + cd packages/react && bun link + +playground: build link-packages + cd playground && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +# Examples — build SDK, link workspace packages, install, then start dev server. +# Core-only examples link @runwayml/avatars; React examples link both packages. + vanilla-js: build-core - cd examples/vanilla-js && bun install && bun run dev + cd examples/vanilla-js && bun install && bun link @runwayml/avatars && bun run dev + sveltekit: build-core - cd examples/sveltekit && bun install && bun run dev + cd examples/sveltekit && bun install && bun link @runwayml/avatars && bun run dev + +dev-express: build link-packages + cd examples/express && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-nextjs: build link-packages + cd examples/nextjs && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-nextjs-simple: build link-packages + cd examples/nextjs-simple && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-nextjs-client-events: build link-packages + cd examples/nextjs-client-events && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-nextjs-server-actions: build link-packages + cd examples/nextjs-server-actions && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-nextjs-rpc: build link-packages + cd examples/nextjs-rpc && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-nextjs-rpc-external-api: build link-packages + cd examples/nextjs-rpc-external-api && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-nextjs-rpc-weather: build link-packages + cd examples/nextjs-rpc-weather && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-subtitles: build link-packages + cd examples/subtitles && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +dev-react-router: build link-packages + cd examples/react-router && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev + +elevenlabs: build link-packages + cd examples/nextjs-elevenlabs && bun install && bun link @runwayml/avatars @runwayml/avatars-react && bun run dev diff --git a/examples/vanilla-js/index.html b/examples/vanilla-js/index.html index a3d539a..fcf1b52 100644 --- a/examples/vanilla-js/index.html +++ b/examples/vanilla-js/index.html @@ -17,11 +17,17 @@

Ready

+