diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 26ea45179..f69a4b706 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -79,8 +79,6 @@ RUN apt-get update \
rpm \
unzip \
webp \
- xauth \
- xvfb \
xz-utils \
xdg-utils \
zstd \
@@ -99,8 +97,6 @@ RUN apt-get update \
hyperfine \
iproute2 \
iputils-ping \
- kind \
- kubernetes-client \
lldb \
lsof \
ltrace \
@@ -177,7 +173,6 @@ COPY --from=seaweedfs /usr/bin/weed /usr/local/bin/weed
USER ${USERNAME}
ENV DOCKER_HOST="unix:///var/run/docker.sock" \
- KUBECONFIG="/workspaces/fluxer/.fluxer/k8s/local-kubeconfig" \
PATH="/home/${USERNAME}/.cargo/bin:${PATH}" \
PNPM_HOME="/home/${USERNAME}/.local/share/pnpm"
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 38b77fbad..c04ad8df0 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -6,8 +6,7 @@
"shutdownAction": "stopCompose",
"remoteUser": "vscode",
"remoteEnv": {
- "DOCKER_HOST": "unix:///var/run/docker.sock",
- "KUBECONFIG": "/workspaces/fluxer/.fluxer/k8s/local-kubeconfig"
+ "DOCKER_HOST": "unix:///var/run/docker.sock"
},
"runServices": ["workspace", "postgres", "valkey", "nats", "livekit", "meilisearch", "mailpit"],
"forwardPorts": [
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 5ab094fab..39436a414 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -16,7 +16,6 @@ services:
FLUXER_POSTGRES_HOST: postgres
FLUXER_SELF_HOSTED: "true"
DOCKER_HOST: unix:///var/run/docker.sock
- KUBECONFIG: /workspaces/fluxer/.fluxer/k8s/local-kubeconfig
volumes:
- ..:/workspaces/fluxer:cached
- type: volume
diff --git a/.devcontainer/verify.sh b/.devcontainer/verify.sh
index 8524d5d77..96c422c12 100755
--- a/.devcontainer/verify.sh
+++ b/.devcontainer/verify.sh
@@ -75,8 +75,6 @@ else
fi
stage "rust: app proxy tests" cargo test -p fluxer_app_proxy
-stage "integration: font serving" cargo run -q -p fluxer-dev -- font-serving-it
-
echo
echo "---------------------------------------------"
echo "${PASSED} stages passed, ${#FAILURES[@]} failed"
diff --git a/.dockerignore b/.dockerignore
index b1b661c7a..09819319c 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -27,11 +27,6 @@
**/target/
**/test-results.json
/fluxer_docs/site/
-/tools/integration/integration-driver/Cargo.lock
-/tools/integration/integration-driver/target-*/
-/tools/integration/results/*.json
-/tools/integration/results/latest-summary.txt
-
/fluxer_app/.devserver-cache.json
/fluxer_app/pkgs/libfluxcore/
/fluxer_app/src/features/i18n/locales/*/messages.mjs
diff --git a/.github/workflows/build-app-proxy.yaml b/.github/workflows/build-app-proxy.yaml
index 765713b03..90cd31484 100644
--- a/.github/workflows/build-app-proxy.yaml
+++ b/.github/workflows/build-app-proxy.yaml
@@ -134,13 +134,6 @@ jobs:
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-app-proxy
--step upload_assets
- - name: verify bundled faces are CORS-usable from the app origin
- run: >-
- deploy/scripts/verify-asset-cors.sh
- --endpoint https://fluxerstatic.com
- --origin https://fluxer.app
- --manifest app-dist-output/dist/assets-manifest.txt
-
build-arm64:
name: build app-proxy (arm64)
needs: meta
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index efb8791be..ed3111f83 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -234,56 +234,6 @@ jobs:
- name: Verify shipped fonts match the lockfile
run: python3 tools/fonts/build_fonts.py --verify
- font-serving:
- runs-on: ubuntu-24.04
- timeout-minutes: 20
- steps:
- - name: Checkout code
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
-
- - name: Install Rust toolchain
- uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
- with:
- toolchain: stable
-
- - name: Install pnpm
- uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
-
- - name: Install Node.js
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
- with:
- node-version: '24'
- cache: 'pnpm'
-
- - name: Cache cargo
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
- with:
- path: |
- ~/.cargo/registry
- ~/.cargo/git
- target
- key: rust-${{ runner.os }}-${{ hashFiles('Cargo.lock') }}
- restore-keys: |
- rust-${{ runner.os }}-
-
- - name: Install native dependencies
- run: |
- sudo apt-get update
- sudo apt-get install -y --no-install-recommends \
- pkg-config \
- build-essential \
- libcurl4-openssl-dev \
- libvips-dev \
- libavfilter-dev \
- libheif-dev \
- libwebp-dev
-
- - name: Install Node.js dependencies
- run: pnpm --filter fluxer_admin --filter fluxer_marketing install
-
- - name: Run the font serving integration suite
- run: cargo run --locked -q -p fluxer-dev -- font-serving-it
-
ci-scripts:
runs-on: ubuntu-24.04
timeout-minutes: 25
diff --git a/Cargo.lock b/Cargo.lock
index a9687eea3..d86d4a1ad 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1926,9 +1926,7 @@ dependencies = [
"anyhow",
"axum",
"base64",
- "chrono",
"clap",
- "futures-util",
"hmac 0.13.0",
"hyper 1.10.1",
"hyper-util",
@@ -1942,9 +1940,7 @@ dependencies = [
"sha2 0.11.0",
"tempfile",
"tokio",
- "tokio-tungstenite",
"url",
- "urlencoding",
]
[[package]]
@@ -5549,22 +5545,6 @@ dependencies = [
"tokio",
]
-[[package]]
-name = "tokio-tungstenite"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c"
-dependencies = [
- "futures-util",
- "log",
- "rustls 0.23.40",
- "rustls-native-certs",
- "rustls-pki-types",
- "tokio",
- "tokio-rustls 0.26.4",
- "tungstenite",
-]
-
[[package]]
name = "tokio-util"
version = "0.7.18"
@@ -5742,24 +5722,6 @@ dependencies = [
"tokio",
]
-[[package]]
-name = "tungstenite"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8"
-dependencies = [
- "bytes",
- "data-encoding",
- "http 1.4.2",
- "httparse",
- "log",
- "rand 0.9.4",
- "rustls 0.23.40",
- "rustls-pki-types",
- "sha1 0.10.6",
- "thiserror",
-]
-
[[package]]
name = "twox-hash"
version = "2.1.2"
diff --git a/deploy/scripts/verify-asset-cors.sh b/deploy/scripts/verify-asset-cors.sh
deleted file mode 100755
index 30592cffa..000000000
--- a/deploy/scripts/verify-asset-cors.sh
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/usr/bin/env bash
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-set -euo pipefail
-
-ENDPOINT="${ASSET_CORS_ENDPOINT:-https://fluxerstatic.com}"
-MANIFEST="${ASSET_MANIFEST:-app-dist-output/dist/assets-manifest.txt}"
-ORIGIN="${ASSET_CORS_ORIGIN:-https://fluxer.app}"
-SAMPLES="${ASSET_CORS_SAMPLES:-5}"
-EXPLICIT_KEYS=()
-
-usage() {
- sed -n '3,22p' "$0"
- exit "${1:-2}"
-}
-
-while [ $# -gt 0 ]; do
- case "$1" in
- --endpoint)
- ENDPOINT="${2:?--endpoint needs a URL}"
- shift 2
- ;;
- --manifest)
- MANIFEST="${2:?--manifest needs a path}"
- shift 2
- ;;
- --origin)
- ORIGIN="${2:?--origin needs an origin}"
- shift 2
- ;;
- --samples)
- SAMPLES="${2:?--samples needs a count}"
- shift 2
- ;;
- --key)
- EXPLICIT_KEYS+=("${2:?--key needs an S3 key}")
- shift 2
- ;;
- -h | --help) usage 0 ;;
- *)
- echo "verify-asset-cors: unknown argument '$1'" >&2
- usage 2
- ;;
- esac
-done
-
-ENDPOINT="${ENDPOINT%/}"
-
-keys=()
-if [ "${#EXPLICIT_KEYS[@]}" -gt 0 ]; then
- keys=("${EXPLICIT_KEYS[@]}")
-elif [ -f "$MANIFEST" ]; then
- while IFS= read -r key; do
- keys+=("$key")
- done < <(grep -E '\.woff2$' "$MANIFEST" | awk -v n="$SAMPLES" '
- { lines[NR] = $0 }
- END {
- if (NR == 0) exit
- if (n > NR) n = NR
- for (i = 0; i < n; i++) print lines[int(i * NR / n) + 1]
- }')
-else
- cat >&2 <<-EOF
- verify-asset-cors: no asset manifest at '$MANIFEST' and no --key given.
-
- The manifest is produced by \`build-app-proxy --step generate_asset_manifest\` and uploaded
- by the release workflow as the 'app-proxy-assets-manifest' artifact. Pass --manifest to point
- at a downloaded copy, or --key to check a single face by hand.
- EOF
- exit 2
-fi
-
-if [ "${#keys[@]}" -eq 0 ]; then
- echo "verify-asset-cors: no .woff2 keys to check (manifest '$MANIFEST' has none)" >&2
- exit 2
-fi
-
-echo "verify-asset-cors: endpoint=$ENDPOINT origin=$ORIGIN keys=${#keys[@]}"
-
-failures=0
-for key in "${keys[@]}"; do
- url="$ENDPOINT/$key"
- headers="$(curl --silent --show-error --location --max-time 20 \
- --header "Origin: $ORIGIN" --output /dev/null --dump-header - "$url" 2>&1 || true)"
-
- status="$(printf '%s\n' "$headers" | awk '/^HTTP\//{code=$2} END{print code+0}')"
- header_value() {
- printf '%s\n' "$headers" |
- tr -d '\r' |
- awk -v want="$1" 'index(tolower($0), want ":") == 1 {sub(/^[^:]*:[ \t]*/, ""); v=$0} END{print v}'
- }
- acao="$(header_value 'access-control-allow-origin')"
- ctype="$(header_value 'content-type')"
- cache="$(header_value 'cache-control')"
- cdn_cache="$(header_value 'cdn-cache-control')"
-
- problems=()
- [ "$status" = "200" ] || problems+=("status=$status (want 200)")
- if [ -z "$acao" ]; then
- problems+=("no Access-Control-Allow-Origin -- the browser will drop this face")
- elif [ "$acao" != "*" ] && [ "$acao" != "$ORIGIN" ]; then
- problems+=("Access-Control-Allow-Origin='$acao' (want '*' or '$ORIGIN')")
- fi
- case "$ctype" in
- font/woff2*) ;;
- *) problems+=("Content-Type='$ctype' (want font/woff2)") ;;
- esac
- caching_note=""
- case "$cache$cdn_cache" in
- *immutable*) ;;
- *) caching_note=" (note: no 'immutable' token; cache-control='$cache')" ;;
- esac
-
- if [ "${#problems[@]}" -eq 0 ]; then
- echo " OK $key [$status $ctype acao=$acao]$caching_note"
- else
- failures=$((failures + 1))
- echo " FAIL $key"
- for problem in "${problems[@]}"; do
- echo " - $problem"
- done
- fi
-done
-
-if [ "$failures" -gt 0 ]; then
- cat >&2 <<-EOF
-
- verify-asset-cors: $failures of ${#keys[@]} sampled faces are NOT usable from $ORIGIN.
-
- Most likely cause: the bucket's CORS rule is scoped to the retired 'fonts/' prefix and does
- not cover 'assets/'. Every bundled face fails in production while JS and CSS keep working,
- and the CDN still answers 200, so no server-side alarm fires.
-
- Fix the bucket rule so it allows GET on 'assets/*' from the app origin (or bucket-wide),
- then re-run this check.
- EOF
- exit 1
-fi
-
-echo "verify-asset-cors: all ${#keys[@]} sampled faces are usable from $ORIGIN"
diff --git a/fluxer_admin/tests/parity.rs b/fluxer_admin/tests/parity.rs
index 2ad396a2a..3b84fa91f 100644
--- a/fluxer_admin/tests/parity.rs
+++ b/fluxer_admin/tests/parity.rs
@@ -4,22 +4,11 @@
mod parity_support;
use parity_support::{
- PARITY_RUN_ENV, PROTECTED_ROUTES_ENV, PUBLIC_ROUTES_ENV, TEST_ACCESS_TOKEN, TEST_ADMIN_SECRET,
- TEST_ADMIN_USER_ID, api_fixtures, capture, env_flag, html_normalizer, reference_worktree,
- route_list_from_env, servers,
+ TEST_ACCESS_TOKEN, TEST_ADMIN_SECRET, TEST_ADMIN_USER_ID, api_fixtures, capture,
+ html_normalizer, rust_server,
};
use std::{error::Error, io};
-const DEFAULT_PUBLIC_ROUTES: &[&str] = &["/_health", "/robots.txt", "/static/app.css", "/login"];
-const DEFAULT_PROTECTED_ROUTES: &[&str] = &[
- "/dashboard",
- "/users?q=Parity",
- "/guilds?q=Parity",
- "/guilds/1600000000000000001",
- "/reports",
- "/reports/1700000000000000001",
-];
-
#[test]
fn html_normalizer_canonicalizes_attribute_order_and_csrf_values() {
let left = r#"
"#;
@@ -64,7 +53,7 @@ async fn rust_admin_fixture_routes_cover_default_protected_routes() -> Result<()
let api_server = api_fixtures::ApiFixtureServer::start_default()
.await
.map_err(test_error)?;
- let rust_admin = servers::start_rust_admin(api_server.base_url())
+ let rust_admin = rust_server::start(api_server.base_url())
.await
.map_err(test_error)?;
let client = capture::capture_client().map_err(test_error)?;
@@ -115,68 +104,6 @@ async fn rust_admin_fixture_routes_cover_default_protected_routes() -> Result<()
Ok(())
}
-#[tokio::test(flavor = "multi_thread")]
-#[ignore = "set FLUXER_ADMIN_PARITY_RUN=1 to create/use the TS worktree and run dual-server parity"]
-async fn dual_server_static_public_and_protected_routes() -> Result<(), Box> {
- if !env_flag(PARITY_RUN_ENV) {
- eprintln!("skipping dual-server parity; set {PARITY_RUN_ENV}=1 to run it");
- return Ok(());
- }
- let repo_root = repo_root()?;
- let api_server = api_fixtures::ApiFixtureServer::start_default()
- .await
- .map_err(test_error)?;
- let worktree = reference_worktree::ensure_reference_worktree(&repo_root).map_err(test_error)?;
- reference_worktree::prepare_reference_package(&worktree).map_err(test_error)?;
- let ts_port = servers::reserve_local_port().map_err(test_error)?;
- let ts_admin = servers::start_ts_admin(&worktree, ts_port, api_server.base_url())
- .await
- .map_err(test_error)?;
- let rust_admin = servers::start_rust_admin(api_server.base_url())
- .await
- .map_err(test_error)?;
- let client = capture::capture_client().map_err(test_error)?;
- let public_routes = route_list_from_env(PUBLIC_ROUTES_ENV, DEFAULT_PUBLIC_ROUTES);
- for route in public_routes {
- capture::compare_route(
- &client,
- &route,
- ts_admin.base_url(),
- rust_admin.base_url(),
- None,
- )
- .await
- .map_err(test_error)?;
- }
- let session = fluxer_admin::session::create_session(
- TEST_ADMIN_USER_ID,
- TEST_ACCESS_TOKEN,
- TEST_ADMIN_SECRET,
- );
- let session_cookie = format!("{}={session}", fluxer_admin::session::SESSION_COOKIE_NAME);
- let protected_routes = route_list_from_env(PROTECTED_ROUTES_ENV, DEFAULT_PROTECTED_ROUTES);
- for route in protected_routes {
- capture::compare_route(
- &client,
- &route,
- ts_admin.base_url(),
- rust_admin.base_url(),
- Some(&session_cookie),
- )
- .await
- .map_err(test_error)?;
- }
- Ok(())
-}
-
-fn repo_root() -> Result> {
- let manifest_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
- manifest_dir
- .parent()
- .map(std::path::Path::to_path_buf)
- .ok_or_else(|| test_error("fluxer_admin must have a repository parent".to_owned()))
-}
-
fn test_error(message: String) -> Box {
Box::new(io::Error::other(message))
}
diff --git a/fluxer_admin/tests/parity/capture.rs b/fluxer_admin/tests/parity/capture.rs
index 89fdb5066..56d79ab77 100644
--- a/fluxer_admin/tests/parity/capture.rs
+++ b/fluxer_admin/tests/parity/capture.rs
@@ -18,24 +18,6 @@ pub fn capture_client() -> Result {
.map_err(|error| format!("failed to build capture client: {error}"))
}
-pub async fn compare_route(
- client: &Client,
- route: &str,
- ts_base_url: &str,
- rust_base_url: &str,
- cookie: Option<&str>,
-) -> Result<(), String> {
- let ts = fetch_route(client, ts_base_url, route, cookie).await?;
- let rust = fetch_route(client, rust_base_url, route, cookie).await?;
- if ts == rust {
- return Ok(());
- }
- Err(format!(
- "parity mismatch for {route}\nTS: {ts:#?}\nRust: {rust:#?}\nfirst body diff: {}",
- first_body_diff(&ts.body, &rust.body)
- ))
-}
-
pub async fn fetch_route(
client: &Client,
base_url: &str,
@@ -73,25 +55,3 @@ pub async fn fetch_route(
body,
})
}
-
-fn first_body_diff(left: &str, right: &str) -> String {
- let left_chars = left.chars().collect::>();
- let right_chars = right.chars().collect::>();
- let max_len = left_chars.len().max(right_chars.len());
- for index in 0..max_len {
- if left_chars.get(index) != right_chars.get(index) {
- let left_preview = preview_from(&left_chars, index);
- let right_preview = preview_from(&right_chars, index);
- return format!("at char {index}: left `{left_preview}`, right `{right_preview}`");
- }
- }
- "bodies differ but no character diff was found".to_owned()
-}
-
-fn preview_from(chars: &[char], start: usize) -> String {
- chars
- .iter()
- .skip(start.saturating_sub(20))
- .take(80)
- .collect::()
-}
diff --git a/fluxer_admin/tests/parity/mod.rs b/fluxer_admin/tests/parity/mod.rs
index a7ec1e918..267f5362e 100644
--- a/fluxer_admin/tests/parity/mod.rs
+++ b/fluxer_admin/tests/parity/mod.rs
@@ -3,47 +3,8 @@
pub mod api_fixtures;
pub mod capture;
pub mod html_normalizer;
-pub mod reference_worktree;
-pub mod servers;
+pub mod rust_server;
-use std::env;
-
-pub const TS_REFERENCE_COMMIT: &str = "4748f2f1e6589c325fca6391d6df3e3c3f6a0345^";
-pub const PARITY_RUN_ENV: &str = "FLUXER_ADMIN_PARITY_RUN";
-pub const PUBLIC_ROUTES_ENV: &str = "FLUXER_ADMIN_PARITY_PUBLIC_ROUTES";
-pub const PROTECTED_ROUTES_ENV: &str = "FLUXER_ADMIN_PARITY_PROTECTED_ROUTES";
-pub const TS_WORKTREE_ENV: &str = "FLUXER_ADMIN_PARITY_TS_WORKTREE";
-pub const TS_WORKTREE_ROOT_ENV: &str = "FLUXER_ADMIN_PARITY_WORKTREE_ROOT";
-pub const SKIP_TS_PREPARE_ENV: &str = "FLUXER_ADMIN_PARITY_SKIP_TS_PREPARE";
pub const TEST_ADMIN_SECRET: &str = "test-admin-secret";
pub const TEST_ADMIN_USER_ID: &str = "1130650140672000000";
pub const TEST_ACCESS_TOKEN: &str = "parity-access-token";
-
-pub fn env_flag(name: &str) -> bool {
- env::var(name)
- .map(|value| {
- matches!(
- value.trim().to_ascii_lowercase().as_str(),
- "1" | "true" | "yes" | "on"
- )
- })
- .unwrap_or(false)
-}
-
-pub fn route_list_from_env(name: &str, default: &[&str]) -> Vec {
- match env::var(name) {
- Ok(value) => value
- .split(',')
- .map(str::trim)
- .filter(|value| !value.is_empty())
- .map(|value| {
- if value.starts_with('/') {
- value.to_owned()
- } else {
- format!("/{value}")
- }
- })
- .collect(),
- Err(_) => default.iter().map(|route| (*route).to_owned()).collect(),
- }
-}
diff --git a/fluxer_admin/tests/parity/reference_worktree.rs b/fluxer_admin/tests/parity/reference_worktree.rs
deleted file mode 100644
index 8ba17ce9a..000000000
--- a/fluxer_admin/tests/parity/reference_worktree.rs
+++ /dev/null
@@ -1,120 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-use super::{
- SKIP_TS_PREPARE_ENV, TS_REFERENCE_COMMIT, TS_WORKTREE_ENV, TS_WORKTREE_ROOT_ENV, env_flag,
-};
-use std::{
- env, fs,
- path::{Path, PathBuf},
- process::Command,
-};
-
-pub fn ensure_reference_worktree(repo_root: &Path) -> Result {
- let target_commit = git_stdout(repo_root, &["rev-parse", TS_REFERENCE_COMMIT])?;
- if let Ok(path) = env::var(TS_WORKTREE_ENV) {
- let path = PathBuf::from(path);
- validate_worktree(&path, &target_commit)?;
- return Ok(path);
- }
- let root = env::var(TS_WORKTREE_ROOT_ENV)
- .map(PathBuf::from)
- .unwrap_or_else(|_| repo_root.join("target/parity"));
- fs::create_dir_all(&root)
- .map_err(|error| format!("failed to create {}: {error}", root.display()))?;
- let worktree = root.join("fluxer-admin-ts-ref-4748f2f1-parent");
- if !worktree.exists() {
- run_git(
- repo_root,
- &[
- "worktree",
- "add",
- "--detach",
- path_arg(&worktree).as_str(),
- TS_REFERENCE_COMMIT,
- ],
- )?;
- }
- validate_worktree(&worktree, &target_commit)?;
- Ok(worktree)
-}
-
-pub fn prepare_reference_package(worktree: &Path) -> Result<(), String> {
- if env_flag(SKIP_TS_PREPARE_ENV) {
- return Ok(());
- }
- run_command(
- Command::new("pnpm")
- .current_dir(worktree)
- .args(["install", "--frozen-lockfile"]),
- "pnpm install --frozen-lockfile",
- )?;
- run_command(
- Command::new("pnpm")
- .current_dir(worktree)
- .args(["--filter", "@fluxer/config", "generate"]),
- "pnpm --filter @fluxer/config generate",
- )?;
- run_command(
- Command::new("pnpm")
- .current_dir(worktree)
- .args(["--filter", "fluxer_admin", "build:css"]),
- "pnpm --filter fluxer_admin build:css",
- )
-}
-
-fn validate_worktree(worktree: &Path, target_commit: &str) -> Result<(), String> {
- if !worktree.join("fluxer_admin/package.json").exists() {
- return Err(format!(
- "{} does not look like the TS reference worktree",
- worktree.display()
- ));
- }
- let head = git_stdout(worktree, &["rev-parse", "HEAD"])?;
- if head != target_commit {
- return Err(format!(
- "{} is at {head}, expected {target_commit}",
- worktree.display()
- ));
- }
- Ok(())
-}
-
-fn run_git(repo: &Path, args: &[&str]) -> Result<(), String> {
- run_command(Command::new("git").current_dir(repo).args(args), "git")
-}
-
-fn git_stdout(repo: &Path, args: &[&str]) -> Result {
- let output = Command::new("git")
- .current_dir(repo)
- .args(args)
- .output()
- .map_err(|error| format!("failed to run git {}: {error}", args.join(" ")))?;
- if !output.status.success() {
- return Err(format!(
- "git {} failed\nstdout:\n{}\nstderr:\n{}",
- args.join(" "),
- String::from_utf8_lossy(&output.stdout),
- String::from_utf8_lossy(&output.stderr)
- ));
- }
- Ok(String::from_utf8_lossy(&output.stdout).trim().to_owned())
-}
-
-fn run_command(command: &mut Command, label: &str) -> Result<(), String> {
- let output = command
- .output()
- .map_err(|error| format!("failed to run {label}: {error}"))?;
- if output.status.success() {
- return Ok(());
- }
- Err(format!(
- "{label} failed with status {}\nstdout:\n{}\nstderr:\n{}",
- output.status,
- String::from_utf8_lossy(&output.stdout),
- String::from_utf8_lossy(&output.stderr)
- ))
-}
-
-fn path_arg(path: &Path) -> String {
- path.to_string_lossy().into_owned()
-}
diff --git a/fluxer_admin/tests/parity/rust_server.rs b/fluxer_admin/tests/parity/rust_server.rs
new file mode 100644
index 000000000..142d85f0d
--- /dev/null
+++ b/fluxer_admin/tests/parity/rust_server.rs
@@ -0,0 +1,89 @@
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+use super::TEST_ADMIN_SECRET;
+use fluxer_admin::{
+ build_router,
+ config::{AdminConfig, ProxyConfig, RuntimeEnv},
+};
+use std::time::{Duration, Instant};
+use tokio::{net::TcpListener, task::JoinHandle, time::sleep};
+
+pub struct RunningRustAdmin {
+ base_url: String,
+ handle: JoinHandle<()>,
+}
+
+impl RunningRustAdmin {
+ pub fn base_url(&self) -> &str {
+ &self.base_url
+ }
+}
+
+impl Drop for RunningRustAdmin {
+ fn drop(&mut self) {
+ self.handle.abort();
+ }
+}
+
+pub async fn start(api_endpoint: &str) -> Result {
+ let listener = TcpListener::bind("127.0.0.1:0")
+ .await
+ .map_err(|error| format!("failed to bind Rust admin server: {error}"))?;
+ let port = listener
+ .local_addr()
+ .map_err(|error| format!("failed to read Rust admin address: {error}"))?
+ .port();
+ let base_url = format!("http://127.0.0.1:{port}");
+ let config = admin_config(port, api_endpoint, &base_url);
+ let router = build_router(config);
+ let handle = tokio::spawn(async move {
+ let _ = axum::serve(listener, router).await;
+ });
+ wait_for_health(&base_url).await?;
+ Ok(RunningRustAdmin { base_url, handle })
+}
+
+fn admin_config(port: u16, api_endpoint: &str, admin_endpoint: &str) -> AdminConfig {
+ AdminConfig {
+ env: RuntimeEnv::Test,
+ host: "127.0.0.1".to_owned(),
+ port,
+ secret_key_base: TEST_ADMIN_SECRET.to_owned(),
+ base_path: String::new(),
+ api_endpoint: api_endpoint.to_owned(),
+ media_endpoint: format!("{api_endpoint}/media"),
+ static_cdn_endpoint: "https://static.example.test".to_owned(),
+ admin_endpoint: admin_endpoint.to_owned(),
+ web_app_endpoint: "http://127.0.0.1:8088".to_owned(),
+ kv_url: "redis://127.0.0.1:6379/0".to_owned(),
+ oauth_client_id: "1234567890123456789".to_owned(),
+ oauth_client_secret: "test-admin-oauth-secret".to_owned(),
+ oauth_redirect_uri: format!("{admin_endpoint}/oauth2_callback"),
+ build_version: "parity".to_owned(),
+ release_channel: "parity".to_owned(),
+ self_hosted: false,
+ proxy: ProxyConfig {
+ trust_client_ip_header: false,
+ client_ip_header_name: "x-forwarded-for".to_owned(),
+ },
+ }
+}
+
+async fn wait_for_health(base_url: &str) -> Result<(), String> {
+ let client = reqwest::Client::builder()
+ .redirect(reqwest::redirect::Policy::none())
+ .build()
+ .map_err(|error| format!("failed to build health client: {error}"))?;
+ let deadline = Instant::now() + Duration::from_secs(30);
+ let url = format!("{}/_health", base_url.trim_end_matches('/'));
+ let mut last_error = String::new();
+ while Instant::now() < deadline {
+ match client.get(&url).send().await {
+ Ok(response) if response.status().is_success() => return Ok(()),
+ Ok(response) => last_error = format!("health returned {}", response.status()),
+ Err(error) => last_error = error.to_string(),
+ }
+ sleep(Duration::from_millis(200)).await;
+ }
+ Err(format!("timed out waiting for {url}: {last_error}"))
+}
diff --git a/fluxer_admin/tests/parity/servers.rs b/fluxer_admin/tests/parity/servers.rs
deleted file mode 100644
index 04811cb03..000000000
--- a/fluxer_admin/tests/parity/servers.rs
+++ /dev/null
@@ -1,233 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-use super::TEST_ADMIN_SECRET;
-use fluxer_admin::{
- build_router,
- config::{AdminConfig, ProxyConfig, RuntimeEnv},
-};
-use std::{
- net::TcpListener as StdTcpListener,
- path::Path,
- process::{Child, Command, Stdio},
- time::{Duration, Instant},
-};
-use tokio::{net::TcpListener, task::JoinHandle, time::sleep};
-
-pub struct RunningRustAdmin {
- base_url: String,
- handle: JoinHandle<()>,
-}
-
-pub struct RunningTsAdmin {
- base_url: String,
- child: Child,
-}
-
-impl RunningRustAdmin {
- pub fn base_url(&self) -> &str {
- &self.base_url
- }
-}
-
-impl RunningTsAdmin {
- pub fn base_url(&self) -> &str {
- &self.base_url
- }
-}
-
-impl Drop for RunningRustAdmin {
- fn drop(&mut self) {
- self.handle.abort();
- }
-}
-
-impl Drop for RunningTsAdmin {
- fn drop(&mut self) {
- let _ = self.child.kill();
- let _ = self.child.wait();
- }
-}
-
-pub fn reserve_local_port() -> Result {
- let listener = StdTcpListener::bind("127.0.0.1:0")
- .map_err(|error| format!("failed to reserve local port: {error}"))?;
- listener
- .local_addr()
- .map(|addr| addr.port())
- .map_err(|error| format!("failed to read reserved local port: {error}"))
-}
-
-pub async fn start_rust_admin(api_endpoint: &str) -> Result {
- let listener = TcpListener::bind("127.0.0.1:0")
- .await
- .map_err(|error| format!("failed to bind Rust admin server: {error}"))?;
- let port = listener
- .local_addr()
- .map_err(|error| format!("failed to read Rust admin address: {error}"))?
- .port();
- let base_url = format!("http://127.0.0.1:{port}");
- let config = admin_config(port, api_endpoint, &base_url);
- let router = build_router(config);
- let handle = tokio::spawn(async move {
- let _ = axum::serve(listener, router).await;
- });
- wait_for_health(&base_url).await?;
- Ok(RunningRustAdmin { base_url, handle })
-}
-
-pub async fn start_ts_admin(
- worktree: &Path,
- port: u16,
- api_endpoint: &str,
-) -> Result {
- let base_url = format!("http://127.0.0.1:{port}");
- let mut command = Command::new("pnpm");
- command
- .current_dir(worktree)
- .args(["--filter", "fluxer_admin", "start"])
- .env("BUILD_VERSION", "parity")
- .env("RELEASE_CHANNEL", "parity");
- for (key, value) in ts_admin_env(port, api_endpoint, &base_url) {
- command.env(key, value);
- }
- let child = command
- .stdout(Stdio::null())
- .stderr(Stdio::null())
- .spawn()
- .map_err(|error| format!("failed to start TS admin server: {error}"))?;
- let mut server = RunningTsAdmin { base_url, child };
- if let Err(error) = wait_for_health(server.base_url()).await {
- let _ = server.child.kill();
- let _ = server.child.wait();
- return Err(error);
- }
- Ok(server)
-}
-
-fn admin_config(port: u16, api_endpoint: &str, admin_endpoint: &str) -> AdminConfig {
- AdminConfig {
- env: RuntimeEnv::Test,
- host: "127.0.0.1".to_owned(),
- port,
- secret_key_base: TEST_ADMIN_SECRET.to_owned(),
- base_path: String::new(),
- api_endpoint: api_endpoint.to_owned(),
- media_endpoint: format!("{api_endpoint}/media"),
- static_cdn_endpoint: "https://static.example.test".to_owned(),
- admin_endpoint: admin_endpoint.to_owned(),
- web_app_endpoint: "http://127.0.0.1:8088".to_owned(),
- kv_url: "redis://127.0.0.1:6379/0".to_owned(),
- oauth_client_id: "1234567890123456789".to_owned(),
- oauth_client_secret: "test-admin-oauth-secret".to_owned(),
- oauth_redirect_uri: format!("{admin_endpoint}/oauth2_callback"),
- build_version: "parity".to_owned(),
- release_channel: "parity".to_owned(),
- self_hosted: false,
- proxy: ProxyConfig {
- trust_client_ip_header: false,
- client_ip_header_name: "x-forwarded-for".to_owned(),
- },
- }
-}
-
-fn ts_admin_env(
- port: u16,
- api_endpoint: &str,
- admin_endpoint: &str,
-) -> Vec<(&'static str, String)> {
- vec![
- ("FLUXER_ENV", "test".to_owned()),
- ("NODE_ENV", "production".to_owned()),
- ("FLUXER_BASE_DOMAIN", "127.0.0.1".to_owned()),
- ("FLUXER_PUBLIC_SCHEME", "http".to_owned()),
- ("FLUXER_PUBLIC_PORT", port.to_string()),
- ("FLUXER_API_ENDPOINT", api_endpoint.to_owned()),
- ("FLUXER_ADMIN_ENDPOINT", admin_endpoint.to_owned()),
- ("FLUXER_APP_ENDPOINT", "http://127.0.0.1:8088".to_owned()),
- ("FLUXER_MEDIA_ENDPOINT", format!("{api_endpoint}/media")),
- (
- "FLUXER_STATIC_CDN_ENDPOINT",
- "https://static.example.test".to_owned(),
- ),
- ("FLUXER_CASSANDRA_HOSTS", "127.0.0.1".to_owned()),
- ("FLUXER_CASSANDRA_KEYSPACE", "fluxer_test".to_owned()),
- ("FLUXER_CASSANDRA_LOCAL_DC", "datacenter1".to_owned()),
- ("FLUXER_CASSANDRA_USERNAME", "cassandra".to_owned()),
- ("FLUXER_CASSANDRA_PASSWORD", "cassandra".to_owned()),
- ("FLUXER_KV_URL", "redis://127.0.0.1:6379/0".to_owned()),
- ("FLUXER_S3_ACCESS_KEY_ID", "test".to_owned()),
- ("FLUXER_S3_SECRET_ACCESS_KEY", "test".to_owned()),
- (
- "FLUXER_MEDIA_PROXY_SECRET_KEY",
- "test-media-secret".to_owned(),
- ),
- ("FLUXER_ADMIN_PORT", port.to_string()),
- ("FLUXER_ADMIN_SECRET_KEY_BASE", TEST_ADMIN_SECRET.to_owned()),
- (
- "FLUXER_ADMIN_OAUTH_CLIENT_SECRET",
- "test-admin-oauth-secret".to_owned(),
- ),
- (
- "FLUXER_MARKETING_SECRET_KEY_BASE",
- "test-marketing-secret".to_owned(),
- ),
- ("FLUXER_APP_PROXY_PORT", "8773".to_owned()),
- (
- "FLUXER_GATEWAY_MEDIA_PROXY_ENDPOINT",
- format!("{api_endpoint}/media"),
- ),
- (
- "FLUXER_GATEWAY_RPC_AUTH_TOKEN",
- "test-gateway-rpc-token".to_owned(),
- ),
- ("FLUXER_GATEWAY_PUSH_ENABLED", "false".to_owned()),
- ("FLUXER_SUDO_MODE_SECRET", "test-sudo-secret".to_owned()),
- (
- "FLUXER_CONNECTION_INITIATION_SECRET",
- "test-connection-secret".to_owned(),
- ),
- (
- "FLUXER_VAPID_PUBLIC_KEY",
- "test-vapid-public-key".to_owned(),
- ),
- (
- "FLUXER_VAPID_PRIVATE_KEY",
- "test-vapid-private-key".to_owned(),
- ),
- ("FLUXER_VAPID_EMAIL", "test@example.com".to_owned()),
- ("FLUXER_EMAIL_ENABLED", "false".to_owned()),
- ("FLUXER_LIVEKIT_ENABLED", "false".to_owned()),
- ("FLUXER_STRIPE_ENABLED", "true".to_owned()),
- ("FLUXER_SEARCH_URL", "http://127.0.0.1:9200".to_owned()),
- ("FLUXER_SEARCH_API_KEY", "test".to_owned()),
- ("FLUXER_CAPTCHA_ENABLED", "false".to_owned()),
- ("FLUXER_CAPTCHA_PROVIDER", "none".to_owned()),
- ("FLUXER_SELF_HOSTED", "false".to_owned()),
- ("FLUXER_DISCOVERY_ENABLED", "true".to_owned()),
- ("FLUXER_DISABLE_RATE_LIMITS", "true".to_owned()),
- ("FLUXER_TEST_MODE_ENABLED", "true".to_owned()),
- ]
-}
-
-async fn wait_for_health(base_url: &str) -> Result<(), String> {
- let client = reqwest::Client::builder()
- .redirect(reqwest::redirect::Policy::none())
- .build()
- .map_err(|error| format!("failed to build health client: {error}"))?;
- let deadline = Instant::now() + Duration::from_secs(30);
- let url = format!("{}/_health", base_url.trim_end_matches('/'));
- let mut last_error = String::new();
- while Instant::now() < deadline {
- match client.get(&url).send().await {
- Ok(response) if response.status().is_success() => return Ok(()),
- Ok(response) => {
- last_error = format!("health returned {}", response.status());
- }
- Err(error) => {
- last_error = error.to_string();
- }
- }
- sleep(Duration::from_millis(200)).await;
- }
- Err(format!("timed out waiting for {url}: {last_error}"))
-}
diff --git a/fluxer_api/src/api/database/PostgresKvQueryExecutor.Integration.test.ts b/fluxer_api/src/api/database/PostgresKvQueryExecutor.Integration.test.ts
deleted file mode 100644
index f1aa45829..000000000
--- a/fluxer_api/src/api/database/PostgresKvQueryExecutor.Integration.test.ts
+++ /dev/null
@@ -1,249 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-import {randomUUID} from 'node:crypto';
-import {existsSync} from 'node:fs';
-import {getDefaultPostgresClient, initPostgres, quoteIdentifier, shutdownPostgres} from '@pkgs/postgres/src/Client';
-import cassandra from 'cassandra-driver';
-import {afterAll, beforeAll, describe, expect, test} from 'vitest';
-import {defineTable} from './CassandraTableDsl';
-import {Db} from './CassandraTypes';
-import {ensurePostgresKvSchema, PostgresKvQueryExecutor, pruneExpiredPostgresKvRows} from './PostgresKvQueryExecutor';
-
-interface TestRow {
- tenant_id: string;
- item_id: bigint;
- created_at: Date;
- payload: Buffer | null;
- tags: Set | null;
- counts: Map | null;
- local_day: cassandra.types.LocalDate | null;
- note: string | null;
-}
-
-function postgresHost(): string {
- return process.env.FLUXER_POSTGRES_TEST_HOST ?? (existsSync('/.dockerenv') ? 'host.docker.internal' : '127.0.0.1');
-}
-
-function sleep(ms: number): Promise {
- return new Promise((resolve) => setTimeout(resolve, ms));
-}
-
-const kvTable = `fluxer_kv_test_${randomUUID().replaceAll('-', '_')}`;
-const logicalTableName = `pg_kv_test_${randomUUID().replaceAll('-', '_')}`;
-const TestRows = defineTable({
- name: logicalTableName,
- columns: ['tenant_id', 'item_id', 'created_at', 'payload', 'tags', 'counts', 'local_day', 'note'],
- primaryKey: ['tenant_id', 'item_id'],
- partitionKey: ['tenant_id'],
-});
-
-describe('PostgresKvQueryExecutor', () => {
- let executor: PostgresKvQueryExecutor;
- let initialized = false;
-
- beforeAll(async () => {
- await initPostgres({
- host: postgresHost(),
- port: Number(process.env.FLUXER_POSTGRES_PORT ?? 5432),
- database: process.env.FLUXER_POSTGRES_DATABASE ?? 'fluxer',
- username: process.env.FLUXER_POSTGRES_USERNAME ?? 'fluxer',
- password: process.env.FLUXER_POSTGRES_PASSWORD ?? 'fluxer',
- kvTable,
- maxConnections: 4,
- });
- initialized = true;
- const client = getDefaultPostgresClient();
- await ensurePostgresKvSchema(client);
- executor = new PostgresKvQueryExecutor(client);
- });
-
- afterAll(async () => {
- if (!initialized) return;
- try {
- await getDefaultPostgresClient().query(`DROP TABLE IF EXISTS ${quoteIdentifier(kvTable)}`);
- } finally {
- await shutdownPostgres();
- }
- });
-
- test('round trips typed values and conditional writes through a real Postgres KV table', async () => {
- const row: TestRow = {
- tenant_id: 'tenant-a',
- item_id: 10n,
- created_at: new Date('2026-01-02T03:04:05.006Z'),
- payload: Buffer.from('hello postgres kv'),
- tags: new Set(['alpha', 'beta']),
- counts: new Map([['seen', 5n]]),
- local_day: cassandra.types.LocalDate.fromString('2026-01-02'),
- note: 'first',
- };
-
- await expect(executor.executeQuery<{['[applied]']: boolean}>(TestRows.insertIfNotExists(row))).resolves.toEqual([
- {'[applied]': true},
- ]);
- await expect(
- executor.executeQuery<{['[applied]']: boolean}>(TestRows.insertIfNotExists({...row, note: 'second'})),
- ).resolves.toEqual([{'[applied]': false}]);
-
- const fetched = await executor.executeQuery(
- TestRows.select({
- where: [TestRows.where.eq('tenant_id'), TestRows.where.eq('item_id')],
- limit: 1,
- }).bind({tenant_id: 'tenant-a', item_id: 10n}),
- );
-
- expect(fetched).toHaveLength(1);
- expect(fetched[0]!.item_id).toBe(10n);
- expect(fetched[0]!.created_at.getTime()).toBe(row.created_at.getTime());
- expect(fetched[0]!.payload?.equals(row.payload!)).toBe(true);
- expect([...fetched[0]!.tags!.values()].sort()).toEqual(['alpha', 'beta']);
- expect(fetched[0]!.counts!.get('seen')).toBe(5n);
- expect(fetched[0]!.local_day?.toString()).toBe('2026-01-02');
- expect(fetched[0]!.note).toBe('first');
- });
-
- test('filters, orders, patches, pages, and deletes logical rows', async () => {
- await executor.executeBatch(
- [
- TestRows.upsertAll({
- tenant_id: 'tenant-b',
- item_id: 1n,
- created_at: new Date('2026-02-01T00:00:00.000Z'),
- payload: null,
- tags: null,
- counts: null,
- local_day: null,
- note: 'one',
- }),
- TestRows.upsertAll({
- tenant_id: 'tenant-b',
- item_id: 2n,
- created_at: new Date('2026-02-02T00:00:00.000Z'),
- payload: null,
- tags: null,
- counts: null,
- local_day: null,
- note: 'two',
- }),
- TestRows.upsertAll({
- tenant_id: 'tenant-b',
- item_id: 3n,
- created_at: new Date('2026-02-03T00:00:00.000Z'),
- payload: null,
- tags: null,
- counts: null,
- local_day: null,
- note: 'three',
- }),
- ].map((query) => ({query: query.cql, params: query.params, meta: query.kvMeta})),
- );
-
- const firstPage = await executor.executePagedQuery(
- TestRows.select({
- where: TestRows.where.eq('tenant_id'),
- orderBy: {col: 'item_id', direction: 'DESC'},
- }).bind({tenant_id: 'tenant-b'}),
- {pageSize: 2},
- );
- expect(firstPage.rows.map((row) => row.item_id)).toEqual([3n, 2n]);
- expect(firstPage.pageState).not.toBeNull();
-
- const secondPage = await executor.executePagedQuery(
- TestRows.select({
- where: TestRows.where.eq('tenant_id'),
- orderBy: {col: 'item_id', direction: 'DESC'},
- }).bind({tenant_id: 'tenant-b'}),
- {pageSize: 2, pageState: firstPage.pageState},
- );
- expect(secondPage.rows.map((row) => row.item_id)).toEqual([1n]);
- expect(secondPage.pageState).toBeNull();
-
- await executor.executeQuery(TestRows.patchByPk({tenant_id: 'tenant-b', item_id: 2n}, {note: Db.clear()}));
- const patched = await executor.executeQuery(
- TestRows.select({where: [TestRows.where.eq('tenant_id'), TestRows.where.eq('item_id')], limit: 1}).bind({
- tenant_id: 'tenant-b',
- item_id: 2n,
- }),
- );
- expect(patched[0]!.note).toBeNull();
-
- await executor.executeQuery(TestRows.delete({where: TestRows.where.eq('tenant_id')}).bind({tenant_id: 'tenant-b'}));
- const remaining = await executor.executeQuery(
- TestRows.select({where: TestRows.where.eq('tenant_id')}).bind({tenant_id: 'tenant-b'}),
- );
- expect(remaining).toEqual([]);
- });
-
- test('filters expired rows and prunes them physically', async () => {
- const client = getDefaultPostgresClient();
- await executor.executeQuery(
- TestRows.upsertAllWithTtl(
- {
- tenant_id: 'tenant-expired',
- item_id: 1n,
- created_at: new Date('2026-03-01T00:00:00.000Z'),
- payload: null,
- tags: null,
- counts: null,
- local_day: null,
- note: 'temporary',
- },
- 1,
- ),
- );
-
- await sleep(1100);
-
- const visibleRows = await executor.executeQuery(
- TestRows.select({where: TestRows.where.eq('tenant_id')}).bind({tenant_id: 'tenant-expired'}),
- );
- expect(visibleRows).toEqual([]);
-
- const physicalBefore = await client.query<{count: string}>(
- `SELECT count(*)::text AS count FROM ${quoteIdentifier(kvTable)} WHERE table_name = $1 AND row_data ->> 'tenant_id' = $2`,
- [logicalTableName, 'tenant-expired'],
- );
- expect(Number(physicalBefore.rows[0]!.count)).toBe(1);
-
- const pruned = await pruneExpiredPostgresKvRows(client, 10);
- expect(pruned).toBeGreaterThanOrEqual(1);
-
- const physicalAfter = await client.query<{count: string}>(
- `SELECT count(*)::text AS count FROM ${quoteIdentifier(kvTable)} WHERE table_name = $1 AND row_data ->> 'tenant_id' = $2`,
- [logicalTableName, 'tenant-expired'],
- );
- expect(Number(physicalAfter.rows[0]!.count)).toBe(0);
- });
-
- test('patching a logically expired row makes it visible again without keeping stale TTL', async () => {
- await executor.executeQuery(
- TestRows.upsertAllWithTtl(
- {
- tenant_id: 'tenant-resurrect',
- item_id: 1n,
- created_at: new Date('2026-04-01T00:00:00.000Z'),
- payload: null,
- tags: null,
- counts: null,
- local_day: null,
- note: 'temporary',
- },
- 1,
- ),
- );
-
- await sleep(1100);
- await executor.executeQuery(
- TestRows.patchByPk({tenant_id: 'tenant-resurrect', item_id: 1n}, {note: Db.set('resurrected')}),
- );
-
- const rows = await executor.executeQuery(
- TestRows.select({
- where: [TestRows.where.eq('tenant_id'), TestRows.where.eq('item_id')],
- limit: 1,
- }).bind({tenant_id: 'tenant-resurrect', item_id: 1n}),
- );
- expect(rows).toHaveLength(1);
- expect(rows[0]!.note).toBe('resurrected');
- });
-});
diff --git a/fluxer_api/src/api/test/fake-ncmec/Bin.ts b/fluxer_api/src/api/test/fake-ncmec/Bin.ts
deleted file mode 100644
index 5e87d2ee8..000000000
--- a/fluxer_api/src/api/test/fake-ncmec/Bin.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-import http from 'node:http';
-import type {AddressInfo} from 'node:net';
-import {type FakeNcmecFailure, FakeNcmecServer} from './FakeNcmecServer';
-
-const host = process.env.FAKE_NCMEC_HOST ?? '127.0.0.1';
-const port = readPort('FAKE_NCMEC_PORT', 9090);
-const controlHost = process.env.FAKE_NCMEC_CONTROL_HOST ?? '127.0.0.1';
-const controlPort = readPort('FAKE_NCMEC_CONTROL_PORT', port + 1);
-const publicHost = process.env.FAKE_NCMEC_PUBLIC_HOST ?? (host === '0.0.0.0' ? '' : host);
-const username = process.env.FAKE_NCMEC_USERNAME ?? 'usr123';
-const password = process.env.FAKE_NCMEC_PASSWORD ?? 'pswd123';
-
-if (host === controlHost && port === controlPort) {
- throw new Error('FAKE_NCMEC_CONTROL_PORT must differ from FAKE_NCMEC_PORT when both servers bind the same host');
-}
-
-const fake = new FakeNcmecServer({username, password});
-
-function log(...parts: Array): void {
- const ts = new Date().toISOString();
- console.log(`[fake-ncmec ${ts}]`, ...parts);
-}
-
-await fake.start({
- host,
- port,
- onRequest: (entry) => {
- log(
- `${entry.remoteAddress ?? '?'} ${entry.method} ${entry.path} -> ${entry.statusCode} ${entry.durationMs}ms (${entry.requestId})`,
- );
- },
-});
-
-const controlServer = http.createServer(async (req, res) => {
- const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
- log(`control ${req.method} ${url.pathname}`);
- if (req.method === 'GET' && url.pathname === '/_state') {
- res.writeHead(200, {'content-type': 'application/json'});
- res.end(JSON.stringify(fake.getReports(), null, 2));
- return;
- }
- if (req.method === 'GET' && url.pathname.startsWith('/_report/')) {
- const reportId = decodeURIComponent(url.pathname.slice('/_report/'.length));
- const report = fake.getReport(reportId);
- if (!report) {
- res.writeHead(404, {'content-type': 'application/json'});
- res.end(JSON.stringify({error: `Unknown report ${reportId}`}));
- return;
- }
- res.writeHead(200, {'content-type': 'application/json'});
- res.end(JSON.stringify(report, null, 2));
- return;
- }
- if (req.method === 'POST' && url.pathname === '/_reset') {
- fake.reset();
- res.writeHead(204);
- res.end();
- return;
- }
- if (req.method === 'POST' && url.pathname === '/_fail') {
- const mode = (url.searchParams.get('mode') ?? 'none') as FakeNcmecFailure;
- if (!VALID_FAILURE_MODES.has(mode)) {
- res.writeHead(400, {'content-type': 'application/json'});
- res.end(JSON.stringify({error: `Invalid failure mode ${mode}`}));
- return;
- }
- fake.setFailure(mode);
- res.writeHead(200, {'content-type': 'application/json'});
- res.end(JSON.stringify({failure: mode}));
- return;
- }
- res.writeHead(404);
- res.end('Not found. Try GET /_state, POST /_reset, POST /_fail?mode=...');
-});
-
-await new Promise((resolve) => controlServer.listen(controlPort, controlHost, () => resolve()));
-
-const address = controlServer.address() as AddressInfo;
-
-log(`NCMEC-compatible fake server ready`);
-
-log(` NCMEC bind → http://${fake.host}:${fake.port}/ispws`);
-
-log(` NCMEC base URL → http://${publicHost}:${fake.port}/ispws`);
-
-log(` control endpoint → http://${address.address}:${address.port}/_state`);
-
-log(` credentials → ${username}:${password}`);
-
-if (publicHost.startsWith('<')) {
- log(' set FAKE_NCMEC_PUBLIC_HOST to the hostname or IP your prod API can reach');
-}
-
-log(' point prod Config.ncmec.baseUrl at the NCMEC base URL above');
-
-function shutdown(signal: string): void {
- log(`received ${signal}, shutting down`);
- Promise.allSettled([fake.stop(), new Promise((resolve) => controlServer.close(() => resolve()))]).then(() =>
- process.exit(0),
- );
-}
-
-process.on('SIGINT', () => shutdown('SIGINT'));
-
-process.on('SIGTERM', () => shutdown('SIGTERM'));
-
-const VALID_FAILURE_MODES = new Set([
- 'none',
- 'submit',
- 'upload',
- 'fileinfo',
- 'finish',
- 'retract',
- 'unauthorized',
-]);
-
-function readPort(name: string, fallback: number): number {
- const raw = process.env[name];
- if (!raw) return fallback;
- const value = Number.parseInt(raw, 10);
- if (!Number.isInteger(value) || value < 0 || value > 65535) {
- throw new Error(`${name} must be an integer between 0 and 65535`);
- }
- return value;
-}
diff --git a/fluxer_api/src/api/test/fake-ncmec/FakeNcmecServer.ts b/fluxer_api/src/api/test/fake-ncmec/FakeNcmecServer.ts
deleted file mode 100644
index 4f214c54d..000000000
--- a/fluxer_api/src/api/test/fake-ncmec/FakeNcmecServer.ts
+++ /dev/null
@@ -1,430 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-import crypto from 'node:crypto';
-import http from 'node:http';
-import type {AddressInfo} from 'node:net';
-import {Readable} from 'node:stream';
-import {XMLParser, XMLValidator} from 'fast-xml-parser';
-
-export type FakeNcmecFailure = 'none' | 'submit' | 'upload' | 'fileinfo' | 'finish' | 'retract' | 'unauthorized';
-
-export interface FakeNcmecFileRecord {
- fileId: string;
- filename: string;
- size: number;
- md5: string;
- submittedDetails: boolean;
- detailsXml: string | null;
-}
-
-export interface FakeNcmecReportRecord {
- reportId: string;
- reportXml: string;
- files: Array;
- finished: boolean;
- retracted: boolean;
- authUsername: string;
-}
-
-interface FakeNcmecServerOptions {
- username: string;
- password: string;
-}
-
-interface FakeNcmecServerStartOptions {
- host?: string;
- port?: number;
- onRequest?: (entry: FakeNcmecRequestLogEntry) => void;
-}
-
-interface FakeNcmecRequestLogEntry {
- method: string;
- path: string;
- statusCode: number;
- requestId: string;
- durationMs: number;
- remoteAddress: string | null;
-}
-
-const xmlParser = new XMLParser({ignoreAttributes: false, parseTagValue: false, trimValues: true});
-
-export class FakeNcmecServer {
- private server: http.Server | null = null;
- private listenPort = 0;
- private listenHost = '127.0.0.1';
- private onRequest: ((entry: FakeNcmecRequestLogEntry) => void) | null = null;
- private reportCounter = 1000000;
- private fileCounter = 1;
- private requestCounter = 1;
- private readonly reports = new Map();
- private failureMode: FakeNcmecFailure = 'none';
-
- constructor(private readonly options: FakeNcmecServerOptions) {}
-
- async start(startOptions: FakeNcmecServerStartOptions = {}): Promise {
- if (this.server) {
- throw new Error('FakeNcmecServer already started');
- }
- this.listenHost = startOptions.host ?? '127.0.0.1';
- this.onRequest = startOptions.onRequest ?? null;
- this.server = http.createServer((req, res) => this.handle(req, res));
- await new Promise((resolve) => this.server!.listen(startOptions.port ?? 0, this.listenHost, () => resolve()));
- this.listenPort = (this.server!.address() as AddressInfo).port;
- }
-
- async stop(): Promise {
- if (!this.server) return;
- await new Promise((resolve, reject) => {
- this.server!.close((error) => (error ? reject(error) : resolve()));
- });
- this.server = null;
- this.listenPort = 0;
- this.onRequest = null;
- }
-
- get baseUrl(): string {
- if (!this.server) throw new Error('FakeNcmecServer not started');
- return `http://${this.listenHost}:${this.listenPort}/ispws`;
- }
-
- get host(): string {
- if (!this.server) throw new Error('FakeNcmecServer not started');
- return this.listenHost;
- }
-
- get port(): number {
- if (!this.server) throw new Error('FakeNcmecServer not started');
- return this.listenPort;
- }
-
- reset(): void {
- this.reports.clear();
- this.reportCounter = 1000000;
- this.fileCounter = 1;
- this.requestCounter = 1;
- this.failureMode = 'none';
- }
-
- setFailure(mode: FakeNcmecFailure): void {
- this.failureMode = mode;
- }
-
- getReports(): Array {
- return [...this.reports.values()];
- }
-
- getReport(reportId: string): FakeNcmecReportRecord | null {
- return this.reports.get(reportId) ?? null;
- }
-
- private async handle(req: http.IncomingMessage, res: http.ServerResponse): Promise {
- try {
- const url = new URL(req.url ?? '/', 'http://127.0.0.1');
- const pathname = url.pathname.replace(/^\/ispws/, '') || '/';
- const requestId = `req-${this.requestCounter++}`;
- const startedAt = Date.now();
- res.setHeader('Request-ID', requestId);
- res.on('finish', () => {
- this.onRequest?.({
- method: req.method ?? 'GET',
- path: pathname,
- statusCode: res.statusCode,
- requestId,
- durationMs: Date.now() - startedAt,
- remoteAddress: req.socket.remoteAddress ?? null,
- });
- });
- if (this.failureMode === 'unauthorized') {
- return this.sendStatus(res, 401, '');
- }
- if (!this.checkBasicAuth(req)) {
- return this.sendStatus(res, 401, '');
- }
- const injectedHeader = (req.headers['x-test-fail'] ?? '').toString() as FakeNcmecFailure;
- const effectiveFailure: FakeNcmecFailure = injectedHeader || this.failureMode;
- if (req.method === 'GET' && pathname === '/status') {
- const remoteIp = req.socket.remoteAddress ?? 'unknown';
- return this.sendXml(
- res,
- 200,
- ok(
- `Remote User : ${this.options.username}, Remote Ip : ${remoteIp}`,
- ),
- );
- }
- if (req.method === 'GET' && pathname === '/xsd') {
- return this.sendText(res, 200, '');
- }
- if (req.method !== 'POST') {
- return this.sendStatus(res, 405, '');
- }
- const request = await this.toWebRequest(req, url);
- switch (pathname) {
- case '/submit':
- return this.handleSubmit(request, res, effectiveFailure);
- case '/upload':
- return this.handleUpload(request, res, effectiveFailure);
- case '/fileinfo':
- return this.handleFileInfo(request, res, effectiveFailure);
- case '/finish':
- return this.handleFinish(request, res, effectiveFailure);
- case '/retract':
- return this.handleRetract(request, res, effectiveFailure);
- default:
- return this.sendStatus(res, 404, '');
- }
- } catch (error) {
- this.sendStatus(res, 500, String(error));
- }
- }
-
- private async handleSubmit(request: Request, res: http.ServerResponse, failure: FakeNcmecFailure): Promise {
- if (failure === 'submit') {
- return this.sendXml(res, 200, errorXml(1100, 'Save failed'));
- }
- if (!isXmlContentType(request)) {
- return this.sendXml(res, 200, errorXml(4000, 'Invalid request'));
- }
- const body = await request.text();
- if (XMLValidator.validate(body) !== true) {
- return this.sendXml(res, 200, errorXml(4110, 'Malformed XML submittal'));
- }
- const report = parseReportDocument(body);
- if (!hasRequiredReportFields(report)) {
- return this.sendXml(res, 200, errorXml(4100, 'Validation failed'));
- }
- const reportId = String(this.reportCounter++);
- this.reports.set(reportId, {
- reportId,
- reportXml: body,
- files: [],
- finished: false,
- retracted: false,
- authUsername: this.options.username,
- });
- return this.sendXml(res, 200, ok(`${reportId}`));
- }
-
- private async handleUpload(request: Request, res: http.ServerResponse, failure: FakeNcmecFailure): Promise {
- if (failure === 'upload') {
- return this.sendXml(res, 200, errorXml(1111, 'File upload failed'));
- }
- const form = await request.formData();
- const reportId = String(form.get('id') ?? '');
- const file = form.get('file');
- const record = this.reports.get(reportId);
- if (!reportId || !record) {
- return this.sendXml(res, 200, errorXml(5001, 'Report does not exist'));
- }
- if (record.retracted) {
- return this.sendXml(res, 200, errorXml(5101, 'Report already retracted'));
- }
- if (record.finished) {
- return this.sendXml(res, 200, errorXml(5102, 'Report already finished'));
- }
- if (!(file instanceof Blob)) {
- return this.sendXml(res, 200, errorXml(4200, 'Malformed file submittal'));
- }
- const buffer = Buffer.from(await file.arrayBuffer());
- const md5 = crypto.createHash('md5').update(buffer).digest('hex');
- const fileId = `file-${this.fileCounter++}`;
- record.files.push({
- fileId,
- filename: (file as File).name || 'upload.bin',
- size: buffer.byteLength,
- md5,
- submittedDetails: false,
- detailsXml: null,
- });
- return this.sendXml(res, 200, ok(`${reportId}${fileId}${md5}`));
- }
-
- private async handleFileInfo(request: Request, res: http.ServerResponse, failure: FakeNcmecFailure): Promise {
- if (failure === 'fileinfo') {
- return this.sendXml(res, 200, errorXml(1300, 'Update failed'));
- }
- if (!isXmlContentType(request)) {
- return this.sendXml(res, 200, errorXml(4000, 'Invalid request'));
- }
- const body = await request.text();
- if (XMLValidator.validate(body) !== true) {
- return this.sendXml(res, 200, errorXml(4110, 'Malformed XML submittal'));
- }
- const fileDetails = parseFileDetailsDocument(body);
- if (!hasFileDetailsFields(fileDetails)) {
- return this.sendXml(res, 200, errorXml(4100, 'Validation failed'));
- }
- const reportId = nonBlankString(fileDetails?.reportId);
- const fileId = nonBlankString(fileDetails?.fileId);
- const record = reportId ? this.reports.get(reportId) : null;
- if (!record) {
- return this.sendXml(res, 200, errorXml(5001, 'Report does not exist'));
- }
- if (record.retracted) {
- return this.sendXml(res, 200, errorXml(5101, 'Report already retracted'));
- }
- if (record.finished) {
- return this.sendXml(res, 200, errorXml(5102, 'Report already finished'));
- }
- const file = record.files.find((f) => f.fileId === fileId);
- if (!file) {
- return this.sendXml(res, 200, errorXml(5002, 'File does not exist'));
- }
- file.submittedDetails = true;
- file.detailsXml = body;
- return this.sendXml(res, 200, ok(`${reportId}`));
- }
-
- private async handleFinish(request: Request, res: http.ServerResponse, failure: FakeNcmecFailure): Promise {
- if (failure === 'finish') {
- return this.sendXml(res, 200, errorXml(1300, 'Update failed'));
- }
- const form = await request.formData();
- const reportId = String(form.get('id') ?? '');
- const record = this.reports.get(reportId);
- if (!record) {
- return this.sendXml(res, 200, errorXml(5001, 'Report does not exist'));
- }
- if (record.retracted) {
- return this.sendXml(res, 200, errorXml(5101, 'Report already retracted'));
- }
- if (record.finished) {
- return this.sendXml(res, 200, errorXml(5102, 'Report already finished'));
- }
- record.finished = true;
- const files = record.files.map((f) => ` ${f.fileId}`).join('\n');
- const body = `
-
- 0
- ${reportId}
-
-${files}
-
-`;
- return this.sendXml(res, 200, body);
- }
-
- private async handleRetract(request: Request, res: http.ServerResponse, failure: FakeNcmecFailure): Promise {
- if (failure === 'retract') {
- return this.sendXml(res, 200, errorXml(1300, 'Update failed'));
- }
- const form = await request.formData();
- const reportId = String(form.get('id') ?? '');
- const record = this.reports.get(reportId);
- if (!record) {
- return this.sendXml(res, 200, errorXml(5001, 'Report does not exist'));
- }
- if (record.retracted) {
- return this.sendXml(res, 200, errorXml(5101, 'Report already retracted'));
- }
- if (record.finished) {
- return this.sendXml(res, 200, errorXml(5102, 'Report already finished'));
- }
- record.retracted = true;
- return this.sendXml(res, 200, ok(`${reportId}`));
- }
-
- private checkBasicAuth(req: http.IncomingMessage): boolean {
- const header = req.headers.authorization ?? '';
- if (!header.toLowerCase().startsWith('basic ')) return false;
- const decoded = Buffer.from(header.slice(6), 'base64').toString('utf-8');
- const idx = decoded.indexOf(':');
- if (idx === -1) return false;
- const user = decoded.slice(0, idx);
- const pass = decoded.slice(idx + 1);
- return user === this.options.username && pass === this.options.password;
- }
-
- private async toWebRequest(req: http.IncomingMessage, url: URL): Promise {
- const headers = new Headers();
- for (const [k, v] of Object.entries(req.headers)) {
- if (v === undefined) continue;
- if (Array.isArray(v)) headers.set(k, v.join(','));
- else headers.set(k, String(v));
- }
- const method = req.method ?? 'GET';
- const body = method === 'GET' || method === 'HEAD' ? undefined : (Readable.toWeb(req) as ReadableStream);
- return new Request(url, {method, headers, body, duplex: 'half'} as RequestInit & {
- duplex: 'half';
- });
- }
-
- private sendXml(res: http.ServerResponse, status: number, body: string): void {
- res.writeHead(status, {'content-type': 'application/xml; charset=utf-8'});
- res.end(body);
- }
-
- private sendText(res: http.ServerResponse, status: number, body: string): void {
- res.writeHead(status, {'content-type': 'text/plain; charset=utf-8'});
- res.end(body);
- }
-
- private sendStatus(res: http.ServerResponse, status: number, body: string): void {
- res.writeHead(status);
- res.end(body);
- }
-}
-
-function ok(extra: string): string {
- return `
-
- 0
- Success
- ${extra}
-`;
-}
-
-function errorXml(code: number, description: string): string {
- return `
-
- ${code}
- ${description}
-`;
-}
-
-function isXmlContentType(request: Request): boolean {
- return (request.headers.get('content-type') ?? '').toLowerCase().includes('text/xml');
-}
-
-function parseReportDocument(xml: string): Record | null {
- const parsed = xmlParser.parse(xml) as Record;
- return objectField(parsed, 'report');
-}
-
-function parseFileDetailsDocument(xml: string): Record | null {
- const parsed = xmlParser.parse(xml) as Record;
- return objectField(parsed, 'fileDetails');
-}
-
-function hasRequiredReportFields(report: Record | null): boolean {
- const incidentSummary = objectField(report, 'incidentSummary');
- const reporter = objectField(report, 'reporter');
- const reportingPerson = objectField(reporter, 'reportingPerson');
- return Boolean(
- nonBlankString(incidentSummary?.incidentType) &&
- nonBlankString(incidentSummary?.incidentDateTime) &&
- nonBlankString(reportingPerson?.email),
- );
-}
-
-function hasFileDetailsFields(fileDetails: Record | null): boolean {
- return Boolean(nonBlankString(fileDetails?.reportId) && nonBlankString(fileDetails?.fileId));
-}
-
-function objectField(value: unknown, key: string): Record | null {
- if (!value || typeof value !== 'object' || Array.isArray(value)) return null;
- const field = (value as Record)[key];
- if (!field || typeof field !== 'object' || Array.isArray(field)) return null;
- return field as Record;
-}
-
-function nonBlankString(value: unknown): string | null {
- if (typeof value === 'string') {
- const trimmed = value.trim();
- return trimmed || null;
- }
- if (typeof value === 'number' || typeof value === 'bigint') {
- return String(value);
- }
- return null;
-}
diff --git a/fluxer_api/src/api/test/msw/handlers/NcmecHandlers.ts b/fluxer_api/src/api/test/msw/handlers/NcmecHandlers.ts
index 5423a5616..4ee020bdd 100644
--- a/fluxer_api/src/api/test/msw/handlers/NcmecHandlers.ts
+++ b/fluxer_api/src/api/test/msw/handlers/NcmecHandlers.ts
@@ -3,7 +3,26 @@
import crypto from 'node:crypto';
import {XMLParser, XMLValidator} from 'fast-xml-parser';
import {HttpResponse, http, type RequestHandler} from 'msw';
-import type {FakeNcmecFailure, FakeNcmecFileRecord, FakeNcmecReportRecord} from '../../fake-ncmec/FakeNcmecServer';
+
+type FakeNcmecFailure = 'none' | 'submit' | 'upload' | 'fileinfo' | 'finish' | 'retract' | 'unauthorized';
+
+interface FakeNcmecFileRecord {
+ fileId: string;
+ filename: string;
+ size: number;
+ md5: string;
+ submittedDetails: boolean;
+ detailsXml: string | null;
+}
+
+interface FakeNcmecReportRecord {
+ reportId: string;
+ reportXml: string;
+ files: Array;
+ finished: boolean;
+ retracted: boolean;
+ authUsername: string;
+}
const BASE_URL = 'https://ncmec.test/ispws';
const USERNAME = 'usr123';
diff --git a/fluxer_desktop/electron-builder.config.cjs b/fluxer_desktop/electron-builder.config.cjs
index 75d5c6efd..7acca26f8 100644
--- a/fluxer_desktop/electron-builder.config.cjs
+++ b/fluxer_desktop/electron-builder.config.cjs
@@ -200,11 +200,13 @@ const nativeRuntimeFilePatterns = [
'node_modules/@fluxer/linux-input-hook/*.node',
'node_modules/@fluxer/platform-info/package.json',
'node_modules/@fluxer/platform-info/index.js',
+ 'node_modules/@fluxer/platform-info/pure.cjs',
'node_modules/@fluxer/platform-info/loader-diagnostics.cjs',
'node_modules/@fluxer/platform-info/*.node',
'node_modules/@fluxer/webauthn/package.json',
'node_modules/@fluxer/webauthn/index.js',
'node_modules/@fluxer/webauthn/index.d.ts',
+ 'node_modules/@fluxer/webauthn/pure.cjs',
'node_modules/@fluxer/webauthn/loader-diagnostics.cjs',
'node_modules/@fluxer/webauthn/*.node',
'node_modules/@fluxer/webauthn/*.so*',
@@ -213,6 +215,7 @@ const nativeRuntimeFilePatterns = [
'node_modules/@fluxer/webrtc-sender/index.d.ts',
'node_modules/@fluxer/webrtc-sender/*.node',
'node_modules/.pnpm/@fluxer+*/node_modules/@fluxer/*/loader-diagnostics.cjs',
+ 'node_modules/.pnpm/@fluxer+*/node_modules/@fluxer/*/pure.cjs',
'node_modules/.pnpm/@fluxer+win-process-loopback@*/node_modules/@fluxer/win-process-loopback/*.node',
'node_modules/.pnpm/@fluxer+win-game-capture@*/node_modules/@fluxer/win-game-capture/*.node',
'node_modules/.pnpm/@fluxer+win-game-capture@*/node_modules/@fluxer/win-game-capture/*.dll',
diff --git a/fluxer_desktop/native-media-reports/2026-06-05T15-40-10-773Z/livekit-harness.json b/fluxer_desktop/native-media-reports/2026-06-05T15-40-10-773Z/livekit-harness.json
deleted file mode 100644
index 8875f4c53..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-05T15-40-10-773Z/livekit-harness.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
- "status": "skip",
- "startedAt": "2026-06-05T15:40:30.428Z",
- "endedAt": "2026-06-05T15:40:30.428Z",
- "platform": "linux",
- "arch": "arm64",
- "config": {
- "url": "ws://localhost:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-38884-16b7fb75-22a2-4914-8e2d-255451c5b7e9",
- "required": false,
- "strict": false,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 0,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0,
- "maxFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/workspaces/fluxer/fluxer_desktop/native-media-reports/2026-06-05T15-40-10-773Z/livekit-harness.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null
- },
- "checks": [],
- "skippedReason": "LiveKit is unreachable at ws://localhost:7880 (connect ECONNREFUSED 127.0.0.1:7880)",
- "error": null,
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": false,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "nvenc_not_compiled",
- "detail": "CUDA headers were not found at build time; rebuild with CUDA_HOME pointing to a CUDA toolkit that contains include/cuda.h"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": null,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "avDriftMs": null,
- "droppedVideoFrameCallbacks": 0,
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": null
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-05T15-40-10-773Z/summary.json b/fluxer_desktop/native-media-reports/2026-06-05T15-40-10-773Z/summary.json
deleted file mode 100644
index 9e0b8071a..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-05T15-40-10-773Z/summary.json
+++ /dev/null
@@ -1,208 +0,0 @@
-{
- "status": "pass",
- "mode": "smoke",
- "strict": false,
- "platform": "linux",
- "arch": "arm64",
- "hostname": "850d0711b42a",
- "startedAt": "2026-06-05T15:40:10.774Z",
- "endedAt": "2026-06-05T15:40:45.392Z",
- "reportDir": "/workspaces/fluxer/fluxer_desktop/native-media-reports/2026-06-05T15-40-10-773Z",
- "gates": [
- {
- "name": "mode-valid",
- "status": "pass",
- "mode": "smoke"
- },
- {
- "name": "documentation-current",
- "status": "pass",
- "missing": []
- },
- {
- "name": "strict-prerequisites",
- "status": "skip",
- "reason": "smoke mode"
- },
- {
- "name": "strict-command-plan",
- "status": "skip",
- "reason": "smoke mode"
- }
- ],
- "plannedCommands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/WebrtcScreenPublish.test.mjs src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "cwd": "."
- },
- {
- "name": "linux-screen-capture-build",
- "command": "pnpm --dir native/linux-screen-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-screen-capture-tests",
- "command": "pnpm --dir native/linux-screen-capture test",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-audio-capture-build",
- "command": "pnpm --dir native/linux-audio-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-audio-capture-tests",
- "command": "pnpm --dir native/linux-audio-capture test",
- "category": "platform-native",
- "cwd": "."
- }
- ],
- "commands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/WebrtcScreenPublish.test.mjs src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:10.775Z",
- "endedAt": "2026-06-05T15:40:10.863Z",
- "durationMs": 88,
- "stdoutTail": "▶ NativeScreenCapture DMA-BUF metadata validation\n ✔ accepts valid DMA-BUF metadata and pads native plane arrays (1.747886ms)\n ✔ keeps valid handles when optional device UUID metadata is absent or malformed (0.452503ms)\n ✔ rejects invalid plane counts, FDs, strides, and format metadata (0.616004ms)\n✔ NativeScreenCapture DMA-BUF metadata validation (3.258061ms)\n▶ NativeVoiceEngine screen frame routing\n ✔ prefers Windows shared texture handles over DMA-BUF and CPU frames (2.165721ms)\n ✔ uses Linux DMA-BUF handles before CPU conversion (0.671504ms)\n ✔ falls back to CPU frames when GPU paths are unavailable or rejected (0.583295ms)\n✔ NativeVoiceEngine screen frame routing (3.909315ms)\n▶ WebrtcScreenPublish native frame routing\n ✔ prefers Windows shared texture handles over DMA-BUF and CPU buffers (1.627218ms)\n ✔ uses Linux DMA-BUF handles before CPU conversion (0.594711ms)\n ✔ falls back to CPU frames when GPU paths are unavailable or rejected (0.41371ms)\n✔ WebrtcScreenPublish native frame routing (3.18327ms)\nℹ tests 9\nℹ suites 3\nℹ pass 9\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 69.874336\n",
- "stderrTail": ""
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:10.863Z",
- "endedAt": "2026-06-05T15:40:13.457Z",
- "durationMs": 2594,
- "stdoutTail": "native/mac-app-audio | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/mac-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/mac-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/mac-sysctl | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/mac-tcc | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/macos-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\nnative/windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n\n> fluxer_desktop@0.0.0 typecheck /workspaces/fluxer/fluxer_desktop\n> tsgo --noEmit\n\n",
- "stderrTail": ""
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:13.457Z",
- "endedAt": "2026-06-05T15:40:25.076Z",
- "durationMs": 11619,
- "stdoutTail": "../mac-app-audio | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-sysctl | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-tcc | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../macos-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n\n> @fluxer/webrtc-sender@0.0.0 build /workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n> node scripts/build-rust.mjs\n\n[buildRustNodeAddon] cwd=/workspaces/fluxer/fluxer_desktop/native/webrtc-sender\ncargo build --release --target aarch64-unknown-linux-gnu --manifest-path Cargo.toml --features camera-native\n",
- "stderrTail": "warning: webrtc-sys@0.3.33: cuda.h not found; building without hardware accelerated video codec support for NVidia GPUs\nwarning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: variable does not need to be mutable\n --> vendor/libwebrtc/src/native/desktop_capturer.rs:66:13\n |\n66 | let mut sys_handle = sys_dc::ffi::DesktopCapturerOptions {\n | ----^^^^^^^^^^\n | |\n | help: remove this `mut`\n |\n = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 4 warnings (run `cargo fix --lib -p libwebrtc` to apply 3 suggestions)\n Compiling fluxer_webrtc_sender v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender)\n Finished `release` profile [optimized] target(s) in 9.11s\n"
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:25.076Z",
- "endedAt": "2026-06-05T15:40:27.641Z",
- "durationMs": 2565,
- "stdoutTail": "../mac-app-audio | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-sysctl | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-tcc | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../macos-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n\n> @fluxer/webrtc-sender@0.0.0 test /workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo test --features publisher,camera-native && node --test index.test.mjs\n\n\nrunning 89 tests\ntest audio::tests::clamp_volume_holds_the_contract_range ... ok\ntest audio::tests::clamp_volume_maps_non_finite_to_unity ... ok\ntest audio::tests::input_devices_json_array ... ok\ntest audio::tests::output_devices_json_array ... ok\ntest audio::tests::processing_options_preserve_defaults_unless_overridden ... ok\ntest audio::tests::output_device_json_locks_the_contract_shape ... ok\ntest audio::tests::shape_input_marks_index_zero_default_and_drops_empty_ids ... ok\ntest audio::tests::is_muted_only_at_zero ... ok\ntest audio::tests::shape_marks_index_zero_default_and_drops_empty_ids ... ok\ntest camera::tests::from_opts_applies_defaults ... ok\ntest camera::tests::from_opts_forces_even_dims_and_honours_overrides ... ok\ntest camera::tests::from_opts_parses_device_index ... ok\ntest camera::tests::from_opts_preserves_string_device_ids ... ok\ntest camera::tests::from_opts_rejects_degenerate_dims_and_fps ... ok\ntest config::tests::canonical_codec_name_accepts_all_five_case_insensitively ... ok\ntest config::tests::canonical_codec_name_rejects_empty_and_unknown ... ok\ntest config::tests::rejects_bad_url ... ok\ntest config::tests::rejects_empty_token ... ok\ntest config::tests::rejects_odd_or_oob_dimensions ... ok\ntest config::tests::state_gates_frames_and_connect ... ok\ntest engine::tests::parse_codec_agrees_with_pure_canonicaliser ... ok\ntest config::tests::valid_config_passes ... ok\ntest engine::tests::parse_codec_maps_all_five_including_h265 ... ok\ntest engine::tests::parse_codec_rejects_empty_and_unknown ... ok\ntest engine::tests::parse_track_source_accepts_renderer_and_livekit_spellings ... ok\ntest engine::tests::parse_video_quality_accepts_subscription_quality_levels ... ok\ntest engine::tests::pcm16_audio_frame_rejects_malformed_buffers ... ok\ntest engine::tests::pcm16_audio_frame_shapes_interleaved_stereo_samples ... ok\ntest engine::tests::tight_i420_len_matches_plane_geometry ... ok\ntest engine::tests::video_frame_meta_json_matches_contract ... ok\ntest events::tests::empty_object_and_array ... ok\ntest events::tests::escapes_quote_backslash_and_control_chars ... ok\ntest events::tests::json_object_preserves_order_and_mixes_str_and_raw ... ok\ntest events::tests::json_u8_array_serializes_bytes_as_numbers ... ok\ntest events::tests::leaves_plain_ascii_and_unicode_untouched ... ok\ntest events::tests::raw_array_preserves_prebuilt_json_objects ... ok\ntest hardware_encoder::tests::reports_available_nvenc_when_compiled_and_runtime_ready ... ok\ntest hardware_encoder::tests::reports_driver_sdk_incompatibility_before_encode_session ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_compiled ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_probe_is_absent ... ok\ntest hardware_encoder::tests::reports_not_compiled_before_runtime_missing ... ok\ntest hardware_encoder::tests::reports_no_supported_codecs_when_guid_query_finds_no_fluxer_codecs ... ok\ntest hardware_encoder::tests::reports_h264_only_when_hevc_guid_is_absent ... ok\ntest hardware_encoder::tests::reports_no_cuda_devices_using_obs_style_reason ... ok\ntest hardware_encoder::tests::reports_unsupported_platforms_clearly ... ok\ntest publisher::tests::i420_plane_copy_fills_libwebrtc_buffer ... ok\ntest stats::tests::bitrate_computes_kbps_from_byte_delta ... ok\ntest stats::tests::bitrate_first_sample_is_zero ... ok\ntest publisher::tests::parse_codec_maps_known_names ... ok\ntest stats::tests::bitrate_half_second_doubles_rate ... ok\ntest stats::tests::bitrate_rejects_backwards_time_and_bytes ... ok\ntest stats::tests::empty_stats_serialise_to_null_rtt_and_empty_arrays ... ok\ntest stats::tests::full_stats_serialise_to_exact_contract_shape ... ok\ntest stats::tests::sanitize_kbps_drops_nan_inf_negative_and_rounds ... ok\ntest stats::tests::sanitize_audio_level_clamps ... ok\ntest stats::tests::video_inbound_omits_audio_level_audio_omits_fps ... ok\ntest stats::tests::unit_conversions_seconds_to_ms ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_negative_fds ... ok\ntest texture_source::tests::dxgi_format_gate_accepts_8bit_rgba_bgra_only ... ok\ntest texture_source::tests::drm_format_gate_accepts_obs_vkcapture_texture_formats ... ok\ntest texture_source::tests::error_strings_are_stable ... ok\ntest texture_source::tests::probe_is_available_only_for_explicit_hardware_codecs ... ok\ntest texture_source::tests::should_attempt_dmabuf_is_sdk_gated_after_validation_capability ... ok\ntest texture_source::tests::should_attempt_falls_back_when_capability_unavailable ... ok\ntest texture_source::tests::should_attempt_validates_frame_when_capability_available ... ok\ntest texture_source::tests::validate_accepts_a_clean_bgra_texture ... ok\ntest texture_source::tests::validate_dmabuf_accepts_supported_formats_with_optional_uuid ... ok\ntest texture_source::tests::validate_dmabuf_rejects_invalid_planes ... ok\ntest texture_source::tests::validate_precedence_handle_before_dims_before_format ... ok\ntest texture_source::tests::validate_rejects_odd_zero_and_oversized_dims ... ok\ntest texture_source::tests::validate_rejects_unsupported_format ... ok\ntest texture_source::tests::validate_rejects_zero_handle_as_no_texture ... ok\ntest yuv::tests::bgra_black_white_grey_levels ... ok\ntest yuv::tests::bgra_golden_2x2_solid_colour_exact_bytes ... ok\ntest yuv::tests::bgra_golden_strided_2x2_skips_row_padding ... ok\ntest yuv::tests::bgra_primaries_have_expected_chroma_signs ... ok\ntest yuv::tests::bgra_plane_sizes ... ok\ntest yuv::tests::copy_nv12_planes_preserves_nv12_layout ... ok\ntest yuv::tests::copy_nv12_planes_rejects_short_buffers ... ok\ntest yuv::tests::copy_nv12_planes_respects_destination_stride ... ok\ntest yuv::tests::nv12_4x4_deinterleaves_two_chroma_columns ... ok\ntest yuv::tests::nv12_golden_4x2_packed_to_i420 ... ok\ntest yuv::tests::nv12_packed_2x2_deinterleaves ... ok\ntest yuv::tests::nv12_respects_row_padding ... ok\ntest yuv::tests::nv12_short_buffer_is_rejected ... ok\ntest yuv::tests::rejects_odd_or_tiny_dimensions ... ok\ntest yuv::tests::rgb_golden_2x2_solid_colour_matches_bgra_path ... ok\ntest yuv::tests::rgb_plane_sizes_and_levels ... ok\ntest yuv::tests::rgb_rejects_odd_dims_and_short_buffer ... ok\n\ntest result: ok. 89 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 6 tests\ntest outbound_covers_the_single_identity_publish_path ... ok\ntest e2ee_state_is_ok_on_the_wire ... ok\ntest outbound_fixtures_match_contract ... ok\ntest inbound_covers_subscribe_and_lifecycle ... ok\ntest video_frame_meta_matches_contract ... ok\ntest inbound_fixtures_match_contract ... ok\n\ntest result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n▶ webrtc-sender loader wrapper\n ✔ resolves the native addon filename for every desktop OS/arch target (0.414128ms)\n ✔ rejects unsupported platform/architecture pairs explicitly (0.194543ms)\n ✔ returns a native hardware encoder capability when the binding exports one (0.19071ms)\n ✔ delegates dropped video callback metrics through the VoiceEngine wrapper (0.08925ms)\n ✔ delegates shared texture handles through the WebrtcPublisher wrapper (0.244294ms)\n ✔ treats shared texture publishing as unavailable for older publisher bindings (0.05975ms)\n ✔ delegates dma-buf frames through the WebrtcPublisher wrapper (0.130917ms)\n ✔ delegates shared texture handles through the VoiceEngine wrapper (0.093ms)\n ✔ treats shared texture publishing as unavailable for older voice bindings (0.074ms)\n ✔ treats dma-buf publishing as unavailable for older native bindings (0.109542ms)\n ✔ defaults dropped video callback metrics to zero for older native bindings (0.072001ms)\n ✔ delegates remote track subscription updates through the VoiceEngine wrapper (0.090292ms)\n ✔ ignores remote track subscription updates for older native bindings (0.054792ms)\n ✔ delegates data packets through the VoiceEngine wrapper (0.129459ms)\n ✔ rejects invalid data packet payloads in the wrapper (0.139584ms)\n ✔ returns an unavailable hardware encoder capability without a binding (0.063959ms)\n✔ webrtc-sender loader wrapper (3.186227ms)\nℹ tests 16\nℹ suites 1\nℹ pass 16\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 39.277319\n",
- "stderrTail": "warning: webrtc-sys@0.3.33: cuda.h not found; building without hardware accelerated video codec support for NVidia GPUs\nwarning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: variable does not need to be mutable\n --> vendor/libwebrtc/src/native/desktop_capturer.rs:66:13\n |\n66 | let mut sys_handle = sys_dc::ffi::DesktopCapturerOptions {\n | ----^^^^^^^^^^\n | |\n | help: remove this `mut`\n |\n = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 4 warnings (run `cargo fix --lib -p libwebrtc` to apply 3 suggestions)\n Finished `test` profile [unoptimized + debuginfo] target(s) in 0.15s\n Running unittests src/lib.rs (target/debug/deps/fluxer_webrtc_sender-96ed47cbef11f6a0)\n Running tests/event_contract.rs (target/debug/deps/event_contract-c09db034b80d5f00)\n Doc-tests fluxer_webrtc_sender\n"
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:27.641Z",
- "endedAt": "2026-06-05T15:40:30.440Z",
- "durationMs": 2799,
- "stdoutTail": "../mac-app-audio | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-sysctl | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-tcc | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../macos-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n\n> @fluxer/webrtc-sender@0.0.0 test:livekit /workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n> node scripts/livekit-harness.mjs\n\n[livekit-harness] SKIP: LiveKit is unreachable at ws://localhost:7880 (connect ECONNREFUSED 127.0.0.1:7880). Set FLUXER_WEBRTC_SENDER_LIVEKIT_REQUIRED=1 to fail instead.\n",
- "stderrTail": ""
- },
- {
- "name": "linux-screen-capture-build",
- "command": "pnpm --dir native/linux-screen-capture build",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:30.440Z",
- "endedAt": "2026-06-05T15:40:32.883Z",
- "durationMs": 2443,
- "stdoutTail": "../mac-app-audio | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-sysctl | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-tcc | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../macos-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n\n> @fluxer/linux-screen-capture@0.0.0 build /workspaces/fluxer/fluxer_desktop/native/linux-screen-capture\n> node scripts/build-rust.mjs\n\n[buildRustNodeAddon] cwd=/workspaces/fluxer/fluxer_desktop/native/linux-screen-capture\ncargo build --release --target aarch64-unknown-linux-gnu --manifest-path Cargo.toml\n",
- "stderrTail": " Finished `release` profile [optimized] target(s) in 0.13s\n"
- },
- {
- "name": "linux-screen-capture-tests",
- "command": "pnpm --dir native/linux-screen-capture test",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:32.883Z",
- "endedAt": "2026-06-05T15:40:37.620Z",
- "durationMs": 4737,
- "stdoutTail": "../mac-app-audio | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-sysctl | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-tcc | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../macos-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n\n> @fluxer/linux-screen-capture@0.0.0 test /workspaces/fluxer/fluxer_desktop/native/linux-screen-capture\n> cargo test --manifest-path Cargo.toml && node --test index.test.mjs\n\n\nrunning 42 tests\ntest game_capture::tests::auto_import_policy_walks_obs_fallback_ladder ... ok\ntest game_capture::tests::converts_abgr10_row_to_bgra ... ok\ntest game_capture::tests::diagnostics_can_pin_host_mapped_capture_policy ... ok\ntest game_capture::tests::converts_fp16_rgba_row_to_bgra_srgb ... ok\ntest game_capture::tests::diagnostics_modifier_uses_obs_invalid_name ... ok\ntest game_capture::tests::control_message_encodes_obs_import_modes ... ok\ntest game_capture::tests::host_mapped_import_rejects_invalid_stride_and_offset_with_diagnostics ... ok\ntest game_capture::tests::host_mapped_import_rejects_multiplane_descriptors_with_diagnostic ... ok\ntest game_capture::tests::diagnostics_default_to_obs_fallback_capture_policy ... ok\ntest game_capture::tests::identifies_rgba_memory_formats_that_need_swizzle ... ok\ntest game_capture::tests::host_mapped_import_rejects_unsupported_formats_with_supported_list ... ok\ntest game_capture::tests::lifecycle_messages_update_diagnostics_snapshot ... ok\ntest game_capture::tests::host_mapped_import_rejects_invalid_fd_with_diagnostic ... ok\ntest game_capture::tests::host_mapped_import_reads_cpu_nv12_and_preserves_source_dmabuf_metadata ... ok\ntest game_capture::tests::import_mode_env_parses_nvidia_debug_shortcuts ... ok\ntest game_capture::tests::non_host_mapped_import_reports_fallback_requirement ... ok\ntest game_capture::tests::mapped_texture_exports_dmabuf_metadata_for_native_encoder ... ok\ntest napi_surface_linux::tests::parse_source_id_roundtrip ... ok\ntest napi_surface_linux::tests::stream_dimensions_for_node_uses_selected_portal_stream ... ok\ntest nv12_packing::tests::bgra_to_nv12_rejects_short_stride ... ok\ntest game_capture::tests::parses_obs_vkcapture_texture_layout ... ok\ntest napi_surface_linux::tests::parse_source_id_rejects_malformed ... ok\ntest game_capture::tests::parses_client_name_as_c_string ... ok\ntest napi_surface_linux::tests::source_kind_for_type_maps_bits ... ok\ntest nv12_packing::tests::bgra_to_nv12_solid_black ... ok\ntest nv12_packing::tests::pack_nv12_rejects_short_source ... ok\ntest nv12_packing::tests::pack_nv12_rejects_undersized_stride ... ok\ntest nv12_packing::tests::pack_nv12_rejects_wrong_dst_size ... ok\ntest nv12_packing::tests::pack_nv12_strips_row_padding ... ok\ntest nv12_packing::tests::pack_nv12_zero_padding_is_identity ... ok\ntest nv12_packing::tests::packed_size_matches_yuv420_layout ... ok\ntest nv12_packing::tests::packed_size_rejects_odd_height ... ok\ntest nv12_packing::tests::packed_size_rejects_zero_dims ... ok\ntest portal::tests::cursor_mode_constants_match_portal_spec ... ok\ntest portal::tests::cursor_mode_matches_treats_missing_key_as_honoured ... ok\ntest portal::tests::mint_token_is_distinct_and_prefixed ... ok\ntest portal::tests::normalize_desktop_entry_app_id_accepts_fluxer_ids ... ok\ntest portal::tests::normalize_desktop_entry_app_id_rejects_paths_and_empty_values ... ok\ntest portal::tests::request_path_sanitizes_unique_bus_name ... ok\ntest portal::tests::session_path_sanitizes_unique_bus_name ... ok\ntest portal::tests::source_type_mask_combines_monitor_and_window ... ok\ntest nv12_packing::tests::bgra_to_nv12_solid_white_is_in_range ... ok\n\ntest result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n▶ linux-screen-capture game capture launch environment\n ✔ enables OBS Vulkan capture and names the client (0.838797ms)\n ✔ prefers bundled hook assets and can force PRIME/NVIDIA launch variables (0.434836ms)\n ✔ does not duplicate launch path entries or Vulkan layer names (0.278376ms)\n ✔ can force a specific NVIDIA Vulkan ICD for hybrid GPU systems (0.627129ms)\n ✔ keeps obs-vkcapture runtime assets and license notes in the package surface (0.78638ms)\n✔ linux-screen-capture game capture launch environment (3.608563ms)\nℹ tests 5\nℹ suites 1\nℹ pass 5\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 58.707644\n",
- "stderrTail": " Compiling fluxer_linux_screen_capture v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/linux-screen-capture)\n Finished `test` profile [unoptimized + debuginfo] target(s) in 2.44s\n Running unittests src/lib.rs (target/debug/deps/fluxer_linux_screen_capture-0784dd97ce1aa9bb)\n Doc-tests fluxer_linux_screen_capture\n"
- },
- {
- "name": "linux-audio-capture-build",
- "command": "pnpm --dir native/linux-audio-capture build",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:37.620Z",
- "endedAt": "2026-06-05T15:40:41.518Z",
- "durationMs": 3898,
- "stdoutTail": "../mac-app-audio | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-sysctl | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-tcc | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../macos-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n\n> @fluxer/linux-audio-capture@0.0.0 build /workspaces/fluxer/fluxer_desktop/native/linux-audio-capture\n> node scripts/build-rust.mjs\n\n[buildRustNodeAddon] cwd=/workspaces/fluxer/fluxer_desktop/native/linux-audio-capture\ncargo build --release --target aarch64-unknown-linux-gnu --manifest-path Cargo.toml\n",
- "stderrTail": " Compiling fluxer_linux_audio_capture v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/linux-audio-capture)\n Finished `release` profile [optimized] target(s) in 1.29s\n"
- },
- {
- "name": "linux-audio-capture-tests",
- "command": "pnpm --dir native/linux-audio-capture test",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-05T15:40:41.518Z",
- "endedAt": "2026-06-05T15:40:45.392Z",
- "durationMs": 3874,
- "stdoutTail": "../mac-app-audio | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-sysctl | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../mac-tcc | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../macos-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"darwin\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"linux\",\"cpu\":\"arm64\",\"libc\":\"glibc\"})\n\n> @fluxer/linux-audio-capture@0.0.0 test /workspaces/fluxer/fluxer_desktop/native/linux-audio-capture\n> cargo test --manifest-path Cargo.toml\n\n\nrunning 69 tests\ntest audio_contract::tests::sample_duration_conversion_uses_whole_audio_frames ... ok\ntest audio_contract::tests::whole_frame_sample_count_trims_incomplete_channel_frames ... ok\ntest audio_contract::tests::routing_parser_caps_are_intentionally_finite ... ok\ntest audio_contract::tests::direct_append_slice_keeps_only_complete_stereo_samples_within_queue_cap ... ok\ntest audio_contract::tests::direct_read_count_is_bounded_and_stereo_aligned ... ok\ntest audio_contract::tests::direct_read_count_uses_stable_twenty_ms_chunks ... ok\ntest audio_contract::tests::direct_capture_latency_matches_stable_screen_share_buffer ... ok\ntest direct_buffer::tests::format_changes_clear_queued_samples ... ok\ntest env::tests::hint_str_matches_audio_backend_js_contract ... ok\ntest direct_buffer::tests::read_emits_stable_twenty_ms_chunks_with_continuous_timestamps ... ok\ntest env::tests::none_when_no_audio_hint_present ... ok\ntest env::tests::pipewire_wins_when_both_present ... ok\ntest env::tests::prefers_pipewire_when_pipewire_runtime_dir_set ... ok\ntest env::tests::pulse_server_falls_through_to_pulseaudio_when_no_pipewire_hint ... ok\ntest env::tests::xdg_runtime_dir_alone_is_enough_for_pipewire_hint ... ok\ntest pipewire_bridge::tests::direct_chunk_payload_range_respects_pipewire_chunk_offset ... ok\ntest pipewire_bridge::tests::direct_stream_props_capture_private_sink_monitor ... ok\ntest pipewire_bridge::tests::direct_audio_info_advertises_stereo_fl_fr ... ok\ntest pipewire_bridge::tests::is_routable_media_class_matches_audio_node_classes ... ok\ntest pipewire_bridge::tests::link_props_carry_per_port_routing ... ok\ntest pipewire_bridge::tests::private_sink_props_advertise_hidden_audio_sink ... ok\ntest pipewire_bridge::tests::virtual_sink_props_match_legacy_contract ... ok\ntest pipewire_bridge::tests::next_direct_sink_name_is_unique_per_call ... ok\ntest pulse_bridge::tests::pulse_direct_read_size_matches_capture_latency ... ok\ntest pipewire_bridge::tests::default_sink_target_id_uses_object_serial_for_matching_node_name ... ok\ntest pipewire_bridge::tests::inventory_does_not_inherit_client_object_serial_as_node_target ... ok\ntest pipewire_bridge::tests::inventory_falls_back_to_pipewire_security_pid ... ok\ntest pipewire_bridge::tests::inventory_enriches_nodes_with_owning_client_identity ... ok\ntest pipewire_bridge::tests::inventory_keeps_node_properties_authoritative_over_client_props ... ok\ntest pipewire_bridge::tests::matching_pinned_capture_nodes_only_matches_record_stream_inputs ... ok\ntest pipewire_bridge::tests::pick_node_ports_applies_same_fallback_to_private_capture_inputs ... ok\ntest pipewire_bridge::tests::pick_source_output_ports_falls_back_to_first_two_jack_style_ports ... ok\ntest pipewire_bridge::tests::pick_source_output_ports_fans_mono_to_both_inputs ... ok\ntest direct_buffer::tests::overflow_drops_from_front_and_advances_timestamp ... ok\ntest pipewire_bridge::tests::pick_source_output_ports_prefers_stereo_pair ... ok\ntest pipewire_bridge::tests::pick_source_output_ports_returns_none_when_only_one_side_present ... ok\ntest pipewire_bridge::tests::pick_source_output_ports_treats_blank_channel_as_mono ... ok\ntest pulse_bridge::tests::build_input_props_synthesises_media_class_and_target_object ... ok\ntest pulse_bridge::tests::extract_target_pid_prefers_include_then_pin ... ok\ntest pipewire_bridge::tests::pick_source_output_ports_returns_none_when_no_outputs ... ok\ntest routing::tests::empty_rules_route_nothing_and_sink_id_is_excluded ... ok\ntest pulse_bridge::tests::daemon_unreachable_returns_none_from_open ... ok\ntest routing::tests::include_mode_honors_hardware_filtering_and_never_rules ... ok\ntest routing::tests::include_mode_rejects_non_playback_nodes_that_match_the_include_filter ... ok\ntest routing::tests::matches_any_requires_at_least_one_matching_pattern ... ok\ntest routing::tests::missing_keys_and_mismatched_values_do_not_match ... ok\ntest routing::tests::parse_default_sink_name_is_strict_and_tolerant ... ok\ntest routing::tests::routing_refuses_non_playback_media_classes_even_when_included ... ok\ntest routing::tests::self_identity_matches_across_documented_pipewire_keys ... ok\ntest routing::tests::structural_self_identity_wins_over_include_rules ... ok\ntest routing::tests::synthetic_display_pattern_keys_do_not_affect_routing ... ok\ntest routing::tests::system_mode_routes_only_default_playback_streams ... ok\ntest self_identity::tests::parse_ppid_handles_comm_with_spaces_and_parens ... ok\ntest routing::tests::synthetic_target_object_pattern_matches_name_or_serial ... ok\ntest self_identity::tests::parse_ppid_handles_plain_stat ... ok\ntest pipewire_bridge::tests::daemon_unreachable_returns_none_from_open ... ok\ntest pipewire_bridge::tests::integration_smoke_apply_release_cycle_is_safe ... ok\ntest pulse_bridge::tests::direct_capture_open_then_drop_is_safe_without_daemon ... ok\ntest routing::tests::system_mode_accepts_default_sink_object_id_targets ... ok\ntest self_identity::tests::strip_exe_suffix_handles_known_extensions ... ok\ntest routing::tests::system_mode_accepts_untargeted_and_node_target_streams ... ok\ntest pipewire_bridge::tests::direct_open_returns_none_or_cleans_up ... ok\ntest self_identity::tests::parse_ppid_returns_none_on_malformed_input ... ok\ntest self_identity::tests::populate_self_identity_records_own_pid ... ok\ntest pulse_bridge::tests::direct_capture_start_then_drop_without_daemon_is_clean ... ok\ntest pulse_bridge::tests::per_pid_sink_args_format_is_stable ... ok\ntest routing::tests::empty_pattern_matches_any_candidate ... ok\ntest pulse_bridge::tests::integration_smoke_apply_release_cycle_does_not_deadlock ... ok\ntest pulse_bridge::tests::push_f32_chunk_respects_queue_cap_and_self_consistent_after_drain ... ok\n\ntest result: ok. 69 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n",
- "stderrTail": " Compiling fluxer_linux_audio_capture v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/linux-audio-capture)\n Finished `test` profile [unoptimized + debuginfo] target(s) in 1.32s\n Running unittests src/lib.rs (target/debug/deps/fluxer_linux_audio_capture-d5f10b7d43827c26)\n[W][15:40:45.313376] pw.conf | [ conf.c: 1182 try_load_conf()] can't load config client.conf: No such file or directory\n[E][15:40:45.313405] pw.conf | [ conf.c: 1215 pw_conf_load_conf_for_context()] can't load config client.conf: No such file or directory\n[W][15:40:45.313191] pw.conf | [ conf.c: 1182 try_load_conf()] can't load config client.conf: No such file or directory\n[E][15:40:45.313441] pw.conf | [ conf.c: 1215 pw_conf_load_conf_for_context()] can't load config client.conf: No such file or directory\n[W][15:40:45.313613] pw.conf | [ conf.c: 1182 try_load_conf()] can't load config client.conf: No such file or directory\n[E][15:40:45.313620] pw.conf | [ conf.c: 1215 pw_conf_load_conf_for_context()] can't load config client.conf: No such file or directory\n Doc-tests fluxer_linux_audio_capture\n"
- }
- ]
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-06T22-10-30Z-codex-host-smoke/summary.json b/fluxer_desktop/native-media-reports/2026-06-06T22-10-30Z-codex-host-smoke/summary.json
deleted file mode 100644
index 9ad9b41e2..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-06T22-10-30Z-codex-host-smoke/summary.json
+++ /dev/null
@@ -1,149 +0,0 @@
-{
- "status": "fail",
- "mode": "smoke",
- "strict": false,
- "platform": "darwin",
- "arch": "arm64",
- "hostname": "Hampuss-Mac-Studio.local",
- "startedAt": "2026-06-06T22:10:30.484Z",
- "endedAt": "2026-06-06T22:11:23.013Z",
- "reportDir": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-06T22-10-30Z-codex-host-smoke",
- "gates": [
- {
- "name": "mode-valid",
- "status": "pass",
- "mode": "smoke"
- },
- {
- "name": "documentation-current",
- "status": "pass",
- "missing": []
- },
- {
- "name": "strict-prerequisites",
- "status": "skip",
- "reason": "smoke mode"
- },
- {
- "name": "strict-command-plan",
- "status": "skip",
- "reason": "smoke mode"
- }
- ],
- "plannedCommands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/WebrtcScreenPublish.test.mjs src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "cwd": "."
- },
- {
- "name": "mac-screen-capture-build",
- "command": "pnpm --dir native/mac-screen-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-screen-capture-tests",
- "command": "pnpm --dir native/mac-screen-capture test",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-build",
- "command": "pnpm --dir native/mac-app-audio build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-rust-tests",
- "command": "pnpm --dir native/mac-app-audio test:cargo",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-js-tests",
- "command": "'/Users/hampus/Development/fluxer/node_modules/.pnpm/node_modules/.bin/vitest' run",
- "category": "platform-native",
- "cwd": "native/mac-app-audio"
- }
- ],
- "commands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/WebrtcScreenPublish.test.mjs src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:10:30.486Z",
- "endedAt": "2026-06-06T22:10:30.704Z",
- "durationMs": 218,
- "stdoutTail": "▶ NativeScreenCapture DMA-BUF metadata validation\n ✔ accepts valid DMA-BUF metadata and pads native plane arrays (2.191542ms)\n ✔ keeps valid handles when optional device UUID metadata is absent or malformed (0.45425ms)\n ✔ rejects invalid plane counts, FDs, strides, and format metadata (0.478709ms)\n✔ NativeScreenCapture DMA-BUF metadata validation (3.578041ms)\n▶ NativeScreenCapture source identity and capability reporting\n ✔ normalizes display and window sources without changing source ids (0.671125ms)\n ✔ starts display and window captures with exact source id and kind and reports diagnostics (1.393083ms)\n ✔ forwards frames to renderer even when a native frame tap is installed (0.572875ms)\n ✔ reports macOS and Linux display/window capture capabilities from platform backends (1.508583ms)\n✔ NativeScreenCapture source identity and capability reporting (4.293125ms)\n▶ NativeVoiceEngine screen frame routing\n ✔ pushes the initial capture frame after publishing screen share (2.516958ms)\n ✔ prefers Windows shared texture handles over DMA-BUF and CPU frames (0.687709ms)\n ✔ uses Linux DMA-BUF handles before CPU conversion (0.544916ms)\n ✔ falls back to CPU frames when GPU paths are unavailable or rejected (0.468917ms)\n ✔ keeps screen-share audio published when screen video is unpublished (0.553791ms)\n ✔ replaces screen capture taps without releasing screen-share audio or duplicating priority (0.479167ms)\n ✔ forwards watch and unwatch operations with source, enablement, and quality intact (1.627166ms)\n ✔ reports VideoToolbox hardware capability from the native addon (0.5325ms)\n ✔ reports native voice engine capabilities from the native addon (0.4195ms)\n ✔ maps native addon microphone not-connected errors to the typed operation code (0.560208ms)\n✔ NativeVoiceEngine screen frame routing (9.007958ms)\n▶ WebrtcScreenPublish native frame routing\n ✔ prefers Windows shared texture handles over DMA-BUF and CPU buffers (2.107208ms)\n ✔ uses Linux DMA-BUF handles before CPU conversion (0.448834ms)\n ✔ falls back to CPU frames when GPU paths are unavailable or rejected (0.413166ms)\n ✔ replaces an existing publisher before routing frames for the same capture id (0.406ms)\n✔ WebrtcScreenPublish native frame routing (3.859209ms)\nℹ tests 21\nℹ suites 4\nℹ pass 21\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 155.770792\n",
- "stderrTail": ""
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:10:30.705Z",
- "endedAt": "2026-06-06T22:10:32.150Z",
- "durationMs": 1445,
- "stdoutTail": "native/linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> fluxer_desktop@0.0.0 typecheck /Users/hampus/Development/fluxer/fluxer_desktop\n> tsgo --noEmit\n\n",
- "stderrTail": ""
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:10:32.150Z",
- "endedAt": "2026-06-06T22:11:01.715Z",
- "durationMs": 29565,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/webrtc-sender@0.0.0 build /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n+ /Users/hampus/.rustup/toolchains/1.93.0-aarch64-apple-darwin/bin/cargo build --release --target aarch64-apple-darwin --manifest-path Cargo.toml --features camera-native\n",
- "stderrTail": "warning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 3 warnings (run `cargo fix --lib -p libwebrtc` to apply 2 suggestions)\n Compiling fluxer_webrtc_sender v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender)\n Finished `release` profile [optimized] target(s) in 9.86s\n"
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "status": "fail",
- "code": 1,
- "signal": null,
- "startedAt": "2026-06-06T22:11:01.715Z",
- "endedAt": "2026-06-06T22:11:23.013Z",
- "durationMs": 21298,
- "stdoutTail": "e_contract_range ... ok\ntest audio::tests::is_muted_only_at_zero ... ok\ntest audio::tests::processing_options_preserve_defaults_unless_overridden ... ok\ntest audio::tests::output_devices_json_array ... ok\ntest audio::tests::output_device_json_locks_the_contract_shape ... ok\ntest audio::tests::input_devices_json_array ... ok\ntest audio::tests::shape_input_marks_index_zero_default_and_drops_empty_ids ... ok\ntest audio::tests::shape_marks_index_zero_default_and_drops_empty_ids ... ok\ntest camera::live::tests::fallback_format_selection_uses_decoder_supported_non_mjpeg_modes ... ok\ntest camera::live::tests::fallback_format_selection_prefers_nearest_resolution_before_format_priority ... ok\ntest camera::tests::from_opts_applies_defaults ... ok\ntest camera::tests::from_opts_forces_even_dims_and_honours_overrides ... ok\ntest camera::tests::from_opts_parses_device_index ... ok\ntest camera::tests::from_opts_preserves_string_device_ids ... ok\ntest camera::tests::from_opts_rejects_degenerate_dims_and_fps ... ok\ntest config::tests::accepts_dimension_boundaries_and_rejects_zero_fps ... ok\ntest config::tests::canonical_codec_name_accepts_all_five_case_insensitively ... ok\ntest config::tests::canonical_codec_name_rejects_empty_and_unknown ... ok\ntest config::tests::rejects_bad_url ... ok\ntest config::tests::rejects_empty_token ... ok\ntest config::tests::rejects_odd_or_oob_dimensions ... ok\ntest config::tests::rejects_unknown_non_empty_codec_but_allows_empty_default ... ok\ntest config::tests::state_gates_frames_and_connect ... ok\ntest config::tests::valid_config_passes ... ok\ntest engine::tests::adaptive_video_sender_buffers_two_fresh_frames_without_coalescing ... ok\ntest engine::tests::adaptive_video_sender_coalesces_only_when_fresh_queue_overflows ... ok\ntest engine::tests::adaptive_video_sender_drops_stale_queued_frame_without_counting_coalescing ... ok\ntest engine::tests::adaptive_video_sender_stop_clears_pending_and_rejects_new_frames ... ok\ntest engine::tests::bgra_input_validation_requires_even_dims_stride_and_complete_buffer ... ok\ntest engine::tests::nv12_input_validation_requires_complete_luma_and_chroma_planes ... ok\ntest engine::tests::parse_codec_agrees_with_pure_canonicaliser ... ok\ntest engine::tests::parse_codec_maps_all_five_including_h265 ... ok\ntest engine::tests::parse_codec_rejects_empty_and_unknown ... ok\ntest engine::tests::parse_track_source_accepts_renderer_and_livekit_spellings ... ok\ntest engine::tests::parse_video_quality_accepts_subscription_quality_levels ... ok\ntest engine::tests::pcm16_audio_frame_rejects_malformed_buffers ... ok\ntest engine::tests::pcm16_audio_frame_shapes_interleaved_stereo_samples ... ok\ntest engine::tests::session_rtt_falls_back_to_subscriber_and_preserves_existing_rtt ... ok\ntest engine::tests::session_rtt_uses_peer_connection_candidate_pair_without_track_stats ... ok\ntest engine::tests::tight_i420_len_matches_plane_geometry ... ok\ntest engine::tests::video_frame_meta_json_matches_contract ... ok\ntest engine::tests::video_input_validation_rejects_degenerate_odd_and_oversized_frames ... ok\ntest engine::tests::video_timestamp_validation_rejects_values_that_cast_badly_at_napi_boundary ... ok\ntest events::tests::empty_object_and_array ... ok\ntest events::tests::escapes_quote_backslash_and_control_chars ... ok\ntest events::tests::json_object_preserves_order_and_mixes_str_and_raw ... ok\ntest events::tests::json_u8_array_serializes_bytes_as_numbers ... ok\ntest events::tests::leaves_plain_ascii_and_unicode_untouched ... ok\ntest events::tests::raw_array_preserves_prebuilt_json_objects ... ok\ntest hardware_encoder::tests::publish_codec_runtime_gate_accepts_h265_when_reported_available ... ok\ntest hardware_encoder::tests::publish_codec_runtime_gate_only_requires_hardware_for_h265 ... ok\ntest hardware_encoder::tests::reports_available_nvenc_when_compiled_and_runtime_ready ... ok\ntest hardware_encoder::tests::reports_available_videotoolbox_with_h264_and_h265 ... ok\ntest hardware_encoder::tests::reports_driver_sdk_incompatibility_before_encode_session ... ok\ntest hardware_encoder::tests::reports_h264_only_when_hevc_guid_is_absent ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_compiled ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_probe_is_absent ... ok\ntest hardware_encoder::tests::reports_no_cuda_devices_using_obs_style_reason ... ok\ntest hardware_encoder::tests::reports_no_supported_codecs_when_guid_query_finds_no_fluxer_codecs ... ok\ntest hardware_encoder::tests::reports_not_compiled_before_runtime_missing ... ok\ntest hardware_encoder::tests::reports_unsupported_platforms_clearly ... ok\ntest hardware_encoder::tests::reports_videotoolbox_h264_only_when_hevc_session_is_unavailable ... ok\ntest hardware_encoder::tests::reports_videotoolbox_unavailable_with_status_details ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_publish_backend_not_compiled ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_runtime_dll_names_when_missing ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_without_linux_zero_copy_inputs ... ok\ntest publisher::tests::parse_codec_maps_known_names ... ok\ntest publisher::tests::i420_plane_copy_fills_libwebrtc_buffer ... ok\ntest send_control::tests::audio_buffer_growth_caps_at_configured_max_and_reset_clears_pressure ... ok\ntest send_control::tests::audio_buffer_expands_on_gaps_and_shrinks_after_stability ... ok\ntest send_control::tests::audio_buffer_ignores_clock_regression_without_false_rebuffer ... ok\ntest send_control::tests::audio_buffer_max_is_clamped_to_real_time_bounds ... ok\ntest send_control::tests::idle_snapshot_reflects_audio_pressure_without_video_state ... ok\ntest send_control::tests::video_controller_continues_degrading_to_minimum_under_sustained_pressure ... ok\ntest send_control::tests::video_controller_counts_coalesced_replacements_once_for_pressure ... ok\ntest send_control::tests::audio_buffer_ignores_concurrent_stale_pushes_without_moving_last_push_backwards ... ok\ntest send_control::tests::video_controller_degrades_on_encoder_egress_pressure ... ok\ntest send_control::tests::audio_buffer_stress_stays_within_realtime_bounds_under_jitter ... ok\ntest send_control::tests::video_controller_degrades_on_latency_pressure_without_coalescing ... ok\ntest send_control::tests::video_controller_degrades_on_repeated_coalescing_pressure ... ok\ntest send_control::tests::video_controller_degrades_when_disrupted_frame_ratio_exceeds_threshold ... ok\ntest send_control::tests::video_controller_ignores_bounded_one_frame_coalescing_pressure ... ok\ntest send_control::tests::video_controller_ignores_single_encoder_egress_sample ... ok\ntest send_control::tests::video_controller_keeps_requested_fps_when_adaptive_send_is_disabled ... ok\ntest send_control::tests::video_controller_preserves_pressure_reason_while_degraded_but_stable ... ok\ntest send_control::tests::video_controller_recovers_after_stable_windows ... ok\ntest send_control::tests::video_controller_recovers_from_minimum_in_two_stable_steps ... ok\ntest send_control::tests::video_controller_requires_a_full_stable_recovery_window ... ok\ntest send_control::tests::video_controller_waits_until_pressure_window_boundary ... ok\ntest send_control::tests::video_stats_effective_fps_uses_capture_time_bounds_for_out_of_order_records ... ok\ntest send_control::tests::video_stats_snapshot_counts_coalescing_drops_failures_and_effective_fps ... ok\ntest stats::tests::bitrate_computes_kbps_from_byte_delta ... ok\ntest stats::tests::bitrate_first_sample_is_zero ... ok\ntest stats::tests::bitrate_half_second_doubles_rate ... ok\ntest send_control::tests::video_controller_stress_keeps_target_inside_configured_bounds ... ok\ntest stats::tests::bitrate_rejects_backwards_time_and_bytes ... ok\ntest stats::tests::empty_stats_serialise_to_null_rtt_and_empty_arrays ... ok\ntest stats::tests::sanitize_audio_level_clamps ... ok\ntest stats::tests::full_stats_serialise_to_exact_contract_shape ... ok\ntest stats::tests::sanitize_kbps_drops_nan_inf_negative_and_rounds ... ok\ntest stats::tests::send_health_serialises_to_exact_contract_shape ... ok\ntest stats::tests::unit_conversions_seconds_to_ms ... ok\ntest stats::tests::video_inbound_omits_audio_level_audio_omits_fps ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_populates_all_plane_arrays ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_incomplete_native_inputs ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_negative_fds ... ok\ntest texture_source::tests::drm_format_gate_accepts_obs_vkcapture_texture_formats ... ok\ntest texture_source::tests::dxgi_format_gate_accepts_8bit_rgba_bgra_only ... ok\ntest send_control::tests::video_stats_handles_concurrent_recording_without_lost_counts ... ok\ntest texture_source::tests::error_strings_are_stable ... ok\ntest texture_source::tests::probe_is_available_only_for_explicit_hardware_codecs ... ok\ntest texture_source::tests::should_attempt_dmabuf_is_sdk_gated_after_validation_capability ... ok\ntest texture_source::tests::should_attempt_falls_back_when_capability_unavailable ... ok\ntest texture_source::tests::should_attempt_validates_frame_when_capability_available ... ok\ntest texture_source::tests::validate_accepts_a_clean_bgra_texture ... ok\ntest texture_source::tests::validate_dmabuf_accepts_supported_formats_with_optional_uuid ... ok\ntest texture_source::tests::validate_dmabuf_rejects_invalid_planes ... ok\ntest texture_source::tests::validate_precedence_handle_before_dims_before_format ... ok\ntest texture_source::tests::validate_rejects_odd_zero_and_oversized_dims ... ok\ntest texture_source::tests::validate_rejects_unsupported_format ... ok\ntest texture_source::tests::validate_rejects_zero_handle_as_no_texture ... ok\ntest yuv::tests::bgra_black_white_grey_levels ... ok\ntest yuv::tests::bgra_golden_2x2_solid_colour_exact_bytes ... ok\ntest yuv::tests::bgra_golden_strided_2x2_skips_row_padding ... ok\ntest yuv::tests::bgra_plane_sizes ... ok\ntest yuv::tests::bgra_primaries_have_expected_chroma_signs ... ok\ntest yuv::tests::copy_nv12_planes_preserves_nv12_layout ... ok\ntest yuv::tests::copy_nv12_planes_rejects_short_buffers ... ok\ntest yuv::tests::copy_nv12_planes_respects_destination_stride ... ok\ntest yuv::tests::nv12_4x4_deinterleaves_two_chroma_columns ... ok\ntest yuv::tests::nv12_golden_4x2_packed_to_i420 ... ok\ntest yuv::tests::nv12_packed_2x2_deinterleaves ... ok\ntest yuv::tests::nv12_respects_row_padding ... ok\ntest yuv::tests::nv12_short_buffer_is_rejected ... ok\ntest yuv::tests::rejects_odd_or_tiny_dimensions ... ok\ntest yuv::tests::rgb_golden_2x2_solid_colour_matches_bgra_path ... ok\ntest yuv::tests::rgb_plane_sizes_and_levels ... ok\ntest yuv::tests::rgb_rejects_odd_dims_and_short_buffer ... ok\ntest engine::tests::pcm16_audio_frame_rejects_implausible_format_and_overlong_chunks ... ok\n\ntest result: ok. 140 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s\n\n\nrunning 6 tests\ntest outbound_fixtures_match_contract ... ok\ntest video_frame_meta_matches_contract ... ok\ntest inbound_covers_subscribe_and_lifecycle ... ok\ntest outbound_covers_the_single_identity_publish_path ... ok\ntest e2ee_state_is_ok_on_the_wire ... ok\ntest inbound_fixtures_match_contract ... ok\n\ntest result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n✖ index.test.mjs (65.935708ms)\n✖ scripts/livekit-harness.test.mjs (68.75525ms)\nℹ tests 2\nℹ suites 0\nℹ pass 0\nℹ fail 2\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 75.266917\n\n✖ failing tests:\n\ntest at index.test.mjs:1:1\n✖ index.test.mjs (65.935708ms)\n 'test failed'\n\ntest at scripts/livekit-harness.test.mjs:1:1\n✖ scripts/livekit-harness.test.mjs (68.75525ms)\n 'test failed'\n ELIFECYCLE Test failed. See above for more details.\n WARN Local package.json exists, but node_modules missing, did you mean to install?\n",
- "stderrTail": " Compiling ring v0.17.14\n Compiling fluxer_webrtc_sender v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender)\n Compiling fluxer_voice_core v0.1.0 (/Users/hampus/Development/fluxer/fluxer_voice_core)\n Compiling rustls v0.23.40\n Compiling rustls-webpki v0.103.13\n Compiling tokio-rustls v0.26.4\n Compiling tungstenite v0.29.0\n Compiling hyper-rustls v0.27.9\n Compiling reqwest v0.12.28\n Compiling tokio-tungstenite v0.29.0\n Compiling livekit-api v0.5.0\n Compiling webrtc-sys-build v0.3.18\n Compiling webrtc-sys v0.3.33 (/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys)\n Compiling libwebrtc v0.3.35 (/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/vendor/libwebrtc)\nwarning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\n Compiling livekit v0.7.43\nwarning: `libwebrtc` (lib) generated 3 warnings (run `cargo fix --lib -p libwebrtc` to apply 2 suggestions)\n Finished `test` profile [unoptimized + debuginfo] target(s) in 17.99s\n Running unittests src/lib.rs (target/debug/deps/fluxer_webrtc_sender-4fb413a724225319)\n Running tests/event_contract.rs (target/debug/deps/event_contract-dc15840aabc01f6c)\n Doc-tests fluxer_webrtc_sender\n"
- }
- ]
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-06T22-15-48Z-codex-host-smoke-signed/livekit-harness.json b/fluxer_desktop/native-media-reports/2026-06-06T22-15-48Z-codex-host-smoke-signed/livekit-harness.json
deleted file mode 100644
index 690ca680c..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-06T22-15-48Z-codex-host-smoke-signed/livekit-harness.json
+++ /dev/null
@@ -1,197 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-06T22:15:58.713Z",
- "endedAt": "2026-06-06T22:16:28.718Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:7880",
- "serverApiUrl": "http://127.0.0.1:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-84586-8f492568-efae-42a1-a344-5a0c9599fa8d",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-84586",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-84586",
- "subscriberIdentity": "fluxer-native-subscriber-84586",
- "required": false,
- "strict": false,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 0,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0,
- "maxFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": false,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": false,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-06T22-15-48Z-codex-host-smoke-signed/livekit-harness.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": false
- },
- {
- "name": "subscriber connected",
- "pass": false
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": false
- },
- {
- "name": "subscriber video resolution 320x180",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 3",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 1",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 3",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1346:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1773:3)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:2025:18)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:2058:19",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": null,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": null
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-06T22-15-48Z-codex-host-smoke-signed/summary.json b/fluxer_desktop/native-media-reports/2026-06-06T22-15-48Z-codex-host-smoke-signed/summary.json
deleted file mode 100644
index fe5200c39..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-06T22-15-48Z-codex-host-smoke-signed/summary.json
+++ /dev/null
@@ -1,162 +0,0 @@
-{
- "status": "fail",
- "mode": "smoke",
- "strict": false,
- "platform": "darwin",
- "arch": "arm64",
- "hostname": "Hampuss-Mac-Studio.local",
- "startedAt": "2026-06-06T22:15:48.881Z",
- "endedAt": "2026-06-06T22:16:28.858Z",
- "reportDir": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-06T22-15-48Z-codex-host-smoke-signed",
- "gates": [
- {
- "name": "mode-valid",
- "status": "pass",
- "mode": "smoke"
- },
- {
- "name": "documentation-current",
- "status": "pass",
- "missing": []
- },
- {
- "name": "strict-prerequisites",
- "status": "skip",
- "reason": "smoke mode"
- },
- {
- "name": "strict-command-plan",
- "status": "skip",
- "reason": "smoke mode"
- }
- ],
- "plannedCommands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/WebrtcScreenPublish.test.mjs src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "cwd": "."
- },
- {
- "name": "mac-screen-capture-build",
- "command": "pnpm --dir native/mac-screen-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-screen-capture-tests",
- "command": "pnpm --dir native/mac-screen-capture test",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-build",
- "command": "pnpm --dir native/mac-app-audio build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-rust-tests",
- "command": "pnpm --dir native/mac-app-audio test:cargo",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-js-tests",
- "command": "'/Users/hampus/Development/fluxer/node_modules/.pnpm/node_modules/.bin/vitest' run",
- "category": "platform-native",
- "cwd": "native/mac-app-audio"
- }
- ],
- "commands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/WebrtcScreenPublish.test.mjs src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:15:48.882Z",
- "endedAt": "2026-06-06T22:15:49.087Z",
- "durationMs": 205,
- "stdoutTail": "▶ NativeScreenCapture DMA-BUF metadata validation\n ✔ accepts valid DMA-BUF metadata and pads native plane arrays (2.208167ms)\n ✔ keeps valid handles when optional device UUID metadata is absent or malformed (0.448834ms)\n ✔ rejects invalid plane counts, FDs, strides, and format metadata (0.462542ms)\n✔ NativeScreenCapture DMA-BUF metadata validation (3.565042ms)\n▶ NativeScreenCapture source identity and capability reporting\n ✔ normalizes display and window sources without changing source ids (0.66975ms)\n ✔ starts display and window captures with exact source id and kind and reports diagnostics (1.315458ms)\n ✔ forwards frames to renderer even when a native frame tap is installed (0.511625ms)\n ✔ reports macOS and Linux display/window capture capabilities from platform backends (1.343834ms)\n✔ NativeScreenCapture source identity and capability reporting (3.975166ms)\n▶ NativeVoiceEngine screen frame routing\n ✔ pushes the initial capture frame after publishing screen share (2.103875ms)\n ✔ prefers Windows shared texture handles over DMA-BUF and CPU frames (0.476083ms)\n ✔ uses Linux DMA-BUF handles before CPU conversion (0.5025ms)\n ✔ falls back to CPU frames when GPU paths are unavailable or rejected (0.419958ms)\n ✔ keeps screen-share audio published when screen video is unpublished (0.485458ms)\n ✔ replaces screen capture taps without releasing screen-share audio or duplicating priority (0.930666ms)\n ✔ forwards watch and unwatch operations with source, enablement, and quality intact (0.89425ms)\n ✔ reports VideoToolbox hardware capability from the native addon (0.447916ms)\n ✔ reports native voice engine capabilities from the native addon (0.39275ms)\n ✔ maps native addon microphone not-connected errors to the typed operation code (0.527125ms)\n✔ NativeVoiceEngine screen frame routing (7.720792ms)\n▶ WebrtcScreenPublish native frame routing\n ✔ prefers Windows shared texture handles over DMA-BUF and CPU buffers (1.90625ms)\n ✔ uses Linux DMA-BUF handles before CPU conversion (0.453542ms)\n ✔ falls back to CPU frames when GPU paths are unavailable or rejected (0.402ms)\n ✔ replaces an existing publisher before routing frames for the same capture id (0.400541ms)\n✔ WebrtcScreenPublish native frame routing (3.595417ms)\nℹ tests 21\nℹ suites 4\nℹ pass 21\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 144.171292\n",
- "stderrTail": ""
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:15:49.088Z",
- "endedAt": "2026-06-06T22:15:50.164Z",
- "durationMs": 1076,
- "stdoutTail": "native/linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> fluxer_desktop@0.0.0 typecheck /Users/hampus/Development/fluxer/fluxer_desktop\n> tsgo --noEmit\n\n",
- "stderrTail": ""
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:15:50.164Z",
- "endedAt": "2026-06-06T22:15:54.767Z",
- "durationMs": 4603,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/webrtc-sender@0.0.0 build /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n+ /Users/hampus/.rustup/toolchains/1.93.0-aarch64-apple-darwin/bin/cargo build --release --target aarch64-apple-darwin --manifest-path Cargo.toml --features camera-native\n+ codesign --force --sign - /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/webrtc-sender.darwin-arm64.node\n",
- "stderrTail": "warning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 3 warnings (run `cargo fix --lib -p libwebrtc` to apply 2 suggestions)\n Finished `release` profile [optimized] target(s) in 0.17s\n/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/webrtc-sender.darwin-arm64.node: replacing existing signature\n"
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:15:54.767Z",
- "endedAt": "2026-06-06T22:15:57.734Z",
- "durationMs": 2967,
- "stdoutTail": ".. ok\ntest hardware_encoder::tests::publish_codec_runtime_gate_only_requires_hardware_for_h265 ... ok\ntest hardware_encoder::tests::reports_available_nvenc_when_compiled_and_runtime_ready ... ok\ntest hardware_encoder::tests::reports_available_videotoolbox_with_h264_and_h265 ... ok\ntest hardware_encoder::tests::reports_driver_sdk_incompatibility_before_encode_session ... ok\ntest hardware_encoder::tests::reports_h264_only_when_hevc_guid_is_absent ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_compiled ... ok\ntest hardware_encoder::tests::reports_no_cuda_devices_using_obs_style_reason ... ok\ntest hardware_encoder::tests::reports_no_supported_codecs_when_guid_query_finds_no_fluxer_codecs ... ok\ntest hardware_encoder::tests::reports_not_compiled_before_runtime_missing ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_probe_is_absent ... ok\ntest hardware_encoder::tests::reports_unsupported_platforms_clearly ... ok\ntest hardware_encoder::tests::reports_videotoolbox_h264_only_when_hevc_session_is_unavailable ... ok\ntest hardware_encoder::tests::reports_videotoolbox_unavailable_with_status_details ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_publish_backend_not_compiled ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_runtime_dll_names_when_missing ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_without_linux_zero_copy_inputs ... ok\ntest publisher::tests::i420_plane_copy_fills_libwebrtc_buffer ... ok\ntest publisher::tests::parse_codec_maps_known_names ... ok\ntest send_control::tests::audio_buffer_growth_caps_at_configured_max_and_reset_clears_pressure ... ok\ntest send_control::tests::audio_buffer_ignores_clock_regression_without_false_rebuffer ... ok\ntest send_control::tests::audio_buffer_expands_on_gaps_and_shrinks_after_stability ... ok\ntest send_control::tests::audio_buffer_max_is_clamped_to_real_time_bounds ... ok\ntest send_control::tests::idle_snapshot_reflects_audio_pressure_without_video_state ... ok\ntest send_control::tests::video_controller_counts_coalesced_replacements_once_for_pressure ... ok\ntest send_control::tests::video_controller_continues_degrading_to_minimum_under_sustained_pressure ... ok\ntest send_control::tests::audio_buffer_stress_stays_within_realtime_bounds_under_jitter ... ok\ntest send_control::tests::video_controller_degrades_on_encoder_egress_pressure ... ok\ntest send_control::tests::audio_buffer_ignores_concurrent_stale_pushes_without_moving_last_push_backwards ... ok\ntest send_control::tests::video_controller_degrades_on_latency_pressure_without_coalescing ... ok\ntest send_control::tests::video_controller_degrades_on_repeated_coalescing_pressure ... ok\ntest send_control::tests::video_controller_degrades_when_disrupted_frame_ratio_exceeds_threshold ... ok\ntest send_control::tests::video_controller_ignores_bounded_one_frame_coalescing_pressure ... ok\ntest send_control::tests::video_controller_ignores_single_encoder_egress_sample ... ok\ntest send_control::tests::video_controller_keeps_requested_fps_when_adaptive_send_is_disabled ... ok\ntest send_control::tests::video_controller_preserves_pressure_reason_while_degraded_but_stable ... ok\ntest send_control::tests::video_controller_recovers_after_stable_windows ... ok\ntest send_control::tests::video_controller_recovers_from_minimum_in_two_stable_steps ... ok\ntest send_control::tests::video_controller_requires_a_full_stable_recovery_window ... ok\ntest send_control::tests::video_controller_waits_until_pressure_window_boundary ... ok\ntest send_control::tests::video_stats_effective_fps_uses_capture_time_bounds_for_out_of_order_records ... ok\ntest send_control::tests::video_stats_snapshot_counts_coalescing_drops_failures_and_effective_fps ... ok\ntest stats::tests::bitrate_computes_kbps_from_byte_delta ... ok\ntest send_control::tests::video_controller_stress_keeps_target_inside_configured_bounds ... ok\ntest stats::tests::bitrate_first_sample_is_zero ... ok\ntest stats::tests::bitrate_half_second_doubles_rate ... ok\ntest stats::tests::bitrate_rejects_backwards_time_and_bytes ... ok\ntest stats::tests::empty_stats_serialise_to_null_rtt_and_empty_arrays ... ok\ntest stats::tests::sanitize_audio_level_clamps ... ok\ntest send_control::tests::video_stats_handles_concurrent_recording_without_lost_counts ... ok\ntest stats::tests::sanitize_kbps_drops_nan_inf_negative_and_rounds ... ok\ntest stats::tests::full_stats_serialise_to_exact_contract_shape ... ok\ntest stats::tests::send_health_serialises_to_exact_contract_shape ... ok\ntest stats::tests::unit_conversions_seconds_to_ms ... ok\ntest stats::tests::video_inbound_omits_audio_level_audio_omits_fps ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_populates_all_plane_arrays ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_incomplete_native_inputs ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_negative_fds ... ok\ntest texture_source::tests::drm_format_gate_accepts_obs_vkcapture_texture_formats ... ok\ntest texture_source::tests::dxgi_format_gate_accepts_8bit_rgba_bgra_only ... ok\ntest texture_source::tests::error_strings_are_stable ... ok\ntest texture_source::tests::probe_is_available_only_for_explicit_hardware_codecs ... ok\ntest texture_source::tests::should_attempt_dmabuf_is_sdk_gated_after_validation_capability ... ok\ntest texture_source::tests::should_attempt_falls_back_when_capability_unavailable ... ok\ntest texture_source::tests::should_attempt_validates_frame_when_capability_available ... ok\ntest texture_source::tests::validate_accepts_a_clean_bgra_texture ... ok\ntest texture_source::tests::validate_dmabuf_accepts_supported_formats_with_optional_uuid ... ok\ntest texture_source::tests::validate_dmabuf_rejects_invalid_planes ... ok\ntest texture_source::tests::validate_precedence_handle_before_dims_before_format ... ok\ntest texture_source::tests::validate_rejects_odd_zero_and_oversized_dims ... ok\ntest texture_source::tests::validate_rejects_unsupported_format ... ok\ntest texture_source::tests::validate_rejects_zero_handle_as_no_texture ... ok\ntest yuv::tests::bgra_black_white_grey_levels ... ok\ntest yuv::tests::bgra_golden_2x2_solid_colour_exact_bytes ... ok\ntest yuv::tests::bgra_golden_strided_2x2_skips_row_padding ... ok\ntest yuv::tests::bgra_plane_sizes ... ok\ntest yuv::tests::bgra_primaries_have_expected_chroma_signs ... ok\ntest yuv::tests::copy_nv12_planes_preserves_nv12_layout ... ok\ntest yuv::tests::copy_nv12_planes_rejects_short_buffers ... ok\ntest yuv::tests::copy_nv12_planes_respects_destination_stride ... ok\ntest yuv::tests::nv12_4x4_deinterleaves_two_chroma_columns ... ok\ntest yuv::tests::nv12_golden_4x2_packed_to_i420 ... ok\ntest yuv::tests::nv12_packed_2x2_deinterleaves ... ok\ntest yuv::tests::nv12_respects_row_padding ... ok\ntest yuv::tests::nv12_short_buffer_is_rejected ... ok\ntest yuv::tests::rejects_odd_or_tiny_dimensions ... ok\ntest yuv::tests::rgb_golden_2x2_solid_colour_matches_bgra_path ... ok\ntest yuv::tests::rgb_plane_sizes_and_levels ... ok\ntest yuv::tests::rgb_rejects_odd_dims_and_short_buffer ... ok\ntest engine::tests::pcm16_audio_frame_rejects_implausible_format_and_overlong_chunks ... ok\n\ntest result: ok. 140 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 6 tests\ntest video_frame_meta_matches_contract ... ok\ntest inbound_covers_subscribe_and_lifecycle ... ok\ntest outbound_covers_the_single_identity_publish_path ... ok\ntest inbound_fixtures_match_contract ... ok\ntest outbound_fixtures_match_contract ... ok\ntest e2ee_state_is_ok_on_the_wire ... ok\n\ntest result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n▶ webrtc-sender loader wrapper\n ✔ resolves the native addon filename for every desktop OS/arch target (1.069958ms)\n ✔ rejects unsupported platform/architecture pairs explicitly (0.887333ms)\n ✔ returns a native hardware encoder capability when the binding exports one (0.8905ms)\n ✔ delegates dropped video callback metrics through the VoiceEngine wrapper (0.151208ms)\n ✔ reports VoiceEngine feature capabilities from the wrapped native prototype (0.499375ms)\n ✔ delegates device microphone publish through the VoiceEngine wrapper (0.171625ms)\n ✔ delegates native camera devices and publish options through the VoiceEngine wrapper (0.164625ms)\n ✔ delegates screen-share simulcast selection through the VoiceEngine wrapper (0.157417ms)\n ✔ delegates connect options through the VoiceEngine wrapper (0.206292ms)\n ✔ delegates shared texture handles through the WebrtcPublisher wrapper (0.201958ms)\n ✔ treats shared texture publishing as unavailable for older publisher bindings (0.089625ms)\n ✔ delegates dma-buf frames through the WebrtcPublisher wrapper (0.266709ms)\n ✔ delegates shared texture handles through the VoiceEngine wrapper (0.126375ms)\n ✔ treats shared texture publishing as unavailable for older voice bindings (0.074041ms)\n ✔ treats dma-buf publishing as unavailable for older native bindings (0.104333ms)\n ✔ defaults dropped video callback metrics to zero for older native bindings (0.05725ms)\n ✔ delegates remote track subscription updates through the VoiceEngine wrapper (0.1255ms)\n ✔ ignores remote track subscription updates for older native bindings (0.072583ms)\n ✔ delegates data packets through the VoiceEngine wrapper (0.183833ms)\n ✔ rejects invalid data packet payloads in the wrapper (0.25775ms)\n ✔ returns an unavailable hardware encoder capability without a binding (0.070875ms)\n✔ webrtc-sender loader wrapper (7.269583ms)\n▶ livekit harness setup matrix\n ✔ maps all supported codec spellings to expected mime types (1.39ms)\n ✔ parses codec lists with fallback and rejects empty effective lists (1.192416ms)\n ✔ default non-strict config keeps the fast local live setup small (1.466167ms)\n ✔ strict config expands to multi-codec secondary-publisher scenarios (1.057417ms)\n ✔ stress knobs parse packet loss, resolution stability, audio gap, and video pattern (0.65175ms)\n ✔ stress knobs reject impossible send pacing configurations (3.341208ms)\n ✔ explicit secondary codec expectations override rotating defaults (0.570125ms)\n ✔ secondary screen codec aliases are accepted and conflicting aliases are rejected (0.955083ms)\n ✔ external token setup derives identities, requires matching tokens, and redacts reports (1.394917ms)\n ✔ report sanitization strips URL credentials, query strings, and fragments (0.676625ms)\n ✔ jwt subject and TCP target parsing catch malformed live setups early (0.34125ms)\n ✔ admin token has the room-scoped grant needed for server publishing validation (0.463875ms)\n ✔ scenario room names are stable and bounded for generated-token suites (0.110917ms)\n ✔ strict report checks fail when the strict window has too few samples to measure gaps (90.970125ms)\n ✔ strict report checks use only samples inside the measured window (6.760833ms)\n ✔ strict packet loss gate uses loss deltas inside the strict window (12.074166ms)\n ✔ server publishing checks cover primary and secondary screen, audio, and camera tracks (0.618458ms)\n ✔ server publishing checks fail closed on missing server tracks (0.280125ms)\n ✔ server publishing checks reject wrong participant identity (0.2235ms)\n ✔ server publishing checks reject wrong kind, source, and screen mime (0.254208ms)\n ✔ server publishing checks reject muted or missing mute state on expected tracks (0.213625ms)\n ✔ server publishing checks handle protobuf numeric enums without accepting data tracks as video (0.195584ms)\n ✔ server publishing checks fail closed on missing secondary, audio, camera, and screen-audio tracks (0.208791ms)\n ✔ strict server publishing validation does not pass open on Twirp errors (0.247834ms)\n✔ livekit harness setup matrix (127.168458ms)\nℹ tests 45\nℹ suites 2\nℹ pass 45\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 522.131583\n",
- "stderrTail": "warning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 3 warnings (run `cargo fix --lib -p libwebrtc` to apply 2 suggestions)\n Finished `test` profile [unoptimized + debuginfo] target(s) in 0.16s\n Running unittests src/lib.rs (target/debug/deps/fluxer_webrtc_sender-4fb413a724225319)\n Running tests/event_contract.rs (target/debug/deps/event_contract-dc15840aabc01f6c)\n Doc-tests fluxer_webrtc_sender\n"
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "status": "fail",
- "code": 1,
- "signal": null,
- "startedAt": "2026-06-06T22:15:57.734Z",
- "endedAt": "2026-06-06T22:16:28.858Z",
- "durationMs": 31124,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/webrtc-sender@0.0.0 test:livekit /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n> node scripts/livekit-harness.mjs\n\n[livekit-harness] connecting to ws://127.0.0.1:7880 room=fluxer-webrtc-harness-84586-8f492568-efae-42a1-a344-5a0c9599fa8d\n ELIFECYCLE Command failed with exit code 1.\n WARN Local package.json exists, but node_modules missing, did you mean to install?\n",
- "stderrTail": "[livekit-harness] FAIL: Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1346:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1773:3)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:2025:18)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:2058:19\n"
- }
- ]
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-06T22-17-15Z-codex-livekit-proxy.json b/fluxer_desktop/native-media-reports/2026-06-06T22-17-15Z-codex-livekit-proxy.json
deleted file mode 100644
index 45b967bf8..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-06T22-17-15Z-codex-livekit-proxy.json
+++ /dev/null
@@ -1,274 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-06T22:17:16.198Z",
- "endedAt": "2026-06-06T22:17:18.067Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:8088/livekit",
- "serverApiUrl": "http://127.0.0.1:8088",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-84689-a15db5c1-00f9-4cc5-8b1a-e68759b5e380",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-84689",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-84689",
- "subscriberIdentity": "fluxer-native-subscriber-84689",
- "required": false,
- "strict": false,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 0,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0,
- "maxFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": false,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": false,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-06T22-17-15Z-codex-livekit-proxy.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 320x180",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 13,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 13,
- "videoBytes": 1123200,
- "receivedFps": 0,
- "requiredFps": null,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 390,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 5,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780784237058,
- "stoppedAtMs": null,
- "framesPushed": 16,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 69,
- "lastPushAtMs": 1780784238060,
- "elapsedMs": 1018,
- "producedFps": 15.72
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": {
- "participantSid": "PA_NicBnT5mxvvm",
- "trackSid": "TR_VSrvFY4wSg7eLt",
- "width": 320,
- "height": 180,
- "timestampUs": 335522961000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VSrvFY4wSg7eLt",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 0,
- "packetsLost": 0,
- "fps": 15,
- "width": 320,
- "height": 180,
- "sourceWidth": 320,
- "sourceHeight": 180,
- "targetBitrateKbps": 400,
- "configuredFps": 15,
- "targetFps": 15,
- "effectiveFps": 14.6,
- "framesProduced": 14,
- "framesAccepted": 14,
- "framesDropped": 0,
- "framesCoalesced": 0,
- "framesCaptured": 14,
- "captureFailures": 0,
- "maxQueueAgeMs": 26,
- "maxPushLatencyMs": 26,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable",
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 14,
- "outgoingVideoFramesAccepted": 14,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 14,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 14.56,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 26,
- "outgoingVideoMaxPushLatencyMs": 26,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 2,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_NicBnT5mxvvm",
- "trackSid": "TR_VSrvFY4wSg7eLt",
- "kind": "video",
- "bitrateKbps": 0,
- "packetsLost": 5,
- "jitterMs": 4,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-06T22-17-25Z-codex-host-smoke-proxy/livekit-harness.json b/fluxer_desktop/native-media-reports/2026-06-06T22-17-25Z-codex-host-smoke-proxy/livekit-harness.json
deleted file mode 100644
index 88d097cd3..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-06T22-17-25Z-codex-host-smoke-proxy/livekit-harness.json
+++ /dev/null
@@ -1,321 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-06T22:17:32.639Z",
- "endedAt": "2026-06-06T22:17:34.704Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:8088/livekit",
- "serverApiUrl": "http://127.0.0.1:8088",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-84848-43854e34-d3a9-4e33-bf45-b7ef3611083a",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-84848",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-84848",
- "subscriberIdentity": "fluxer-native-subscriber-84848",
- "required": false,
- "strict": false,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 0,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0,
- "maxFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": false,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": false,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-06T22-17-25Z-codex-host-smoke-proxy/livekit-harness.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 320x180",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 1",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 3",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 72,
- "inboundVideoFrames": 13,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 13,
- "videoBytes": 1123200,
- "receivedFps": 0,
- "requiredFps": null,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 184,
- "maxAudioFrameGapOverallMs": 102,
- "avDriftMs": 0,
- "maxObservedPacketLoss": 3,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780784253698,
- "stoppedAtMs": null,
- "framesPushed": 16,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 68,
- "lastPushAtMs": 1780784254699,
- "elapsedMs": 1014,
- "producedFps": 15.78
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": {
- "participantSid": "PA_HwsqmPnPxvGD",
- "trackSid": "TR_VS8RxgcaoR5kbz",
- "width": 320,
- "height": 180,
- "timestampUs": 335539594000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VS8RxgcaoR5kbz",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 0,
- "packetsLost": 0,
- "fps": 16,
- "width": 320,
- "height": 180,
- "sourceWidth": 320,
- "sourceHeight": 180,
- "targetBitrateKbps": 400,
- "configuredFps": 15,
- "targetFps": 15,
- "effectiveFps": 14.6,
- "framesProduced": 6,
- "framesAccepted": 6,
- "framesDropped": 0,
- "framesCoalesced": 0,
- "framesCaptured": 6,
- "captureFailures": 0,
- "maxQueueAgeMs": 8,
- "maxPushLatencyMs": 8,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable",
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMBPL59S6qUeEf",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 0,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 6,
- "outgoingVideoFramesAccepted": 6,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 6,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 14.62,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 8,
- "outgoingVideoMaxPushLatencyMs": 8,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 23,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_HwsqmPnPxvGD",
- "trackSid": "TR_AMBPL59S6qUeEf",
- "kind": "audio",
- "bitrateKbps": 0,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.315,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_HwsqmPnPxvGD",
- "trackSid": "TR_VS8RxgcaoR5kbz",
- "kind": "video",
- "bitrateKbps": 0,
- "packetsLost": 3,
- "jitterMs": 4,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-06T22-17-25Z-codex-host-smoke-proxy/summary.json b/fluxer_desktop/native-media-reports/2026-06-06T22-17-25Z-codex-host-smoke-proxy/summary.json
deleted file mode 100644
index 3cfe7b4d1..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-06T22-17-25Z-codex-host-smoke-proxy/summary.json
+++ /dev/null
@@ -1,227 +0,0 @@
-{
- "status": "pass",
- "mode": "smoke",
- "strict": false,
- "platform": "darwin",
- "arch": "arm64",
- "hostname": "Hampuss-Mac-Studio.local",
- "startedAt": "2026-06-06T22:17:25.424Z",
- "endedAt": "2026-06-06T22:17:42.978Z",
- "reportDir": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-06T22-17-25Z-codex-host-smoke-proxy",
- "gates": [
- {
- "name": "mode-valid",
- "status": "pass",
- "mode": "smoke"
- },
- {
- "name": "documentation-current",
- "status": "pass",
- "missing": []
- },
- {
- "name": "strict-prerequisites",
- "status": "skip",
- "reason": "smoke mode"
- },
- {
- "name": "strict-command-plan",
- "status": "skip",
- "reason": "smoke mode"
- }
- ],
- "plannedCommands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/WebrtcScreenPublish.test.mjs src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "cwd": "."
- },
- {
- "name": "mac-screen-capture-build",
- "command": "pnpm --dir native/mac-screen-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-screen-capture-tests",
- "command": "pnpm --dir native/mac-screen-capture test",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-build",
- "command": "pnpm --dir native/mac-app-audio build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-rust-tests",
- "command": "pnpm --dir native/mac-app-audio test:cargo",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-js-tests",
- "command": "'/Users/hampus/Development/fluxer/node_modules/.pnpm/node_modules/.bin/vitest' run",
- "category": "platform-native",
- "cwd": "native/mac-app-audio"
- }
- ],
- "commands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/WebrtcScreenPublish.test.mjs src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:25.425Z",
- "endedAt": "2026-06-06T22:17:25.608Z",
- "durationMs": 183,
- "stdoutTail": "▶ NativeScreenCapture DMA-BUF metadata validation\n ✔ accepts valid DMA-BUF metadata and pads native plane arrays (2.167459ms)\n ✔ keeps valid handles when optional device UUID metadata is absent or malformed (0.439666ms)\n ✔ rejects invalid plane counts, FDs, strides, and format metadata (0.458916ms)\n✔ NativeScreenCapture DMA-BUF metadata validation (3.515292ms)\n▶ NativeScreenCapture source identity and capability reporting\n ✔ normalizes display and window sources without changing source ids (0.661875ms)\n ✔ starts display and window captures with exact source id and kind and reports diagnostics (1.226708ms)\n ✔ forwards frames to renderer even when a native frame tap is installed (0.477666ms)\n ✔ reports macOS and Linux display/window capture capabilities from platform backends (1.341208ms)\n✔ NativeScreenCapture source identity and capability reporting (3.829875ms)\n▶ NativeVoiceEngine screen frame routing\n ✔ pushes the initial capture frame after publishing screen share (2.384041ms)\n ✔ prefers Windows shared texture handles over DMA-BUF and CPU frames (0.56125ms)\n ✔ uses Linux DMA-BUF handles before CPU conversion (0.49475ms)\n ✔ falls back to CPU frames when GPU paths are unavailable or rejected (0.461792ms)\n ✔ keeps screen-share audio published when screen video is unpublished (0.516583ms)\n ✔ replaces screen capture taps without releasing screen-share audio or duplicating priority (1.04175ms)\n ✔ forwards watch and unwatch operations with source, enablement, and quality intact (0.860792ms)\n ✔ reports VideoToolbox hardware capability from the native addon (0.46825ms)\n ✔ reports native voice engine capabilities from the native addon (0.402ms)\n ✔ maps native addon microphone not-connected errors to the typed operation code (0.542958ms)\n✔ NativeVoiceEngine screen frame routing (8.310334ms)\n▶ WebrtcScreenPublish native frame routing\n ✔ prefers Windows shared texture handles over DMA-BUF and CPU buffers (2.040083ms)\n ✔ uses Linux DMA-BUF handles before CPU conversion (0.431291ms)\n ✔ falls back to CPU frames when GPU paths are unavailable or rejected (0.405292ms)\n ✔ replaces an existing publisher before routing frames for the same capture id (0.398542ms)\n✔ WebrtcScreenPublish native frame routing (3.742875ms)\nℹ tests 21\nℹ suites 4\nℹ pass 21\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 120.183542\n",
- "stderrTail": ""
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:25.609Z",
- "endedAt": "2026-06-06T22:17:26.719Z",
- "durationMs": 1110,
- "stdoutTail": "native/linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\nnative/windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> fluxer_desktop@0.0.0 typecheck /Users/hampus/Development/fluxer/fluxer_desktop\n> tsgo --noEmit\n\n",
- "stderrTail": ""
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:26.719Z",
- "endedAt": "2026-06-06T22:17:28.890Z",
- "durationMs": 2171,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/webrtc-sender@0.0.0 build /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n+ /Users/hampus/.rustup/toolchains/1.93.0-aarch64-apple-darwin/bin/cargo build --release --target aarch64-apple-darwin --manifest-path Cargo.toml --features camera-native\n+ codesign --force --sign - /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/webrtc-sender.darwin-arm64.node\n",
- "stderrTail": "warning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 3 warnings (run `cargo fix --lib -p libwebrtc` to apply 2 suggestions)\n Finished `release` profile [optimized] target(s) in 0.16s\n/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/webrtc-sender.darwin-arm64.node: replacing existing signature\n"
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:28.890Z",
- "endedAt": "2026-06-06T22:17:31.695Z",
- "durationMs": 2805,
- "stdoutTail": "eported_available ... ok\ntest hardware_encoder::tests::publish_codec_runtime_gate_only_requires_hardware_for_h265 ... ok\ntest hardware_encoder::tests::reports_available_nvenc_when_compiled_and_runtime_ready ... ok\ntest hardware_encoder::tests::reports_available_videotoolbox_with_h264_and_h265 ... ok\ntest hardware_encoder::tests::reports_driver_sdk_incompatibility_before_encode_session ... ok\ntest hardware_encoder::tests::reports_h264_only_when_hevc_guid_is_absent ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_compiled ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_probe_is_absent ... ok\ntest hardware_encoder::tests::reports_no_cuda_devices_using_obs_style_reason ... ok\ntest hardware_encoder::tests::reports_no_supported_codecs_when_guid_query_finds_no_fluxer_codecs ... ok\ntest hardware_encoder::tests::reports_not_compiled_before_runtime_missing ... ok\ntest hardware_encoder::tests::reports_unsupported_platforms_clearly ... ok\ntest hardware_encoder::tests::reports_videotoolbox_h264_only_when_hevc_session_is_unavailable ... ok\ntest hardware_encoder::tests::reports_videotoolbox_unavailable_with_status_details ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_publish_backend_not_compiled ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_runtime_dll_names_when_missing ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_without_linux_zero_copy_inputs ... ok\ntest publisher::tests::i420_plane_copy_fills_libwebrtc_buffer ... ok\ntest publisher::tests::parse_codec_maps_known_names ... ok\ntest send_control::tests::audio_buffer_growth_caps_at_configured_max_and_reset_clears_pressure ... ok\ntest send_control::tests::audio_buffer_ignores_clock_regression_without_false_rebuffer ... ok\ntest send_control::tests::audio_buffer_expands_on_gaps_and_shrinks_after_stability ... ok\ntest send_control::tests::audio_buffer_max_is_clamped_to_real_time_bounds ... ok\ntest send_control::tests::video_controller_continues_degrading_to_minimum_under_sustained_pressure ... ok\ntest send_control::tests::idle_snapshot_reflects_audio_pressure_without_video_state ... ok\ntest send_control::tests::video_controller_counts_coalesced_replacements_once_for_pressure ... ok\ntest send_control::tests::audio_buffer_stress_stays_within_realtime_bounds_under_jitter ... ok\ntest send_control::tests::audio_buffer_ignores_concurrent_stale_pushes_without_moving_last_push_backwards ... ok\ntest send_control::tests::video_controller_degrades_on_encoder_egress_pressure ... ok\ntest send_control::tests::video_controller_degrades_on_latency_pressure_without_coalescing ... ok\ntest send_control::tests::video_controller_degrades_on_repeated_coalescing_pressure ... ok\ntest send_control::tests::video_controller_degrades_when_disrupted_frame_ratio_exceeds_threshold ... ok\ntest send_control::tests::video_controller_ignores_bounded_one_frame_coalescing_pressure ... ok\ntest send_control::tests::video_controller_ignores_single_encoder_egress_sample ... ok\ntest send_control::tests::video_controller_keeps_requested_fps_when_adaptive_send_is_disabled ... ok\ntest send_control::tests::video_controller_preserves_pressure_reason_while_degraded_but_stable ... ok\ntest send_control::tests::video_controller_recovers_after_stable_windows ... ok\ntest send_control::tests::video_controller_recovers_from_minimum_in_two_stable_steps ... ok\ntest send_control::tests::video_controller_requires_a_full_stable_recovery_window ... ok\ntest send_control::tests::video_controller_waits_until_pressure_window_boundary ... ok\ntest send_control::tests::video_stats_effective_fps_uses_capture_time_bounds_for_out_of_order_records ... ok\ntest send_control::tests::video_stats_snapshot_counts_coalescing_drops_failures_and_effective_fps ... ok\ntest stats::tests::bitrate_computes_kbps_from_byte_delta ... ok\ntest stats::tests::bitrate_first_sample_is_zero ... ok\ntest send_control::tests::video_controller_stress_keeps_target_inside_configured_bounds ... ok\ntest stats::tests::bitrate_half_second_doubles_rate ... ok\ntest stats::tests::bitrate_rejects_backwards_time_and_bytes ... ok\ntest stats::tests::empty_stats_serialise_to_null_rtt_and_empty_arrays ... ok\ntest stats::tests::sanitize_audio_level_clamps ... ok\ntest stats::tests::sanitize_kbps_drops_nan_inf_negative_and_rounds ... ok\ntest stats::tests::full_stats_serialise_to_exact_contract_shape ... ok\ntest stats::tests::send_health_serialises_to_exact_contract_shape ... ok\ntest stats::tests::unit_conversions_seconds_to_ms ... ok\ntest send_control::tests::video_stats_handles_concurrent_recording_without_lost_counts ... ok\ntest stats::tests::video_inbound_omits_audio_level_audio_omits_fps ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_populates_all_plane_arrays ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_incomplete_native_inputs ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_negative_fds ... ok\ntest texture_source::tests::drm_format_gate_accepts_obs_vkcapture_texture_formats ... ok\ntest texture_source::tests::dxgi_format_gate_accepts_8bit_rgba_bgra_only ... ok\ntest texture_source::tests::error_strings_are_stable ... ok\ntest texture_source::tests::probe_is_available_only_for_explicit_hardware_codecs ... ok\ntest texture_source::tests::should_attempt_dmabuf_is_sdk_gated_after_validation_capability ... ok\ntest texture_source::tests::should_attempt_falls_back_when_capability_unavailable ... ok\ntest texture_source::tests::should_attempt_validates_frame_when_capability_available ... ok\ntest texture_source::tests::validate_accepts_a_clean_bgra_texture ... ok\ntest texture_source::tests::validate_dmabuf_accepts_supported_formats_with_optional_uuid ... ok\ntest texture_source::tests::validate_dmabuf_rejects_invalid_planes ... ok\ntest texture_source::tests::validate_precedence_handle_before_dims_before_format ... ok\ntest texture_source::tests::validate_rejects_odd_zero_and_oversized_dims ... ok\ntest texture_source::tests::validate_rejects_unsupported_format ... ok\ntest texture_source::tests::validate_rejects_zero_handle_as_no_texture ... ok\ntest yuv::tests::bgra_black_white_grey_levels ... ok\ntest yuv::tests::bgra_golden_2x2_solid_colour_exact_bytes ... ok\ntest yuv::tests::bgra_golden_strided_2x2_skips_row_padding ... ok\ntest yuv::tests::bgra_plane_sizes ... ok\ntest yuv::tests::bgra_primaries_have_expected_chroma_signs ... ok\ntest yuv::tests::copy_nv12_planes_preserves_nv12_layout ... ok\ntest yuv::tests::copy_nv12_planes_rejects_short_buffers ... ok\ntest yuv::tests::copy_nv12_planes_respects_destination_stride ... ok\ntest yuv::tests::nv12_4x4_deinterleaves_two_chroma_columns ... ok\ntest yuv::tests::nv12_golden_4x2_packed_to_i420 ... ok\ntest yuv::tests::nv12_packed_2x2_deinterleaves ... ok\ntest yuv::tests::nv12_respects_row_padding ... ok\ntest yuv::tests::nv12_short_buffer_is_rejected ... ok\ntest yuv::tests::rejects_odd_or_tiny_dimensions ... ok\ntest yuv::tests::rgb_golden_2x2_solid_colour_matches_bgra_path ... ok\ntest yuv::tests::rgb_plane_sizes_and_levels ... ok\ntest yuv::tests::rgb_rejects_odd_dims_and_short_buffer ... ok\ntest engine::tests::pcm16_audio_frame_rejects_implausible_format_and_overlong_chunks ... ok\n\ntest result: ok. 140 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 6 tests\ntest video_frame_meta_matches_contract ... ok\ntest inbound_covers_subscribe_and_lifecycle ... ok\ntest outbound_covers_the_single_identity_publish_path ... ok\ntest outbound_fixtures_match_contract ... ok\ntest inbound_fixtures_match_contract ... ok\ntest e2ee_state_is_ok_on_the_wire ... ok\n\ntest result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n▶ webrtc-sender loader wrapper\n ✔ resolves the native addon filename for every desktop OS/arch target (0.937291ms)\n ✔ rejects unsupported platform/architecture pairs explicitly (0.3075ms)\n ✔ returns a native hardware encoder capability when the binding exports one (0.9935ms)\n ✔ delegates dropped video callback metrics through the VoiceEngine wrapper (0.163167ms)\n ✔ reports VoiceEngine feature capabilities from the wrapped native prototype (0.5065ms)\n ✔ delegates device microphone publish through the VoiceEngine wrapper (0.174917ms)\n ✔ delegates native camera devices and publish options through the VoiceEngine wrapper (0.172875ms)\n ✔ delegates screen-share simulcast selection through the VoiceEngine wrapper (0.163833ms)\n ✔ delegates connect options through the VoiceEngine wrapper (0.211375ms)\n ✔ delegates shared texture handles through the WebrtcPublisher wrapper (0.22075ms)\n ✔ treats shared texture publishing as unavailable for older publisher bindings (0.095625ms)\n ✔ delegates dma-buf frames through the WebrtcPublisher wrapper (0.276959ms)\n ✔ delegates shared texture handles through the VoiceEngine wrapper (0.132ms)\n ✔ treats shared texture publishing as unavailable for older voice bindings (0.073083ms)\n ✔ treats dma-buf publishing as unavailable for older native bindings (0.110125ms)\n ✔ defaults dropped video callback metrics to zero for older native bindings (0.0585ms)\n ✔ delegates remote track subscription updates through the VoiceEngine wrapper (0.136583ms)\n ✔ ignores remote track subscription updates for older native bindings (0.088709ms)\n ✔ delegates data packets through the VoiceEngine wrapper (0.179834ms)\n ✔ rejects invalid data packet payloads in the wrapper (0.238083ms)\n ✔ returns an unavailable hardware encoder capability without a binding (0.072ms)\n✔ webrtc-sender loader wrapper (7.268042ms)\n▶ livekit harness setup matrix\n ✔ maps all supported codec spellings to expected mime types (1.146667ms)\n ✔ parses codec lists with fallback and rejects empty effective lists (1.1805ms)\n ✔ default non-strict config keeps the fast local live setup small (1.487ms)\n ✔ strict config expands to multi-codec secondary-publisher scenarios (1.038875ms)\n ✔ stress knobs parse packet loss, resolution stability, audio gap, and video pattern (0.635208ms)\n ✔ stress knobs reject impossible send pacing configurations (3.125583ms)\n ✔ explicit secondary codec expectations override rotating defaults (0.484584ms)\n ✔ secondary screen codec aliases are accepted and conflicting aliases are rejected (0.924208ms)\n ✔ external token setup derives identities, requires matching tokens, and redacts reports (1.383958ms)\n ✔ report sanitization strips URL credentials, query strings, and fragments (0.6515ms)\n ✔ jwt subject and TCP target parsing catch malformed live setups early (0.336458ms)\n ✔ admin token has the room-scoped grant needed for server publishing validation (0.468333ms)\n ✔ scenario room names are stable and bounded for generated-token suites (0.1065ms)\n ✔ strict report checks fail when the strict window has too few samples to measure gaps (89.199292ms)\n ✔ strict report checks use only samples inside the measured window (5.439292ms)\n ✔ strict packet loss gate uses loss deltas inside the strict window (10.6855ms)\n ✔ server publishing checks cover primary and secondary screen, audio, and camera tracks (0.5675ms)\n ✔ server publishing checks fail closed on missing server tracks (0.275125ms)\n ✔ server publishing checks reject wrong participant identity (0.2045ms)\n ✔ server publishing checks reject wrong kind, source, and screen mime (0.258042ms)\n ✔ server publishing checks reject muted or missing mute state on expected tracks (0.200416ms)\n ✔ server publishing checks handle protobuf numeric enums without accepting data tracks as video (0.194ms)\n ✔ server publishing checks fail closed on missing secondary, audio, camera, and screen-audio tracks (0.203708ms)\n ✔ strict server publishing validation does not pass open on Twirp errors (0.207541ms)\n✔ livekit harness setup matrix (121.754875ms)\nℹ tests 45\nℹ suites 2\nℹ pass 45\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 510.566208\n",
- "stderrTail": "warning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 3 warnings (run `cargo fix --lib -p libwebrtc` to apply 2 suggestions)\n Finished `test` profile [unoptimized + debuginfo] target(s) in 0.15s\n Running unittests src/lib.rs (target/debug/deps/fluxer_webrtc_sender-4fb413a724225319)\n Running tests/event_contract.rs (target/debug/deps/event_contract-dc15840aabc01f6c)\n Doc-tests fluxer_webrtc_sender\n"
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:31.695Z",
- "endedAt": "2026-06-06T22:17:34.808Z",
- "durationMs": 3113,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/webrtc-sender@0.0.0 test:livekit /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n> node scripts/livekit-harness.mjs\n\n[livekit-harness] connecting to ws://127.0.0.1:8088/livekit room=fluxer-webrtc-harness-84848-43854e34-d3a9-4e33-bf45-b7ef3611083a\n[livekit-harness] PASS: 19 checks, inboundAudioFrames=72, inboundVideoFrames=13, videoCallbacks=13, receivedFps=0, producedFps=15.78, maxVideoFrameGapMs=0, maxAudioFrameGapMs=0, maxObservedPacketLoss=3, maxObservedPacketLossDelta=0, resolutionMismatches=0, droppedVideoFrameCallbacks=0\n",
- "stderrTail": ""
- },
- {
- "name": "mac-screen-capture-build",
- "command": "pnpm --dir native/mac-screen-capture build",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:34.808Z",
- "endedAt": "2026-06-06T22:17:36.805Z",
- "durationMs": 1997,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/mac-screen-capture@0.0.0 build /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture\n+ /Users/hampus/.rustup/toolchains/1.93.0-aarch64-apple-darwin/bin/cargo build --release --target aarch64-apple-darwin --manifest-path Cargo.toml\n+ codesign --force --sign - /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture/mac-screen-capture.darwin-arm64.node\n",
- "stderrTail": " Finished `release` profile [optimized] target(s) in 0.04s\n/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture/mac-screen-capture.darwin-arm64.node: replacing existing signature\n"
- },
- {
- "name": "mac-screen-capture-tests",
- "command": "pnpm --dir native/mac-screen-capture test",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:36.805Z",
- "endedAt": "2026-06-06T22:17:39.173Z",
- "durationMs": 2368,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/mac-screen-capture@0.0.0 test /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture\n> pnpm test:cargo && node --test index.test.mjs\n\n../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/mac-screen-capture@0.0.0 test:cargo /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture\n> cargo test --manifest-path Cargo.toml\n\n\nrunning 15 tests\ntest nv12_packing::tests::pack_nv12_rejects_short_source ... ok\ntest nv12_packing::tests::pack_nv12_rejects_undersized_stride ... ok\ntest nv12_packing::tests::pack_nv12_strips_row_padding ... ok\ntest nv12_packing::tests::pack_nv12_zero_padding_is_identity ... ok\ntest nv12_packing::tests::pack_nv12_rejects_wrong_dst_size ... ok\ntest nv12_packing::tests::packed_size_matches_yuv420_layout ... ok\ntest nv12_packing::tests::packed_size_rejects_zero_dims ... ok\ntest nv12_packing::tests::packed_size_rejects_odd_height ... ok\ntest os_version::tests::classify_macos_11_is_unsupported ... ok\ntest os_version::tests::classify_macos_12_3_is_supported ... ok\ntest os_version::tests::classify_unknown_version_is_unsupported ... ok\ntest os_version::tests::format_version_trims_zero_patch ... ok\ntest os_version::tests::meets_floor_exact_match ... ok\ntest os_version::tests::meets_floor_higher_major ... ok\ntest os_version::tests::rejects_below_floor ... ok\n\ntest result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n▶ mac-screen-capture loader wrapper\n ✔ forwards source id, kind, and dimensions to native binding (2.259875ms)\n ✔ defaults sourceKind to screen and frameRate to 30 (0.213958ms)\n ✔ forwards display and window sources from native binding without rewriting ids (0.2195ms)\n ✔ reports ScreenCaptureKit support and permission from native binding (0.7435ms)\n ✔ re-emits native frame events to listeners (0.327166ms)\n ✔ emits closed once when native lifecycle closes and stop is called later (0.299333ms)\n ✔ lifecycle error emits Error event (0.176125ms)\n✔ mac-screen-capture loader wrapper (5.402834ms)\nℹ tests 7\nℹ suites 1\nℹ pass 7\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 353.937417\n",
- "stderrTail": " Finished `test` profile [unoptimized + debuginfo] target(s) in 0.03s\n Running unittests src/lib.rs (target/debug/deps/fluxer_mac_screen_capture-41d64e8eafcd58d2)\n Doc-tests fluxer_mac_screen_capture\n"
- },
- {
- "name": "mac-app-audio-build",
- "command": "pnpm --dir native/mac-app-audio build",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:39.173Z",
- "endedAt": "2026-06-06T22:17:41.191Z",
- "durationMs": 2018,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/mac-app-audio@0.0.0 build /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio\n+ /Users/hampus/.rustup/toolchains/1.93.0-aarch64-apple-darwin/bin/cargo build --release --target aarch64-apple-darwin --manifest-path Cargo.toml\n+ codesign --force --sign - /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio/mac-app-audio.darwin-arm64.node\n",
- "stderrTail": " Finished `release` profile [optimized] target(s) in 0.04s\n/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio/mac-app-audio.darwin-arm64.node: replacing existing signature\n"
- },
- {
- "name": "mac-app-audio-rust-tests",
- "command": "pnpm --dir native/mac-app-audio test:cargo",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:41.191Z",
- "endedAt": "2026-06-06T22:17:42.306Z",
- "durationMs": 1115,
- "stdoutTail": "../linux-audio-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-evdev | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-notifications | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-portals | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../linux-screen-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../system-hunspell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"linux\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-clipboard | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-game-capture | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-process-loopback | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-shell | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../win-toast | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n../windows-input-hook | WARN Unsupported platform: wanted: {\"cpu\":[\"x64\",\"arm64\"],\"os\":[\"win32\"],\"libc\":[\"any\"]} (current: {\"os\":\"darwin\",\"cpu\":\"arm64\",\"libc\":\"unknown\"})\n\n> @fluxer/mac-app-audio@0.0.0 test:cargo /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio\n> cargo test --manifest-path Cargo.toml\n\n\nrunning 49 tests\ntest audio_converter::tests::build_input_non_interleaved ... ok\ntest audio_converter::tests::build_input_interleaved ... ok\ntest audio_converter::tests::build_output_mono_44_1k ... ok\ntest audio_converter::tests::build_output_stereo_48k ... ok\ntest audio_converter::tests::converted_frame_count_exact ... ok\ntest audio_converter::tests::lpcm_fourcc ... ok\ntest audio_converter::tests::input_frame_count_interleaved_and_planar ... ok\ntest audio_converter::tests::normalize_signed_int16 ... ok\ntest audio_converter::tests::interleave_planar_stereo ... ok\ntest audio_converter::tests::duplicate_mono_to_stereo ... ok\ntest audio_converter::tests::linear_resample_to_target_rate ... ok\ntest audio_converter::tests::handle_float64_input ... ok\ntest audio_converter::tests::output_frame_capacity_rounds_up ... ok\ntest foundation::tests::mutable_array_initial_count_is_zero ... ok\ntest foundation::tests::mutable_dictionary_initial_count_is_zero ... ok\ntest foundation::tests::nsstring_to_string_handles_none ... ok\ntest foundation::tests::nsstring_round_trip ... ok\ntest os_version::tests::classify_macos_10_15_is_unsupported_and_mentions_min_version ... ok\ntest os_version::tests::classify_macos_12_3_is_sck_only ... ok\ntest os_version::tests::classify_macos_14_2_has_both_backends ... ok\ntest os_version::tests::classify_macos_15_is_supported ... ok\ntest os_version::tests::classify_unknown_version_is_unsupported ... ok\ntest os_version::tests::coreaudio_floor_14_2 ... ok\ntest os_version::tests::format_version_trims_zero_patch ... ok\ntest os_version::tests::meets_floor_exact_match ... ok\ntest os_version::tests::meets_floor_higher_major ... ok\ntest os_version::tests::meets_floor_higher_minor ... ok\ntest os_version::tests::rejects_below_floor_major ... ok\ntest os_version::tests::rejects_below_floor_minor ... ok\ntest os_version::tests::rejects_macos_10_15_for_sck ... ok\ntest process_tree::tests::collect_related_returns_tree ... ok\ntest process_tree::tests::same_launch_tree_excludes_unrelated ... ok\ntest process_tree::tests::same_launch_tree_includes_direct_child ... ok\ntest process_tree::tests::same_launch_tree_includes_pgrp_peer ... ok\ntest related_app::tests::helper_bundle_strips_suffix ... ok\ntest related_app::tests::helper_name_strips_helper_suffix ... ok\ntest related_app::tests::related_by_dot_prefix ... ok\ntest related_app::tests::related_via_bundle_helper_base ... ok\ntest related_app::tests::related_via_name_helper_base ... ok\ntest related_app::tests::unrelated_returns_false ... ok\ntest sck::tests::cgrect_intersection_handles_negative_and_disjoint ... ok\ntest source_state::tests::cancel_idle_short_circuits ... ok\ntest source_state::tests::double_start_rejected ... ok\ntest source_state::tests::happy_path ... ok\ntest source_state::tests::is_allowed_exhaustive ... ok\ntest source_state::tests::mark_fatal_forces_stopped ... ok\ntest source_state::tests::mark_fatal_idempotent ... ok\ntest source_state::tests::start_while_stopping_rejected ... ok\ntest source_state::tests::stop_before_start_rejected ... ok\n\ntest result: ok. 49 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n",
- "stderrTail": " Finished `test` profile [unoptimized + debuginfo] target(s) in 0.03s\n Running unittests src/lib.rs (target/debug/deps/fluxer_mac_app_audio-b86bec7aea37ec64)\n Doc-tests fluxer_mac_app_audio\n"
- },
- {
- "name": "mac-app-audio-js-tests",
- "command": "'/Users/hampus/Development/fluxer/node_modules/.pnpm/node_modules/.bin/vitest' run",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-06T22:17:42.306Z",
- "endedAt": "2026-06-06T22:17:42.978Z",
- "durationMs": 672,
- "stdoutTail": "\n RUN v4.0.18 /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio\n\n ✓ index.test.mjs (5 tests) 4ms\n\n Test Files 1 passed (1)\n Tests 5 passed (5)\n Start at 00:17:42\n Duration 399ms (transform 13ms, setup 0ms, import 285ms, tests 4ms, environment 0ms)\n\n",
- "stderrTail": ""
- }
- ]
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-07T14-52-39-687Z/summary.json b/fluxer_desktop/native-media-reports/2026-06-07T14-52-39-687Z/summary.json
deleted file mode 100644
index be3ef79c3..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-07T14-52-39-687Z/summary.json
+++ /dev/null
@@ -1,143 +0,0 @@
-{
- "status": "fail",
- "mode": "smoke",
- "strict": false,
- "platform": "linux",
- "arch": "arm64",
- "hostname": "d4e5fefa7fc7",
- "startedAt": "2026-06-07T14:52:39.689Z",
- "endedAt": "2026-06-07T14:53:04.641Z",
- "reportDir": "/workspaces/fluxer/fluxer_desktop/native-media-reports/2026-06-07T14-52-39-687Z",
- "gates": [
- {
- "name": "mode-valid",
- "status": "pass",
- "mode": "smoke"
- },
- {
- "name": "documentation-current",
- "status": "pass",
- "missing": []
- },
- {
- "name": "strict-prerequisites",
- "status": "skip",
- "reason": "smoke mode"
- },
- {
- "name": "strict-command-plan",
- "status": "skip",
- "reason": "smoke mode"
- }
- ],
- "plannedCommands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "cwd": "."
- },
- {
- "name": "linux-screen-capture-build",
- "command": "pnpm --dir native/linux-screen-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-screen-capture-tests",
- "command": "pnpm --dir native/linux-screen-capture test",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-audio-capture-build",
- "command": "pnpm --dir native/linux-audio-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-audio-capture-tests",
- "command": "pnpm --dir native/linux-audio-capture test",
- "category": "platform-native",
- "cwd": "."
- }
- ],
- "commands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-07T14:52:39.690Z",
- "endedAt": "2026-06-07T14:52:39.792Z",
- "durationMs": 102,
- "stdoutTail": "▶ NativeScreenCapture source identity and capability reporting\n ✔ normalizes display and window sources without changing source ids (1.614801ms)\n ✔ starts display and window captures with exact source id and kind and reports diagnostics (1.041547ms)\n ✔ fails fast when native frame sink is required but unavailable (0.500503ms)\n ✔ passes caller-provided capture id and native sink handle to the platform wrapper (0.467711ms)\n ✔ reports macOS and Linux display/window capture capabilities from platform backends (0.625753ms)\n✔ NativeScreenCapture source identity and capability reporting (4.771278ms)\n▶ NativeVoiceEngine connection lifecycle\n ✔ does not forward native events after disconnecting a pending connect (3.117018ms)\n ✔ disconnects stale native connect completion after a replacement connect starts (1.775302ms)\n✔ NativeVoiceEngine connection lifecycle (5.440365ms)\n▶ NativeVoiceEngine screen frame routing\n ✔ publishes screen share with source pacing and exposes a native frame sink handle (0.897838ms)\n ✔ keeps screen-share audio published when screen video is unpublished (0.634254ms)\n ✔ replaces screen captures without releasing screen-share audio or duplicating priority (0.502586ms)\n ✔ forwards watch and unwatch operations with source, enablement, and quality intact (0.563378ms)\n ✔ reports VideoToolbox hardware capability from the native addon (0.49767ms)\n ✔ reports native voice engine capabilities from the native addon (0.56267ms)\n ✔ maps native addon microphone not-connected errors to the typed operation code (0.639129ms)\n✔ NativeVoiceEngine screen frame routing (4.546943ms)\nℹ tests 14\nℹ suites 3\nℹ pass 14\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 81.841144\n",
- "stderrTail": ""
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-07T14:52:39.792Z",
- "endedAt": "2026-06-07T14:52:40.133Z",
- "durationMs": 341,
- "stdoutTail": "\n> fluxer_desktop@0.0.0 typecheck /workspaces/fluxer/fluxer_desktop\n> tsgo --noEmit\n\n",
- "stderrTail": ""
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-07T14:52:40.133Z",
- "endedAt": "2026-06-07T14:52:57.557Z",
- "durationMs": 17424,
- "stdoutTail": "\n> @fluxer/webrtc-sender@0.0.0 build /workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n+ /home/vscode/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin/cargo build --release --target aarch64-unknown-linux-gnu --manifest-path Cargo.toml --features camera-native\n",
- "stderrTail": " Compiling crossbeam-utils v0.8.21\n Compiling fluxer_screen_frame_bus v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/screen-frame-bus)\n Compiling fluxer_voice_core v0.1.0 (/workspaces/fluxer/fluxer_voice_core)\nwarning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: variable does not need to be mutable\n --> vendor/libwebrtc/src/native/desktop_capturer.rs:66:13\n |\n66 | let mut sys_handle = sys_dc::ffi::DesktopCapturerOptions {\n | ----^^^^^^^^^^\n | |\n | help: remove this `mut`\n |\n = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 4 warnings (run `cargo fix --lib -p libwebrtc` to apply 3 suggestions)\n Compiling crossbeam-queue v0.3.12\n Compiling fluxer_webrtc_sender v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender)\n Finished `release` profile [optimized] target(s) in 10.39s\n"
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "status": "fail",
- "code": 1,
- "signal": null,
- "startedAt": "2026-06-07T14:52:57.557Z",
- "endedAt": "2026-06-07T14:53:04.641Z",
- "durationMs": 7084,
- "stdoutTail": "\n> @fluxer/webrtc-sender@0.0.0 test /workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- test-webrtc-sender-rust && node --test index.test.mjs scripts/livekit-harness.test.mjs\n\n+ /home/vscode/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin/cargo test --features \"publisher,camera-native\"\n ELIFECYCLE Test failed. See above for more details.\n WARN Local package.json exists, but node_modules missing, did you mean to install?\n",
- "stderrTail": " Compiling zerocopy-derive v0.8.50\n Compiling serde v1.0.228\n Compiling ring v0.17.14\n Compiling serde_urlencoded v0.7.1\n Compiling fluxer_screen_frame_bus v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/screen-frame-bus)\n Compiling rustls v0.23.40\n Compiling pbjson v0.6.0\n Compiling os_info v3.15.0\n Compiling fluxer_voice_core v0.1.0 (/workspaces/fluxer/fluxer_voice_core)\n Compiling tinytemplate v1.2.1\n Compiling pbjson-types v0.6.0\n Compiling zerocopy v0.8.50\n Compiling rustls-webpki v0.103.13\n Compiling livekit-protocol v0.7.8\n Compiling ppv-lite86 v0.2.21\n Compiling half v2.7.1\n Compiling rand_chacha v0.9.0\n Compiling rand_chacha v0.3.1\n Compiling ciborium-ll v0.2.2\n Compiling tokio-rustls v0.26.4\n Compiling rand v0.8.6\n Compiling rand v0.9.4\nerror[E0786]: found invalid metadata files for crate `rustls`\n --> /home/vscode/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-rustls-0.26.4/src/lib.rs:49:9\n |\n49 | pub use rustls;\n | ^^^^^^\n |\n = note: failed to open rmeta metadata: '/workspaces/fluxer/fluxer_desktop/native/webrtc-sender/target/debug/deps/librustls-f66081aae860cdad.rmeta'\n\nFor more information about this error, try `rustc --explain E0786`.\nerror: could not compile `tokio-rustls` (lib) due to 1 previous error\nwarning: build failed, waiting for other jobs to finish...\nCommand failed with exit code 101: /home/vscode/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin/cargo test --features \"publisher,camera-native\"\n"
- }
- ]
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-09T-codex-macos-livekit-strict5-rerun.json b/fluxer_desktop/native-media-reports/2026-06-09T-codex-macos-livekit-strict5-rerun.json
deleted file mode 100644
index c9fac5503..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-09T-codex-macos-livekit-strict5-rerun.json
+++ /dev/null
@@ -1,765 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-09T04:40:52.879Z",
- "endedAt": "2026-06-09T04:41:02.390Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://localhost:7880",
- "serverApiUrl": "http://localhost:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-76954-91cb528a-6d21-4940-ad58-aa5c5e746211",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-76954",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-76954",
- "subscriberIdentity": "fluxer-native-subscriber-76954",
- "required": true,
- "strict": true,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 5000,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": true,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": true,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-09T-codex-macos-livekit-strict5-rerun.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 9",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 3",
- "pass": true
- },
- {
- "name": "subscriber video resolution 320x180",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "publisher local camera publication",
- "pass": true
- },
- {
- "name": "subscriber remote camera subscription",
- "pass": true
- },
- {
- "name": "publisher outbound camera stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees publisher camera publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 10.01 below 14.25",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 3416,
- "inboundVideoFrames": 319,
- "strictAudioFrames": 50,
- "strictVideoFrames": 50,
- "videoCallbacks": 319,
- "videoBytes": 55728000,
- "receivedFps": 10.01,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 104,
- "maxAudioFrameGapMs": 102,
- "maxVideoFrameGapOverallMs": 83,
- "maxAudioFrameGapOverallMs": 102,
- "avDriftMs": 36,
- "maxObservedPacketLoss": 76,
- "maxObservedPacketLossDelta": 43,
- "videoResolutionCounts": {
- "320x180": 50
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780980053827,
- "stoppedAtMs": null,
- "framesPushed": 0,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 0,
- "lastPushAtMs": null,
- "elapsedMs": 8570,
- "producedFps": 0
- },
- "secondaryPublisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780980053827,
- "stoppedAtMs": null,
- "framesPushed": 0,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 0,
- "lastPushAtMs": null,
- "elapsedMs": 8570,
- "producedFps": 0
- },
- "serverPublishing": {
- "fetchedAtMs": 1780980057383,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-2-76954",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSwHXmU7ctxa87",
- "name": "screen",
- "kind": "video",
- "source": "screen_share",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMnWff3NPczSoR",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsTFRWHNvJ7MgE",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screen_share_audio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-publisher-76954",
- "trackCount": 4,
- "tracks": [
- {
- "sid": "TR_VSp9aehQCmDiq4",
- "name": "screen",
- "kind": "video",
- "source": "screen_share",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AM8ZuGaDACq9FB",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsD2wGcUaXveFj",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screen_share_audio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VC7GWwmaJQZJio",
- "name": "camera",
- "kind": "video",
- "source": "camera",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-76954",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_VC7GWwmaJQZJio",
- "trackName": "camera",
- "source": "camera",
- "width": 480,
- "height": 360,
- "timestampUs": 526246627000,
- "identity": "fluxer-native-publisher-76954",
- "kind": "video"
- },
- "lastStrictVideoMeta": {
- "atMs": 1780980062302,
- "identity": "fluxer-native-publisher-76954",
- "kind": "video",
- "source": "screen_share",
- "trackName": "screen",
- "trackSid": "TR_VSp9aehQCmDiq4",
- "width": 320,
- "height": 180
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VC7GWwmaJQZJio",
- "source": "camera",
- "kind": "video",
- "bitrateKbps": 158.8,
- "packetsLost": 0,
- "fps": 25,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_VC7GWwmaJQZJio",
- "source": "camera",
- "kind": "video",
- "bitrateKbps": 112.8,
- "packetsLost": 0,
- "fps": 20,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AsD2wGcUaXveFj",
- "source": "screen_share_audio",
- "kind": "audio",
- "bitrateKbps": 260.8,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AM8ZuGaDACq9FB",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSp9aehQCmDiq4",
- "source": "screen_share",
- "kind": "video",
- "bitrateKbps": 7.2,
- "packetsLost": 0,
- "fps": 9,
- "width": 320,
- "height": 180,
- "sourceWidth": 320,
- "sourceHeight": 180,
- "targetBitrateKbps": 400,
- "configuredFps": 15,
- "targetFps": 15,
- "effectiveFps": 0,
- "framesProduced": 0,
- "framesAccepted": 0,
- "framesDropped": 0,
- "framesCoalesced": 0,
- "framesCaptured": 0,
- "captureFailures": 0,
- "maxQueueAgeMs": 0,
- "maxPushLatencyMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable",
- "codec": "video/VP8"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_RnrcQgHxNGSb",
- "trackSid": "TR_AMnWff3NPczSoR",
- "kind": "audio",
- "bitrateKbps": 94.8,
- "packetsLost": 32,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_RnrcQgHxNGSb",
- "trackSid": "TR_AsTFRWHNvJ7MgE",
- "kind": "audio",
- "bitrateKbps": 236,
- "packetsLost": 28,
- "jitterMs": 0,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_RnrcQgHxNGSb",
- "trackSid": "TR_VSwHXmU7ctxa87",
- "kind": "video",
- "bitrateKbps": 7.1,
- "packetsLost": 5,
- "jitterMs": 1,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 8,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoPacingTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "source",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 55,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AMnWff3NPczSoR",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 99.2,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSwHXmU7ctxa87",
- "source": "screen_share",
- "kind": "video",
- "bitrateKbps": 10.6,
- "packetsLost": 0,
- "fps": 9,
- "width": 320,
- "height": 180,
- "sourceWidth": 320,
- "sourceHeight": 180,
- "targetBitrateKbps": 400,
- "configuredFps": 15,
- "targetFps": 15,
- "effectiveFps": 0,
- "framesProduced": 0,
- "framesAccepted": 0,
- "framesDropped": 0,
- "framesCoalesced": 0,
- "framesCaptured": 0,
- "captureFailures": 0,
- "maxQueueAgeMs": 0,
- "maxPushLatencyMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable",
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AsTFRWHNvJ7MgE",
- "source": "screen_share_audio",
- "kind": "audio",
- "bitrateKbps": 261.1,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_AM8ZuGaDACq9FB",
- "kind": "audio",
- "bitrateKbps": 88.9,
- "packetsLost": 25,
- "jitterMs": 0,
- "audioLevel": 0.331,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_AsD2wGcUaXveFj",
- "kind": "audio",
- "bitrateKbps": 250.9,
- "packetsLost": 30,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_VC7GWwmaJQZJio",
- "kind": "video",
- "bitrateKbps": 113.7,
- "packetsLost": 7,
- "jitterMs": 0,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_VSp9aehQCmDiq4",
- "kind": "video",
- "bitrateKbps": 9.3,
- "packetsLost": 14,
- "jitterMs": 1,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 8,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoPacingTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "source",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 56,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_AsD2wGcUaXveFj",
- "kind": "audio",
- "bitrateKbps": 260.5,
- "packetsLost": 5,
- "jitterMs": 0,
- "audioLevel": 0.318,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_VC7GWwmaJQZJio",
- "kind": "video",
- "bitrateKbps": 112.7,
- "packetsLost": 1,
- "jitterMs": 0,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_AM8ZuGaDACq9FB",
- "kind": "audio",
- "bitrateKbps": 98.7,
- "packetsLost": 1,
- "jitterMs": 0,
- "audioLevel": 0.313,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_szoL7dTduPBR",
- "trackSid": "TR_VSp9aehQCmDiq4",
- "kind": "video",
- "bitrateKbps": 7.2,
- "packetsLost": 10,
- "jitterMs": 0,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_RnrcQgHxNGSb",
- "trackSid": "TR_VSwHXmU7ctxa87",
- "kind": "video",
- "bitrateKbps": 7.7,
- "packetsLost": 3,
- "jitterMs": 1,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_RnrcQgHxNGSb",
- "trackSid": "TR_AMnWff3NPczSoR",
- "kind": "audio",
- "bitrateKbps": 98.7,
- "packetsLost": 3,
- "jitterMs": 0,
- "audioLevel": 0.323,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_RnrcQgHxNGSb",
- "trackSid": "TR_AsTFRWHNvJ7MgE",
- "kind": "audio",
- "bitrateKbps": 267.5,
- "packetsLost": 1,
- "jitterMs": 1,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 0,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoPacingTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "idle",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-livekit-strict5-localhost.json b/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-livekit-strict5-localhost.json
deleted file mode 100644
index c2c941526..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-livekit-strict5-localhost.json
+++ /dev/null
@@ -1,752 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-09T04:11:22.147Z",
- "endedAt": "2026-06-09T04:11:46.733Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://localhost:7880",
- "serverApiUrl": "http://localhost:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-39834-83ba9452-cd15-4567-a196-47587b5a4a47",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-39834",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-39834",
- "subscriberIdentity": "fluxer-native-subscriber-39834",
- "required": true,
- "strict": true,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 5000,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-livekit-strict5-localhost.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 9",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 3",
- "pass": true
- },
- {
- "name": "subscriber video resolution 320x180",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "publisher local camera publication",
- "pass": true
- },
- {
- "name": "subscriber remote camera subscription",
- "pass": true
- },
- {
- "name": "publisher outbound camera stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees publisher camera publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "A/V drift 97ms exceeds 80ms; observed 101 video frames outside 320x180",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 2952,
- "inboundVideoFrames": 268,
- "strictAudioFrames": 49,
- "strictVideoFrames": 201,
- "videoCallbacks": 268,
- "videoBytes": 46684800,
- "receivedFps": 40.18,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 71,
- "maxAudioFrameGapMs": 101,
- "maxVideoFrameGapOverallMs": 242,
- "maxAudioFrameGapOverallMs": 102,
- "avDriftMs": 97,
- "maxObservedPacketLoss": 49,
- "maxObservedPacketLossDelta": 30,
- "videoResolutionCounts": {
- "480x360": 101,
- "320x180": 100
- },
- "videoResolutionMismatchCount": 101,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780978299271,
- "stoppedAtMs": null,
- "framesPushed": 0,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 0,
- "lastPushAtMs": null,
- "elapsedMs": 7471,
- "producedFps": 0
- },
- "secondaryPublisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780978299271,
- "stoppedAtMs": null,
- "framesPushed": 0,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 0,
- "lastPushAtMs": null,
- "elapsedMs": 7471,
- "producedFps": 0
- },
- "serverPublishing": {
- "fetchedAtMs": 1780978301481,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-39834",
- "trackCount": 4,
- "tracks": [
- {
- "sid": "TR_VSgsehdpyfYRtH",
- "name": "screen",
- "kind": "video",
- "source": "screen_share",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMRH3WDE9scsXz",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_As4hoJPNkjh8Rv",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screen_share_audio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VC9jnXZixHviLZ",
- "name": "camera",
- "kind": "video",
- "source": "camera",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-publisher-2-39834",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSQsd4UAwpwKy7",
- "name": "screen",
- "kind": "video",
- "source": "screen_share",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AsHmVYBSWSQdfU",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screen_share_audio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AMq8at99MRi83a",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-39834",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_VSgsehdpyfYRtH",
- "width": 320,
- "height": 180,
- "timestampUs": 524491017000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VSgsehdpyfYRtH",
- "source": "screen_share",
- "kind": "video",
- "bitrateKbps": 6.9,
- "packetsLost": 0,
- "fps": 10,
- "width": 320,
- "height": 180,
- "sourceWidth": 320,
- "sourceHeight": 180,
- "targetBitrateKbps": 400,
- "configuredFps": 15,
- "targetFps": 15,
- "effectiveFps": 0,
- "framesProduced": 0,
- "framesAccepted": 0,
- "framesDropped": 0,
- "framesCoalesced": 0,
- "framesCaptured": 0,
- "captureFailures": 0,
- "maxQueueAgeMs": 0,
- "maxPushLatencyMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable",
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_As4hoJPNkjh8Rv",
- "source": "screen_share_audio",
- "kind": "audio",
- "bitrateKbps": 261.2,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMRH3WDE9scsXz",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.9,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VC9jnXZixHviLZ",
- "source": "camera",
- "kind": "video",
- "bitrateKbps": 114.9,
- "packetsLost": 0,
- "fps": 25,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_VC9jnXZixHviLZ",
- "source": "camera",
- "kind": "video",
- "bitrateKbps": 92,
- "packetsLost": 0,
- "fps": 20,
- "codec": "video/VP8"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_ychdbeoTL2ht",
- "trackSid": "TR_AMq8at99MRi83a",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 1,
- "jitterMs": 0,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ychdbeoTL2ht",
- "trackSid": "TR_AsHmVYBSWSQdfU",
- "kind": "audio",
- "bitrateKbps": 261.4,
- "packetsLost": 3,
- "jitterMs": 0,
- "audioLevel": 0.344,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ychdbeoTL2ht",
- "trackSid": "TR_VSQsd4UAwpwKy7",
- "kind": "video",
- "bitrateKbps": 13.1,
- "packetsLost": 3,
- "jitterMs": 6,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 8,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoPacingTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "source",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 29,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": null,
- "outbound": [
- {
- "trackSid": "TR_VSQsd4UAwpwKy7",
- "source": "screen_share",
- "kind": "video",
- "bitrateKbps": 15.3,
- "packetsLost": 0,
- "fps": 10,
- "width": 320,
- "height": 180,
- "sourceWidth": 320,
- "sourceHeight": 180,
- "targetBitrateKbps": 400,
- "configuredFps": 15,
- "targetFps": 15,
- "effectiveFps": 0,
- "framesProduced": 0,
- "framesAccepted": 0,
- "framesDropped": 0,
- "framesCoalesced": 0,
- "framesCaptured": 0,
- "captureFailures": 0,
- "maxQueueAgeMs": 0,
- "maxPushLatencyMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable",
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMq8at99MRi83a",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AsHmVYBSWSQdfU",
- "source": "screen_share_audio",
- "kind": "audio",
- "bitrateKbps": 261.2,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_As4hoJPNkjh8Rv",
- "kind": "audio",
- "bitrateKbps": 254.9,
- "packetsLost": 0,
- "jitterMs": 0,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_AMRH3WDE9scsXz",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 0,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_VSgsehdpyfYRtH",
- "kind": "video",
- "bitrateKbps": 7.3,
- "packetsLost": 0,
- "jitterMs": 2,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_VC9jnXZixHviLZ",
- "kind": "video",
- "bitrateKbps": 96.7,
- "packetsLost": 0,
- "jitterMs": 0,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 8,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoPacingTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "source",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 29,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_VSgsehdpyfYRtH",
- "kind": "video",
- "bitrateKbps": 7.3,
- "packetsLost": 1,
- "jitterMs": 2,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_AMRH3WDE9scsXz",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 3,
- "jitterMs": 0,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_VC9jnXZixHviLZ",
- "kind": "video",
- "bitrateKbps": 96.6,
- "packetsLost": 1,
- "jitterMs": 0,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_d6p3en8AQ9YP",
- "trackSid": "TR_As4hoJPNkjh8Rv",
- "kind": "audio",
- "bitrateKbps": 259.7,
- "packetsLost": 1,
- "jitterMs": 0,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ychdbeoTL2ht",
- "trackSid": "TR_AsHmVYBSWSQdfU",
- "kind": "audio",
- "bitrateKbps": 242.6,
- "packetsLost": 22,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ychdbeoTL2ht",
- "trackSid": "TR_VSQsd4UAwpwKy7",
- "kind": "video",
- "bitrateKbps": 15.3,
- "packetsLost": 2,
- "jitterMs": 7,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_ychdbeoTL2ht",
- "trackSid": "TR_AMq8at99MRi83a",
- "kind": "audio",
- "bitrateKbps": 96.8,
- "packetsLost": 19,
- "jitterMs": 0,
- "audioLevel": 0.322,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 0,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoPacingTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "idle",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-livekit-strict5.json b/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-livekit-strict5.json
deleted file mode 100644
index 2ac6eb370..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-livekit-strict5.json
+++ /dev/null
@@ -1,309 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-09T04:10:37.354Z",
- "endedAt": "2026-06-09T04:11:07.359Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:7880",
- "serverApiUrl": "http://127.0.0.1:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-39654-62723187-aa62-4359-9c19-cbc0403532e3",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-39654",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-39654",
- "subscriberIdentity": "fluxer-native-subscriber-39654",
- "required": true,
- "strict": true,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 5000,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-livekit-strict5.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": false
- },
- {
- "name": "subscriber connected",
- "pass": false
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 9",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 3",
- "pass": false
- },
- {
- "name": "subscriber video resolution 320x180",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": false
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "publisher local camera publication",
- "pass": false
- },
- {
- "name": "subscriber remote camera subscription",
- "pass": false
- },
- {
- "name": "publisher outbound camera stats",
- "pass": false
- },
- {
- "name": "secondary publisher connected",
- "pass": false
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": false
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": false
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "subscriber data packet received",
- "pass": false
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": false
- },
- {
- "name": "server publishing API participants listed",
- "pass": false
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": false
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": false
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": false
- },
- {
- "name": "server sees publisher camera publication",
- "pass": false
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": false
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": false
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1252:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1679:3)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1931:18)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1964:19",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": null
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-smoke/livekit-harness.json b/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-smoke/livekit-harness.json
deleted file mode 100644
index 158b6cad8..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-smoke/livekit-harness.json
+++ /dev/null
@@ -1,331 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-09T04:09:48.418Z",
- "endedAt": "2026-06-09T04:09:50.279Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://localhost:7880",
- "serverApiUrl": "http://localhost:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-39291-5ee61a43-3009-4112-bca3-ae4b4667a371",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-39291",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-39291",
- "subscriberIdentity": "fluxer-native-subscriber-39291",
- "required": false,
- "strict": false,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 0,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0,
- "maxFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": false,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": false,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-smoke/livekit-harness.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 320x180",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 1",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 3",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 72,
- "inboundVideoFrames": 5,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 5,
- "videoBytes": 432000,
- "receivedFps": 0,
- "requiredFps": null,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 132,
- "maxAudioFrameGapOverallMs": 101,
- "avDriftMs": 2,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780978189023,
- "stoppedAtMs": null,
- "framesPushed": 0,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 0,
- "lastPushAtMs": null,
- "elapsedMs": 1264,
- "producedFps": 0
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": {
- "participantSid": "PA_tmqNx963FdVV",
- "trackSid": "TR_VS7wQpyDuhX3NX",
- "width": 320,
- "height": 180,
- "timestampUs": 524374518000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VS7wQpyDuhX3NX",
- "source": "screen_share",
- "kind": "video",
- "bitrateKbps": 0,
- "packetsLost": 0,
- "fps": 10,
- "width": 320,
- "height": 180,
- "sourceWidth": 320,
- "sourceHeight": 180,
- "targetBitrateKbps": 400,
- "configuredFps": 15,
- "targetFps": 15,
- "effectiveFps": 0,
- "framesProduced": 0,
- "framesAccepted": 0,
- "framesDropped": 0,
- "framesCoalesced": 0,
- "framesCaptured": 0,
- "captureFailures": 0,
- "maxQueueAgeMs": 0,
- "maxPushLatencyMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable",
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMq6BwJ6fu5yXx",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 0,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 8,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoPacingTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "source",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 23,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 2,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_tmqNx963FdVV",
- "trackSid": "TR_AMq6BwJ6fu5yXx",
- "kind": "audio",
- "bitrateKbps": 0,
- "packetsLost": 0,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_tmqNx963FdVV",
- "trackSid": "TR_VS7wQpyDuhX3NX",
- "kind": "video",
- "bitrateKbps": 0,
- "packetsLost": 0,
- "jitterMs": 0,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 0,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoPacingTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "idle",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-smoke/summary.json b/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-smoke/summary.json
deleted file mode 100644
index 75b598a80..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-smoke/summary.json
+++ /dev/null
@@ -1,227 +0,0 @@
-{
- "status": "pass",
- "mode": "smoke",
- "strict": false,
- "platform": "darwin",
- "arch": "arm64",
- "hostname": "Hampuss-Mac-Studio.local",
- "startedAt": "2026-06-09T04:08:25.060Z",
- "endedAt": "2026-06-09T04:10:06.715Z",
- "reportDir": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/2026-06-09T0407-codex-macos-smoke",
- "gates": [
- {
- "name": "mode-valid",
- "status": "pass",
- "mode": "smoke"
- },
- {
- "name": "documentation-current",
- "status": "pass",
- "missing": []
- },
- {
- "name": "strict-prerequisites",
- "status": "skip",
- "reason": "smoke mode"
- },
- {
- "name": "strict-command-plan",
- "status": "skip",
- "reason": "smoke mode"
- }
- ],
- "plannedCommands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "cwd": "."
- },
- {
- "name": "mac-screen-capture-build",
- "command": "pnpm --dir native/mac-screen-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-screen-capture-tests",
- "command": "pnpm --dir native/mac-screen-capture test",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-build",
- "command": "pnpm --dir native/mac-app-audio build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-rust-tests",
- "command": "pnpm --dir native/mac-app-audio test:cargo",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "mac-app-audio-js-tests",
- "command": "'/Users/hampus/Development/fluxer/node_modules/.pnpm/node_modules/.bin/vitest' run",
- "category": "platform-native",
- "cwd": "native/mac-app-audio"
- }
- ],
- "commands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:08:25.062Z",
- "endedAt": "2026-06-09T04:08:25.338Z",
- "durationMs": 276,
- "stdoutTail": "▶ NativeScreenCapture source identity and capability reporting\n ✔ normalizes display and window sources without changing source ids (2.653541ms)\n ✔ starts display and window captures with exact source id and kind and reports diagnostics (1.257458ms)\n ✔ fails fast when native frame sink is required but unavailable (0.6175ms)\n ✔ passes caller-provided capture id and native sink handle to the platform wrapper (0.494583ms)\n ✔ reports macOS and Linux display/window capture capabilities from platform backends (0.748042ms)\n✔ NativeScreenCapture source identity and capability reporting (6.317833ms)\n▶ NativeVoiceEngine v2 bridge contract fixtures\n ✔ registers and removes every v2 IPC channel from the bridge contract fixture (2.216209ms)\n✔ NativeVoiceEngine v2 bridge contract fixtures (2.659666ms)\n▶ NativeVoiceEngine v2 IPC request fixtures\n ✔ replays fixture: valid connect reaches the native engine (0.942959ms)\n ✔ replays fixture: invalid connect args throw (0.602334ms)\n ✔ replays fixture: invalid mic enabled args return typed operation failure (0.997125ms)\n ✔ replays fixture: valid microphone publish returns typed success (0.571541ms)\n ✔ replays fixture: invalid microphone publish returns typed operation failure (0.397ms)\n ✔ replays fixture: valid zero-copy screen publish reaches native engine (0.593ms)\n ✔ replays fixture: explicit non-zero-copy screen publish is rejected (0.448708ms)\n ✔ replays fixture: hardware screen encoding without zero-copy is rejected (0.5ms)\n ✔ replays fixture: valid native screen audio publish reaches native engine (0.410292ms)\n ✔ replays fixture: invalid screen audio route throws (0.41325ms)\n ✔ replays fixture: valid camera publish reaches native engine (0.3655ms)\n ✔ replays fixture: invalid camera publish throws (0.345917ms)\n ✔ replays fixture: connected stats return normalized empty stats (0.378125ms)\n ✔ replays fixture: valid participant volume reaches native engine (0.356667ms)\n ✔ replays fixture: invalid participant volume throws (0.33175ms)\n ✔ replays fixture: valid remote subscription reaches native engine (0.372709ms)\n ✔ replays fixture: invalid remote subscription quality throws (0.322209ms)\n ✔ replays fixture: valid data publish reaches native engine (0.440584ms)\n ✔ replays fixture: invalid data payload throws (0.37625ms)\n✔ NativeVoiceEngine v2 IPC request fixtures (9.494209ms)\n▶ NativeVoiceEngine connection lifecycle\n ✔ prewarms the native voice backend once through IPC (0.402042ms)\n ✔ reuses the prewarmed native voice engine instance for connect (0.345084ms)\n ✔ prepares a fresh idle native voice engine after disconnect (0.408292ms)\n ✔ does not forward native events after disconnecting a pending connect (6.291459ms)\n ✔ disconnects stale native connect completion after a replacement connect starts (1.882667ms)\n✔ NativeVoiceEngine connection lifecycle (9.5095ms)\n▶ NativeVoiceEngine screen frame routing\n ✔ publishes screen share with source pacing and exposes a native frame sink handle (0.514834ms)\n ✔ forwards device screen share publish options to the native engine (0.381375ms)\n ✔ keeps screen-share audio published when screen video is unpublished (0.475375ms)\n ✔ replaces screen captures without releasing screen-share audio or duplicating priority (0.35675ms)\n ✔ updates active screen-share encoding over IPC (0.355959ms)\n ✔ republishes active screen-share when update changes codec or hardware mode (0.2975ms)\n ✔ forwards watch and unwatch operations with source, enablement, and quality intact (0.32775ms)\n ✔ reports VideoToolbox hardware capability from the native addon (0.26625ms)\n ✔ reports native voice engine capabilities from the native addon (0.29925ms)\n ✔ maps native addon microphone not-connected errors to the typed operation code (0.355417ms)\n✔ NativeVoiceEngine screen frame routing (3.728334ms)\nℹ tests 40\nℹ suites 5\nℹ pass 40\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 207.168208\n",
- "stderrTail": ""
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:08:25.339Z",
- "endedAt": "2026-06-09T04:08:26.138Z",
- "durationMs": 799,
- "stdoutTail": "\n> fluxer_desktop@0.0.0 typecheck /Users/hampus/Development/fluxer/fluxer_desktop\n> tsgo --noEmit\n\n",
- "stderrTail": ""
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:08:26.138Z",
- "endedAt": "2026-06-09T04:08:46.274Z",
- "durationMs": 20136,
- "stdoutTail": "\n> @fluxer/webrtc-sender@0.0.0 build /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n+ /Users/hampus/.rustup/toolchains/1.93.0-aarch64-apple-darwin/bin/cargo build --release --target aarch64-apple-darwin --manifest-path Cargo.toml --features camera-native\n+ codesign --force --sign - /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/webrtc-sender.darwin-arm64.node\n",
- "stderrTail": "warning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 3 warnings (run `cargo fix --lib -p libwebrtc` to apply 2 suggestions)\nwarning: struct `DmabufFrameDesc` is never constructed\n --> src/texture_source.rs:14:12\n |\n14 | pub struct DmabufFrameDesc {\n | ^^^^^^^^^^^^^^^\n |\n = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\n\nwarning: variants `InvalidDimensions`, `UnsupportedFormat`, `InvalidPlanes`, and `SdkNativeTextureUnsupported` are never constructed\n --> src/texture_source.rs:29:5\n |\n27 | pub enum TextureEncodeError {\n | ------------------ variants in this enum\n28 | NoTexture,\n29 | InvalidDimensions,\n | ^^^^^^^^^^^^^^^^^\n30 | UnsupportedFormat,\n | ^^^^^^^^^^^^^^^^^\n31 | InvalidPlanes,\n | ^^^^^^^^^^^^^\n...\n34 | SdkNativeTextureUnsupported,\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n |\n = note: `TextureEncodeError` has derived impls for the traits `Debug` and `Clone`, but these are intentionally ignored during dead code analysis\n\nwarning: function `fourcc` is never used\n --> src/texture_source.rs:75:10\n |\n75 | const fn fourcc(bytes: [u8; 4]) -> u32 {\n | ^^^^^^\n\nwarning: constant `DRM_FORMAT_XRGB8888` is never used\n --> src/texture_source.rs:79:7\n |\n79 | const DRM_FORMAT_XRGB8888: u32 = fourcc(*b\"XR24\");\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_ARGB8888` is never used\n --> src/texture_source.rs:80:7\n |\n80 | const DRM_FORMAT_ARGB8888: u32 = fourcc(*b\"AR24\");\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_XBGR8888` is never used\n --> src/texture_source.rs:81:7\n |\n81 | const DRM_FORMAT_XBGR8888: u32 = fourcc(*b\"XB24\");\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_ABGR8888` is never used\n --> src/texture_source.rs:82:7\n |\n82 | const DRM_FORMAT_ABGR8888: u32 = fourcc(*b\"AB24\");\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_XRGB2101010` is never used\n --> src/texture_source.rs:83:7\n |\n83 | const DRM_FORMAT_XRGB2101010: u32 = fourcc(*b\"XR30\");\n | ^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_ARGB2101010` is never used\n --> src/texture_source.rs:84:7\n |\n84 | const DRM_FORMAT_ARGB2101010: u32 = fourcc(*b\"AR30\");\n | ^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_XBGR2101010` is never used\n --> src/texture_source.rs:85:7\n |\n85 | const DRM_FORMAT_XBGR2101010: u32 = fourcc(*b\"XB30\");\n | ^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_ABGR2101010` is never used\n --> src/texture_source.rs:86:7\n |\n86 | const DRM_FORMAT_ABGR2101010: u32 = fourcc(*b\"AB30\");\n | ^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_NV12` is never used\n --> src/texture_source.rs:87:7\n |\n87 | const DRM_FORMAT_NV12: u32 = fourcc(*b\"NV12\");\n | ^^^^^^^^^^^^^^^\n\nwarning: function `drm_format_supported` is never used\n --> src/texture_source.rs:89:8\n |\n89 | pub fn drm_format_supported(drm_format: u32) -> bool {\n | ^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `MAX_TEXTURE_EDGE` is never used\n --> src/texture_source.rs:104:7\n |\n104 | const MAX_TEXTURE_EDGE: u32 = 8192;\n | ^^^^^^^^^^^^^^^^\n\nwarning: function `validate_dimensions` is never used\n --> src/texture_source.rs:106:4\n |\n106 | fn validate_dimensions(width: u32, height: u32) -> Result<(), TextureEncodeError> {\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: function `validate_dmabuf_desc` is never used\n --> src/texture_source.rs:131:8\n |\n131 | pub fn validate_dmabuf_desc(desc: &DmabufFrameDesc) -> Result<(), TextureEncodeError> {\n | ^^^^^^^^^^^^^^^^^^^^\n\nwarning: function `sdk_accepts_dmabuf_texture_buffers` is never used\n --> src/texture_source.rs:244:4\n |\n244 | fn sdk_accepts_dmabuf_texture_buffers() -> bool {\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: function `should_attempt_dmabuf_encode` is never used\n --> src/texture_source.rs:262:8\n |\n262 | pub fn should_attempt_dmabuf_encode(\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: function `try_publish_dmabuf` is never used\n --> src/texture_source.rs:335:12\n |\n335 | pub fn try_publish_dmabuf(\n | ^^^^^^^^^^^^^^^^^^\n\nwarning: function `publish_native_buffer` is never used\n --> src/texture_source.rs:362:8\n |\n362 | fn publish_native_buffer(source: &NativeVideoSource, buffer: NativeBuffer, timestamp_us: i64) {\n | ^^^^^^^^^^^^^^^^^^^^^\n\nwarning: variants `Bgra` and `Nv12` are never constructed\n --> src/engine.rs:256:5\n |\n255 | enum PendingVideoFrame {\n | ----------------- variants in this enum\n256 | Bgra {\n | ^^^^\n...\n264 | Nv12 {\n | ^^^^\n\nwarning: `fluxer_webrtc_sender` (lib) generated 21 warnings\n Finished `release` profile [optimized] target(s) in 0.47s\n/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/webrtc-sender.darwin-arm64.node: replacing existing signature\n"
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:08:46.274Z",
- "endedAt": "2026-06-09T04:09:48.093Z",
- "durationMs": 61819,
- "stdoutTail": "_and_raw ... ok\ntest events::tests::json_u8_array_serializes_bytes_as_numbers ... ok\ntest events::tests::leaves_plain_ascii_and_unicode_untouched ... ok\ntest events::tests::raw_array_preserves_prebuilt_json_objects ... ok\ntest events::tests::track_source_strings_match_livekit_js_sources ... ok\ntest hardware_encoder::tests::publish_codec_runtime_gate_accepts_h265_when_reported_available ... ok\ntest hardware_encoder::tests::publish_codec_runtime_gate_only_requires_hardware_for_h265 ... ok\ntest hardware_encoder::tests::reports_available_nvenc_when_compiled_and_runtime_ready ... ok\ntest hardware_encoder::tests::reports_available_videotoolbox_with_h264_and_h265 ... ok\ntest hardware_encoder::tests::reports_driver_sdk_incompatibility_before_encode_session ... ok\ntest hardware_encoder::tests::reports_h264_only_when_hevc_guid_is_absent ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_compiled ... ok\ntest hardware_encoder::tests::reports_missing_runtime_prerequisites_when_probe_is_absent ... ok\ntest hardware_encoder::tests::reports_no_cuda_devices_using_obs_style_reason ... ok\ntest hardware_encoder::tests::reports_no_supported_codecs_when_guid_query_finds_no_fluxer_codecs ... ok\ntest hardware_encoder::tests::reports_not_compiled_before_runtime_missing ... ok\ntest hardware_encoder::tests::reports_unsupported_platforms_clearly ... ok\ntest hardware_encoder::tests::reports_videotoolbox_h264_only_when_hevc_session_is_unavailable ... ok\ntest hardware_encoder::tests::reports_videotoolbox_unavailable_with_status_details ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_publish_backend_not_compiled ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_runtime_dll_names_when_missing ... ok\ntest hardware_encoder::tests::reports_windows_nvenc_without_linux_zero_copy_inputs ... ok\ntest send_control::tests::audio_buffer_growth_caps_at_configured_max_and_reset_clears_pressure ... ok\ntest send_control::tests::audio_buffer_expands_on_gaps_and_shrinks_after_stability ... ok\ntest send_control::tests::audio_buffer_ignores_clock_regression_without_false_rebuffer ... ok\ntest send_control::tests::audio_buffer_max_is_clamped_to_real_time_bounds ... ok\ntest send_control::tests::idle_snapshot_reflects_audio_pressure_without_video_state ... ok\ntest send_control::tests::video_controller_continues_degrading_under_sustained_latency_pressure ... ok\ntest send_control::tests::video_controller_degrades_on_encoder_drop_pressure ... ok\ntest send_control::tests::video_controller_degrades_on_encoder_egress_pressure ... ok\ntest send_control::tests::audio_buffer_stress_stays_within_realtime_bounds_under_jitter ... ok\ntest send_control::tests::video_controller_degrades_on_latency_pressure_without_coalescing ... ok\ntest send_control::tests::video_controller_ignores_pure_coalescing_jitter ... ok\ntest send_control::tests::audio_buffer_ignores_concurrent_stale_pushes_without_moving_last_push_backwards ... ok\ntest send_control::tests::video_controller_ignores_single_encoder_egress_sample ... ok\ntest send_control::tests::video_controller_ignores_sustained_coalescing_jitter_across_windows ... ok\ntest send_control::tests::video_controller_keeps_requested_fps_when_adaptive_send_is_disabled ... ok\ntest send_control::tests::video_controller_preserves_pressure_reason_while_degraded_but_stable ... ok\ntest send_control::tests::video_controller_recovers_after_stable_windows ... ok\ntest send_control::tests::video_controller_recovers_from_minimum_in_two_stable_steps ... ok\ntest send_control::tests::video_controller_requires_a_full_stable_recovery_window ... ok\ntest send_control::tests::video_stats_effective_fps_uses_capture_time_bounds_for_out_of_order_records ... ok\ntest send_control::tests::video_stats_snapshot_counts_coalescing_drops_failures_and_effective_fps ... ok\ntest send_control::tests::video_controller_stress_keeps_target_inside_configured_bounds ... ok\ntest stats::tests::bitrate_computes_kbps_from_byte_delta ... ok\ntest stats::tests::bitrate_first_sample_is_zero ... ok\ntest stats::tests::bitrate_half_second_doubles_rate ... ok\ntest stats::tests::bitrate_rejects_backwards_time_and_bytes ... ok\ntest stats::tests::empty_stats_serialise_to_null_rtt_and_empty_arrays ... ok\ntest stats::tests::sanitize_audio_level_clamps ... ok\ntest stats::tests::full_stats_serialise_to_exact_contract_shape ... ok\ntest stats::tests::sanitize_kbps_drops_nan_inf_negative_and_rounds ... ok\ntest send_control::tests::video_stats_handles_concurrent_recording_without_lost_counts ... ok\ntest stats::tests::send_health_serialises_to_exact_contract_shape ... ok\ntest stats::tests::unit_conversions_seconds_to_ms ... ok\ntest stats::tests::video_inbound_omits_audio_level_audio_omits_fps ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_populates_all_plane_arrays ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_incomplete_native_inputs ... ok\ntest texture_source::tests::dmabuf_desc_from_parts_rejects_negative_fds ... ok\ntest texture_source::tests::drm_format_gate_accepts_obs_vkcapture_texture_formats ... ok\ntest texture_source::tests::dxgi_format_gate_accepts_8bit_rgba_bgra_only ... ok\ntest texture_source::tests::error_strings_are_stable ... ok\ntest texture_source::tests::probe_is_available_only_for_explicit_hardware_codecs ... ok\ntest texture_source::tests::should_attempt_dmabuf_is_sdk_gated_after_validation_capability ... ok\ntest texture_source::tests::should_attempt_falls_back_when_capability_unavailable ... ok\ntest texture_source::tests::should_attempt_validates_frame_when_capability_available ... ok\ntest texture_source::tests::validate_accepts_a_clean_bgra_texture ... ok\ntest texture_source::tests::validate_dmabuf_accepts_supported_formats_with_optional_uuid ... ok\ntest texture_source::tests::validate_dmabuf_rejects_invalid_planes ... ok\ntest texture_source::tests::validate_precedence_handle_before_dims_before_format ... ok\ntest texture_source::tests::validate_rejects_odd_zero_and_oversized_dims ... ok\ntest texture_source::tests::validate_rejects_unsupported_format ... ok\ntest texture_source::tests::validate_rejects_zero_handle_as_no_texture ... ok\ntest yuv::tests::bgra_black_white_grey_levels ... ok\ntest engine::tests::pcm16_audio_frame_rejects_implausible_format_and_overlong_chunks ... ok\ntest yuv::tests::bgra_golden_2x2_solid_colour_exact_bytes ... ok\ntest yuv::tests::bgra_golden_strided_2x2_skips_row_padding ... ok\ntest yuv::tests::bgra_plane_sizes ... ok\ntest yuv::tests::bgra_primaries_have_expected_chroma_signs ... ok\ntest yuv::tests::copy_nv12_planes_preserves_nv12_layout ... ok\ntest yuv::tests::copy_nv12_planes_rejects_short_buffers ... ok\ntest yuv::tests::copy_nv12_planes_respects_destination_stride ... ok\ntest yuv::tests::nv12_4x4_deinterleaves_two_chroma_columns ... ok\ntest yuv::tests::nv12_golden_4x2_packed_to_i420 ... ok\ntest yuv::tests::nv12_packed_2x2_deinterleaves ... ok\ntest yuv::tests::nv12_respects_row_padding ... ok\ntest yuv::tests::nv12_short_buffer_is_rejected ... ok\ntest yuv::tests::rejects_odd_or_tiny_dimensions ... ok\ntest yuv::tests::rgb_golden_2x2_solid_colour_matches_bgra_path ... ok\ntest yuv::tests::rgb_plane_sizes_and_levels ... ok\ntest yuv::tests::rgb_rejects_odd_dims_and_short_buffer ... ok\n\ntest result: ok. 144 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 6 tests\ntest video_frame_meta_matches_contract ... ok\ntest outbound_fixtures_match_contract ... ok\ntest inbound_covers_subscribe_and_lifecycle ... ok\ntest outbound_covers_the_single_identity_publish_path ... ok\ntest inbound_fixtures_match_contract ... ok\ntest e2ee_state_is_ok_on_the_wire ... ok\n\ntest result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n▶ webrtc-sender loader wrapper\n ✔ resolves the native addon filename for every desktop OS/arch target (0.586ms)\n ✔ rejects unsupported platform/architecture pairs explicitly (0.172042ms)\n ✔ returns a native hardware encoder capability when the binding exports one (1.042375ms)\n ✔ delegates dropped video callback metrics through the VoiceEngine wrapper (0.114833ms)\n ✔ reports VoiceEngine feature capabilities from the wrapped native prototype (0.322209ms)\n ✔ delegates native voice engine prewarm when the binding exports it (0.055542ms)\n ✔ delegates device microphone publish through the VoiceEngine wrapper (0.10525ms)\n ✔ delegates native camera devices and publish options through the VoiceEngine wrapper (0.117583ms)\n ✔ delegates device screen-share publish through the VoiceEngine wrapper (0.119541ms)\n ✔ reports device screen-share publish as unavailable for older native bindings (0.114084ms)\n ✔ delegates screen-share simulcast selection through the VoiceEngine wrapper (0.104083ms)\n ✔ delegates connect options through the VoiceEngine wrapper (0.10775ms)\n ✔ delegates native screen frame sink handle creation through the VoiceEngine wrapper (0.060958ms)\n ✔ treats native screen frame sink handles as unavailable for older voice bindings (0.065791ms)\n ✔ defaults dropped video callback metrics to zero for older native bindings (0.050375ms)\n ✔ delegates remote track subscription updates through the VoiceEngine wrapper (0.071958ms)\n ✔ ignores remote track subscription updates for older native bindings (0.054042ms)\n ✔ delegates data packets through the VoiceEngine wrapper (0.129167ms)\n ✔ rejects invalid data packet payloads in the wrapper (0.146916ms)\n ✔ returns an unavailable hardware encoder capability without a binding (0.039833ms)\n✔ webrtc-sender loader wrapper (4.374833ms)\n▶ livekit harness setup matrix\n ✔ maps all supported codec spellings to expected mime types (1.00325ms)\n ✔ parses codec lists with fallback and rejects empty effective lists (0.878375ms)\n ✔ default non-strict config keeps the fast local live setup small (0.956958ms)\n ✔ strict config expands to multi-codec secondary-publisher scenarios (0.648125ms)\n ✔ stress knobs parse packet loss, resolution stability, audio gap, and video pattern (0.379917ms)\n ✔ stress knobs reject impossible send pacing configurations (1.902ms)\n ✔ explicit secondary codec expectations override rotating defaults (0.287792ms)\n ✔ secondary screen codec aliases are accepted and conflicting aliases are rejected (0.592416ms)\n ✔ external token setup derives identities, requires matching tokens, and redacts reports (0.933834ms)\n ✔ report sanitization strips URL credentials, query strings, and fragments (0.452459ms)\n ✔ jwt subject and TCP target parsing catch malformed live setups early (0.230125ms)\n ✔ admin token has the room-scoped grant needed for server publishing validation (0.303459ms)\n ✔ scenario room names are stable and bounded for generated-token suites (0.07075ms)\n ✔ strict report checks fail when the strict window has too few samples to measure gaps (137.344709ms)\n ✔ strict report checks use only samples inside the measured window (6.192458ms)\n ✔ strict packet loss gate uses loss deltas inside the strict window (10.880291ms)\n ✔ server publishing checks cover primary and secondary screen, audio, and camera tracks (0.760666ms)\n ✔ server publishing checks fail closed on missing server tracks (0.331583ms)\n ✔ server publishing checks reject wrong participant identity (0.246792ms)\n ✔ server publishing checks reject wrong kind, source, and screen mime (0.27275ms)\n ✔ server publishing checks reject muted or missing mute state on expected tracks (0.213459ms)\n ✔ server publishing checks handle protobuf numeric enums without accepting data tracks as video (0.200917ms)\n ✔ server publishing checks fail closed on missing secondary, audio, camera, and screen-audio tracks (0.217459ms)\n ✔ strict server publishing validation does not pass open on Twirp errors (0.242125ms)\n✔ livekit harness setup matrix (166.608375ms)\nℹ tests 44\nℹ suites 2\nℹ pass 44\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 973.929333\n",
- "stderrTail": "segmentation v1.13.2\n Compiling convert_case v0.11.0\n Compiling image v0.25.10\n Compiling cxx-build v1.0.194\n Compiling flume v0.11.1\n Compiling core-media-sys v0.1.2\n Compiling napi v3.9.0\n Compiling thiserror-impl v1.0.69\n Compiling objc v0.2.7\n Compiling cocoa v0.20.2\n Compiling cocoa-foundation v0.2.1\n Compiling darling_core v0.14.4\n Compiling block2 v0.6.2\n Compiling objc2-core-foundation v0.3.2\n Compiling libloading v0.9.0\n Compiling ctor v1.0.7\n Compiling anstyle v1.0.14\n Compiling metal v0.18.0\n Compiling parking_lot v0.12.5\n Compiling objc2-foundation v0.3.2\n Compiling der v0.7.10\n Compiling darling_macro v0.14.4\n Compiling clap_lex v1.1.0\n Compiling darling v0.14.4\n Compiling yoke v0.8.2\n Compiling crypto-common v0.1.6\n Compiling block-buffer v0.10.4\n Compiling crypto-bigint v0.5.5\n Compiling digest v0.10.7\n Compiling spki v0.7.3\n Compiling hmac v0.12.1\n Compiling signature v2.2.0\n Compiling pkcs8 v0.10.2\n Compiling hkdf v0.12.4\n Compiling sha2 v0.10.9\n Compiling rfc6979 v0.4.0\n Compiling sec1 v0.7.3\n Compiling pkcs1 v0.7.5\n Compiling ed25519 v2.2.3\n Compiling sha1 v0.10.6\n Compiling core-video-sys v0.1.4\n Compiling ciborium-io v0.2.2\n Compiling rtrb v0.3.4\n Compiling livekit v0.7.43\n Compiling clap_builder v4.6.0\n Compiling fluxer_gpu_rebuild v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/gpu-rebuild)\n Compiling elliptic-curve v0.13.8\n Compiling napi-sys v3.2.1\n Compiling napi-derive-backend v5.0.4\n Compiling ecdsa v0.16.9\n Compiling primeorder v0.13.6\n Compiling device-info v0.1.1\n Compiling p384 v0.13.1\n Compiling p256 v0.13.2\n Compiling fluxer_webrtc_sender v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender)\n Compiling itertools v0.13.0\n Compiling libloading v0.8.9\n Compiling same-file v1.0.6\n Compiling nohash-hasher v0.2.0\n Compiling rustc-hash v2.1.2\n Compiling cast v0.3.0\n Compiling walkdir v2.5.0\n Compiling clap v4.6.1\n Compiling prost-types v0.12.6\n Compiling futures-executor v0.3.32\n Compiling fluxer_screen_frame_bus v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/screen-frame-bus)\n Compiling fluxer_desktop_native v0.1.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/rust)\n Compiling futures v0.3.32\n Compiling oorandom v11.1.5\n Compiling anes v0.1.6\n Compiling criterion-plot v0.6.0\n Compiling napi-derive v3.5.6\n Compiling prost-build v0.12.6\n Compiling pbjson-build v0.6.2\n Compiling tokio-util v0.7.18\n Compiling pbjson v0.6.0\n Compiling tokio-stream v0.1.18\n Compiling bmrng v0.5.2\n Compiling tinytemplate v1.2.1\n Compiling livekit-runtime v0.4.0\n Compiling pbjson-types v0.6.0\n Compiling ppv-lite86 v0.2.21\n Compiling ed25519-dalek v2.2.0\n Compiling half v2.7.1\n Compiling rand_chacha v0.9.0\n Compiling rand_chacha v0.3.1\n Compiling rustls-webpki v0.103.13\n Compiling ciborium-ll v0.2.2\n Compiling rand v0.9.4\n Compiling rand v0.8.6\n Compiling ciborium v0.2.2\n Compiling criterion v0.7.0\n Compiling crossbeam-queue v0.3.12\n Compiling rsa v0.9.10\n Compiling mozjpeg v0.10.13\n Compiling jsonwebtoken v10.4.0\n Compiling nokhwa-core v0.1.9\n Compiling from_variants_impl v1.0.2\n Compiling nokhwa-bindings-linux v0.1.4\n Compiling nokhwa-bindings-windows v0.4.6\n Compiling from_variants v1.0.2\n Compiling zerovec v0.11.6\n Compiling zerotrie v0.2.4\n Compiling nokhwa v0.10.11\n Compiling os_info v3.15.0\n Compiling tokio-rustls v0.26.4\n Compiling hyper-rustls v0.27.9\n Compiling livekit-protocol v0.7.8\n Compiling tinystr v0.8.3\n Compiling potential_utf v0.1.5\n Compiling icu_collections v2.2.0\n Compiling icu_locale_core v2.2.0\n Compiling icu_provider v2.2.0\n Compiling icu_properties v2.2.0\n Compiling icu_normalizer v2.2.0\n Compiling idna_adapter v1.2.2\n Compiling idna v1.1.0\n Compiling url v2.5.8\n Compiling tower-http v0.6.11\n Compiling tungstenite v0.29.0\n Compiling reqwest v0.12.28\n Compiling tokio-tungstenite v0.29.0\n Compiling webrtc-sys-build v0.3.18\n Compiling webrtc-sys v0.3.33 (/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys)\n Compiling livekit-datatrack v0.1.8\n Compiling livekit-api v0.5.0\n Compiling libwebrtc v0.3.35 (/Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/vendor/libwebrtc)\nwarning: unused import: `enum_dispatch`\n --> vendor/libwebrtc/src/audio_source.rs:15:13\n |\n15 | use crate::{enum_dispatch, imp::audio_source as imp_as};\n | ^^^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unnecessary `unsafe` block\n --> vendor/libwebrtc/src/native/apm.rs:32:25\n |\n32 | sys_handle: unsafe {\n | ^^^^^^ unnecessary `unsafe` block\n |\n = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/libwebrtc/src/native/audio_mixer.rs:30:34\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option;\n | ^^^^^ the lifetime is elided here ^^^^^^^^^^ the same lifetime is hidden here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n30 | fn get_audio_frame_with_info(&self, target_sample_rate: u32) -> Option>;\n | ++++\n\nwarning: `libwebrtc` (lib) generated 3 warnings (run `cargo fix --lib -p libwebrtc` to apply 2 suggestions)\nwarning: struct `DmabufFrameDesc` is never constructed\n --> src/texture_source.rs:14:12\n |\n14 | pub struct DmabufFrameDesc {\n | ^^^^^^^^^^^^^^^\n |\n = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\n\nwarning: variants `InvalidDimensions`, `UnsupportedFormat`, `InvalidPlanes`, and `SdkNativeTextureUnsupported` are never constructed\n --> src/texture_source.rs:29:5\n |\n27 | pub enum TextureEncodeError {\n | ------------------ variants in this enum\n28 | NoTexture,\n29 | InvalidDimensions,\n | ^^^^^^^^^^^^^^^^^\n30 | UnsupportedFormat,\n | ^^^^^^^^^^^^^^^^^\n31 | InvalidPlanes,\n | ^^^^^^^^^^^^^\n...\n34 | SdkNativeTextureUnsupported,\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n |\n = note: `TextureEncodeError` has derived impls for the traits `Debug` and `Clone`, but these are intentionally ignored during dead code analysis\n\nwarning: function `fourcc` is never used\n --> src/texture_source.rs:75:10\n |\n75 | const fn fourcc(bytes: [u8; 4]) -> u32 {\n | ^^^^^^\n\nwarning: constant `DRM_FORMAT_XRGB8888` is never used\n --> src/texture_source.rs:79:7\n |\n79 | const DRM_FORMAT_XRGB8888: u32 = fourcc(*b\"XR24\");\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_ARGB8888` is never used\n --> src/texture_source.rs:80:7\n |\n80 | const DRM_FORMAT_ARGB8888: u32 = fourcc(*b\"AR24\");\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_XBGR8888` is never used\n --> src/texture_source.rs:81:7\n |\n81 | const DRM_FORMAT_XBGR8888: u32 = fourcc(*b\"XB24\");\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_ABGR8888` is never used\n --> src/texture_source.rs:82:7\n |\n82 | const DRM_FORMAT_ABGR8888: u32 = fourcc(*b\"AB24\");\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_XRGB2101010` is never used\n --> src/texture_source.rs:83:7\n |\n83 | const DRM_FORMAT_XRGB2101010: u32 = fourcc(*b\"XR30\");\n | ^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_ARGB2101010` is never used\n --> src/texture_source.rs:84:7\n |\n84 | const DRM_FORMAT_ARGB2101010: u32 = fourcc(*b\"AR30\");\n | ^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_XBGR2101010` is never used\n --> src/texture_source.rs:85:7\n |\n85 | const DRM_FORMAT_XBGR2101010: u32 = fourcc(*b\"XB30\");\n | ^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_ABGR2101010` is never used\n --> src/texture_source.rs:86:7\n |\n86 | const DRM_FORMAT_ABGR2101010: u32 = fourcc(*b\"AB30\");\n | ^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `DRM_FORMAT_NV12` is never used\n --> src/texture_source.rs:87:7\n |\n87 | const DRM_FORMAT_NV12: u32 = fourcc(*b\"NV12\");\n | ^^^^^^^^^^^^^^^\n\nwarning: function `drm_format_supported` is never used\n --> src/texture_source.rs:89:8\n |\n89 | pub fn drm_format_supported(drm_format: u32) -> bool {\n | ^^^^^^^^^^^^^^^^^^^^\n\nwarning: constant `MAX_TEXTURE_EDGE` is never used\n --> src/texture_source.rs:104:7\n |\n104 | const MAX_TEXTURE_EDGE: u32 = 8192;\n | ^^^^^^^^^^^^^^^^\n\nwarning: function `validate_dimensions` is never used\n --> src/texture_source.rs:106:4\n |\n106 | fn validate_dimensions(width: u32, height: u32) -> Result<(), TextureEncodeError> {\n | ^^^^^^^^^^^^^^^^^^^\n\nwarning: function `validate_dmabuf_desc` is never used\n --> src/texture_source.rs:131:8\n |\n131 | pub fn validate_dmabuf_desc(desc: &DmabufFrameDesc) -> Result<(), TextureEncodeError> {\n | ^^^^^^^^^^^^^^^^^^^^\n\nwarning: function `sdk_accepts_dmabuf_texture_buffers` is never used\n --> src/texture_source.rs:244:4\n |\n244 | fn sdk_accepts_dmabuf_texture_buffers() -> bool {\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: function `should_attempt_dmabuf_encode` is never used\n --> src/texture_source.rs:262:8\n |\n262 | pub fn should_attempt_dmabuf_encode(\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: function `try_publish_dmabuf` is never used\n --> src/texture_source.rs:335:12\n |\n335 | pub fn try_publish_dmabuf(\n | ^^^^^^^^^^^^^^^^^^\n\nwarning: function `publish_native_buffer` is never used\n --> src/texture_source.rs:362:8\n |\n362 | fn publish_native_buffer(source: &NativeVideoSource, buffer: NativeBuffer, timestamp_us: i64) {\n | ^^^^^^^^^^^^^^^^^^^^^\n\nwarning: variants `Bgra` and `Nv12` are never constructed\n --> src/engine.rs:256:5\n |\n255 | enum PendingVideoFrame {\n | ----------------- variants in this enum\n256 | Bgra {\n | ^^^^\n...\n264 | Nv12 {\n | ^^^^\n\nwarning: variant `Failed` is never constructed\n --> src/config.rs:62:5\n |\n57 | pub enum PublisherState {\n | -------------- variant in this enum\n...\n62 | Failed,\n | ^^^^^^\n |\n = note: `PublisherState` has derived impls for the traits `Debug` and `Clone`, but these are intentionally ignored during dead code analysis\n = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\n\nwarning: static `PREWARMED_LIVEKIT_RUNTIME` is never used\n --> src/engine.rs:102:8\n |\n102 | static PREWARMED_LIVEKIT_RUNTIME: LazyLock>>> =\n | ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: function `prewarm_voice_engine` is never used\n --> src/engine.rs:203:8\n |\n203 | pub fn prewarm_voice_engine() -> napi::Result<()> {\n | ^^^^^^^^^^^^^^^^^^^^\n\nwarning: function `prewarm_voice_engine_inner` is never used\n --> src/engine.rs:212:4\n |\n212 | fn prewarm_voice_engine_inner() -> napi::Result<()> {\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nwarning: variant `Nv12` is never constructed\n --> src/engine.rs:264:5\n |\n255 | enum PendingVideoFrame {\n | ----------------- variant in this enum\n...\n264 | Nv12 {\n | ^^^^\n\nwarning: `fluxer_webrtc_sender` (lib test) generated 9 warnings (4 duplicates)\nwarning: `fluxer_webrtc_sender` (lib) generated 21 warnings\n Finished `test` profile [unoptimized + debuginfo] target(s) in 58.51s\n Running unittests src/lib.rs (target/debug/deps/fluxer_webrtc_sender-986568c9de5e7b47)\n Running tests/event_contract.rs (target/debug/deps/event_contract-ed4cabbef0fb9f7c)\n Doc-tests fluxer_webrtc_sender\n"
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:09:48.093Z",
- "endedAt": "2026-06-09T04:09:50.341Z",
- "durationMs": 2248,
- "stdoutTail": "\n> @fluxer/webrtc-sender@0.0.0 test:livekit /Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender\n> node scripts/livekit-harness.mjs\n\n[livekit-harness] connecting to ws://localhost:7880 room=fluxer-webrtc-harness-39291-5ee61a43-3009-4112-bca3-ae4b4667a371\n[livekit-harness] PASS: 19 checks, inboundAudioFrames=72, inboundVideoFrames=5, videoCallbacks=5, receivedFps=0, producedFps=0, maxVideoFrameGapMs=0, maxAudioFrameGapMs=0, maxObservedPacketLoss=0, maxObservedPacketLossDelta=0, resolutionMismatches=0, droppedVideoFrameCallbacks=0\n",
- "stderrTail": ""
- },
- {
- "name": "mac-screen-capture-build",
- "command": "pnpm --dir native/mac-screen-capture build",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:09:50.341Z",
- "endedAt": "2026-06-09T04:09:55.416Z",
- "durationMs": 5075,
- "stdoutTail": "\n> @fluxer/mac-screen-capture@0.0.0 build /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture\n+ /Users/hampus/.rustup/toolchains/1.93.0-aarch64-apple-darwin/bin/cargo build --release --target aarch64-apple-darwin --manifest-path Cargo.toml\n+ codesign --force --sign - /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture/mac-screen-capture.darwin-arm64.node\n",
- "stderrTail": " Finished `release` profile [optimized] target(s) in 0.33s\n/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture/mac-screen-capture.darwin-arm64.node: replacing existing signature\n"
- },
- {
- "name": "mac-screen-capture-tests",
- "command": "pnpm --dir native/mac-screen-capture test",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:09:55.416Z",
- "endedAt": "2026-06-09T04:09:59.295Z",
- "durationMs": 3879,
- "stdoutTail": "\n> @fluxer/mac-screen-capture@0.0.0 test /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture\n> pnpm test:cargo && node --test index.test.mjs\n\n\n> @fluxer/mac-screen-capture@0.0.0 test:cargo /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture\n> cargo test --manifest-path Cargo.toml\n\n\nrunning 78 tests\ntest audio_pool::tests::append_concatenates_planar_to_interleaved_like_payload ... ok\ntest audio_pool::tests::as_mut_ptr_returns_slot_base_address ... ok\ntest audio_pool::tests::append_rejects_overflow ... ok\ntest audio_pool::tests::acquire_release_cycle_increments_counters ... ok\ntest audio_pool::tests::capacity_one_pool_round_trips ... ok\ntest audio_pool::tests::default_pool_dimensions_match_constants ... ok\ntest audio_pool::tests::drop_returns_slot_to_free_list ... ok\ntest audio_pool::tests::into_external_parts_drop_returns_slot_to_pool ... ok\ntest audio_pool::tests::into_external_parts_exposes_filled_pointer_and_length ... ok\ntest audio_pool::tests::new_rejects_bytes_per_slot_above_max ... ok\ntest audio_pool::tests::new_rejects_zero_bytes_per_slot ... ok\ntest audio_pool::tests::new_rejects_zero_capacity ... ok\ntest audio_pool::tests::into_external_parts_holds_slot_across_send ... ok\ntest audio_pool::tests::pool_exhausts_at_cap_seventeenth_acquire_returns_none ... ok\ntest audio_pool::tests::recycled_slot_persists_buffer_storage_until_overwritten ... ok\ntest audio_pool::tests::stats_in_flight_matches_simultaneous_holders ... ok\ntest audio_pool::tests::write_rejects_payload_larger_than_slot ... ok\ntest audio_pool::tests::write_then_data_slice_matches_payload ... ok\ntest config::tests::audio_sample_format_strings_and_widths ... ok\ntest config::tests::builder_accepts_48khz_stereo_audio ... ok\ntest config::tests::builder_accepts_fps_120 ... ok\ntest config::tests::builder_accepts_hdr_with_displayp3 ... ok\ntest config::tests::builder_captures_audio_toggle_preserves_frame_interval ... ok\ntest config::tests::builder_defaults_produce_valid_config ... ok\ntest config::tests::builder_rejects_audio_channel_count_zero ... ok\ntest config::tests::builder_rejects_fps_above_max ... ok\ntest config::tests::builder_rejects_audio_sample_rate_zero ... ok\ntest config::tests::builder_rejects_fps_zero ... ok\ntest config::tests::builder_rejects_hdr_without_displayp3 ... ok\ntest config::tests::builder_rejects_queue_depth_above_max ... ok\ntest config::tests::builder_rejects_queue_depth_zero ... ok\ntest config::tests::captures_audio_defaults_to_false ... ok\ntest config::tests::default_config_validates ... ok\ntest config::tests::color_space_names_present ... ok\ntest config::tests::failure_reason_strings_non_empty ... ok\ntest config::tests::mac_screen_share_audio_frame_constructs_valid ... ok\ntest config::tests::mac_screen_share_audio_frame_rejects_invalid_sample_rate ... ok\ntest config::tests::mac_screen_share_audio_frame_rejects_too_many_channels ... ok\ntest config::tests::mac_screen_share_audio_frame_with_bytes_rejects_bad_sample_rate ... ok\ntest config::tests::mac_screen_share_audio_frame_with_bytes_round_trip ... ok\ntest config::tests::minimum_frame_interval_120_fps_under_8_3ms ... ok\ntest config::tests::minimum_frame_interval_30_fps_factor_applied ... ok\ntest config::tests::minimum_frame_interval_60_fps_is_15_ms ... ok\ntest config::tests::pixel_format_fourcc_matches_obs_constants ... ok\ntest iosurface_pair::tests::new_pair_is_empty ... ok\ntest iosurface_pair::tests::take_current_on_empty_returns_none ... ok\ntest napi_surface_macos::audio_extract_tests::ablstorage_layout_matches_apple_abl ... ok\ntest napi_surface_macos::audio_extract_tests::ablstorage_size_is_large_enough_for_audio_buffer_list ... ok\ntest napi_surface_macos::audio_extract_tests::extract_audio_bytes_rejects_metadata_sample_buffer_gracefully ... ok\ntest napi_surface_macos::dispatch_queue_tests::audio_frame_payload_into_input_carries_slot_and_metadata ... ok\ntest napi_surface_macos::dispatch_queue_tests::build_capture_config_carries_audio_settings ... ok\ntest napi_surface_macos::dispatch_queue_tests::build_capture_config_preserves_frame_interval_when_audio_enabled ... ok\ntest napi_surface_macos::dispatch_queue_tests::classify_pcm_flags_detects_f32_interleaved_as_f32_planar ... ok\ntest napi_surface_macos::dispatch_queue_tests::classify_pcm_flags_detects_f32_planar ... ok\ntest napi_surface_macos::dispatch_queue_tests::classify_pcm_flags_detects_i16_interleaved ... ok\ntest napi_surface_macos::dispatch_queue_tests::classify_pcm_flags_rejects_unknown ... ok\ntest napi_surface_macos::dispatch_queue_tests::sample_queue_construction_does_not_trap_libdispatch ... ok\ntest napi_surface_macos::external_buffer_tests::allocator_counter_self_test_reports_nonzero_when_allocating ... ok\ntest napi_surface_macos::external_buffer_tests::audio_buffer_external_pointer_round_trip ... ok\ntest audio_pool::tests::multi_thread_acquire_release_stress_8_threads_1000_ops_no_deadlock ... ok\ntest napi_surface_macos::external_buffer_tests::external_buffer_finalize_runs_exactly_once_per_frame ... ok\ntest napi_surface_macos::external_buffer_tests::buffer_external_drop_fn_runs_on_pool_thread_or_napi_thread ... ok\ntest napi_surface_macos::external_buffer_tests::multi_frame_external_buffer_lifecycle ... ok\ntest napi_surface_macos::external_buffer_tests::pool_exhaustion_with_external_buffers_holds_diagnostic ... ok\ntest os_version::tests::classify_macos_11_is_unsupported ... ok\ntest os_version::tests::classify_macos_12_3_is_supported ... ok\ntest os_version::tests::classify_unknown_version_is_unsupported ... ok\ntest os_version::tests::format_version_trims_zero_patch ... ok\ntest os_version::tests::meets_floor_exact_match ... ok\ntest os_version::tests::meets_floor_higher_major ... ok\ntest os_version::tests::rejects_below_floor ... ok\ntest napi_surface_macos::external_buffer_tests::zero_allocation_in_steady_state_acquire_write_external_release ... ok\ntest napi_surface_macos::dispatch_queue_tests::parallel_sample_queue_construction_is_safe ... ok\ntest napi_surface_macos::dispatch_queue_tests::sample_queue_dispatches_blocks_without_crashing ... ok\ntest iosurface_pair::macos_tests::push_increments_use_count_and_take_current_does_not_release ... ok\ntest iosurface_pair::macos_tests::push_rotates_and_drop_releases_both_slots ... ok\ntest iosurface_pair::macos_tests::clear_releases_both_slots ... ok\ntest iosurface_pair::macos_tests::third_push_evicts_oldest_and_releases_it ... ok\n\ntest result: ok. 78 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n▶ mac-screen-capture loader wrapper\n ✔ forwards source id, kind, and dimensions to native binding (1.445ms)\n ✔ defaults sourceKind to screen and frameRate to 30 (0.117166ms)\n ✔ forwards display and window sources from native binding without rewriting ids (0.12875ms)\n ✔ reports ScreenCaptureKit support and permission from native binding (0.612667ms)\n ✔ installs a native frame sink handle once before start (0.174542ms)\n ✔ fails before native start when a native frame sink is required but missing (0.416709ms)\n ✔ emits closed once when native lifecycle closes and stop is called later (0.153417ms)\n ✔ lifecycle error emits Error event (0.120416ms)\n✔ mac-screen-capture loader wrapper (3.986375ms)\nℹ tests 8\nℹ suites 1\nℹ pass 8\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 371.859541\n",
- "stderrTail": " Compiling fluxer_gpu_rebuild v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/gpu-rebuild)\n Compiling fluxer_screen_frame_bus v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/screen-frame-bus)\n Compiling fluxer_mac_screen_capture v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-screen-capture)\n Finished `test` profile [unoptimized + debuginfo] target(s) in 2.23s\n Running unittests src/lib.rs (target/debug/deps/fluxer_mac_screen_capture-7d8f5a432df33d79)\n Doc-tests fluxer_mac_screen_capture\n"
- },
- {
- "name": "mac-app-audio-build",
- "command": "pnpm --dir native/mac-app-audio build",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:09:59.295Z",
- "endedAt": "2026-06-09T04:10:03.149Z",
- "durationMs": 3854,
- "stdoutTail": "\n> @fluxer/mac-app-audio@0.0.0 build /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio\n+ /Users/hampus/.rustup/toolchains/1.93.0-aarch64-apple-darwin/bin/cargo build --release --target aarch64-apple-darwin --manifest-path Cargo.toml\n+ codesign --force --sign - /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio/mac-app-audio.darwin-arm64.node\n",
- "stderrTail": " Finished `release` profile [optimized] target(s) in 0.27s\n/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio/mac-app-audio.darwin-arm64.node: replacing existing signature\n"
- },
- {
- "name": "mac-app-audio-rust-tests",
- "command": "pnpm --dir native/mac-app-audio test:cargo",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:10:03.149Z",
- "endedAt": "2026-06-09T04:10:05.465Z",
- "durationMs": 2316,
- "stdoutTail": "\n> @fluxer/mac-app-audio@0.0.0 test:cargo /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio\n> cargo test --manifest-path Cargo.toml\n\n\nrunning 49 tests\ntest audio_converter::tests::build_input_interleaved ... ok\ntest audio_converter::tests::build_output_mono_44_1k ... ok\ntest audio_converter::tests::build_input_non_interleaved ... ok\ntest audio_converter::tests::build_output_stereo_48k ... ok\ntest audio_converter::tests::converted_frame_count_exact ... ok\ntest audio_converter::tests::handle_float64_input ... ok\ntest audio_converter::tests::duplicate_mono_to_stereo ... ok\ntest audio_converter::tests::input_frame_count_interleaved_and_planar ... ok\ntest audio_converter::tests::interleave_planar_stereo ... ok\ntest audio_converter::tests::linear_resample_to_target_rate ... ok\ntest audio_converter::tests::lpcm_fourcc ... ok\ntest audio_converter::tests::normalize_signed_int16 ... ok\ntest audio_converter::tests::output_frame_capacity_rounds_up ... ok\ntest foundation::tests::nsstring_to_string_handles_none ... ok\ntest foundation::tests::mutable_array_initial_count_is_zero ... ok\ntest foundation::tests::mutable_dictionary_initial_count_is_zero ... ok\ntest os_version::tests::classify_macos_10_15_is_unsupported_and_mentions_min_version ... ok\ntest foundation::tests::nsstring_round_trip ... ok\ntest os_version::tests::classify_macos_12_3_is_sck_only ... ok\ntest os_version::tests::classify_macos_14_2_has_both_backends ... ok\ntest os_version::tests::classify_macos_15_is_supported ... ok\ntest os_version::tests::classify_unknown_version_is_unsupported ... ok\ntest os_version::tests::coreaudio_floor_14_2 ... ok\ntest os_version::tests::format_version_trims_zero_patch ... ok\ntest os_version::tests::meets_floor_exact_match ... ok\ntest os_version::tests::meets_floor_higher_major ... ok\ntest os_version::tests::meets_floor_higher_minor ... ok\ntest os_version::tests::rejects_below_floor_major ... ok\ntest os_version::tests::rejects_below_floor_minor ... ok\ntest os_version::tests::rejects_macos_10_15_for_sck ... ok\ntest process_tree::tests::collect_related_returns_tree ... ok\ntest process_tree::tests::same_launch_tree_excludes_unrelated ... ok\ntest process_tree::tests::same_launch_tree_includes_direct_child ... ok\ntest process_tree::tests::same_launch_tree_includes_pgrp_peer ... ok\ntest related_app::tests::helper_bundle_strips_suffix ... ok\ntest related_app::tests::helper_name_strips_helper_suffix ... ok\ntest related_app::tests::related_by_dot_prefix ... ok\ntest related_app::tests::related_via_bundle_helper_base ... ok\ntest related_app::tests::related_via_name_helper_base ... ok\ntest related_app::tests::unrelated_returns_false ... ok\ntest sck::tests::cgrect_intersection_handles_negative_and_disjoint ... ok\ntest source_state::tests::double_start_rejected ... ok\ntest source_state::tests::happy_path ... ok\ntest source_state::tests::cancel_idle_short_circuits ... ok\ntest source_state::tests::is_allowed_exhaustive ... ok\ntest source_state::tests::mark_fatal_forces_stopped ... ok\ntest source_state::tests::mark_fatal_idempotent ... ok\ntest source_state::tests::start_while_stopping_rejected ... ok\ntest source_state::tests::stop_before_start_rejected ... ok\n\ntest result: ok. 49 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n",
- "stderrTail": " Compiling fluxer_mac_app_audio v0.0.0 (/Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio)\n Finished `test` profile [unoptimized + debuginfo] target(s) in 1.54s\n Running unittests src/lib.rs (target/debug/deps/fluxer_mac_app_audio-b86bec7aea37ec64)\n Doc-tests fluxer_mac_app_audio\n"
- },
- {
- "name": "mac-app-audio-js-tests",
- "command": "'/Users/hampus/Development/fluxer/node_modules/.pnpm/node_modules/.bin/vitest' run",
- "category": "platform-native",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-09T04:10:05.465Z",
- "endedAt": "2026-06-09T04:10:06.715Z",
- "durationMs": 1250,
- "stdoutTail": "\n RUN v4.0.18 /Users/hampus/Development/fluxer/fluxer_desktop/native/mac-app-audio\n\n ✓ index.test.mjs (6 tests) 2ms\n\n Test Files 1 passed (1)\n Tests 6 passed (6)\n Start at 06:10:06\n Duration 489ms (transform 29ms, setup 0ms, import 298ms, tests 2ms, environment 0ms)\n\n",
- "stderrTail": ""
- }
- ]
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-09T0413-codex-fedora-livekit-smoke.json b/fluxer_desktop/native-media-reports/2026-06-09T0413-codex-fedora-livekit-smoke.json
deleted file mode 100644
index 5a4de10b0..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-09T0413-codex-fedora-livekit-smoke.json
+++ /dev/null
@@ -1,334 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-09T04:15:05.489Z",
- "endedAt": "2026-06-09T04:15:36.366Z",
- "platform": "linux",
- "arch": "arm64",
- "config": {
- "url": "ws://10.211.55.2:7880",
- "serverApiUrl": "http://10.211.55.2:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-283674-883784d5-5c9a-4466-84b5-dade644ebf82",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-283674",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-283674",
- "subscriberIdentity": "fluxer-native-subscriber-283674",
- "required": true,
- "strict": false,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 0,
- "width": 320,
- "height": 180,
- "expectedWidth": 320,
- "expectedHeight": 180,
- "fps": 15,
- "minFpsRatio": 0,
- "maxFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": false,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": false,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/media/psf/fluxer-dev/fluxer_desktop/native-media-reports/2026-06-09T0413-codex-fedora-livekit-smoke.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 320x180",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 1",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 3",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "Error: timed out after 30000ms waiting for: publisher local screenshare publication, subscriber remote screenshare subscription, publisher outbound screenshare stats, publisher outbound screenshare codec video/VP8\n at waitForHarnessSuccess (file:///media/psf/fluxer-dev/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1232:8)\n at async runHarness (file:///media/psf/fluxer-dev/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1831:18)\n at async main (file:///media/psf/fluxer-dev/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1931:18)\n at async file:///media/psf/fluxer-dev/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1964:19",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing libcuda.so.1, libnvidia-encode.so.1"
- },
- "metrics": {
- "inboundAudioFrames": 2994,
- "inboundVideoFrames": 300,
- "strictAudioFrames": 297,
- "strictVideoFrames": 300,
- "videoCallbacks": 300,
- "videoBytes": 25920000,
- "receivedFps": 10,
- "requiredFps": null,
- "maxVideoFrameGapMs": 120,
- "maxAudioFrameGapMs": 106,
- "maxVideoFrameGapOverallMs": 120,
- "maxAudioFrameGapOverallMs": 106,
- "avDriftMs": 4,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "320x180": 300
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780978506249,
- "stoppedAtMs": null,
- "framesPushed": 0,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 0,
- "lastPushAtMs": null,
- "elapsedMs": 30121,
- "producedFps": 0
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": {
- "participantSid": "PA_XodNLgkfL4bV",
- "trackSid": "TR_VSVvE7VrQKNqwD",
- "width": 320,
- "height": 180,
- "timestampUs": 124248690000
- },
- "publisherStats": {
- "rttMs": 5,
- "outbound": [
- {
- "trackSid": "TR_AM3ooPAYg5Q2M6",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 0,
- "audioLevel": 0.305,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSVvE7VrQKNqwD",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 2.6,
- "packetsLost": 0,
- "fps": 9,
- "width": 320,
- "height": 180,
- "sourceWidth": 320,
- "sourceHeight": 180,
- "targetBitrateKbps": 400,
- "configuredFps": 15,
- "targetFps": 15,
- "effectiveFps": 0,
- "framesProduced": 0,
- "framesAccepted": 0,
- "framesDropped": 0,
- "framesCoalesced": 0,
- "framesCaptured": 0,
- "captureFailures": 0,
- "maxQueueAgeMs": 0,
- "maxPushLatencyMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable",
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 8,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoPacingTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "source",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 27,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 5,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_XodNLgkfL4bV",
- "trackSid": "TR_AM3ooPAYg5Q2M6",
- "kind": "audio",
- "bitrateKbps": 99.1,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_XodNLgkfL4bV",
- "trackSid": "TR_VSVvE7VrQKNqwD",
- "kind": "video",
- "bitrateKbps": 2.6,
- "packetsLost": 0,
- "jitterMs": 1,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoQueueCapacity": 0,
- "outgoingVideoMaxQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoPacingTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingVideoPacingMode": "idle",
- "outgoingVideoBusActive": false,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/2026-06-14T18-09-25-591Z/summary.json b/fluxer_desktop/native-media-reports/2026-06-14T18-09-25-591Z/summary.json
deleted file mode 100644
index 036ddd02c..000000000
--- a/fluxer_desktop/native-media-reports/2026-06-14T18-09-25-591Z/summary.json
+++ /dev/null
@@ -1,143 +0,0 @@
-{
- "status": "fail",
- "mode": "smoke",
- "strict": false,
- "platform": "linux",
- "arch": "arm64",
- "hostname": "0a84a8e7079b",
- "startedAt": "2026-06-14T18:09:25.592Z",
- "endedAt": "2026-06-14T18:11:18.780Z",
- "reportDir": "/workspaces/fluxer/fluxer_desktop/native-media-reports/2026-06-14T18-09-25-591Z",
- "gates": [
- {
- "name": "mode-valid",
- "status": "pass",
- "mode": "smoke"
- },
- {
- "name": "documentation-current",
- "status": "pass",
- "missing": []
- },
- {
- "name": "strict-prerequisites",
- "status": "skip",
- "reason": "smoke mode"
- },
- {
- "name": "strict-command-plan",
- "status": "skip",
- "reason": "smoke mode"
- }
- ],
- "plannedCommands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "cwd": "."
- },
- {
- "name": "webrtc-sender-livekit-harness",
- "command": "pnpm --dir native/webrtc-sender test:livekit",
- "category": "livekit",
- "cwd": "."
- },
- {
- "name": "linux-screen-capture-build",
- "command": "pnpm --dir native/linux-screen-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-screen-capture-tests",
- "command": "pnpm --dir native/linux-screen-capture test",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-audio-capture-build",
- "command": "pnpm --dir native/linux-audio-capture build",
- "category": "platform-native",
- "cwd": "."
- },
- {
- "name": "linux-audio-capture-tests",
- "command": "pnpm --dir native/linux-audio-capture test",
- "category": "platform-native",
- "cwd": "."
- }
- ],
- "commands": [
- {
- "name": "main-process-native-media-unit-tests",
- "command": "node --test src/main/NativeVoiceEngine.test.mjs src/main/NativeScreenCapture.test.mjs",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-14T18:09:25.593Z",
- "endedAt": "2026-06-14T18:09:26.814Z",
- "durationMs": 1221,
- "stdoutTail": "▶ NativeScreenCapture source identity and capability reporting\n ✔ normalizes display and window sources without changing source ids (1.883928ms)\n ✔ starts display and window captures with exact source id and kind and reports diagnostics (1.130214ms)\n ✔ fails fast when native frame sink is required but unavailable (0.578253ms)\n ✔ passes caller-provided capture id and native sink handle to the platform wrapper (0.568254ms)\n ✔ reports macOS and Linux display/window capture capabilities from platform backends (0.846088ms)\n ✔ reports Windows native game capture disabled before loading the addon (0.545086ms)\n ✔ loads Windows native game capture only for the game capture build variant (0.948922ms)\n✔ NativeScreenCapture source identity and capability reporting (7.057249ms)\n▶ NativeVoiceEngine v2 bridge contract fixtures\n ✔ registers and removes every v2 IPC channel from the bridge contract fixture (1.949095ms)\n✔ NativeVoiceEngine v2 bridge contract fixtures (2.38543ms)\n▶ NativeVoiceEngine bridge version pair assertion\n ✔ asserts the host bridge version against the native addon at load time (0.859213ms)\n ✔ disables the native voice engine when the addon reports a mismatched bridge version (0.842422ms)\n ✔ disables the native voice engine when the addon lacks bridge version exports (0.395753ms)\n ✔ disables the native voice engine when the addon rejects the host bridge version (0.459586ms)\n✔ NativeVoiceEngine bridge version pair assertion (2.669932ms)\n▶ NativeVoiceEngine v2 IPC request fixtures\n ✔ replays fixture: valid connect reaches the native engine (0.856421ms)\n ✔ replays fixture: invalid connect args throw (0.387877ms)\n ✔ replays fixture: invalid mic enabled args return typed operation failure (0.984381ms)\n ✔ replays fixture: valid microphone publish returns typed success (0.584336ms)\n ✔ replays fixture: invalid microphone publish returns typed operation failure (0.438002ms)\n ✔ replays fixture: valid zero-copy screen publish reaches native engine (0.566461ms)\n ✔ replays fixture: explicit non-zero-copy screen publish is rejected (0.409836ms)\n ✔ replays fixture: hardware screen encoding without zero-copy is rejected (0.520878ms)\n ✔ replays fixture: valid native screen audio publish reaches native engine (0.494211ms)\n ✔ replays fixture: invalid screen audio route throws (0.494961ms)\n ✔ replays fixture: valid camera publish reaches native engine (0.389836ms)\n ✔ replays fixture: valid native camera sink publish reaches native engine (0.490294ms)\n ✔ replays fixture: valid processed camera publish reaches native engine (1.25884ms)\n ✔ replays fixture: valid processed camera frame reaches native engine (0.41771ms)\n ✔ replays fixture: invalid processed camera frame throws (0.359294ms)\n ✔ replays fixture: invalid camera publish throws (0.341377ms)\n ✔ replays fixture: connected stats return normalized empty stats (0.354044ms)\n ✔ replays fixture: valid participant volume reaches native engine (0.355585ms)\n ✔ replays fixture: invalid participant volume throws (0.334544ms)\n ✔ replays fixture: valid remote subscription reaches native engine (0.425128ms)\n ✔ replays fixture: invalid remote subscription quality throws (0.353668ms)\n ✔ replays fixture: valid data publish reaches native engine (0.394711ms)\n ✔ replays fixture: invalid data payload throws (0.351669ms)\n✔ NativeVoiceEngine v2 IPC request fixtures (11.876651ms)\n▶ NativeVoiceEngine connection lifecycle\n ✔ constructs the singleton and prewarms the native voice backend once at registration (0.389294ms)\n ✔ connect uses the prewarmed singleton instead of constructing an engine per call (0.332418ms)\n ✔ connect waits for a pending prewarm before dialing (9.277679ms)\n ✔ prewarm retries transient addon failures before succeeding (505.813953ms)\n ✔ set-audio-output-device retries transient negative device-count failures (4.178899ms)\n ✔ set-audio-output-device does not retry non-transient failures (2.9481ms)\n ✔ reuses the singleton across disconnect and reconnect cycles (2.513848ms)\n ✔ a second connect awaits the disconnect of the previous session before dialing (2.102095ms)\n ✔ a connect superseded before dialing rejects while latest replacement dials (3.610687ms)\n ✔ clears the native video-frame callback when a session is torn down (1.179257ms)\n ✔ tears down the active session when the owner renderer process exits (1.542634ms)\n ✔ tears down the active session on owner main-frame reload navigation (1.679135ms)\n ✔ keeps the active session for same-document and subframe navigation (1.513508ms)\n ✔ falls back to a no-op video-frame callback for engines without a clear export (0.897714ms)\n ✔ does not forward native events after disconnecting a pending connect (1.364383ms)\n ✔ starts replacement connect before stale native connect completion settles (1.805552ms)\n✔ NativeVoiceEngine connection lifecycle (542.09012ms)\n▶ NativeVoiceEngine screen frame routing\n ✔ publishes screen share with source pacing and exposes a native frame sink handle (1.161882ms)\n ✔ forwards device screen share publish options to the native engine (0.958214ms)\n ✔ keeps screen-share audio published when screen video is unpublished (1.080964ms)\n ✔ pushes screen-share float audio using the typed-array view length (0.929422ms)\n ✔ replaces screen captures without releasing screen-share audio or duplicating priority (0.832755ms)\n ✔ updates active screen-share encoding over IPC (0.951839ms)\n ✔ rejects screen-share encoding updates that change codec or hardware mode (0.791754ms)\n ✔ forwards watch and unwatch operations with source, enablement, and quality intact (0.782337ms)\n ✔ reports VideoToolbox hardware capability from the native addon (0.642129ms)\n ✔ reports native voice engine capabilities from the native addon (0.642879ms)\n ✔ maps native addon microphone not-connected errors to the typed operation code (1.749843ms)\n ✔ rejects device microphone operations while the audio device module is warming (5.035821ms)\n✔ NativeVoiceEngine screen frame routing (15.857342ms)\n▶ NativeVoiceEngine camera preview sessions\n ✔ starts a standalone preview engine when not connected and stops it on stop (0.98463ms)\n ✔ routes camera preview through the active session engine when connected (0.585586ms)\n ✔ stops a standalone preview on the singleton when a call connects (0.590337ms)\n ✔ routes a preview after a call ends through the same singleton engine (0.654712ms)\n ✔ stops a standalone preview when the owner renderer process exits (1.566134ms)\n ✔ stops a standalone preview on owner main-frame reload navigation (1.060881ms)\n ✔ routes camera capture updates through the active session engine (0.643712ms)\n ✔ rejects camera capture updates when not connected (0.563253ms)\n ✔ rejects invalid camera preview args (0.533378ms)\n ✔ drops video frames with a mismatched per-frame bridge version and logs once (0.644129ms)\n✔ NativeVoiceEngine camera preview sessions (8.004754ms)\n▶ NativeVoiceEngine camera background frame routing\n ✔ routes background frames and clears to the active session engine when connected (0.640379ms)\n ✔ routes background frames to the standalone preview engine (0.517586ms)\n ✔ returns false without a session and rejects invalid frames (0.555711ms)\n✔ NativeVoiceEngine camera background frame routing (1.789177ms)\n▶ NativeVoiceEngine readiness\n ✔ reports not ready with the load failure detail when the native module fails to load (0.56242ms)\n ✔ reports not ready when the addon does not expose a VoiceEngine constructor (1.861719ms)\n ✔ reports prewarm-pending readiness before the registration prewarm settles (0.598003ms)\n ✔ surfaces the prewarm failure detail as the not-ready reason and rejects the prewarm call (506.100539ms)\n ✔ reports ready once the singleton is constructed and prewarmed (3.705354ms)\n ✔ pushes a one-time engineReady event when readiness first becomes true (3.76148ms)\n ✔ does not push engineReady to destroyed web contents (4.784236ms)\n✔ NativeVoiceEngine readiness (521.834295ms)\nℹ tests 83\nℹ suites 9\nℹ pass 83\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 1197.319351\n",
- "stderrTail": ""
- },
- {
- "name": "desktop-typecheck",
- "command": "pnpm typecheck",
- "category": "shared",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-14T18:09:26.814Z",
- "endedAt": "2026-06-14T18:09:27.244Z",
- "durationMs": 430,
- "stdoutTail": "\n> fluxer_desktop@0.0.0 typecheck /workspaces/fluxer/fluxer_desktop\n> tsgo --noEmit\n\n",
- "stderrTail": ""
- },
- {
- "name": "webrtc-sender-build",
- "command": "pnpm --dir native/webrtc-sender build",
- "category": "native-sender",
- "status": "pass",
- "code": 0,
- "signal": null,
- "startedAt": "2026-06-14T18:09:27.244Z",
- "endedAt": "2026-06-14T18:10:34.871Z",
- "durationMs": 67627,
- "stdoutTail": "\n> @fluxer/webrtc-sender@0.0.0 build /workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon\n\n[buildRustNodeAddon] cwd=/workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n+ /home/vscode/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin/cargo build --release --target aarch64-unknown-linux-gnu --manifest-path Cargo.toml --features camera-native\n",
- "stderrTail": " Compiling pest v2.8.6\n Compiling kstring v2.0.2\n Compiling memo-map v0.3.3\n Compiling time-macros v0.2.27\n Compiling nom v8.0.0\n Compiling crossbeam-utils v0.8.21\n Compiling typeid v1.0.3\n Compiling itertools v0.14.0\n Compiling downcast-rs v2.0.2\n Compiling hashbrown v0.11.2\n Compiling tinyvec v1.11.0\n Compiling minijinja v2.20.0\n Compiling minimal-lexical v0.2.1\n Compiling erased-serde v0.4.10\n Compiling dyn-eq v0.1.3\n Compiling dyn-hash v1.0.0\n Compiling regex-automata v0.4.14\n Compiling itertools v0.10.5\n Compiling derive-new v0.7.0\n Compiling bit-vec v0.9.1\n Compiling pastey v0.2.3\n Compiling unicode-normalization v0.1.25\n Compiling nom v7.1.3\n Compiling derive-new v0.5.9\n Compiling downcast-rs v1.2.1\n Compiling bit-vec v0.6.3\n Compiling bit-set v0.10.0\n Compiling pest_meta v2.8.6\n Compiling crunchy v0.2.4\n Compiling anymap3 v1.0.1\n Compiling inventory v0.3.24\n Compiling rayon-core v1.13.0\n Compiling tiny-keccak v2.0.2\n Compiling bit-set v0.5.3\n Compiling serde_urlencoded v0.7.1\n Compiling rustls v0.23.40\n Compiling crossbeam-epoch v0.9.18\n Compiling xattr v1.6.1\n Compiling hashbrown v0.16.1\n Compiling num-bigint v0.4.6\n Compiling png v0.18.1\n Compiling getrandom v0.4.2\n Compiling rand_core v0.10.1\n Compiling time v0.3.47\n Compiling num-iter v0.1.45\n Compiling float-ord v0.3.2\n Compiling pest_generator v2.8.6\n Compiling tar v0.4.46\n Compiling crossbeam-deque v0.8.6\n Compiling reqwest v0.12.28\n Compiling num-complex v0.4.6\n Compiling string-interner v0.14.0\n Compiling pbjson v0.6.0\n Compiling string-interner v0.20.0\n Compiling const-random-macro v0.1.16\n Compiling chacha20 v0.10.0\n Compiling safetensors v0.7.0\n Compiling pbjson-types v0.6.0\n Compiling rustfft v6.4.1\n Compiling ndarray v0.17.2\n Compiling ndarray v0.15.6\n Compiling regex v1.12.3\n Compiling nom-language v0.1.0\n Compiling rayon v1.12.0\n Compiling image v0.25.10\n Compiling const-random v0.1.18\n Compiling pest_derive v2.8.6\n Compiling enum-ordinalize v3.1.15\n Compiling dlv-list v0.5.2\n Compiling scan_fmt v0.2.6\n Compiling rand v0.10.1\n Compiling nix v0.31.3\n Compiling prost-derive v0.11.9\n Compiling tower-http v0.6.11\n Compiling liquid-core v0.26.8\n Compiling webrtc-sys-build v0.3.18\n Compiling educe v0.4.23\n Compiling hashbrown v0.13.2\n Compiling rand_distr v0.6.0\n Compiling os_info v3.15.0\n Compiling glib v0.21.5\n Compiling half v2.7.1\n Compiling livekit-protocol v0.7.8\n Compiling memmap2 v0.5.10\n Compiling ppv-lite86 v0.2.21\n Compiling ordered-multimap v0.6.0\n Compiling memmap2 v0.9.10\n Compiling napi v3.9.1\n Compiling fluxer_screen_frame_bus v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/screen-frame-bus)\n Compiling fluxer_desktop_native v0.1.0 (/workspaces/fluxer/fluxer_desktop/native/rust)\n Compiling crossbeam-queue v0.3.12\n Compiling rand_chacha v0.3.1\n Compiling liquid-lib v0.26.8\n Compiling rand_chacha v0.9.0\n Compiling prost-derive v0.14.4\n Compiling realfft v3.5.0\n Compiling rust-ini v0.19.0\n Compiling rand v0.8.6\n Compiling rand v0.9.4\n Compiling tokio-rustls v0.26.4\n Compiling tract-linalg v0.23.1 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender/vendor/tract-linalg-0.23.1)\n Compiling nokhwa-core v0.1.9\n Compiling prost v0.11.9\n Compiling rubato v0.14.1\n Compiling webrtc-sys v0.3.33 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys)\n Compiling hyper-rustls v0.27.9\n Compiling num-bigint-dig v0.8.6\n Compiling rand_distr v0.4.3\n Compiling tungstenite v0.29.0\n Compiling nokhwa-bindings-macos v0.2.4\n Compiling nokhwa-bindings-linux v0.1.4\n Compiling nokhwa-bindings-windows v0.4.6\n Compiling liquid v0.26.8\n Compiling tract-data v0.19.16\n Compiling rsa v0.9.10\n Compiling tract-linalg v0.19.16 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender/vendor/tract-linalg-0.19.16)\n Compiling tokio-tungstenite v0.29.0\n Compiling prost v0.14.4\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:66:19\n |\n66 | self.cc().static_flag(true).file(filename).try_compile(\"dummy\").is_ok()\n | ^^^^^^^^^^^\n |\n = note: `#[warn(deprecated)]` on by default\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:121:26\n |\n121 | .static_flag(true)\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:133:61\n |\n133 | cc::Build::new().files(files).flag(\"-mfma\").static_flag(true).compile(\"x86_64_fma\");\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:142:18\n |\n142 | .static_flag(true)\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:154:18\n |\n154 | .static_flag(true)\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:164:43\n |\n164 | cc::Build::new().files(files).static_flag(true).compile(\"arm64simd\");\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:174:42\n |\n174 | config.cc().files(files).static_flag(true).compile(\"arm64fp16\")\n | ^^^^^^^^^^^\n\n Compiling tract-data v0.23.1\n Compiling jsonwebtoken v10.4.0\nwarning: `tract-linalg` (build script) generated 7 warnings\n Compiling nokhwa v0.10.11\n Compiling livekit-datatrack v0.1.8\nwarning: tract-linalg@0.19.16: arm64/arm64fp16/dummy_fmla_no_pragma.S: Assembler messages:\nwarning: tract-linalg@0.19.16: arm64/arm64fp16/dummy_fmla_no_pragma.S:11: Error: selected processor does not support `fmla v16.8h,v0.8h,v8.h[0]'\n Compiling livekit-api v0.5.0\nwarning: unexpected `cfg` condition value: `armv7`\n --> vendor/tract-linalg-0.19.16/src/lib.rs:26:32\n |\n26 | #[cfg(any(target_arch = \"arm\", target_arch = \"armv7\"))]\n | ^^^^^^^^^^^^^^^^^^^^^\n |\n = note: expected values for `target_arch` are: `aarch64`, `amdgpu`, `arm`, `arm64ec`, `avr`, `bpf`, `csky`, `hexagon`, `loongarch32`, `loongarch64`, `m68k`, `mips`, `mips32r6`, `mips64`, `mips64r6`, `msp430`, `nvptx64`, `powerpc`, `powerpc64`, `riscv32`, `riscv64`, `s390x`, `sparc`, `sparc64`, `wasm32`, `wasm64`, `x86`, `x86_64`, and `xtensa`\n = note: see for more information about checking conditional configuration\n = note: `#[warn(unexpected_cfgs)]` on by default\n\nwarning: unexpected `cfg` condition name: `feature_cpu`\n --> vendor/tract-linalg-0.19.16/src/arm64.rs:40:10\n |\n40 | cfg!(feature_cpu = \"fp16\")\n | ^^^^^^^^^^^^^^^^^^^^\n |\n = help: expected names are: `docsrs`, `feature`, and `test` and 31 more\n = help: consider using a Cargo feature instead\n = help: or consider adding in `Cargo.toml` the `check-cfg` lint config for the lint:\n [lints.rust]\n unexpected_cfgs = { level = \"warn\", check-cfg = ['cfg(feature_cpu, values(\"fp16\"))'] }\n = help: or consider adding `println!(\"cargo::rustc-check-cfg=cfg(feature_cpu, values(\\\"fp16\\\"))\");` to the top of the `build.rs`\n = note: see for more information about checking conditional configuration\n\nwarning: unexpected `cfg` condition value: `armv7`\n --> vendor/tract-linalg-0.19.16/src/lib.rs:134:36\n |\n134 | #[cfg(any(target_arch = \"arm\", target_arch = \"armv7\"))]\n | ^^^^^^^^^^^^^^^^^^^^^\n |\n = note: expected values for `target_arch` are: `aarch64`, `amdgpu`, `arm`, `arm64ec`, `avr`, `bpf`, `csky`, `hexagon`, `loongarch32`, `loongarch64`, `m68k`, `mips`, `mips32r6`, `mips64`, `mips64r6`, `msp430`, `nvptx64`, `powerpc`, `powerpc64`, `riscv32`, `riscv64`, `s390x`, `sparc`, `sparc64`, `wasm32`, `wasm64`, `x86`, `x86_64`, and `xtensa`\n = note: see for more information about checking conditional configuration\n\nwarning: hiding a lifetime that's elided elsewhere is confusing\n --> vendor/tract-linalg-0.19.16/src/generic/rounding.rs:37:26\n |\n37 | pub fn as_fused_spec(&self) -> FusedSpec {\n | ^^^^^ ^^^^^^^^^ the same lifetime is hidden here\n | |\n | the lifetime is elided here\n |\n = help: the same lifetime is referred to in inconsistent ways, making the signature confusing\n = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default\nhelp: use `'_` for type paths\n |\n37 | pub fn as_fused_spec(&self) -> FusedSpec<'_> {\n | ++++\n\n Compiling tract-core v0.19.16\nwarning: `tract-linalg` (lib) generated 4 warnings (run `cargo fix --lib -p tract-linalg` to apply 1 suggestion)\nwarning: tract-linalg@0.23.1: arm64/arm64fp16/dummy_fmla_no_pragma.S: Assembler messages:\nwarning: tract-linalg@0.23.1: arm64/arm64fp16/dummy_fmla_no_pragma.S:11: Error: selected processor does not support `fmla v16.8h,v0.8h,v8.h[0]'\n Compiling tract-core v0.23.1\n Compiling tract-nnef v0.19.16\n Compiling tract-hir v0.19.16\nwarning: webrtc-sys@0.3.33: EGL headers not found; building without NVIDIA hardware accelerated video codec support\n Compiling libwebrtc v0.3.35 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender/vendor/libwebrtc)\nwarning: variable does not need to be mutable\n --> vendor/libwebrtc/src/native/desktop_capturer.rs:66:13\n |\n66 | let mut sys_handle = sys_dc::ffi::DesktopCapturerOptions {\n | ----^^^^^^^^^^\n | |\n | help: remove this `mut`\n |\n = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default\n\n Compiling tract-pulse-opl v0.19.16\n Compiling tract-onnx-opl v0.19.16\n Compiling tract-pulse v0.19.16\n Compiling tract-onnx v0.19.16\n Compiling livekit v0.7.43\nwarning: `libwebrtc` (lib) generated 1 warning (run `cargo fix --lib -p libwebrtc` to apply 1 suggestion)\n Compiling deep_filter v0.5.6 (https://github.com/Rikorose/DeepFilterNet?rev=978576aa8400552a4ce9730838c635aa30db5e61#978576aa)\n Compiling tract-nnef v0.23.1\n Compiling tract-hir v0.23.1\n Compiling tract-transformers v0.23.1\n Compiling tract-pulse-opl v0.23.1\n Compiling tract-pulse v0.23.1\n Compiling tract-extra v0.23.1\n Compiling tract-onnx-opl v0.23.1\n Compiling tract-onnx v0.23.1\n Compiling fluxer_webrtc_sender v0.0.0 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender)\nwarning: fields `num_frames` and `timestamp_us` are never read\n --> src/engine.rs:279:5\n |\n277 | struct ScreenAudioChunk {\n | ---------------- fields in this struct\n278 | samples: Vec,\n279 | num_frames: u32,\n | ^^^^^^^^^^\n...\n282 | timestamp_us: i64,\n | ^^^^^^^^^^^^\n |\n = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\n\nwarning: `fluxer_webrtc_sender` (lib) generated 1 warning\n Finished `release` profile [optimized] target(s) in 1m 01s\n"
- },
- {
- "name": "webrtc-sender-tests",
- "command": "pnpm --dir native/webrtc-sender test",
- "category": "native-sender",
- "status": "fail",
- "code": 1,
- "signal": null,
- "startedAt": "2026-06-14T18:10:34.871Z",
- "endedAt": "2026-06-14T18:11:18.779Z",
- "durationMs": 43908,
- "stdoutTail": "\n> @fluxer/webrtc-sender@0.0.0 test /workspaces/fluxer/fluxer_desktop/native/webrtc-sender\n> cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- test-webrtc-sender-rust && node --test index.test.mjs scripts/livekit-harness.test.mjs\n\n+ /home/vscode/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin/cargo test --features \"publisher,camera-native\"\n ELIFECYCLE Test failed. See above for more details.\n WARN Local package.json exists, but node_modules missing, did you mean to install?\n",
- "stderrTail": " Compiling cfg-if v1.0.4\n Compiling memchr v2.8.1\n Compiling bitflags v2.13.0\n Compiling bytes v1.11.1\n Compiling once_cell v1.21.4\n Compiling itoa v1.0.18\n Compiling regex-syntax v0.8.10\n Compiling pin-project-lite v0.2.17\n Compiling equivalent v1.0.2\n Compiling typenum v1.20.1\n Compiling log v0.4.30\n Compiling adler2 v2.0.1\n Compiling libm v0.2.16\n Compiling serde_core v1.0.228\n Compiling either v1.16.0\n Compiling linux-raw-sys v0.12.1\n Compiling same-file v1.0.6\n Compiling futures-io v0.3.32\n Compiling slab v0.4.12\n Compiling futures-task v0.3.32\n Compiling rawpointer v0.2.1\n Compiling zerocopy v0.8.50\n Compiling zeroize v1.8.2\n Compiling zerofrom v0.1.8\n Compiling ring v0.17.14\n Compiling anyhow v1.0.102\n Compiling byteorder v1.5.0\n Compiling simd-adler32 v0.3.9\n Compiling aho-corasick v1.1.4\n Compiling getrandom v0.2.17\n Compiling crc32fast v1.5.0\n Compiling matrixmultiply v0.3.10\n Compiling http v1.4.1\n Compiling strength_reduce v0.2.4\n Compiling maplit v1.0.2\n Compiling indexmap v2.14.0\n Compiling dyn-clone v1.0.20\n Compiling minimal-lexical v0.2.1\n Compiling pest v2.8.6\n Compiling tokio v1.52.3\n Compiling parking_lot_core v0.9.12\n Compiling walkdir v2.5.0\n Compiling num-traits v0.2.19\n Compiling zmij v1.0.21\n Compiling ppv-lite86 v0.2.21\n Compiling serde v1.0.228\n Compiling yoke v0.8.2\n Compiling rustix v1.1.4\n Compiling generic-array v0.14.9\n Compiling rand_core v0.6.4\n Compiling parking_lot v0.12.5\n Compiling serde_json v1.0.150\n Compiling num-integer v0.1.46\n Compiling half v2.7.1\n Compiling der v0.7.10\n Compiling futures-util v0.3.32\n Compiling regex-automata v0.4.14\n Compiling http-body v1.0.1\n Compiling time v0.3.47\n Compiling tracing-core v0.1.36\n Compiling filetime v0.2.29\n Compiling socket2 v0.6.4\n Compiling pest_meta v2.8.6\n Compiling mio v1.2.1\n Compiling itertools v0.13.0\n Compiling memo-map v0.3.3\n Compiling allocator-api2 v0.2.21\n Compiling miniz_oxide v0.8.9\n Compiling thiserror v2.0.18\n Compiling zerovec v0.11.6\n Compiling zerotrie v0.2.4\n Compiling primal-check v0.3.4\n Compiling transpose v0.2.3\n Compiling crypto-common v0.1.6\n Compiling block-buffer v0.10.4\n Compiling num-complex v0.4.6\n Compiling flate2 v1.1.9\n Compiling pest_generator v2.8.6\n Compiling xattr v1.6.1\n Compiling regex v1.12.3\n Compiling spki v0.7.3\n Compiling tracing v0.1.44\n Compiling hashbrown v0.16.1\n Compiling minijinja v2.20.0\n Compiling ahash v0.7.8\n Compiling nom v8.0.0\n Compiling itertools v0.14.0\n Compiling dyn-eq v0.1.3\n Compiling downcast-rs v2.0.2\n Compiling num-bigint v0.4.6\n Compiling dyn-hash v1.0.0\n Compiling crossbeam-utils v0.8.21\n Compiling tar v0.4.46\n Compiling typeid v1.0.3\n Compiling rand_chacha v0.3.1\n Compiling digest v0.10.7\n Compiling prost v0.12.6\n Compiling nom v7.1.3\n Compiling rustls-pki-types v1.14.1\n Compiling tinystr v0.8.3\n Compiling potential_utf v0.1.5\n Compiling scan_fmt v0.2.6\n Compiling hashbrown v0.11.2\n Compiling string-interner v0.20.0\n Compiling nom-language v0.1.0\n Compiling itertools v0.10.5\n Compiling rustfft v6.4.1\n Compiling pest_derive v2.8.6\n Compiling ndarray v0.17.2\n Compiling ndarray v0.15.6\n Compiling bit-vec v0.9.1\n Compiling pkcs8 v0.10.2\n Compiling hyper v1.10.1\n Compiling enum-ordinalize v3.1.15\n Compiling icu_locale_core v2.2.0\n Compiling icu_collections v2.2.0\n Compiling bit-set v0.10.0\n Compiling erased-serde v0.4.10\n Compiling getrandom v0.4.2\n Compiling string-interner v0.14.0\n Compiling prost-types v0.12.6\n Compiling http-body-util v0.1.3\n Compiling ff v0.13.1\n Compiling libloading v0.8.9\n Compiling rand v0.8.6\n Compiling hmac v0.12.1\n Compiling signature v2.2.0\n Compiling downcast-rs v1.2.1\n Compiling rustls v0.23.40\n Compiling anymap3 v1.0.1\n Compiling bit-vec v0.6.3\n Compiling inventory v0.3.24\n Compiling petgraph v0.6.5\n Compiling sec1 v0.7.3\n Compiling hkdf v0.12.4\n Compiling tract-data v0.23.1\n Compiling hyper-util v0.1.20\n Compiling rustix v0.38.44\n Compiling liquid-core v0.26.8\n Compiling crossbeam-epoch v0.9.18\n Compiling group v0.13.0\n Compiling getrandom v0.3.4\n Compiling tempfile v3.27.0\n Compiling tower v0.5.3\n Compiling crypto-bigint v0.5.5\n Compiling educe v0.4.23\n Compiling icu_provider v2.2.0\n Compiling tract-linalg v0.23.1 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender/vendor/tract-linalg-0.23.1)\n Compiling bit-set v0.5.3\n Compiling rustls-webpki v0.103.13\n Compiling pbjson-build v0.6.2\n Compiling clang-sys v1.8.1\n Compiling safetensors v0.7.0\n Compiling serde_urlencoded v0.7.1\n Compiling liquid-lib v0.26.8\n Compiling crossbeam-deque v0.8.6\n Compiling elliptic-curve v0.13.8\n Compiling prost-build v0.12.6\n Compiling which v4.4.2\n Compiling rand_core v0.9.5\n Compiling fdeflate v0.3.7\n Compiling quick-error v2.0.1\n Compiling icu_properties v2.2.0\n Compiling icu_normalizer v2.2.0\n Compiling zune-core v0.5.1\n Compiling color_quant v1.1.0\n Compiling pxfm v0.1.29\n Compiling weezl v0.1.12\n Compiling byteorder-lite v0.1.0\n Compiling rand_chacha v0.9.0\n Compiling liquid v0.26.8\n Compiling tract-data v0.19.16\n Compiling cexpr v0.6.0\n Compiling rayon-core v1.13.0\n Compiling mozjpeg-sys v2.2.3\n Compiling rfc6979 v0.4.0\n Compiling png v0.18.1\n Compiling sha2 v0.10.9\n Compiling zune-jpeg v0.5.15\n Compiling zip v0.6.6\n Compiling tokio-util v0.7.18\n Compiling rand_core v0.10.1\n Compiling chrono v0.4.44\n Compiling pbjson v0.6.0\n Compiling idna_adapter v1.2.2\n Compiling image-webp v0.2.4\n Compiling moxcms v0.8.1\n Compiling bindgen v0.65.1\n Compiling gif v0.14.2\n Compiling tokio-rustls v0.26.4\n Compiling tract-linalg v0.19.16 (/workspaces/fluxer/fluxer_desktop/native/webrtc-sender/vendor/tract-linalg-0.19.16)\n Compiling pbjson-types v0.6.0\n Compiling rand v0.9.4\n Compiling mozjpeg v0.10.13\n Compiling rayon v1.12.0\n Compiling const-random-macro v0.1.16\n Compiling ecdsa v0.16.9\n Compiling cxx-build v1.0.194\n Compiling primeorder v0.13.6\n Compiling idna v1.1.0\n Compiling rustls-native-certs v0.8.3\n Compiling futures-executor v0.3.32\n Compiling tokio-stream v0.1.18\n Compiling num-iter v0.1.45\n Compiling hyper-rustls v0.27.9\n Compiling toml_edit v0.25.12+spec-1.1.0\n Compiling hybrid-array v0.4.12\n Compiling float-ord v0.3.2\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:66:19\n |\n66 | self.cc().static_flag(true).file(filename).try_compile(\"dummy\").is_ok()\n | ^^^^^^^^^^^\n |\n = note: `#[warn(deprecated)]` on by default\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:121:26\n |\n121 | .static_flag(true)\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:133:61\n |\n133 | cc::Build::new().files(files).flag(\"-mfma\").static_flag(true).compile(\"x86_64_fma\");\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:142:18\n |\n142 | .static_flag(true)\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:154:18\n |\n154 | .static_flag(true)\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:164:43\n |\n164 | cc::Build::new().files(files).static_flag(true).compile(\"arm64simd\");\n | ^^^^^^^^^^^\n\nwarning: use of deprecated method `cc::Build::static_flag`: cc only creates static libraries, setting this does nothing\n --> vendor/tract-linalg-0.19.16/build.rs:174:42\n |\n174 | config.cc().files(files).static_flag(true).compile(\"arm64fp16\")\n | ^^^^^^^^^^^\n\n Compiling image v0.25.10\n Compiling chacha20 v0.10.0\n Compiling curve25519-dalek v4.1.3\nwarning: `tract-linalg` (build script) generated 7 warnings\n Compiling link-cplusplus v1.0.12\n Compiling ed25519 v2.2.3\n Compiling pkcs1 v0.7.5\n Compiling sha1 v0.10.6\n Compiling cxxbridge-macro v1.0.194\n Compiling p256 v0.13.2\nerror: extern location for tokio_rustls does not exist: /workspaces/fluxer/fluxer_desktop/native/webrtc-sender/target/debug/deps/libtokio_rustls-d06ee36b16f159df.rmeta\n --> /home/vscode/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/hyper-rustls-0.27.9/src/stream.rs:11:5\n |\n11 | use tokio_rustls::client::TlsStream;\n | ^^^^^^^^^^^^\n\nerror: could not compile `hyper-rustls` (lib) due to 1 previous error\nwarning: build failed, waiting for other jobs to finish...\nerror[E0786]: found invalid metadata files for crate `moxcms`\n --> /home/vscode/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/image-0.25.10/src/metadata/cicp.rs:95:13\n |\n95 | use moxcms::CicpColorPrimaries as M;\n | ^^^^^^\n |\n = note: failed to open rmeta metadata: '/workspaces/fluxer/fluxer_desktop/native/webrtc-sender/target/debug/deps/libmoxcms-7c20aa5b2d449552.rmeta'\n\nFor more information about this error, try `rustc --explain E0786`.\nerror: could not compile `image` (lib) due to 1 previous error\nerror: extern location for chrono does not exist: /workspaces/fluxer/fluxer_desktop/native/webrtc-sender/target/debug/deps/libchrono-2cf7dcc5247f6ef8.rmeta\n --> /home/vscode/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/pbjson-types-0.6.0/src/timestamp.rs:2:5\n |\n2 | use chrono::{DateTime, NaiveDateTime, TimeZone, Utc};\n | ^^^^^^\n\nerror: could not compile `pbjson-types` (lib) due to 1 previous error\nwarning: tract-linalg@0.19.16: arm64/arm64fp16/dummy_fmla_no_pragma.S: Assembler messages:\nwarning: tract-linalg@0.19.16: arm64/arm64fp16/dummy_fmla_no_pragma.S:11: Error: selected processor does not support `fmla v16.8h,v0.8h,v8.h[0]'\nwarning: tract-linalg@0.23.1: arm64/arm64fp16/dummy_fmla_no_pragma.S: Assembler messages:\nwarning: tract-linalg@0.23.1: arm64/arm64fp16/dummy_fmla_no_pragma.S:11: Error: selected processor does not support `fmla v16.8h,v0.8h,v8.h[0]'\nCommand failed with exit code 101: /home/vscode/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin/cargo test --features \"publisher,camera-native\"\n"
- }
- ]
-}
diff --git a/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-h264-20260605T204959Z.json b/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-h264-20260605T204959Z.json
deleted file mode 100644
index 1dffc0d69..000000000
--- a/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-h264-20260605T204959Z.json
+++ /dev/null
@@ -1,287 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T20:50:00.568Z",
- "endedAt": "2026-06-05T20:50:17.383Z",
- "platform": "linux",
- "arch": "x64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-92677-28ffd7a4-19ee-49cf-87d1-e31ab80864f4",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-92677",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-92677",
- "subscriberIdentity": "fluxer-native-subscriber-92677",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 15000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.9,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "h264",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H264",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/home/hampus/Development/fluxer/fluxer_desktop/native-media-reports/cachyos-nvidia-livekit-720p-h264-20260605T204959Z.json",
- "verbose": false,
- "scenarioName": "codec-h264",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "no_supported_devices",
- "detail": "missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 465,
- "strictAudioFrames": 0,
- "strictVideoFrames": 435,
- "videoCallbacks": 463,
- "videoBytes": 640051200,
- "receivedFps": 28.99,
- "requiredFps": 27,
- "maxVideoFrameGapMs": 68,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 68,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "1280x720": 435
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780692601312,
- "stoppedAtMs": null,
- "framesPushed": 483,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 37,
- "lastPushAtMs": 1780692617378,
- "elapsedMs": 16227,
- "producedFps": 29.77
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780692602380,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-92677",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VStBVT57Q9oKAa",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-92677",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_89hNCmrznA6A",
- "trackSid": "TR_VStBVT57Q9oKAa",
- "width": 1280,
- "height": 720,
- "timestampUs": 68521962000
- },
- "publisherStats": {
- "rttMs": 4,
- "outbound": [
- {
- "trackSid": "TR_VStBVT57Q9oKAa",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 386.9,
- "packetsLost": 0,
- "fps": 30,
- "codec": "video/H264"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 476,
- "outgoingVideoFramesAccepted": 476,
- "outgoingVideoFramesDropped": 16,
- "outgoingVideoFramesCoalesced": 16,
- "outgoingVideoFramesCaptured": 460,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.97,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 5,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_89hNCmrznA6A",
- "trackSid": "TR_VStBVT57Q9oKAa",
- "kind": "video",
- "bitrateKbps": 386.4,
- "packetsLost": 0,
- "jitterMs": 2,
- "codec": "video/H264"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-hevc-20260605T205028Z.json b/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-hevc-20260605T205028Z.json
deleted file mode 100644
index 0dc00fdaf..000000000
--- a/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-hevc-20260605T205028Z.json
+++ /dev/null
@@ -1,287 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:50:29.534Z",
- "endedAt": "2026-06-05T20:52:00.423Z",
- "platform": "linux",
- "arch": "x64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-92838-08153292-483f-4acb-b470-af9847d7597c",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-92838",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-92838",
- "subscriberIdentity": "fluxer-native-subscriber-92838",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 15000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.9,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["hevc"],
- "expectedScreenCodecs": ["hevc"],
- "codec": "hevc",
- "expectedScreenCodec": "video/H265",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "hevc",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H265",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/home/hampus/Development/fluxer/fluxer_desktop/native-media-reports/cachyos-nvidia-livekit-720p-hevc-20260605T205028Z.json",
- "verbose": false,
- "scenarioName": "codec-hevc",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H265",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/H265",
- "pass": false
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: timed out after 90000ms waiting for: publisher outbound screenshare codec video/H265, subscriber inbound video codec video/H265, server sees publisher screenshare publication\n at waitForHarnessSuccess (file:///home/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1329:8)\n at async runHarness (file:///home/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1926:18)\n at async main (file:///home/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:2026:18)\n at async file:///home/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:2059:19",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "no_supported_devices",
- "detail": "missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 2611,
- "strictAudioFrames": 0,
- "strictVideoFrames": 2610,
- "videoCallbacks": 2610,
- "videoBytes": 3608064000,
- "receivedFps": 29.02,
- "requiredFps": 27,
- "maxVideoFrameGapMs": 81,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 81,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "1280x720": 2610
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780692630259,
- "stoppedAtMs": null,
- "framesPushed": 2705,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 37,
- "lastPushAtMs": 1780692720392,
- "elapsedMs": 90321,
- "producedFps": 29.95
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780692720171,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-92838",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-92838",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VSr7CavPmttCck",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_eQVNaBPkxUPX",
- "trackSid": "TR_VSr7CavPmttCck",
- "width": 1280,
- "height": 720,
- "timestampUs": 68625011000
- },
- "publisherStats": {
- "rttMs": 6,
- "outbound": [
- {
- "trackSid": "TR_VSr7CavPmttCck",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 44.7,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 2697,
- "outgoingVideoFramesAccepted": 2697,
- "outgoingVideoFramesDropped": 91,
- "outgoingVideoFramesCoalesced": 91,
- "outgoingVideoFramesCaptured": 2605,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.98,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 6,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_eQVNaBPkxUPX",
- "trackSid": "TR_VSr7CavPmttCck",
- "kind": "video",
- "bitrateKbps": 43.1,
- "packetsLost": 0,
- "jitterMs": 3,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-hevc-failfast-20260605T205643Z.json b/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-hevc-failfast-20260605T205643Z.json
deleted file mode 100644
index ca517d747..000000000
--- a/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-720p-hevc-failfast-20260605T205643Z.json
+++ /dev/null
@@ -1,226 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:56:44.980Z",
- "endedAt": "2026-06-05T20:56:45.769Z",
- "platform": "linux",
- "arch": "x64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-94317-ce85bdff-9476-465a-9f9a-fae49f6c168d",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-94317",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-94317",
- "subscriberIdentity": "fluxer-native-subscriber-94317",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 15000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.9,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["hevc"],
- "expectedScreenCodecs": ["hevc"],
- "codec": "hevc",
- "expectedScreenCodec": "video/H265",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "hevc",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H265",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/home/hampus/Development/fluxer/fluxer_desktop/native-media-reports/cachyos-nvidia-livekit-720p-hevc-failfast-20260605T205643Z.json",
- "verbose": false,
- "scenarioName": "codec-hevc",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": false
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/H265",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/H265",
- "pass": false
- },
- {
- "name": "server publishing API participants listed",
- "pass": false
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: H.265 publishing requires hardware encoder support; missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "no_supported_devices",
- "detail": "missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 27,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": null,
- "publisherStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-alltracks-serverpub-mixed-20260605T205705Z.json b/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-alltracks-serverpub-mixed-20260605T205705Z.json
deleted file mode 100644
index 033a450d8..000000000
--- a/fluxer_desktop/native-media-reports/cachyos/cachyos-nvidia-livekit-alltracks-serverpub-mixed-20260605T205705Z.json
+++ /dev/null
@@ -1,637 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T20:57:06.276Z",
- "endedAt": "2026-06-05T20:57:28.255Z",
- "platform": "linux",
- "arch": "x64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-94553-a59031d7-277a-4d31-a290-59cea2c79f1c",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-94553",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-94553",
- "subscriberIdentity": "fluxer-native-subscriber-94553",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 20000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.9,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": true,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": true,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/home/hampus/Development/fluxer/fluxer_desktop/native-media-reports/cachyos-nvidia-livekit-alltracks-serverpub-mixed-20260605T205705Z.json",
- "verbose": false,
- "scenarioName": "codec-h264-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "no_supported_devices",
- "detail": "missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))"
- },
- "metrics": {
- "inboundAudioFrames": 8352,
- "inboundVideoFrames": 1182,
- "strictAudioFrames": 200,
- "strictVideoFrames": 1164,
- "videoCallbacks": 1180,
- "videoBytes": 1631232000,
- "receivedFps": 58.16,
- "requiredFps": 27,
- "maxVideoFrameGapMs": 98,
- "maxAudioFrameGapMs": 101,
- "maxVideoFrameGapOverallMs": 98,
- "maxAudioFrameGapOverallMs": 101,
- "avDriftMs": 36,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "1280x720": 1164
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780693027399,
- "stoppedAtMs": null,
- "framesPushed": 626,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 39,
- "lastPushAtMs": 1780693048233,
- "elapsedMs": 21015,
- "producedFps": 29.79
- },
- "secondaryPublisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780693027400,
- "stoppedAtMs": null,
- "framesPushed": 626,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 40,
- "lastPushAtMs": 1780693048233,
- "elapsedMs": 21014,
- "producedFps": 29.79
- },
- "serverPublishing": {
- "fetchedAtMs": 1780693027997,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-94553",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AsXuPkpunfLw9E",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VStW6iBWUPJvYp",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- },
- {
- "sid": "TR_AMraWSQbYVLoud",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-94553",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-2-94553",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSDUf6mLBmkksq",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMuo9vvgBhxrxp",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_Asf2caReF2dUoe",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_sFVVyQMPfG8Z",
- "trackSid": "TR_VSDUf6mLBmkksq",
- "width": 1280,
- "height": 720,
- "timestampUs": 68952853000
- },
- "publisherStats": {
- "rttMs": 15,
- "outbound": [
- {
- "trackSid": "TR_VStW6iBWUPJvYp",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 399.8,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/H264"
- },
- {
- "trackSid": "TR_AsXuPkpunfLw9E",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 258.9,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMraWSQbYVLoud",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 97.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_sFVVyQMPfG8Z",
- "trackSid": "TR_AMuo9vvgBhxrxp",
- "kind": "audio",
- "bitrateKbps": 104.8,
- "packetsLost": 0,
- "jitterMs": 3,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_sFVVyQMPfG8Z",
- "trackSid": "TR_Asf2caReF2dUoe",
- "kind": "audio",
- "bitrateKbps": 274.6,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_sFVVyQMPfG8Z",
- "trackSid": "TR_VSDUf6mLBmkksq",
- "kind": "video",
- "bitrateKbps": 31.6,
- "packetsLost": 0,
- "jitterMs": 5,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 617,
- "outgoingVideoFramesAccepted": 617,
- "outgoingVideoFramesDropped": 19,
- "outgoingVideoFramesCoalesced": 19,
- "outgoingVideoFramesCaptured": 598,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 29.05,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 33,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 30,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": 38,
- "outbound": [
- {
- "trackSid": "TR_Asf2caReF2dUoe",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 261.7,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSDUf6mLBmkksq",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 29.4,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMuo9vvgBhxrxp",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_mQQgkdVbS4Wi",
- "trackSid": "TR_AsXuPkpunfLw9E",
- "kind": "audio",
- "bitrateKbps": 265.5,
- "packetsLost": 0,
- "jitterMs": 3,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_mQQgkdVbS4Wi",
- "trackSid": "TR_VStW6iBWUPJvYp",
- "kind": "video",
- "bitrateKbps": 402.2,
- "packetsLost": 0,
- "jitterMs": 5,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_mQQgkdVbS4Wi",
- "trackSid": "TR_AMraWSQbYVLoud",
- "kind": "audio",
- "bitrateKbps": 100.3,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 618,
- "outgoingVideoFramesAccepted": 618,
- "outgoingVideoFramesDropped": 19,
- "outgoingVideoFramesCoalesced": 19,
- "outgoingVideoFramesCaptured": 599,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 29.07,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 33,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 30,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": 6,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_sFVVyQMPfG8Z",
- "trackSid": "TR_AMuo9vvgBhxrxp",
- "kind": "audio",
- "bitrateKbps": 100.8,
- "packetsLost": 0,
- "jitterMs": 3,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_sFVVyQMPfG8Z",
- "trackSid": "TR_VSDUf6mLBmkksq",
- "kind": "video",
- "bitrateKbps": 29.4,
- "packetsLost": 0,
- "jitterMs": 5,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_sFVVyQMPfG8Z",
- "trackSid": "TR_Asf2caReF2dUoe",
- "kind": "audio",
- "bitrateKbps": 271.7,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_mQQgkdVbS4Wi",
- "trackSid": "TR_VStW6iBWUPJvYp",
- "kind": "video",
- "bitrateKbps": 399.8,
- "packetsLost": 0,
- "jitterMs": 5,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_mQQgkdVbS4Wi",
- "trackSid": "TR_AMraWSQbYVLoud",
- "kind": "audio",
- "bitrateKbps": 99.8,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_mQQgkdVbS4Wi",
- "trackSid": "TR_AsXuPkpunfLw9E",
- "kind": "audio",
- "bitrateKbps": 263.9,
- "packetsLost": 0,
- "jitterMs": 3,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h264-noadaptive-20260605T204148Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h264-noadaptive-20260605T204148Z.json
deleted file mode 100644
index 29032e666..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h264-noadaptive-20260605T204148Z.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T20:41:48.766Z",
- "endedAt": "2026-06-05T20:42:05.685Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-99979-bebc8448-fca8-4318-84fb-debd59234bd3",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-99979",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-99979",
- "subscriberIdentity": "fluxer-native-subscriber-99979",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 15000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.8,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "h264",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H264",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": false,
- "minVideoFps": 24,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": "videotoolbox",
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h264-noadaptive-20260605T204148Z.json",
- "verbose": false,
- "scenarioName": "codec-h264",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "hardware encoder backend videotoolbox",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 787,
- "strictAudioFrames": 0,
- "strictVideoFrames": 783,
- "videoCallbacks": 786,
- "videoBytes": 9779097600,
- "receivedFps": 52.46,
- "requiredFps": 48,
- "maxVideoFrameGapMs": 49,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 313,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 12,
- "maxObservedPacketLossDelta": 11,
- "videoResolutionCounts": {
- "3840x2160": 783
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 60,
- "startedAtMs": 1780692109289,
- "stoppedAtMs": null,
- "framesPushed": 982,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 44,
- "lastPushAtMs": 1780692125674,
- "elapsedMs": 16404,
- "producedFps": 59.86
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780692110403,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-99979",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-99979",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VShAhgz9DukUav",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_7vLduTJN79oF",
- "trackSid": "TR_VShAhgz9DukUav",
- "width": 3840,
- "height": 2160,
- "timestampUs": 246972075000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VShAhgz9DukUav",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 226,
- "packetsLost": 0,
- "fps": 53,
- "codec": "video/H264"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 943,
- "outgoingVideoFramesAccepted": 943,
- "outgoingVideoFramesDropped": 80,
- "outgoingVideoFramesCoalesced": 80,
- "outgoingVideoFramesCaptured": 862,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 54.78,
- "outgoingVideoTargetFps": 60,
- "outgoingVideoMaxQueueAgeMs": 18,
- "outgoingVideoMaxPushLatencyMs": 18,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "adaptiveDisabled"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_7vLduTJN79oF",
- "trackSid": "TR_VShAhgz9DukUav",
- "kind": "video",
- "bitrateKbps": 226.1,
- "packetsLost": 12,
- "jitterMs": 4,
- "codec": "video/H264"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h264-restarted-20260605T204256Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h264-restarted-20260605T204256Z.json
deleted file mode 100644
index f48e604e0..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h264-restarted-20260605T204256Z.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T20:42:57.137Z",
- "endedAt": "2026-06-05T20:43:14.930Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-215-d2420544-1d14-499d-b7ed-39246026eeba",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-215",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-215",
- "subscriberIdentity": "fluxer-native-subscriber-215",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 15000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.8,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "h264",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H264",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": false,
- "minVideoFps": 24,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": "videotoolbox",
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h264-restarted-20260605T204256Z.json",
- "verbose": false,
- "scenarioName": "codec-h264",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "hardware encoder backend videotoolbox",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 835,
- "strictAudioFrames": 0,
- "strictVideoFrames": 780,
- "videoCallbacks": 835,
- "videoBytes": 10388736000,
- "receivedFps": 51.9,
- "requiredFps": 48,
- "maxVideoFrameGapMs": 103,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 133,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 8,
- "maxObservedPacketLossDelta": 2,
- "videoResolutionCounts": {
- "3840x2160": 780
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 60,
- "startedAtMs": 1780692177759,
- "stoppedAtMs": null,
- "framesPushed": 1029,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 47,
- "lastPushAtMs": 1780692194929,
- "elapsedMs": 17180,
- "producedFps": 59.9
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780692179914,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-215",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-215",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VSt23d8AR7uRMx",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_ywoDZo9MfjAs",
- "trackSid": "TR_VSt23d8AR7uRMx",
- "width": 3840,
- "height": 2160,
- "timestampUs": 247041331000
- },
- "publisherStats": {
- "rttMs": null,
- "outbound": [
- {
- "trackSid": "TR_VSt23d8AR7uRMx",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 222,
- "packetsLost": 0,
- "fps": 52,
- "codec": "video/H264"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 1000,
- "outgoingVideoFramesAccepted": 1000,
- "outgoingVideoFramesDropped": 87,
- "outgoingVideoFramesCoalesced": 87,
- "outgoingVideoFramesCaptured": 912,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 54.65,
- "outgoingVideoTargetFps": 60,
- "outgoingVideoMaxQueueAgeMs": 18,
- "outgoingVideoMaxPushLatencyMs": 19,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "adaptiveDisabled"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_ywoDZo9MfjAs",
- "trackSid": "TR_VSt23d8AR7uRMx",
- "kind": "video",
- "bitrateKbps": 221.7,
- "packetsLost": 8,
- "jitterMs": 4,
- "codec": "video/H264"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h265-20260605T203835Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h265-20260605T203835Z.json
deleted file mode 100644
index 70f4234a1..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h265-20260605T203835Z.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:38:35.984Z",
- "endedAt": "2026-06-05T20:39:09.401Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-99305-9b3ba47d-c306-44e8-93be-2f3f219d81d3",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-99305",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-99305",
- "subscriberIdentity": "fluxer-native-subscriber-99305",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 30000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.8,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["hevc"],
- "expectedScreenCodecs": ["hevc"],
- "codec": "hevc",
- "expectedScreenCodec": "video/H265",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "hevc",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H265",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 24,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": "videotoolbox",
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h265-20260605T203835Z.json",
- "verbose": false,
- "scenarioName": "codec-hevc",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H265",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H265",
- "pass": true
- },
- {
- "name": "hardware encoder backend videotoolbox",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 29.9 below 48",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 911,
- "strictAudioFrames": 0,
- "strictVideoFrames": 898,
- "videoCallbacks": 911,
- "videoBytes": 11334297600,
- "receivedFps": 29.9,
- "requiredFps": 48,
- "maxVideoFrameGapMs": 124,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 124,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 4,
- "maxObservedPacketLossDelta": 4,
- "videoResolutionCounts": {
- "3840x2160": 898
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 60,
- "startedAtMs": 1780691916459,
- "stoppedAtMs": null,
- "framesPushed": 1977,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 35,
- "lastPushAtMs": 1780691949392,
- "elapsedMs": 32950,
- "producedFps": 60
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780691919120,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-99305",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-99305",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VSVHTFzX6KKP2d",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H265",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_p6AhRM2ZweHm",
- "trackSid": "TR_VSVHTFzX6KKP2d",
- "width": 3840,
- "height": 2160,
- "timestampUs": 246795792000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VSVHTFzX6KKP2d",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 80.1,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/H265"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 1975,
- "outgoingVideoFramesAccepted": 1975,
- "outgoingVideoFramesDropped": 906,
- "outgoingVideoFramesCoalesced": 906,
- "outgoingVideoFramesCaptured": 1068,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 32.44,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 18,
- "outgoingVideoMaxPushLatencyMs": 18,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "fps30",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_p6AhRM2ZweHm",
- "trackSid": "TR_VSVHTFzX6KKP2d",
- "kind": "video",
- "bitrateKbps": 83,
- "packetsLost": 4,
- "jitterMs": 2,
- "codec": "video/H265"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h265-noadaptive-20260605T204048Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h265-noadaptive-20260605T204048Z.json
deleted file mode 100644
index c2e01fb7b..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h265-noadaptive-20260605T204048Z.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:40:48.428Z",
- "endedAt": "2026-06-05T20:41:21.891Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-99799-9b73c5f8-24ee-46a6-b641-2268cab488bf",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-99799",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-99799",
- "subscriberIdentity": "fluxer-native-subscriber-99799",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 30000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.8,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["hevc"],
- "expectedScreenCodecs": ["hevc"],
- "codec": "hevc",
- "expectedScreenCodec": "video/H265",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "hevc",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H265",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": false,
- "minVideoFps": 24,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": "videotoolbox",
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-h265-noadaptive-20260605T204048Z.json",
- "verbose": false,
- "scenarioName": "codec-hevc",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H265",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H265",
- "pass": true
- },
- {
- "name": "hardware encoder backend videotoolbox",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 47.42 below 48",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 1439,
- "strictAudioFrames": 0,
- "strictVideoFrames": 1424,
- "videoCallbacks": 1438,
- "videoBytes": 17891020800,
- "receivedFps": 47.42,
- "requiredFps": 48,
- "maxVideoFrameGapMs": 119,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 119,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 4,
- "maxObservedPacketLossDelta": 4,
- "videoResolutionCounts": {
- "3840x2160": 1424
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 60,
- "startedAtMs": 1780692048955,
- "stoppedAtMs": null,
- "framesPushed": 1977,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 27,
- "lastPushAtMs": 1780692081889,
- "elapsedMs": 32944,
- "producedFps": 60.01
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780692051599,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-99799",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VS7whvguuwE7Ep",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H265",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-99799",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_6qPYCyPtKNMy",
- "trackSid": "TR_VS7whvguuwE7Ep",
- "width": 3840,
- "height": 2160,
- "timestampUs": 246928279000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VS7whvguuwE7Ep",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 132.9,
- "packetsLost": 0,
- "fps": 47,
- "codec": "video/H265"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 1971,
- "outgoingVideoFramesAccepted": 1971,
- "outgoingVideoFramesDropped": 169,
- "outgoingVideoFramesCoalesced": 169,
- "outgoingVideoFramesCaptured": 1802,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 54.85,
- "outgoingVideoTargetFps": 60,
- "outgoingVideoMaxQueueAgeMs": 18,
- "outgoingVideoMaxPushLatencyMs": 18,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "adaptiveDisabled"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_6qPYCyPtKNMy",
- "trackSid": "TR_VS7whvguuwE7Ep",
- "kind": "video",
- "bitrateKbps": 135.8,
- "packetsLost": 4,
- "jitterMs": 6,
- "codec": "video/H265"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-vp8-noadaptive-20260605T204205Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-vp8-noadaptive-20260605T204205Z.json
deleted file mode 100644
index b35a60ef3..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-vp8-noadaptive-20260605T204205Z.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T20:42:06.035Z",
- "endedAt": "2026-06-05T20:42:22.648Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-99996-9f3eea01-c794-44e7-a66d-a39e3b06f591",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-99996",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-99996",
- "subscriberIdentity": "fluxer-native-subscriber-99996",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 15000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.8,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": false,
- "minVideoFps": 24,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": "videotoolbox",
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-4k60-vp8-noadaptive-20260605T204205Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "hardware encoder backend videotoolbox",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 835,
- "strictAudioFrames": 0,
- "strictVideoFrames": 829,
- "videoCallbacks": 835,
- "videoBytes": 10388736000,
- "receivedFps": 55.21,
- "requiredFps": 48,
- "maxVideoFrameGapMs": 138,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 138,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 18,
- "maxObservedPacketLossDelta": 17,
- "videoResolutionCounts": {
- "3840x2160": 829
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 60,
- "startedAtMs": 1780692126456,
- "stoppedAtMs": null,
- "framesPushed": 966,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 28,
- "lastPushAtMs": 1780692142632,
- "elapsedMs": 16199,
- "producedFps": 59.63
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780692127628,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-99996",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VSgayVkGgydiPJ",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-99996",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_CRYMSnWyNXJJ",
- "trackSid": "TR_VSgayVkGgydiPJ",
- "width": 3840,
- "height": 2160,
- "timestampUs": 246989049000
- },
- "publisherStats": {
- "rttMs": null,
- "outbound": [
- {
- "trackSid": "TR_VSgayVkGgydiPJ",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 347.3,
- "packetsLost": 0,
- "fps": 55,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 952,
- "outgoingVideoFramesAccepted": 952,
- "outgoingVideoFramesDropped": 83,
- "outgoingVideoFramesCoalesced": 83,
- "outgoingVideoFramesCaptured": 869,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 54.77,
- "outgoingVideoTargetFps": 60,
- "outgoingVideoMaxQueueAgeMs": 18,
- "outgoingVideoMaxPushLatencyMs": 18,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "adaptiveDisabled"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_CRYMSnWyNXJJ",
- "trackSid": "TR_VSgayVkGgydiPJ",
- "kind": "video",
- "bitrateKbps": 347.9,
- "packetsLost": 18,
- "jitterMs": 3,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-720p-hevc-after-guard-20260605T205747Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-720p-hevc-after-guard-20260605T205747Z.json
deleted file mode 100644
index 286970449..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-720p-hevc-after-guard-20260605T205747Z.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T20:57:47.344Z",
- "endedAt": "2026-06-05T20:58:04.558Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-1177-7a01a114-afdb-422c-ac68-dd6da5106b46",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-1177",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-1177",
- "subscriberIdentity": "fluxer-native-subscriber-1177",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 15000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.9,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["hevc"],
- "expectedScreenCodecs": ["hevc"],
- "codec": "hevc",
- "expectedScreenCodec": "video/H265",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "hevc",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H265",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": "videotoolbox",
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-720p-hevc-after-guard-20260605T205747Z.json",
- "verbose": false,
- "scenarioName": "codec-hevc",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H265",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H265",
- "pass": true
- },
- {
- "name": "hardware encoder backend videotoolbox",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 424,
- "strictAudioFrames": 0,
- "strictVideoFrames": 420,
- "videoCallbacks": 423,
- "videoBytes": 584755200,
- "receivedFps": 28.28,
- "requiredFps": 27,
- "maxVideoFrameGapMs": 132,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 500,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "1280x720": 420
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780693067890,
- "stoppedAtMs": null,
- "framesPushed": 501,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 55,
- "lastPushAtMs": 1780693084557,
- "elapsedMs": 16678,
- "producedFps": 30.04
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780693069535,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-1177",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-1177",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VScM2KL4qqaVMf",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H265",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_CEoLG8a8qXZr",
- "trackSid": "TR_VScM2KL4qqaVMf",
- "width": 1280,
- "height": 720,
- "timestampUs": 247930927000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VScM2KL4qqaVMf",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 31.2,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/H265"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 477,
- "outgoingVideoFramesAccepted": 477,
- "outgoingVideoFramesDropped": 23,
- "outgoingVideoFramesCoalesced": 23,
- "outgoingVideoFramesCaptured": 454,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.53,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_CEoLG8a8qXZr",
- "trackSid": "TR_VScM2KL4qqaVMf",
- "kind": "video",
- "bitrateKbps": 31.2,
- "packetsLost": 0,
- "jitterMs": 3,
- "codec": "video/H265"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-alltracks-serverpub-20260605T204337Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-alltracks-serverpub-20260605T204337Z.json
deleted file mode 100644
index 68455940e..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-alltracks-serverpub-20260605T204337Z.json
+++ /dev/null
@@ -1,636 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T20:43:38.058Z",
- "endedAt": "2026-06-05T20:44:00.477Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-287-d177ae47-231a-4e5f-8b33-e21435c1d78c",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-287",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-287",
- "subscriberIdentity": "fluxer-native-subscriber-287",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 20000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.9,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 120,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "h264",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H264",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-alltracks-serverpub-20260605T204337Z.json",
- "verbose": false,
- "scenarioName": "codec-h264-with-h264",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/H264",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 8688,
- "inboundVideoFrames": 1105,
- "strictAudioFrames": 200,
- "strictVideoFrames": 1096,
- "videoCallbacks": 1105,
- "videoBytes": 1527552000,
- "receivedFps": 55.07,
- "requiredFps": 27,
- "maxVideoFrameGapMs": 137,
- "maxAudioFrameGapMs": 102,
- "maxVideoFrameGapOverallMs": 278,
- "maxAudioFrameGapOverallMs": 102,
- "avDriftMs": 16,
- "maxObservedPacketLoss": 193,
- "maxObservedPacketLossDelta": 181,
- "videoResolutionCounts": {
- "1280x720": 1096
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780692218670,
- "stoppedAtMs": null,
- "framesPushed": 655,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 35,
- "lastPushAtMs": 1780692240471,
- "elapsedMs": 21825,
- "producedFps": 30.01
- },
- "secondaryPublisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780692218671,
- "stoppedAtMs": null,
- "framesPushed": 655,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 35,
- "lastPushAtMs": 1780692240471,
- "elapsedMs": 21824,
- "producedFps": 30.01
- },
- "serverPublishing": {
- "fetchedAtMs": 1780692220222,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-287",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AMQmi9tr3ijwD7",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsVx6mXCeyrqVB",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSjjPS7DRgdqSi",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-287",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-2-287",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSVinYCWjRrXgb",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- },
- {
- "sid": "TR_AMd395vNaQvHas",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsSinL94mqRm57",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_cdeic4ojSyhV",
- "trackSid": "TR_VSVinYCWjRrXgb",
- "width": 1280,
- "height": 720,
- "timestampUs": 247086842000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AsVx6mXCeyrqVB",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 263.9,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMQmi9tr3ijwD7",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.7,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSjjPS7DRgdqSi",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 38.3,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/H264"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_cdeic4ojSyhV",
- "trackSid": "TR_AsSinL94mqRm57",
- "kind": "audio",
- "bitrateKbps": 242.9,
- "packetsLost": 78,
- "jitterMs": 0,
- "audioLevel": 0.319,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_cdeic4ojSyhV",
- "trackSid": "TR_VSVinYCWjRrXgb",
- "kind": "video",
- "bitrateKbps": 39,
- "packetsLost": 15,
- "jitterMs": 2,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_cdeic4ojSyhV",
- "trackSid": "TR_AMd395vNaQvHas",
- "kind": "audio",
- "bitrateKbps": 92.8,
- "packetsLost": 86,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 651,
- "outgoingVideoFramesAccepted": 651,
- "outgoingVideoFramesDropped": 27,
- "outgoingVideoFramesCoalesced": 27,
- "outgoingVideoFramesCaptured": 623,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.71,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 32,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": null,
- "outbound": [
- {
- "trackSid": "TR_AsSinL94mqRm57",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 257.9,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMd395vNaQvHas",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 97.6,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSVinYCWjRrXgb",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 40.3,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/H264"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_ecrQddbJEyhw",
- "trackSid": "TR_AsVx6mXCeyrqVB",
- "kind": "audio",
- "bitrateKbps": 233.5,
- "packetsLost": 94,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ecrQddbJEyhw",
- "trackSid": "TR_VSjjPS7DRgdqSi",
- "kind": "video",
- "bitrateKbps": 39.6,
- "packetsLost": 13,
- "jitterMs": 2,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_ecrQddbJEyhw",
- "trackSid": "TR_AMQmi9tr3ijwD7",
- "kind": "audio",
- "bitrateKbps": 99.1,
- "packetsLost": 86,
- "jitterMs": 1,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 653,
- "outgoingVideoFramesAccepted": 653,
- "outgoingVideoFramesDropped": 27,
- "outgoingVideoFramesCoalesced": 27,
- "outgoingVideoFramesCaptured": 625,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.71,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 32,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_cdeic4ojSyhV",
- "trackSid": "TR_AMd395vNaQvHas",
- "kind": "audio",
- "bitrateKbps": 98.3,
- "packetsLost": 33,
- "jitterMs": 0,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_cdeic4ojSyhV",
- "trackSid": "TR_VSVinYCWjRrXgb",
- "kind": "video",
- "bitrateKbps": 39,
- "packetsLost": 42,
- "jitterMs": 2,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_cdeic4ojSyhV",
- "trackSid": "TR_AsSinL94mqRm57",
- "kind": "audio",
- "bitrateKbps": 253.1,
- "packetsLost": 2,
- "jitterMs": 0,
- "audioLevel": 0.319,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ecrQddbJEyhw",
- "trackSid": "TR_AsVx6mXCeyrqVB",
- "kind": "audio",
- "bitrateKbps": 253.3,
- "packetsLost": 19,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ecrQddbJEyhw",
- "trackSid": "TR_AMQmi9tr3ijwD7",
- "kind": "audio",
- "bitrateKbps": 98.3,
- "packetsLost": 3,
- "jitterMs": 1,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ecrQddbJEyhw",
- "trackSid": "TR_VSjjPS7DRgdqSi",
- "kind": "video",
- "bitrateKbps": 38.4,
- "packetsLost": 43,
- "jitterMs": 2,
- "codec": "video/H264"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-alltracks-serverpub-mixed-20260605T204504Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-alltracks-serverpub-mixed-20260605T204504Z.json
deleted file mode 100644
index 8aad55f15..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-alltracks-serverpub-mixed-20260605T204504Z.json
+++ /dev/null
@@ -1,636 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T20:45:05.208Z",
- "endedAt": "2026-06-05T20:45:28.695Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-421-04fac24c-55a5-4189-9d7a-5689875cf9b9",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-421",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-421",
- "subscriberIdentity": "fluxer-native-subscriber-421",
- "required": true,
- "strict": true,
- "timeoutMs": 90000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 20000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.9,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 120,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": true,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": true,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-alltracks-serverpub-mixed-20260605T204504Z.json",
- "verbose": false,
- "scenarioName": "codec-h264-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 9080,
- "inboundVideoFrames": 1223,
- "strictAudioFrames": 199,
- "strictVideoFrames": 1137,
- "videoCallbacks": 1222,
- "videoBytes": 1689292800,
- "receivedFps": 56.81,
- "requiredFps": 27,
- "maxVideoFrameGapMs": 99,
- "maxAudioFrameGapMs": 102,
- "maxVideoFrameGapOverallMs": 100,
- "maxAudioFrameGapOverallMs": 102,
- "avDriftMs": 92,
- "maxObservedPacketLoss": 186,
- "maxObservedPacketLossDelta": 163,
- "videoResolutionCounts": {
- "1280x720": 1137
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780692305878,
- "stoppedAtMs": null,
- "framesPushed": 685,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780692328677,
- "elapsedMs": 22834,
- "producedFps": 30
- },
- "secondaryPublisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780692305878,
- "stoppedAtMs": null,
- "framesPushed": 685,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780692328677,
- "elapsedMs": 22834,
- "producedFps": 30
- },
- "serverPublishing": {
- "fetchedAtMs": 1780692308436,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-421",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VS73hbjzW6G7kV",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- },
- {
- "sid": "TR_AMncny8z7koEGm",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_Aso75dfBWxWEyj",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-publisher-2-421",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AsxFsT7RDTdKQu",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSUZjTy2hrcZCc",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMuYbUnWUcAZxj",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-421",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_J5CFmBPpkkyM",
- "trackSid": "TR_VS73hbjzW6G7kV",
- "width": 1280,
- "height": 720,
- "timestampUs": 247175096000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VS73hbjzW6G7kV",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 38.6,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/H264"
- },
- {
- "trackSid": "TR_Aso75dfBWxWEyj",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 261.1,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMncny8z7koEGm",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.3,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_9zvEJKeZq55z",
- "trackSid": "TR_VSUZjTy2hrcZCc",
- "kind": "video",
- "bitrateKbps": 29.7,
- "packetsLost": 37,
- "jitterMs": 3,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_9zvEJKeZq55z",
- "trackSid": "TR_AsxFsT7RDTdKQu",
- "kind": "audio",
- "bitrateKbps": 249.7,
- "packetsLost": 87,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_9zvEJKeZq55z",
- "trackSid": "TR_AMuYbUnWUcAZxj",
- "kind": "audio",
- "bitrateKbps": 91.6,
- "packetsLost": 62,
- "jitterMs": 0,
- "audioLevel": 0.321,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 683,
- "outgoingVideoFramesAccepted": 683,
- "outgoingVideoFramesDropped": 29,
- "outgoingVideoFramesCoalesced": 29,
- "outgoingVideoFramesCaptured": 654,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.71,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 30,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AMuYbUnWUcAZxj",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 99.2,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AsxFsT7RDTdKQu",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 264.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSUZjTy2hrcZCc",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 29.7,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/VP8"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_J5CFmBPpkkyM",
- "trackSid": "TR_VS73hbjzW6G7kV",
- "kind": "video",
- "bitrateKbps": 38.6,
- "packetsLost": 1,
- "jitterMs": 3,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_J5CFmBPpkkyM",
- "trackSid": "TR_Aso75dfBWxWEyj",
- "kind": "audio",
- "bitrateKbps": 260.9,
- "packetsLost": 4,
- "jitterMs": 1,
- "audioLevel": 0.318,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_J5CFmBPpkkyM",
- "trackSid": "TR_AMncny8z7koEGm",
- "kind": "audio",
- "bitrateKbps": 98.3,
- "packetsLost": 2,
- "jitterMs": 1,
- "audioLevel": 0.317,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 683,
- "outgoingVideoFramesAccepted": 683,
- "outgoingVideoFramesDropped": 29,
- "outgoingVideoFramesCoalesced": 29,
- "outgoingVideoFramesCaptured": 654,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.71,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 30,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_9zvEJKeZq55z",
- "trackSid": "TR_VSUZjTy2hrcZCc",
- "kind": "video",
- "bitrateKbps": 30.1,
- "packetsLost": 3,
- "jitterMs": 3,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_9zvEJKeZq55z",
- "trackSid": "TR_AsxFsT7RDTdKQu",
- "kind": "audio",
- "bitrateKbps": 259.8,
- "packetsLost": 3,
- "jitterMs": 0,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_9zvEJKeZq55z",
- "trackSid": "TR_AMuYbUnWUcAZxj",
- "kind": "audio",
- "bitrateKbps": 99,
- "packetsLost": 3,
- "jitterMs": 0,
- "audioLevel": 0.352,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_J5CFmBPpkkyM",
- "trackSid": "TR_AMncny8z7koEGm",
- "kind": "audio",
- "bitrateKbps": 95.5,
- "packetsLost": 64,
- "jitterMs": 1,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_J5CFmBPpkkyM",
- "trackSid": "TR_VS73hbjzW6G7kV",
- "kind": "video",
- "bitrateKbps": 40,
- "packetsLost": 27,
- "jitterMs": 3,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_J5CFmBPpkkyM",
- "trackSid": "TR_Aso75dfBWxWEyj",
- "kind": "audio",
- "bitrateKbps": 244.3,
- "packetsLost": 67,
- "jitterMs": 0,
- "audioLevel": 0.31,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-multipub-audio-nosim-20260605T203740Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-multipub-audio-nosim-20260605T203740Z.json
deleted file mode 100644
index b76d07a2d..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-multipub-audio-nosim-20260605T203740Z.json
+++ /dev/null
@@ -1,636 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:37:40.480Z",
- "endedAt": "2026-06-05T20:37:52.123Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-99206-d8ecfb6b-5331-4b04-9ac0-0f510f626c7b",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-99206",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-99206",
- "subscriberIdentity": "fluxer-native-subscriber-99206",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.94,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-multipub-audio-nosim-20260605T203740Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "A/V drift 86ms exceeds 80ms; observed packet loss delta 97 exceeds 0",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 4368,
- "inboundVideoFrames": 630,
- "strictAudioFrames": 99,
- "strictVideoFrames": 575,
- "videoCallbacks": 630,
- "videoBytes": 870912000,
- "receivedFps": 57.46,
- "requiredFps": 28.2,
- "maxVideoFrameGapMs": 139,
- "maxAudioFrameGapMs": 102,
- "maxVideoFrameGapOverallMs": 139,
- "maxAudioFrameGapOverallMs": 102,
- "avDriftMs": 86,
- "maxObservedPacketLoss": 106,
- "maxObservedPacketLossDelta": 97,
- "videoResolutionCounts": {
- "1280x720": 575
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691861125,
- "stoppedAtMs": null,
- "framesPushed": 330,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780691872091,
- "elapsedMs": 11091,
- "producedFps": 29.75
- },
- "secondaryPublisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691861125,
- "stoppedAtMs": null,
- "framesPushed": 330,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780691872091,
- "elapsedMs": 11091,
- "producedFps": 29.75
- },
- "serverPublishing": {
- "fetchedAtMs": 1780691861869,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-99206",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-99206",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AsHmDRoRwwH2rj",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSFufssZ8C8oGR",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMofk8na2BK2zW",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-publisher-2-99206",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSjFwfYRyNg8nM",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMqoCF5pBKLLtZ",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsYeF5v2Lv8BFF",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_mPCx5P6en7uF",
- "trackSid": "TR_VSjFwfYRyNg8nM",
- "width": 1280,
- "height": 720,
- "timestampUs": 246718524000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AMofk8na2BK2zW",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AsHmDRoRwwH2rj",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 260.4,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSFufssZ8C8oGR",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 27.5,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/VP8"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_mPCx5P6en7uF",
- "trackSid": "TR_AMqoCF5pBKLLtZ",
- "kind": "audio",
- "bitrateKbps": 94.4,
- "packetsLost": 36,
- "jitterMs": 0,
- "audioLevel": 0.337,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_mPCx5P6en7uF",
- "trackSid": "TR_VSjFwfYRyNg8nM",
- "kind": "video",
- "bitrateKbps": 29,
- "packetsLost": 20,
- "jitterMs": 4,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_mPCx5P6en7uF",
- "trackSid": "TR_AsYeF5v2Lv8BFF",
- "kind": "audio",
- "bitrateKbps": 252.3,
- "packetsLost": 36,
- "jitterMs": 0,
- "audioLevel": 0.342,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 322,
- "outgoingVideoFramesAccepted": 322,
- "outgoingVideoFramesDropped": 14,
- "outgoingVideoFramesCoalesced": 14,
- "outgoingVideoFramesCaptured": 308,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.68,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 33,
- "outgoingVideoMaxPushLatencyMs": 33,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 28,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AsYeF5v2Lv8BFF",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 262.2,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSjFwfYRyNg8nM",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 28.9,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMqoCF5pBKLLtZ",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.3,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_ynXQqotkNFtm",
- "trackSid": "TR_VSFufssZ8C8oGR",
- "kind": "video",
- "bitrateKbps": 26.6,
- "packetsLost": 18,
- "jitterMs": 3,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_ynXQqotkNFtm",
- "trackSid": "TR_AMofk8na2BK2zW",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 4,
- "jitterMs": 1,
- "audioLevel": 0.323,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ynXQqotkNFtm",
- "trackSid": "TR_AsHmDRoRwwH2rj",
- "kind": "audio",
- "bitrateKbps": 260.6,
- "packetsLost": 3,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 322,
- "outgoingVideoFramesAccepted": 322,
- "outgoingVideoFramesDropped": 14,
- "outgoingVideoFramesCoalesced": 14,
- "outgoingVideoFramesCaptured": 308,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.68,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 33,
- "outgoingVideoMaxPushLatencyMs": 33,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 28,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_mPCx5P6en7uF",
- "trackSid": "TR_AMqoCF5pBKLLtZ",
- "kind": "audio",
- "bitrateKbps": 96.1,
- "packetsLost": 0,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_mPCx5P6en7uF",
- "trackSid": "TR_AsYeF5v2Lv8BFF",
- "kind": "audio",
- "bitrateKbps": 260.2,
- "packetsLost": 2,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_mPCx5P6en7uF",
- "trackSid": "TR_VSjFwfYRyNg8nM",
- "kind": "video",
- "bitrateKbps": 29.1,
- "packetsLost": 7,
- "jitterMs": 3,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_ynXQqotkNFtm",
- "trackSid": "TR_AMofk8na2BK2zW",
- "kind": "audio",
- "bitrateKbps": 92.7,
- "packetsLost": 40,
- "jitterMs": 1,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ynXQqotkNFtm",
- "trackSid": "TR_AsHmDRoRwwH2rj",
- "kind": "audio",
- "bitrateKbps": 231.2,
- "packetsLost": 45,
- "jitterMs": 0,
- "audioLevel": 0.312,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_ynXQqotkNFtm",
- "trackSid": "TR_VSFufssZ8C8oGR",
- "kind": "video",
- "bitrateKbps": 27.8,
- "packetsLost": 12,
- "jitterMs": 3,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-20260605T202601Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-20260605T202601Z.json
deleted file mode 100644
index 30f48b3ce..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-20260605T202601Z.json
+++ /dev/null
@@ -1,654 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:26:01.950Z",
- "endedAt": "2026-06-05T20:26:13.710Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-97788-e96dacf0-ab09-478e-8f70-cff476c920c4",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-97788",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-97788",
- "subscriberIdentity": "fluxer-native-subscriber-97788",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-20260605T202601Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "observed packet loss 104 exceeds 0; observed 2 video frames outside 1280x720",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 4408,
- "inboundVideoFrames": 581,
- "strictAudioFrames": 100,
- "strictVideoFrames": 554,
- "videoCallbacks": 579,
- "videoBytes": 796262400,
- "receivedFps": 56.03,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 66,
- "maxAudioFrameGapMs": 102,
- "maxVideoFrameGapOverallMs": 128,
- "maxAudioFrameGapOverallMs": 102,
- "avDriftMs": 13,
- "maxObservedPacketLoss": 104,
- "videoResolutionCounts": {
- "640x360": 2,
- "1280x720": 552
- },
- "videoResolutionMismatchCount": 2,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691162656,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 35,
- "lastPushAtMs": 1780691173690,
- "elapsedMs": 11153,
- "producedFps": 29.77
- },
- "secondaryPublisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691162656,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 35,
- "lastPushAtMs": 1780691173690,
- "elapsedMs": 11153,
- "producedFps": 29.77
- },
- "serverPublishing": {
- "fetchedAtMs": 1780691163699,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-97788",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-2-97788",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AMYDBcTLVPXW5R",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSSvARsPYMjnfH",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AseAEMuwQvUDUq",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-publisher-97788",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AsEpo39LZXJwgU",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AMZe28QCXUZLuv",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSVNYfqdKkzCqh",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_G5C4xWMJumgR",
- "trackSid": "TR_VSSvARsPYMjnfH",
- "width": 1280,
- "height": 720,
- "timestampUs": 246020100000
- },
- "publisherStats": {
- "rttMs": null,
- "outbound": [
- {
- "trackSid": "TR_VSVNYfqdKkzCqh",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1.9,
- "packetsLost": 0,
- "fps": 3,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_VSVNYfqdKkzCqh",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 35.4,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMZe28QCXUZLuv",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AsEpo39LZXJwgU",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 261.7,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_G5C4xWMJumgR",
- "trackSid": "TR_VSSvARsPYMjnfH",
- "kind": "video",
- "bitrateKbps": 2.3,
- "packetsLost": 4,
- "jitterMs": 14,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_G5C4xWMJumgR",
- "trackSid": "TR_AMYDBcTLVPXW5R",
- "kind": "audio",
- "bitrateKbps": 98.2,
- "packetsLost": 2,
- "jitterMs": 0,
- "audioLevel": 0.332,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_G5C4xWMJumgR",
- "trackSid": "TR_AseAEMuwQvUDUq",
- "kind": "audio",
- "bitrateKbps": 238,
- "packetsLost": 44,
- "jitterMs": 0,
- "audioLevel": 0.309,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 326,
- "outgoingVideoFramesAccepted": 326,
- "outgoingVideoFramesDropped": 16,
- "outgoingVideoFramesCoalesced": 16,
- "outgoingVideoFramesCaptured": 309,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.49,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 33,
- "outgoingVideoMaxPushLatencyMs": 33,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 46,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AseAEMuwQvUDUq",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 257.7,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSSvARsPYMjnfH",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 32.8,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_VSSvARsPYMjnfH",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 2.3,
- "packetsLost": 0,
- "fps": 3,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMYDBcTLVPXW5R",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.7,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_t8raa7C57aBi",
- "trackSid": "TR_AMZe28QCXUZLuv",
- "kind": "audio",
- "bitrateKbps": 96.9,
- "packetsLost": 1,
- "jitterMs": 1,
- "audioLevel": 0.31,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_t8raa7C57aBi",
- "trackSid": "TR_VSVNYfqdKkzCqh",
- "kind": "video",
- "bitrateKbps": 1.9,
- "packetsLost": 1,
- "jitterMs": 15,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_t8raa7C57aBi",
- "trackSid": "TR_AsEpo39LZXJwgU",
- "kind": "audio",
- "bitrateKbps": 223.8,
- "packetsLost": 56,
- "jitterMs": 1,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 323,
- "outgoingVideoFramesAccepted": 323,
- "outgoingVideoFramesDropped": 16,
- "outgoingVideoFramesCoalesced": 16,
- "outgoingVideoFramesCaptured": 306,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.48,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 33,
- "outgoingVideoMaxPushLatencyMs": 33,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 47,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_G5C4xWMJumgR",
- "trackSid": "TR_AseAEMuwQvUDUq",
- "kind": "audio",
- "bitrateKbps": 258.1,
- "packetsLost": 1,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_G5C4xWMJumgR",
- "trackSid": "TR_AMYDBcTLVPXW5R",
- "kind": "audio",
- "bitrateKbps": 91.1,
- "packetsLost": 45,
- "jitterMs": 0,
- "audioLevel": 0.333,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_G5C4xWMJumgR",
- "trackSid": "TR_VSSvARsPYMjnfH",
- "kind": "video",
- "bitrateKbps": 35,
- "packetsLost": 4,
- "jitterMs": 4,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_t8raa7C57aBi",
- "trackSid": "TR_AsEpo39LZXJwgU",
- "kind": "audio",
- "bitrateKbps": 261.8,
- "packetsLost": 2,
- "jitterMs": 1,
- "audioLevel": 0.318,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_t8raa7C57aBi",
- "trackSid": "TR_VSVNYfqdKkzCqh",
- "kind": "video",
- "bitrateKbps": 35.4,
- "packetsLost": 7,
- "jitterMs": 4,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_t8raa7C57aBi",
- "trackSid": "TR_AMZe28QCXUZLuv",
- "kind": "audio",
- "bitrateKbps": 86.9,
- "packetsLost": 45,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-autosuboff-20260605T202848Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-autosuboff-20260605T202848Z.json
deleted file mode 100644
index 24b91c71c..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-autosuboff-20260605T202848Z.json
+++ /dev/null
@@ -1,316 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:28:48.938Z",
- "endedAt": "2026-06-05T20:29:18.944Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-98362-5162a4d6-ca28-4b4f-b02e-bea151fc375d",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-98362",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-98362",
- "subscriberIdentity": "fluxer-native-subscriber-98362",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-autosuboff-20260605T202848Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": false
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": false
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": false
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "secondary publisher connected",
- "pass": false
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": false
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": false
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "subscriber data packet received",
- "pass": false
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": false
- },
- {
- "name": "server publishing API participants listed",
- "pass": false
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": false
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": false
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": false
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": false
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": false
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1251:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1668:3)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1920:18)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1953:19",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-local-20260605T203006Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-local-20260605T203006Z.json
deleted file mode 100644
index 9ce2636e1..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-local-20260605T203006Z.json
+++ /dev/null
@@ -1,654 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:30:06.419Z",
- "endedAt": "2026-06-05T20:30:18.162Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-98467-7ef96043-b8a7-42ac-b2b9-d551434e68b6",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-98467",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-98467",
- "subscriberIdentity": "fluxer-native-subscriber-98467",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-smoke-local-20260605T203006Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "observed packet loss 108 exceeds 0; observed 2 video frames outside 1280x720",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 4400,
- "inboundVideoFrames": 573,
- "strictAudioFrames": 99,
- "strictVideoFrames": 560,
- "videoCallbacks": 571,
- "videoBytes": 785203200,
- "receivedFps": 56.08,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 103,
- "maxAudioFrameGapMs": 102,
- "maxVideoFrameGapOverallMs": 431,
- "maxAudioFrameGapOverallMs": 114,
- "avDriftMs": 55,
- "maxObservedPacketLoss": 108,
- "videoResolutionCounts": {
- "1280x720": 558,
- "640x360": 2
- },
- "videoResolutionMismatchCount": 2,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691407114,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780691418147,
- "elapsedMs": 11141,
- "producedFps": 29.8
- },
- "secondaryPublisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691407115,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780691418147,
- "elapsedMs": 11140,
- "producedFps": 29.8
- },
- "serverPublishing": {
- "fetchedAtMs": 1780691408158,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-98467",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AMcinu47L8FgLf",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VS32SFBD3gqCZF",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AsHUY22SNjwgPj",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-98467",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-2-98467",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AMnKcxrhawpPFJ",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSmsDZR3M5RREb",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_Asw3rBwsK6H7ob",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_xn87DfYqiNM5",
- "trackSid": "TR_VSmsDZR3M5RREb",
- "width": 1280,
- "height": 720,
- "timestampUs": 246264558000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AsHUY22SNjwgPj",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 261.6,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VS32SFBD3gqCZF",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 2.2,
- "packetsLost": 0,
- "fps": 3,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_VS32SFBD3gqCZF",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 31.2,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMcinu47L8FgLf",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_xn87DfYqiNM5",
- "trackSid": "TR_VSmsDZR3M5RREb",
- "kind": "video",
- "bitrateKbps": 2.3,
- "packetsLost": 5,
- "jitterMs": 13,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_xn87DfYqiNM5",
- "trackSid": "TR_AMnKcxrhawpPFJ",
- "kind": "audio",
- "bitrateKbps": 98.8,
- "packetsLost": 7,
- "jitterMs": 0,
- "audioLevel": 0.313,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_xn87DfYqiNM5",
- "trackSid": "TR_Asw3rBwsK6H7ob",
- "kind": "audio",
- "bitrateKbps": 236.5,
- "packetsLost": 55,
- "jitterMs": 1,
- "audioLevel": 0.318,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 326,
- "outgoingVideoFramesAccepted": 326,
- "outgoingVideoFramesDropped": 14,
- "outgoingVideoFramesCoalesced": 14,
- "outgoingVideoFramesCaptured": 311,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.66,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 31,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AMnKcxrhawpPFJ",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.6,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSmsDZR3M5RREb",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 33.7,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_VSmsDZR3M5RREb",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 2.3,
- "packetsLost": 0,
- "fps": 3,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_Asw3rBwsK6H7ob",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 262.2,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_fFFTp8k4DSa3",
- "trackSid": "TR_AMcinu47L8FgLf",
- "kind": "audio",
- "bitrateKbps": 94.8,
- "packetsLost": 61,
- "jitterMs": 0,
- "audioLevel": 0.33,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_fFFTp8k4DSa3",
- "trackSid": "TR_AsHUY22SNjwgPj",
- "kind": "audio",
- "bitrateKbps": 252.1,
- "packetsLost": 44,
- "jitterMs": 0,
- "audioLevel": 0.332,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_fFFTp8k4DSa3",
- "trackSid": "TR_VS32SFBD3gqCZF",
- "kind": "video",
- "bitrateKbps": 1.2,
- "packetsLost": 3,
- "jitterMs": 13,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 319,
- "outgoingVideoFramesAccepted": 319,
- "outgoingVideoFramesDropped": 14,
- "outgoingVideoFramesCoalesced": 14,
- "outgoingVideoFramesCaptured": 305,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.67,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 31,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_xn87DfYqiNM5",
- "trackSid": "TR_AMnKcxrhawpPFJ",
- "kind": "audio",
- "bitrateKbps": 93,
- "packetsLost": 42,
- "jitterMs": 0,
- "audioLevel": 0.334,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_xn87DfYqiNM5",
- "trackSid": "TR_VSmsDZR3M5RREb",
- "kind": "video",
- "bitrateKbps": 30.7,
- "packetsLost": 13,
- "jitterMs": 3,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_xn87DfYqiNM5",
- "trackSid": "TR_Asw3rBwsK6H7ob",
- "kind": "audio",
- "bitrateKbps": 261.9,
- "packetsLost": 9,
- "jitterMs": 1,
- "audioLevel": 0.318,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_fFFTp8k4DSa3",
- "trackSid": "TR_AMcinu47L8FgLf",
- "kind": "audio",
- "bitrateKbps": 94.8,
- "packetsLost": 13,
- "jitterMs": 0,
- "audioLevel": 0.315,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_fFFTp8k4DSa3",
- "trackSid": "TR_VS32SFBD3gqCZF",
- "kind": "video",
- "bitrateKbps": 31.2,
- "packetsLost": 14,
- "jitterMs": 3,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_fFFTp8k4DSa3",
- "trackSid": "TR_AsHUY22SNjwgPj",
- "kind": "audio",
- "bitrateKbps": 261.5,
- "packetsLost": 3,
- "jitterMs": 0,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-stable-nosimulcast-20260605T203042Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-stable-nosimulcast-20260605T203042Z.json
deleted file mode 100644
index bc4fd695f..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-stable-nosimulcast-20260605T203042Z.json
+++ /dev/null
@@ -1,635 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:30:42.517Z",
- "endedAt": "2026-06-05T20:30:54.199Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-98493-8a9f539a-e21e-481c-99b7-cd5ce35f5b34",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-98493",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-98493",
- "subscriberIdentity": "fluxer-native-subscriber-98493",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-stable-nosimulcast-20260605T203042Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "observed packet loss 240 exceeds 0",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 4334,
- "inboundVideoFrames": 602,
- "strictAudioFrames": 100,
- "strictVideoFrames": 571,
- "videoCallbacks": 600,
- "videoBytes": 829440000,
- "receivedFps": 57.45,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 183,
- "maxAudioFrameGapMs": 102,
- "maxVideoFrameGapOverallMs": 208,
- "maxAudioFrameGapOverallMs": 104,
- "avDriftMs": 42,
- "maxObservedPacketLoss": 240,
- "videoResolutionCounts": {
- "1280x720": 571
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691443335,
- "stoppedAtMs": null,
- "framesPushed": 326,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 37,
- "lastPushAtMs": 1780691454168,
- "elapsedMs": 10954,
- "producedFps": 29.76
- },
- "secondaryPublisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691443335,
- "stoppedAtMs": null,
- "framesPushed": 326,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780691454168,
- "elapsedMs": 10954,
- "producedFps": 29.76
- },
- "serverPublishing": {
- "fetchedAtMs": 1780691443938,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-2-98493",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VS6eBSydG2Fe6Y",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMwSsNzhnQnZbN",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsYPbyKEiQYdXA",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-publisher-98493",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSsm5jzFutA9po",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMd2rFUNTJzRRx",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsJfw9r7g4LU9b",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-98493",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_RjVrb6cfSTYN",
- "trackSid": "TR_VS6eBSydG2Fe6Y",
- "width": 1280,
- "height": 720,
- "timestampUs": 246300548000
- },
- "publisherStats": {
- "rttMs": null,
- "outbound": [
- {
- "trackSid": "TR_VSsm5jzFutA9po",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 28.8,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AsJfw9r7g4LU9b",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 258,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMd2rFUNTJzRRx",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.3,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_RjVrb6cfSTYN",
- "trackSid": "TR_AsYPbyKEiQYdXA",
- "kind": "audio",
- "bitrateKbps": 257.7,
- "packetsLost": 2,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_RjVrb6cfSTYN",
- "trackSid": "TR_VS6eBSydG2Fe6Y",
- "kind": "video",
- "bitrateKbps": 27.7,
- "packetsLost": 8,
- "jitterMs": 2,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_RjVrb6cfSTYN",
- "trackSid": "TR_AMwSsNzhnQnZbN",
- "kind": "audio",
- "bitrateKbps": 98.1,
- "packetsLost": 9,
- "jitterMs": 0,
- "audioLevel": 0.337,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 319,
- "outgoingVideoFramesAccepted": 319,
- "outgoingVideoFramesDropped": 14,
- "outgoingVideoFramesCoalesced": 14,
- "outgoingVideoFramesCaptured": 304,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.61,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 35,
- "outgoingVideoMaxPushLatencyMs": 35,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 30,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": null,
- "outbound": [
- {
- "trackSid": "TR_AsYPbyKEiQYdXA",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 262.5,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMwSsNzhnQnZbN",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VS6eBSydG2Fe6Y",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 26.6,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/VP8"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_SDXDDK8nFR6H",
- "trackSid": "TR_AMd2rFUNTJzRRx",
- "kind": "audio",
- "bitrateKbps": 98.3,
- "packetsLost": 10,
- "jitterMs": 1,
- "audioLevel": 0.333,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_SDXDDK8nFR6H",
- "trackSid": "TR_AsJfw9r7g4LU9b",
- "kind": "audio",
- "bitrateKbps": 267.9,
- "packetsLost": 3,
- "jitterMs": 0,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_SDXDDK8nFR6H",
- "trackSid": "TR_VSsm5jzFutA9po",
- "kind": "video",
- "bitrateKbps": 27.8,
- "packetsLost": 7,
- "jitterMs": 3,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 317,
- "outgoingVideoFramesAccepted": 317,
- "outgoingVideoFramesDropped": 14,
- "outgoingVideoFramesCoalesced": 14,
- "outgoingVideoFramesCaptured": 302,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.61,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 30,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_RjVrb6cfSTYN",
- "trackSid": "TR_AMwSsNzhnQnZbN",
- "kind": "audio",
- "bitrateKbps": 85.4,
- "packetsLost": 58,
- "jitterMs": 0,
- "audioLevel": 0.316,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_RjVrb6cfSTYN",
- "trackSid": "TR_AsYPbyKEiQYdXA",
- "kind": "audio",
- "bitrateKbps": 242.8,
- "packetsLost": 46,
- "jitterMs": 0,
- "audioLevel": 0.383,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_RjVrb6cfSTYN",
- "trackSid": "TR_VS6eBSydG2Fe6Y",
- "kind": "video",
- "bitrateKbps": 26.9,
- "packetsLost": 26,
- "jitterMs": 2,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_SDXDDK8nFR6H",
- "trackSid": "TR_AMd2rFUNTJzRRx",
- "kind": "audio",
- "bitrateKbps": 94.9,
- "packetsLost": 52,
- "jitterMs": 0,
- "audioLevel": 0.316,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_SDXDDK8nFR6H",
- "trackSid": "TR_AsJfw9r7g4LU9b",
- "kind": "audio",
- "bitrateKbps": 258.3,
- "packetsLost": 42,
- "jitterMs": 0,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_SDXDDK8nFR6H",
- "trackSid": "TR_VSsm5jzFutA9po",
- "kind": "video",
- "bitrateKbps": 28,
- "packetsLost": 16,
- "jitterMs": 2,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-strict-4k60-20260605T201811Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-strict-4k60-20260605T201811Z.json
deleted file mode 100644
index be3da22c0..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-strict-4k60-20260605T201811Z.json
+++ /dev/null
@@ -1,1405 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:18:32.176Z",
- "endedAt": "2026-06-05T20:21:02.334Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-97026-aed6d5c1-230e-4223-ab28-36ab6db848ee",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-97026",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-97026",
- "subscriberIdentity": "fluxer-native-subscriber-97026",
- "required": true,
- "strict": true,
- "timeoutMs": 180000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 120000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "expectedScreenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp9",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP9",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 24,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-strict-4k60-20260605T201811Z.json",
- "verbose": false,
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "scenarioCount": 5,
- "scenarios": [
- {
- "status": "fail",
- "startedAt": "2026-06-05T20:18:32.181Z",
- "endedAt": "2026-06-05T20:19:02.186Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-97026-aed6d5c1-230e-4223-ab28-36ab6db848ee-codec-vp8-with-vp9",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-97026",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-97026",
- "subscriberIdentity": "fluxer-native-subscriber-97026",
- "required": true,
- "strict": true,
- "timeoutMs": 180000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 120000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "expectedScreenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp9",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP9",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 24,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": null,
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp9",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": false
- },
- {
- "name": "subscriber connected",
- "pass": false
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 9",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 3",
- "pass": false
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": false
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "publisher local camera publication",
- "pass": false
- },
- {
- "name": "subscriber remote camera subscription",
- "pass": false
- },
- {
- "name": "publisher outbound camera stats",
- "pass": false
- },
- {
- "name": "secondary publisher connected",
- "pass": false
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP9",
- "pass": false
- },
- {
- "name": "subscriber inbound secondary codec video/VP9",
- "pass": false
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "subscriber data packet received",
- "pass": false
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1086:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1394:3)\n at async runScenarioSuite (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1610:19)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1639:22)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1673:19",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 57,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": null
- }
- },
- {
- "status": "fail",
- "startedAt": "2026-06-05T20:19:02.297Z",
- "endedAt": "2026-06-05T20:19:32.299Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-97026-aed6d5c1-230e-4223-ab28-36ab6db848ee-codec-vp9-with-h264",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-97026",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-97026",
- "subscriberIdentity": "fluxer-native-subscriber-97026",
- "required": true,
- "strict": true,
- "timeoutMs": 180000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 120000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "expectedScreenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "codec": "vp9",
- "expectedScreenCodec": "video/VP9",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "h264",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H264",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 24,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": null,
- "verbose": false,
- "scenarioName": "codec-vp9-with-h264",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": false
- },
- {
- "name": "subscriber connected",
- "pass": false
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 9",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 3",
- "pass": false
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": false
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "publisher local camera publication",
- "pass": false
- },
- {
- "name": "subscriber remote camera subscription",
- "pass": false
- },
- {
- "name": "publisher outbound camera stats",
- "pass": false
- },
- {
- "name": "secondary publisher connected",
- "pass": false
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare codec video/H264",
- "pass": false
- },
- {
- "name": "subscriber inbound secondary codec video/H264",
- "pass": false
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "subscriber data packet received",
- "pass": false
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/VP9",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/VP9",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1086:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1394:3)\n at async runScenarioSuite (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1610:19)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1639:22)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1673:19",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 57,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": null
- }
- },
- {
- "status": "fail",
- "startedAt": "2026-06-05T20:19:32.307Z",
- "endedAt": "2026-06-05T20:20:02.308Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-97026-aed6d5c1-230e-4223-ab28-36ab6db848ee-codec-h264-with-hevc",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-97026",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-97026",
- "subscriberIdentity": "fluxer-native-subscriber-97026",
- "required": true,
- "strict": true,
- "timeoutMs": 180000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 120000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "expectedScreenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "hevc",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H265",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 24,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": null,
- "verbose": false,
- "scenarioName": "codec-h264-with-hevc",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": false
- },
- {
- "name": "subscriber connected",
- "pass": false
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 9",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 3",
- "pass": false
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": false
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "publisher local camera publication",
- "pass": false
- },
- {
- "name": "subscriber remote camera subscription",
- "pass": false
- },
- {
- "name": "publisher outbound camera stats",
- "pass": false
- },
- {
- "name": "secondary publisher connected",
- "pass": false
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare codec video/H265",
- "pass": false
- },
- {
- "name": "subscriber inbound secondary codec video/H265",
- "pass": false
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "subscriber data packet received",
- "pass": false
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1086:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1394:3)\n at async runScenarioSuite (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1610:19)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1639:22)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1673:19",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 57,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": null
- }
- },
- {
- "status": "fail",
- "startedAt": "2026-06-05T20:20:02.316Z",
- "endedAt": "2026-06-05T20:20:32.317Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-97026-aed6d5c1-230e-4223-ab28-36ab6db848ee-codec-hevc-with-av1",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-97026",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-97026",
- "subscriberIdentity": "fluxer-native-subscriber-97026",
- "required": true,
- "strict": true,
- "timeoutMs": 180000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 120000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "expectedScreenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "codec": "hevc",
- "expectedScreenCodec": "video/H265",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "av1",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/AV1",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 24,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": null,
- "verbose": false,
- "scenarioName": "codec-hevc-with-av1",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": false
- },
- {
- "name": "subscriber connected",
- "pass": false
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 9",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 3",
- "pass": false
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": false
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "publisher local camera publication",
- "pass": false
- },
- {
- "name": "subscriber remote camera subscription",
- "pass": false
- },
- {
- "name": "publisher outbound camera stats",
- "pass": false
- },
- {
- "name": "secondary publisher connected",
- "pass": false
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare codec video/AV1",
- "pass": false
- },
- {
- "name": "subscriber inbound secondary codec video/AV1",
- "pass": false
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "subscriber data packet received",
- "pass": false
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/H265",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/H265",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1086:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1394:3)\n at async runScenarioSuite (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1610:19)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1639:22)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1673:19",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 57,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": null
- }
- },
- {
- "status": "fail",
- "startedAt": "2026-06-05T20:20:32.324Z",
- "endedAt": "2026-06-05T20:21:02.326Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:7880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-97026-aed6d5c1-230e-4223-ab28-36ab6db848ee-codec-av1-with-vp8",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-97026",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-97026",
- "subscriberIdentity": "fluxer-native-subscriber-97026",
- "required": true,
- "strict": true,
- "timeoutMs": 180000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 120000,
- "width": 3840,
- "height": 2160,
- "expectedWidth": 3840,
- "expectedHeight": 2160,
- "fps": 60,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "expectedScreenCodecs": ["vp8", "vp9", "h264", "hevc", "av1"],
- "codec": "av1",
- "expectedScreenCodec": "video/AV1",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 24,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 80000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "camera": true,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": null,
- "verbose": false,
- "scenarioName": "codec-av1-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": false
- },
- {
- "name": "subscriber connected",
- "pass": false
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 9",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 3",
- "pass": false
- },
- {
- "name": "subscriber video resolution 3840x2160",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": false
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "publisher local camera publication",
- "pass": false
- },
- {
- "name": "subscriber remote camera subscription",
- "pass": false
- },
- {
- "name": "publisher outbound camera stats",
- "pass": false
- },
- {
- "name": "secondary publisher connected",
- "pass": false
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": false
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": false
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": false
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "subscriber data packet received",
- "pass": false
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/AV1",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/AV1",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: connect timed out after 30000ms\n at file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1086:9\n at async runHarness (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1394:3)\n at async runScenarioSuite (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1610:19)\n at async main (file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1639:22)\n at async file:///Users/hampus/Development/fluxer/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs:1673:19",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 57,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "lastVideoMeta": null,
- "publisherStats": null,
- "secondaryPublisherStats": null,
- "subscriberStats": null
- }
- }
- ]
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-20260605T203103Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-20260605T203103Z.json
deleted file mode 100644
index 492c1cdfd..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-20260605T203103Z.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:31:04.019Z",
- "endedAt": "2026-06-05T20:31:15.493Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-98534-07955759-bfdc-4fc0-8941-6c23669306cb",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-98534",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-98534",
- "subscriberIdentity": "fluxer-native-subscriber-98534",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-20260605T203103Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 19.96 below 28.5; observed packet loss 1 exceeds 0",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 227,
- "strictAudioFrames": 0,
- "strictVideoFrames": 200,
- "videoCallbacks": 226,
- "videoBytes": 312422400,
- "receivedFps": 19.96,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 98,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 107,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 1,
- "videoResolutionCounts": {
- "1280x720": 200
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691464440,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780691475476,
- "elapsedMs": 11142,
- "producedFps": 29.8
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780691465483,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-98534",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VSCdbHfS7Qjnp9",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-98534",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_NeWDVeMforAq",
- "trackSid": "TR_VSCdbHfS7Qjnp9",
- "width": 1280,
- "height": 720,
- "timestampUs": 246321877000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VSCdbHfS7Qjnp9",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 28.5,
- "packetsLost": 0,
- "fps": 14,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 330,
- "outgoingVideoFramesAccepted": 330,
- "outgoingVideoFramesDropped": 100,
- "outgoingVideoFramesCoalesced": 100,
- "outgoingVideoFramesCaptured": 229,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 20.83,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "fps15",
- "adaptiveSendReason": "frameCoalescingPressure"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_NeWDVeMforAq",
- "trackSid": "TR_VSCdbHfS7Qjnp9",
- "kind": "video",
- "bitrateKbps": 30.5,
- "packetsLost": 1,
- "jitterMs": 4,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-adaptive-fixed-20260605T203523Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-adaptive-fixed-20260605T203523Z.json
deleted file mode 100644
index 18f379305..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-adaptive-fixed-20260605T203523Z.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:35:23.806Z",
- "endedAt": "2026-06-05T20:35:35.256Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-99020-a8faf4d3-b9ea-4425-b85e-484c3439bea8",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-99020",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-99020",
- "subscriberIdentity": "fluxer-native-subscriber-99020",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-adaptive-fixed-20260605T203523Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "observed packet loss 4 exceeds 0",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 314,
- "strictAudioFrames": 0,
- "strictVideoFrames": 287,
- "videoCallbacks": 314,
- "videoBytes": 434073600,
- "receivedFps": 28.89,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 65,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 174,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 4,
- "videoResolutionCounts": {
- "1280x720": 287
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691724194,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 38,
- "lastPushAtMs": 1780691735226,
- "elapsedMs": 11160,
- "producedFps": 29.75
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780691725246,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-99020",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VSNY7hqQXsYjDU",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-99020",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_4XVg8hrTERta",
- "trackSid": "TR_VSNY7hqQXsYjDU",
- "width": 1280,
- "height": 720,
- "timestampUs": 246581659000
- },
- "publisherStats": {
- "rttMs": null,
- "outbound": [
- {
- "trackSid": "TR_VSNY7hqQXsYjDU",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 29.1,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 330,
- "outgoingVideoFramesAccepted": 330,
- "outgoingVideoFramesDropped": 16,
- "outgoingVideoFramesCoalesced": 16,
- "outgoingVideoFramesCaptured": 314,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.49,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_4XVg8hrTERta",
- "trackSid": "TR_VSNY7hqQXsYjDU",
- "kind": "video",
- "bitrateKbps": 29.1,
- "packetsLost": 4,
- "jitterMs": 2,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-noadaptive-20260605T203134Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-noadaptive-20260605T203134Z.json
deleted file mode 100644
index c2c10f915..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-noadaptive-20260605T203134Z.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:31:34.574Z",
- "endedAt": "2026-06-05T20:31:45.998Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-98569-9a0c5b4a-c12c-4cce-97ba-5481af7273d4",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-98569",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-98569",
- "subscriberIdentity": "fluxer-native-subscriber-98569",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": false,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-noadaptive-20260605T203134Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 28.45 below 28.5",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 312,
- "strictAudioFrames": 0,
- "strictVideoFrames": 285,
- "videoCallbacks": 311,
- "videoBytes": 429926400,
- "receivedFps": 28.45,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 61,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 69,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "videoResolutionCounts": {
- "1280x720": 285
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691494944,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780691505978,
- "elapsedMs": 11144,
- "producedFps": 29.79
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780691495987,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-98569",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-98569",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VSnPVaEqt8wLKt",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_4H7SUk7TRbA7",
- "trackSid": "TR_VSnPVaEqt8wLKt",
- "width": 1280,
- "height": 720,
- "timestampUs": 246352378000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VSnPVaEqt8wLKt",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 28.1,
- "packetsLost": 0,
- "fps": 28,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 330,
- "outgoingVideoFramesAccepted": 330,
- "outgoingVideoFramesDropped": 17,
- "outgoingVideoFramesCoalesced": 17,
- "outgoingVideoFramesCaptured": 313,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.44,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "adaptiveDisabled"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_4H7SUk7TRbA7",
- "trackSid": "TR_VSnPVaEqt8wLKt",
- "kind": "video",
- "bitrateKbps": 28.1,
- "packetsLost": 0,
- "jitterMs": 3,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-paced-20260605T203257Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-paced-20260605T203257Z.json
deleted file mode 100644
index 5f29d01e5..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-paced-20260605T203257Z.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:32:57.846Z",
- "endedAt": "2026-06-05T20:33:09.335Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-98748-d3e8cf0e-bc5c-48e8-b5ef-ed0f993fbe86",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-98748",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-98748",
- "subscriberIdentity": "fluxer-native-subscriber-98748",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-paced-20260605T203257Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 20.11 below 28.5; observed packet loss 2 exceeds 0",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 226,
- "strictAudioFrames": 0,
- "strictVideoFrames": 201,
- "videoCallbacks": 225,
- "videoBytes": 311040000,
- "receivedFps": 20.11,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 173,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 173,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 2,
- "videoResolutionCounts": {
- "1280x720": 201
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691578281,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 35,
- "lastPushAtMs": 1780691589316,
- "elapsedMs": 11143,
- "producedFps": 29.79
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780691579324,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-98748",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-98748",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VS5AVMD9QiLw9T",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_wGf7jDpSGqVf",
- "trackSid": "TR_VS5AVMD9QiLw9T",
- "width": 1280,
- "height": 720,
- "timestampUs": 246435681000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VS5AVMD9QiLw9T",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 28.5,
- "packetsLost": 0,
- "fps": 14,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 330,
- "outgoingVideoFramesAccepted": 330,
- "outgoingVideoFramesDropped": 100,
- "outgoingVideoFramesCoalesced": 100,
- "outgoingVideoFramesCaptured": 230,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 20.87,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "fps15",
- "adaptiveSendReason": "frameCoalescingPressure"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_wGf7jDpSGqVf",
- "trackSid": "TR_VS5AVMD9QiLw9T",
- "kind": "video",
- "bitrateKbps": 28.5,
- "packetsLost": 2,
- "jitterMs": 2,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-strict-delta-20260605T203710Z.json b/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-strict-delta-20260605T203710Z.json
deleted file mode 100644
index 9554a3dfe..000000000
--- a/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-strict-delta-20260605T203710Z.json
+++ /dev/null
@@ -1,286 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T20:37:10.528Z",
- "endedAt": "2026-06-05T20:37:21.966Z",
- "platform": "darwin",
- "arch": "arm64",
- "config": {
- "url": "ws://127.0.0.1:17880",
- "serverApiUrl": "http://127.0.0.1:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-99097-fadf776d-a03a-42a1-92bc-c45de56c5a2c",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-99097",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-99097",
- "subscriberIdentity": "fluxer-native-subscriber-99097",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "fast",
- "videoInput": "nv12",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": false,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": false,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "/Users/hampus/Development/fluxer/fluxer_desktop/native-media-reports/mac-m3-ultra-livekit-video-only-strict-delta-20260605T203710Z.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 28.46 below 28.5",
- "hardwareEncoder": {
- "available": true,
- "backend": "videotoolbox",
- "compiled": true,
- "runtime": true,
- "codecs": ["h264", "h265"],
- "zeroCopy": false,
- "nativeInputs": [],
- "detail": "VideoToolbox can create hardware-accelerated compression sessions for h264, h265; supported hardware-codec probe set: h264, h265"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 310,
- "strictAudioFrames": 0,
- "strictVideoFrames": 285,
- "videoCallbacks": 309,
- "videoBytes": 427161600,
- "receivedFps": 28.46,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 63,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 69,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "1280x720": 285
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "nv12",
- "pattern": "fast",
- "targetFps": 30,
- "startedAtMs": 1780691830909,
- "stoppedAtMs": null,
- "framesPushed": 332,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 36,
- "lastPushAtMs": 1780691841942,
- "elapsedMs": 11151,
- "producedFps": 29.77
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780691831955,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-99097",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-99097",
- "trackCount": 1,
- "tracks": [
- {
- "sid": "TR_VSmHHYYxDdRMdt",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_ZYRki8TB8qqy",
- "trackSid": "TR_VSmHHYYxDdRMdt",
- "width": 1280,
- "height": 720,
- "timestampUs": 246688341000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VSmHHYYxDdRMdt",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 28.2,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 329,
- "outgoingVideoFramesAccepted": 329,
- "outgoingVideoFramesDropped": 16,
- "outgoingVideoFramesCoalesced": 16,
- "outgoingVideoFramesCaptured": 313,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.51,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 34,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_ZYRki8TB8qqy",
- "trackSid": "TR_VSmHHYYxDdRMdt",
- "kind": "video",
- "bitrateKbps": 27.3,
- "packetsLost": 0,
- "jitterMs": 3,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/h264-360p10-strict-single-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/h264-360p10-strict-single-20260605.json
deleted file mode 100644
index 7c19f3271..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/h264-360p10-strict-single-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T22:33:47.023Z",
- "endedAt": "2026-06-05T22:34:19.284Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-6084-b067b112-e82c-4f9b-a8e5-8c17b58ce892",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-6084",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-6084",
- "subscriberIdentity": "fluxer-native-subscriber-6084",
- "required": true,
- "strict": true,
- "timeoutMs": 120000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 30000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 10,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "h264",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H264",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 10,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 3000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\h264-360p10-strict-single-20260605.json",
- "verbose": false,
- "scenarioName": "codec-h264",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 9.43 below 9.5",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 6176,
- "inboundVideoFrames": 287,
- "strictAudioFrames": 299,
- "strictVideoFrames": 283,
- "videoCallbacks": 287,
- "videoBytes": 99187200,
- "receivedFps": 9.43,
- "requiredFps": 9.5,
- "maxVideoFrameGapMs": 204,
- "maxAudioFrameGapMs": 103,
- "maxVideoFrameGapOverallMs": 204,
- "maxAudioFrameGapOverallMs": 103,
- "avDriftMs": 4,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "640x360": 283
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 10,
- "startedAtMs": 1780698828184,
- "stoppedAtMs": null,
- "framesPushed": 311,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 103,
- "lastPushAtMs": 1780698859185,
- "elapsedMs": 31105,
- "producedFps": 10
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780698829266,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-6084",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSTAkE5Tyvf84k",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- },
- {
- "sid": "TR_AMR8qs636tXCeM",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsiQhtzQxKx3hg",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-6084",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_yWuJtiAsGJHk",
- "trackSid": "TR_VSTAkE5Tyvf84k",
- "width": 640,
- "height": 360,
- "timestampUs": 1737095000
- },
- "publisherStats": {
- "rttMs": 4,
- "outbound": [
- {
- "trackSid": "TR_AsiQhtzQxKx3hg",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 259.9,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMR8qs636tXCeM",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 99,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSTAkE5Tyvf84k",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1267,
- "packetsLost": 0,
- "fps": 11,
- "codec": "video/H264"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 310,
- "outgoingVideoFramesAccepted": 310,
- "outgoingVideoFramesDropped": 4,
- "outgoingVideoFramesCoalesced": 4,
- "outgoingVideoFramesCaptured": 306,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 9.87,
- "outgoingVideoTargetFps": 10,
- "outgoingVideoMaxQueueAgeMs": 100,
- "outgoingVideoMaxPushLatencyMs": 101,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 56,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 4,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_yWuJtiAsGJHk",
- "trackSid": "TR_AMR8qs636tXCeM",
- "kind": "audio",
- "bitrateKbps": 99,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.354,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_yWuJtiAsGJHk",
- "trackSid": "TR_VSTAkE5Tyvf84k",
- "kind": "video",
- "bitrateKbps": 1267,
- "packetsLost": 0,
- "jitterMs": 4,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_yWuJtiAsGJHk",
- "trackSid": "TR_AsiQhtzQxKx3hg",
- "kind": "audio",
- "bitrateKbps": 259.9,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/h264-360p15-strict-single-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/h264-360p15-strict-single-20260605.json
deleted file mode 100644
index 8cb3e81bd..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/h264-360p15-strict-single-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T22:32:58.250Z",
- "endedAt": "2026-06-05T22:33:30.493Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-4444-6d4fc834-c519-4a03-831b-1f3c4f7b8db5",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-4444",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-4444",
- "subscriberIdentity": "fluxer-native-subscriber-4444",
- "required": true,
- "strict": true,
- "timeoutMs": 120000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 30000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "h264",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H264",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\h264-360p15-strict-single-20260605.json",
- "verbose": false,
- "scenarioName": "codec-h264",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 11.83 below 14.25",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 6188,
- "inboundVideoFrames": 360,
- "strictAudioFrames": 299,
- "strictVideoFrames": 356,
- "videoCallbacks": 360,
- "videoBytes": 124416000,
- "receivedFps": 11.83,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 220,
- "maxAudioFrameGapMs": 115,
- "maxVideoFrameGapOverallMs": 220,
- "maxAudioFrameGapOverallMs": 115,
- "avDriftMs": 16,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "640x360": 356
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780698779365,
- "stoppedAtMs": null,
- "framesPushed": 467,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 87,
- "lastPushAtMs": 1780698810433,
- "elapsedMs": 31131,
- "producedFps": 15
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780698780443,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-4444",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-4444",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSu5oXdquxv9yn",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- },
- {
- "sid": "TR_AMw39xhBtq2iKo",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsUfFKczDubKFH",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_jmECWh8cUV8Z",
- "trackSid": "TR_VSu5oXdquxv9yn",
- "width": 640,
- "height": 360,
- "timestampUs": 1688313000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AsUfFKczDubKFH",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 263,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMw39xhBtq2iKo",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 97.9,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSu5oXdquxv9yn",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1957.3,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/H264"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 465,
- "outgoingVideoFramesAccepted": 465,
- "outgoingVideoFramesDropped": 9,
- "outgoingVideoFramesCoalesced": 9,
- "outgoingVideoFramesCaptured": 456,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 14.7,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 67,
- "outgoingVideoMaxPushLatencyMs": 68,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 45,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_jmECWh8cUV8Z",
- "trackSid": "TR_VSu5oXdquxv9yn",
- "kind": "video",
- "bitrateKbps": 1957.3,
- "packetsLost": 0,
- "jitterMs": 4,
- "codec": "video/H264"
- },
- {
- "participantSid": "PA_jmECWh8cUV8Z",
- "trackSid": "TR_AMw39xhBtq2iKo",
- "kind": "audio",
- "bitrateKbps": 97.9,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.33,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_jmECWh8cUV8Z",
- "trackSid": "TR_AsUfFKczDubKFH",
- "kind": "audio",
- "bitrateKbps": 263,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.342,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/h265-failfast-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/h265-failfast-20260605.json
deleted file mode 100644
index 78623222a..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/h265-failfast-20260605.json
+++ /dev/null
@@ -1,258 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T22:35:16.027Z",
- "endedAt": "2026-06-05T22:35:17.121Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-6712-42fbb624-d6ae-4495-80c6-f657bba60b68",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-6712",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-6712",
- "subscriberIdentity": "fluxer-native-subscriber-6712",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": false,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["h265"],
- "expectedScreenCodecs": ["h265"],
- "codec": "h265",
- "expectedScreenCodec": "video/H265",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "h265",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H265",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": false,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\h265-failfast-20260605.json",
- "verbose": false,
- "scenarioName": "codec-h265",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": false
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": false
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": false
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/H265",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/H265",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: H.265 publishing requires hardware encoder support; missing nvcuda.dll, nvEncodeAPI64.dll",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": null,
- "publisherStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/run-livekit.ps1 b/fluxer_desktop/native-media-reports/windows-parallels-arm64/run-livekit.ps1
deleted file mode 100644
index af93ad0d5..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/run-livekit.ps1
+++ /dev/null
@@ -1,96 +0,0 @@
-param(
- [string]$Scenario = "vp8-360p15-strict-single",
- [string]$Codec = "vp8",
- [string]$SecondaryCodec = "",
- [int]$Width = 640,
- [int]$Height = 360,
- [double]$Fps = 15,
- [int]$DurationMs = 10000,
- [int]$TimeoutMs = 60000,
- [int]$SecondPublisher = 0,
- [int]$ScreenSimulcast = 0,
- [int]$ScreenAudio = 1,
- [int]$Microphone = 1,
- [int]$SubscriptionCycle = 1,
- [int]$DataPacket = 1,
- [int]$ValidateServerPublishing = 1,
- [int]$RequireStableResolution = 1,
- [int]$MaxPacketLoss = 0,
- [int]$MaxAvDriftMs = 150,
- [int]$MaxFrameGapMs = 250,
- [int]$MaxAudioFrameGapMs = 250,
- [double]$MinReceivedFpsRatio = 0.95,
- [int]$MaxBitrateBps = 4000000,
- [string]$LiveKitUrl = "ws://100.79.83.54:17880",
- [string]$LiveKitApiUrl = "http://100.79.83.54:17880",
- [string]$ApiKey = "devkey",
- [string]$ApiSecret = "secret",
- [string]$NodeDir = "C:\nodejs\node-v24.16.0-win-arm64",
- [string]$WorkDir = "C:\f\fluxer_desktop\native\webrtc-sender",
- [string]$ReportDir = "C:\Mac\Home\Development\fluxer\fluxer_desktop\native-media-reports\windows-parallels-arm64",
- [int]$VerboseHarness = 0
-)
-
-$ErrorActionPreference = "Stop"
-$nodeExe = Join-Path $NodeDir "node.exe"
-if (-not (Test-Path $nodeExe)) {
- throw "Node executable not found: $nodeExe"
-}
-if (-not (Test-Path $WorkDir)) {
- throw "WorkDir not found: $WorkDir"
-}
-
-New-Item -ItemType Directory -Force -Path $ReportDir | Out-Null
-$reportPath = Join-Path $ReportDir "$Scenario.json"
-$logPath = Join-Path $ReportDir "$Scenario.log"
-Remove-Item -Force $reportPath, $logPath -ErrorAction SilentlyContinue
-
-$env:Path = "$NodeDir;$env:Path"
-$env:LIVEKIT_URL = $LiveKitUrl
-$env:LIVEKIT_API_URL = $LiveKitApiUrl
-$env:LIVEKIT_API_KEY = $ApiKey
-$env:LIVEKIT_API_SECRET = $ApiSecret
-$env:FLUXER_WEBRTC_SENDER_LIVEKIT_REQUIRED = "1"
-$env:LIVEKIT_HARNESS_STRICT = "1"
-$env:LIVEKIT_HARNESS_DURATION_MS = [string]$DurationMs
-$env:LIVEKIT_HARNESS_TIMEOUT_MS = [string]$TimeoutMs
-$env:LIVEKIT_CONNECT_TIMEOUT_MS = "30000"
-$env:LIVEKIT_SCREEN_WIDTH = [string]$Width
-$env:LIVEKIT_SCREEN_HEIGHT = [string]$Height
-$env:LIVEKIT_SCREEN_FPS = [string]$Fps
-$env:LIVEKIT_MIN_VIDEO_FPS = [string]([math]::Min(15, $Fps))
-$env:LIVEKIT_MIN_RECEIVED_FPS_RATIO = [string]$MinReceivedFpsRatio
-$env:LIVEKIT_SCREEN_CODEC = $Codec
-$env:LIVEKIT_SCREEN_SIMULCAST = [string]$ScreenSimulcast
-$env:LIVEKIT_ENABLE_SECOND_PUBLISHER = [string]$SecondPublisher
-$env:LIVEKIT_ENABLE_MICROPHONE = [string]$Microphone
-$env:LIVEKIT_ENABLE_SCREEN_AUDIO = [string]$ScreenAudio
-$env:LIVEKIT_ENABLE_SUBSCRIPTION_CYCLE = [string]$SubscriptionCycle
-$env:LIVEKIT_ENABLE_DATA_PACKET = [string]$DataPacket
-$env:LIVEKIT_VALIDATE_SERVER_PUBLISHING = [string]$ValidateServerPublishing
-$env:LIVEKIT_MAX_PACKET_LOSS = [string]$MaxPacketLoss
-$env:LIVEKIT_REQUIRE_STABLE_RESOLUTION = [string]$RequireStableResolution
-$env:LIVEKIT_MAX_AV_DRIFT_MS = [string]$MaxAvDriftMs
-$env:LIVEKIT_MAX_FRAME_GAP_MS = [string]$MaxFrameGapMs
-$env:LIVEKIT_MAX_AUDIO_FRAME_GAP_MS = [string]$MaxAudioFrameGapMs
-$env:LIVEKIT_SCREEN_MAX_BITRATE_BPS = [string]$MaxBitrateBps
-$env:LIVEKIT_HARNESS_REPORT_PATH = $reportPath
-$env:LIVEKIT_VERBOSE = [string]$VerboseHarness
-
-if ($SecondPublisher -ne 0 -and $SecondaryCodec.Trim().Length -gt 0) {
- $env:LIVEKIT_SECOND_PUBLISHER_SCREEN_CODEC = $SecondaryCodec
-}
-
-Set-Location $WorkDir
-"STARTED=$(Get-Date -Format o)" | Out-File -FilePath $logPath -Encoding utf8
-"& $nodeExe scripts/livekit-harness.mjs" | Add-Content -Path $logPath
-$previousErrorActionPreference = $ErrorActionPreference
-$ErrorActionPreference = "Continue"
-& $nodeExe "scripts/livekit-harness.mjs" *>> $logPath
-$code = $LASTEXITCODE
-$ErrorActionPreference = $previousErrorActionPreference
-"EXIT_CODE=$code" | Add-Content -Path $logPath
-"FINISHED=$(Get-Date -Format o)" | Add-Content -Path $logPath
-
-Get-Content -Path $logPath
-exit $code
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p15-strict-multipub-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p15-strict-multipub-20260605.json
deleted file mode 100644
index 3304af636..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p15-strict-multipub-20260605.json
+++ /dev/null
@@ -1,637 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T22:34:34.390Z",
- "endedAt": "2026-06-05T22:34:56.901Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-576-9baa1b50-b3f6-47dc-9222-bb3a324a8678",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-576",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-576",
- "subscriberIdentity": "fluxer-native-subscriber-576",
- "required": true,
- "strict": true,
- "timeoutMs": 120000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 20000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": true,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\vp8-360p15-strict-multipub-20260605.json",
- "verbose": false,
- "scenarioName": "codec-vp8-with-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 2",
- "pass": true
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 4",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 12",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "secondary publisher connected",
- "pass": true
- },
- {
- "name": "secondary publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screenshare subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound secondary codec video/VP8",
- "pass": true
- },
- {
- "name": "secondary publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary microphone subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "secondary publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote secondary screen-share audio subscription",
- "pass": true
- },
- {
- "name": "secondary publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "subscriber secondary data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees secondary publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 8386,
- "inboundVideoFrames": 605,
- "strictAudioFrames": 199,
- "strictVideoFrames": 588,
- "videoCallbacks": 605,
- "videoBytes": 209088000,
- "receivedFps": 29.42,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 129,
- "maxAudioFrameGapMs": 108,
- "maxVideoFrameGapOverallMs": 129,
- "maxAudioFrameGapOverallMs": 112,
- "avDriftMs": 5,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "640x360": 588
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780698875820,
- "stoppedAtMs": null,
- "framesPushed": 317,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 74,
- "lastPushAtMs": 1780698896886,
- "elapsedMs": 21084,
- "producedFps": 15.04
- },
- "secondaryPublisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780698875820,
- "stoppedAtMs": null,
- "framesPushed": 317,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 74,
- "lastPushAtMs": 1780698896888,
- "elapsedMs": 21084,
- "producedFps": 15.04
- },
- "serverPublishing": {
- "fetchedAtMs": 1780698876883,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-2-576",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AMafY4CpWgYhFy",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsEzCDkQT4wKAK",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSbd2RjXnY3stM",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-576",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-576",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSc4kF32666sNr",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMrQCsApajeKHi",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsX4E2jVX6P6XY",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_adnUMDZZHzat",
- "trackSid": "TR_VSc4kF32666sNr",
- "width": 640,
- "height": 360,
- "timestampUs": 1774721000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AsX4E2jVX6P6XY",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 258.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSc4kF32666sNr",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1259.5,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMrQCsApajeKHi",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.2,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_A8vwT8LTQovP",
- "trackSid": "TR_AMafY4CpWgYhFy",
- "kind": "audio",
- "bitrateKbps": 99.8,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_A8vwT8LTQovP",
- "trackSid": "TR_VSbd2RjXnY3stM",
- "kind": "video",
- "bitrateKbps": 1257.1,
- "packetsLost": 0,
- "jitterMs": 5,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_A8vwT8LTQovP",
- "trackSid": "TR_AsEzCDkQT4wKAK",
- "kind": "audio",
- "bitrateKbps": 264.5,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 310,
- "outgoingVideoFramesAccepted": 310,
- "outgoingVideoFramesDropped": 6,
- "outgoingVideoFramesCoalesced": 6,
- "outgoingVideoFramesCaptured": 304,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 14.7,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 67,
- "outgoingVideoMaxPushLatencyMs": 67,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 51,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": {
- "rttMs": 2,
- "outbound": [
- {
- "trackSid": "TR_AsEzCDkQT4wKAK",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 259.9,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSbd2RjXnY3stM",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1171.6,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMafY4CpWgYhFy",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.1,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [
- {
- "participantSid": "PA_adnUMDZZHzat",
- "trackSid": "TR_AsX4E2jVX6P6XY",
- "kind": "audio",
- "bitrateKbps": 259.2,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_adnUMDZZHzat",
- "trackSid": "TR_AMrQCsApajeKHi",
- "kind": "audio",
- "bitrateKbps": 98,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.326,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_adnUMDZZHzat",
- "trackSid": "TR_VSc4kF32666sNr",
- "kind": "video",
- "bitrateKbps": 1176.7,
- "packetsLost": 0,
- "jitterMs": 4,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 312,
- "outgoingVideoFramesAccepted": 312,
- "outgoingVideoFramesDropped": 6,
- "outgoingVideoFramesCoalesced": 6,
- "outgoingVideoFramesCaptured": 306,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 14.7,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 67,
- "outgoingVideoMaxPushLatencyMs": 68,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 51,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "subscriberStats": {
- "rttMs": 2,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_adnUMDZZHzat",
- "trackSid": "TR_AsX4E2jVX6P6XY",
- "kind": "audio",
- "bitrateKbps": 258.8,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_adnUMDZZHzat",
- "trackSid": "TR_VSc4kF32666sNr",
- "kind": "video",
- "bitrateKbps": 1259.5,
- "packetsLost": 0,
- "jitterMs": 4,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_adnUMDZZHzat",
- "trackSid": "TR_AMrQCsApajeKHi",
- "kind": "audio",
- "bitrateKbps": 98.2,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_A8vwT8LTQovP",
- "trackSid": "TR_AMafY4CpWgYhFy",
- "kind": "audio",
- "bitrateKbps": 99.7,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.306,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_A8vwT8LTQovP",
- "trackSid": "TR_AsEzCDkQT4wKAK",
- "kind": "audio",
- "bitrateKbps": 264.3,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_A8vwT8LTQovP",
- "trackSid": "TR_VSbd2RjXnY3stM",
- "kind": "video",
- "bitrateKbps": 1256,
- "packetsLost": 0,
- "jitterMs": 6,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p15-strict-single-smoke-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p15-strict-single-smoke-20260605.json
deleted file mode 100644
index a51360141..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p15-strict-single-smoke-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T22:30:31.342Z",
- "endedAt": "2026-06-05T22:30:43.694Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-3164-5cfbcff1-2827-441a-a57b-4333e450d829",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-3164",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-3164",
- "subscriberIdentity": "fluxer-native-subscriber-3164",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 4000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\vp8-360p15-strict-single-smoke-20260605.json",
- "verbose": true,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 2156,
- "inboundVideoFrames": 152,
- "strictAudioFrames": 100,
- "strictVideoFrames": 147,
- "videoCallbacks": 152,
- "videoBytes": 52531200,
- "receivedFps": 14.66,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 143,
- "maxAudioFrameGapMs": 105,
- "maxVideoFrameGapOverallMs": 143,
- "maxAudioFrameGapOverallMs": 325,
- "avDriftMs": 26,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "640x360": 147
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780698632580,
- "stoppedAtMs": null,
- "framesPushed": 163,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 355,
- "lastPushAtMs": 1780698643669,
- "elapsedMs": 11117,
- "producedFps": 14.66
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780698633676,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-3164",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-3164",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSD8qaPQikwWiL",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMMkiV8hg3XbkW",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsTaYjh3PSCFVz",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_fME8NrPiTu5d",
- "trackSid": "TR_VSD8qaPQikwWiL",
- "width": 640,
- "height": 360,
- "timestampUs": 1521475000
- },
- "publisherStats": {
- "rttMs": 3,
- "outbound": [
- {
- "trackSid": "TR_AMMkiV8hg3XbkW",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.9,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSD8qaPQikwWiL",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1233,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AsTaYjh3PSCFVz",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 256.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 161,
- "outgoingVideoFramesAccepted": 161,
- "outgoingVideoFramesDropped": 2,
- "outgoingVideoFramesCoalesced": 2,
- "outgoingVideoFramesCaptured": 158,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 14.36,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 66,
- "outgoingVideoMaxPushLatencyMs": 66,
- "outgoingAudioBufferTargetMs": 300,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 1,
- "outgoingAudioRebuffers": 1,
- "outgoingAudioMaxFrameGapMs": 316,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_fME8NrPiTu5d",
- "trackSid": "TR_VSD8qaPQikwWiL",
- "kind": "video",
- "bitrateKbps": 1158.7,
- "packetsLost": 0,
- "jitterMs": 22,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_fME8NrPiTu5d",
- "trackSid": "TR_AsTaYjh3PSCFVz",
- "kind": "audio",
- "bitrateKbps": 252.2,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_fME8NrPiTu5d",
- "trackSid": "TR_AMMkiV8hg3XbkW",
- "kind": "audio",
- "bitrateKbps": 99,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.332,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-reason-after-fix-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-reason-after-fix-20260605.json
deleted file mode 100644
index 544fd2b4d..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-reason-after-fix-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T22:39:23.612Z",
- "endedAt": "2026-06-05T22:39:35.835Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-8360-3df01e6b-06f6-4b3c-9e56-c691627bb305",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-8360",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-8360",
- "subscriberIdentity": "fluxer-native-subscriber-8360",
- "required": true,
- "strict": true,
- "timeoutMs": 60000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 10000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 5000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\vp8-360p30-reason-after-fix-20260605.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 2170,
- "inboundVideoFrames": 299,
- "strictAudioFrames": 99,
- "strictVideoFrames": 291,
- "videoCallbacks": 299,
- "videoBytes": 103334400,
- "receivedFps": 29.05,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 65,
- "maxAudioFrameGapMs": 109,
- "maxVideoFrameGapOverallMs": 195,
- "maxAudioFrameGapOverallMs": 109,
- "avDriftMs": 41,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "640x360": 291
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 30,
- "startedAtMs": 1780699164743,
- "stoppedAtMs": null,
- "framesPushed": 333,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 52,
- "lastPushAtMs": 1780699175812,
- "elapsedMs": 11095,
- "producedFps": 30.01
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780699165815,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-8360",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-8360",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AMSaSBEwb9cjwL",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_Ash3ybc8XXbukk",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSzotHy6zMQsRG",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_iYVBCmnrZuSb",
- "trackSid": "TR_VSzotHy6zMQsRG",
- "width": 640,
- "height": 360,
- "timestampUs": 2053643000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AMSaSBEwb9cjwL",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 99,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_Ash3ybc8XXbukk",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 265.1,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSzotHy6zMQsRG",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 2414.2,
- "packetsLost": 0,
- "fps": 29,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 329,
- "outgoingVideoFramesAccepted": 329,
- "outgoingVideoFramesDropped": 13,
- "outgoingVideoFramesCoalesced": 13,
- "outgoingVideoFramesCaptured": 316,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 28.84,
- "outgoingVideoTargetFps": 30,
- "outgoingVideoMaxQueueAgeMs": 34,
- "outgoingVideoMaxPushLatencyMs": 35,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 42,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_iYVBCmnrZuSb",
- "trackSid": "TR_Ash3ybc8XXbukk",
- "kind": "audio",
- "bitrateKbps": 265.1,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.318,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_iYVBCmnrZuSb",
- "trackSid": "TR_AMSaSBEwb9cjwL",
- "kind": "audio",
- "bitrateKbps": 99,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.324,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_iYVBCmnrZuSb",
- "trackSid": "TR_VSzotHy6zMQsRG",
- "kind": "video",
- "bitrateKbps": 2414.2,
- "packetsLost": 0,
- "jitterMs": 4,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-strict-single-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-strict-single-20260605.json
deleted file mode 100644
index f49735a53..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-strict-single-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T22:35:40.815Z",
- "endedAt": "2026-06-05T22:36:13.026Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-6332-943a2620-7cc8-4881-b1a9-6d8577e9c434",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-6332",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-6332",
- "subscriberIdentity": "fluxer-native-subscriber-6332",
- "required": true,
- "strict": true,
- "timeoutMs": 120000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 30000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 5000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\vp8-360p30-strict-single-20260605.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 15.03 below 28.5",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 6168,
- "inboundVideoFrames": 461,
- "strictAudioFrames": 299,
- "strictVideoFrames": 451,
- "videoCallbacks": 461,
- "videoBytes": 159321600,
- "receivedFps": 15.03,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 137,
- "maxAudioFrameGapMs": 110,
- "maxVideoFrameGapOverallMs": 137,
- "maxAudioFrameGapOverallMs": 110,
- "avDriftMs": 22,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "640x360": 451
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 30,
- "startedAtMs": 1780698941926,
- "stoppedAtMs": null,
- "framesPushed": 933,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 63,
- "lastPushAtMs": 1780698972994,
- "elapsedMs": 31105,
- "producedFps": 30
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780698943004,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-6332",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-6332",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSBtiuMi7Xz4iL",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AsSNqz63GYafY3",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AMjupdo38YrBp7",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_FcwLkjDchP7J",
- "trackSid": "TR_VSBtiuMi7Xz4iL",
- "width": 640,
- "height": 360,
- "timestampUs": 1850800000
- },
- "publisherStats": {
- "rttMs": 2,
- "outbound": [
- {
- "trackSid": "TR_AsSNqz63GYafY3",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 261.4,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMjupdo38YrBp7",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 99.5,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSBtiuMi7Xz4iL",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1258.5,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 930,
- "outgoingVideoFramesAccepted": 930,
- "outgoingVideoFramesDropped": 402,
- "outgoingVideoFramesCoalesced": 402,
- "outgoingVideoFramesCaptured": 527,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 17,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 62,
- "outgoingVideoMaxPushLatencyMs": 62,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 60,
- "adaptiveSendTier": "fps15",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 2,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_FcwLkjDchP7J",
- "trackSid": "TR_AsSNqz63GYafY3",
- "kind": "audio",
- "bitrateKbps": 261.4,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.319,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_FcwLkjDchP7J",
- "trackSid": "TR_AMjupdo38YrBp7",
- "kind": "audio",
- "bitrateKbps": 99.5,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.32,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_FcwLkjDchP7J",
- "trackSid": "TR_VSBtiuMi7Xz4iL",
- "kind": "video",
- "bitrateKbps": 1258.5,
- "packetsLost": 0,
- "jitterMs": 3,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-strict-single-after-fix-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-strict-single-after-fix-20260605.json
deleted file mode 100644
index 3a5e19297..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-360p30-strict-single-after-fix-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T22:39:58.041Z",
- "endedAt": "2026-06-05T22:40:30.271Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-3512-db87cf14-fb04-4daf-84ee-a577ef39b456",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-3512",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-3512",
- "subscriberIdentity": "fluxer-native-subscriber-3512",
- "required": true,
- "strict": true,
- "timeoutMs": 120000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 30000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 5000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\vp8-360p30-strict-single-after-fix-20260605.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 16.35 below 28.5",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 6178,
- "inboundVideoFrames": 503,
- "strictAudioFrames": 297,
- "strictVideoFrames": 490,
- "videoCallbacks": 503,
- "videoBytes": 173836800,
- "receivedFps": 16.35,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 244,
- "maxAudioFrameGapMs": 180,
- "maxVideoFrameGapOverallMs": 244,
- "maxAudioFrameGapOverallMs": 180,
- "avDriftMs": 60,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "640x360": 490
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 30,
- "startedAtMs": 1780699199141,
- "stoppedAtMs": null,
- "framesPushed": 931,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 155,
- "lastPushAtMs": 1780699230263,
- "elapsedMs": 31136,
- "producedFps": 29.9
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780699200252,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-3512",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSFLKMrtaZRUAL",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMTrMJygXoaHT8",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AseREdJhgwsKHc",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-3512",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_BbRoKiddPYPe",
- "trackSid": "TR_VSFLKMrtaZRUAL",
- "width": 640,
- "height": 360,
- "timestampUs": 2108079000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_VSFLKMrtaZRUAL",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1257.6,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AseREdJhgwsKHc",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 257.1,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AMTrMJygXoaHT8",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 99.1,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 927,
- "outgoingVideoFramesAccepted": 927,
- "outgoingVideoFramesDropped": 405,
- "outgoingVideoFramesCoalesced": 405,
- "outgoingVideoFramesCaptured": 521,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 16.8,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 74,
- "outgoingVideoMaxPushLatencyMs": 76,
- "outgoingAudioBufferTargetMs": 300,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 1,
- "outgoingAudioMaxFrameGapMs": 153,
- "adaptiveSendTier": "fps15",
- "adaptiveSendReason": "sendLatencyPressure"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 1,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_BbRoKiddPYPe",
- "trackSid": "TR_AseREdJhgwsKHc",
- "kind": "audio",
- "bitrateKbps": 252.8,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.337,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_BbRoKiddPYPe",
- "trackSid": "TR_VSFLKMrtaZRUAL",
- "kind": "video",
- "bitrateKbps": 1169,
- "packetsLost": 0,
- "jitterMs": 3,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_BbRoKiddPYPe",
- "trackSid": "TR_AMTrMJygXoaHT8",
- "kind": "audio",
- "bitrateKbps": 97.5,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.315,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-720p15-strict-single-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-720p15-strict-single-20260605.json
deleted file mode 100644
index 95b68bfe1..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-720p15-strict-single-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T22:31:55.148Z",
- "endedAt": "2026-06-05T22:32:27.616Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-1340-0367e318-dcfc-498a-8724-0c3982583d5d",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-1340",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-1340",
- "subscriberIdentity": "fluxer-native-subscriber-1340",
- "required": true,
- "strict": true,
- "timeoutMs": 120000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 30000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 8000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\vp8-720p15-strict-single-20260605.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 11.06 below 14.25; max video frame gap 363ms exceeds 250ms",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 6230,
- "inboundVideoFrames": 334,
- "strictAudioFrames": 298,
- "strictVideoFrames": 331,
- "videoCallbacks": 334,
- "videoBytes": 461721600,
- "receivedFps": 11.06,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 363,
- "maxAudioFrameGapMs": 108,
- "maxVideoFrameGapOverallMs": 363,
- "maxAudioFrameGapOverallMs": 108,
- "avDriftMs": 38,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "1280x720": 331
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780698716263,
- "stoppedAtMs": null,
- "framesPushed": 471,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 93,
- "lastPushAtMs": 1780698747600,
- "elapsedMs": 31355,
- "producedFps": 15.02
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780698717342,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-1340",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-1340",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VSYp54vvSodQtk",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMtAPT5gLdZFiG",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsyzCPFpjfCZ52",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_f3pUVwWqpSf9",
- "trackSid": "TR_VSYp54vvSodQtk",
- "width": 1280,
- "height": 720,
- "timestampUs": 1625403000
- },
- "publisherStats": {
- "rttMs": 3,
- "outbound": [
- {
- "trackSid": "TR_AsyzCPFpjfCZ52",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 324.8,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSYp54vvSodQtk",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 5042,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMtAPT5gLdZFiG",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 99.4,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 465,
- "outgoingVideoFramesAccepted": 465,
- "outgoingVideoFramesDropped": 9,
- "outgoingVideoFramesCoalesced": 9,
- "outgoingVideoFramesCaptured": 456,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 14.71,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 66,
- "outgoingVideoMaxPushLatencyMs": 68,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 47,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 3,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_f3pUVwWqpSf9",
- "trackSid": "TR_AMtAPT5gLdZFiG",
- "kind": "audio",
- "bitrateKbps": 99.4,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.32,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_f3pUVwWqpSf9",
- "trackSid": "TR_VSYp54vvSodQtk",
- "kind": "video",
- "bitrateKbps": 5042,
- "packetsLost": 0,
- "jitterMs": 33,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_f3pUVwWqpSf9",
- "trackSid": "TR_AsyzCPFpjfCZ52",
- "kind": "audio",
- "bitrateKbps": 324.8,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.344,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-720p30-strict-single-20260605.json b/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-720p30-strict-single-20260605.json
deleted file mode 100644
index 303c49299..000000000
--- a/fluxer_desktop/native-media-reports/windows-parallels-arm64/vp8-720p30-strict-single-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T22:30:59.267Z",
- "endedAt": "2026-06-05T22:31:31.489Z",
- "platform": "win32",
- "arch": "arm64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-5096-0b21498f-6c31-4ed8-8e45-930895fdc2d2",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-5096",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-5096",
- "subscriberIdentity": "fluxer-native-subscriber-5096",
- "required": true,
- "strict": true,
- "timeoutMs": 120000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 30000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": 0,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 8000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\Mac\\Home\\Development\\fluxer\\fluxer_desktop\\native-media-reports\\windows-parallels-arm64\\vp8-720p30-strict-single-20260605.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 15.97 below 28.5",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "runtime_prerequisite_missing",
- "detail": "missing nvcuda.dll, nvEncodeAPI64.dll"
- },
- "metrics": {
- "inboundAudioFrames": 6178,
- "inboundVideoFrames": 482,
- "strictAudioFrames": 298,
- "strictVideoFrames": 479,
- "videoCallbacks": 482,
- "videoBytes": 666316800,
- "receivedFps": 15.97,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 102,
- "maxAudioFrameGapMs": 130,
- "maxVideoFrameGapOverallMs": 168,
- "maxAudioFrameGapOverallMs": 130,
- "avDriftMs": 43,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "1280x720": 479
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 30,
- "startedAtMs": 1780698660405,
- "stoppedAtMs": null,
- "framesPushed": 933,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 68,
- "lastPushAtMs": 1780698691475,
- "elapsedMs": 31087,
- "producedFps": 30.01
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780698661479,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-subscriber-5096",
- "trackCount": 0,
- "tracks": []
- },
- {
- "identity": "fluxer-native-publisher-5096",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_VS2iFXiujdx95V",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- },
- {
- "sid": "TR_AMNf9uVyTmBcZy",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsZpfieifQxEYA",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- }
- ]
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_XJp9ZzhWYzHd",
- "trackSid": "TR_VS2iFXiujdx95V",
- "width": 1280,
- "height": 720,
- "timestampUs": 1569321000
- },
- "publisherStats": {
- "rttMs": 1,
- "outbound": [
- {
- "trackSid": "TR_AMNf9uVyTmBcZy",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 98.4,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_AsZpfieifQxEYA",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 269.5,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VS2iFXiujdx95V",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 5155.1,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/VP8"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 930,
- "outgoingVideoFramesAccepted": 930,
- "outgoingVideoFramesDropped": 403,
- "outgoingVideoFramesCoalesced": 403,
- "outgoingVideoFramesCaptured": 526,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 16.97,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 45,
- "outgoingVideoMaxPushLatencyMs": 46,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 57,
- "adaptiveSendTier": "fps15",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 3,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_XJp9ZzhWYzHd",
- "trackSid": "TR_VS2iFXiujdx95V",
- "kind": "video",
- "bitrateKbps": 5155.1,
- "packetsLost": 0,
- "jitterMs": 11,
- "codec": "video/VP8"
- },
- {
- "participantSid": "PA_XJp9ZzhWYzHd",
- "trackSid": "TR_AsZpfieifQxEYA",
- "kind": "audio",
- "bitrateKbps": 269.5,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_XJp9ZzhWYzHd",
- "trackSid": "TR_AMNf9uVyTmBcZy",
- "kind": "audio",
- "bitrateKbps": 98.4,
- "packetsLost": 0,
- "jitterMs": 1,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-h264-single-egress-adaptive-20260605.json b/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-h264-single-egress-adaptive-20260605.json
deleted file mode 100644
index dfa811eab..000000000
--- a/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-h264-single-egress-adaptive-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T21:57:48.945Z",
- "endedAt": "2026-06-05T21:58:12.868Z",
- "platform": "win32",
- "arch": "x64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-1272-581b0bd8-4044-45a9-bb0d-695ca988d59c",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-1272",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-1272",
- "subscriberIdentity": "fluxer-native-subscriber-1272",
- "required": true,
- "strict": true,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 20000,
- "width": 1280,
- "height": 720,
- "expectedWidth": 1280,
- "expectedHeight": 720,
- "fps": 30,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 80,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["h264"],
- "expectedScreenCodecs": ["h264"],
- "codec": "h264",
- "expectedScreenCodec": "video/H264",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "h264",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H264",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 5000000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\f\\fluxer_desktop\\native\\webrtc-sender\\native-media-reports\\windows-mx450-livekit-h264-single-egress-adaptive-20260605.json",
- "verbose": false,
- "scenarioName": "codec-h264",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 1280x720",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/H264",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/H264",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": "received FPS 6.59 below 28.5; max video frame gap 552ms exceeds 250ms",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "no_supported_devices",
- "detail": "missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))"
- },
- "metrics": {
- "inboundAudioFrames": 4315,
- "inboundVideoFrames": 136,
- "strictAudioFrames": 199,
- "strictVideoFrames": 132,
- "videoCallbacks": 135,
- "videoBytes": 186624000,
- "receivedFps": 6.59,
- "requiredFps": 28.5,
- "maxVideoFrameGapMs": 552,
- "maxAudioFrameGapMs": 112,
- "maxVideoFrameGapOverallMs": 557,
- "maxAudioFrameGapOverallMs": 112,
- "avDriftMs": 22,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "1280x720": 132
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 30,
- "startedAtMs": 1780696671200,
- "stoppedAtMs": null,
- "framesPushed": 650,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 64,
- "lastPushAtMs": 1780696692841,
- "elapsedMs": 21772,
- "producedFps": 29.85
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780696672853,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-1272",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AM3TQzwbFTcoXT",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_AsW4JLnmWG6cce",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VSxrpLn4EJfUEg",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/H264",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-1272",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_7EoucgabpBG8",
- "trackSid": "TR_VSxrpLn4EJfUEg",
- "width": 1280,
- "height": 720,
- "timestampUs": 3306206000
- },
- "publisherStats": {
- "rttMs": 15,
- "outbound": [
- {
- "trackSid": "TR_AM3TQzwbFTcoXT",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 95.3,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VSxrpLn4EJfUEg",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 5106.2,
- "packetsLost": 0,
- "fps": 11,
- "codec": "video/H264"
- },
- {
- "trackSid": "TR_AsW4JLnmWG6cce",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 300.6,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 627,
- "outgoingVideoFramesAccepted": 627,
- "outgoingVideoFramesDropped": 262,
- "outgoingVideoFramesCoalesced": 262,
- "outgoingVideoFramesCaptured": 364,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 17.42,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 35,
- "outgoingVideoMaxPushLatencyMs": 42,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 63,
- "adaptiveSendTier": "fps15",
- "adaptiveSendReason": "encoderEgressPressure"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 18,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_7EoucgabpBG8",
- "trackSid": "TR_AsW4JLnmWG6cce",
- "kind": "audio",
- "bitrateKbps": 296.3,
- "packetsLost": 0,
- "jitterMs": 6,
- "audioLevel": 0.336,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_7EoucgabpBG8",
- "trackSid": "TR_AM3TQzwbFTcoXT",
- "kind": "audio",
- "bitrateKbps": 97.1,
- "packetsLost": 0,
- "jitterMs": 7,
- "audioLevel": 0.326,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_7EoucgabpBG8",
- "trackSid": "TR_VSxrpLn4EJfUEg",
- "kind": "video",
- "bitrateKbps": 5397.8,
- "packetsLost": 0,
- "jitterMs": 48,
- "codec": "video/H264"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-hevc-failfast-20260605.json b/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-hevc-failfast-20260605.json
deleted file mode 100644
index 9507172d7..000000000
--- a/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-hevc-failfast-20260605.json
+++ /dev/null
@@ -1,246 +0,0 @@
-{
- "status": "fail",
- "startedAt": "2026-06-05T22:00:49.164Z",
- "endedAt": "2026-06-05T22:00:50.336Z",
- "platform": "win32",
- "arch": "x64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-3456-3aa0da22-e543-4846-a980-1ef479694d1f",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-3456",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-3456",
- "subscriberIdentity": "fluxer-native-subscriber-3456",
- "required": true,
- "strict": false,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 0,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 15,
- "minFpsRatio": 0,
- "maxFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxAvDriftMs": 0,
- "maxPacketLoss": null,
- "requireStableResolution": false,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": null,
- "screenCodecs": ["hevc"],
- "expectedScreenCodecs": ["hevc"],
- "codec": "hevc",
- "expectedScreenCodec": "video/H265",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "hevc",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/H265",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": true,
- "secondaryPublisherScreenSimulcast": true,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": false,
- "maxBitrateBps": 400000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": false,
- "dataPacket": false,
- "subscriptionCycle": false,
- "validateServerPublishing": false,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\f\\fluxer_desktop\\native\\webrtc-sender\\native-media-reports\\windows-mx450-livekit-hevc-failfast-20260605.json",
- "verbose": false,
- "scenarioName": "codec-hevc",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": false
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": false
- },
- {
- "name": "subscriber video frame callback",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats",
- "pass": false
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": false
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": false
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 3",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats count >= 1",
- "pass": false
- },
- {
- "name": "publisher local microphone publication",
- "pass": false
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": false
- },
- {
- "name": "subscriber inbound audio frames >= 3",
- "pass": false
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": false
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": false
- },
- {
- "name": "publisher outbound screenshare codec video/H265",
- "pass": false
- },
- {
- "name": "subscriber inbound video codec video/H265",
- "pass": false
- }
- ],
- "skippedReason": null,
- "error": "Error: H.265 publishing requires hardware encoder support; missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))",
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "no_supported_devices",
- "detail": "missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))"
- },
- "metrics": {
- "inboundAudioFrames": 0,
- "inboundVideoFrames": 0,
- "strictAudioFrames": 0,
- "strictVideoFrames": 0,
- "videoCallbacks": 0,
- "videoBytes": 0,
- "receivedFps": 0,
- "requiredFps": null,
- "maxVideoFrameGapMs": 0,
- "maxAudioFrameGapMs": 0,
- "maxVideoFrameGapOverallMs": 0,
- "maxAudioFrameGapOverallMs": 0,
- "avDriftMs": null,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {},
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": null,
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": null,
- "error": null,
- "participants": []
- },
- "lastVideoMeta": null,
- "publisherStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": null,
- "outbound": [],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-vp8-360p15-strict-av150-20260605.json b/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-vp8-360p15-strict-av150-20260605.json
deleted file mode 100644
index dd637aa2c..000000000
--- a/fluxer_desktop/native-media-reports/windows/windows-mx450-livekit-vp8-360p15-strict-av150-20260605.json
+++ /dev/null
@@ -1,391 +0,0 @@
-{
- "status": "pass",
- "startedAt": "2026-06-05T22:00:19.291Z",
- "endedAt": "2026-06-05T22:00:37.423Z",
- "platform": "win32",
- "arch": "x64",
- "config": {
- "url": "ws://100.79.83.54:17880",
- "serverApiUrl": "http://100.79.83.54:17880",
- "apiKey": "devkey",
- "room": "fluxer-webrtc-harness-6872-db238db9-c867-4b03-8af9-9740942a674c",
- "externalTokens": false,
- "publisherIdentity": "fluxer-native-publisher-6872",
- "secondaryPublisherIdentity": "fluxer-native-publisher-2-6872",
- "subscriberIdentity": "fluxer-native-subscriber-6872",
- "required": true,
- "strict": true,
- "timeoutMs": 30000,
- "connectTimeoutMs": 30000,
- "disconnectTimeoutMs": 10000,
- "probeTimeoutMs": 1500,
- "durationMs": 15000,
- "width": 640,
- "height": 360,
- "expectedWidth": 640,
- "expectedHeight": 360,
- "fps": 15,
- "minFpsRatio": 0.95,
- "maxFrameGapMs": 250,
- "maxAudioFrameGapMs": 250,
- "maxAvDriftMs": 150,
- "maxPacketLoss": null,
- "requireStableResolution": true,
- "videoPattern": "gradient",
- "videoInput": "bgra",
- "subscriberVideoQuality": "high",
- "screenCodecs": ["vp8"],
- "expectedScreenCodecs": ["vp8"],
- "codec": "vp8",
- "expectedScreenCodec": "video/VP8",
- "secondaryPublisher": false,
- "secondaryPublisherCodec": "vp8",
- "secondaryPublisherCodecExplicit": false,
- "expectedSecondaryPublisherCodec": "video/VP8",
- "expectedSecondaryPublisherCodecExplicit": false,
- "screenSimulcast": false,
- "secondaryPublisherScreenSimulcast": false,
- "adaptiveSend": true,
- "minVideoFps": 15,
- "minResolutionScale": 0.5,
- "maxAudioBufferMs": 750,
- "secondaryPublisherMicrophone": true,
- "secondaryPublisherScreenAudio": true,
- "maxBitrateBps": 1200000,
- "sampleRate": 48000,
- "channels": 1,
- "audioChunkMs": 20,
- "microphone": true,
- "screenAudio": true,
- "dataPacket": true,
- "subscriptionCycle": true,
- "validateServerPublishing": true,
- "camera": false,
- "cameraDeviceId": null,
- "expectedCameraCodec": null,
- "expectedHardwareEncoder": null,
- "reportPath": "C:\\f\\fluxer_desktop\\native\\webrtc-sender\\native-media-reports\\windows-mx450-livekit-vp8-360p15-strict-av150-20260605.json",
- "verbose": false,
- "scenarioName": "codec-vp8",
- "apiSecret": "",
- "e2eeKey": null,
- "publisherToken": null,
- "secondaryPublisherToken": null,
- "subscriberToken": null
- },
- "checks": [
- {
- "name": "publisher connected",
- "pass": true
- },
- {
- "name": "subscriber connected",
- "pass": true
- },
- {
- "name": "publisher local screenshare publication",
- "pass": true
- },
- {
- "name": "subscriber remote screenshare subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound video frames >= 3",
- "pass": true
- },
- {
- "name": "subscriber video frame callback",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats",
- "pass": true
- },
- {
- "name": "subscriber inbound video stats count >= 1",
- "pass": true
- },
- {
- "name": "subscriber video resolution 640x360",
- "pass": true
- },
- {
- "name": "subscriber aggregate inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats count >= 2",
- "pass": true
- },
- {
- "name": "publisher local microphone publication",
- "pass": true
- },
- {
- "name": "subscriber remote microphone subscription",
- "pass": true
- },
- {
- "name": "subscriber inbound audio frames >= 6",
- "pass": true
- },
- {
- "name": "publisher outbound microphone stats",
- "pass": true
- },
- {
- "name": "subscriber inbound audio stats",
- "pass": true
- },
- {
- "name": "publisher local screen-share audio publication",
- "pass": true
- },
- {
- "name": "subscriber remote screen-share audio subscription",
- "pass": true
- },
- {
- "name": "publisher outbound screen-share audio stats",
- "pass": true
- },
- {
- "name": "subscriber data packet received",
- "pass": true
- },
- {
- "name": "publisher outbound screenshare codec video/VP8",
- "pass": true
- },
- {
- "name": "subscriber inbound video codec video/VP8",
- "pass": true
- },
- {
- "name": "server publishing API participants listed",
- "pass": true
- },
- {
- "name": "server sees publisher screenshare publication",
- "pass": true
- },
- {
- "name": "server sees publisher microphone publication",
- "pass": true
- },
- {
- "name": "server sees publisher screen-share audio publication",
- "pass": true
- }
- ],
- "skippedReason": null,
- "error": null,
- "hardwareEncoder": {
- "available": false,
- "backend": "none",
- "compiled": true,
- "runtime": false,
- "codecs": [],
- "zeroCopy": false,
- "nativeInputs": [],
- "reason": "no_supported_devices",
- "detail": "missing NVENC encode session (checked 1 CUDA device; last status NV_ENC_ERR_UNSUPPORTED_DEVICE (2))"
- },
- "metrics": {
- "inboundAudioFrames": 3201,
- "inboundVideoFrames": 236,
- "strictAudioFrames": 150,
- "strictVideoFrames": 221,
- "videoCallbacks": 235,
- "videoBytes": 81216000,
- "receivedFps": 14.71,
- "requiredFps": 14.25,
- "maxVideoFrameGapMs": 135,
- "maxAudioFrameGapMs": 104,
- "maxVideoFrameGapOverallMs": 135,
- "maxAudioFrameGapOverallMs": 104,
- "avDriftMs": 15,
- "maxObservedPacketLoss": 0,
- "maxObservedPacketLossDelta": 0,
- "videoResolutionCounts": {
- "640x360": 221
- },
- "videoResolutionMismatchCount": 0,
- "droppedVideoFrameCallbacks": 0,
- "publisherVideoPump": {
- "input": "bgra",
- "pattern": "gradient",
- "targetFps": 15,
- "startedAtMs": 1780696821343,
- "stoppedAtMs": null,
- "framesPushed": 242,
- "framesRejected": 0,
- "errors": 0,
- "maxPushGapMs": 81,
- "lastPushAtMs": 1780696837414,
- "elapsedMs": 16181,
- "producedFps": 14.96
- },
- "secondaryPublisherVideoPump": null,
- "serverPublishing": {
- "fetchedAtMs": 1780696822415,
- "error": null,
- "participants": [
- {
- "identity": "fluxer-native-publisher-6872",
- "trackCount": 3,
- "tracks": [
- {
- "sid": "TR_AMZncs3mMUV8XL",
- "name": "mic",
- "kind": "audio",
- "source": "microphone",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_As8q693K2N6RV2",
- "name": "screen-audio",
- "kind": "audio",
- "source": "screenshareAudio",
- "mimeType": "audio/red",
- "muted": false
- },
- {
- "sid": "TR_VScEzJLWokWJcx",
- "name": "screen",
- "kind": "video",
- "source": "screenshare",
- "mimeType": "video/VP8",
- "muted": false
- }
- ]
- },
- {
- "identity": "fluxer-native-subscriber-6872",
- "trackCount": 0,
- "tracks": []
- }
- ]
- },
- "lastVideoMeta": {
- "participantSid": "PA_EeCfpcRvJPEF",
- "trackSid": "TR_VScEzJLWokWJcx",
- "width": 640,
- "height": 360,
- "timestampUs": 3450776000
- },
- "publisherStats": {
- "rttMs": 4,
- "outbound": [
- {
- "trackSid": "TR_As8q693K2N6RV2",
- "source": "screenshareAudio",
- "kind": "audio",
- "bitrateKbps": 263.5,
- "packetsLost": 0,
- "codec": "audio/opus"
- },
- {
- "trackSid": "TR_VScEzJLWokWJcx",
- "source": "screenshare",
- "kind": "video",
- "bitrateKbps": 1233.4,
- "packetsLost": 0,
- "fps": 15,
- "codec": "video/VP8"
- },
- {
- "trackSid": "TR_AMZncs3mMUV8XL",
- "source": "microphone",
- "kind": "audio",
- "bitrateKbps": 97.9,
- "packetsLost": 0,
- "codec": "audio/opus"
- }
- ],
- "inbound": [],
- "send": {
- "outgoingVideoQueueDepth": 1,
- "outgoingVideoFramesProduced": 241,
- "outgoingVideoFramesAccepted": 241,
- "outgoingVideoFramesDropped": 4,
- "outgoingVideoFramesCoalesced": 4,
- "outgoingVideoFramesCaptured": 236,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 14.71,
- "outgoingVideoTargetFps": 15,
- "outgoingVideoMaxQueueAgeMs": 67,
- "outgoingVideoMaxPushLatencyMs": 69,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 36,
- "adaptiveSendTier": "full",
- "adaptiveSendReason": "stable"
- }
- },
- "secondaryPublisherStats": null,
- "subscriberStats": {
- "rttMs": 4,
- "outbound": [],
- "inbound": [
- {
- "participantSid": "PA_EeCfpcRvJPEF",
- "trackSid": "TR_As8q693K2N6RV2",
- "kind": "audio",
- "bitrateKbps": 263.1,
- "packetsLost": 0,
- "jitterMs": 3,
- "audioLevel": 0.318,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_EeCfpcRvJPEF",
- "trackSid": "TR_AMZncs3mMUV8XL",
- "kind": "audio",
- "bitrateKbps": 97.8,
- "packetsLost": 0,
- "jitterMs": 2,
- "audioLevel": 0.307,
- "codec": "audio/opus"
- },
- {
- "participantSid": "PA_EeCfpcRvJPEF",
- "trackSid": "TR_VScEzJLWokWJcx",
- "kind": "video",
- "bitrateKbps": 1231.8,
- "packetsLost": 0,
- "jitterMs": 4,
- "codec": "video/VP8"
- }
- ],
- "send": {
- "outgoingVideoQueueDepth": 0,
- "outgoingVideoFramesProduced": 0,
- "outgoingVideoFramesAccepted": 0,
- "outgoingVideoFramesDropped": 0,
- "outgoingVideoFramesCoalesced": 0,
- "outgoingVideoFramesCaptured": 0,
- "outgoingVideoCaptureFailures": 0,
- "outgoingVideoEffectiveFps": 0,
- "outgoingVideoTargetFps": 0,
- "outgoingVideoMaxQueueAgeMs": 0,
- "outgoingVideoMaxPushLatencyMs": 0,
- "outgoingAudioBufferTargetMs": 200,
- "outgoingAudioBufferMaxMs": 750,
- "outgoingAudioUnderruns": 0,
- "outgoingAudioRebuffers": 0,
- "outgoingAudioMaxFrameGapMs": 0,
- "adaptiveSendTier": "idle",
- "adaptiveSendReason": "notPublishing"
- }
- }
- }
-}
diff --git a/fluxer_desktop/native/encoder-ring/Cargo.lock b/fluxer_desktop/native/encoder-ring/Cargo.lock
index ac94faa37..a6c4e1483 100644
--- a/fluxer_desktop/native/encoder-ring/Cargo.lock
+++ b/fluxer_desktop/native/encoder-ring/Cargo.lock
@@ -64,15 +64,6 @@ version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
-[[package]]
-name = "block2"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
-dependencies = [
- "objc2",
-]
-
[[package]]
name = "bumpalo"
version = "3.20.3"
@@ -239,16 +230,6 @@ version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
-[[package]]
-name = "dispatch2"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
-dependencies = [
- "bitflags",
- "objc2",
-]
-
[[package]]
name = "either"
version = "1.16.0"
@@ -268,10 +249,6 @@ dependencies = [
"bindgen",
"criterion",
"libloading 0.9.0",
- "objc2",
- "objc2-core-foundation",
- "objc2-core-video",
- "objc2-io-surface",
"windows",
]
@@ -405,96 +382,6 @@ dependencies = [
"autocfg",
]
-[[package]]
-name = "objc2"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f"
-dependencies = [
- "objc2-encode",
-]
-
-[[package]]
-name = "objc2-core-foundation"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
-dependencies = [
- "bitflags",
- "block2",
- "dispatch2",
- "libc",
- "objc2",
-]
-
-[[package]]
-name = "objc2-core-graphics"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
-dependencies = [
- "bitflags",
- "dispatch2",
- "objc2",
- "objc2-core-foundation",
- "objc2-io-surface",
-]
-
-[[package]]
-name = "objc2-core-video"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"
-dependencies = [
- "bitflags",
- "block2",
- "objc2",
- "objc2-core-foundation",
- "objc2-core-graphics",
- "objc2-io-surface",
- "objc2-metal",
-]
-
-[[package]]
-name = "objc2-encode"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
-
-[[package]]
-name = "objc2-foundation"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
-dependencies = [
- "bitflags",
- "objc2",
-]
-
-[[package]]
-name = "objc2-io-surface"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
-dependencies = [
- "bitflags",
- "libc",
- "objc2",
- "objc2-core-foundation",
- "objc2-foundation",
-]
-
-[[package]]
-name = "objc2-metal"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794"
-dependencies = [
- "bitflags",
- "objc2",
- "objc2-foundation",
-]
-
[[package]]
name = "once_cell"
version = "1.21.4"
diff --git a/fluxer_desktop/native/encoder-ring/Cargo.toml b/fluxer_desktop/native/encoder-ring/Cargo.toml
index d2f0c84c0..e5376af91 100644
--- a/fluxer_desktop/native/encoder-ring/Cargo.toml
+++ b/fluxer_desktop/native/encoder-ring/Cargo.toml
@@ -36,12 +36,6 @@ bindgen-sdk = ["dep:bindgen"]
[dev-dependencies]
criterion = "0.8"
-[target.'cfg(target_os = "macos")'.dev-dependencies]
-objc2 = "0.6"
-objc2-core-video = {version = "0.3", features = ["CVPixelBuffer", "CVPixelBufferIOSurface", "CVImageBuffer", "CVBuffer", "CVPixelFormatDescription", "CVReturn", "CVBase", "objc2-io-surface"]}
-objc2-core-foundation = {version = "0.3", features = ["CFDictionary", "CFNumber", "CFString", "CFBase"]}
-objc2-io-surface = {version = "0.3", features = ["IOSurfaceRef", "objc2-core-foundation"]}
-
[[bench]]
name = "ring"
harness = false
diff --git a/fluxer_desktop/native/encoder-ring/src/d3d11.rs b/fluxer_desktop/native/encoder-ring/src/d3d11.rs
index b67e08f60..3f2819459 100644
--- a/fluxer_desktop/native/encoder-ring/src/d3d11.rs
+++ b/fluxer_desktop/native/encoder-ring/src/d3d11.rs
@@ -438,36 +438,4 @@ mod tests {
assert_eq!(h2.slot_index, 3);
assert_eq!(h2.raw_handle, 0xdead);
}
-
- #[test]
- #[cfg(target_os = "windows")]
- fn windows_real_keyed_mutex_eight_slots_round_trip() {
- let backend_result = D3D11KeyedMutexBackend::new();
- let mut backend = match backend_result {
- Ok(b) => b,
- Err(BackendError::PlatformUnsupported { .. }) => return,
- Err(other) => unreachable!("unexpected backend init err: {other:?}"),
- };
- let slots_result = backend.create_slots(64, 64, TextureFormat::Nv12);
- let slots = match slots_result {
- Ok(s) => s,
- Err(BackendError::PlatformUnsupported { .. }) => return,
- Err(other) => unreachable!("unexpected create_slots err: {other:?}"),
- };
- assert_eq!(slots.len(), 8);
- for (idx, slot) in slots.iter().enumerate() {
- assert_eq!(slot.slot_index, idx as u32);
- assert_ne!(slot.raw_handle, 0);
- assert_eq!(slot.width, 64);
- }
- let slot = slots[0].clone();
- backend.acquire_write(&slot, 0).expect("acquire key=0");
- backend.release_write(&slot, 1).expect("release key=1");
- assert!(backend.poll_complete(&slot));
- backend.mark_consumed(&slot);
- assert!(!backend.poll_complete(&slot));
- backend.acquire_write(&slot, 1).expect("acquire key=1");
- backend.release_write(&slot, 2).expect("release key=2");
- assert!(backend.poll_complete(&slot));
- }
}
diff --git a/fluxer_desktop/native/encoder-ring/src/vt_compression_macos.rs b/fluxer_desktop/native/encoder-ring/src/vt_compression_macos.rs
index 5c871d8dd..c6a36b606 100644
--- a/fluxer_desktop/native/encoder-ring/src/vt_compression_macos.rs
+++ b/fluxer_desktop/native/encoder-ring/src/vt_compression_macos.rs
@@ -28,8 +28,6 @@ type OsStatus = i32;
pub(crate) type IoSurfaceRef = *mut c_void;
const KCM_VIDEO_CODEC_TYPE_H264: u32 = u32::from_be_bytes(*b"avc1");
-#[cfg(test)]
-const KCV_PIXEL_FORMAT_TYPE_420_YPCBCR8_BIPLANAR_VIDEO: u32 = u32::from_be_bytes(*b"420v");
const NOERR: OsStatus = 0;
const KCM_TIME_FLAGS_VALID: u32 = 1;
const KCF_NUMBER_SINT32_TYPE: i32 = 3;
@@ -840,107 +838,10 @@ impl VideoToolboxHandoff for VtCompressionHandoff {
}
}
-#[cfg(test)]
-pub(crate) fn make_cv_nv12_pixel_buffer(
- width: u32,
- height: u32,
-) -> objc2_core_foundation::CFRetained {
- use core::ptr::NonNull;
- use objc2_core_foundation::{CFDictionary, CFRetained};
- use objc2_core_video::CVPixelBuffer;
-
- let mut empty_keys: [*const c_void; 0] = [];
- let mut empty_vals: [*const c_void; 0] = [];
- let iosurf_dict: CFRetained = unsafe {
- CFDictionary::new(
- None,
- empty_keys.as_mut_ptr(),
- empty_vals.as_mut_ptr(),
- 0,
- &objc2_core_foundation::kCFTypeDictionaryKeyCallBacks,
- &objc2_core_foundation::kCFTypeDictionaryValueCallBacks,
- )
- .expect("iosurf empty dict")
- };
- let key_ref: &objc2_core_foundation::CFString =
- unsafe { objc2_core_video::kCVPixelBufferIOSurfacePropertiesKey };
- let key_ptr: *const c_void = key_ref as *const _ as *const c_void;
- let val_ptr: *const c_void = &*iosurf_dict as *const _ as *const c_void;
- let mut keys = [key_ptr];
- let mut vals = [val_ptr];
- let attrs: CFRetained = unsafe {
- CFDictionary::new(
- None,
- keys.as_mut_ptr(),
- vals.as_mut_ptr(),
- 1,
- &objc2_core_foundation::kCFTypeDictionaryKeyCallBacks,
- &objc2_core_foundation::kCFTypeDictionaryValueCallBacks,
- )
- .expect("attrs dict")
- };
- let mut out: *mut CVPixelBuffer = std::ptr::null_mut();
- let status = unsafe {
- objc2_core_video::CVPixelBufferCreate(
- None,
- width as usize,
- height as usize,
- KCV_PIXEL_FORMAT_TYPE_420_YPCBCR8_BIPLANAR_VIDEO,
- Some(&attrs),
- NonNull::new(&mut out).expect("out pointer non-null"),
- )
- };
- assert_eq!(status, 0, "CVPixelBufferCreate succeeded");
- assert!(!out.is_null(), "CVPixelBufferCreate produced buffer");
- unsafe { CFRetained::from_raw(NonNull::new_unchecked(out)) }
-}
-
#[cfg(test)]
mod tests {
use super::*;
- fn make_handoff() -> VtCompressionHandoff {
- VtCompressionHandoff::try_new(EncoderDims::new(1280, 720)).expect("create handoff")
- }
-
- pub(super) fn iosurface_ptr_from_pb(pb: &objc2_core_video::CVPixelBuffer) -> *mut c_void {
- let s = objc2_core_video::CVPixelBufferGetIOSurface(Some(pb));
- let surface = s.expect("pixel buffer must be IOSurface-backed");
- let raw: *const objc2_io_surface::IOSurfaceRef = &*surface;
- raw as *mut c_void
- }
-
- #[test]
- fn vt_compression_handoff_encodes_one_frame() {
- let mut handoff = make_handoff();
- let pb = make_cv_nv12_pixel_buffer(1280, 720);
- let surface = iosurface_ptr_from_pb(&pb);
- let slot = handoff
- .register_slot(surface as u64, 0, EncoderDims::new(1280, 720))
- .expect("register slot");
- let params = PicParams::new(0, false);
- handoff
- .encode_shared_async(slot, 0, EncoderDims::new(1280, 720), params)
- .expect("encode async");
- handoff.wait_for_completion().expect("complete frames");
- let payload = handoff.poll_completed(slot).expect("polled bitstream");
- assert!(!payload.data.is_empty(), "encoded payload non-empty");
- assert!(
- payload.data.len() <= MAX_BITSTREAM_BYTES,
- "encoded payload bounded"
- );
- }
-
- struct RecordingCallback {
- seen: Vec<(u64, u32)>,
- }
-
- impl crate::encoder_handoff::EncoderCompletionCallback for RecordingCallback {
- fn on_complete(&mut self, sequence: u64, encoded_bytes: u32) {
- self.seen.push((sequence, encoded_bytes));
- }
- }
-
#[test]
fn output_callback_counts_failed_completions() {
let ctx = VtCallbackContext {
@@ -971,106 +872,6 @@ mod tests {
);
}
- #[test]
- fn failed_completion_count_starts_at_zero_and_survives_encode() {
- let mut handoff = make_handoff();
- assert_eq!(handoff.failed_completion_count(), 0);
- let pb = make_cv_nv12_pixel_buffer(1280, 720);
- let surface = iosurface_ptr_from_pb(&pb);
- let slot = handoff
- .register_slot(surface as u64, 0, EncoderDims::new(1280, 720))
- .expect("register slot");
- handoff
- .encode_shared_async(
- slot,
- 0,
- EncoderDims::new(1280, 720),
- PicParams::new(0, false),
- )
- .expect("encode async");
- handoff.wait_for_completion().expect("complete frames");
- assert_eq!(handoff.failed_completion_count(), 0);
- }
-
- #[test]
- fn session_rebuild_bounded_by_named_cap() {
- let mut handoff = make_handoff();
- assert_eq!(handoff.session_rebuild_count(), 0);
- for expected in 1..=VT_SESSION_REBUILD_MAX {
- assert!(handoff.try_rebuild_session(), "rebuild within cap succeeds");
- assert_eq!(handoff.session_rebuild_count(), expected);
- }
- assert!(
- !handoff.try_rebuild_session(),
- "rebuild beyond cap rejected"
- );
- assert_eq!(handoff.session_rebuild_count(), VT_SESSION_REBUILD_MAX);
- }
-
- #[test]
- fn session_still_encodes_after_rebuild() {
- let mut handoff = make_handoff();
- assert!(handoff.try_rebuild_session(), "first rebuild succeeds");
- let pb = make_cv_nv12_pixel_buffer(1280, 720);
- let surface = iosurface_ptr_from_pb(&pb);
- let slot = handoff
- .register_slot(surface as u64, 0, EncoderDims::new(1280, 720))
- .expect("register slot");
- handoff
- .encode_shared_async(
- slot,
- 0,
- EncoderDims::new(1280, 720),
- PicParams::new(0, false),
- )
- .expect("encode async after rebuild");
- handoff.wait_for_completion().expect("complete frames");
- let payload = handoff.poll_completed(slot).expect("polled bitstream");
- assert!(!payload.data.is_empty(), "encoded payload non-empty");
- assert_eq!(handoff.session_rebuild_count(), 1);
- }
-
- #[test]
- fn encode_shared_uses_capture_pts_when_present() {
- let mut handoff = make_handoff();
- let pb = make_cv_nv12_pixel_buffer(1280, 720);
- let surface = iosurface_ptr_from_pb(&pb);
- let slot = handoff
- .register_slot(surface as u64, 0, EncoderDims::new(1280, 720))
- .expect("register slot");
- assert_eq!(slot.slot_index, 0);
- let dims = EncoderDims::new(1280, 720);
- let submission =
- EncoderSubmission::new(surface as u64, 0, dims, 0).with_capture_pts_us(987_654);
- let mut cb = RecordingCallback { seen: Vec::new() };
- VideoToolboxHandoff::encode_shared(&mut handoff, submission, &mut cb)
- .expect("encode shared with capture pts");
- handoff.wait_for_completion().expect("complete frames");
- let payload = handoff.poll_completed(slot).expect("polled bitstream");
- assert_eq!(payload.pts_us, 987_654, "real capture pts threaded through");
- assert_eq!(cb.seen.len(), 1);
- }
-
- #[test]
- fn encode_shared_synthesizes_pts_when_capture_pts_absent() {
- let mut handoff = make_handoff();
- let pb = make_cv_nv12_pixel_buffer(1280, 720);
- let surface = iosurface_ptr_from_pb(&pb);
- let slot = handoff
- .register_slot(surface as u64, 0, EncoderDims::new(1280, 720))
- .expect("register slot");
- assert_eq!(slot.slot_index, 0);
- let dims = EncoderDims::new(1280, 720);
- let submission = EncoderSubmission::new(surface as u64, 0, dims, 0);
- assert_eq!(submission.capture_pts_us, None);
- let mut cb = RecordingCallback { seen: Vec::new() };
- VideoToolboxHandoff::encode_shared(&mut handoff, submission, &mut cb)
- .expect("encode shared without capture pts");
- handoff.wait_for_completion().expect("complete frames");
- let payload = handoff.poll_completed(slot).expect("polled bitstream");
- assert_eq!(payload.pts_us, 0, "sequence 0 synthesizes pts 0");
- }
-
#[test]
fn invalid_session_error_detection_is_exact() {
let invalid = EncoderError::EncodeFailed {
@@ -1089,38 +890,4 @@ mod tests {
};
assert!(!is_invalid_session_error(&other_vendor));
}
-
- #[test]
- fn vt_compression_handoff_handles_back_pressure() {
- let mut handoff = make_handoff();
- let pb = make_cv_nv12_pixel_buffer(1280, 720);
- let surface = iosurface_ptr_from_pb(&pb);
- let slot = handoff
- .register_slot(surface as u64, 0, EncoderDims::new(1280, 720))
- .expect("register slot");
- let total: u64 = (COMPLETION_RING_CAPACITY as u64) + 8;
- for i in 0..total {
- let params = PicParams::new(i * 33_333, false);
- handoff
- .encode_shared_async(slot, 0, EncoderDims::new(1280, 720), params)
- .expect("encode async");
- }
- handoff.wait_for_completion().expect("complete frames");
- let pending = handoff.pending_completion();
- assert!(
- pending <= COMPLETION_RING_CAPACITY,
- "completion ring stays bounded"
- );
- let mut drained = 0usize;
- while handoff.poll_completed(slot).is_some() {
- drained += 1;
- if drained > COMPLETION_RING_CAPACITY * 2 {
- break;
- }
- }
- assert!(
- drained <= COMPLETION_RING_CAPACITY,
- "drained respects completion bound"
- );
- }
}
diff --git a/fluxer_desktop/native/encoder-ring/tests/windows_qsv_probe.rs b/fluxer_desktop/native/encoder-ring/tests/windows_qsv_probe.rs
deleted file mode 100644
index 849a0cdec..000000000
--- a/fluxer_desktop/native/encoder-ring/tests/windows_qsv_probe.rs
+++ /dev/null
@@ -1,727 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-#![cfg(target_os = "windows")]
-use std::ffi::c_void;
-use std::ptr;
-
-use libloading::{Library, Symbol};
-use windows::Win32::Graphics::Direct3D::{D3D_DRIVER_TYPE_UNKNOWN, D3D_FEATURE_LEVEL_11_0};
-use windows::Win32::Graphics::Direct3D11::{
- D3D11_CREATE_DEVICE_BGRA_SUPPORT, D3D11_CREATE_DEVICE_VIDEO_SUPPORT, D3D11_SDK_VERSION,
- D3D11CreateDevice, ID3D11Device, ID3D11DeviceContext, ID3D11Multithread,
-};
-use windows::Win32::Graphics::Dxgi::{CreateDXGIFactory1, IDXGIAdapter1, IDXGIFactory1};
-use windows::core::Interface;
-
-const VENDOR_INTEL: u32 = 0x8086;
-
-const MFX_IMPL_TYPE_HARDWARE: u32 = 2;
-const MFX_ACCEL_MODE_NA: u32 = 0;
-const MFX_ACCEL_MODE_VIA_D3D11: u32 = 0x0300;
-
-const MFX_HANDLE_D3D11_DEVICE: u32 = 3;
-const MFX_HANDLE_D3D11_VIDEO_DEVICE_GUESS: u32 = 11;
-
-const MFX_VARIANT_TYPE_U32: u32 = 5;
-const MFX_VARIANT_VERSION_MAJOR: u8 = 1;
-const MFX_VARIANT_VERSION_MINOR: u8 = 1;
-
-const MFX_ERR_NONE: i32 = 0;
-const MFX_WRN_IN_EXECUTION: i32 = 1;
-
-const MFX_FOURCC_NV12: u32 = u32::from_le_bytes(*b"NV12");
-const MFX_CODEC_AVC: u32 = u32::from_le_bytes(*b"AVC ");
-const MFX_RATECONTROL_CBR: u16 = 1;
-const MFX_PICSTRUCT_PROGRESSIVE: u16 = 0x01;
-const MFX_CHROMAFORMAT_YUV420: u16 = 1;
-const MFX_IOPATTERN_IN_VIDEO_MEMORY: u16 = 0x01;
-const MFX_IOPATTERN_IN_SYSTEM_MEMORY: u16 = 0x02;
-
-const FILTER_PROPERTY_IMPL: &[u8] = b"mfxImplDescription.Impl\0";
-const FILTER_PROPERTY_ACCEL: &[u8] = b"mfxImplDescription.AccelerationMode\0";
-
-const QSV_DLL_NAME_VPL: &str = "libvpl.dll";
-
-#[repr(C)]
-#[derive(Clone, Copy, Default)]
-struct MfxStructVersion {
- minor: u8,
- major: u8,
-}
-
-#[repr(C)]
-#[derive(Clone, Copy)]
-union MfxVariantData {
- u32_: u32,
- u64_: u64,
- ptr: *mut c_void,
- pad: [u8; 16],
-}
-
-#[repr(C)]
-#[derive(Clone, Copy)]
-struct MfxVariant {
- version: MfxStructVersion,
- type_: u32,
- data: MfxVariantData,
-}
-
-#[repr(C)]
-#[derive(Default)]
-struct MfxFrameInfo {
- reserved: [u32; 4],
- channel_id: u16,
- bit_depth_luma: u16,
- bit_depth_chroma: u16,
- shift: u16,
- frame_id_temporal: u16,
- frame_id_priority: u16,
- frame_id_view: u16,
- frame_id_quality: u16,
- four_cc: u32,
- width: u16,
- height: u16,
- crop_x: u16,
- crop_y: u16,
- crop_w: u16,
- crop_h: u16,
- frame_rate_extn: u32,
- frame_rate_extd: u32,
- reserved3: u16,
- aspect_ratio_w: u16,
- aspect_ratio_h: u16,
- pic_struct: u16,
- chroma_format: u16,
- reserved2: u16,
-}
-
-#[repr(C)]
-#[derive(Default)]
-struct MfxInfoMfx {
- reserved: [u32; 7],
- low_power: u16,
- brc_param_multiplier: u16,
- frame_info: MfxFrameInfo,
- codec_id: u32,
- codec_profile: u16,
- codec_level: u16,
- num_thread: u16,
- target_usage: u16,
- gop_pic_size: u16,
- gop_ref_dist: u16,
- gop_opt_flag: u16,
- idr_interval: u16,
- rate_control_method: u16,
- init_qp: u16,
- buffer_size_in_kb: u16,
- target_kbps: u16,
- max_kbps: u16,
- num_slice: u16,
- num_ref_frame: u16,
- encoded_order: u16,
- union_pad: [u16; 15],
-}
-
-#[repr(C)]
-struct MfxVideoParam {
- alloc_id: u32,
- reserved: [u32; 2],
- reserved3: u16,
- async_depth: u16,
- mfx: MfxInfoMfx,
- protected: u16,
- io_pattern: u16,
- ext_param: *mut c_void,
- num_ext_param: u16,
- reserved2: u16,
-}
-
-#[repr(C)]
-#[derive(Default, Clone, Copy)]
-struct MfxPlatform {
- code_name: u16,
- device_id: u16,
- media_adapter_type: u16,
- reserved: [u16; 13],
-}
-
-type MfxLoad = unsafe extern "C" fn() -> *mut c_void;
-type MfxUnload = unsafe extern "C" fn(*mut c_void);
-type MfxCreateConfig = unsafe extern "C" fn(*mut c_void) -> *mut c_void;
-type MfxSetConfigFilterProperty = unsafe extern "C" fn(*mut c_void, *const u8, MfxVariant) -> i32;
-type MfxCreateSession = unsafe extern "C" fn(*mut c_void, u32, *mut *mut c_void) -> i32;
-type MfxClose = unsafe extern "C" fn(*mut c_void) -> i32;
-type MfxSetHandle = unsafe extern "C" fn(*mut c_void, u32, *mut c_void) -> i32;
-type MfxQueryImpl = unsafe extern "C" fn(*mut c_void, *mut i32) -> i32;
-type MfxQueryPlatform = unsafe extern "C" fn(*mut c_void, *mut MfxPlatform) -> i32;
-type MfxEncodeInit = unsafe extern "C" fn(*mut c_void, *mut MfxVideoParam) -> i32;
-type MfxEncodeClose = unsafe extern "C" fn(*mut c_void) -> i32;
-type MfxEncodeQuery =
- unsafe extern "C" fn(*mut c_void, *mut MfxVideoParam, *mut MfxVideoParam) -> i32;
-type MfxGetHandle = unsafe extern "C" fn(*mut c_void, u32, *mut *mut c_void) -> i32;
-
-struct Dispatcher {
- library: Library,
-}
-
-impl Dispatcher {
- fn load() -> Option {
- let library = unsafe { Library::new(QSV_DLL_NAME_VPL) }.ok()?;
- Some(Self { library })
- }
-
- fn modern_session(&self, accel_mode: u32) -> (Option<(*mut c_void, *mut c_void)>, Vec) {
- let mut log = Vec::new();
- let load: Symbol<'_, MfxLoad> = match unsafe { self.library.get(b"MFXLoad\0") } {
- Ok(s) => s,
- Err(e) => {
- log.push(format!("MFXLoad symbol missing: {e:?}"));
- return (None, log);
- }
- };
- let create_config: Symbol<'_, MfxCreateConfig> =
- match unsafe { self.library.get(b"MFXCreateConfig\0") } {
- Ok(s) => s,
- Err(e) => {
- log.push(format!("MFXCreateConfig missing: {e:?}"));
- return (None, log);
- }
- };
- let set_prop: Symbol<'_, MfxSetConfigFilterProperty> =
- match unsafe { self.library.get(b"MFXSetConfigFilterProperty\0") } {
- Ok(s) => s,
- Err(e) => {
- log.push(format!("MFXSetConfigFilterProperty missing: {e:?}"));
- return (None, log);
- }
- };
- let create_session: Symbol<'_, MfxCreateSession> =
- match unsafe { self.library.get(b"MFXCreateSession\0") } {
- Ok(s) => s,
- Err(e) => {
- log.push(format!("MFXCreateSession missing: {e:?}"));
- return (None, log);
- }
- };
- let loader = unsafe { load() };
- if loader.is_null() {
- log.push("MFXLoad returned NULL".to_string());
- return (None, log);
- }
- log.push(format!("MFXLoad ok loader={loader:p}"));
- let impl_cfg = unsafe { create_config(loader) };
- if impl_cfg.is_null() {
- log.push("MFXCreateConfig(impl) returned NULL".to_string());
- return (None, log);
- }
- let impl_variant = MfxVariant {
- version: MfxStructVersion {
- minor: MFX_VARIANT_VERSION_MINOR,
- major: MFX_VARIANT_VERSION_MAJOR,
- },
- type_: MFX_VARIANT_TYPE_U32,
- data: MfxVariantData {
- u32_: MFX_IMPL_TYPE_HARDWARE,
- },
- };
- let status_impl =
- unsafe { set_prop(impl_cfg, FILTER_PROPERTY_IMPL.as_ptr(), impl_variant) };
- log.push(format!(
- "SetConfigFilterProperty(Impl=HARDWARE) status={status_impl}"
- ));
- if status_impl != MFX_ERR_NONE {
- return (None, log);
- }
- let accel_cfg = unsafe { create_config(loader) };
- if accel_cfg.is_null() {
- log.push("MFXCreateConfig(accel) returned NULL".to_string());
- return (None, log);
- }
- let accel_variant = MfxVariant {
- version: MfxStructVersion {
- minor: MFX_VARIANT_VERSION_MINOR,
- major: MFX_VARIANT_VERSION_MAJOR,
- },
- type_: MFX_VARIANT_TYPE_U32,
- data: MfxVariantData { u32_: accel_mode },
- };
- let status_accel =
- unsafe { set_prop(accel_cfg, FILTER_PROPERTY_ACCEL.as_ptr(), accel_variant) };
- log.push(format!(
- "SetConfigFilterProperty(AccelerationMode={accel_mode:#x}) status={status_accel}"
- ));
- if status_accel != MFX_ERR_NONE {
- return (None, log);
- }
- let mut session: *mut c_void = ptr::null_mut();
- let status_create = unsafe { create_session(loader, 0, &mut session) };
- log.push(format!(
- "MFXCreateSession status={status_create} session={session:p}"
- ));
- if status_create != MFX_ERR_NONE || session.is_null() {
- return (None, log);
- }
- (Some((loader, session)), log)
- }
-
- fn unload(&self, loader: *mut c_void) {
- let Ok(unload) = (unsafe { self.library.get::(b"MFXUnload\0") }) else {
- return;
- };
- if !loader.is_null() {
- unsafe { unload(loader) };
- }
- }
-
- fn close(&self, session: *mut c_void) {
- let Ok(close) = (unsafe { self.library.get::(b"MFXClose\0") }) else {
- return;
- };
- if !session.is_null() {
- unsafe {
- let _ = close(session);
- }
- }
- }
-}
-
-fn try_create_intel_device() -> Option<(ID3D11Device, ID3D11DeviceContext)> {
- let factory: IDXGIFactory1 = unsafe { CreateDXGIFactory1() }.ok()?;
- let mut idx: u32 = 0;
- loop {
- let adapter: IDXGIAdapter1 = match unsafe { factory.EnumAdapters1(idx) } {
- Ok(a) => a,
- Err(_) => return None,
- };
- idx = idx.saturating_add(1);
- let desc = match unsafe { adapter.GetDesc1() } {
- Ok(d) => d,
- Err(_) => continue,
- };
- if desc.VendorId != VENDOR_INTEL {
- continue;
- }
- let mut device: Option = None;
- let mut ctx: Option = None;
- let feature_levels = [D3D_FEATURE_LEVEL_11_0];
- let cast_result = adapter.cast::();
- let cast_adapter = match cast_result {
- Ok(a) => a,
- Err(_) => continue,
- };
- let flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT | D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
- let result = unsafe {
- D3D11CreateDevice(
- Some(&cast_adapter),
- D3D_DRIVER_TYPE_UNKNOWN,
- Default::default(),
- flags,
- Some(&feature_levels),
- D3D11_SDK_VERSION,
- Some(&mut device),
- None,
- Some(&mut ctx),
- )
- };
- if let (Ok(()), Some(d), Some(c)) = (result, device, ctx) {
- if let Ok(mt) = d.cast::() {
- let _ = unsafe { mt.SetMultithreadProtected(true) };
- }
- return Some((d, c));
- }
- }
-}
-
-fn build_video_params_with(
- width: u16,
- height: u16,
- io_pattern: u16,
- target_usage: u16,
- low_power: u16,
-) -> MfxVideoParam {
- let aligned_w = (width + 15) & !15;
- let aligned_h = (height + 15) & !15;
- let info = MfxFrameInfo {
- four_cc: MFX_FOURCC_NV12,
- width: aligned_w,
- height: aligned_h,
- crop_w: width,
- crop_h: height,
- frame_rate_extn: 30,
- frame_rate_extd: 1,
- aspect_ratio_w: 1,
- aspect_ratio_h: 1,
- pic_struct: MFX_PICSTRUCT_PROGRESSIVE,
- chroma_format: MFX_CHROMAFORMAT_YUV420,
- ..Default::default()
- };
- let mfx = MfxInfoMfx {
- frame_info: info,
- codec_id: MFX_CODEC_AVC,
- target_usage,
- low_power,
- gop_pic_size: 30,
- gop_ref_dist: 1,
- rate_control_method: MFX_RATECONTROL_CBR,
- target_kbps: 5_000,
- max_kbps: 5_000,
- num_slice: 1,
- num_ref_frame: 1,
- ..Default::default()
- };
- MfxVideoParam {
- alloc_id: 0,
- reserved: [0; 2],
- reserved3: 0,
- async_depth: 1,
- mfx,
- protected: 0,
- io_pattern,
- ext_param: ptr::null_mut(),
- num_ext_param: 0,
- reserved2: 0,
- }
-}
-
-fn try_set_handle(
- dispatcher: &Dispatcher,
- session: *mut c_void,
- handle_type: u32,
- handle_ptr: *mut c_void,
-) -> Result {
- let sym: Symbol<'_, MfxSetHandle> =
- unsafe { dispatcher.library.get(b"MFXVideoCORE_SetHandle\0") }
- .map_err(|e| format!("MFXVideoCORE_SetHandle missing: {e:?}"))?;
- let status = unsafe { sym(session, handle_type, handle_ptr) };
- Ok(status)
-}
-
-fn try_query_impl(dispatcher: &Dispatcher, session: *mut c_void) -> Result<(i32, i32), String> {
- let sym: Symbol<'_, MfxQueryImpl> = unsafe { dispatcher.library.get(b"MFXQueryIMPL\0") }
- .map_err(|e| format!("MFXQueryIMPL missing: {e:?}"))?;
- let mut out: i32 = 0;
- let status = unsafe { sym(session, &mut out) };
- Ok((status, out))
-}
-
-fn try_query_platform(
- dispatcher: &Dispatcher,
- session: *mut c_void,
-) -> Result<(i32, MfxPlatform), String> {
- let sym: Symbol<'_, MfxQueryPlatform> =
- unsafe { dispatcher.library.get(b"MFXVideoCORE_QueryPlatform\0") }
- .map_err(|e| format!("MFXVideoCORE_QueryPlatform missing: {e:?}"))?;
- let mut p = MfxPlatform::default();
- let status = unsafe { sym(session, &mut p) };
- Ok((status, p))
-}
-
-fn try_encode_init(
- dispatcher: &Dispatcher,
- session: *mut c_void,
- width: u16,
- height: u16,
- io_pattern: u16,
-) -> Result {
- try_encode_init_with(dispatcher, session, width, height, io_pattern, 4, 0)
-}
-
-fn try_encode_init_with(
- dispatcher: &Dispatcher,
- session: *mut c_void,
- width: u16,
- height: u16,
- io_pattern: u16,
- target_usage: u16,
- low_power: u16,
-) -> Result {
- let query: Symbol<'_, MfxEncodeQuery> =
- unsafe { dispatcher.library.get(b"MFXVideoENCODE_Query\0") }
- .map_err(|e| format!("MFXVideoENCODE_Query missing: {e:?}"))?;
- let init: Symbol<'_, MfxEncodeInit> =
- unsafe { dispatcher.library.get(b"MFXVideoENCODE_Init\0") }
- .map_err(|e| format!("MFXVideoENCODE_Init missing: {e:?}"))?;
- let mut params = build_video_params_with(width, height, io_pattern, target_usage, low_power);
- let mut query_out = build_video_params_with(width, height, io_pattern, target_usage, low_power);
- let q_status = unsafe { query(session, &mut params, &mut query_out) };
- eprintln!(
- " MFXVideoENCODE_Query(io={io_pattern:#x},tu={target_usage},lp={low_power}) status={q_status}"
- );
- if q_status != MFX_ERR_NONE && q_status != MFX_WRN_IN_EXECUTION && q_status != -3 {
- eprintln!(" Query returned hard error {q_status}; skipping Init to avoid AV");
- return Ok(q_status);
- }
- let init_status = unsafe { init(session, &mut query_out) };
- Ok(init_status)
-}
-
-fn try_get_handle(
- dispatcher: &Dispatcher,
- session: *mut c_void,
- handle_type: u32,
-) -> Result<(i32, *mut c_void), String> {
- let sym: Symbol<'_, MfxGetHandle> =
- unsafe { dispatcher.library.get(b"MFXVideoCORE_GetHandle\0") }
- .map_err(|e| format!("MFXVideoCORE_GetHandle missing: {e:?}"))?;
- let mut out: *mut c_void = ptr::null_mut();
- let status = unsafe { sym(session, handle_type, &mut out) };
- Ok((status, out))
-}
-
-fn try_encode_close(dispatcher: &Dispatcher, session: *mut c_void) {
- if let Ok(sym) = unsafe {
- dispatcher
- .library
- .get::(b"MFXVideoENCODE_Close\0")
- } {
- unsafe {
- let _ = sym(session);
- }
- }
-}
-
-#[test]
-fn qsv_tiger_lake_probe_struct_sizes() {
- eprintln!("=== STRUCT SIZES (Rust) ===");
- eprintln!("MfxFrameInfo = {}", std::mem::size_of::());
- eprintln!("MfxInfoMfx = {}", std::mem::size_of::());
- eprintln!("MfxVideoParam = {}", std::mem::size_of::());
- assert!(
- std::mem::size_of::() == 68,
- "MfxFrameInfo size must be 68"
- );
- assert!(
- std::mem::size_of::() >= 168,
- "MfxInfoMfx >= 168 (= sizeof mfxInfoVPP)"
- );
-}
-
-#[test]
-fn qsv_tiger_lake_probe_experiment_1_preconditions() {
- let dispatcher = match Dispatcher::load() {
- Some(d) => d,
- None => {
- eprintln!("skip: libvpl.dll not loadable");
- return;
- }
- };
- eprintln!("=== EXPERIMENT 1: preconditions (QueryIMPL + QueryPlatform) ===");
- let (session_opt, log) = dispatcher.modern_session(MFX_ACCEL_MODE_VIA_D3D11);
- for line in &log {
- eprintln!(" {line}");
- }
- let (loader, session) = match session_opt {
- Some(s) => s,
- None => {
- eprintln!("EXP1 result: modern session not created; cannot probe preconditions");
- return;
- }
- };
- match try_query_impl(&dispatcher, session) {
- Ok((status, impl_val)) => {
- eprintln!(" MFXQueryIMPL: status={status} impl={impl_val:#x}");
- }
- Err(e) => eprintln!(" MFXQueryIMPL error: {e}"),
- }
- match try_query_platform(&dispatcher, session) {
- Ok((status, p)) => {
- eprintln!(
- " MFXVideoCORE_QueryPlatform: status={status} code_name={} device_id={:#x} media_adapter_type={}",
- p.code_name, p.device_id, p.media_adapter_type
- );
- }
- Err(e) => eprintln!(" MFXVideoCORE_QueryPlatform error: {e}"),
- }
- dispatcher.close(session);
- dispatcher.unload(loader);
- eprintln!("EXP1 done");
-}
-
-#[test]
-fn qsv_tiger_lake_probe_experiment_2_variant_accel_modes() {
- let dispatcher = match Dispatcher::load() {
- Some(d) => d,
- None => {
- eprintln!("skip: libvpl.dll not loadable");
- return;
- }
- };
- let (device, _ctx) = match try_create_intel_device() {
- Some(d) => d,
- None => {
- eprintln!("skip: no Intel D3D11 device");
- return;
- }
- };
- eprintln!("=== EXPERIMENT 2: SetHandle handle-type variants ===");
- let (session_opt, log) = dispatcher.modern_session(MFX_ACCEL_MODE_VIA_D3D11);
- for line in &log {
- eprintln!(" {line}");
- }
- let (loader, session) = match session_opt {
- Some(s) => s,
- None => {
- eprintln!("EXP2 result: modern session not created");
- return;
- }
- };
- let raw_device = device.as_raw();
- let exp2a = try_set_handle(&dispatcher, session, MFX_HANDLE_D3D11_DEVICE, raw_device);
- eprintln!(
- " EXP2a: SetHandle(MFX_HANDLE_D3D11_DEVICE=3) -> {:?}",
- exp2a
- );
- let exp2b = try_set_handle(
- &dispatcher,
- session,
- MFX_HANDLE_D3D11_VIDEO_DEVICE_GUESS,
- raw_device,
- );
- eprintln!(
- " EXP2b: SetHandle(MFX_HANDLE_D3D11_VIDEO_DEVICE_GUESS=11) -> {:?}",
- exp2b
- );
- dispatcher.close(session);
- dispatcher.unload(loader);
- eprintln!("EXP2 done");
- assert!(exp2a.is_ok(), "MFXVideoCORE_SetHandle symbol resolves");
-}
-
-#[test]
-fn qsv_tiger_lake_probe_experiment_3_skip_set_handle() {
- let dispatcher = match Dispatcher::load() {
- Some(d) => d,
- None => {
- eprintln!("skip: libvpl.dll not loadable");
- return;
- }
- };
- let (device, _ctx) = match try_create_intel_device() {
- Some(d) => d,
- None => {
- eprintln!("skip: no Intel D3D11 device");
- return;
- }
- };
- eprintln!("=== EXPERIMENT 3: SetHandle with VIDEO_SUPPORT device + encoder init ===");
- let (session_opt, log) = dispatcher.modern_session(MFX_ACCEL_MODE_VIA_D3D11);
- for line in &log {
- eprintln!(" {line}");
- }
- let (loader, session) = match session_opt {
- Some(s) => s,
- None => {
- eprintln!("EXP3 result: modern session not created");
- return;
- }
- };
- match try_query_impl(&dispatcher, session) {
- Ok((status, impl_val)) => {
- eprintln!(" pre-set MFXQueryIMPL: status={status} impl={impl_val:#x}");
- }
- Err(e) => eprintln!(" MFXQueryIMPL error: {e}"),
- }
- let raw_device = device.as_raw();
- let set_status = try_set_handle(&dispatcher, session, MFX_HANDLE_D3D11_DEVICE, raw_device);
- eprintln!(
- " EXP3-set: SetHandle(D3D11_DEVICE=3, VIDEO_SUPPORT+BGRA, multithread-protected) -> {:?}",
- set_status
- );
- match try_get_handle(&dispatcher, session, MFX_HANDLE_D3D11_DEVICE) {
- Ok((status, hdl)) => {
- eprintln!(
- " post-set GetHandle(MFX_HANDLE_D3D11_DEVICE) -> status={status} handle={hdl:p}"
- );
- }
- Err(e) => eprintln!(" GetHandle error: {e}"),
- }
- let init_a = try_encode_init(
- &dispatcher,
- session,
- 1280,
- 720,
- MFX_IOPATTERN_IN_VIDEO_MEMORY,
- );
- eprintln!(
- " EXP3a (IO_VIDEO_MEMORY, target_usage=4, low_power=0): init -> {:?}",
- init_a
- );
- let init_b = try_encode_init_with(
- &dispatcher,
- session,
- 1280,
- 720,
- MFX_IOPATTERN_IN_VIDEO_MEMORY,
- 7,
- 0x10,
- );
- eprintln!(
- " EXP3b (IO_VIDEO_MEMORY, target_usage=7 best-speed, low_power=ON=0x10): init -> {:?}",
- init_b
- );
- let init_c = try_encode_init_with(
- &dispatcher,
- session,
- 1280,
- 720,
- MFX_IOPATTERN_IN_VIDEO_MEMORY,
- 4,
- 0x10,
- );
- eprintln!(
- " EXP3c (IO_VIDEO_MEMORY, target_usage=4 balanced, low_power=ON=0x10): init -> {:?}",
- init_c
- );
- try_encode_close(&dispatcher, session);
- dispatcher.close(session);
- dispatcher.unload(loader);
- eprintln!("EXP3 done");
- assert!(init_a.is_ok(), "init_a symbol resolved");
- assert!(init_b.is_ok(), "init_b symbol resolved");
- assert!(init_c.is_ok(), "init_c symbol resolved");
-}
-
-#[test]
-fn qsv_tiger_lake_probe_experiment_4_software_fallback() {
- let dispatcher = match Dispatcher::load() {
- Some(d) => d,
- None => {
- eprintln!("skip: libvpl.dll not loadable");
- return;
- }
- };
- eprintln!("=== EXPERIMENT 4: software-only (ACCEL_MODE_NA) session ===");
- let (session_opt, log) = dispatcher.modern_session(MFX_ACCEL_MODE_NA);
- for line in &log {
- eprintln!(" {line}");
- }
- let (loader, session) = match session_opt {
- Some(s) => s,
- None => {
- eprintln!("EXP4 result: software session not created");
- return;
- }
- };
- match try_query_impl(&dispatcher, session) {
- Ok((status, impl_val)) => {
- eprintln!(" MFXQueryIMPL: status={status} impl={impl_val:#x}");
- }
- Err(e) => eprintln!(" MFXQueryIMPL error: {e}"),
- }
- let init_status = try_encode_init(
- &dispatcher,
- session,
- 1280,
- 720,
- MFX_IOPATTERN_IN_SYSTEM_MEMORY,
- );
- eprintln!(" EXP4: MFXVideoENCODE_Init software -> {:?}", init_status);
- try_encode_close(&dispatcher, session);
- dispatcher.close(session);
- dispatcher.unload(loader);
- eprintln!("EXP4 done");
- assert!(
- init_status.is_ok(),
- "encode init symbol resolved in software"
- );
-}
diff --git a/fluxer_desktop/native/encoder-ring/tests/windows_real_encode.rs b/fluxer_desktop/native/encoder-ring/tests/windows_real_encode.rs
deleted file mode 100644
index edf12f651..000000000
--- a/fluxer_desktop/native/encoder-ring/tests/windows_real_encode.rs
+++ /dev/null
@@ -1,551 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-#![cfg(target_os = "windows")]
-use fluxer_encoder_ring::NVENC_COMPLETION_RING_CAPACITY;
-use fluxer_encoder_ring::encoder_handoff::EncoderCompletionCallback;
-use fluxer_encoder_ring::{
- AmfD3D11Handoff, AmfHandoff, EncodedBitstream, EncoderDims, EncoderError, EncoderSubmission,
- NvencD3D11Handoff, NvencHandoff, PicParams, QsvD3D11Handoff, QsvHandoff, RingError,
-};
-use windows::Win32::Graphics::Direct3D::{D3D_DRIVER_TYPE_UNKNOWN, D3D_FEATURE_LEVEL_11_0};
-use windows::Win32::Graphics::Direct3D11::{
- D3D11_BIND_RENDER_TARGET, D3D11_BIND_SHADER_RESOURCE, D3D11_CREATE_DEVICE_BGRA_SUPPORT,
- D3D11_CREATE_DEVICE_VIDEO_SUPPORT, D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX,
- D3D11_RESOURCE_MISC_SHARED_NTHANDLE, D3D11_SDK_VERSION, D3D11_TEXTURE2D_DESC,
- D3D11_USAGE_DEFAULT, D3D11CreateDevice, ID3D11Device, ID3D11Multithread,
-};
-use windows::Win32::Graphics::Dxgi::Common::{DXGI_FORMAT_NV12, DXGI_SAMPLE_DESC};
-use windows::Win32::Graphics::Dxgi::{
- CreateDXGIFactory1, IDXGIAdapter1, IDXGIFactory1, IDXGIResource1,
-};
-use windows::core::Interface;
-
-const VENDOR_NVIDIA: u32 = 0x10DE;
-const VENDOR_AMD: u32 = 0x1002;
-const VENDOR_INTEL: u32 = 0x8086;
-
-fn enum_adapters() -> Vec {
- let factory_result: windows::core::Result = unsafe { CreateDXGIFactory1() };
- let factory = match factory_result {
- Ok(f) => f,
- Err(_) => return Vec::new(),
- };
- let mut out = Vec::new();
- let mut index: u32 = 0;
- loop {
- let result: windows::core::Result = unsafe { factory.EnumAdapters1(index) };
- match result {
- Ok(adapter) => {
- out.push(adapter);
- index = index.saturating_add(1);
- }
- Err(_) => break,
- }
- }
- out
-}
-
-fn try_create_device_for_vendor(vendor_id: u32) -> Option {
- let adapters = enum_adapters();
- for adapter in adapters {
- let desc = match unsafe { adapter.GetDesc1() } {
- Ok(d) => d,
- Err(_) => continue,
- };
- if desc.VendorId != vendor_id {
- continue;
- }
- let mut device: Option = None;
- let feature_levels = [D3D_FEATURE_LEVEL_11_0];
- let flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT | D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
- let result = unsafe {
- D3D11CreateDevice(
- Some(&adapter.cast().ok()?),
- D3D_DRIVER_TYPE_UNKNOWN,
- Default::default(),
- flags,
- Some(&feature_levels),
- D3D11_SDK_VERSION,
- Some(&mut device),
- None,
- None,
- )
- };
- if let (Ok(()), Some(d)) = (result, device) {
- if let Ok(mt) = d.cast::() {
- let _ = unsafe { mt.SetMultithreadProtected(true) };
- }
- return Some(d);
- }
- }
- None
-}
-
-fn try_create_device() -> Option {
- try_create_device_for_vendor(VENDOR_NVIDIA)
- .or_else(|| try_create_device_for_vendor(VENDOR_INTEL))
- .or_else(|| try_create_device_for_vendor(VENDOR_AMD))
-}
-
-fn try_create_shared_nv12(device: &ID3D11Device, width: u32, height: u32) -> Option {
- let desc = D3D11_TEXTURE2D_DESC {
- Width: width,
- Height: height,
- MipLevels: 1,
- ArraySize: 1,
- Format: DXGI_FORMAT_NV12,
- SampleDesc: DXGI_SAMPLE_DESC {
- Count: 1,
- Quality: 0,
- },
- Usage: D3D11_USAGE_DEFAULT,
- BindFlags: (D3D11_BIND_RENDER_TARGET.0 | D3D11_BIND_SHADER_RESOURCE.0) as u32,
- CPUAccessFlags: 0,
- MiscFlags: (D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX.0 | D3D11_RESOURCE_MISC_SHARED_NTHANDLE.0)
- as u32,
- };
- let mut texture = None;
- unsafe {
- device
- .CreateTexture2D(&desc, None, Some(&mut texture))
- .ok()?;
- }
- let texture = texture?;
- let resource: IDXGIResource1 = texture.cast().ok()?;
- let shared = unsafe {
- resource
- .CreateSharedHandle(None, 0x3, windows::core::PCWSTR::null())
- .ok()?
- };
- Some(shared.0 as u64)
-}
-
-#[test]
-fn nvenc_real_encode_one_frame_via_dummy_shared_texture() {
- let device = match try_create_device_for_vendor(VENDOR_NVIDIA) {
- Some(d) => d,
- None => {
- eprintln!("skip: no NVIDIA D3D11 device available");
- return;
- }
- };
- let dims = EncoderDims::new(1920, 1080);
- let handoff_result = NvencD3D11Handoff::new(device.clone(), dims, 5_000_000);
- let mut handoff = match handoff_result {
- Ok(h) => h,
- Err(EncoderError::SdkNotFound { .. }) => {
- eprintln!("skip: NVENC runtime DLL not available");
- return;
- }
- Err(EncoderError::SessionInitFailed { vendor, status }) => {
- eprintln!("skip: NVENC session init failed: {vendor} status={status}");
- return;
- }
- Err(other) => {
- eprintln!("skip: NVENC init unexpected error: {other:?}");
- return;
- }
- };
- let shared = match try_create_shared_nv12(&device, 1920, 1080) {
- Some(h) => h,
- None => {
- eprintln!("skip: shared NV12 texture creation failed");
- return;
- }
- };
- let slot = match NvencHandoff::register_slot(&mut handoff, shared, 0, dims) {
- Ok(s) => s,
- Err(e) => {
- eprintln!("skip: register_slot failed: {e:?}");
- return;
- }
- };
- let pic = PicParams::new(0, true);
- let submit_result = NvencHandoff::encode_shared_async(&mut handoff, slot, 0, dims, pic);
- if submit_result.is_err() {
- eprintln!("skip: encode_shared_async failed: {submit_result:?}");
- NvencHandoff::unregister_slot(&mut handoff, slot);
- return;
- }
- let mut bitstream = None;
- for _ in 0..200 {
- bitstream = NvencHandoff::poll_completed(&mut handoff, slot);
- if bitstream.is_some() {
- break;
- }
- std::thread::sleep(std::time::Duration::from_millis(10));
- }
- NvencHandoff::unregister_slot(&mut handoff, slot);
- let bs = match bitstream {
- Some(b) => b,
- None => {
- eprintln!("nvenc: no bitstream produced within timeout; backend init succeeded");
- return;
- }
- };
- assert!(!bs.data.is_empty(), "non-empty bitstream");
- assert!(bs.is_keyframe, "first frame must be keyframe");
-}
-
-#[test]
-fn amf_real_encode_one_frame_via_dummy_shared_texture() {
- let device = match try_create_device_for_vendor(VENDOR_AMD) {
- Some(d) => d,
- None => {
- eprintln!("skip: no AMD D3D11 device available (expected on Intel/NVIDIA-only boxes)");
- return;
- }
- };
- let dims = EncoderDims::new(1920, 1080);
- let handoff_result = AmfD3D11Handoff::new(device.clone(), dims, 5_000_000);
- let mut handoff = match handoff_result {
- Ok(h) => h,
- Err(EncoderError::SdkNotFound { .. }) => {
- eprintln!("skip: AMF runtime DLL not available (expected on non-AMD hardware)");
- return;
- }
- Err(other) => {
- eprintln!("skip: AMF init unexpected: {other:?}");
- return;
- }
- };
- let shared = match try_create_shared_nv12(&device, 1920, 1080) {
- Some(h) => h,
- None => {
- eprintln!("skip: shared NV12 texture creation failed");
- return;
- }
- };
- let slot = match AmfHandoff::register_slot(&mut handoff, shared, 0, dims) {
- Ok(s) => s,
- Err(e) => {
- eprintln!("skip: AMF register_slot failed: {e:?}");
- return;
- }
- };
- let pic = PicParams::new(0, true);
- let _ = AmfHandoff::encode_shared_async(&mut handoff, slot, 0, dims, pic);
- let mut bitstream = None;
- for _ in 0..200 {
- bitstream = AmfHandoff::poll_completed(&mut handoff, slot);
- if bitstream.is_some() {
- break;
- }
- std::thread::sleep(std::time::Duration::from_millis(10));
- }
- AmfHandoff::unregister_slot(&mut handoff, slot);
- if let Some(bs) = bitstream {
- assert!(!bs.data.is_empty(), "non-empty AMF bitstream");
- } else {
- eprintln!("amf: no bitstream produced within timeout; backend init succeeded");
- }
-}
-
-#[test]
-fn qsv_modern_dispatcher_session_init_succeeds_on_real_iris_xe() {
- let device = match try_create_device_for_vendor(VENDOR_INTEL) {
- Some(d) => d,
- None => {
- eprintln!("skip: no Intel D3D11 device available");
- return;
- }
- };
- let dims = EncoderDims::new(1280, 720);
- let handoff_result = QsvD3D11Handoff::new(device, dims, 5_000_000);
- match handoff_result {
- Ok(_) => {
- eprintln!("qsv: modern dispatcher session + SetHandle + encode_init succeeded");
- }
- Err(EncoderError::SdkNotFound { .. }) => {
- eprintln!("skip: QSV runtime DLL not available");
- }
- Err(e) => {
- panic!("qsv modern dispatcher init MUST succeed on Tiger Lake Iris Xe: {e:?}");
- }
- }
-}
-
-#[test]
-fn qsv_real_encode_one_frame_via_dummy_shared_texture() {
- let device = match try_create_device_for_vendor(VENDOR_INTEL) {
- Some(d) => d,
- None => {
- eprintln!("skip: no Intel D3D11 device available");
- return;
- }
- };
- let dims = EncoderDims::new(1920, 1080);
- let handoff_result = QsvD3D11Handoff::new(device.clone(), dims, 5_000_000);
- let mut handoff = match handoff_result {
- Ok(h) => h,
- Err(EncoderError::SdkNotFound { .. }) => {
- eprintln!("skip: QSV runtime DLL not available");
- return;
- }
- Err(EncoderError::SessionInitFailed { vendor, status }) => {
- eprintln!("skip: QSV session init failed: {vendor} status={status}");
- return;
- }
- Err(other) => {
- eprintln!("skip: QSV init unexpected: {other:?}");
- return;
- }
- };
- let shared = match try_create_shared_nv12(&device, 1920, 1080) {
- Some(h) => h,
- None => {
- eprintln!("skip: shared NV12 texture creation failed");
- return;
- }
- };
- let slot = match QsvHandoff::register_slot(&mut handoff, shared, 0, dims) {
- Ok(s) => s,
- Err(e) => {
- eprintln!("skip: QSV register_slot failed: {e:?}");
- return;
- }
- };
- let pic = PicParams::new(0, true);
- let _ = QsvHandoff::encode_shared_async(&mut handoff, slot, 0, dims, pic);
- let mut bitstream = None;
- for _ in 0..200 {
- bitstream = QsvHandoff::poll_completed(&mut handoff, slot);
- if bitstream.is_some() {
- break;
- }
- std::thread::sleep(std::time::Duration::from_millis(10));
- }
- QsvHandoff::unregister_slot(&mut handoff, slot);
- if let Some(bs) = bitstream {
- assert!(!bs.data.is_empty(), "non-empty QSV bitstream");
- } else {
- eprintln!("qsv: no bitstream produced within timeout; backend init succeeded");
- }
-}
-
-#[test]
-fn skip_dont_block_rapid_submit_then_poll_never_hangs() {
- let device = match try_create_device() {
- Some(d) => d,
- None => return,
- };
- let dims = EncoderDims::new(640, 360);
- let mut handoff = match NvencD3D11Handoff::new(device.clone(), dims, 1_000_000) {
- Ok(h) => h,
- Err(_) => return,
- };
- let shared = match try_create_shared_nv12(&device, 640, 360) {
- Some(h) => h,
- None => return,
- };
- let slot = match NvencHandoff::register_slot(&mut handoff, shared, 0, dims) {
- Ok(s) => s,
- Err(_) => return,
- };
- let start = std::time::Instant::now();
- for i in 0..10 {
- let pic = PicParams::new((i as u64) * 16_666, false);
- let _ = NvencHandoff::encode_shared_async(&mut handoff, slot, 0, dims, pic);
- let _ = NvencHandoff::poll_completed(&mut handoff, slot);
- }
- let elapsed = start.elapsed();
- assert!(
- elapsed.as_secs() < 5,
- "10 submit+poll cycles must complete in < 5s, was {elapsed:?}"
- );
- NvencHandoff::unregister_slot(&mut handoff, slot);
-}
-
-#[test]
-fn cleanup_on_drop_releases_resources() {
- let device = match try_create_device() {
- Some(d) => d,
- None => return,
- };
- let dims = EncoderDims::new(640, 360);
- {
- let _handoff = match NvencD3D11Handoff::new(device.clone(), dims, 1_000_000) {
- Ok(h) => h,
- Err(_) => return,
- };
- }
- let _handoff2 = NvencD3D11Handoff::new(device.clone(), dims, 1_000_000);
-}
-
-struct CountingCallback {
- seen: Vec<(u64, u32)>,
-}
-
-impl EncoderCompletionCallback for CountingCallback {
- fn on_complete(&mut self, sequence: u64, encoded_bytes: u32) {
- self.seen.push((sequence, encoded_bytes));
- }
-}
-
-#[test]
-fn nvenc_compression_handoff_encodes_one_frame_via_keyed_mutex() {
- let device = match try_create_device_for_vendor(VENDOR_NVIDIA) {
- Some(d) => d,
- None => {
- eprintln!("skip: no NVIDIA D3D11 device available");
- return;
- }
- };
- let dims = EncoderDims::new(1280, 720);
- let mut handoff = match NvencD3D11Handoff::new(device.clone(), dims, 2_000_000) {
- Ok(h) => h,
- Err(EncoderError::SdkNotFound { .. }) => {
- eprintln!("skip: NVENC runtime DLL not available");
- return;
- }
- Err(other) => {
- eprintln!("skip: NVENC init unexpected: {other:?}");
- return;
- }
- };
- let shared = match try_create_shared_nv12(&device, 1280, 720) {
- Some(h) => h,
- None => {
- eprintln!("skip: shared NV12 texture creation failed");
- return;
- }
- };
- let submission = EncoderSubmission::new(shared, 0, dims, 1);
- let mut callback = CountingCallback { seen: Vec::new() };
- NvencHandoff::encode_shared(&mut handoff, submission, &mut callback)
- .expect("encode_shared first frame ok");
- assert_eq!(callback.seen.len(), 1, "callback fired once");
- assert_eq!(callback.seen[0].0, 1, "callback sequence matches");
- let mut payload: Option = None;
- for _ in 0..200 {
- let slot = fluxer_encoder_ring::HandoffSlot::new(0, shared);
- payload = NvencHandoff::poll_completed(&mut handoff, slot);
- if payload.is_some() {
- break;
- }
- std::thread::sleep(std::time::Duration::from_millis(10));
- }
- let bs = match payload {
- Some(b) => b,
- None => {
- eprintln!("nvenc keyed-mutex: no bitstream within timeout; init succeeded");
- return;
- }
- };
- assert!(!bs.data.is_empty(), "keyed-mutex encoded payload non-empty");
- assert!(bs.is_keyframe, "first frame must be IDR keyframe");
-}
-
-#[test]
-fn nvenc_compression_handoff_handles_back_pressure() {
- let device = match try_create_device_for_vendor(VENDOR_NVIDIA) {
- Some(d) => d,
- None => {
- eprintln!("skip: no NVIDIA D3D11 device available");
- return;
- }
- };
- let dims = EncoderDims::new(640, 360);
- let mut handoff = match NvencD3D11Handoff::new(device.clone(), dims, 1_000_000) {
- Ok(h) => h,
- Err(EncoderError::SdkNotFound { .. }) => {
- eprintln!("skip: NVENC runtime DLL not available");
- return;
- }
- Err(other) => {
- eprintln!("skip: NVENC init unexpected: {other:?}");
- return;
- }
- };
- let shared = match try_create_shared_nv12(&device, 640, 360) {
- Some(h) => h,
- None => {
- eprintln!("skip: shared NV12 texture creation failed");
- return;
- }
- };
- let total: u64 = (NVENC_COMPLETION_RING_CAPACITY as u64) + 8;
- let mut callback = CountingCallback { seen: Vec::new() };
- let mut accepted = 0usize;
- let mut full_drops = 0usize;
- for seq in 1..=total {
- let submission = EncoderSubmission::new(shared, 0, dims, seq);
- match NvencHandoff::encode_shared(&mut handoff, submission, &mut callback) {
- Ok(()) => {
- accepted += 1;
- }
- Err(RingError::FullDropped { .. }) => {
- full_drops += 1;
- assert_eq!(
- handoff.pending_completion(),
- NVENC_COMPLETION_RING_CAPACITY,
- "pre-encode drop only when completion ring is full"
- );
- }
- Err(other) => panic!("unexpected encode_shared error: {other:?}"),
- }
- std::thread::sleep(std::time::Duration::from_millis(2));
- }
- assert_eq!(
- accepted + full_drops,
- total as usize,
- "every submission accounted"
- );
- let pending = handoff.pending_completion();
- assert!(
- pending <= NVENC_COMPLETION_RING_CAPACITY,
- "completion ring stays bounded"
- );
- let mut drained = 0usize;
- for _ in 0..400 {
- let slot = fluxer_encoder_ring::HandoffSlot::new(0, shared);
- let bs = NvencHandoff::poll_completed(&mut handoff, slot);
- match bs {
- Some(_) => {
- drained += 1;
- }
- None => {
- if drained >= accepted {
- break;
- }
- std::thread::sleep(std::time::Duration::from_millis(5));
- }
- }
- }
- assert_eq!(
- drained, accepted,
- "no accepted frame is silently discarded post-encode"
- );
-}
-
-#[test]
-fn nvenc_attach_then_detach_smoke() {
- let device = match try_create_device_for_vendor(VENDOR_NVIDIA) {
- Some(d) => d,
- None => {
- eprintln!("skip: no NVIDIA D3D11 device available");
- return;
- }
- };
- let dims = EncoderDims::new(640, 360);
- let handoff_result = NvencD3D11Handoff::new(device.clone(), dims, 1_000_000);
- let handoff = match handoff_result {
- Ok(h) => h,
- Err(EncoderError::SdkNotFound { .. }) => {
- eprintln!("skip: NVENC runtime DLL not available");
- return;
- }
- Err(other) => {
- eprintln!("skip: NVENC init unexpected: {other:?}");
- return;
- }
- };
- assert_eq!(
- handoff.pending_completion(),
- 0,
- "fresh handoff has empty ring"
- );
- assert_eq!(handoff.completed_count(), 0, "fresh handoff completed=0");
- drop(handoff);
- let _again = NvencD3D11Handoff::new(device, dims, 1_000_000);
-}
diff --git a/fluxer_desktop/native/linux-audio-capture/src/pipewire_bridge.rs b/fluxer_desktop/native/linux-audio-capture/src/pipewire_bridge.rs
index 277e1f5d9..d577afc2d 100644
--- a/fluxer_desktop/native/linux-audio-capture/src/pipewire_bridge.rs
+++ b/fluxer_desktop/native/linux-audio-capture/src/pipewire_bridge.rs
@@ -289,34 +289,6 @@ mod tests {
assert!(!is_routable_media_class(""));
}
- #[test]
- fn daemon_unreachable_returns_none_from_open() {
- let bridge = PipeWireBridge::open();
- if let Some(b) = bridge {
- let _ = b.inventory();
- b.release();
- }
- }
-
- #[test]
- fn direct_open_returns_none_or_cleans_up() {
- let direct = PipeWireDirectCapture::open();
- if let Some(d) = direct {
- d.stop();
- }
- }
-
- #[test]
- fn integration_smoke_apply_release_cycle_is_safe() {
- let Some(bridge) = PipeWireBridge::open() else {
- return;
- };
- bridge.apply(RoutingRule::default());
- std::thread::sleep(Duration::from_millis(20));
- bridge.release();
- let _ = bridge.inventory();
- }
-
#[test]
fn virtual_sink_props_match_legacy_contract() {
let props = build_virtual_sink_props();
diff --git a/fluxer_desktop/native/linux-audio-capture/vm_tests/direct_capture_validation.mjs b/fluxer_desktop/native/linux-audio-capture/vm_tests/direct_capture_validation.mjs
deleted file mode 100644
index 092cb21b2..000000000
--- a/fluxer_desktop/native/linux-audio-capture/vm_tests/direct_capture_validation.mjs
+++ /dev/null
@@ -1,141 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-import {execFileSync} from 'node:child_process';
-import {copyFileSync} from 'node:fs';
-import {createRequire} from 'node:module';
-import {setTimeout as sleep} from 'node:timers/promises';
-
-const require = createRequire(import.meta.url);
-const work = process.env.FLX_WORK;
-const addonNode = `${work}/flx_direct_addon.node`;
-copyFileSync(process.env.FLX_ADDON_SO, addonNode);
-const addon = require(addonNode);
-
-const results = [];
-function record(name, ok, detail) {
- results.push({name, ok});
- console.log(`${ok ? 'PASS' : 'FAIL'} ${name}${detail ? ` -- ${detail}` : ''}`);
-}
-function pwDump() {
- return JSON.parse(execFileSync('pw-dump', {encoding: 'utf8', maxBuffer: 64e6}));
-}
-function directSinkNode(dump) {
- return dump.find(
- (o) => o.type === 'PipeWire:Interface:Node' && /^fluxer-direct-capture-/.test(o.info?.props?.['node.name'] || ''),
- );
-}
-async function waitFor(p, ms, step = 150) {
- const end = Date.now() + ms;
- let last;
- while (Date.now() < end) {
- last = p();
- if (last) return last;
- await sleep(step);
- }
- return last;
-}
-
-function rms(samples) {
- if (samples.length === 0) return 0;
- let sum = 0;
- for (const s of samples) sum += s * s;
- return Math.sqrt(sum / samples.length);
-}
-
-async function main() {
- const dc = new addon.DirectAudioCapture();
- let lifecycle = null;
- dc.setLifecycleCallback((...args) => {
- const flat = args.length === 1 && Array.isArray(args[0]) ? args[0] : args;
- lifecycle = {kind: flat[0], msg: flat[1]};
- });
-
- const started = dc.start({include: [{'application.name': 'Music Player Demo'}]});
- record('DirectAudioCapture.start(include rule) accepted', started === true);
-
- const sinkUp = await waitFor(() => {
- const d = pwDump();
- return directSinkNode(d) ? d : null;
- }, 8000);
- record(
- 'hidden private sink fluxer-direct-capture-* created',
- !!sinkUp,
- sinkUp ? directSinkNode(sinkUp).info.props['node.name'] : 'timeout',
- );
-
- if (sinkUp) {
- const sinkProps = directSinkNode(sinkUp).info.props;
- record(
- 'private sink node.hidden=true (not user-visible)',
- String(sinkProps['node.hidden']) === 'true',
- `node.hidden=${sinkProps['node.hidden']}`,
- );
- record('private sink media.class=Audio/Sink', sinkProps['media.class'] === 'Audio/Sink', sinkProps['media.class']);
- }
-
- let maxRms = 0;
- let frames = 0;
- let totalSamples = 0;
- const captureDeadline = Date.now() + 6000;
- while (Date.now() < captureDeadline) {
- const f = dc.read();
- if (f) {
- const samples = new Float32Array(f.samples);
- frames += 1;
- totalSamples += samples.length;
- maxRms = Math.max(maxRms, rms(samples));
- if (maxRms > 0.01 && frames > 5) break;
- }
- await sleep(20);
- }
- record('DirectAudioCapture yields real frames', frames > 0, `${frames} frames, ${totalSamples} samples`);
- record('captured audio is non-silent (real 440Hz tone tapped)', maxRms > 0.01, `peak rms=${maxRms.toFixed(4)}`);
-
- const dump = pwDump();
- const sink = directSinkNode(dump);
- const sinkId = Number(sink?.id);
- const linkSrcNodes = new Set(
- dump
- .filter((o) => o.type === 'PipeWire:Interface:Link' && Number(o.info?.props?.['link.input.node']) === sinkId)
- .map((o) => Number(o.info?.props?.['link.output.node'])),
- );
- const fluxerStreamIds = dump
- .filter((o) => o.type === 'PipeWire:Interface:Node' && o.info?.props?.['application.name'] === 'Fluxer')
- .map((o) => Number(o.id));
- record(
- 'Fluxer-named app excluded from per-process capture',
- fluxerStreamIds.every((id) => !linkSrcNodes.has(id)),
- `fluxer=${fluxerStreamIds} linkedSrc=${[...linkSrcNodes]}`,
- );
-
- const musicIds = dump
- .filter((o) => o.type === 'PipeWire:Interface:Node' && o.info?.props?.['application.name'] === 'Music Player Demo')
- .map((o) => Number(o.id));
- record(
- 'targeted app IS linked to the private sink',
- musicIds.some((id) => linkSrcNodes.has(id)),
- `music=${musicIds} linkedSrc=${[...linkSrcNodes]}`,
- );
-
- dc.stop();
- await sleep(600);
- record('stop() emits closed-clean lifecycle', lifecycle?.kind === 'closed-clean', JSON.stringify(lifecycle));
- const afterStop = pwDump();
- const sinkAfter = directSinkNode(afterStop);
- const residualLinks = sinkAfter
- ? afterStop.filter(
- (o) =>
- o.type === 'PipeWire:Interface:Link' && Number(o.info?.props?.['link.input.node']) === Number(sinkAfter.id),
- ).length
- : 0;
- record('stop() removes capture links', residualLinks === 0, `residual=${residualLinks}`);
-
- const failed = results.filter((r) => !r.ok).length;
- console.log(`\n=== direct: ${results.length - failed}/${results.length} checks passed ===`);
- process.exit(failed === 0 ? 0 : 1);
-}
-
-main().catch((e) => {
- console.error('HARNESS ERROR:', e?.stack || e);
- process.exit(2);
-});
diff --git a/fluxer_desktop/native/linux-audio-capture/vm_tests/pw_graph_validation.mjs b/fluxer_desktop/native/linux-audio-capture/vm_tests/pw_graph_validation.mjs
deleted file mode 100644
index 0619f55df..000000000
--- a/fluxer_desktop/native/linux-audio-capture/vm_tests/pw_graph_validation.mjs
+++ /dev/null
@@ -1,233 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-import {execFileSync, spawn} from 'node:child_process';
-import {copyFileSync} from 'node:fs';
-import {createRequire} from 'node:module';
-import {setTimeout as sleep} from 'node:timers/promises';
-
-const require = createRequire(import.meta.url);
-
-const addonSo = req('FLX_ADDON_SO');
-const work = req('FLX_WORK');
-const tone = req('FLX_TONE');
-const addonNode = `${work}/flx_audio_addon.node`;
-copyFileSync(addonSo, addonNode);
-const addon = require(addonNode);
-
-const SINK_NAME = 'fluxer-screen-share';
-const SINK_DESC = 'Fluxer Screen Share Audio';
-const results = [];
-const children = [];
-
-function req(name) {
- const v = process.env[name];
- if (!v) {
- console.error(`HARNESS ERROR: ${name} not set`);
- process.exit(2);
- }
- return v;
-}
-function record(name, ok, detail) {
- results.push({name, ok});
- console.log(`${ok ? 'PASS' : 'FAIL'} ${name}${detail ? ` -- ${detail}` : ''}`);
-}
-function pwDump() {
- return JSON.parse(execFileSync('pw-dump', {encoding: 'utf8', maxBuffer: 64e6}));
-}
-function nodesByName(dump, name) {
- return dump.filter((o) => o.type === 'PipeWire:Interface:Node' && o.info?.props?.['node.name'] === name);
-}
-function links(dump) {
- return dump
- .filter((o) => o.type === 'PipeWire:Interface:Link')
- .map((o) => ({
- inNode: Number(o.info?.props?.['link.input.node']),
- outNode: Number(o.info?.props?.['link.output.node']),
- }));
-}
-function streamNodes(dump) {
- return dump.filter(
- (o) => o.type === 'PipeWire:Interface:Node' && o.info?.props?.['media.class'] === 'Stream/Output/Audio',
- );
-}
-async function waitFor(predicate, timeoutMs, stepMs = 150) {
- const deadline = Date.now() + timeoutMs;
- let last;
- while (Date.now() < deadline) {
- last = predicate();
- if (last) return last;
- await sleep(stepMs);
- }
- return last;
-}
-function killAll() {
- for (const c of children) {
- try {
- c.kill('SIGKILL');
- } catch {}
- }
-}
-
-async function main() {
- record('backend is pipewire', addon.audioBackend() === 'pipewire', addon.audioBackend());
-
- const descendant = spawn(
- 'pw-play',
- ['--target', 'test_speakers', '-P', '{ application.name = "Descendant Player" }', tone],
- {
- stdio: 'ignore',
- env: process.env,
- },
- );
- children.push(descendant);
-
- const speakerIdOf = (d) => nodesByName(d, 'test_speakers')[0]?.id;
- const sourcesInto = (dump) => {
- const sid = Number(speakerIdOf(dump));
- return new Set(
- links(dump)
- .filter((l) => l.inNode === sid)
- .map((l) => l.outNode),
- ).size;
- };
-
- const pre = await waitFor(() => {
- const d = pwDump();
- return streamNodes(d).length >= 5 && sourcesInto(d) >= 5 ? d : null;
- }, 12000);
- record(
- 'all 5 playback streams routed to speakers pre-capture',
- !!pre,
- pre ? `${streamNodes(pre).length} streams, ${sourcesInto(pre)} routed` : 'timeout',
- );
- const preDump = pre || pwDump();
-
- const speakers = nodesByName(preDump, 'test_speakers');
- record('default sink test_speakers exists', speakers.length === 1);
- const preSpeakerSources = sourcesInto(preDump);
- record(
- 'every app is playing to the real speakers pre-capture',
- preSpeakerSources >= 5,
- `${preSpeakerSources} distinct app streams -> speakers`,
- );
-
- const bridge = new addon.AudioBridge();
- record('AudioBridge on pipewire', bridge.backend() === 'pipewire', bridge.backend());
- record(
- 'apply(system rule) accepted',
- bridge.apply({onlySpeakers: true, onlyDefaultSpeakers: true, ignoreDevices: true}) === true,
- );
-
- const after = await waitFor(() => {
- const d = pwDump();
- if (nodesByName(d, SINK_NAME).length !== 1) return null;
- const g = bridge.routingGraph();
- return g.ownedLinks.length >= 2 ? {d, g} : null;
- }, 10000);
-
- if (!after) {
- record('fluxer sink + capture links established', false, 'timeout');
- await finish(bridge);
- return;
- }
- const {d: dump, g: graph} = after;
-
- const sink = nodesByName(dump, SINK_NAME);
- record('exactly one fluxer-screen-share node', sink.length === 1, `count=${sink.length}`);
- const sp = sink[0]?.info?.props ?? {};
- record(
- 'sink node.description is "Fluxer Screen Share Audio"',
- sp['node.description'] === SINK_DESC,
- sp['node.description'],
- );
- record('sink media.class is Audio/Source/Virtual', sp['media.class'] === 'Audio/Source/Virtual', sp['media.class']);
- record('sink node.virtual=true', String(sp['node.virtual']) === 'true');
- const sinkId = Number(sink[0]?.id);
-
- record(
- 'all owned links are passive',
- graph.ownedLinks.every((l) => l.passive === true),
- `${graph.ownedLinks.length} links`,
- );
- record(
- 'all owned links terminate at the fluxer sink',
- graph.ownedLinks.every((l) => Number(l.inputNodeId) === sinkId),
- );
-
- const captured = new Set(graph.ownedLinks.map((l) => Number(l.outputNodeId)));
- const idsByPredicate = (pred) =>
- streamNodes(dump)
- .filter((o) => pred(o.info.props))
- .map((o) => Number(o.id));
-
- const normalIds = idsByPredicate(
- (p) =>
- ['pw-play', 'Music Player Demo'].includes(p['application.name']) &&
- p['application.name'] !== 'Fluxer' &&
- p['application.name'] !== 'Descendant Player' &&
- !(p['node.name'] || '').startsWith('Fluxer '),
- );
- const fluxerAppIds = idsByPredicate((p) => p['application.name'] === 'Fluxer');
- const fluxerNodeIds = idsByPredicate((p) => (p['node.name'] || '').startsWith('Fluxer '));
- const descendantIds = idsByPredicate((p) => p['application.name'] === 'Descendant Player');
-
- record(
- 'normal external apps ARE captured',
- normalIds.length >= 2 && normalIds.every((id) => captured.has(id)),
- `normal=${normalIds} captured=${[...captured]}`,
- );
- record(
- 'Fluxer-named app (application.name) is EXCLUDED',
- fluxerAppIds.length >= 1 && fluxerAppIds.every((id) => !captured.has(id)),
- `fluxerApp=${fluxerAppIds}`,
- );
- record(
- 'Fluxer-named app (node.name prefix) is EXCLUDED',
- fluxerNodeIds.length >= 1 && fluxerNodeIds.every((id) => !captured.has(id)),
- `fluxerNode=${fluxerNodeIds}`,
- );
- record(
- 'descendant-PID player is EXCLUDED (self-process tree)',
- descendantIds.length >= 1 && descendantIds.every((id) => !captured.has(id)),
- `descendant=${descendantIds}`,
- );
-
- const afterSpeakerSources = sourcesInto(dump);
- record(
- 'apps STILL play to real speakers during capture (tap, not move)',
- afterSpeakerSources >= preSpeakerSources,
- `before=${preSpeakerSources} after=${afterSpeakerSources} distinct app streams -> speakers`,
- );
-
- const meta = dump.find((o) => o.type === 'PipeWire:Interface:Metadata' && o.props?.['metadata.name'] === 'default');
- const def = meta?.metadata?.find((m) => m.key === 'default.audio.sink')?.value?.name;
- record('default audio sink unchanged (test_speakers)', def === 'test_speakers', `default=${def}`);
-
- await finish(bridge);
-}
-
-async function finish(bridge) {
- bridge.release();
- const cleared = await waitFor(() => (bridge.routingGraph().ownedLinks.length === 0 ? true : null), 5000);
- record(
- 'release()+settle removes all owned links',
- !!cleared,
- cleared ? '0 owned links' : `still ${bridge.routingGraph().ownedLinks.length}`,
- );
- await sleep(500);
- const d = pwDump();
- const sinkId = Number(nodesByName(d, SINK_NAME)[0]?.id);
- const residual = Number.isNaN(sinkId) ? 0 : links(d).filter((l) => l.inNode === sinkId).length;
- record('no residual links into fluxer sink after release', residual === 0, `residual=${residual}`);
- killAll();
- const failed = results.filter((r) => !r.ok).length;
- console.log(`\n=== ${results.length - failed}/${results.length} checks passed ===`);
- process.exit(failed === 0 ? 0 : 1);
-}
-
-process.on('exit', killAll);
-main().catch((e) => {
- killAll();
- console.error('HARNESS ERROR:', e?.stack || e);
- process.exit(2);
-});
diff --git a/fluxer_desktop/native/linux-audio-capture/vm_tests/run_validation.sh b/fluxer_desktop/native/linux-audio-capture/vm_tests/run_validation.sh
deleted file mode 100755
index e5ca85f78..000000000
--- a/fluxer_desktop/native/linux-audio-capture/vm_tests/run_validation.sh
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env bash
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-set -uo pipefail
-
-WORK="${FLX_WORK:-/home/parallels/flx-vmtest}"
-ADDON_SO="${FLX_ADDON_SO:-/home/parallels/flx-target/debug/libfluxer_linux_audio_capture.so}"
-HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-mkdir -p "$WORK"
-export XDG_RUNTIME_DIR="$WORK/xdg"
-mkdir -p "$XDG_RUNTIME_DIR"; chmod 700 "$XDG_RUNTIME_DIR"
-export PIPEWIRE_RUNTIME_DIR="$XDG_RUNTIME_DIR"
-export PULSE_RUNTIME_PATH="$XDG_RUNTIME_DIR/pulse"
-unset DISPLAY WAYLAND_DISPLAY DBUS_SESSION_BUS_ADDRESS
-
-PIDS=()
-cleanup() {
- for p in "${PIDS[@]:-}"; do kill -9 "$p" 2>/dev/null; done
- pkill -9 -u "$(id -un)" -f "pipewire" 2>/dev/null
- pkill -9 -u "$(id -un)" -f "wireplumber" 2>/dev/null
-}
-trap cleanup EXIT
-
-echo "=== starting private pipewire server (runtime=$XDG_RUNTIME_DIR) ==="
-pipewire >"$WORK/pipewire.log" 2>&1 & PIDS+=($!)
-sleep 0.8
-pipewire-pulse >"$WORK/pipewire-pulse.log" 2>&1 & PIDS+=($!)
-sleep 0.5
-wireplumber >"$WORK/wireplumber.log" 2>&1 & PIDS+=($!)
-
-for _ in $(seq 1 40); do pw-cli info 0 >/dev/null 2>&1 && break; sleep 0.25; done
-if ! pw-cli info 0 >/dev/null 2>&1; then
- echo "FATAL: private pipewire did not come up"; cat "$WORK/pipewire.log"; exit 2
-fi
-
-echo "=== creating virtual speakers (default sink) ==="
-pactl load-module module-null-sink sink_name=test_speakers sink_properties='device.description=Test_Speakers' >/dev/null 2>&1
-pactl set-default-sink test_speakers 2>/dev/null
-sleep 0.4
-
-echo "=== generating a real 600s stereo tone ==="
-TONE="$WORK/tone.wav"
-[ -f "$TONE" ] || ffmpeg -hide_banner -loglevel error -f lavfi -i "sine=frequency=440:duration=600" -ac 2 -ar 48000 "$TONE" /dev/null 2>&1 & PIDS+=($!)
-pw-play --target test_speakers -P '{ application.name = "Music Player Demo" }' "$TONE" >/dev/null 2>&1 & PIDS+=($!)
-pw-play --target test_speakers -P '{ application.name = "Fluxer" }' "$TONE" >/dev/null 2>&1 & PIDS+=($!)
-pw-play --target test_speakers -P '{ node.name = "Fluxer Helper Stream" }' "$TONE" >/dev/null 2>&1 & PIDS+=($!)
-sleep 1.5
-
-echo "=== pre-test graph (fluxer sink should be ABSENT) ==="
-pw-dump | node -e 'const d=JSON.parse(require("fs").readFileSync(0));const f=d.filter(o=>o.type==="PipeWire:Interface:Node"&&/fluxer-screen-share/.test(o.info?.props?.["node.name"]||""));console.log("fluxer sink nodes pre-test:",f.length);'
-
-echo "=== running napi SYSTEM-capture validation harness ==="
-export FLX_ADDON_SO="$ADDON_SO" FLX_WORK="$WORK"
-node "$HERE/pw_graph_validation.mjs"
-HARNESS_RC=$?
-
-echo "=== running napi DIRECT (per-process) capture validation harness ==="
-node "$HERE/direct_capture_validation.mjs"
-DIRECT_RC=$?
-[ "$DIRECT_RC" = "0" ] || HARNESS_RC=$DIRECT_RC
-
-echo "=== post-exit cleanup check (Drop must remove the fluxer sink) ==="
-sleep 0.8
-RESIDUAL=$(pw-dump | node -e 'const d=JSON.parse(require("fs").readFileSync(0));const f=d.filter(o=>(o.type==="PipeWire:Interface:Node"&&/fluxer/.test(o.info?.props?.["node.name"]||""))||(o.type==="PipeWire:Interface:Link"&&/fluxer/.test(JSON.stringify(o.info?.props||{}))));console.log(f.length);')
-if [ "$RESIDUAL" = "0" ]; then
- echo "PASS no fluxer nodes/links remain after addon process exit (clean teardown)"
-else
- echo "FAIL $RESIDUAL residual fluxer objects after addon process exit"
- HARNESS_RC=1
-fi
-
-echo "=== DONE rc=$HARNESS_RC ==="
-exit $HARNESS_RC
diff --git a/fluxer_desktop/native/nv12-gpu-pack/src/lib.rs b/fluxer_desktop/native/nv12-gpu-pack/src/lib.rs
index 98a2943ee..70104c615 100644
--- a/fluxer_desktop/native/nv12-gpu-pack/src/lib.rs
+++ b/fluxer_desktop/native/nv12-gpu-pack/src/lib.rs
@@ -525,671 +525,3 @@ pub fn try_acquire_device() -> Option<(wgpu::Device, wgpu::Queue, wgpu::Instance
Err(_) => None,
}
}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- use fluxer_gpu_rebuild::{GpuLossRegistry, RebuildOutcome};
-
- struct GpuCtx {
- device: wgpu::Device,
- queue: wgpu::Queue,
- _instance: wgpu::Instance,
- }
-
- fn gpu_ctx() -> Option {
- let (device, queue, instance) = try_acquire_device()?;
- Some(GpuCtx {
- device,
- queue,
- _instance: instance,
- })
- }
-
- fn make_source_texture(
- device: &wgpu::Device,
- queue: &wgpu::Queue,
- width: u32,
- height: u32,
- pixels: &[u8],
- ) -> wgpu::Texture {
- assert_eq!(
- pixels.len() as u64,
- u64::from(width) * u64::from(height) * 4
- );
- let texture = device.create_texture(&wgpu::TextureDescriptor {
- label: Some("nv12_gpu_pack.test_source"),
- size: wgpu::Extent3d {
- width,
- height,
- depth_or_array_layers: 1,
- },
- mip_level_count: 1,
- sample_count: 1,
- dimension: wgpu::TextureDimension::D2,
- format: wgpu::TextureFormat::Rgba8Unorm,
- usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
- view_formats: &[],
- });
- queue.write_texture(
- wgpu::TexelCopyTextureInfo {
- texture: &texture,
- mip_level: 0,
- origin: wgpu::Origin3d::ZERO,
- aspect: wgpu::TextureAspect::All,
- },
- pixels,
- wgpu::TexelCopyBufferLayout {
- offset: 0,
- bytes_per_row: Some(width * 4),
- rows_per_image: Some(height),
- },
- wgpu::Extent3d {
- width,
- height,
- depth_or_array_layers: 1,
- },
- );
- texture
- }
-
- fn make_storage_buffer(device: &wgpu::Device, size: u64, label: &str) -> wgpu::Buffer {
- device.create_buffer(&wgpu::BufferDescriptor {
- label: Some(label),
- size,
- usage: wgpu::BufferUsages::STORAGE
- | wgpu::BufferUsages::COPY_SRC
- | wgpu::BufferUsages::COPY_DST,
- mapped_at_creation: false,
- })
- }
-
- fn read_buffer(device: &wgpu::Device, queue: &wgpu::Queue, src: &wgpu::Buffer) -> Vec {
- let size = src.size();
- let staging = device.create_buffer(&wgpu::BufferDescriptor {
- label: Some("nv12_gpu_pack.test_staging"),
- size,
- usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
- mapped_at_creation: false,
- });
- let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
- label: Some("nv12_gpu_pack.test_readback"),
- });
- encoder.copy_buffer_to_buffer(src, 0, &staging, 0, size);
- queue.submit(std::iter::once(encoder.finish()));
- let slice = staging.slice(..);
- let (tx, rx) = std::sync::mpsc::channel();
- slice.map_async(wgpu::MapMode::Read, move |res| {
- let _ = tx.send(res);
- });
- let _ = device.poll(wgpu::PollType::Wait {
- submission_index: None,
- timeout: None,
- });
- let recv = rx.recv();
- assert!(recv.is_ok(), "channel must deliver map result");
- let map_result = recv.expect("map result channel");
- assert!(map_result.is_ok(), "map_async must succeed");
- let data = {
- let range = slice.get_mapped_range();
- range.to_vec()
- };
- staging.unmap();
- data
- }
-
- fn pack_and_readback(
- ctx: &GpuCtx,
- packer: &Nv12Packer,
- texture: &wgpu::Texture,
- width: u32,
- height: u32,
- ) -> (Vec, Vec) {
- let y_size = Nv12Packer::y_plane_size(width, height);
- let uv_size = Nv12Packer::uv_plane_size(width, height);
- let y_buf = make_storage_buffer(&ctx.device, y_size, "y");
- let uv_buf = make_storage_buffer(&ctx.device, uv_size, "uv");
- let view = texture.create_view(&wgpu::TextureViewDescriptor::default());
- let mut encoder = ctx
- .device
- .create_command_encoder(&wgpu::CommandEncoderDescriptor {
- label: Some("nv12_gpu_pack.test_encoder"),
- });
- let result = packer.pack(PackJob {
- device: &ctx.device,
- queue: &ctx.queue,
- encoder: &mut encoder,
- source: &view,
- y_out: &y_buf,
- uv_out: &uv_buf,
- dims: (width, height),
- });
- assert!(result.is_ok(), "pack must succeed: {result:?}");
- ctx.queue.submit(std::iter::once(encoder.finish()));
- let y = read_buffer(&ctx.device, &ctx.queue, &y_buf);
- let uv = read_buffer(&ctx.device, &ctx.queue, &uv_buf);
- (y, uv)
- }
-
- #[test]
- fn solid_gray_packs_to_expected_bt709_limited() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 16;
- let height: u32 = 8;
- let mut pixels = vec![0u8; (width * height * 4) as usize];
- for chunk in pixels.chunks_exact_mut(4) {
- chunk[0] = 128;
- chunk[1] = 128;
- chunk[2] = 128;
- chunk[3] = 255;
- }
- let tex = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let packer = Nv12Packer::new(&ctx.device, width, height);
- let (y, uv) = pack_and_readback(&ctx, &packer, &tex, width, height);
- for value in &y {
- assert!(
- (124..=128).contains(value),
- "Y value {value} out of expected range for gray 128"
- );
- }
- for value in &uv {
- assert!(
- (126..=130).contains(value),
- "UV value {value} out of expected range for neutral gray"
- );
- }
- }
-
- #[test]
- fn solid_red_v_is_above_neutral() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 16;
- let height: u32 = 8;
- let mut pixels = vec![0u8; (width * height * 4) as usize];
- for chunk in pixels.chunks_exact_mut(4) {
- chunk[0] = 255;
- chunk[1] = 0;
- chunk[2] = 0;
- chunk[3] = 255;
- }
- let tex = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let packer = Nv12Packer::new(&ctx.device, width, height);
- let (_y, uv) = pack_and_readback(&ctx, &packer, &tex, width, height);
- for pair in uv.chunks_exact(2) {
- let u = pair[0];
- let v = pair[1];
- assert!(u < 128, "expected U below neutral for pure red, got {u}");
- assert!(
- v > 200,
- "expected V well above neutral for pure red, got {v}"
- );
- }
- }
-
- #[test]
- fn rejects_dims_exceeding_max() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let max_w: u32 = 8;
- let max_h: u32 = 8;
- let packer = Nv12Packer::new(&ctx.device, max_w, max_h);
- let y_size = Nv12Packer::y_plane_size(16, 16);
- let uv_size = Nv12Packer::uv_plane_size(16, 16);
- let y_buf = make_storage_buffer(&ctx.device, y_size, "y");
- let uv_buf = make_storage_buffer(&ctx.device, uv_size, "uv");
- let dummy_pixels = vec![0u8; (max_w * max_h * 4) as usize];
- let tex = make_source_texture(&ctx.device, &ctx.queue, max_w, max_h, &dummy_pixels);
- let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
- let mut encoder = ctx
- .device
- .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
- let result = packer.pack(PackJob {
- device: &ctx.device,
- queue: &ctx.queue,
- encoder: &mut encoder,
- source: &view,
- y_out: &y_buf,
- uv_out: &uv_buf,
- dims: (16, 16),
- });
- assert!(matches!(
- result,
- Err(Nv12PackError::DimensionsExceedMax { .. })
- ));
- }
-
- #[test]
- fn rejects_odd_dims() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let packer = Nv12Packer::new(&ctx.device, 32, 32);
- let y_buf = make_storage_buffer(&ctx.device, 64, "y");
- let uv_buf = make_storage_buffer(&ctx.device, 64, "uv");
- let dummy_pixels = vec![0u8; (8 * 8 * 4) as usize];
- let tex = make_source_texture(&ctx.device, &ctx.queue, 8, 8, &dummy_pixels);
- let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
- let mut encoder = ctx
- .device
- .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
- let result = packer.pack(PackJob {
- device: &ctx.device,
- queue: &ctx.queue,
- encoder: &mut encoder,
- source: &view,
- y_out: &y_buf,
- uv_out: &uv_buf,
- dims: (7, 8),
- });
- assert!(matches!(
- result,
- Err(Nv12PackError::DimensionsNotEven { .. })
- ));
- }
-
- #[test]
- fn determinism_two_runs_same_input_same_output() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 32;
- let height: u32 = 16;
- let mut pixels = vec![0u8; (width * height * 4) as usize];
- for (i, chunk) in pixels.chunks_exact_mut(4).enumerate() {
- let v = (i % 251) as u8;
- chunk[0] = v;
- chunk[1] = v.wrapping_mul(2);
- chunk[2] = v.wrapping_add(31);
- chunk[3] = 255;
- }
- let tex = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let packer = Nv12Packer::new(&ctx.device, width, height);
- let (y1, uv1) = pack_and_readback(&ctx, &packer, &tex, width, height);
- let (y2, uv2) = pack_and_readback(&ctx, &packer, &tex, width, height);
- assert_eq!(y1, y2, "Y plane must be deterministic");
- assert_eq!(uv1, uv2, "UV plane must be deterministic");
- }
-
- #[test]
- fn buffer_too_small_is_rejected() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let packer = Nv12Packer::new(&ctx.device, 64, 64);
- let y_buf = make_storage_buffer(&ctx.device, 16, "y");
- let uv_buf = make_storage_buffer(&ctx.device, 16, "uv");
- let pixels = vec![0u8; (16 * 16 * 4) as usize];
- let tex = make_source_texture(&ctx.device, &ctx.queue, 16, 16, &pixels);
- let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
- let mut encoder = ctx
- .device
- .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
- let result = packer.pack(PackJob {
- device: &ctx.device,
- queue: &ctx.queue,
- encoder: &mut encoder,
- source: &view,
- y_out: &y_buf,
- uv_out: &uv_buf,
- dims: (16, 16),
- });
- assert!(matches!(result, Err(Nv12PackError::YBufferTooSmall { .. })));
- }
-
- #[test]
- fn packer_is_ready_only_when_built() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let mut packer = Nv12Packer::new(&ctx.device, 32, 32);
- assert!(
- packer.is_ready(),
- "freshly constructed packer must be ready"
- );
- packer.release();
- assert!(!packer.is_ready(), "released packer must not be ready");
- let rebuilt = packer.rebuild(&ctx.device, &ctx.queue);
- assert!(rebuilt.is_ok(), "rebuild on a fresh device must succeed");
- assert!(packer.is_ready(), "rebuilt packer must be ready");
- }
-
- #[test]
- fn pack_between_release_and_rebuild_returns_not_ready() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let mut packer = Nv12Packer::new(&ctx.device, 16, 16);
- packer.release();
- let y_buf = make_storage_buffer(&ctx.device, 256, "y");
- let uv_buf = make_storage_buffer(&ctx.device, 256, "uv");
- let dummy_pixels = vec![0u8; (16 * 16 * 4) as usize];
- let tex = make_source_texture(&ctx.device, &ctx.queue, 16, 16, &dummy_pixels);
- let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
- let mut encoder = ctx
- .device
- .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
- let result = packer.pack(PackJob {
- device: &ctx.device,
- queue: &ctx.queue,
- encoder: &mut encoder,
- source: &view,
- y_out: &y_buf,
- uv_out: &uv_buf,
- dims: (16, 16),
- });
- assert!(matches!(result, Err(Nv12PackError::NotReady)));
- }
-
- #[test]
- fn registry_release_then_rebuild_invokes_callback_in_order() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let registry = GpuLossRegistry::new();
- let packer = Box::new(Nv12Packer::new(&ctx.device, 16, 16));
- let _guard = registry.register(packer);
- let report = registry.handle_device_lost(&ctx.device, &ctx.queue);
- assert_eq!(report.released_count, 1);
- assert_eq!(report.rebuilt_count, 1);
- assert_eq!(report.failed_count, 0);
- assert!(report.is_total_success());
- }
-
- #[test]
- fn after_loss_handling_packer_can_pack_again() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 16;
- let height: u32 = 8;
- let pixels = vec![128u8; (width * height * 4) as usize];
- let tex = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let mut packer = Nv12Packer::new(&ctx.device, width, height);
- packer.release();
- packer
- .rebuild(&ctx.device, &ctx.queue)
- .expect("rebuild must succeed after release");
- let (y, _uv) = pack_and_readback(&ctx, &packer, &tex, width, height);
- assert!(!y.is_empty(), "Y plane must be non-empty after rebuild");
- assert!(
- (124..=128).contains(&y[0]),
- "Y value out of range for gray 128 after rebuild: {}",
- y[0]
- );
- }
-
- #[test]
- fn determinism_across_rebuild_round_trip() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 32;
- let height: u32 = 16;
- let mut pixels = vec![0u8; (width * height * 4) as usize];
- for (i, chunk) in pixels.chunks_exact_mut(4).enumerate() {
- let v = (i % 251) as u8;
- chunk[0] = v;
- chunk[1] = v.wrapping_mul(2);
- chunk[2] = v.wrapping_add(31);
- chunk[3] = 255;
- }
- let tex = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let mut packer = Nv12Packer::new(&ctx.device, width, height);
- let (y1, uv1) = pack_and_readback(&ctx, &packer, &tex, width, height);
- packer.release();
- packer
- .rebuild(&ctx.device, &ctx.queue)
- .expect("rebuild must succeed");
- let (y2, uv2) = pack_and_readback(&ctx, &packer, &tex, width, height);
- assert_eq!(y1, y2, "Y plane must match across rebuild round-trip");
- assert_eq!(uv1, uv2, "UV plane must match across rebuild round-trip");
- }
-
- #[test]
- fn double_rebuild_without_release_is_owner_invariant_error() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let mut packer = Nv12Packer::new(&ctx.device, 16, 16);
- let outcome = packer.rebuild(&ctx.device, &ctx.queue);
- assert!(matches!(
- outcome,
- Err(GpuRebuildError::OwnerInvariantBroken { .. })
- ));
- }
-
- struct FailingRebuildOwner {
- ready: bool,
- }
-
- impl FailingRebuildOwner {
- fn new() -> Self {
- Self { ready: true }
- }
- }
-
- impl GpuLossCallback for FailingRebuildOwner {
- fn release(&mut self) {
- let was_ready = self.ready;
- assert!(
- was_ready,
- "FailingRebuildOwner release must observe ready state",
- );
- self.ready = false;
- assert!(!self.ready, "FailingRebuildOwner postcondition");
- }
- fn rebuild(
- &mut self,
- _device: &wgpu::Device,
- _queue: &wgpu::Queue,
- ) -> Result<(), GpuRebuildError> {
- assert!(
- !self.ready,
- "rebuild must run after release in FailingRebuildOwner"
- );
- Err(GpuRebuildError::DeviceRejected {
- reason: "synthetic second-device failure",
- })
- }
- fn is_ready(&self) -> bool {
- self.ready
- }
- fn debug_label(&self) -> &'static str {
- "test.failing_rebuild_owner"
- }
- }
-
- #[test]
- fn failed_rebuild_surfaces_in_report_and_owner_reports_not_ready() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let registry = GpuLossRegistry::new();
- let _guard = registry.register(Box::new(FailingRebuildOwner::new()));
- let report = registry.handle_device_lost(&ctx.device, &ctx.queue);
- assert_eq!(report.released_count, 1);
- assert_eq!(report.failed_count, 1);
- assert_eq!(report.rebuilt_count, 0);
- assert!(!report.is_total_success());
- let failed = report
- .outcomes
- .iter()
- .filter(|o| matches!(o, RebuildOutcome::Failed { .. }))
- .count();
- assert_eq!(failed, 1);
- }
-
- #[test]
- fn multiple_packers_release_lifo_rebuild_fifo() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let registry = GpuLossRegistry::new();
- let mut guards = Vec::new();
- for _ in 0..3u32 {
- let packer = Box::new(Nv12Packer::new(&ctx.device, 16, 16));
- guards.push(registry.register(packer));
- }
- assert_eq!(registry.len(), 3);
- let report = registry.handle_device_lost(&ctx.device, &ctx.queue);
- assert_eq!(report.released_count, 3);
- assert_eq!(report.rebuilt_count, 3);
- assert_eq!(report.failed_count, 0);
- for outcome in &report.outcomes {
- assert!(matches!(outcome, RebuildOutcome::Rebuilt { .. }));
- }
- drop(guards);
- }
-
- fn pack_one_pass(
- ctx: &GpuCtx,
- packer: &Nv12Packer,
- view: &wgpu::TextureView,
- y_buf: &wgpu::Buffer,
- uv_buf: &wgpu::Buffer,
- width: u32,
- height: u32,
- ) {
- let mut encoder = ctx
- .device
- .create_command_encoder(&wgpu::CommandEncoderDescriptor {
- label: Some("nv12_gpu_pack.cache_test_encoder"),
- });
- let result = packer.pack(PackJob {
- device: &ctx.device,
- queue: &ctx.queue,
- encoder: &mut encoder,
- source: view,
- y_out: y_buf,
- uv_out: uv_buf,
- dims: (width, height),
- });
- assert!(result.is_ok(), "pack must succeed: {result:?}");
- ctx.queue.submit(std::iter::once(encoder.finish()));
- }
-
- #[test]
- fn cache_hit_when_pack_called_twice_with_same_inputs() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 32;
- let height: u32 = 16;
- let pixels = vec![64u8; (width * height * 4) as usize];
- let tex = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
- let packer = Nv12Packer::new(&ctx.device, width, height);
- let y_buf = make_storage_buffer(&ctx.device, Nv12Packer::y_plane_size(width, height), "y");
- let uv_buf =
- make_storage_buffer(&ctx.device, Nv12Packer::uv_plane_size(width, height), "uv");
- assert_eq!(packer.cached_bind_group_count(), 0);
- pack_one_pass(&ctx, &packer, &view, &y_buf, &uv_buf, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- pack_one_pass(&ctx, &packer, &view, &y_buf, &uv_buf, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- }
-
- #[test]
- fn cache_miss_when_buffers_change() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 32;
- let height: u32 = 16;
- let pixels = vec![64u8; (width * height * 4) as usize];
- let tex = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
- let packer = Nv12Packer::new(&ctx.device, width, height);
- let y_buf_a =
- make_storage_buffer(&ctx.device, Nv12Packer::y_plane_size(width, height), "y_a");
- let uv_buf_a = make_storage_buffer(
- &ctx.device,
- Nv12Packer::uv_plane_size(width, height),
- "uv_a",
- );
- pack_one_pass(&ctx, &packer, &view, &y_buf_a, &uv_buf_a, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- let y_buf_b =
- make_storage_buffer(&ctx.device, Nv12Packer::y_plane_size(width, height), "y_b");
- let uv_buf_b = make_storage_buffer(
- &ctx.device,
- Nv12Packer::uv_plane_size(width, height),
- "uv_b",
- );
- pack_one_pass(&ctx, &packer, &view, &y_buf_b, &uv_buf_b, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- pack_one_pass(&ctx, &packer, &view, &y_buf_a, &uv_buf_a, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- }
-
- #[test]
- fn cache_invalidated_on_release() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 32;
- let height: u32 = 16;
- let pixels = vec![64u8; (width * height * 4) as usize];
- let tex = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let view = tex.create_view(&wgpu::TextureViewDescriptor::default());
- let mut packer = Nv12Packer::new(&ctx.device, width, height);
- let y_buf = make_storage_buffer(&ctx.device, Nv12Packer::y_plane_size(width, height), "y");
- let uv_buf =
- make_storage_buffer(&ctx.device, Nv12Packer::uv_plane_size(width, height), "uv");
- pack_one_pass(&ctx, &packer, &view, &y_buf, &uv_buf, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- packer.release();
- assert_eq!(packer.cached_bind_group_count(), 0);
- packer
- .rebuild(&ctx.device, &ctx.queue)
- .expect("rebuild must succeed");
- assert_eq!(packer.cached_bind_group_count(), 0);
- pack_one_pass(&ctx, &packer, &view, &y_buf, &uv_buf, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- }
-
- #[test]
- fn cache_replaces_when_source_view_changes() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("nv12-gpu-pack: no wgpu adapter, skipping");
- return;
- };
- let width: u32 = 32;
- let height: u32 = 16;
- let pixels = vec![64u8; (width * height * 4) as usize];
- let tex_a = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let tex_b = make_source_texture(&ctx.device, &ctx.queue, width, height, &pixels);
- let view_a = tex_a.create_view(&wgpu::TextureViewDescriptor::default());
- let view_b = tex_b.create_view(&wgpu::TextureViewDescriptor::default());
- let packer = Nv12Packer::new(&ctx.device, width, height);
- let y_buf = make_storage_buffer(&ctx.device, Nv12Packer::y_plane_size(width, height), "y");
- let uv_buf =
- make_storage_buffer(&ctx.device, Nv12Packer::uv_plane_size(width, height), "uv");
- pack_one_pass(&ctx, &packer, &view_a, &y_buf, &uv_buf, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- pack_one_pass(&ctx, &packer, &view_b, &y_buf, &uv_buf, width, height);
- assert_eq!(packer.cached_bind_group_count(), 1);
- }
-}
diff --git a/fluxer_desktop/native/platform-info/index.js b/fluxer_desktop/native/platform-info/index.js
index 3b3219b61..eab84e56c 100644
--- a/fluxer_desktop/native/platform-info/index.js
+++ b/fluxer_desktop/native/platform-info/index.js
@@ -3,6 +3,7 @@
const {existsSync} = require('node:fs');
const {join, sep} = require('node:path');
const {createNativeLoadError, loadNativeBinding} = require('./loader-diagnostics.cjs');
+const {nativeFileName} = require('./pure.cjs');
const MODULE_NAME = '@fluxer/platform-info';
const SKIP_NATIVE_PROBE_ENV = 'FLUXER_PLATFORM_INFO_SKIP_NATIVE_PROBE';
@@ -13,21 +14,6 @@ function resolveNativeRoot() {
return existsSync(unpackedDir) ? unpackedDir : __dirname;
}
-function nativeFileName(platform = process.platform, arch = process.arch) {
- switch (platform) {
- case 'darwin':
- if (arch === 'x64' || arch === 'arm64') return `platform-info.darwin-${arch}.node`;
- break;
- case 'win32':
- if (arch === 'x64' || arch === 'arm64') return `platform-info.win32-${arch}-msvc.node`;
- break;
- case 'linux':
- if (arch === 'x64' || arch === 'arm64') return `platform-info.linux-${arch}-gnu.node`;
- break;
- }
- throw new Error(`Unsupported platform-info target: ${platform}/${arch}`);
-}
-
let binding = null;
let loadError = null;
diff --git a/fluxer_desktop/native/platform-info/package.json b/fluxer_desktop/native/platform-info/package.json
index 3c2fd7413..b5517f6cb 100644
--- a/fluxer_desktop/native/platform-info/package.json
+++ b/fluxer_desktop/native/platform-info/package.json
@@ -14,6 +14,7 @@
"index.js",
"index.d.ts",
"loader-diagnostics.cjs",
+ "pure.cjs",
"platform-info.darwin-x64.node",
"platform-info.darwin-arm64.node",
"platform-info.win32-x64-msvc.node",
diff --git a/fluxer_desktop/native/platform-info/pure.cjs b/fluxer_desktop/native/platform-info/pure.cjs
new file mode 100644
index 000000000..7523f25ec
--- /dev/null
+++ b/fluxer_desktop/native/platform-info/pure.cjs
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+function nativeFileName(platform = process.platform, arch = process.arch) {
+ switch (platform) {
+ case 'darwin':
+ if (arch === 'x64' || arch === 'arm64') return `platform-info.darwin-${arch}.node`;
+ break;
+ case 'win32':
+ if (arch === 'x64' || arch === 'arm64') return `platform-info.win32-${arch}-msvc.node`;
+ break;
+ case 'linux':
+ if (arch === 'x64' || arch === 'arm64') return `platform-info.linux-${arch}-gnu.node`;
+ break;
+ }
+ throw new Error(`Unsupported platform-info target: ${platform}/${arch}`);
+}
+
+module.exports = {
+ nativeFileName,
+};
diff --git a/fluxer_desktop/native/platform-info/test/loader.test.mjs b/fluxer_desktop/native/platform-info/test/loader.test.mjs
index 11cf0741d..12376630f 100644
--- a/fluxer_desktop/native/platform-info/test/loader.test.mjs
+++ b/fluxer_desktop/native/platform-info/test/loader.test.mjs
@@ -2,19 +2,13 @@
import assert from 'node:assert/strict';
import test from 'node:test';
-import platformInfo from '../index.js';
-
-test('loader exposes a stable optional native surface', () => {
- assert.equal(typeof platformInfo, 'object');
- assert.equal(platformInfo.getGpuInfo === null || typeof platformInfo.getGpuInfo === 'function', true);
- assert.equal(platformInfo.loadError === null || platformInfo.loadError instanceof Error, true);
-});
+import platformInfoPure from '../pure.cjs';
test('loader resolves native binaries for supported platforms and architectures', () => {
- assert.equal(platformInfo._private.nativeFileName('darwin', 'x64'), 'platform-info.darwin-x64.node');
- assert.equal(platformInfo._private.nativeFileName('darwin', 'arm64'), 'platform-info.darwin-arm64.node');
- assert.equal(platformInfo._private.nativeFileName('linux', 'x64'), 'platform-info.linux-x64-gnu.node');
- assert.equal(platformInfo._private.nativeFileName('linux', 'arm64'), 'platform-info.linux-arm64-gnu.node');
- assert.equal(platformInfo._private.nativeFileName('win32', 'x64'), 'platform-info.win32-x64-msvc.node');
- assert.equal(platformInfo._private.nativeFileName('win32', 'arm64'), 'platform-info.win32-arm64-msvc.node');
+ assert.equal(platformInfoPure.nativeFileName('darwin', 'x64'), 'platform-info.darwin-x64.node');
+ assert.equal(platformInfoPure.nativeFileName('darwin', 'arm64'), 'platform-info.darwin-arm64.node');
+ assert.equal(platformInfoPure.nativeFileName('linux', 'x64'), 'platform-info.linux-x64-gnu.node');
+ assert.equal(platformInfoPure.nativeFileName('linux', 'arm64'), 'platform-info.linux-arm64-gnu.node');
+ assert.equal(platformInfoPure.nativeFileName('win32', 'x64'), 'platform-info.win32-x64-msvc.node');
+ assert.equal(platformInfoPure.nativeFileName('win32', 'arm64'), 'platform-info.win32-arm64-msvc.node');
});
diff --git a/fluxer_desktop/native/screen-frame-bus/src/gpu_loss.rs b/fluxer_desktop/native/screen-frame-bus/src/gpu_loss.rs
index 0d50f24a2..2aefdd5a6 100644
--- a/fluxer_desktop/native/screen-frame-bus/src/gpu_loss.rs
+++ b/fluxer_desktop/native/screen-frame-bus/src/gpu_loss.rs
@@ -193,216 +193,10 @@ fn build_resources(device: &wgpu::Device, config: WgpuStagingConfig) -> WgpuStag
}
}
-pub fn try_acquire_device() -> Option<(wgpu::Device, wgpu::Queue, wgpu::Instance)> {
- let mut descriptor = wgpu::InstanceDescriptor::new_without_display_handle();
- descriptor.backends = wgpu::Backends::all() | wgpu::Backends::SECONDARY;
- let instance = wgpu::Instance::new(descriptor);
- let adapter = pollster_block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
- power_preference: wgpu::PowerPreference::default(),
- force_fallback_adapter: false,
- compatible_surface: None,
- }))
- .ok()?;
- let device_result = pollster_block_on(adapter.request_device(&wgpu::DeviceDescriptor {
- label: Some("screen_frame_bus.wgpu_staging_backend.test_device"),
- required_features: wgpu::Features::empty(),
- required_limits: wgpu::Limits::default(),
- memory_hints: wgpu::MemoryHints::default(),
- trace: wgpu::Trace::Off,
- experimental_features: wgpu::ExperimentalFeatures::default(),
- }));
- match device_result {
- Ok((device, queue)) => Some((device, queue, instance)),
- Err(_) => None,
- }
-}
-
-fn pollster_block_on(fut: F) -> F::Output {
- futures_executor_block_on(fut)
-}
-
-fn futures_executor_block_on(mut fut: F) -> F::Output {
- use core::pin::Pin;
- use core::task::{Context, Poll, RawWaker, RawWakerVTable, Waker};
- fn raw_waker() -> RawWaker {
- fn no_op(_: *const ()) {}
- fn clone(_: *const ()) -> RawWaker {
- raw_waker()
- }
- static VTABLE: RawWakerVTable = RawWakerVTable::new(clone, no_op, no_op, no_op);
- RawWaker::new(core::ptr::null(), &VTABLE)
- }
- let waker = unsafe { Waker::from_raw(raw_waker()) };
- let mut cx = Context::from_waker(&waker);
- let mut fut = unsafe { Pin::new_unchecked(&mut fut) };
- loop {
- match fut.as_mut().poll(&mut cx) {
- Poll::Ready(out) => return out,
- Poll::Pending => continue,
- }
- }
-}
-
#[cfg(test)]
mod tests {
- use super::*;
- use crate::{CpuStagingBackend, STAGING_PAIR_LEN, StagingSurfacePair};
- use fluxer_gpu_rebuild::{GpuLossRegistry, RebuildOutcome};
-
- struct GpuCtx {
- device: wgpu::Device,
- queue: wgpu::Queue,
- _instance: wgpu::Instance,
- }
-
- fn gpu_ctx() -> Option {
- let acquired = std::panic::catch_unwind(std::panic::AssertUnwindSafe(try_acquire_device));
- let (device, queue, instance) = match acquired {
- Ok(Some(triple)) => triple,
- Ok(None) => return None,
- Err(_) => return None,
- };
- Some(GpuCtx {
- device,
- queue,
- _instance: instance,
- })
- }
-
- #[test]
- fn staging_backend_is_ready_only_when_built() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("screen-frame-bus gpu_loss: no wgpu adapter, skipping");
- return;
- };
- let cfg = WgpuStagingConfig::new(256);
- let mut backend = WgpuStagingBackend::new(&ctx.device, cfg);
- assert!(
- GpuLossCallback::is_ready(&backend),
- "freshly built backend must be ready",
- );
- backend.release();
- assert!(
- !GpuLossCallback::is_ready(&backend),
- "released backend must not be ready",
- );
- let outcome = backend.rebuild(&ctx.device, &ctx.queue);
- assert!(outcome.is_ok(), "rebuild on fresh device must succeed");
- assert!(
- GpuLossCallback::is_ready(&backend),
- "rebuilt backend must be ready",
- );
- }
-
- #[test]
- fn registry_handles_staging_backend_round_trip() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("screen-frame-bus gpu_loss: no wgpu adapter, skipping");
- return;
- };
- let registry = GpuLossRegistry::new();
- let backend = Box::new(WgpuStagingBackend::new(
- &ctx.device,
- WgpuStagingConfig::new(128),
- ));
- let _guard = registry.register(backend);
- let report = registry.handle_device_lost(&ctx.device, &ctx.queue);
- assert_eq!(report.released_count, 1);
- assert_eq!(report.rebuilt_count, 1);
- assert_eq!(report.failed_count, 0);
- assert!(report.is_total_success());
- }
-
- #[test]
- fn double_rebuild_without_release_is_owner_invariant_error() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("screen-frame-bus gpu_loss: no wgpu adapter, skipping");
- return;
- };
- let mut backend = WgpuStagingBackend::new(&ctx.device, WgpuStagingConfig::new(64));
- let outcome = backend.rebuild(&ctx.device, &ctx.queue);
- assert!(matches!(
- outcome,
- Err(GpuRebuildError::OwnerInvariantBroken { .. })
- ));
- }
-
- #[test]
- fn write_between_release_and_rebuild_is_a_noop_and_not_ready() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("screen-frame-bus gpu_loss: no wgpu adapter, skipping");
- return;
- };
- let mut backend = WgpuStagingBackend::new(&ctx.device, WgpuStagingConfig::new(64));
- backend.release();
- backend.write(|buf| buf.fill(0xAA));
- assert!(
- !::is_ready(&backend),
- "write before rebuild must not flip ready",
- );
- let observed = backend.read(|buf| buf.len());
- assert_eq!(observed, 0, "read before rebuild must observe empty mirror");
- }
-
- #[test]
- fn surface_pair_with_wgpu_backend_round_trips_cpu_mirror() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("screen-frame-bus gpu_loss: no wgpu adapter, skipping");
- return;
- };
- let cfg = WgpuStagingConfig::new(64);
- let a = WgpuStagingBackend::new(&ctx.device, cfg);
- let b = WgpuStagingBackend::new(&ctx.device, cfg);
- assert_eq!(
- STAGING_PAIR_LEN, 2,
- "OBS staging pair is exactly two surfaces"
- );
- let mut pair: StagingSurfacePair = StagingSurfacePair::new([a, b]);
- pair.submit(0, |buf| {
- buf[0] = 0xDE;
- buf[1] = 0xAD;
- })
- .expect("submit zero must succeed");
- pair.submit(1, |buf| {
- buf[0] = 0xBE;
- buf[1] = 0xEF;
- })
- .expect("submit one must succeed");
- let first = pair
- .try_map(0, |buf| (buf[0], buf[1]))
- .expect("map zero ready");
- assert_eq!(first, (0xDE, 0xAD));
- let second = pair
- .try_map(1, |buf| (buf[0], buf[1]))
- .expect("map one ready");
- assert_eq!(second, (0xBE, 0xEF));
- }
-
- #[test]
- fn registry_holds_mixed_packers_and_staging_backends() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("screen-frame-bus gpu_loss: no wgpu adapter, skipping");
- return;
- };
- let registry = GpuLossRegistry::new();
- let mut guards = Vec::new();
- for i in 0..4u32 {
- let bytes = 32u64 << (i % 4);
- let backend = Box::new(WgpuStagingBackend::new(
- &ctx.device,
- WgpuStagingConfig::new(bytes),
- ));
- guards.push(registry.register(backend));
- }
- let report = registry.handle_device_lost(&ctx.device, &ctx.queue);
- assert_eq!(report.released_count, 4);
- assert_eq!(report.rebuilt_count, 4);
- assert_eq!(report.failed_count, 0);
- for outcome in &report.outcomes {
- assert!(matches!(outcome, RebuildOutcome::Rebuilt { .. }));
- }
- drop(guards);
- }
+ use super::StagingBackend;
+ use crate::CpuStagingBackend;
#[test]
fn cpu_backend_still_works_alongside_wgpu_backend() {
@@ -410,20 +204,4 @@ mod tests {
assert!(::is_idle(&cpu));
assert!(::is_ready(&cpu));
}
-
- #[test]
- fn buffer_handle_disappears_after_release_and_reappears_after_rebuild() {
- let Some(ctx) = gpu_ctx() else {
- eprintln!("screen-frame-bus gpu_loss: no wgpu adapter, skipping");
- return;
- };
- let mut backend = WgpuStagingBackend::new(&ctx.device, WgpuStagingConfig::new(128));
- assert!(backend.buffer().is_some(), "buffer present after build");
- backend.release();
- assert!(backend.buffer().is_none(), "buffer absent after release");
- backend
- .rebuild(&ctx.device, &ctx.queue)
- .expect("rebuild must succeed");
- assert!(backend.buffer().is_some(), "buffer present after rebuild");
- }
}
diff --git a/fluxer_desktop/native/webauthn/index.js b/fluxer_desktop/native/webauthn/index.js
index e4287be67..0e149f5e8 100644
--- a/fluxer_desktop/native/webauthn/index.js
+++ b/fluxer_desktop/native/webauthn/index.js
@@ -4,25 +4,16 @@ const {existsSync} = require('node:fs');
const {createHash} = require('node:crypto');
const {join, sep} = require('node:path');
const {createNativeLoadError, loadNativeBinding} = require('./loader-diagnostics.cjs');
+const {
+ base64Url,
+ clientDataJSON,
+ nativeFileName,
+ normalizeCreateOptions,
+ normalizeGetOptions,
+ transportBits,
+} = require('./pure.cjs');
const MODULE_NAME = '@fluxer/webauthn';
const SKIP_NATIVE_PROBE_ENV = 'FLUXER_WEBAUTHN_SKIP_NATIVE_PROBE';
-const WEBAUTHN_AUTHENTICATOR_ATTACHMENT_ANY = 0;
-const WEBAUTHN_AUTHENTICATOR_ATTACHMENT_PLATFORM = 1;
-const WEBAUTHN_AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM = 2;
-const WEBAUTHN_USER_VERIFICATION_REQUIREMENT_REQUIRED = 1;
-const WEBAUTHN_USER_VERIFICATION_REQUIREMENT_PREFERRED = 2;
-const WEBAUTHN_USER_VERIFICATION_REQUIREMENT_DISCOURAGED = 3;
-const WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_NONE = 1;
-const WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_INDIRECT = 2;
-const WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_DIRECT = 3;
-const WEBAUTHN_ENTERPRISE_ATTESTATION_NONE = 0;
-const WEBAUTHN_ENTERPRISE_ATTESTATION_VENDOR_FACILITATED = 1;
-const WEBAUTHN_CTAP_TRANSPORT_USB = 0x00000001;
-const WEBAUTHN_CTAP_TRANSPORT_NFC = 0x00000002;
-const WEBAUTHN_CTAP_TRANSPORT_BLE = 0x00000004;
-const WEBAUTHN_CTAP_TRANSPORT_INTERNAL = 0x00000010;
-const WEBAUTHN_CTAP_TRANSPORT_HYBRID = 0x00000020;
-const WEBAUTHN_CTAP_TRANSPORT_SMART_CARD = 0x00000040;
function resolveNativeRoot() {
const asarSegment = `${sep}app.asar${sep}`;
@@ -31,13 +22,6 @@ function resolveNativeRoot() {
return existsSync(unpackedDir) ? unpackedDir : __dirname;
}
-function nativeFileName(platform = process.platform, arch = process.arch) {
- if (platform === 'darwin' && (arch === 'x64' || arch === 'arm64')) return `webauthn.darwin-${arch}.node`;
- if (platform === 'win32' && (arch === 'x64' || arch === 'arm64')) return `webauthn.win32-${arch}-msvc.node`;
- if (platform === 'linux' && (arch === 'x64' || arch === 'arm64')) return `webauthn.linux-${arch}-gnu.node`;
- return null;
-}
-
let binding = null;
let loadError = null;
@@ -79,146 +63,10 @@ if (fileName) {
throw loadError;
}
-function base64Url(buffer) {
- return Buffer.from(buffer).toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
-}
-
-function normalizedOrigin(origin) {
- if (typeof origin !== 'string' || origin.length === 0) {
- throw new TypeError('@fluxer/webauthn requires an origin string');
- }
- return new URL(origin).origin;
-}
-
-function relyingPartyId(options, origin) {
- if (typeof options.rpId === 'string' && options.rpId.length > 0) return options.rpId;
- if (options.rp && typeof options.rp.id === 'string' && options.rp.id.length > 0) return options.rp.id;
- return new URL(origin).hostname;
-}
-
-function clientDataJSON(type, challenge, origin) {
- return Buffer.from(
- JSON.stringify({
- type,
- challenge: base64Url(challenge),
- origin,
- crossOrigin: false,
- }),
- 'utf8',
- );
-}
-
function clientDataHash(data) {
return createHash('sha256').update(data).digest();
}
-function authenticatorAttachment(value) {
- if (value === 'platform') return WEBAUTHN_AUTHENTICATOR_ATTACHMENT_PLATFORM;
- if (value === 'cross-platform') return WEBAUTHN_AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM;
- return WEBAUTHN_AUTHENTICATOR_ATTACHMENT_ANY;
-}
-
-function userVerification(value) {
- if (value === 'required') return WEBAUTHN_USER_VERIFICATION_REQUIREMENT_REQUIRED;
- if (value === 'discouraged') return WEBAUTHN_USER_VERIFICATION_REQUIREMENT_DISCOURAGED;
- return WEBAUTHN_USER_VERIFICATION_REQUIREMENT_PREFERRED;
-}
-
-function attestation(value) {
- if (value === 'direct') return WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_DIRECT;
- if (value === 'indirect') return WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_INDIRECT;
- return WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_NONE;
-}
-
-function enterpriseAttestation(value) {
- return value === 'enterprise'
- ? WEBAUTHN_ENTERPRISE_ATTESTATION_VENDOR_FACILITATED
- : WEBAUTHN_ENTERPRISE_ATTESTATION_NONE;
-}
-
-function transportBits(transports) {
- if (!Array.isArray(transports)) return 0;
- let bits = 0;
- for (const transport of transports) {
- if (transport === 'usb') bits |= WEBAUTHN_CTAP_TRANSPORT_USB;
- else if (transport === 'nfc') bits |= WEBAUTHN_CTAP_TRANSPORT_NFC;
- else if (transport === 'ble') bits |= WEBAUTHN_CTAP_TRANSPORT_BLE;
- else if (transport === 'internal') bits |= WEBAUTHN_CTAP_TRANSPORT_INTERNAL;
- else if (transport === 'hybrid') bits |= WEBAUTHN_CTAP_TRANSPORT_HYBRID;
- else if (transport === 'smart-card') bits |= WEBAUTHN_CTAP_TRANSPORT_SMART_CARD;
- }
- return bits;
-}
-
-function credentialDescriptors(descriptors) {
- if (!Array.isArray(descriptors)) return [];
- return descriptors.map((descriptor) => ({
- id: Buffer.from(descriptor.id),
- transports: transportBits(descriptor.transports),
- }));
-}
-
-function windowHandleBuffer(value) {
- if (Buffer.isBuffer(value)) return value;
- if (value instanceof Uint8Array) return Buffer.from(value);
- return undefined;
-}
-
-function pinString(value) {
- return typeof value === 'string' && value.length > 0 ? value : undefined;
-}
-
-function residentKeyFlags(selection) {
- const residentKey = selection?.residentKey;
- const requireResidentKey = Boolean(selection?.requireResidentKey) || residentKey === 'required';
- return {
- requireResidentKey,
- preferResidentKey: requireResidentKey || residentKey === 'preferred',
- };
-}
-
-function normalizeCreateOptions(options) {
- if (!options || typeof options !== 'object') throw new TypeError('registration options must be an object');
- const origin = normalizedOrigin(options.origin);
- const selection = options.authenticatorSelection || {};
- const residentKeys = residentKeyFlags(selection);
- return {
- rpId: relyingPartyId(options, origin),
- rpName: options.rp && typeof options.rp.name === 'string' ? options.rp.name : relyingPartyId(options, origin),
- challenge: Buffer.from(options.challenge),
- userId: Buffer.from(options.user.id),
- userName: options.user.name,
- userDisplayName: options.user.displayName,
- clientDataJSON: clientDataJSON('webauthn.create', options.challenge, origin),
- pubKeyCredParams: options.pubKeyCredParams,
- excludeCredentials: credentialDescriptors(options.excludeCredentials),
- timeout: Number.isFinite(options.timeout) ? Math.max(0, Math.trunc(options.timeout)) : 0,
- authenticatorAttachment: authenticatorAttachment(selection.authenticatorAttachment),
- userVerification: userVerification(selection.userVerification),
- attestation: attestation(options.attestation),
- enterpriseAttestation: enterpriseAttestation(options.attestation),
- windowHandle: windowHandleBuffer(options.windowHandle),
- pin: pinString(options.pin),
- ...residentKeys,
- };
-}
-
-function normalizeGetOptions(options) {
- if (!options || typeof options !== 'object') throw new TypeError('assertion options must be an object');
- const origin = normalizedOrigin(options.origin);
- return {
- rpId: relyingPartyId(options, origin),
- challenge: Buffer.from(options.challenge),
- clientDataJSON: clientDataJSON('webauthn.get', options.challenge, origin),
- allowCredentials: credentialDescriptors(options.allowCredentials),
- timeout: Number.isFinite(options.timeout) ? Math.max(0, Math.trunc(options.timeout)) : 0,
- authenticatorAttachment: WEBAUTHN_AUTHENTICATOR_ATTACHMENT_ANY,
- userVerification: userVerification(options.userVerification),
- windowHandle: windowHandleBuffer(options.windowHandle),
- pin: pinString(options.pin),
- };
-}
-
function unavailableError() {
return new Error(
`@fluxer/webauthn native backend unavailable on ${process.platform}/${process.arch}: ${
diff --git a/fluxer_desktop/native/webauthn/package.json b/fluxer_desktop/native/webauthn/package.json
index 60eccd3ca..2623b8270 100644
--- a/fluxer_desktop/native/webauthn/package.json
+++ b/fluxer_desktop/native/webauthn/package.json
@@ -14,6 +14,7 @@
"index.js",
"index.d.ts",
"loader-diagnostics.cjs",
+ "pure.cjs",
"*.so*",
"webauthn.linux-x64-gnu.node",
"webauthn.linux-arm64-gnu.node",
diff --git a/fluxer_desktop/native/webauthn/pure.cjs b/fluxer_desktop/native/webauthn/pure.cjs
new file mode 100644
index 000000000..0a0655b8c
--- /dev/null
+++ b/fluxer_desktop/native/webauthn/pure.cjs
@@ -0,0 +1,171 @@
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+const WEBAUTHN_AUTHENTICATOR_ATTACHMENT_ANY = 0;
+const WEBAUTHN_AUTHENTICATOR_ATTACHMENT_PLATFORM = 1;
+const WEBAUTHN_AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM = 2;
+const WEBAUTHN_USER_VERIFICATION_REQUIREMENT_REQUIRED = 1;
+const WEBAUTHN_USER_VERIFICATION_REQUIREMENT_PREFERRED = 2;
+const WEBAUTHN_USER_VERIFICATION_REQUIREMENT_DISCOURAGED = 3;
+const WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_NONE = 1;
+const WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_INDIRECT = 2;
+const WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_DIRECT = 3;
+const WEBAUTHN_ENTERPRISE_ATTESTATION_NONE = 0;
+const WEBAUTHN_ENTERPRISE_ATTESTATION_VENDOR_FACILITATED = 1;
+const WEBAUTHN_CTAP_TRANSPORT_USB = 0x00000001;
+const WEBAUTHN_CTAP_TRANSPORT_NFC = 0x00000002;
+const WEBAUTHN_CTAP_TRANSPORT_BLE = 0x00000004;
+const WEBAUTHN_CTAP_TRANSPORT_INTERNAL = 0x00000010;
+const WEBAUTHN_CTAP_TRANSPORT_HYBRID = 0x00000020;
+const WEBAUTHN_CTAP_TRANSPORT_SMART_CARD = 0x00000040;
+
+function nativeFileName(platform = process.platform, arch = process.arch) {
+ if (platform === 'darwin' && (arch === 'x64' || arch === 'arm64')) return `webauthn.darwin-${arch}.node`;
+ if (platform === 'win32' && (arch === 'x64' || arch === 'arm64')) return `webauthn.win32-${arch}-msvc.node`;
+ if (platform === 'linux' && (arch === 'x64' || arch === 'arm64')) return `webauthn.linux-${arch}-gnu.node`;
+ return null;
+}
+
+function base64Url(buffer) {
+ return Buffer.from(buffer).toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
+}
+
+function normalizedOrigin(origin) {
+ if (typeof origin !== 'string' || origin.length === 0) {
+ throw new TypeError('@fluxer/webauthn requires an origin string');
+ }
+ return new URL(origin).origin;
+}
+
+function relyingPartyId(options, origin) {
+ if (typeof options.rpId === 'string' && options.rpId.length > 0) return options.rpId;
+ if (options.rp && typeof options.rp.id === 'string' && options.rp.id.length > 0) return options.rp.id;
+ return new URL(origin).hostname;
+}
+
+function clientDataJSON(type, challenge, origin) {
+ return Buffer.from(
+ JSON.stringify({
+ type,
+ challenge: base64Url(challenge),
+ origin,
+ crossOrigin: false,
+ }),
+ 'utf8',
+ );
+}
+
+function authenticatorAttachment(value) {
+ if (value === 'platform') return WEBAUTHN_AUTHENTICATOR_ATTACHMENT_PLATFORM;
+ if (value === 'cross-platform') return WEBAUTHN_AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM;
+ return WEBAUTHN_AUTHENTICATOR_ATTACHMENT_ANY;
+}
+
+function userVerification(value) {
+ if (value === 'required') return WEBAUTHN_USER_VERIFICATION_REQUIREMENT_REQUIRED;
+ if (value === 'discouraged') return WEBAUTHN_USER_VERIFICATION_REQUIREMENT_DISCOURAGED;
+ return WEBAUTHN_USER_VERIFICATION_REQUIREMENT_PREFERRED;
+}
+
+function attestation(value) {
+ if (value === 'direct') return WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_DIRECT;
+ if (value === 'indirect') return WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_INDIRECT;
+ return WEBAUTHN_ATTESTATION_CONVEYANCE_PREFERENCE_NONE;
+}
+
+function enterpriseAttestation(value) {
+ return value === 'enterprise'
+ ? WEBAUTHN_ENTERPRISE_ATTESTATION_VENDOR_FACILITATED
+ : WEBAUTHN_ENTERPRISE_ATTESTATION_NONE;
+}
+
+function transportBits(transports) {
+ if (!Array.isArray(transports)) return 0;
+ let bits = 0;
+ for (const transport of transports) {
+ if (transport === 'usb') bits |= WEBAUTHN_CTAP_TRANSPORT_USB;
+ else if (transport === 'nfc') bits |= WEBAUTHN_CTAP_TRANSPORT_NFC;
+ else if (transport === 'ble') bits |= WEBAUTHN_CTAP_TRANSPORT_BLE;
+ else if (transport === 'internal') bits |= WEBAUTHN_CTAP_TRANSPORT_INTERNAL;
+ else if (transport === 'hybrid') bits |= WEBAUTHN_CTAP_TRANSPORT_HYBRID;
+ else if (transport === 'smart-card') bits |= WEBAUTHN_CTAP_TRANSPORT_SMART_CARD;
+ }
+ return bits;
+}
+
+function credentialDescriptors(descriptors) {
+ if (!Array.isArray(descriptors)) return [];
+ return descriptors.map((descriptor) => ({
+ id: Buffer.from(descriptor.id),
+ transports: transportBits(descriptor.transports),
+ }));
+}
+
+function windowHandleBuffer(value) {
+ if (Buffer.isBuffer(value)) return value;
+ if (value instanceof Uint8Array) return Buffer.from(value);
+ return undefined;
+}
+
+function pinString(value) {
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
+}
+
+function residentKeyFlags(selection) {
+ const residentKey = selection?.residentKey;
+ const requireResidentKey = Boolean(selection?.requireResidentKey) || residentKey === 'required';
+ return {
+ requireResidentKey,
+ preferResidentKey: requireResidentKey || residentKey === 'preferred',
+ };
+}
+
+function normalizeCreateOptions(options) {
+ if (!options || typeof options !== 'object') throw new TypeError('registration options must be an object');
+ const origin = normalizedOrigin(options.origin);
+ const selection = options.authenticatorSelection || {};
+ const residentKeys = residentKeyFlags(selection);
+ return {
+ rpId: relyingPartyId(options, origin),
+ rpName: options.rp && typeof options.rp.name === 'string' ? options.rp.name : relyingPartyId(options, origin),
+ challenge: Buffer.from(options.challenge),
+ userId: Buffer.from(options.user.id),
+ userName: options.user.name,
+ userDisplayName: options.user.displayName,
+ clientDataJSON: clientDataJSON('webauthn.create', options.challenge, origin),
+ pubKeyCredParams: options.pubKeyCredParams,
+ excludeCredentials: credentialDescriptors(options.excludeCredentials),
+ timeout: Number.isFinite(options.timeout) ? Math.max(0, Math.trunc(options.timeout)) : 0,
+ authenticatorAttachment: authenticatorAttachment(selection.authenticatorAttachment),
+ userVerification: userVerification(selection.userVerification),
+ attestation: attestation(options.attestation),
+ enterpriseAttestation: enterpriseAttestation(options.attestation),
+ windowHandle: windowHandleBuffer(options.windowHandle),
+ pin: pinString(options.pin),
+ ...residentKeys,
+ };
+}
+
+function normalizeGetOptions(options) {
+ if (!options || typeof options !== 'object') throw new TypeError('assertion options must be an object');
+ const origin = normalizedOrigin(options.origin);
+ return {
+ rpId: relyingPartyId(options, origin),
+ challenge: Buffer.from(options.challenge),
+ clientDataJSON: clientDataJSON('webauthn.get', options.challenge, origin),
+ allowCredentials: credentialDescriptors(options.allowCredentials),
+ timeout: Number.isFinite(options.timeout) ? Math.max(0, Math.trunc(options.timeout)) : 0,
+ authenticatorAttachment: WEBAUTHN_AUTHENTICATOR_ATTACHMENT_ANY,
+ userVerification: userVerification(options.userVerification),
+ windowHandle: windowHandleBuffer(options.windowHandle),
+ pin: pinString(options.pin),
+ };
+}
+
+module.exports = {
+ base64Url,
+ clientDataJSON,
+ nativeFileName,
+ normalizeCreateOptions,
+ normalizeGetOptions,
+ transportBits,
+};
diff --git a/fluxer_desktop/native/webauthn/test/loader.test.mjs b/fluxer_desktop/native/webauthn/test/loader.test.mjs
index 422c72019..1e9605952 100644
--- a/fluxer_desktop/native/webauthn/test/loader.test.mjs
+++ b/fluxer_desktop/native/webauthn/test/loader.test.mjs
@@ -2,37 +2,21 @@
import assert from 'node:assert/strict';
import test from 'node:test';
-import webauthn from '../index.js';
+import webauthnPure from '../pure.cjs';
test('loader resolves supported native filenames', () => {
- assert.equal(webauthn._private.nativeFileName('darwin', 'x64'), 'webauthn.darwin-x64.node');
- assert.equal(webauthn._private.nativeFileName('darwin', 'arm64'), 'webauthn.darwin-arm64.node');
- assert.equal(webauthn._private.nativeFileName('linux', 'x64'), 'webauthn.linux-x64-gnu.node');
- assert.equal(webauthn._private.nativeFileName('linux', 'arm64'), 'webauthn.linux-arm64-gnu.node');
- assert.equal(webauthn._private.nativeFileName('win32', 'x64'), 'webauthn.win32-x64-msvc.node');
- assert.equal(webauthn._private.nativeFileName('win32', 'arm64'), 'webauthn.win32-arm64-msvc.node');
- assert.equal(webauthn._private.nativeFileName('freebsd', 'x64'), null);
-});
-
-test('loader exposes the Fluxer WebAuthn surface', async () => {
- assert.equal(typeof webauthn.create, 'function');
- assert.equal(typeof webauthn.get, 'function');
- assert.equal(typeof webauthn.getBackendInfo, 'function');
- assert.equal(typeof webauthn.isSupported, 'function');
- const info = webauthn.getBackendInfo();
- const supported = await webauthn.isSupported();
- assert.equal(typeof supported, 'boolean');
- assert.equal(supported, info.supported);
- assert.equal(typeof info, 'object');
- assert.equal(typeof info.target, 'string');
- assert.equal(typeof info.backend, 'string');
- assert.equal(typeof info.supported, 'boolean');
- assert.equal(typeof info.ceremoniesImplemented, 'boolean');
+ assert.equal(webauthnPure.nativeFileName('darwin', 'x64'), 'webauthn.darwin-x64.node');
+ assert.equal(webauthnPure.nativeFileName('darwin', 'arm64'), 'webauthn.darwin-arm64.node');
+ assert.equal(webauthnPure.nativeFileName('linux', 'x64'), 'webauthn.linux-x64-gnu.node');
+ assert.equal(webauthnPure.nativeFileName('linux', 'arm64'), 'webauthn.linux-arm64-gnu.node');
+ assert.equal(webauthnPure.nativeFileName('win32', 'x64'), 'webauthn.win32-x64-msvc.node');
+ assert.equal(webauthnPure.nativeFileName('win32', 'arm64'), 'webauthn.win32-arm64-msvc.node');
+ assert.equal(webauthnPure.nativeFileName('freebsd', 'x64'), null);
});
test('normalization creates spec-shaped client data and Windows transport bits', () => {
const challenge = Buffer.from([1, 2, 3, 4]);
- const normalized = webauthn._private.normalizeCreateOptions({
+ const normalized = webauthnPure.normalizeCreateOptions({
origin: 'https://web.canary.fluxer.app/channels/@me',
challenge,
rp: {id: 'fluxer.app', name: 'Fluxer'},
diff --git a/fluxer_desktop/native/webauthn/vm_tests/run_in_session.ps1 b/fluxer_desktop/native/webauthn/vm_tests/run_in_session.ps1
deleted file mode 100644
index 594f53a64..000000000
--- a/fluxer_desktop/native/webauthn/vm_tests/run_in_session.ps1
+++ /dev/null
@@ -1,31 +0,0 @@
-param(
- [Parameter(Mandatory = $true)][string]$Command,
- [string]$OutFile = 'C:\tools\vm_test_out.txt',
- [int]$TimeoutSec = 120
-)
-
-$taskName = 'FluxerVmTest'
-if (Test-Path $OutFile) { Remove-Item -Force $OutFile }
-Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction SilentlyContinue
-
-$action = New-ScheduledTaskAction -Execute 'cmd.exe' -Argument ('/c ' + $Command + ' > "' + $OutFile + '" 2>&1')
-$principal = New-ScheduledTaskPrincipal -UserId 'hampus' -LogonType Interactive
-$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit (New-TimeSpan -Minutes 10)
-Register-ScheduledTask -TaskName $taskName -Action $action -Principal $principal -Settings $settings -Force | Out-Null
-Start-ScheduledTask -TaskName $taskName
-
-$deadline = (Get-Date).AddSeconds($TimeoutSec)
-do {
- Start-Sleep -Milliseconds 500
- $state = (Get-ScheduledTask -TaskName $taskName).State
-} while ($state -ne 'Ready' -and (Get-Date) -lt $deadline)
-
-$info = Get-ScheduledTaskInfo -TaskName $taskName
-Write-Output ('TASK-STATE: ' + $state + ' LAST-RESULT: ' + $info.LastTaskResult)
-if (Test-Path $OutFile) {
- Write-Output '--- OUTPUT ---'
- Get-Content $OutFile
-} else {
- Write-Output 'NO OUTPUT FILE'
-}
-Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction SilentlyContinue
diff --git a/fluxer_desktop/native/webauthn/vm_tests/set_pin.py b/fluxer_desktop/native/webauthn/vm_tests/set_pin.py
deleted file mode 100644
index 551c70c71..000000000
--- a/fluxer_desktop/native/webauthn/vm_tests/set_pin.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-import ctypes
-import sys
-
-device_path = sys.argv[1].encode() if len(sys.argv) > 1 else b"/dev/hidraw4"
-pin = sys.argv[2].encode() if len(sys.argv) > 2 else b"123456"
-
-lib = ctypes.CDLL("libfido2.so.1")
-lib.fido_init(0)
-lib.fido_dev_new.restype = ctypes.c_void_p
-lib.fido_strerr.restype = ctypes.c_char_p
-
-dev = lib.fido_dev_new()
-rc = lib.fido_dev_open(ctypes.c_void_p(dev), device_path)
-if rc != 0:
- print(f"open failed rc={rc} {lib.fido_strerr(rc).decode()}")
- sys.exit(1)
-rc = lib.fido_dev_set_pin(ctypes.c_void_p(dev), pin, None)
-print(f"set_pin rc={rc} {lib.fido_strerr(rc).decode()}")
-lib.fido_dev_close(ctypes.c_void_p(dev))
-sys.exit(0 if rc == 0 else 1)
diff --git a/fluxer_desktop/native/webauthn/vm_tests/vfido_authenticator/main.go b/fluxer_desktop/native/webauthn/vm_tests/vfido_authenticator/main.go
deleted file mode 100644
index fa533c6a3..000000000
--- a/fluxer_desktop/native/webauthn/vm_tests/vfido_authenticator/main.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package main
-
-import (
- "crypto/ecdsa"
- "crypto/elliptic"
- "crypto/rand"
- "crypto/sha256"
- "crypto/x509"
- "crypto/x509/pkix"
- "fmt"
- "io"
- "math/big"
- "os"
- "time"
-
- virtual_fido "github.com/bulwarkid/virtual-fido"
- "github.com/bulwarkid/virtual-fido/fido_client"
-)
-
-type autoApproveSupport struct {
- vaultFilename string
-}
-
-func (support *autoApproveSupport) ApproveClientAction(action fido_client.ClientAction, params fido_client.ClientActionRequestParams) bool {
- fmt.Printf("auto-approving action=%d relyingParty=%q user=%q\n", action, params.RelyingParty, params.UserName)
- return true
-}
-
-func (support *autoApproveSupport) SaveData(data []byte) {
- err := os.WriteFile(support.vaultFilename, data, 0o600)
- if err != nil {
- panic(fmt.Sprintf("could not write vault: %s", err))
- }
-}
-
-func (support *autoApproveSupport) RetrieveData() []byte {
- f, err := os.Open(support.vaultFilename)
- if os.IsNotExist(err) {
- return nil
- }
- if err != nil {
- panic(fmt.Sprintf("could not open vault: %s", err))
- }
- defer f.Close()
- data, err := io.ReadAll(f)
- if err != nil {
- panic(fmt.Sprintf("could not read vault: %s", err))
- }
- return data
-}
-
-func (support *autoApproveSupport) Passphrase() string {
- return "vm-test-passphrase"
-}
-
-func main() {
- vault := os.Getenv("VFIDO_VAULT")
- if vault == "" {
- vault = "/tmp/vfido-vault.json"
- }
- authority := &x509.Certificate{
- SerialNumber: big.NewInt(0),
- Subject: pkix.Name{
- Organization: []string{"Fluxer VM Test Virtual FIDO"},
- Country: []string{"US"},
- },
- NotBefore: time.Now(),
- NotAfter: time.Now().AddDate(10, 0, 0),
- IsCA: true,
- ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth},
- KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
- BasicConstraintsValid: true,
- }
- privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
- if err != nil {
- panic(err)
- }
- authorityCertBytes, err := x509.CreateCertificate(rand.Reader, authority, authority, &privateKey.PublicKey, privateKey)
- if err != nil {
- panic(err)
- }
- encryptionKey := sha256.Sum256([]byte("fluxer-vm-test"))
-
- virtual_fido.SetLogOutput(os.Stdout)
- support := &autoApproveSupport{vaultFilename: vault}
- client := fido_client.NewDefaultClient(authorityCertBytes, privateKey, encryptionKey, support, support)
- fmt.Println("virtual-fido USBIP server starting on 127.0.0.1:3240 (bus 2-2)")
- virtual_fido.Start(client)
-}
diff --git a/fluxer_desktop/native/webrtc-sender/package.json b/fluxer_desktop/native/webrtc-sender/package.json
index d13fddb49..a22b70e92 100644
--- a/fluxer_desktop/native/webrtc-sender/package.json
+++ b/fluxer_desktop/native/webrtc-sender/package.json
@@ -27,7 +27,6 @@
],
"scripts": {
"build": "cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon",
- "test": "cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- test-webrtc-sender-rust && node --test index.test.mjs scripts/livekit-harness.test.mjs",
- "test:livekit": "node scripts/livekit-harness.mjs"
+ "test": "cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- test-webrtc-sender-rust && node --test index.test.mjs"
}
}
diff --git a/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs b/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs
deleted file mode 100644
index 19d67c285..000000000
--- a/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.mjs
+++ /dev/null
@@ -1,2058 +0,0 @@
-#!/usr/bin/env node
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-import {createHmac, randomUUID} from 'node:crypto';
-import {writeFile} from 'node:fs/promises';
-import {createRequire} from 'node:module';
-import net from 'node:net';
-import {setTimeout as delay} from 'node:timers/promises';
-import {fileURLToPath} from 'node:url';
-
-const require = createRequire(import.meta.url);
-const {VoiceEngine, getHardwareEncoderCapabilities, isSupported, loadError} = require('../index.js');
-
-const DEFAULT_URL = 'ws://localhost:7880';
-const DEFAULT_API_KEY = 'devkey';
-const DEFAULT_API_SECRET = 'secret';
-const DEFAULT_TIMEOUT_MS = 30_000;
-const DEFAULT_CONNECT_TIMEOUT_MS = 30_000;
-const DEFAULT_DISCONNECT_TIMEOUT_MS = 10_000;
-const DEFAULT_PROBE_TIMEOUT_MS = 1_500;
-const DEFAULT_WIDTH = 320;
-const DEFAULT_HEIGHT = 180;
-const DEFAULT_FPS = 15;
-const DEFAULT_SAMPLE_RATE = 48_000;
-const DEFAULT_CHANNELS = 1;
-const DEFAULT_AUDIO_CHUNK_MS = 20;
-const STRICT_DURATION_MS = 10 * 60 * 1000;
-const STRICT_MIN_FPS_RATIO = 0.95;
-const STRICT_MAX_FRAME_GAP_MS = 250;
-const STRICT_MAX_AV_DRIFT_MS = 80;
-const STRICT_MAX_AUDIO_FRAME_GAP_MS = 250;
-const AUDIO_POLL_INTERVAL_MS = 100;
-const MIN_INBOUND_AUDIO_FRAMES = 3;
-const MIN_INBOUND_VIDEO_FRAMES = 3;
-const VIDEO_PATTERNS = new Set(['gradient', 'fast']);
-const VIDEO_QUALITIES = new Set(['low', 'medium', 'high']);
-const VIDEO_INPUTS = new Set(['bgra', 'nv12']);
-const LIVEKIT_SCREEN_SHARE_SOURCE = 'screen_share';
-const LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE = 'screen_share_audio';
-
-function parseBooleanFlag(name, value) {
- const normalized = value.trim();
- if (/^(1|true|yes|on|required)$/i.test(normalized)) return true;
- if (/^(0|false|no|off|disabled)$/i.test(normalized)) return false;
- throw new Error(`${name} must be a boolean flag: 1/0, true/false, yes/no, or on/off`);
-}
-
-function envFlag(...names) {
- for (const name of names) {
- const value = process.env[name];
- if (value !== undefined && value.trim() !== '') return parseBooleanFlag(name, value);
- }
- return false;
-}
-
-function envOptionalFlag(name, fallback) {
- const value = process.env[name];
- if (value === undefined || value.trim() === '') return fallback;
- return parseBooleanFlag(name, value);
-}
-
-function envString(names, fallback) {
- for (const name of names) {
- const value = process.env[name];
- if (value?.trim()) return value.trim();
- }
- return fallback;
-}
-
-function envOptionalString(names) {
- for (const name of names) {
- const value = process.env[name];
- if (value?.trim()) return value.trim();
- }
- return null;
-}
-
-function envOptionalStringConsistent(names) {
- let selected = null;
- let selectedName = null;
- for (const name of names) {
- const value = process.env[name];
- if (!value?.trim()) continue;
- const trimmed = value.trim();
- if (selected !== null && trimmed !== selected) {
- throw new Error(`${name} conflicts with ${selectedName}; use one value for ${names.join(', ')}`);
- }
- selected = trimmed;
- selectedName = name;
- }
- return selected;
-}
-
-function envInteger(name, fallback) {
- const value = process.env[name];
- if (value === undefined || value === '') return fallback;
- const parsed = Number(value);
- if (!Number.isInteger(parsed) || parsed < 0) {
- throw new Error(`${name} must be a non-negative integer`);
- }
- return parsed;
-}
-
-function envPositiveInteger(name, fallback) {
- const parsed = envInteger(name, fallback);
- if (!Number.isInteger(parsed) || parsed <= 0) {
- throw new Error(`${name} must be a positive integer`);
- }
- return parsed;
-}
-
-function envNumber(name, fallback) {
- const value = process.env[name];
- if (value === undefined || value === '') return fallback;
- const parsed = Number(value);
- if (!Number.isFinite(parsed) || parsed < 0) {
- throw new Error(`${name} must be a non-negative number`);
- }
- return parsed;
-}
-
-function envPositiveNumber(name, fallback) {
- const value = process.env[name];
- if (value === undefined || value === '') return fallback;
- const parsed = Number(value);
- if (!Number.isFinite(parsed) || parsed <= 0) {
- throw new Error(`${name} must be a positive number`);
- }
- return parsed;
-}
-
-function envUnitNumber(name, fallback) {
- const parsed = envPositiveNumber(name, fallback);
- if (parsed > 1) {
- throw new Error(`${name} must be greater than 0 and less than or equal to 1`);
- }
- return parsed;
-}
-
-function envOptionalNonNegativeInteger(name) {
- const value = process.env[name];
- if (value === undefined || value === '') return null;
- const parsed = Number(value);
- if (!Number.isInteger(parsed) || parsed < 0) {
- throw new Error(`${name} must be a non-negative integer`);
- }
- return parsed;
-}
-
-function envVideoPattern(name, fallback) {
- const value = process.env[name]?.trim().toLowerCase() || fallback;
- if (!VIDEO_PATTERNS.has(value)) {
- throw new Error(`${name} must be one of: ${[...VIDEO_PATTERNS].join(', ')}`);
- }
- return value;
-}
-
-function envVideoInput(name, fallback) {
- const value = process.env[name]?.trim().toLowerCase() || fallback;
- if (!VIDEO_INPUTS.has(value)) {
- throw new Error(`${name} must be one of: ${[...VIDEO_INPUTS].join(', ')}`);
- }
- return value;
-}
-
-function envOptionalVideoQuality(name) {
- const value = process.env[name]?.trim().toLowerCase();
- if (!value) return null;
- if (!VIDEO_QUALITIES.has(value)) {
- throw new Error(`${name} must be one of: ${[...VIDEO_QUALITIES].join(', ')}`);
- }
- return value;
-}
-
-function jwtSubject(token) {
- const parts = token.split('.');
- if (parts.length < 2) {
- throw new Error('LiveKit token must be a JWT when identity is not supplied');
- }
- let payload;
- try {
- payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
- } catch (error) {
- throw new Error(`failed to decode LiveKit token payload: ${error.message}`);
- }
- if (typeof payload.sub !== 'string' || payload.sub.length === 0) {
- throw new Error('LiveKit token payload does not contain a subject identity');
- }
- return payload.sub;
-}
-
-function resolveIdentity({configuredIdentity, token, fallback}) {
- if (configuredIdentity) return configuredIdentity;
- if (token) return jwtSubject(token);
- return fallback;
-}
-
-function parseCodecList(rawValue, fallback) {
- const value = rawValue?.trim() ? rawValue : fallback;
- const codecs = value
- .split(',')
- .map((entry) => entry.trim())
- .filter((entry) => entry.length > 0);
- if (codecs.length === 0) {
- throw new Error('at least one LiveKit screen codec must be configured');
- }
- for (const codec of codecs) {
- expectedCodecMime(codec);
- }
- return codecs;
-}
-
-function parseConfig() {
- const strict = envFlag('LIVEKIT_HARNESS_STRICT', 'FLUXER_NATIVE_MEDIA_STRICT');
- const liveKitUrl = envString(['LIVEKIT_URL', 'LIVEKIT_WS_URL'], DEFAULT_URL);
- const generatedPublisherIdentity = `fluxer-native-publisher-${process.pid}`;
- const generatedSecondaryPublisherIdentity = `fluxer-native-publisher-2-${process.pid}`;
- const generatedSubscriberIdentity = `fluxer-native-subscriber-${process.pid}`;
- const publisherToken = envOptionalString(['LIVEKIT_PUBLISHER_TOKEN']);
- const secondaryPublisherToken = envOptionalString(['LIVEKIT_SECONDARY_PUBLISHER_TOKEN']);
- const subscriberToken = envOptionalString(['LIVEKIT_SUBSCRIBER_TOKEN']);
- const externalTokens = publisherToken !== null || secondaryPublisherToken !== null || subscriberToken !== null;
- const width = envPositiveInteger('LIVEKIT_SCREEN_WIDTH', DEFAULT_WIDTH);
- const height = envPositiveInteger('LIVEKIT_SCREEN_HEIGHT', DEFAULT_HEIGHT);
- if (width % 2 !== 0 || height % 2 !== 0) {
- throw new Error('LIVEKIT_SCREEN_WIDTH and LIVEKIT_SCREEN_HEIGHT must be even');
- }
- const fps = envPositiveNumber('LIVEKIT_SCREEN_FPS', DEFAULT_FPS);
- const minVideoFps = envPositiveNumber('LIVEKIT_MIN_VIDEO_FPS', 15);
- if (minVideoFps > fps) {
- throw new Error('LIVEKIT_MIN_VIDEO_FPS must be less than or equal to LIVEKIT_SCREEN_FPS');
- }
- const screenCodecs = parseCodecList(envOptionalString(['LIVEKIT_SCREEN_CODECS', 'LIVEKIT_SCREEN_CODEC']), 'vp8');
- const configuredExpectedScreenCodecs = envOptionalString([
- 'LIVEKIT_EXPECT_SCREEN_CODECS',
- 'LIVEKIT_EXPECT_SCREEN_CODEC',
- ]);
- const expectedScreenCodecs = parseCodecList(configuredExpectedScreenCodecs, screenCodecs.join(','));
- if (configuredExpectedScreenCodecs !== null && expectedScreenCodecs.length !== screenCodecs.length) {
- throw new Error('LIVEKIT_EXPECT_SCREEN_CODECS length must match LIVEKIT_SCREEN_CODECS length');
- }
- const secondaryPublisherRequested = envOptionalFlag('LIVEKIT_ENABLE_SECOND_PUBLISHER', strict);
- const configuredSecondaryPublisherCodec = envOptionalStringConsistent([
- 'LIVEKIT_SECOND_PUBLISHER_CODEC',
- 'LIVEKIT_SECOND_PUBLISHER_SCREEN_CODEC',
- 'LIVEKIT_SECOND_PUBLISHER_SCREEN_CODECS',
- 'LIVEKIT_SECONDARY_PUBLISHER_SCREEN_CODEC',
- 'LIVEKIT_SECONDARY_PUBLISHER_SCREEN_CODECS',
- ]);
- const configuredExpectedSecondaryPublisherCodec = envOptionalStringConsistent([
- 'LIVEKIT_EXPECT_SECOND_PUBLISHER_SCREEN_CODEC',
- 'LIVEKIT_EXPECT_SECOND_PUBLISHER_SCREEN_CODECS',
- 'LIVEKIT_EXPECT_SECONDARY_PUBLISHER_SCREEN_CODEC',
- 'LIVEKIT_EXPECT_SECONDARY_PUBLISHER_SCREEN_CODECS',
- ]);
- const secondaryPublisherCodec =
- configuredSecondaryPublisherCodec ?? (screenCodecs.length > 1 ? screenCodecs[1] : screenCodecs[0]);
- const expectedSecondaryPublisherCodec = configuredExpectedSecondaryPublisherCodec ?? secondaryPublisherCodec;
- const screenSimulcast = envOptionalFlag('LIVEKIT_SCREEN_SIMULCAST', true);
- const microphone = envOptionalFlag('LIVEKIT_ENABLE_MICROPHONE', true);
- const screenAudio = envOptionalFlag('LIVEKIT_ENABLE_SCREEN_AUDIO', strict);
- if (externalTokens) {
- if (!publisherToken || !subscriberToken) {
- throw new Error(
- 'LIVEKIT_PUBLISHER_TOKEN and LIVEKIT_SUBSCRIBER_TOKEN are both required when using external tokens',
- );
- }
- if (secondaryPublisherRequested && !secondaryPublisherToken) {
- throw new Error('LIVEKIT_SECONDARY_PUBLISHER_TOKEN is required when LIVEKIT_ENABLE_SECOND_PUBLISHER=1');
- }
- }
- return {
- url: liveKitUrl,
- serverApiUrl: envString(['LIVEKIT_API_URL', 'LIVEKIT_HTTP_URL'], liveKitApiUrl(liveKitUrl)),
- apiKey: envString(['LIVEKIT_API_KEY'], DEFAULT_API_KEY),
- apiSecret: envString(['LIVEKIT_API_SECRET', 'LIVEKIT_SECRET'], DEFAULT_API_SECRET),
- room: envString(['LIVEKIT_ROOM'], `fluxer-webrtc-harness-${process.pid}-${randomUUID()}`),
- externalTokens,
- publisherToken,
- secondaryPublisherToken,
- subscriberToken,
- publisherIdentity: resolveIdentity({
- configuredIdentity: envOptionalString(['LIVEKIT_PUBLISHER_IDENTITY']),
- token: publisherToken,
- fallback: generatedPublisherIdentity,
- }),
- secondaryPublisherIdentity: resolveIdentity({
- configuredIdentity: envOptionalString(['LIVEKIT_SECONDARY_PUBLISHER_IDENTITY']),
- token: secondaryPublisherToken,
- fallback: generatedSecondaryPublisherIdentity,
- }),
- subscriberIdentity: resolveIdentity({
- configuredIdentity: envOptionalString(['LIVEKIT_SUBSCRIBER_IDENTITY']),
- token: subscriberToken,
- fallback: generatedSubscriberIdentity,
- }),
- required: envFlag('FLUXER_WEBRTC_SENDER_LIVEKIT_REQUIRED', 'LIVEKIT_REQUIRED'),
- strict,
- timeoutMs: envPositiveInteger('LIVEKIT_HARNESS_TIMEOUT_MS', DEFAULT_TIMEOUT_MS),
- connectTimeoutMs: envPositiveInteger('LIVEKIT_CONNECT_TIMEOUT_MS', DEFAULT_CONNECT_TIMEOUT_MS),
- disconnectTimeoutMs: envPositiveInteger('LIVEKIT_DISCONNECT_TIMEOUT_MS', DEFAULT_DISCONNECT_TIMEOUT_MS),
- probeTimeoutMs: envPositiveInteger('LIVEKIT_PROBE_TIMEOUT_MS', DEFAULT_PROBE_TIMEOUT_MS),
- durationMs: envInteger('LIVEKIT_HARNESS_DURATION_MS', strict ? STRICT_DURATION_MS : 0),
- width,
- height,
- expectedWidth: envPositiveInteger('LIVEKIT_EXPECT_SCREEN_WIDTH', width),
- expectedHeight: envPositiveInteger('LIVEKIT_EXPECT_SCREEN_HEIGHT', height),
- fps,
- minFpsRatio: envNumber('LIVEKIT_MIN_RECEIVED_FPS_RATIO', strict ? STRICT_MIN_FPS_RATIO : 0),
- maxFrameGapMs: envNumber('LIVEKIT_MAX_FRAME_GAP_MS', strict ? STRICT_MAX_FRAME_GAP_MS : 0),
- maxAudioFrameGapMs: envNumber('LIVEKIT_MAX_AUDIO_FRAME_GAP_MS', strict ? STRICT_MAX_AUDIO_FRAME_GAP_MS : 0),
- maxAvDriftMs: envNumber('LIVEKIT_MAX_AV_DRIFT_MS', strict ? STRICT_MAX_AV_DRIFT_MS : 0),
- maxPacketLoss: envOptionalNonNegativeInteger('LIVEKIT_MAX_PACKET_LOSS'),
- requireStableResolution: envOptionalFlag('LIVEKIT_REQUIRE_STABLE_RESOLUTION', strict),
- videoPattern: envVideoPattern('LIVEKIT_VIDEO_PATTERN', 'gradient'),
- videoInput: envVideoInput('LIVEKIT_VIDEO_INPUT', 'bgra'),
- subscriberVideoQuality: envOptionalVideoQuality('LIVEKIT_SUBSCRIBER_VIDEO_QUALITY'),
- screenCodecs,
- expectedScreenCodecs,
- codec: screenCodecs[0],
- expectedScreenCodec: expectedCodecMime(expectedScreenCodecs[0] ?? screenCodecs[0]),
- secondaryPublisher: secondaryPublisherRequested,
- secondaryPublisherCodec,
- secondaryPublisherCodecExplicit: configuredSecondaryPublisherCodec !== null,
- expectedSecondaryPublisherCodec: expectedCodecMime(expectedSecondaryPublisherCodec),
- expectedSecondaryPublisherCodecExplicit: configuredExpectedSecondaryPublisherCodec !== null,
- screenSimulcast,
- secondaryPublisherScreenSimulcast: envOptionalFlag('LIVEKIT_SECOND_PUBLISHER_SCREEN_SIMULCAST', screenSimulcast),
- adaptiveSend: envOptionalFlag('LIVEKIT_ADAPTIVE_SEND', true),
- minVideoFps,
- minResolutionScale: envUnitNumber('LIVEKIT_MIN_RESOLUTION_SCALE', 0.5),
- maxAudioBufferMs: envPositiveInteger('LIVEKIT_MAX_AUDIO_BUFFER_MS', 750),
- secondaryPublisherMicrophone: envOptionalFlag('LIVEKIT_SECOND_PUBLISHER_ENABLE_MICROPHONE', microphone),
- secondaryPublisherScreenAudio: envOptionalFlag('LIVEKIT_SECOND_PUBLISHER_ENABLE_SCREEN_AUDIO', screenAudio),
- maxBitrateBps: envNumber('LIVEKIT_SCREEN_MAX_BITRATE_BPS', 400_000),
- sampleRate: envPositiveInteger('LIVEKIT_AUDIO_SAMPLE_RATE', DEFAULT_SAMPLE_RATE),
- channels: envPositiveInteger('LIVEKIT_AUDIO_CHANNELS', DEFAULT_CHANNELS),
- audioChunkMs: envPositiveInteger('LIVEKIT_AUDIO_CHUNK_MS', DEFAULT_AUDIO_CHUNK_MS),
- microphone,
- screenAudio,
- dataPacket: envOptionalFlag('LIVEKIT_ENABLE_DATA_PACKET', strict),
- subscriptionCycle: envOptionalFlag('LIVEKIT_ENABLE_SUBSCRIPTION_CYCLE', strict),
- validateServerPublishing: envOptionalFlag('LIVEKIT_VALIDATE_SERVER_PUBLISHING', strict),
- camera: envOptionalFlag('LIVEKIT_ENABLE_CAMERA', false),
- cameraDeviceId: envOptionalString(['LIVEKIT_CAMERA_DEVICE_ID']),
- expectedCameraCodec: expectedCodecMime(envString(['LIVEKIT_EXPECT_CAMERA_CODEC'], '')),
- e2eeKey: envOptionalString(['LIVEKIT_E2EE_KEY']),
- expectedHardwareEncoder: envOptionalString(['LIVEKIT_EXPECT_HARDWARE_ENCODER']),
- reportPath: envOptionalString(['LIVEKIT_HARNESS_REPORT_PATH', 'FLUXER_NATIVE_MEDIA_REPORT']),
- verbose: envFlag('FLUXER_WEBRTC_SENDER_LIVEKIT_VERBOSE', 'LIVEKIT_VERBOSE'),
- };
-}
-
-function expectedCodecMime(codec) {
- switch (codec.trim().toLowerCase()) {
- case '':
- return null;
- case 'vp8':
- return 'video/VP8';
- case 'vp9':
- return 'video/VP9';
- case 'h264':
- return 'video/H264';
- case 'av1':
- return 'video/AV1';
- case 'h265':
- case 'hevc':
- return 'video/H265';
- default:
- throw new Error(`unsupported LIVEKIT_EXPECT_SCREEN_CODEC: ${codec}`);
- }
-}
-
-function liveKitTcpTarget(rawUrl) {
- let url;
- try {
- url = new URL(rawUrl);
- } catch (error) {
- throw new Error(`LIVEKIT_URL is not a valid URL: ${error.message}`);
- }
- if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {
- throw new Error('LIVEKIT_URL must use ws:// or wss://');
- }
- return {
- host: url.hostname.replace(/^\[(.*)\]$/, '$1'),
- port: Number(url.port || (url.protocol === 'wss:' ? 443 : 80)),
- };
-}
-
-function liveKitApiUrl(rawUrl) {
- let url;
- try {
- url = new URL(rawUrl);
- } catch (error) {
- throw new Error(`LIVEKIT_URL is not a valid URL: ${error.message}`);
- }
- if (url.protocol === 'ws:') return `http://${url.host}`;
- if (url.protocol === 'wss:') return `https://${url.host}`;
- throw new Error('LIVEKIT_URL must use ws:// or wss://');
-}
-
-function probeTcp({host, port}, timeoutMs) {
- return new Promise((resolve) => {
- const socket = net.createConnection({host, port});
- let done = false;
- const finish = (result) => {
- if (done) return;
- done = true;
- socket.destroy();
- resolve(result);
- };
- socket.setTimeout(timeoutMs);
- socket.once('connect', () => finish({ok: true}));
- socket.once('timeout', () => finish({ok: false, reason: `timed out after ${timeoutMs}ms`}));
- socket.once('error', (error) => finish({ok: false, reason: error.message}));
- });
-}
-
-function base64urlJson(value) {
- return Buffer.from(JSON.stringify(value)).toString('base64url');
-}
-
-function createLiveKitToken({apiKey, apiSecret, room, identity, name}) {
- const now = Math.floor(Date.now() / 1000);
- const header = {alg: 'HS256', typ: 'JWT'};
- const payload = {
- iss: apiKey,
- sub: identity,
- name,
- nbf: now - 5,
- exp: now + 600,
- jti: randomUUID(),
- video: {
- roomJoin: true,
- room,
- canPublish: true,
- canSubscribe: true,
- canPublishData: true,
- canPublishSources: ['camera', 'microphone', 'screen_share', 'screen_share_audio'],
- },
- };
- const body = `${base64urlJson(header)}.${base64urlJson(payload)}`;
- const signature = createHmac('sha256', apiSecret).update(body).digest('base64url');
- return `${body}.${signature}`;
-}
-
-function createLiveKitAdminToken({apiKey, apiSecret, room}) {
- const now = Math.floor(Date.now() / 1000);
- const header = {alg: 'HS256', typ: 'JWT'};
- const payload = {
- iss: apiKey,
- sub: `fluxer-native-harness-admin-${process.pid}`,
- nbf: now - 5,
- exp: now + 600,
- jti: randomUUID(),
- video: {
- room,
- roomAdmin: true,
- },
- };
- const body = `${base64urlJson(header)}.${base64urlJson(payload)}`;
- const signature = createHmac('sha256', apiSecret).update(body).digest('base64url');
- return `${body}.${signature}`;
-}
-
-function parsePayload(jsonPayload) {
- try {
- return JSON.parse(jsonPayload);
- } catch {
- return {};
- }
-}
-
-function unpackNapiPair(args) {
- if (args.length === 1 && Array.isArray(args[0])) {
- return [args[0][0], args[0][1]];
- }
- return [args[0], args[1]];
-}
-
-function createEngineState(name, verbose) {
- return {
- name,
- events: [],
- stats: null,
- statsSamples: [],
- trackIndex: new Map(),
- videoCallbacks: 0,
- videoBytes: 0,
- videoFrameTimes: [],
- videoFrameRecords: [],
- maxVideoFrameGapMs: 0,
- lastVideoMeta: null,
- videoResolutionCounts: new Map(),
- lastVideoFrameAtMs: null,
- audioFrameCounts: [],
- audioFrameTimes: [],
- lastAudioFrameAtMs: null,
- maxAudioFrameGapMs: 0,
- recordEvent(eventType, jsonPayload) {
- const payload = parsePayload(jsonPayload);
- this.events.push({eventType, payload, atMs: Date.now()});
- if (typeof payload.trackSid === 'string' && payload.trackSid.length > 0) {
- if (eventType === 'trackSubscribed') {
- this.trackIndex.set(payload.trackSid, {
- identity: payload.identity,
- kind: normalizeTrackKind(payload.kind),
- source: normalizeTrackSource(payload.source),
- trackName: payload.trackName,
- });
- }
- if (eventType === 'trackUnsubscribed') {
- this.trackIndex.delete(payload.trackSid);
- }
- }
- if (eventType === 'stats') {
- this.stats = payload;
- this.statsSamples.push({payload, atMs: Date.now()});
- }
- if (verbose) {
- const suffix = eventType === 'stats' ? '' : ` ${JSON.stringify(payload)}`;
- console.log(`[livekit-harness] ${name} event: ${eventType}${suffix}`);
- }
- },
- recordVideoFrame(metaJson, data) {
- const now = Date.now();
- if (this.lastVideoFrameAtMs !== null) {
- this.maxVideoFrameGapMs = Math.max(this.maxVideoFrameGapMs, now - this.lastVideoFrameAtMs);
- }
- this.lastVideoFrameAtMs = now;
- this.videoFrameTimes.push(now);
- this.videoCallbacks += 1;
- this.videoBytes += data?.byteLength ?? data?.length ?? 0;
- const parsedMeta = parsePayload(metaJson);
- const indexedTrack =
- typeof parsedMeta.trackSid === 'string' ? this.trackIndex.get(parsedMeta.trackSid) : undefined;
- this.lastVideoMeta = {
- ...parsedMeta,
- identity: parsedMeta.identity ?? indexedTrack?.identity,
- kind: parsedMeta.kind !== undefined ? normalizeTrackKind(parsedMeta.kind) : indexedTrack?.kind,
- source: parsedMeta.source !== undefined ? normalizeTrackSource(parsedMeta.source) : indexedTrack?.source,
- trackName: parsedMeta.trackName ?? indexedTrack?.trackName,
- };
- if (Number.isFinite(this.lastVideoMeta.width) && Number.isFinite(this.lastVideoMeta.height)) {
- const key = `${this.lastVideoMeta.width}x${this.lastVideoMeta.height}`;
- this.videoResolutionCounts.set(key, (this.videoResolutionCounts.get(key) ?? 0) + 1);
- this.videoFrameRecords.push({
- atMs: now,
- identity: this.lastVideoMeta.identity,
- kind: this.lastVideoMeta.kind,
- source: this.lastVideoMeta.source,
- trackName: this.lastVideoMeta.trackName,
- trackSid: this.lastVideoMeta.trackSid,
- width: this.lastVideoMeta.width,
- height: this.lastVideoMeta.height,
- });
- }
- if (verbose && this.videoCallbacks === 1) {
- console.log(`[livekit-harness] ${name} first video frame: ${metaJson}`);
- }
- },
- recordAudioFrameCount(count) {
- const now = Date.now();
- const last = this.audioFrameCounts[this.audioFrameCounts.length - 1];
- if (last && count > last.count) {
- if (this.lastAudioFrameAtMs !== null) {
- this.maxAudioFrameGapMs = Math.max(this.maxAudioFrameGapMs, now - this.lastAudioFrameAtMs);
- }
- this.lastAudioFrameAtMs = now;
- this.audioFrameTimes.push(now);
- }
- this.audioFrameCounts.push({count, atMs: now});
- },
- };
-}
-
-function hasEvent(state, eventType, predicate = () => true) {
- return state.events.some((event) => event.eventType === eventType && predicate(event.payload));
-}
-
-function statsHasOutbound(stats, kind, source) {
- return (
- Array.isArray(stats?.outbound) &&
- stats.outbound.some((entry) => entry.kind === kind && normalizeTrackSource(entry.source) === source)
- );
-}
-
-function statsHasInbound(stats, kind) {
- return Array.isArray(stats?.inbound) && stats.inbound.some((entry) => entry.kind === kind);
-}
-
-function statsInboundCount(stats, kind) {
- return Array.isArray(stats?.inbound) ? stats.inbound.filter((entry) => entry.kind === kind).length : 0;
-}
-
-function totalPacketsLost(stats) {
- const outboundLoss = Array.isArray(stats?.outbound)
- ? stats.outbound.reduce((sum, entry) => sum + Math.max(0, Number(entry.packetsLost) || 0), 0)
- : 0;
- const inboundLoss = Array.isArray(stats?.inbound)
- ? stats.inbound.reduce((sum, entry) => sum + Math.max(0, Number(entry.packetsLost) || 0), 0)
- : 0;
- return outboundLoss + inboundLoss;
-}
-
-function maxObservedPacketsLost(...states) {
- let max = 0;
- for (const state of states) {
- for (const sample of state?.statsSamples ?? []) {
- max = Math.max(max, totalPacketsLost(sample.payload));
- }
- max = Math.max(max, totalPacketsLost(state?.stats));
- }
- return max;
-}
-
-function maxObservedPacketsLostDelta(startedAtMs, endedAtMs, ...states) {
- let maxDelta = 0;
- for (const state of states) {
- const samples = [...(state?.statsSamples ?? [])];
- if (state?.stats) samples.push({payload: state.stats, atMs: endedAtMs});
- samples.sort((a, b) => a.atMs - b.atMs);
- let baseline = 0;
- let maxDuring = 0;
- let hasWindowSample = false;
- for (const sample of samples) {
- const total = totalPacketsLost(sample.payload);
- if (sample.atMs <= startedAtMs) {
- baseline = total;
- continue;
- }
- if (sample.atMs <= endedAtMs) {
- hasWindowSample = true;
- maxDuring = Math.max(maxDuring, total);
- }
- }
- if (hasWindowSample) maxDelta = Math.max(maxDelta, Math.max(0, maxDuring - baseline));
- }
- return maxDelta;
-}
-
-function statsHasOutboundCodec(stats, kind, source, expectedCodec) {
- return (
- Array.isArray(stats?.outbound) &&
- stats.outbound.some(
- (entry) => entry.kind === kind && normalizeTrackSource(entry.source) === source && entry.codec === expectedCodec,
- )
- );
-}
-
-function hasTrackEvent(state, eventType, {identity, kind, source}) {
- if (!state) return false;
- return hasEvent(
- state,
- eventType,
- (payload) =>
- (identity === undefined || payload.identity === identity) &&
- (kind === undefined || payload.kind === kind) &&
- (source === undefined || normalizeTrackSource(payload.source) === source),
- );
-}
-
-function statsHasInboundCodec(stats, kind, expectedCodec) {
- return (
- Array.isArray(stats?.inbound) && stats.inbound.some((entry) => entry.kind === kind && entry.codec === expectedCodec)
- );
-}
-
-function startVideoPump(_engine, config, _pumpErrors) {
- const stats = {
- input: config.videoInput,
- pattern: config.videoPattern,
- targetFps: config.fps,
- startedAtMs: Date.now(),
- stoppedAtMs: null,
- framesPushed: 0,
- framesRejected: 0,
- errors: 0,
- maxPushGapMs: 0,
- lastPushAtMs: null,
- };
- let stopped = false;
- return {
- stats() {
- const endedAtMs = stats.stoppedAtMs ?? Date.now();
- const elapsedMs = Math.max(1, endedAtMs - stats.startedAtMs);
- return {
- ...stats,
- elapsedMs,
- producedFps: Math.round((stats.framesPushed / (elapsedMs / 1000)) * 100) / 100,
- };
- },
- stop() {
- if (stopped) return;
- stopped = true;
- stats.stoppedAtMs = Date.now();
- },
- };
-}
-
-function syntheticPcmFrame({sampleRate, channels, chunkMs, cursor}) {
- const samplesPerChannel = Math.round((sampleRate * chunkMs) / 1000);
- const buffer = Buffer.alloc(samplesPerChannel * channels * 2);
- const frequencyHz = 440;
- for (let i = 0; i < samplesPerChannel; i += 1) {
- const sample = Math.round(Math.sin(((cursor + i) / sampleRate) * frequencyHz * Math.PI * 2) * 10_000);
- for (let channel = 0; channel < channels; channel += 1) {
- buffer.writeInt16LE(sample, (i * channels + channel) * 2);
- }
- }
- return {buffer, nextCursor: cursor + samplesPerChannel};
-}
-
-function startAudioPump(label, pushFrame, config, pumpErrors) {
- let stopped = false;
- let cursor = 0;
- const promise = (async () => {
- while (!stopped) {
- const frame = syntheticPcmFrame({
- sampleRate: config.sampleRate,
- channels: config.channels,
- chunkMs: config.audioChunkMs,
- cursor,
- });
- cursor = frame.nextCursor;
- try {
- const ok = await pushFrame(frame.buffer, config.sampleRate, config.channels);
- if (!ok) pumpErrors.push(new Error(`${label} returned false`));
- } catch (error) {
- pumpErrors.push(error);
- }
- await delay(config.audioChunkMs);
- }
- })();
- return {
- stop() {
- stopped = true;
- },
- async done() {
- await promise;
- },
- };
-}
-
-function startAudioSampler(engine, state) {
- const timer = setInterval(() => {
- try {
- state.recordAudioFrameCount(engine.inboundAudioFrames());
- } catch {}
- }, AUDIO_POLL_INTERVAL_MS);
- timer.unref?.();
- return {
- stop() {
- clearInterval(timer);
- },
- };
-}
-
-function receivedFpsFromTimes(frames) {
- if (frames.length < 2) return 0;
- const elapsedSec = Math.max(0.001, (frames[frames.length - 1] - frames[0]) / 1000);
- return (frames.length - 1) / elapsedSec;
-}
-
-function maxGapMs(times, startedAtMs, endedAtMs) {
- const windowTimes = times.filter((time) => time >= startedAtMs && time <= endedAtMs);
- let maxGap = 0;
- for (let index = 1; index < windowTimes.length; index += 1) {
- maxGap = Math.max(maxGap, windowTimes[index] - windowTimes[index - 1]);
- }
- return maxGap;
-}
-
-function countWindowSamples(times, startedAtMs, endedAtMs) {
- return times.filter((time) => time >= startedAtMs && time <= endedAtMs).length;
-}
-
-function primaryScreenVideoSelector(config) {
- return {
- identity: config.publisherIdentity,
- kind: 'video',
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- };
-}
-
-function frameRecordMatches(record, selector) {
- if (!record) return false;
- if (selector.kind !== undefined && record.kind !== undefined && record.kind !== selector.kind) return false;
- if (selector.source !== undefined && record.source !== undefined && record.source !== selector.source) return false;
- if (selector.identity !== undefined && record.identity !== undefined && record.identity !== selector.identity) {
- return false;
- }
- return true;
-}
-
-function selectedVideoFrameRecords(state, startedAtMs, endedAtMs, selector) {
- const records = [];
- for (const record of state?.videoFrameRecords ?? []) {
- if (record.atMs < startedAtMs || record.atMs > endedAtMs) continue;
- if (!frameRecordMatches(record, selector)) continue;
- records.push(record);
- }
- return records;
-}
-
-function selectedVideoFrameTimes(state, startedAtMs, endedAtMs, selector) {
- return selectedVideoFrameRecords(state, startedAtMs, endedAtMs, selector).map((record) => record.atMs);
-}
-
-function lastVideoFrameRecord(state, startedAtMs, endedAtMs, selector) {
- return selectedVideoFrameRecords(state, startedAtMs, endedAtMs, selector).at(-1) ?? null;
-}
-
-function videoResolutionCounts(state, startedAtMs, endedAtMs, selector) {
- const counts = new Map();
- for (const record of selectedVideoFrameRecords(state, startedAtMs, endedAtMs, selector)) {
- const key = `${record.width}x${record.height}`;
- counts.set(key, (counts.get(key) ?? 0) + 1);
- }
- return Object.fromEntries(counts);
-}
-
-function videoResolutionMismatchCount(state, expectedWidth, expectedHeight, startedAtMs, endedAtMs, selector) {
- let mismatches = 0;
- for (const record of selectedVideoFrameRecords(state, startedAtMs, endedAtMs, selector)) {
- if (record.width !== expectedWidth || record.height !== expectedHeight) {
- mismatches += 1;
- }
- }
- return mismatches;
-}
-
-function currentAvDriftMs(state, startedAtMs, endedAtMs, selector) {
- const videoTimes = selectedVideoFrameTimes(state, startedAtMs, endedAtMs, selector);
- const audioTimes = (state?.audioFrameTimes ?? []).filter((time) => time >= startedAtMs && time <= endedAtMs);
- const lastVideoFrameAtMs = videoTimes.at(-1) ?? null;
- const lastAudioFrameAtMs = audioTimes.at(-1) ?? null;
- if (lastVideoFrameAtMs === null || lastAudioFrameAtMs === null) return null;
- return Math.abs(lastVideoFrameAtMs - lastAudioFrameAtMs);
-}
-
-function expectedInboundVideoTrackCount(config) {
- let count = 1;
- if (config.camera) count += 1;
- if (config.secondaryPublisher) count += 1;
- return count;
-}
-
-function expectedInboundAudioTrackCount(config) {
- let count = 0;
- if (config.microphone) count += 1;
- if (config.screenAudio) count += 1;
- if (config.secondaryPublisher && config.secondaryPublisherMicrophone) count += 1;
- if (config.secondaryPublisher && config.secondaryPublisherScreenAudio) count += 1;
- return count;
-}
-
-function normalizeTrackKind(kind) {
- switch (String(kind ?? '').toLowerCase()) {
- case '0':
- case 'audio':
- return 'audio';
- case '1':
- case 'video':
- return 'video';
- case '2':
- case 'data':
- return 'data';
- default:
- return String(kind ?? '').toLowerCase();
- }
-}
-
-function normalizeTrackSource(source) {
- switch (String(source ?? '').toLowerCase()) {
- case '1':
- case 'camera':
- case 'camera_source':
- return 'camera';
- case '2':
- case 'microphone':
- case 'mic':
- return 'microphone';
- case '3':
- case 'screen_share':
- case 'screenshare':
- case 'screen-share':
- return LIVEKIT_SCREEN_SHARE_SOURCE;
- case '4':
- case 'screen_share_audio':
- case 'screenshareaudio':
- case 'screen-share-audio':
- return LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE;
- default:
- return String(source ?? '');
- }
-}
-
-function findServerParticipant(serverState, identity) {
- return serverState?.participants?.find((participant) => participant.identity === identity) ?? null;
-}
-
-function normalizeMimeType(mimeType) {
- if (typeof mimeType !== 'string' || mimeType.trim() === '') return null;
- return mimeType.trim().toLowerCase();
-}
-
-function serverTrackMatches(track, {kind, source, mimeType}) {
- if (normalizeTrackKind(track.type ?? track.kind) !== kind) return false;
- if (normalizeTrackSource(track.source) !== source) return false;
- if (track.muted !== false) return false;
- const expectedMimeType = normalizeMimeType(mimeType);
- if (expectedMimeType !== null && normalizeMimeType(track.mimeType ?? track.mime_type) !== expectedMimeType) {
- return false;
- }
- return true;
-}
-
-function serverParticipantHasTrack(serverState, identity, expectedTrack) {
- const participant = findServerParticipant(serverState, identity);
- if (!participant) return false;
- const tracks = participant.tracks ?? [];
- return tracks.some((track) => serverTrackMatches(track, expectedTrack));
-}
-
-function expectedServerTracks(config, publisherIdentity, secondaryPublisherIdentity) {
- const tracks = [
- {
- identity: publisherIdentity,
- kind: 'video',
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- mimeType: config.expectedScreenCodec,
- label: 'publisher screenshare',
- },
- ];
- if (config.microphone) {
- tracks.push({identity: publisherIdentity, kind: 'audio', source: 'microphone', label: 'publisher microphone'});
- }
- if (config.screenAudio) {
- tracks.push({
- identity: publisherIdentity,
- kind: 'audio',
- source: LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE,
- label: 'publisher screen-share audio',
- });
- }
- if (config.camera) {
- tracks.push({
- identity: publisherIdentity,
- kind: 'video',
- source: 'camera',
- mimeType: config.expectedCameraCodec,
- label: 'publisher camera',
- });
- }
- if (config.secondaryPublisher) {
- tracks.push({
- identity: secondaryPublisherIdentity,
- kind: 'video',
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- mimeType: config.expectedSecondaryPublisherCodec,
- label: 'secondary publisher screenshare',
- });
- if (config.secondaryPublisherMicrophone) {
- tracks.push({
- identity: secondaryPublisherIdentity,
- kind: 'audio',
- source: 'microphone',
- label: 'secondary publisher microphone',
- });
- }
- if (config.secondaryPublisherScreenAudio) {
- tracks.push({
- identity: secondaryPublisherIdentity,
- kind: 'audio',
- source: LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE,
- label: 'secondary publisher screen-share audio',
- });
- }
- }
- return tracks;
-}
-
-function serverPublishedTrackChecks({config, serverState, publisherIdentity, secondaryPublisherIdentity}) {
- if (!config.validateServerPublishing) return [];
- const checks = [
- {
- name: 'server publishing API participants listed',
- pass: Array.isArray(serverState?.participants) && !serverState?.error,
- },
- ];
- for (const track of expectedServerTracks(config, publisherIdentity, secondaryPublisherIdentity)) {
- checks.push({
- name: `server sees ${track.label} publication`,
- pass: serverParticipantHasTrack(serverState, track.identity, {
- kind: track.kind,
- source: track.source,
- mimeType: track.mimeType,
- }),
- });
- }
- return checks;
-}
-
-function currentChecks({
- publisher,
- subscriber,
- publisherState,
- subscriberState,
- config,
- publisherIdentity,
- secondaryPublisher,
- secondaryPublisherState,
- secondaryPublisherIdentity,
- serverState,
-}) {
- const expectedVideoTracks = expectedInboundVideoTrackCount(config);
- const expectedAudioTracks = expectedInboundAudioTrackCount(config);
- const screenVideoMeta = lastVideoFrameRecord(
- subscriberState,
- Number.NEGATIVE_INFINITY,
- Number.POSITIVE_INFINITY,
- primaryScreenVideoSelector(config),
- );
- const checks = [
- {name: 'publisher connected', pass: publisher.isConnected()},
- {name: 'subscriber connected', pass: subscriber.isConnected()},
- {
- name: 'publisher local screenshare publication',
- pass: hasTrackEvent(publisherState, 'localTrackPublished', {
- kind: 'video',
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- }),
- },
- {
- name: 'subscriber remote screenshare subscription',
- pass: hasTrackEvent(subscriberState, 'trackSubscribed', {
- identity: publisherIdentity,
- kind: 'video',
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- }),
- },
- {
- name: `subscriber inbound video frames >= ${MIN_INBOUND_VIDEO_FRAMES * expectedVideoTracks}`,
- pass: subscriber.inboundVideoFrames() >= MIN_INBOUND_VIDEO_FRAMES * expectedVideoTracks,
- },
- {
- name: 'subscriber video frame callback',
- pass: subscriberState.videoCallbacks > 0 && subscriberState.videoBytes > 0,
- },
- {
- name: 'publisher outbound screenshare stats',
- pass: statsHasOutbound(publisherState.stats, 'video', LIVEKIT_SCREEN_SHARE_SOURCE),
- },
- {
- name: 'subscriber inbound video stats',
- pass: statsHasInbound(subscriberState.stats, 'video'),
- },
- {
- name: `subscriber inbound video stats count >= ${expectedVideoTracks}`,
- pass: statsInboundCount(subscriberState.stats, 'video') >= expectedVideoTracks,
- },
- {
- name: `subscriber video resolution ${config.expectedWidth}x${config.expectedHeight}`,
- pass: screenVideoMeta?.width === config.expectedWidth && screenVideoMeta?.height === config.expectedHeight,
- },
- ];
- if (expectedAudioTracks > 0) {
- checks.push(
- {
- name: `subscriber aggregate inbound audio frames >= ${MIN_INBOUND_AUDIO_FRAMES * expectedAudioTracks}`,
- pass: subscriber.inboundAudioFrames() >= MIN_INBOUND_AUDIO_FRAMES * expectedAudioTracks,
- },
- {
- name: `subscriber inbound audio stats count >= ${expectedAudioTracks}`,
- pass: statsInboundCount(subscriberState.stats, 'audio') >= expectedAudioTracks,
- },
- );
- }
- if (config.microphone) {
- checks.push(
- {
- name: 'publisher local microphone publication',
- pass: hasTrackEvent(publisherState, 'localTrackPublished', {kind: 'audio', source: 'microphone'}),
- },
- {
- name: 'subscriber remote microphone subscription',
- pass: hasTrackEvent(subscriberState, 'trackSubscribed', {
- identity: publisherIdentity,
- kind: 'audio',
- source: 'microphone',
- }),
- },
- {
- name: `subscriber inbound audio frames >= ${MIN_INBOUND_AUDIO_FRAMES * Math.max(1, expectedAudioTracks)}`,
- pass: subscriber.inboundAudioFrames() >= MIN_INBOUND_AUDIO_FRAMES * Math.max(1, expectedAudioTracks),
- },
- {
- name: 'publisher outbound microphone stats',
- pass: statsHasOutbound(publisherState.stats, 'audio', 'microphone'),
- },
- {
- name: 'subscriber inbound audio stats',
- pass: statsHasInbound(subscriberState.stats, 'audio'),
- },
- );
- }
- if (config.screenAudio) {
- checks.push(
- {
- name: 'publisher local screen-share audio publication',
- pass: hasTrackEvent(publisherState, 'localTrackPublished', {
- kind: 'audio',
- source: LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE,
- }),
- },
- {
- name: 'subscriber remote screen-share audio subscription',
- pass: hasTrackEvent(subscriberState, 'trackSubscribed', {
- identity: publisherIdentity,
- kind: 'audio',
- source: LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE,
- }),
- },
- {
- name: 'publisher outbound screen-share audio stats',
- pass: statsHasOutbound(publisherState.stats, 'audio', LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE),
- },
- );
- }
- if (config.camera) {
- checks.push(
- {
- name: 'publisher local camera publication',
- pass: hasTrackEvent(publisherState, 'localTrackPublished', {kind: 'video', source: 'camera'}),
- },
- {
- name: 'subscriber remote camera subscription',
- pass: hasTrackEvent(subscriberState, 'trackSubscribed', {
- identity: publisherIdentity,
- kind: 'video',
- source: 'camera',
- }),
- },
- {
- name: 'publisher outbound camera stats',
- pass: statsHasOutbound(publisherState.stats, 'video', 'camera'),
- },
- );
- if (config.expectedCameraCodec) {
- checks.push({
- name: `publisher outbound camera codec ${config.expectedCameraCodec}`,
- pass: statsHasOutboundCodec(publisherState.stats, 'video', 'camera', config.expectedCameraCodec),
- });
- }
- }
- if (config.secondaryPublisher) {
- checks.push(
- {name: 'secondary publisher connected', pass: secondaryPublisher?.isConnected() === true},
- {
- name: 'secondary publisher local screenshare publication',
- pass: hasTrackEvent(secondaryPublisherState, 'localTrackPublished', {
- kind: 'video',
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- }),
- },
- {
- name: 'subscriber remote secondary screenshare subscription',
- pass: hasTrackEvent(subscriberState, 'trackSubscribed', {
- identity: secondaryPublisherIdentity,
- kind: 'video',
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- }),
- },
- {
- name: 'secondary publisher outbound screenshare stats',
- pass: statsHasOutbound(secondaryPublisherState?.stats, 'video', LIVEKIT_SCREEN_SHARE_SOURCE),
- },
- );
- if (config.expectedSecondaryPublisherCodec) {
- checks.push(
- {
- name: `secondary publisher outbound screenshare codec ${config.expectedSecondaryPublisherCodec}`,
- pass: statsHasOutboundCodec(
- secondaryPublisherState?.stats,
- 'video',
- LIVEKIT_SCREEN_SHARE_SOURCE,
- config.expectedSecondaryPublisherCodec,
- ),
- },
- {
- name: `subscriber inbound secondary codec ${config.expectedSecondaryPublisherCodec}`,
- pass: statsHasInboundCodec(subscriberState.stats, 'video', config.expectedSecondaryPublisherCodec),
- },
- );
- }
- if (config.secondaryPublisherMicrophone) {
- checks.push(
- {
- name: 'secondary publisher local microphone publication',
- pass: hasTrackEvent(secondaryPublisherState, 'localTrackPublished', {
- kind: 'audio',
- source: 'microphone',
- }),
- },
- {
- name: 'subscriber remote secondary microphone subscription',
- pass: hasTrackEvent(subscriberState, 'trackSubscribed', {
- identity: secondaryPublisherIdentity,
- kind: 'audio',
- source: 'microphone',
- }),
- },
- {
- name: 'secondary publisher outbound microphone stats',
- pass: statsHasOutbound(secondaryPublisherState?.stats, 'audio', 'microphone'),
- },
- );
- }
- if (config.secondaryPublisherScreenAudio) {
- checks.push(
- {
- name: 'secondary publisher local screen-share audio publication',
- pass: hasTrackEvent(secondaryPublisherState, 'localTrackPublished', {
- kind: 'audio',
- source: LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE,
- }),
- },
- {
- name: 'subscriber remote secondary screen-share audio subscription',
- pass: hasTrackEvent(subscriberState, 'trackSubscribed', {
- identity: secondaryPublisherIdentity,
- kind: 'audio',
- source: LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE,
- }),
- },
- {
- name: 'secondary publisher outbound screen-share audio stats',
- pass: statsHasOutbound(secondaryPublisherState?.stats, 'audio', LIVEKIT_SCREEN_SHARE_AUDIO_SOURCE),
- },
- );
- }
- }
- if (config.dataPacket) {
- checks.push({
- name: 'subscriber data packet received',
- pass: hasEvent(subscriberState, 'dataReceived', (payload) => payload.topic === 'native-media-harness'),
- });
- if (config.secondaryPublisher) {
- checks.push({
- name: 'subscriber secondary data packet received',
- pass: hasEvent(
- subscriberState,
- 'dataReceived',
- (payload) => payload.topic === 'native-media-harness-secondary',
- ),
- });
- }
- }
- if (config.expectedScreenCodec) {
- checks.push(
- {
- name: `publisher outbound screenshare codec ${config.expectedScreenCodec}`,
- pass: statsHasOutboundCodec(
- publisherState.stats,
- 'video',
- LIVEKIT_SCREEN_SHARE_SOURCE,
- config.expectedScreenCodec,
- ),
- },
- {
- name: `subscriber inbound video codec ${config.expectedScreenCodec}`,
- pass: statsHasInboundCodec(subscriberState.stats, 'video', config.expectedScreenCodec),
- },
- );
- }
- if (config.expectedHardwareEncoder) {
- const capabilities = getHardwareEncoderCapabilities();
- checks.push({
- name: `hardware encoder backend ${config.expectedHardwareEncoder}`,
- pass:
- capabilities.available === true &&
- String(capabilities.backend).toLowerCase() === config.expectedHardwareEncoder.toLowerCase(),
- });
- }
- checks.push(...serverPublishedTrackChecks({config, serverState, publisherIdentity, secondaryPublisherIdentity}));
- return checks;
-}
-
-async function waitForHarnessSuccess(context, pumpErrors, timeoutMs) {
- const start = Date.now();
- let checks = currentChecks(context);
- while (Date.now() - start < timeoutMs) {
- if (pumpErrors.length > 0) {
- throw pumpErrors[0];
- }
- await enforceSubscriberVideoQuality(context);
- await refreshServerPublishingState(context);
- checks = currentChecks(context);
- if (checks.every((check) => check.pass)) return checks;
- await delay(250);
- }
- const missing = checks.filter((check) => !check.pass).map((check) => check.name);
- throw new Error(`timed out after ${timeoutMs}ms waiting for: ${missing.join(', ')}`);
-}
-
-async function holdStrictDuration(context, pumpErrors, durationMs) {
- const startedAtMs = Date.now();
- context.strictStartedAtMs = startedAtMs;
- if (durationMs <= 0) {
- context.strictEndedAtMs = startedAtMs;
- return;
- }
- const endAtMs = startedAtMs + durationMs;
- while (Date.now() < endAtMs) {
- if (pumpErrors.length > 0) throw pumpErrors[0];
- await delay(1000);
- }
- context.strictEndedAtMs = Date.now();
-}
-
-async function withTimeout(promise, timeoutMs, label) {
- const timeout = delay(timeoutMs).then(() => {
- throw new Error(`${label} timed out after ${timeoutMs}ms`);
- });
- return Promise.race([promise, timeout]);
-}
-
-async function disconnectEngine(engine, label, timeoutMs) {
- if (!engine) return;
- try {
- await withTimeout(engine.disconnect(), timeoutMs, `${label} disconnect`);
- } catch (error) {
- console.warn(`[livekit-harness] ${label} disconnect failed: ${error.message}`);
- }
-}
-
-async function refreshServerPublishingState(context) {
- const {config, serverState} = context;
- if (!config.validateServerPublishing) return;
- const now = Date.now();
- if (serverState.inFlight || now - serverState.lastAttemptAtMs < 500) return;
- serverState.inFlight = true;
- serverState.lastAttemptAtMs = now;
- try {
- serverState.participants = await listServerParticipants(config);
- serverState.error = null;
- serverState.fetchedAtMs = Date.now();
- } catch (error) {
- serverState.error = String(error.message ?? error);
- } finally {
- serverState.inFlight = false;
- }
-}
-
-async function listServerParticipants(config) {
- const token = createLiveKitAdminToken({
- apiKey: config.apiKey,
- apiSecret: config.apiSecret,
- room: config.room,
- });
- const response = await fetch(`${config.serverApiUrl}/twirp/livekit.RoomService/ListParticipants`, {
- method: 'POST',
- headers: {
- Authorization: `Bearer ${token}`,
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({room: config.room}),
- });
- const bodyText = await response.text();
- if (!response.ok) {
- throw new Error(`RoomService.ListParticipants failed with HTTP ${response.status}: ${bodyText.slice(0, 240)}`);
- }
- let body;
- try {
- body = bodyText ? JSON.parse(bodyText) : {};
- } catch (error) {
- throw new Error(`RoomService.ListParticipants returned invalid JSON: ${error.message}`);
- }
- if (!Array.isArray(body.participants)) {
- throw new Error('RoomService.ListParticipants response did not contain participants');
- }
- return body.participants;
-}
-
-async function runSubscriptionCycle(subscriber, publisherIdentity) {
- await subscriber.setRemoteTrackSubscription({
- participantIdentity: publisherIdentity,
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- subscribed: true,
- enabled: false,
- quality: 'low',
- });
- await delay(500);
- await subscriber.setRemoteTrackSubscription({
- participantIdentity: publisherIdentity,
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- subscribed: true,
- enabled: true,
- quality: 'high',
- });
-}
-
-async function setSubscriberVideoQuality(subscriber, publisherIdentity, quality) {
- if (!quality) return;
- await subscriber.setRemoteTrackSubscription({
- participantIdentity: publisherIdentity,
- source: LIVEKIT_SCREEN_SHARE_SOURCE,
- subscribed: true,
- enabled: true,
- quality,
- });
-}
-
-async function enforceSubscriberVideoQuality(context) {
- await setSubscriberVideoQuality(context.subscriber, context.publisherIdentity, context.config.subscriberVideoQuality);
- if (context.secondaryPublisher) {
- await setSubscriberVideoQuality(
- context.subscriber,
- context.secondaryPublisherIdentity,
- context.config.subscriberVideoQuality,
- );
- }
-}
-
-function sanitizeConfig(config) {
- const {
- apiSecret: _apiSecret,
- e2eeKey: _e2eeKey,
- publisherToken,
- secondaryPublisherToken,
- subscriberToken,
- ...safe
- } = config;
- return {
- ...safe,
- url: sanitizeReportUrl(config.url),
- serverApiUrl: sanitizeReportUrl(config.serverApiUrl),
- apiSecret: '',
- e2eeKey: config.e2eeKey ? '' : null,
- publisherToken: publisherToken ? '' : null,
- secondaryPublisherToken: secondaryPublisherToken ? '' : null,
- subscriberToken: subscriberToken ? '' : null,
- };
-}
-
-function summarizeServerPublishing(serverState) {
- if (!serverState) return null;
- return {
- fetchedAtMs: serverState.fetchedAtMs,
- error: serverState.error,
- participants: (serverState.participants ?? []).map((participant) => ({
- identity: participant.identity,
- trackCount: participant.tracks?.length ?? 0,
- tracks: (participant.tracks ?? []).map((track) => ({
- sid: track.sid ?? null,
- name: track.name ?? null,
- kind: normalizeTrackKind(track.type ?? track.kind),
- source: normalizeTrackSource(track.source),
- mimeType: track.mimeType ?? track.mime_type ?? null,
- muted: track.muted ?? null,
- })),
- })),
- };
-}
-
-function sanitizeReportUrl(rawUrl) {
- if (typeof rawUrl !== 'string') return rawUrl;
- try {
- const url = new URL(rawUrl);
- if (!url.username && !url.password && !url.search && !url.hash) return rawUrl;
- url.username = '';
- url.password = '';
- url.search = '';
- url.hash = '';
- return url.toString();
- } catch {
- return rawUrl.replace(/\/\/[^/@\s]+@/g, '//@').replace(/[?][^\s#]*/g, '?');
- }
-}
-
-function scenarioRoomName(room, scenarioName, scenarioCount, externalTokens) {
- if (scenarioCount <= 1 || externalTokens) return room;
- const suffix = scenarioName.replace(/[^a-z0-9_.-]/gi, '-').replace(/-+/g, '-');
- return `${room}-${suffix}`.slice(0, 128);
-}
-
-function buildScenarioConfigs(baseConfig) {
- const scenarioCount = baseConfig.screenCodecs.length;
- return baseConfig.screenCodecs.map((codec, index) => {
- const expectedCodec = baseConfig.expectedScreenCodecs[index] ?? codec;
- const secondaryCodec = baseConfig.secondaryPublisherCodecExplicit
- ? baseConfig.secondaryPublisherCodec
- : (baseConfig.screenCodecs[(index + 1) % baseConfig.screenCodecs.length] ?? codec);
- const expectedSecondaryCodec = baseConfig.expectedSecondaryPublisherCodecExplicit
- ? baseConfig.expectedSecondaryPublisherCodec
- : expectedCodecMime(secondaryCodec);
- const scenarioName = baseConfig.secondaryPublisher ? `codec-${codec}-with-${secondaryCodec}` : `codec-${codec}`;
- return {
- ...baseConfig,
- scenarioName,
- room: scenarioRoomName(baseConfig.room, scenarioName, scenarioCount, baseConfig.externalTokens),
- codec,
- expectedScreenCodec: expectedCodecMime(expectedCodec),
- secondaryPublisherCodec: secondaryCodec,
- expectedSecondaryPublisherCodec: expectedSecondaryCodec,
- reportPath: scenarioCount > 1 ? null : baseConfig.reportPath,
- };
- });
-}
-
-function buildReport({status, config, checks = [], error = null, skippedReason = null, context = null}) {
- const now = Date.now();
- const strictStartedAtMs = context?.strictStartedAtMs ?? context?.startedAtMs ?? now;
- const strictEndedAtMs = context?.strictEndedAtMs ?? now;
- const subscriberState = context?.subscriberState;
- const subscriber = context?.subscriber;
- const publisherState = context?.publisherState;
- const secondaryPublisherState = context?.secondaryPublisherState;
- const capabilities = typeof getHardwareEncoderCapabilities === 'function' ? getHardwareEncoderCapabilities() : null;
- const strictVideoSelector = primaryScreenVideoSelector(config);
- const inboundAudioFrames = subscriber ? subscriber.inboundAudioFrames() : 0;
- const inboundVideoFrames = subscriber ? subscriber.inboundVideoFrames() : 0;
- const strictVideoFrameTimes = subscriberState
- ? selectedVideoFrameTimes(subscriberState, strictStartedAtMs, strictEndedAtMs, strictVideoSelector)
- : [];
- const strictVideoFrames = strictVideoFrameTimes.length;
- const strictAudioFrames = subscriberState
- ? countWindowSamples(subscriberState.audioFrameTimes, strictStartedAtMs, strictEndedAtMs)
- : 0;
- const measuredFps = receivedFpsFromTimes(strictVideoFrameTimes);
- const avDriftMs = subscriberState
- ? currentAvDriftMs(subscriberState, strictStartedAtMs, strictEndedAtMs, strictVideoSelector)
- : null;
- const observedPacketLoss = maxObservedPacketsLost(publisherState, secondaryPublisherState, subscriberState);
- const observedPacketLossDelta = maxObservedPacketsLostDelta(
- strictStartedAtMs,
- strictEndedAtMs,
- publisherState,
- secondaryPublisherState,
- subscriberState,
- );
- return {
- status,
- startedAt: context?.startedAtIso ?? new Date(now).toISOString(),
- endedAt: new Date(now).toISOString(),
- platform: process.platform,
- arch: process.arch,
- config: sanitizeConfig(config),
- checks,
- skippedReason,
- error: error ? String(error.stack ?? error.message ?? error) : null,
- hardwareEncoder: capabilities,
- metrics: {
- inboundAudioFrames,
- inboundVideoFrames,
- strictAudioFrames,
- strictVideoFrames,
- videoCallbacks: subscriberState?.videoCallbacks ?? 0,
- videoBytes: subscriberState?.videoBytes ?? 0,
- receivedFps: Math.round(measuredFps * 100) / 100,
- requiredFps: config.minFpsRatio > 0 ? Math.round(config.fps * config.minFpsRatio * 100) / 100 : null,
- maxVideoFrameGapMs: maxGapMs(strictVideoFrameTimes, strictStartedAtMs, strictEndedAtMs),
- maxAudioFrameGapMs: subscriberState
- ? maxGapMs(subscriberState.audioFrameTimes, strictStartedAtMs, strictEndedAtMs)
- : 0,
- maxVideoFrameGapOverallMs: subscriberState?.maxVideoFrameGapMs ?? 0,
- maxAudioFrameGapOverallMs: subscriberState?.maxAudioFrameGapMs ?? 0,
- avDriftMs,
- maxObservedPacketLoss: observedPacketLoss,
- maxObservedPacketLossDelta: observedPacketLossDelta,
- videoResolutionCounts: videoResolutionCounts(
- subscriberState,
- strictStartedAtMs,
- strictEndedAtMs,
- strictVideoSelector,
- ),
- videoResolutionMismatchCount: videoResolutionMismatchCount(
- subscriberState,
- config.expectedWidth,
- config.expectedHeight,
- strictStartedAtMs,
- strictEndedAtMs,
- strictVideoSelector,
- ),
- droppedVideoFrameCallbacks: subscriber ? subscriber.droppedVideoFrameCallbacks() : 0,
- publisherVideoPump: context?.videoPump?.stats?.() ?? null,
- secondaryPublisherVideoPump: context?.secondaryVideoPump?.stats?.() ?? null,
- serverPublishing: summarizeServerPublishing(context?.serverState),
- lastVideoMeta: subscriberState?.lastVideoMeta ?? null,
- lastStrictVideoMeta: lastVideoFrameRecord(
- subscriberState,
- strictStartedAtMs,
- strictEndedAtMs,
- strictVideoSelector,
- ),
- publisherStats: publisherState?.stats ?? null,
- secondaryPublisherStats: secondaryPublisherState?.stats ?? null,
- subscriberStats: subscriberState?.stats ?? null,
- },
- };
-}
-
-function strictFailures(report, config) {
- const failures = [];
- if (config.minFpsRatio > 0 && report.metrics.receivedFps < config.fps * config.minFpsRatio) {
- failures.push(`received FPS ${report.metrics.receivedFps} below ${config.fps * config.minFpsRatio}`);
- }
- if (config.maxFrameGapMs > 0) {
- if (report.metrics.strictVideoFrames < 2) {
- failures.push(
- 'video frame gap unavailable because fewer than two video frames were observed during strict window',
- );
- } else if (report.metrics.maxVideoFrameGapMs > config.maxFrameGapMs) {
- failures.push(`max video frame gap ${report.metrics.maxVideoFrameGapMs}ms exceeds ${config.maxFrameGapMs}ms`);
- }
- }
- if (config.maxAudioFrameGapMs > 0 && expectedInboundAudioTrackCount(config) > 0) {
- if (report.metrics.strictAudioFrames < 2) {
- failures.push(
- 'audio frame gap unavailable because fewer than two audio frames were observed during strict window',
- );
- } else if (report.metrics.maxAudioFrameGapMs > config.maxAudioFrameGapMs) {
- failures.push(
- `max audio frame gap ${report.metrics.maxAudioFrameGapMs}ms exceeds ${config.maxAudioFrameGapMs}ms`,
- );
- }
- }
- if (config.maxAvDriftMs > 0) {
- if (report.metrics.avDriftMs === null) {
- failures.push('A/V drift unavailable because video or audio timing was not observed');
- } else if (report.metrics.avDriftMs > config.maxAvDriftMs) {
- failures.push(`A/V drift ${report.metrics.avDriftMs}ms exceeds ${config.maxAvDriftMs}ms`);
- }
- }
- if (config.maxPacketLoss !== null && report.metrics.maxObservedPacketLossDelta > config.maxPacketLoss) {
- failures.push(
- `observed packet loss delta ${report.metrics.maxObservedPacketLossDelta} exceeds ${config.maxPacketLoss}`,
- );
- }
- if (config.requireStableResolution && report.metrics.videoResolutionMismatchCount > 0) {
- failures.push(
- `observed ${report.metrics.videoResolutionMismatchCount} video frames outside ${config.expectedWidth}x${config.expectedHeight}`,
- );
- }
- if (report.metrics.droppedVideoFrameCallbacks > 0) {
- failures.push(`dropped video frame callbacks ${report.metrics.droppedVideoFrameCallbacks}`);
- }
- return failures;
-}
-
-async function writeReportIfRequested(report, reportPath) {
- if (!reportPath) return;
- await writeFile(reportPath, `${JSON.stringify(report, null, 2)}\n`, 'utf8');
-}
-
-async function runHarness(config) {
- if (!isSupported()) {
- throw new Error(`native binding unavailable: ${loadError?.message ?? 'unknown error'}`);
- }
-
- const target = liveKitTcpTarget(config.url);
- const probe = await probeTcp(target, config.probeTimeoutMs);
- if (!probe.ok) {
- const message = `LiveKit is unreachable at ${config.url} (${probe.reason})`;
- if (!config.required) {
- console.log(`[livekit-harness] SKIP: ${message}. Set FLUXER_WEBRTC_SENDER_LIVEKIT_REQUIRED=1 to fail instead.`);
- return {skipped: true, skippedReason: message};
- }
- throw new Error(message);
- }
-
- const publisherIdentity = config.publisherIdentity;
- const secondaryPublisherIdentity = config.secondaryPublisherIdentity;
- const subscriberIdentity = config.subscriberIdentity;
- const publisherToken =
- config.publisherToken ??
- createLiveKitToken({
- apiKey: config.apiKey,
- apiSecret: config.apiSecret,
- room: config.room,
- identity: publisherIdentity,
- name: 'Fluxer Native Publisher',
- });
- const secondaryPublisherToken = config.secondaryPublisher
- ? (config.secondaryPublisherToken ??
- createLiveKitToken({
- apiKey: config.apiKey,
- apiSecret: config.apiSecret,
- room: config.room,
- identity: secondaryPublisherIdentity,
- name: 'Fluxer Native Publisher 2',
- }))
- : null;
- const subscriberToken =
- config.subscriberToken ??
- createLiveKitToken({
- apiKey: config.apiKey,
- apiSecret: config.apiSecret,
- room: config.room,
- identity: subscriberIdentity,
- name: 'Fluxer Native Subscriber',
- });
-
- const publisher = new VoiceEngine();
- const secondaryPublisher = config.secondaryPublisher ? new VoiceEngine() : null;
- const subscriber = new VoiceEngine();
- const publisherState = createEngineState('publisher', config.verbose);
- const secondaryPublisherState = config.secondaryPublisher ? createEngineState('publisher-2', config.verbose) : null;
- const subscriberState = createEngineState('subscriber', config.verbose);
- const pumpErrors = [];
- const context = {
- publisher,
- secondaryPublisher,
- subscriber,
- publisherState,
- secondaryPublisherState,
- subscriberState,
- serverState: {
- participants: null,
- error: null,
- fetchedAtMs: null,
- lastAttemptAtMs: 0,
- inFlight: false,
- },
- config,
- publisherIdentity,
- secondaryPublisherIdentity,
- subscriberIdentity,
- startedAtMs: Date.now(),
- startedAtIso: new Date().toISOString(),
- strictStartedAtMs: null,
- strictEndedAtMs: null,
- };
- let videoPump = null;
- let secondaryVideoPump = null;
- let micPump = null;
- let secondaryMicPump = null;
- let screenAudioPump = null;
- let secondaryScreenAudioPump = null;
- let audioSampler = null;
-
- publisher.setEventCallback((...args) => {
- const [eventType, payload] = unpackNapiPair(args);
- publisherState.recordEvent(eventType, payload);
- });
- secondaryPublisher?.setEventCallback((...args) => {
- const [eventType, payload] = unpackNapiPair(args);
- secondaryPublisherState.recordEvent(eventType, payload);
- });
- subscriber.setEventCallback((...args) => {
- const [eventType, payload] = unpackNapiPair(args);
- subscriberState.recordEvent(eventType, payload);
- });
- subscriber.setVideoFrameCallback((...args) => {
- const [metaJson, data] = unpackNapiPair(args);
- subscriberState.recordVideoFrame(metaJson, data);
- });
- subscriber.setCountInboundAudio(true);
- audioSampler = startAudioSampler(subscriber, subscriberState);
-
- try {
- const e2eeKey = config.e2eeKey ? Buffer.from(config.e2eeKey, 'utf8') : undefined;
- console.log(`[livekit-harness] connecting to ${config.url} room=${config.room}`);
- await withTimeout(
- Promise.all(
- [
- publisher.connect(config.url, publisherToken, e2eeKey),
- secondaryPublisher && secondaryPublisherToken
- ? secondaryPublisher.connect(config.url, secondaryPublisherToken, e2eeKey)
- : null,
- subscriber.connect(config.url, subscriberToken, e2eeKey),
- ].filter(Boolean),
- ),
- config.connectTimeoutMs,
- 'connect',
- );
-
- await withTimeout(
- publisher.publishScreenShare(
- config.width,
- config.height,
- config.codec,
- config.maxBitrateBps,
- config.fps,
- config.screenSimulcast,
- {
- adaptiveSend: config.adaptiveSend,
- minVideoFps: config.minVideoFps,
- minResolutionScale: config.minResolutionScale,
- maxAudioBufferMs: config.maxAudioBufferMs,
- captureId: 'livekit-harness-primary-screen',
- trackName: 'livekit-harness-primary-screen',
- },
- ),
- 10_000,
- 'publish screenshare',
- );
- if (secondaryPublisher) {
- await withTimeout(
- secondaryPublisher.publishScreenShare(
- config.width,
- config.height,
- config.secondaryPublisherCodec,
- config.maxBitrateBps,
- config.fps,
- config.secondaryPublisherScreenSimulcast,
- {
- adaptiveSend: config.adaptiveSend,
- minVideoFps: config.minVideoFps,
- minResolutionScale: config.minResolutionScale,
- maxAudioBufferMs: config.maxAudioBufferMs,
- captureId: 'livekit-harness-secondary-screen',
- trackName: 'livekit-harness-secondary-screen',
- },
- ),
- 10_000,
- 'publish secondary screenshare',
- );
- }
- if (config.microphone) {
- await withTimeout(publisher.publishMicrophone(config.sampleRate, config.channels), 10_000, 'publish microphone');
- }
- if (secondaryPublisher && config.secondaryPublisherMicrophone) {
- await withTimeout(
- secondaryPublisher.publishMicrophone(config.sampleRate, config.channels),
- 10_000,
- 'publish secondary microphone',
- );
- }
- if (config.screenAudio) {
- await withTimeout(
- publisher.publishScreenShareAudio(config.sampleRate, config.channels),
- 10_000,
- 'publish screen-share audio',
- );
- }
- if (secondaryPublisher && config.secondaryPublisherScreenAudio) {
- await withTimeout(
- secondaryPublisher.publishScreenShareAudio(config.sampleRate, config.channels),
- 10_000,
- 'publish secondary screen-share audio',
- );
- }
- if (config.camera) {
- await withTimeout(
- publisher.publishCamera({
- deviceId: config.cameraDeviceId ?? undefined,
- width: config.width,
- height: config.height,
- frameRate: config.fps,
- }),
- 10_000,
- 'publish camera',
- );
- }
-
- videoPump = startVideoPump(publisher, config, pumpErrors);
- context.videoPump = videoPump;
- if (secondaryPublisher) {
- secondaryVideoPump = startVideoPump(secondaryPublisher, config, pumpErrors);
- context.secondaryVideoPump = secondaryVideoPump;
- }
- if (config.microphone) {
- micPump = startAudioPump(
- 'pushPcm',
- (buffer, sampleRate, channels) => publisher.pushPcm(buffer, sampleRate, channels),
- config,
- pumpErrors,
- );
- }
- if (secondaryPublisher && config.secondaryPublisherMicrophone) {
- secondaryMicPump = startAudioPump(
- 'secondary pushPcm',
- (buffer, sampleRate, channels) => secondaryPublisher.pushPcm(buffer, sampleRate, channels),
- config,
- pumpErrors,
- );
- }
- if (config.screenAudio) {
- screenAudioPump = startAudioPump(
- 'pushScreenSharePcm',
- (buffer, sampleRate, channels) => publisher.pushScreenSharePcm(buffer, sampleRate, channels),
- config,
- pumpErrors,
- );
- }
- if (secondaryPublisher && config.secondaryPublisherScreenAudio) {
- secondaryScreenAudioPump = startAudioPump(
- 'secondary pushScreenSharePcm',
- (buffer, sampleRate, channels) => secondaryPublisher.pushScreenSharePcm(buffer, sampleRate, channels),
- config,
- pumpErrors,
- );
- }
- if (config.dataPacket) {
- await publisher.publishData(Buffer.from('fluxer-native-media-harness'), {
- reliable: true,
- topic: 'native-media-harness',
- destinationIdentities: [subscriberIdentity],
- });
- if (secondaryPublisher) {
- await secondaryPublisher.publishData(Buffer.from('fluxer-native-media-harness-secondary'), {
- reliable: true,
- topic: 'native-media-harness-secondary',
- destinationIdentities: [subscriberIdentity],
- });
- }
- }
- await setSubscriberVideoQuality(subscriber, publisherIdentity, config.subscriberVideoQuality);
- if (secondaryPublisher) {
- await setSubscriberVideoQuality(subscriber, secondaryPublisherIdentity, config.subscriberVideoQuality);
- }
- if (config.subscriptionCycle) {
- await runSubscriptionCycle(subscriber, publisherIdentity);
- if (secondaryPublisher) {
- await runSubscriptionCycle(subscriber, secondaryPublisherIdentity);
- }
- }
-
- const checks = await waitForHarnessSuccess(context, pumpErrors, config.timeoutMs);
- await holdStrictDuration(context, pumpErrors, config.durationMs);
- const report = buildReport({status: 'pass', config, checks, context});
- const failures = strictFailures(report, config);
- if (failures.length > 0) {
- const failedReport = {...report, status: 'fail', error: failures.join('; ')};
- await writeReportIfRequested(failedReport, config.reportPath);
- const error = new Error(failures.join('; '));
- error.report = failedReport;
- throw error;
- }
- await writeReportIfRequested(report, config.reportPath);
- const producedFps = report.metrics.publisherVideoPump?.producedFps ?? null;
- console.log(
- `[livekit-harness] PASS: ${checks.length} checks, inboundAudioFrames=${report.metrics.inboundAudioFrames}, inboundVideoFrames=${report.metrics.inboundVideoFrames}, videoCallbacks=${report.metrics.videoCallbacks}, receivedFps=${report.metrics.receivedFps}, producedFps=${producedFps}, maxVideoFrameGapMs=${report.metrics.maxVideoFrameGapMs}, maxAudioFrameGapMs=${report.metrics.maxAudioFrameGapMs}, maxObservedPacketLoss=${report.metrics.maxObservedPacketLoss}, maxObservedPacketLossDelta=${report.metrics.maxObservedPacketLossDelta}, resolutionMismatches=${report.metrics.videoResolutionMismatchCount}, droppedVideoFrameCallbacks=${report.metrics.droppedVideoFrameCallbacks}`,
- );
- return {skipped: false, report};
- } catch (error) {
- if (!error.report) {
- let checks = [];
- try {
- checks = currentChecks(context);
- } catch {}
- error.report = buildReport({status: 'fail', config, checks, error, context});
- }
- throw error;
- } finally {
- videoPump?.stop();
- secondaryVideoPump?.stop();
- micPump?.stop();
- secondaryMicPump?.stop();
- screenAudioPump?.stop();
- secondaryScreenAudioPump?.stop();
- audioSampler?.stop();
- await micPump?.done();
- await secondaryMicPump?.done();
- await screenAudioPump?.done();
- await secondaryScreenAudioPump?.done();
- await disconnectEngine(subscriber, 'subscriber', config.disconnectTimeoutMs);
- await disconnectEngine(secondaryPublisher, 'publisher-2', config.disconnectTimeoutMs);
- await disconnectEngine(publisher, 'publisher', config.disconnectTimeoutMs);
- }
-}
-
-function buildAggregateReport({status, config, scenarioReports, startedAtMs}) {
- return {
- status,
- startedAt: new Date(startedAtMs).toISOString(),
- endedAt: new Date().toISOString(),
- platform: process.platform,
- arch: process.arch,
- config: sanitizeConfig(config),
- scenarioCount: scenarioReports.length,
- scenarios: scenarioReports,
- };
-}
-
-async function runScenarioSuite(baseConfig, scenarios) {
- const startedAtMs = Date.now();
- const scenarioReports = [];
- for (let index = 0; index < scenarios.length; index += 1) {
- const scenario = scenarios[index];
- console.log(
- `[livekit-harness] scenario ${index + 1}/${scenarios.length}: ${scenario.scenarioName} room=${scenario.room}`,
- );
- try {
- const result = await runHarness(scenario);
- if (result.skipped) {
- scenarioReports.push(buildReport({status: 'skip', config: scenario, skippedReason: result.skippedReason}));
- } else {
- scenarioReports.push(result.report);
- }
- } catch (error) {
- scenarioReports.push(error.report ?? buildReport({status: 'fail', config: scenario, error}));
- }
- }
- const failed = scenarioReports.filter((report) => report.status === 'fail');
- const skipped = scenarioReports.filter((report) => report.status === 'skip');
- const status = failed.length > 0 ? 'fail' : skipped.length === scenarioReports.length ? 'skip' : 'pass';
- const aggregate = buildAggregateReport({status, config: baseConfig, scenarioReports, startedAtMs});
- await writeReportIfRequested(aggregate, baseConfig.reportPath);
- if (status === 'fail') {
- const failedNames = failed.map((report) => report.config.scenarioName ?? report.config.codec).join(', ');
- const error = new Error(`LiveKit scenario suite failed: ${failedNames}`);
- error.report = aggregate;
- throw error;
- }
- return aggregate;
-}
-
-async function main() {
- const baseConfig = parseConfig();
- const scenarios = buildScenarioConfigs(baseConfig);
- try {
- if (scenarios.length > 1) {
- const aggregate = await runScenarioSuite(baseConfig, scenarios);
- console.log(`[livekit-harness] ${aggregate.status.toUpperCase()}: ${aggregate.scenarioCount} codec scenarios`);
- return 0;
- }
- const config = scenarios[0];
- const result = await runHarness(config);
- if (result.skipped) {
- const report = buildReport({status: 'skip', config, skippedReason: result.skippedReason});
- await writeReportIfRequested(report, baseConfig.reportPath);
- }
- return 0;
- } catch (error) {
- const report = error.report ?? buildReport({status: 'fail', config: baseConfig, error});
- await writeReportIfRequested(report, baseConfig.reportPath);
- console.error(`[livekit-harness] FAIL: ${error.stack ?? error.message}`);
- return 1;
- }
-}
-
-export {
- buildAggregateReport,
- buildReport,
- buildScenarioConfigs,
- createLiveKitAdminToken,
- createLiveKitToken,
- expectedCodecMime,
- jwtSubject,
- liveKitApiUrl,
- liveKitTcpTarget,
- parseCodecList,
- parseConfig,
- sanitizeConfig,
- scenarioRoomName,
- serverPublishedTrackChecks,
- statsHasOutbound,
- statsHasOutboundCodec,
- strictFailures,
-};
-
-if (process.argv[1] === fileURLToPath(import.meta.url)) {
- const exitCode = await main();
- setImmediate(() => process.exit(exitCode));
-}
diff --git a/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.test.mjs b/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.test.mjs
deleted file mode 100644
index ed6547f08..000000000
--- a/fluxer_desktop/native/webrtc-sender/scripts/livekit-harness.test.mjs
+++ /dev/null
@@ -1,842 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-import assert from 'node:assert/strict';
-import {describe, test} from 'node:test';
-import {
- buildReport,
- buildScenarioConfigs,
- createLiveKitAdminToken,
- expectedCodecMime,
- jwtSubject,
- liveKitApiUrl,
- liveKitTcpTarget,
- parseCodecList,
- parseConfig,
- sanitizeConfig,
- scenarioRoomName,
- serverPublishedTrackChecks,
- statsHasOutbound,
- statsHasOutboundCodec,
- strictFailures,
-} from './livekit-harness.mjs';
-
-function tokenForSubject(subject) {
- const payload = Buffer.from(JSON.stringify({sub: subject}), 'utf8').toString('base64url');
- return `header.${payload}.signature`;
-}
-
-function jwtPayload(token) {
- const parts = token.split('.');
- return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
-}
-
-async function withHarnessEnv(env, callback) {
- const previous = {...process.env};
- for (const key of Object.keys(process.env)) {
- if (
- key.startsWith('LIVEKIT_') ||
- key.startsWith('FLUXER_WEBRTC_SENDER_LIVEKIT') ||
- key.startsWith('FLUXER_NATIVE_MEDIA')
- ) {
- delete process.env[key];
- }
- }
- Object.assign(process.env, env);
- try {
- return await callback();
- } finally {
- for (const key of Object.keys(process.env)) {
- delete process.env[key];
- }
- Object.assign(process.env, previous);
- }
-}
-
-function strictReportFor(
- config,
- {
- videoFrameTimes = null,
- videoFrameRecords = null,
- audioFrameTimes = [],
- droppedVideoFrameCallbacks = 0,
- subscriberStatsSamples = [],
- } = {},
-) {
- const strictStartedAtMs = 1_000;
- const strictEndedAtMs = 2_000;
- const effectiveVideoFrameRecords =
- videoFrameRecords ??
- (videoFrameTimes ?? []).map((atMs) => ({
- atMs,
- identity: config.publisherIdentity,
- kind: 'video',
- source: 'screen_share',
- trackName: 'screen',
- trackSid: 'TR_screen',
- width: config.expectedWidth,
- height: config.expectedHeight,
- }));
- const effectiveVideoFrameTimes = videoFrameTimes ?? effectiveVideoFrameRecords.map((record) => record.atMs);
- return buildReport({
- status: 'pass',
- config,
- context: {
- startedAtMs: strictStartedAtMs - 500,
- startedAtIso: new Date(strictStartedAtMs - 500).toISOString(),
- strictStartedAtMs,
- strictEndedAtMs,
- publisherState: {statsSamples: [], stats: null},
- subscriberState: {
- statsSamples: subscriberStatsSamples,
- stats: subscriberStatsSamples.at(-1)?.payload ?? null,
- videoCallbacks: effectiveVideoFrameTimes.length,
- videoBytes: effectiveVideoFrameTimes.length * 4,
- videoFrameTimes: effectiveVideoFrameTimes,
- videoFrameRecords: effectiveVideoFrameRecords,
- audioFrameTimes,
- lastVideoMeta: effectiveVideoFrameRecords.at(-1) ?? null,
- lastVideoFrameAtMs: effectiveVideoFrameTimes.at(-1) ?? null,
- lastAudioFrameAtMs: audioFrameTimes.at(-1) ?? null,
- },
- subscriber: {
- inboundAudioFrames: () => audioFrameTimes.length,
- inboundVideoFrames: () => effectiveVideoFrameTimes.length,
- droppedVideoFrameCallbacks: () => droppedVideoFrameCallbacks,
- },
- },
- });
-}
-
-function findCheck(checks, name) {
- const check = checks.find((entry) => entry.name === name);
- assert.ok(check, `missing check: ${name}`);
- return check;
-}
-
-function serverChecksFor(config, serverState) {
- return serverPublishedTrackChecks({
- config,
- serverState,
- publisherIdentity: config.publisherIdentity,
- secondaryPublisherIdentity: config.secondaryPublisherIdentity,
- });
-}
-
-describe('livekit harness setup matrix', () => {
- test('normalizes LiveKit screenshare source spelling in outbound stats', () => {
- const stats = {
- outbound: [
- {
- trackSid: 'TR_screen',
- source: 'screenshare',
- kind: 'video',
- codec: 'video/VP8',
- bitrateKbps: 400,
- packetsLost: 0,
- },
- ],
- };
-
- assert.equal(statsHasOutbound(stats, 'video', 'screen_share'), true);
- assert.equal(statsHasOutboundCodec(stats, 'video', 'screen_share', 'video/VP8'), true);
- assert.equal(statsHasOutboundCodec(stats, 'video', 'screen_share', 'video/H264'), false);
- });
-
- test('maps all supported codec spellings to expected mime types', () => {
- assert.equal(expectedCodecMime('vp8'), 'video/VP8');
- assert.equal(expectedCodecMime('VP9'), 'video/VP9');
- assert.equal(expectedCodecMime('h264'), 'video/H264');
- assert.equal(expectedCodecMime('av1'), 'video/AV1');
- assert.equal(expectedCodecMime('h265'), 'video/H265');
- assert.equal(expectedCodecMime('hevc'), 'video/H265');
- assert.equal(expectedCodecMime(''), null);
- assert.throws(() => expectedCodecMime('h266'), /unsupported/);
- });
-
- test('parses codec lists with fallback and rejects empty effective lists', () => {
- assert.deepEqual(parseCodecList(' vp8, h264,, hevc ', 'av1'), ['vp8', 'h264', 'hevc']);
- assert.deepEqual(parseCodecList('', 'vp9'), ['vp9']);
- assert.throws(() => parseCodecList('', ''), /at least one/);
- assert.throws(() => parseCodecList('vp8,h266', 'vp8'), /unsupported/);
- });
-
- test('default non-strict config keeps the fast local live setup small', async () => {
- await withHarnessEnv({}, () => {
- const config = parseConfig();
- assert.equal(config.url, 'ws://localhost:7880');
- assert.equal(config.serverApiUrl, 'http://localhost:7880');
- assert.deepEqual(config.screenCodecs, ['vp8']);
- assert.equal(config.expectedScreenCodec, 'video/VP8');
- assert.equal(config.secondaryPublisher, false);
- assert.equal(config.microphone, true);
- assert.equal(config.screenAudio, false);
- assert.equal(config.dataPacket, false);
- assert.equal(config.subscriptionCycle, false);
- assert.equal(config.validateServerPublishing, false);
- assert.equal(config.durationMs, 0);
- assert.equal(config.externalTokens, false);
- assert.equal(config.screenSimulcast, true);
- assert.equal(config.secondaryPublisherScreenSimulcast, true);
- assert.equal(config.adaptiveSend, true);
- assert.equal(config.minVideoFps, 15);
- assert.equal(config.minResolutionScale, 0.5);
- assert.equal(config.maxAudioBufferMs, 750);
- });
- });
-
- test('strict config expands to multi-codec secondary-publisher scenarios', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_HARNESS_STRICT: '1',
- LIVEKIT_ROOM: 'matrix-room',
- LIVEKIT_SCREEN_CODECS: 'vp8,h264,hevc',
- LIVEKIT_EXPECT_SCREEN_CODECS: 'vp8,h264,h265',
- },
- () => {
- const config = parseConfig();
- assert.equal(config.secondaryPublisher, true);
- assert.equal(config.screenAudio, true);
- assert.equal(config.dataPacket, true);
- assert.equal(config.subscriptionCycle, true);
- assert.equal(config.validateServerPublishing, true);
- assert.equal(config.durationMs, 10 * 60 * 1000);
- assert.equal(config.maxAudioFrameGapMs, 250);
- assert.equal(config.maxPacketLoss, null);
- assert.equal(config.requireStableResolution, true);
- assert.equal(config.videoPattern, 'gradient');
-
- const scenarios = buildScenarioConfigs(config);
- assert.deepEqual(
- scenarios.map((scenario) => scenario.scenarioName),
- ['codec-vp8-with-h264', 'codec-h264-with-hevc', 'codec-hevc-with-vp8'],
- );
- assert.deepEqual(
- scenarios.map((scenario) => scenario.expectedScreenCodec),
- ['video/VP8', 'video/H264', 'video/H265'],
- );
- assert.deepEqual(
- scenarios.map((scenario) => scenario.expectedSecondaryPublisherCodec),
- ['video/H264', 'video/H265', 'video/VP8'],
- );
- assert.equal(scenarios[0].room, 'matrix-room-codec-vp8-with-h264');
- assert.equal(scenarios[1].reportPath, null);
- },
- );
- });
-
- test('stress knobs parse packet loss, resolution stability, audio gap, and video pattern', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_MAX_PACKET_LOSS: '0',
- LIVEKIT_REQUIRE_STABLE_RESOLUTION: '0',
- LIVEKIT_MAX_AUDIO_FRAME_GAP_MS: '180',
- LIVEKIT_VIDEO_PATTERN: 'fast',
- LIVEKIT_VIDEO_INPUT: 'nv12',
- LIVEKIT_SUBSCRIBER_VIDEO_QUALITY: 'high',
- LIVEKIT_SCREEN_SIMULCAST: '0',
- LIVEKIT_SECOND_PUBLISHER_SCREEN_SIMULCAST: '1',
- LIVEKIT_SCREEN_FPS: '60',
- LIVEKIT_ADAPTIVE_SEND: '0',
- LIVEKIT_MIN_VIDEO_FPS: '24',
- LIVEKIT_MIN_RESOLUTION_SCALE: '0.75',
- LIVEKIT_MAX_AUDIO_BUFFER_MS: '640',
- },
- () => {
- const config = parseConfig();
- assert.equal(config.maxPacketLoss, 0);
- assert.equal(config.requireStableResolution, false);
- assert.equal(config.maxAudioFrameGapMs, 180);
- assert.equal(config.videoPattern, 'fast');
- assert.equal(config.videoInput, 'nv12');
- assert.equal(config.subscriberVideoQuality, 'high');
- assert.equal(config.screenSimulcast, false);
- assert.equal(config.secondaryPublisherScreenSimulcast, true);
- assert.equal(config.adaptiveSend, false);
- assert.equal(config.minVideoFps, 24);
- assert.equal(config.minResolutionScale, 0.75);
- assert.equal(config.maxAudioBufferMs, 640);
- },
- );
- });
-
- test('stress knobs reject impossible send pacing configurations', async () => {
- await withHarnessEnv({LIVEKIT_SCREEN_FPS: '0'}, () =>
- assert.throws(() => parseConfig(), /LIVEKIT_SCREEN_FPS must be a positive number/),
- );
- await withHarnessEnv({LIVEKIT_MIN_VIDEO_FPS: '0'}, () =>
- assert.throws(() => parseConfig(), /LIVEKIT_MIN_VIDEO_FPS must be a positive number/),
- );
- await withHarnessEnv({LIVEKIT_SCREEN_FPS: '30', LIVEKIT_MIN_VIDEO_FPS: '60'}, () =>
- assert.throws(() => parseConfig(), /MIN_VIDEO_FPS must be less than or equal/),
- );
- await withHarnessEnv({LIVEKIT_MAX_AUDIO_BUFFER_MS: '0'}, () =>
- assert.throws(() => parseConfig(), /LIVEKIT_MAX_AUDIO_BUFFER_MS must be a positive integer/),
- );
- await withHarnessEnv({LIVEKIT_MIN_RESOLUTION_SCALE: '0'}, () =>
- assert.throws(() => parseConfig(), /LIVEKIT_MIN_RESOLUTION_SCALE must be a positive number/),
- );
- await withHarnessEnv({LIVEKIT_MIN_RESOLUTION_SCALE: '1.5'}, () =>
- assert.throws(() => parseConfig(), /LIVEKIT_MIN_RESOLUTION_SCALE must be greater than 0/),
- );
- await withHarnessEnv({LIVEKIT_ENABLE_SCREEN_AUDIO: 'maybe'}, () =>
- assert.throws(() => parseConfig(), /LIVEKIT_ENABLE_SCREEN_AUDIO must be a boolean flag/),
- );
- await withHarnessEnv({LIVEKIT_SCREEN_CODECS: 'vp8,h264', LIVEKIT_EXPECT_SCREEN_CODECS: 'vp8'}, () =>
- assert.throws(() => parseConfig(), /EXPECT_SCREEN_CODECS length must match/),
- );
- });
-
- test('explicit secondary codec expectations override rotating defaults', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_ENABLE_SECOND_PUBLISHER: '1',
- LIVEKIT_SCREEN_CODECS: 'vp8,h264',
- LIVEKIT_SECOND_PUBLISHER_CODEC: 'av1',
- LIVEKIT_EXPECT_SECOND_PUBLISHER_SCREEN_CODEC: 'hevc',
- },
- () => {
- const scenarios = buildScenarioConfigs(parseConfig());
- assert.deepEqual(
- scenarios.map((scenario) => scenario.secondaryPublisherCodec),
- ['av1', 'av1'],
- );
- assert.deepEqual(
- scenarios.map((scenario) => scenario.expectedSecondaryPublisherCodec),
- ['video/H265', 'video/H265'],
- );
- },
- );
- });
-
- test('secondary screen codec aliases are accepted and conflicting aliases are rejected', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_ENABLE_SECOND_PUBLISHER: '1',
- LIVEKIT_SCREEN_CODECS: 'h264',
- LIVEKIT_SECOND_PUBLISHER_SCREEN_CODECS: 'vp8',
- LIVEKIT_EXPECT_SECONDARY_PUBLISHER_SCREEN_CODEC: 'vp8',
- },
- () => {
- const config = parseConfig();
- assert.equal(config.secondaryPublisherCodec, 'vp8');
- assert.equal(config.expectedSecondaryPublisherCodec, 'video/VP8');
- },
- );
-
- await withHarnessEnv(
- {
- LIVEKIT_ENABLE_SECOND_PUBLISHER: '1',
- LIVEKIT_SECOND_PUBLISHER_CODEC: 'h264',
- LIVEKIT_SECOND_PUBLISHER_SCREEN_CODEC: 'vp8',
- },
- () => assert.throws(() => parseConfig(), /conflicts with LIVEKIT_SECOND_PUBLISHER_CODEC/),
- );
-
- await withHarnessEnv(
- {
- LIVEKIT_ENABLE_SECOND_PUBLISHER: '1',
- LIVEKIT_EXPECT_SECOND_PUBLISHER_SCREEN_CODEC: 'h264',
- LIVEKIT_EXPECT_SECONDARY_PUBLISHER_SCREEN_CODEC: 'vp8',
- },
- () => assert.throws(() => parseConfig(), /conflicts with LIVEKIT_EXPECT_SECOND_PUBLISHER_SCREEN_CODEC/),
- );
- });
-
- test('external token setup derives identities, requires matching tokens, and redacts reports', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_PUBLISHER_TOKEN: tokenForSubject('publisher-subject'),
- },
- () => assert.throws(() => parseConfig(), /both required/),
- );
-
- await withHarnessEnv(
- {
- LIVEKIT_ROOM: 'shared-token-room',
- LIVEKIT_SCREEN_CODECS: 'vp8,h264',
- LIVEKIT_ENABLE_SECOND_PUBLISHER: '1',
- LIVEKIT_PUBLISHER_TOKEN: tokenForSubject('publisher-subject'),
- LIVEKIT_SUBSCRIBER_TOKEN: tokenForSubject('subscriber-subject'),
- },
- () => assert.throws(() => parseConfig(), /SECONDARY_PUBLISHER_TOKEN/),
- );
-
- await withHarnessEnv(
- {
- LIVEKIT_ROOM: 'shared-token-room',
- LIVEKIT_SCREEN_CODECS: 'vp8,h264',
- LIVEKIT_ENABLE_SECOND_PUBLISHER: '1',
- LIVEKIT_PUBLISHER_TOKEN: tokenForSubject('publisher-subject'),
- LIVEKIT_SUBSCRIBER_TOKEN: tokenForSubject('subscriber-subject'),
- LIVEKIT_SECONDARY_PUBLISHER_TOKEN: tokenForSubject('secondary-subject'),
- LIVEKIT_E2EE_KEY: 'secret-key',
- },
- () => {
- const config = parseConfig();
- assert.equal(config.externalTokens, true);
- assert.equal(config.publisherIdentity, 'publisher-subject');
- assert.equal(config.subscriberIdentity, 'subscriber-subject');
- assert.equal(config.secondaryPublisherIdentity, 'secondary-subject');
- assert.deepEqual(
- buildScenarioConfigs(config).map((scenario) => scenario.room),
- ['shared-token-room', 'shared-token-room'],
- );
-
- const sanitized = sanitizeConfig(config);
- assert.equal(sanitized.url, 'ws://localhost:7880');
- assert.equal(sanitized.apiSecret, '');
- assert.equal(sanitized.e2eeKey, '');
- assert.equal(sanitized.publisherToken, '');
- assert.equal(sanitized.subscriberToken, '');
- assert.equal(sanitized.secondaryPublisherToken, '');
- },
- );
- });
-
- test('report sanitization strips URL credentials, query strings, and fragments', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_URL: 'wss://user:password@example.test:443/rtc?access_token=secret#fragment',
- },
- () => {
- const sanitized = sanitizeConfig(parseConfig());
- assert.equal(sanitized.url, 'wss://example.test/rtc');
- assert.doesNotMatch(JSON.stringify(sanitized), /user|password|access_token|secret|fragment/);
- },
- );
- });
-
- test('jwt subject and TCP target parsing catch malformed live setups early', () => {
- assert.equal(jwtSubject(tokenForSubject('user_1_connection')), 'user_1_connection');
- assert.throws(() => jwtSubject('not-a-jwt'), /must be a JWT/);
- assert.throws(() => jwtSubject('header.bad-json.signature'), /failed to decode/);
- assert.throws(() => jwtSubject(tokenForSubject('')), /does not contain/);
-
- assert.deepEqual(liveKitTcpTarget('ws://localhost:7880'), {host: 'localhost', port: 7880});
- assert.deepEqual(liveKitTcpTarget('wss://[::1]/rtc'), {host: '::1', port: 443});
- assert.equal(liveKitApiUrl('ws://localhost:7880/rtc?token=secret'), 'http://localhost:7880');
- assert.equal(liveKitApiUrl('wss://livekit.example.test/rtc'), 'https://livekit.example.test');
- assert.throws(() => liveKitTcpTarget('https://localhost'), /must use ws/);
- });
-
- test('admin token has the room-scoped grant needed for server publishing validation', () => {
- const token = createLiveKitAdminToken({apiKey: 'devkey', apiSecret: 'secret', room: 'room-a'});
- const payload = jwtPayload(token);
- assert.equal(payload.iss, 'devkey');
- assert.equal(payload.video.room, 'room-a');
- assert.equal(payload.video.roomAdmin, true);
- assert.equal(payload.video.roomJoin, undefined);
- });
-
- test('scenario room names are stable and bounded for generated-token suites', () => {
- assert.equal(scenarioRoomName('room', 'codec-vp8', 1, false), 'room');
- assert.equal(scenarioRoomName('room', 'codec:vP8 with H264', 2, false), 'room-codec-vP8-with-H264');
- assert.equal(scenarioRoomName('room', 'codec-vp8', 2, true), 'room');
-
- const longRoom = scenarioRoomName('r'.repeat(120), 'codec-h264-with-hevc', 2, false);
- assert.equal(longRoom.length, 128);
- assert.ok(longRoom.startsWith('r'.repeat(120)));
- });
-
- test('strict report checks fail when the strict window has too few samples to measure gaps', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_MIN_RECEIVED_FPS_RATIO: '0',
- LIVEKIT_MAX_FRAME_GAP_MS: '250',
- LIVEKIT_MAX_AUDIO_FRAME_GAP_MS: '250',
- LIVEKIT_MAX_AV_DRIFT_MS: '0',
- },
- () => {
- const config = parseConfig();
- const report = strictReportFor(config, {
- videoFrameTimes: [1_250],
- audioFrameTimes: [1_300],
- });
- assert.equal(report.metrics.strictVideoFrames, 1);
- assert.equal(report.metrics.strictAudioFrames, 1);
- assert.match(strictFailures(report, config).join('\n'), /video frame gap unavailable/);
- assert.match(strictFailures(report, config).join('\n'), /audio frame gap unavailable/);
- },
- );
- });
-
- test('strict report checks use only samples inside the measured window', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_MIN_RECEIVED_FPS_RATIO: '0',
- LIVEKIT_MAX_FRAME_GAP_MS: '250',
- LIVEKIT_MAX_AUDIO_FRAME_GAP_MS: '250',
- LIVEKIT_MAX_AV_DRIFT_MS: '0',
- },
- () => {
- const config = parseConfig();
- const report = strictReportFor(config, {
- videoFrameTimes: [500, 1_050, 1_200, 2_500],
- audioFrameTimes: [600, 1_100, 1_240, 2_600],
- });
- assert.equal(report.metrics.strictVideoFrames, 2);
- assert.equal(report.metrics.strictAudioFrames, 2);
- assert.equal(report.metrics.maxVideoFrameGapMs, 150);
- assert.equal(report.metrics.maxAudioFrameGapMs, 140);
- assert.deepEqual(strictFailures(report, config), []);
- },
- );
- });
-
- test('strict screen report ignores camera video callbacks for resolution and drift', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_ENABLE_CAMERA: '1',
- LIVEKIT_MIN_RECEIVED_FPS_RATIO: '0',
- LIVEKIT_MAX_FRAME_GAP_MS: '250',
- LIVEKIT_MAX_AUDIO_FRAME_GAP_MS: '250',
- LIVEKIT_MAX_AV_DRIFT_MS: '80',
- },
- () => {
- const config = parseConfig();
- const report = strictReportFor(config, {
- videoFrameRecords: [
- {
- atMs: 1_010,
- identity: config.publisherIdentity,
- kind: 'video',
- source: 'screen_share',
- trackName: 'screen',
- trackSid: 'TR_screen',
- width: 320,
- height: 180,
- },
- {
- atMs: 1_025,
- identity: config.publisherIdentity,
- kind: 'video',
- source: 'camera',
- trackName: 'camera',
- trackSid: 'TR_camera',
- width: 480,
- height: 360,
- },
- {
- atMs: 1_080,
- identity: config.publisherIdentity,
- kind: 'video',
- source: 'screen_share',
- trackName: 'screen',
- trackSid: 'TR_screen',
- width: 320,
- height: 180,
- },
- {
- atMs: 1_220,
- identity: config.publisherIdentity,
- kind: 'video',
- source: 'camera',
- trackName: 'camera',
- trackSid: 'TR_camera',
- width: 480,
- height: 360,
- },
- ],
- audioFrameTimes: [1_040, 1_100],
- });
-
- assert.equal(report.metrics.videoCallbacks, 4);
- assert.equal(report.metrics.strictVideoFrames, 2);
- assert.deepEqual(report.metrics.videoResolutionCounts, {'320x180': 2});
- assert.equal(report.metrics.videoResolutionMismatchCount, 0);
- assert.equal(report.metrics.avDriftMs, 20);
- assert.deepEqual(strictFailures(report, config), []);
- },
- );
- });
-
- test('strict packet loss gate uses loss deltas inside the strict window', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_MIN_RECEIVED_FPS_RATIO: '0',
- LIVEKIT_MAX_FRAME_GAP_MS: '0',
- LIVEKIT_MAX_AUDIO_FRAME_GAP_MS: '0',
- LIVEKIT_MAX_AV_DRIFT_MS: '0',
- LIVEKIT_MAX_PACKET_LOSS: '0',
- },
- () => {
- const config = parseConfig();
- const report = strictReportFor(config, {
- videoFrameTimes: [1_100, 1_200],
- subscriberStatsSamples: [
- {atMs: 900, payload: {outbound: [], inbound: [{kind: 'video', packetsLost: 4}]}},
- {atMs: 1_500, payload: {outbound: [], inbound: [{kind: 'video', packetsLost: 4}]}},
- ],
- });
- assert.equal(report.metrics.maxObservedPacketLoss, 4);
- assert.equal(report.metrics.maxObservedPacketLossDelta, 0);
- assert.deepEqual(strictFailures(report, config), []);
-
- const failingReport = strictReportFor(config, {
- videoFrameTimes: [1_100, 1_200],
- subscriberStatsSamples: [
- {atMs: 900, payload: {outbound: [], inbound: [{kind: 'video', packetsLost: 4}]}},
- {atMs: 1_500, payload: {outbound: [], inbound: [{kind: 'video', packetsLost: 5}]}},
- ],
- });
- assert.equal(failingReport.metrics.maxObservedPacketLossDelta, 1);
- assert.match(strictFailures(failingReport, config).join('\n'), /packet loss delta 1/);
- },
- );
- });
-
- test('server publishing checks cover primary and secondary screen, audio, and camera tracks', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_VALIDATE_SERVER_PUBLISHING: '1',
- LIVEKIT_ENABLE_SECOND_PUBLISHER: '1',
- LIVEKIT_ENABLE_SCREEN_AUDIO: '1',
- LIVEKIT_ENABLE_CAMERA: '1',
- },
- () => {
- const config = parseConfig();
- const serverState = {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [
- {type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false, sid: 'TR_V1'},
- {type: 'AUDIO', source: 'MICROPHONE', mimeType: 'audio/red', muted: false, sid: 'TR_A1'},
- {type: 'AUDIO', source: 'SCREEN_SHARE_AUDIO', mimeType: 'audio/red', muted: false, sid: 'TR_A2'},
- {type: 'VIDEO', source: 'CAMERA', muted: false, sid: 'TR_V2'},
- ],
- },
- {
- identity: config.secondaryPublisherIdentity,
- tracks: [
- {type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false, sid: 'TR_V3'},
- {type: 'AUDIO', source: 'MICROPHONE', mimeType: 'audio/red', muted: false, sid: 'TR_A3'},
- {type: 'AUDIO', source: 'SCREEN_SHARE_AUDIO', mimeType: 'audio/red', muted: false, sid: 'TR_A4'},
- ],
- },
- ],
- error: null,
- };
- const checks = serverChecksFor(config, serverState);
- assert.equal(checks.length, 8);
- assert.deepEqual(
- checks.map((check) => [check.name, check.pass]),
- [
- ['server publishing API participants listed', true],
- ['server sees publisher screenshare publication', true],
- ['server sees publisher microphone publication', true],
- ['server sees publisher screen-share audio publication', true],
- ['server sees publisher camera publication', true],
- ['server sees secondary publisher screenshare publication', true],
- ['server sees secondary publisher microphone publication', true],
- ['server sees secondary publisher screen-share audio publication', true],
- ],
- );
- },
- );
- });
-
- test('server publishing checks fail closed on missing server tracks', async () => {
- await withHarnessEnv({LIVEKIT_VALIDATE_SERVER_PUBLISHING: '1', LIVEKIT_ENABLE_SCREEN_AUDIO: '1'}, () => {
- const config = parseConfig();
- const checks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(checks, 'server sees publisher screenshare publication').pass, true);
- assert.equal(findCheck(checks, 'server sees publisher screen-share audio publication').pass, false);
- });
- });
-
- test('server publishing checks reject wrong participant identity', async () => {
- await withHarnessEnv({LIVEKIT_VALIDATE_SERVER_PUBLISHING: '1'}, () => {
- const config = parseConfig();
- const checks = serverChecksFor(config, {
- participants: [
- {
- identity: config.subscriberIdentity,
- tracks: [{type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(checks, 'server publishing API participants listed').pass, true);
- assert.equal(findCheck(checks, 'server sees publisher screenshare publication').pass, false);
- });
- });
-
- test('server publishing checks reject wrong kind, source, and screen mime', async () => {
- await withHarnessEnv({LIVEKIT_VALIDATE_SERVER_PUBLISHING: '1', LIVEKIT_EXPECT_SCREEN_CODEC: 'h264'}, () => {
- const config = parseConfig();
- const wrongKindChecks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 'AUDIO', source: 'SCREEN_SHARE', mimeType: 'video/H264', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(wrongKindChecks, 'server sees publisher screenshare publication').pass, false);
-
- const wrongSourceChecks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 'VIDEO', source: 'CAMERA', mimeType: 'video/H264', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(wrongSourceChecks, 'server sees publisher screenshare publication').pass, false);
-
- const wrongMimeChecks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(wrongMimeChecks, 'server sees publisher screenshare publication').pass, false);
-
- const matchingChecks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 'VIDEO', source: 'SCREEN_SHARE', mime_type: 'video/h264', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(matchingChecks, 'server sees publisher screenshare publication').pass, true);
- });
- });
-
- test('server publishing checks reject muted or missing mute state on expected tracks', async () => {
- await withHarnessEnv({LIVEKIT_VALIDATE_SERVER_PUBLISHING: '1'}, () => {
- const config = parseConfig();
- const mutedChecks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: true}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(mutedChecks, 'server sees publisher screenshare publication').pass, false);
-
- const missingMutedChecks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8'}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(missingMutedChecks, 'server sees publisher screenshare publication').pass, false);
- });
- });
-
- test('server publishing checks handle protobuf numeric enums without accepting data tracks as video', async () => {
- await withHarnessEnv({LIVEKIT_VALIDATE_SERVER_PUBLISHING: '1'}, () => {
- const config = parseConfig();
- const dataTrackChecks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 2, source: 3, mimeType: 'video/VP8', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(dataTrackChecks, 'server sees publisher screenshare publication').pass, false);
-
- const videoTrackChecks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 1, source: 3, mimeType: 'video/VP8', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(videoTrackChecks, 'server sees publisher screenshare publication').pass, true);
- });
- });
-
- test('server publishing checks fail closed on missing secondary, audio, camera, and screen-audio tracks', async () => {
- await withHarnessEnv(
- {
- LIVEKIT_VALIDATE_SERVER_PUBLISHING: '1',
- LIVEKIT_ENABLE_SECOND_PUBLISHER: '1',
- LIVEKIT_ENABLE_SCREEN_AUDIO: '1',
- LIVEKIT_ENABLE_CAMERA: '1',
- },
- () => {
- const config = parseConfig();
- const checks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [{type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false}],
- },
- {
- identity: config.secondaryPublisherIdentity,
- tracks: [{type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false}],
- },
- ],
- error: null,
- });
- assert.equal(findCheck(checks, 'server sees publisher screenshare publication').pass, true);
- assert.equal(findCheck(checks, 'server sees publisher microphone publication').pass, false);
- assert.equal(findCheck(checks, 'server sees publisher screen-share audio publication').pass, false);
- assert.equal(findCheck(checks, 'server sees publisher camera publication').pass, false);
- assert.equal(findCheck(checks, 'server sees secondary publisher screenshare publication').pass, true);
- assert.equal(findCheck(checks, 'server sees secondary publisher microphone publication').pass, false);
- assert.equal(findCheck(checks, 'server sees secondary publisher screen-share audio publication').pass, false);
- },
- );
- });
-
- test('strict server publishing validation does not pass open on Twirp errors', async () => {
- await withHarnessEnv({LIVEKIT_HARNESS_STRICT: '1'}, () => {
- const config = parseConfig();
- const checks = serverChecksFor(config, {
- participants: [
- {
- identity: config.publisherIdentity,
- tracks: [
- {type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false},
- {type: 'AUDIO', source: 'MICROPHONE', mimeType: 'audio/red', muted: false},
- {type: 'AUDIO', source: 'SCREEN_SHARE_AUDIO', mimeType: 'audio/red', muted: false},
- ],
- },
- {
- identity: config.secondaryPublisherIdentity,
- tracks: [
- {type: 'VIDEO', source: 'SCREEN_SHARE', mimeType: 'video/VP8', muted: false},
- {type: 'AUDIO', source: 'MICROPHONE', mimeType: 'audio/red', muted: false},
- {type: 'AUDIO', source: 'SCREEN_SHARE_AUDIO', mimeType: 'audio/red', muted: false},
- ],
- },
- ],
- error: 'RoomService.ListParticipants failed with HTTP 401',
- });
- assert.equal(config.validateServerPublishing, true);
- assert.equal(findCheck(checks, 'server publishing API participants listed').pass, false);
- assert.equal(
- checks.every((check) => check.pass),
- false,
- );
- });
- });
-});
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/CMakeLists.txt b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/CMakeLists.txt
deleted file mode 100644
index ed47a648e..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/CMakeLists.txt
+++ /dev/null
@@ -1,92 +0,0 @@
-# Project-level configuration.
-cmake_minimum_required(VERSION 3.10)
-project(runner LANGUAGES CXX C)
-enable_language(ASM)
-
-set(BINARY_NAME "h264_benchmark")
-
-# Set the C++ standard to C++23.
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_BUILD_TYPE Debug)
-
-
-add_definitions(-DWEBRTC_POSIX)
-add_definitions(-DWEBRTC_LINUX)
-add_definitions(-DUSE_UDEV)
-add_definitions(-DUSE_AURA=1)
-add_definitions(-DUSE_GLIB=1)
-add_definitions(-DUSE_OZONE=1)
-add_definitions(-D__STDC_CONSTANT_MACROS)
-add_definitions(-D__STDC_FORMAT_MACROS)
-add_definitions(-D_FILE_OFFSET_BITS=64)
-add_definitions(-D_LARGEFILE_SOURCE)
-add_definitions(-D_LARGEFILE64_SOURCE)
-add_definitions(-D_GNU_SOURCE)
-add_definitions(-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE)
-add_definitions(-D_GLIBCXX_ASSERTIONS=1)
-add_definitions(-DCR_CLANG_REVISION=\"llvmorg-19-init-8091-gab037c4f-1\")
-add_definitions(-DCR_SYSROOT_KEY=20230611T210420Z-2)
-add_definitions(-DDYNAMIC_ANNOTATIONS_ENABLED=1)
-add_definitions(-DWEBRTC_ENABLE_PROTOBUF=0)
-add_definitions(-DWEBRTC_STRICT_FIELD_TRIALS=0)
-add_definitions(-DWEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE)
-add_definitions(-DRTC_USE_LIBAOM_AV1_ENCODER)
-add_definitions(-DRTC_ENABLE_VP9)
-add_definitions(-DRTC_DAV1D_IN_INTERNAL_DECODER_FACTORY)
-add_definitions(-DWEBRTC_HAVE_SCTP)
-add_definitions(-DWEBRTC_USE_H264)
-add_definitions(-DWEBRTC_ENABLE_LIBEVENT)
-add_definitions(-DWEBRTC_LIBRARY_IMPL)
-add_definitions(-DWEBRTC_ENABLE_AVX2)
-
-include_directories(
- "${CMAKE_CURRENT_SOURCE_DIR}/../libwebrtc/linux-x64-debug/include"
- "${CMAKE_CURRENT_SOURCE_DIR}/../libwebrtc/linux-x64-release/include/third_party/abseil-cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/../libwebrtc/linux-x64-release/include/third_party/libyuv/include"
- "${CMAKE_CURRENT_SOURCE_DIR}/../src/nvidia/NvCodec/include"
- "${CMAKE_CURRENT_SOURCE_DIR}/../src/nvidia/NvCodec/NvCodec"
- "${CMAKE_CURRENT_SOURCE_DIR}/../src"
-)
-
-link_libraries(
- "${CMAKE_CURRENT_SOURCE_DIR}/../libwebrtc/linux-x64-release/lib/libwebrtc.a"
-)
-
-find_package (Threads)
-
-add_executable(${BINARY_NAME}
- "test_main.cc"
- "benchmark.cc"
- "benchmark_openh264.cc"
- "video_source.cc"
- "fileutils.cc"
- "cpu/cpu_linux.cc"
-
- "benchmark_nvidia.cc"
- "../src/nvidia/NvCodec/NvCodec/NvDecoder/NvDecoder.cpp"
- "../src/nvidia/NvCodec/NvCodec/NvEncoder/NvEncoder.cpp"
- "../src/nvidia/NvCodec/NvCodec/NvEncoder/NvEncoderCuda.cpp"
- "../src/nvidia/h264_encoder_impl.cpp"
- "../src/nvidia/h264_decoder_impl.cpp"
- "../src/nvidia/nvidia_decoder_factory.cpp"
- "../src/nvidia/nvidia_encoder_factory.cpp"
- "../src/nvidia/cuda_context.cpp"
- "../src/nvidia/implib/libcuda.so.init.c"
- "../src/nvidia/implib/libcuda.so.tramp.S"
- "../src/nvidia/implib/libnvcuvid.so.init.c"
- "../src/nvidia/implib/libnvcuvid.so.tramp.S"
-
- "benchmark_vaapi.cc"
- "../src/vaapi/vaapi_display_drm.cpp"
- "../src/vaapi/vaapi_h264_encoder_wrapper.cpp"
- "../src/vaapi/vaapi_encoder_factory.cpp"
- "../src/vaapi/h264_encoder_impl.cpp"
- "../src/vaapi/implib/libva-drm.so.init.c"
- "../src/vaapi/implib/libva-drm.so.tramp.S"
- "../src/vaapi/implib/libva.so.init.c"
- "../src/vaapi/implib/libva.so.tramp.S"
-)
-
-target_link_libraries(${BINARY_NAME} ${CMAKE_THREAD_LIBS_INIT})
-target_link_libraries(${BINARY_NAME} dl)
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark.cc b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark.cc
deleted file mode 100644
index b66e2ec96..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark.cc
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "benchmark.h"
-
-#include
-#include
-#include
-#include
-#if defined(_WIN32)
-#include
-#endif
-
-#include "api/video/i420_buffer.h"
-#include "common_video/libyuv/include/webrtc_libyuv.h"
-#include "fileutils.h"
-#include "modules/video_coding/utility/simulcast_rate_allocator.h"
-#include "rtc_base/event.h"
-#include "video_source.h"
-
-#define SSIM_CALC 0 // by default, don't compute SSIM
-
-using namespace webrtc;
-
-#define EXPECT_EQ (a, b)
-
-FrameQueueTuple::~FrameQueueTuple() {
- if (_codecSpecificInfo != NULL) {
- delete _codecSpecificInfo;
- }
- if (_frame != NULL) {
- delete _frame;
- }
-}
-
-void FrameQueue::PushFrame(VideoFrame* frame,
- webrtc::CodecSpecificInfo* codecSpecificInfo) {
- webrtc::MutexLock cs(&_queueRWLock);
- _frameBufferQueue.push(new FrameQueueTuple(frame, codecSpecificInfo));
-}
-
-FrameQueueTuple* FrameQueue::PopFrame() {
- webrtc::MutexLock cs(&_queueRWLock);
- if (_frameBufferQueue.empty()) {
- return NULL;
- }
- FrameQueueTuple* tuple = _frameBufferQueue.front();
- _frameBufferQueue.pop();
- return tuple;
-}
-
-bool FrameQueue::Empty() {
- webrtc::MutexLock cs(&_queueRWLock);
- return _frameBufferQueue.empty();
-}
-
-uint32_t VideoEncodeCompleteCallback::EncodedBytes() {
- return _encodedBytes;
-}
-
-webrtc::EncodedImageCallback::Result
-VideoEncodeCompleteCallback::OnEncodedImage(
- const webrtc::EncodedImage& encodedImage,
- const webrtc::CodecSpecificInfo* codecSpecificInfo) {
- _test.UpdateEncodedBytes(encodedImage.GetEncodedData()->size());
- _encodedBytes += encodedImage.GetEncodedData()->size();
-
- if (_encodedFile != NULL) {
- if (fwrite(encodedImage.GetEncodedData()->data(), 1,
- encodedImage.GetEncodedData()->size(),
- _encodedFile) != encodedImage.GetEncodedData()->size()) {
- fprintf(stderr, "Error writing to encoded file %s\n",
- _test._outname.c_str());
- }
- }
-
- return webrtc::EncodedImageCallback::Result(
- webrtc::EncodedImageCallback::Result::OK);
-}
-
-Benchmark::Benchmark()
- : _resultsFileName(webrtc::test::OutputPath() + "benchmark.txt"),
- _codecName("Default"),
- _env(webrtc::CreateEnvironment()) {}
-
-Benchmark::Benchmark(std::string name, std::string description)
- : _name(name),
- _description(description),
- _resultsFileName(webrtc::test::OutputPath() + "benchmark.txt"),
- _codecName("Default"),
- _env(webrtc::CreateEnvironment()) {}
-
-Benchmark::Benchmark(std::string name,
- std::string description,
- std::string resultsFileName,
- std::string codecName)
- : _name(name),
- _description(description),
- _resultsFileName(resultsFileName),
- _codecName(codecName),
- _cpu(webrtc::CpuWrapper::CreateCpu()),
- _env(webrtc::CreateEnvironment()) {}
-
-void Benchmark::Perform() {
- std::vector sources;
- std::vector::iterator it;
-
- // Configuration --------------------------
- sources.push_back(new const VideoSource(
- webrtc::test::ProjectRootPath() + "resources/FourPeople_1280x720_30.yuv",
- kWHD));
- //sources.push_back(
- // new const VideoSource(webrtc::test::ProjectRootPath() +
- // "resources/Big_Buck_Bunny_1920x1080_30.yuv",
- // kWFullHD));
-
- const VideoSize size[] = {kWHD};
- const int frameRate[] = {30};
- // Specifies the framerates for which to perform a speed test.
- const bool speedTestMask[] = {true};
- const int bitRate[] = {500, 1000, 2000, 3000, 4000};
- // Determines the number of iterations to perform to arrive at the speed
- // result.
- enum { kSpeedTestIterations = 8 };
- // ----------------------------------------
-
- const int nFrameRates = sizeof(frameRate) / sizeof(*frameRate);
- assert(sizeof(speedTestMask) / sizeof(*speedTestMask) == nFrameRates);
- const int nBitrates = sizeof(bitRate) / sizeof(*bitRate);
- int testIterations = 1;
-
- double fps[nBitrates];
- uint32_t cpuUsage[nBitrates];
- double totalEncodeTime[nBitrates];
- double totalDecodeTime[nBitrates];
-
- _results.open(_resultsFileName.c_str(), std::fstream::out);
- _results << GetMagicStr() << std::endl;
- _results << _codecName << std::endl;
-
- for (it = sources.begin(); it < sources.end(); it++) {
- int i = 0;
- for (int j = 0; j < nFrameRates; j++) {
- _target = *it;
- _inname = (*it)->GetFileName();
- std::cout << (*it)->GetName() << ", "
- << VideoSource::GetSizeString(size[i]) << ", " << frameRate[j]
- << " fps" << ", " << _name << std::endl;
- _results << (*it)->GetName() << "," << VideoSource::GetSizeString(size[i])
- << "," << frameRate[j] << " fps" << ", " << _name << std::endl
- << "Bitrate [kbps]";
-
- if (speedTestMask[j]) {
- testIterations = kSpeedTestIterations;
- } else {
- testIterations = 1;
- }
-
- for (int k = 0; k < nBitrates; k++) {
- _bitRate = (bitRate[k]);
- double avgFps = 0.0;
- uint32_t currCpuUsage = 0;
- totalEncodeTime[k] = 0;
-
- std::cout << "TargetBitrate [kbps]:" << " " << _bitRate << std::endl;
-
- for (int l = 0; l < testIterations; l++) {
- PerformNormalTest();
- uint32_t cpuUsage = _cpu->CpuUsage();
- if (cpuUsage > 0) {
- currCpuUsage += cpuUsage;
- int coreCount = _cpu->GetNumCores();
- std::string str = "CPU Usage[%]: cores ";
- str += std::to_string(coreCount);
- str += ", usage " + std::to_string(cpuUsage) + "%" +
- ", Test Iteration: " + std::to_string(l + 1) + "/" +
- std::to_string(testIterations);
- std::cout << str << std::flush;
- for (int i = 0; i < str.length(); ++i) {
- std::cout << "\b";
- }
- }
- _appendNext = false;
- avgFps += _framecnt / (_totalEncodeTime);
- totalEncodeTime[k] += _totalEncodeTime;
- }
- avgFps /= testIterations;
- totalEncodeTime[k] /= testIterations;
- currCpuUsage /= testIterations;
-
- double actualBitRate = ActualBitRate(_framecnt) / 1000.0;
- std::cout << "ActualBitRate [kbps]:" << " " << actualBitRate
- << std::endl;
- _results << "," << actualBitRate;
- fps[k] = avgFps;
- cpuUsage[k] = currCpuUsage;
- }
-
- std::cout << std::endl << "CpuUsage [%]:";
- _results << std::endl << "CpuUsage [%]";
- for (int k = 0; k < nBitrates; k++) {
- std::cout << " " << cpuUsage[k] << "%";
- _results << "," << cpuUsage[k] << "%";
- }
- std::cout << std::endl << "Encode Time[ms]:";
- _results << std::endl << "Encode Time[ms]";
- for (int k = 0; k < nBitrates; k++) {
- std::cout << " " << totalEncodeTime[k];
- _results << "," << totalEncodeTime[k];
- }
-
- if (speedTestMask[j]) {
- std::cout << std::endl << "Speed [fps]:";
- _results << std::endl << "Speed [fps]";
- for (int k = 0; k < nBitrates; k++) {
- std::cout << " " << static_cast(fps[k] + 0.5);
- _results << "," << static_cast(fps[k] + 0.5);
- }
- }
- std::cout << std::endl << std::endl;
- _results << std::endl << std::endl;
- }
- i++;
- delete *it;
- }
- _results.close();
-}
-
-void Benchmark::PerformNormalTest() {
- _encoder = GetNewEncoder(_env);
- _lengthSourceFrame = _target->GetFrameLength();
- CodecSettings(_target->GetWidth(), _target->GetHeight(),
- _target->GetFrameRate(), _bitRate);
- Setup();
- std::unique_ptr waitEvent = std::make_unique();
- //_inputVideoBuffer.VerifyAndAllocate(_lengthSourceFrame);
- _encoder->InitEncode(&_inst, 4, 1440);
- CodecSpecific_InitBitrate();
- //_decoder->InitDecode(&_inst,1);
-
- FrameQueue frameQueue;
- VideoEncodeCompleteCallback encCallback(_encodedFile, &frameQueue, *this);
-
- _encoder->RegisterEncodeCompleteCallback(&encCallback);
-
- _totalEncodeTime = _totalDecodeTime = 0;
- _totalEncodePipeTime = _totalDecodePipeTime = 0;
- bool complete = false;
- _framecnt = 0;
- _encFrameCnt = 0;
- _sumEncBytes = 0;
- _lengthEncFrame = 0;
- while (!complete) {
- complete = Encode();
- _framecnt++;
- _encFrameCnt++;
- /*
- if (!frameQueue.Empty() || complete) {
- while (!frameQueue.Empty()) {
- _frameToDecode = static_cast(frameQueue.PopFrame());
- int ret = Decode();
- delete _frameToDecode;
- _frameToDecode = NULL;
- if (ret < 0) {
- fprintf(stderr, "\n\nError in decoder: %d\n\n", ret);
- exit(EXIT_FAILURE);
- } else if (ret == 0) {
- _framecnt++;
- } else {
- fprintf(stderr, "\n\nPositive return value from decode!\n\n");
- }
- }
- }*/
- // waitEvent->Wait(webrtc::TimeDelta::Seconds(5));
- }
-
- //_inputVideoBuffer.Free();
- //_encodedVideoBuffer.Free();
- //_decodedVideoBuffer.Free();
-
- Teardown();
-}
-
-void Benchmark::Teardown() {
- // Use _sourceFile as a check to prevent multiple Teardown() calls.
- if (_sourceFile == NULL) {
- return;
- }
-
- _encoder->Release();
-
- fclose(_sourceFile);
- _sourceFile = NULL;
-
- delete[] _sourceBuffer;
- _sourceBuffer = NULL;
-}
-
-void Benchmark::CodecSpecific_InitBitrate() {
- webrtc::SimulcastRateAllocator init_allocator(_env,_inst);
-
- if (_bitRate == 0) {
- VideoBitrateAllocation allocation =
- init_allocator.Allocate(VideoBitrateAllocationParameters(
- DataRate::KilobitsPerSec(600), _inst.maxFramerate));
- _encoder->SetRates(webrtc::VideoEncoder::RateControlParameters(
- allocation, _inst.maxFramerate));
- } else {
- VideoBitrateAllocation allocation =
- init_allocator.Allocate(VideoBitrateAllocationParameters(
- DataRate::BitsPerSec(_bitRate), _inst.maxFramerate));
- _encoder->SetRates(webrtc::VideoEncoder::RateControlParameters(
- allocation, _inst.maxFramerate));
- }
-}
-
-bool Benchmark::Encode() {
- _lengthEncFrame = 0;
- if (_sourceBuffer == NULL) {
- _sourceBuffer = new unsigned char[_lengthSourceFrame];
- }
- auto size = fread(_sourceBuffer, 1, _lengthSourceFrame, _sourceFile);
- if (size <= 0) {
- return true;
- }
- // TODO: build video frame from buffer ptr.
- webrtc::scoped_refptr buffer(
- webrtc::I420Buffer::Create(_inst.width, _inst.height));
-
- buffer->InitializeData();
-
- memcpy(buffer->MutableDataY(), _sourceBuffer, _lengthSourceFrame);
-
- webrtc::VideoFrame inputVideoBuffer =
- webrtc::VideoFrame::Builder()
- .set_video_frame_buffer(buffer)
- .set_rtp_timestamp(
- (unsigned int)(_encFrameCnt * 9e4 / _inst.maxFramerate))
- .build();
-
- if (feof(_sourceFile) != 0) {
- return true;
- }
- _encodeCompleteTime = 0;
- _encodeTimes[inputVideoBuffer.rtp_timestamp()] = tGetTime();
- std::vector frame_types(1, VideoFrameType::kVideoFrameDelta);
-
- // check SLI queue
- _hasReceivedSLI = false;
- while (!_signalSLI.empty() && _signalSLI.front().delay == 0) {
- // SLI message has arrived at sender side
- _hasReceivedSLI = true;
- _pictureIdSLI = _signalSLI.front().id;
- _signalSLI.pop_front();
- }
- // decrement SLI queue times
- for (std::list::iterator it = _signalSLI.begin();
- it != _signalSLI.end(); it++) {
- (*it).delay--;
- }
-
- // check PLI queue
- _hasReceivedPLI = false;
- while (!_signalPLI.empty() && _signalPLI.front().delay == 0) {
- // PLI message has arrived at sender side
- _hasReceivedPLI = true;
- _signalPLI.pop_front();
- }
- // decrement PLI queue times
- for (std::list::iterator it = _signalPLI.begin();
- it != _signalPLI.end(); it++) {
- (*it).delay--;
- }
-
- if (_hasReceivedPLI) {
- // respond to PLI by encoding a key frame
- frame_types[0] = VideoFrameType::kVideoFrameKey;
- _hasReceivedPLI = false;
- _hasReceivedSLI = false; // don't trigger both at once
- }
-
- int ret = _encoder->Encode(inputVideoBuffer, &frame_types);
-
- if (_encodeCompleteTime > 0) {
- _totalEncodeTime +=
- _encodeCompleteTime - _encodeTimes[inputVideoBuffer.rtp_timestamp()];
- } else {
- _totalEncodeTime += tGetTime() - _encodeTimes[inputVideoBuffer.rtp_timestamp()];
- }
- assert(ret >= 0);
- return false;
-}
-
-webrtc::CodecSpecificInfo* Benchmark::CopyCodecSpecificInfo(
- const webrtc::CodecSpecificInfo* codecSpecificInfo) const {
- webrtc::CodecSpecificInfo* info = new webrtc::CodecSpecificInfo;
- *info = *codecSpecificInfo;
- return info;
-}
-
-void Benchmark::Setup() {
- // Use _sourceFile as a check to prevent multiple Setup() calls.
- if (_sourceFile != NULL) {
- return;
- }
-
- std::stringstream ss;
- std::string strTestNo;
- ss << "0";
- ss >> strTestNo;
-
- // Check if settings exist. Otherwise use defaults.
- if (_outname == "") {
- _outname =
- webrtc::test::OutputPath() + "out_normaltest" + strTestNo + ".yuv";
- }
-
- if (_codecName == "") {
- _codecName =
- webrtc::test::OutputPath() + "encoded_normaltest" + strTestNo + ".yuv";
- }
-
- if ((_sourceFile = fopen(_inname.c_str(), "rb")) == NULL) {
- printf("Cannot read file %s.\n", _inname.c_str());
- exit(1);
- }
-
- if ((_encodedFile = fopen(_codecName.c_str(), "wb")) == NULL) {
- printf("Cannot write encoded file.\n");
- exit(1);
- }
-
- char mode[3] = "wb";
- if (_appendNext) {
- strncpy(mode, "ab", 3);
- }
-
- // if ((_decodedFile = fopen(_outname.c_str(), mode)) == NULL) {
- // printf("Cannot write file %s.\n", _outname.c_str());
- // exit(1);
- // }
-
- _appendNext = true;
-}
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark.h b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark.h
deleted file mode 100644
index 2ae2900b9..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark.h
+++ /dev/null
@@ -1,214 +0,0 @@
-; /*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAWEWORK_BENCHMARK_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAWEWORK_BENCHMARK_H_
-
-#include
-#include
-#include
-#include
-#include
-
-#include "cpu/cpu_linux.h"
-#include "api/environment/environment_factory.h"
-#include "modules/include/module_common_types.h"
-#include "modules/video_coding/include/video_codec_interface.h"
-#include "rtc_base/synchronization/mutex.h"
-#include "system_wrappers/include/clock.h"
-
-
-class VideoSource;
-class Benchmark;
-
-// feedback signal to encoder
-struct fbSignal {
- fbSignal(int d, uint8_t pid) : delay(d), id(pid) {};
- int delay;
- uint8_t id;
-};
-
-class FrameQueueTuple {
- public:
- FrameQueueTuple(webrtc::VideoFrame* frame,
- const webrtc::CodecSpecificInfo* codecSpecificInfo = NULL)
- : _frame(frame), _codecSpecificInfo(codecSpecificInfo) {};
- ~FrameQueueTuple();
- webrtc::VideoFrame* _frame;
- const webrtc::CodecSpecificInfo* _codecSpecificInfo;
-};
-
-class FrameQueue {
- public:
- FrameQueue() {}
-
- ~FrameQueue() {}
-
- void PushFrame(webrtc::VideoFrame* frame,
- webrtc::CodecSpecificInfo* codecSpecificInfo = NULL);
- FrameQueueTuple* PopFrame();
- bool Empty();
-
- private:
- webrtc::Mutex _queueRWLock;
- std::queue _frameBufferQueue;
-};
-
-class VideoEncodeCompleteCallback : public webrtc::EncodedImageCallback {
- public:
- VideoEncodeCompleteCallback(FILE* encodedFile,
- FrameQueue* frameQueue,
- Benchmark& test)
- : _encodedFile(encodedFile),
- _frameQueue(frameQueue),
- _test(test),
- _encodedBytes(0) {}
-
- webrtc::EncodedImageCallback::Result OnEncodedImage(
- const webrtc::EncodedImage& encoded_image,
- const webrtc::CodecSpecificInfo* codec_specific_info) override;
-
- uint32_t EncodedBytes();
-
- private:
- FILE* _encodedFile;
- FrameQueue* _frameQueue;
- Benchmark& _test;
- uint32_t _encodedBytes;
-};
-
-class Benchmark {
- public:
- friend class VideoEncodeCompleteCallback;
-
- public:
- Benchmark();
- virtual void Perform();
- virtual bool IsSupported() = 0;
-
- protected:
- Benchmark(std::string name, std::string description);
- Benchmark(std::string name,
- std::string description,
- std::string resultsFileName,
- std::string codecName);
- virtual webrtc::VideoEncoder* GetNewEncoder(webrtc::Environment &env) = 0;
- virtual void PerformNormalTest();
- virtual void CodecSpecific_InitBitrate();
- static const char* GetMagicStr() { return "#!benchmark1.0"; }
-
- double ActualBitRate(int nFrames) {
- return 8.0 * _sumEncBytes / (nFrames / _inst.maxFramerate);
- }
-
- webrtc::CodecSpecificInfo* CopyCodecSpecificInfo(
- const webrtc::CodecSpecificInfo* codecSpecificInfo) const;
-
- bool Encode();
-
- void Setup();
-
- void Teardown();
-
- void CodecSettings(int width,
- int height,
- uint32_t frameRate /*=30*/,
- uint32_t bitRate /*=0*/) {
- if (bitRate > 0) {
- _bitRate = bitRate;
- } else if (_bitRate == 0) {
- _bitRate = 600;
- }
- _inst.codecType = webrtc::kVideoCodecH264;
- _inst.maxFramerate = (unsigned char)frameRate;
- _inst.minBitrate = (unsigned char)frameRate;
- _inst.startBitrate = (int)_bitRate;
- _inst.maxBitrate = 8000;
- _inst.width = width;
- _inst.height = height;
- _inst.numberOfSimulcastStreams = 1;
- _inst.simulcastStream[0].width = width;
- _inst.simulcastStream[0].height = height;
- _inst.simulcastStream[0].maxBitrate = 8000;
- _inst.simulcastStream[0].minBitrate = _bitRate;
- _inst.simulcastStream[0].targetBitrate = _bitRate;
- _inst.simulcastStream[0].maxFramerate = frameRate;
- _inst.simulcastStream[0].active = true;
- _inst.SetScalabilityMode(webrtc::ScalabilityMode::kL1T1);
- _inst.mode = webrtc::VideoCodecMode::kRealtimeVideo;
- _inst.qpMax = 56;
- _inst.SetFrameDropEnabled(true);
- }
-
- double tGetTime() {
- // return time in sec
- return ((double)(webrtc::Clock::GetRealTimeClock()->TimeInMilliseconds()) /
- 1000);
- }
-
- virtual webrtc::CodecSpecificInfo* CreateEncoderSpecificInfo() const {
- return NULL;
- };
-
- void UpdateEncodedBytes(int encodedBytes) { _sumEncBytes += encodedBytes; }
-
- const VideoSource* _target;
- std::string _resultsFileName;
- std::ofstream _results;
- std::string _name;
- std::string _description;
- std::string _codecName;
- std::string _inname;
- std::string _outname;
- webrtc::VideoEncoder* _encoder;
- //webrtc::VideoDecoder* _decoder;
- uint32_t _bitRate;
- bool _appendNext = false;
- int _framecnt;
- int _encFrameCnt;
- double _totalEncodeTime;
- double _totalDecodeTime;
- double _decodeCompleteTime;
- double _encodeCompleteTime;
- double _totalEncodePipeTime;
- double _totalDecodePipeTime;
- webrtc::VideoCodec _inst;
- int _sumEncBytes;
-
- unsigned int _lengthSourceFrame = 0;
- unsigned char* _sourceBuffer = nullptr;
-
- FILE* _encodedFile = nullptr;
- unsigned int _lengthEncFrame = 0;
- FrameQueueTuple* _frameToDecode = nullptr;
-
- FILE* _sourceFile = nullptr;
- FILE* _decodedFile = nullptr;
-
- bool _hasReceivedPLI = false;
- bool _waitForKey = false;
- std::map _encodeTimes;
- std::map _decodeTimes;
-
- bool _missingFrames = false;
- std::list _signalSLI;
- int _rttFrames = 0;
- mutable bool _hasReceivedSLI = false;
- mutable bool _hasReceivedRPSI = false;
- uint8_t _pictureIdSLI = 0;
- uint16_t _pictureIdRPSI = 0;
- uint64_t _lastDecRefPictureId = 0;
- uint64_t _lastDecPictureId = 0;
- std::list _signalPLI;
- webrtc::CpuWrapper* _cpu;
- webrtc::Environment _env;
-};
-
-#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAWEWORK_BENCHMARK_H_
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_nvidia.cc b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_nvidia.cc
deleted file mode 100644
index 168988bfb..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_nvidia.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "benchmark_nvidia.h"
-
-#include "api/environment/environment_factory.h"
-#include "modules/video_coding/codecs/h264/include/h264.h"
-#include "fileutils.h"
-
-using namespace webrtc;
-
-NvidiaBenchmark::NvidiaBenchmark()
- : Benchmark("NvidiaBenchmark",
- "Nvidia benchmark over a range of test cases",
- webrtc::test::OutputPath() + "NvidiaBenchmark.txt",
- "nvidia_bitstream_output.h264") {}
-
-NvidiaBenchmark::NvidiaBenchmark(std::string name, std::string description)
- : Benchmark(name,
- description,
- webrtc::test::OutputPath() + "NvidiaBenchmark.txt",
- "nvidia_bitstream_output.h264") {}
-
-NvidiaBenchmark::NvidiaBenchmark(std::string name,
- std::string description,
- std::string resultsFileName)
- : Benchmark(name, description, resultsFileName, "nvidia_bitstream_output.h264") {}
-
-
-VideoEncoder* NvidiaBenchmark::GetNewEncoder(webrtc::Environment &env) {
- if (!NvidiaVideoEncoderFactory::IsSupported()) {
- fprintf(stderr, "NVIDIA is not supported on this system.\n");
- return nullptr;
- }
-
- if (!_factory) {
- _factory = std::make_unique();
- }
- std::map baselineParameters = {
- {"profile-level-id", "42e01f"},
- {"level-asymmetry-allowed", "1"},
- {"packetization-mode", "1"},
- };
- auto format = SdpVideoFormat("H264", baselineParameters);
-
- auto enc = _factory->Create(env, format);
- if (!enc) {
- fprintf(stderr, "Failed to create H264 encoder.\n");
- return nullptr;
- }
- _encoder = std::move(enc);
-
- return _encoder.get();
-}
\ No newline at end of file
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_nvidia.h b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_nvidia.h
deleted file mode 100644
index 3c9271743..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_nvidia.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "benchmark.h"
-#include "nvidia/nvidia_encoder_factory.h"
-
-class NvidiaBenchmark : public Benchmark {
- public:
- NvidiaBenchmark();
- NvidiaBenchmark(std::string name, std::string description);
- NvidiaBenchmark(std::string name,
- std::string description,
- std::string resultsFileName);
-
- ~NvidiaBenchmark() {}
-
- bool IsSupported() override {
- return webrtc::NvidiaVideoEncoderFactory::IsSupported();
- }
-
- protected:
- webrtc::VideoEncoder* GetNewEncoder(webrtc::Environment &env) override;
-
- private:
- std::unique_ptr _encoder;
- std::unique_ptr _factory;
-};
\ No newline at end of file
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_openh264.cc b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_openh264.cc
deleted file mode 100644
index 383f969f6..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_openh264.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "benchmark_openh264.h"
-
-#include "api/environment/environment_factory.h"
-#include "modules/video_coding/codecs/h264/include/h264.h"
-#include "fileutils.h"
-
-using namespace webrtc;
-
-OpenH264Benchmark::OpenH264Benchmark()
- : Benchmark("OpenH264Benchmark",
- "OpenH264 benchmark over a range of test cases",
- webrtc::test::OutputPath() + "OpenH264Benchmark.txt",
- "openh264_bitstream_output.h264") {}
-
-OpenH264Benchmark::OpenH264Benchmark(std::string name, std::string description)
- : Benchmark(name,
- description,
- webrtc::test::OutputPath() + "OpenH264Benchmark.txt",
- "openh264_bitstream_output.h264") {}
-
-OpenH264Benchmark::OpenH264Benchmark(std::string name,
- std::string description,
- std::string resultsFileName)
- : Benchmark(name, description, resultsFileName, "openh264_bitstream_output.h264") {}
-
-VideoEncoder* OpenH264Benchmark::GetNewEncoder(webrtc::Environment &env) {
- auto enc = CreateH264Encoder(env);
- if (!enc) {
- fprintf(stderr, "Failed to create H264 encoder.\n");
- return nullptr;
- }
- _encoder = std::move(enc);
-
- return _encoder.get();
-}
\ No newline at end of file
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_openh264.h b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_openh264.h
deleted file mode 100644
index f1eb1abb9..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_openh264.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "benchmark.h"
-
-class OpenH264Benchmark : public Benchmark {
- public:
- OpenH264Benchmark();
- OpenH264Benchmark(std::string name, std::string description);
- OpenH264Benchmark(std::string name,
- std::string description,
- std::string resultsFileName);
-
- ~OpenH264Benchmark() {}
-
- bool IsSupported() override {
- return true;
- }
-
- protected:
- webrtc::VideoEncoder* GetNewEncoder(webrtc::Environment &env) override;
-
- private:
- std::unique_ptr _encoder;
-};
\ No newline at end of file
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_vaapi.cc b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_vaapi.cc
deleted file mode 100644
index 7c3f0971b..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_vaapi.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "benchmark_vaapi.h"
-
-#include "api/environment/environment_factory.h"
-#include "modules/video_coding/codecs/h264/include/h264.h"
-#include "fileutils.h"
-
-using namespace webrtc;
-
-VaapiBenchmark::VaapiBenchmark()
- : Benchmark("VaapiBenchmark",
- "VAAPI benchmark over a range of test cases",
- webrtc::test::OutputPath() + "VaapiBenchmark.txt",
- "vaapi_bitstream_output.h264") {}
-
-VaapiBenchmark::VaapiBenchmark(std::string name, std::string description)
- : Benchmark(name,
- description,
- webrtc::test::OutputPath() + "VaapiBenchmark.txt",
- "vaapi_bitstream_output.h264") {}
-
-VaapiBenchmark::VaapiBenchmark(std::string name,
- std::string description,
- std::string resultsFileName)
- : Benchmark(name, description, resultsFileName, "vaapi_bitstream_output.h264") {}
-
-VideoEncoder* VaapiBenchmark::GetNewEncoder(webrtc::Environment &env) {
- if (!VAAPIVideoEncoderFactory::IsSupported()) {
- fprintf(stderr, "VAAPI is not supported on this system.\n");
- return nullptr;
- }
- if (!_factory) {
- _factory = std::make_unique();
- }
- std::map baselineParameters = {
- {"profile-level-id", "4d0032"},
- {"level-asymmetry-allowed", "1"},
- {"packetization-mode", "1"},
- };
- auto format = SdpVideoFormat("H264", baselineParameters);
-
- auto enc = _factory->Create(env, format);
- if (!enc) {
- fprintf(stderr, "Failed to create H264 encoder.\n");
- return nullptr;
- }
- _encoder = std::move(enc);
-
- return _encoder.get();
-}
\ No newline at end of file
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_vaapi.h b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_vaapi.h
deleted file mode 100644
index 95ec057b9..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/benchmark_vaapi.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "benchmark.h"
-#include "vaapi/vaapi_encoder_factory.h"
-
-class VaapiBenchmark : public Benchmark {
- public:
- VaapiBenchmark();
- VaapiBenchmark(std::string name, std::string description);
- VaapiBenchmark(std::string name,
- std::string description,
- std::string resultsFileName);
-
- ~VaapiBenchmark() {}
-
- bool IsSupported() override {
- return webrtc::VAAPIVideoEncoderFactory::IsSupported();
- }
-
- protected:
- webrtc::VideoEncoder* GetNewEncoder(webrtc::Environment &env) override;
-
- private:
- std::unique_ptr _encoder;
- std::unique_ptr _factory;
-};
\ No newline at end of file
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_linux.cc b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_linux.cc
deleted file mode 100644
index 6d25b3d41..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_linux.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "cpu_linux.h"
-
-#include
-#include
-#include
-#include
-
-namespace webrtc {
-CpuLinux::CpuLinux()
- : m_oldBusyTime(0),
- m_oldIdleTime(0),
- m_oldBusyTimeMulti(NULL),
- m_oldIdleTimeMulti(NULL),
- m_idleArray(NULL),
- m_busyArray(NULL),
- m_resultArray(NULL),
- m_numCores(0) {
- const int result = GetNumCores();
- if (result != -1) {
- m_numCores = result;
- m_oldBusyTimeMulti = new long long[m_numCores];
- memset(m_oldBusyTimeMulti, 0, sizeof(long long) * m_numCores);
- m_oldIdleTimeMulti = new long long[m_numCores];
- memset(m_oldIdleTimeMulti, 0, sizeof(long long) * m_numCores);
- m_idleArray = new long long[m_numCores];
- memset(m_idleArray, 0, sizeof(long long) * m_numCores);
- m_busyArray = new long long[m_numCores];
- memset(m_busyArray, 0, sizeof(long long) * m_numCores);
- m_resultArray = new uint32_t[m_numCores];
-
- GetData(m_oldBusyTime, m_oldIdleTime, m_busyArray, m_idleArray);
- }
-}
-
-CpuLinux::~CpuLinux()
-{
- delete [] m_oldBusyTimeMulti;
- delete [] m_oldIdleTimeMulti;
- delete [] m_idleArray;
- delete [] m_busyArray;
- delete [] m_resultArray;
-}
-
-int32_t CpuLinux::CpuUsage()
-{
- uint32_t dummy = 0;
- uint32_t* dummyArray = NULL;
- return CpuUsageMultiCore(dummy, dummyArray);
-}
-
-int32_t CpuLinux::CpuUsageMultiCore(uint32_t& numCores,
- uint32_t*& coreArray)
-{
- coreArray = m_resultArray;
- numCores = m_numCores;
- long long busy = 0;
- long long idle = 0;
- if (GetData(busy, idle, m_busyArray, m_idleArray) != 0)
- return -1;
-
- long long deltaBusy = busy - m_oldBusyTime;
- long long deltaIdle = idle - m_oldIdleTime;
- m_oldBusyTime = busy;
- m_oldIdleTime = idle;
-
- int retVal = -1;
- if (deltaBusy + deltaIdle == 0)
- {
- retVal = 0;
- }
- else
- {
- retVal = (int)(100 * (deltaBusy) / (deltaBusy + deltaIdle));
- }
-
- if (coreArray == NULL)
- {
- return retVal;
- }
-
- for (int32_t i = 0; i < m_numCores; i++)
- {
- deltaBusy = m_busyArray[i] - m_oldBusyTimeMulti[i];
- deltaIdle = m_idleArray[i] - m_oldIdleTimeMulti[i];
- m_oldBusyTimeMulti[i] = m_busyArray[i];
- m_oldIdleTimeMulti[i] = m_idleArray[i];
- if(deltaBusy + deltaIdle == 0)
- {
- coreArray[i] = 0;
- }
- else
- {
- coreArray[i] = (int)(100 * (deltaBusy) / (deltaBusy+deltaIdle));
- }
- }
- return retVal;
-}
-
-
-int CpuLinux::GetData(long long& busy, long long& idle, long long*& busyArray,
- long long*& idleArray)
-{
- FILE* fp = fopen("/proc/stat", "r");
- if (!fp)
- {
- return -1;
- }
-
- char line[100];
- if (fgets(line, 100, fp) == NULL) {
- fclose(fp);
- return -1;
- }
- char firstWord[100];
- if (sscanf(line, "%s ", firstWord) != 1) {
- fclose(fp);
- return -1;
- }
- if (strncmp(firstWord, "cpu", 3) != 0) {
- fclose(fp);
- return -1;
- }
- char sUser[100];
- char sNice[100];
- char sSystem[100];
- char sIdle[100];
- if (sscanf(line, "%s %s %s %s %s ",
- firstWord, sUser, sNice, sSystem, sIdle) != 5) {
- fclose(fp);
- return -1;
- }
- long long luser = atoll(sUser);
- long long lnice = atoll(sNice);
- long long lsystem = atoll(sSystem);
- long long lidle = atoll (sIdle);
-
- busy = luser + lnice + lsystem;
- idle = lidle;
- for (int32_t i = 0; i < m_numCores; i++)
- {
- if (fgets(line, 100, fp) == NULL) {
- fclose(fp);
- return -1;
- }
- if (sscanf(line, "%s %s %s %s %s ", firstWord, sUser, sNice, sSystem,
- sIdle) != 5) {
- fclose(fp);
- return -1;
- }
- luser = atoll(sUser);
- lnice = atoll(sNice);
- lsystem = atoll(sSystem);
- lidle = atoll (sIdle);
- busyArray[i] = luser + lnice + lsystem;
- idleArray[i] = lidle;
- }
- fclose(fp);
- return 0;
-}
-
-int CpuLinux::GetNumCores()
-{
- FILE* fp = fopen("/proc/stat", "r");
- if (!fp)
- {
- return -1;
- }
- // Skip first line
- char line[100];
- if (!fgets(line, 100, fp))
- {
- fclose(fp);
- return -1;
- }
- int numCores = -1;
- char firstWord[100];
- do
- {
- numCores++;
- if (fgets(line, 100, fp))
- {
- if (sscanf(line, "%s ", firstWord) != 1) {
- firstWord[0] = '\0';
- }
- } else {
- break;
- }
- } while (strncmp(firstWord, "cpu", 3) == 0);
- fclose(fp);
- return numCores;
-}
-
-CpuWrapper* CpuWrapper::CreateCpu()
-{
- return new CpuLinux();
-}
-
-} // namespace webrtc
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_linux.h b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_linux.h
deleted file mode 100644
index 369cc31b0..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_linux.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_LINUX_H_
-
-#include "cpu_wrapper.h"
-
-namespace webrtc {
-class CpuLinux : public CpuWrapper {
- public:
- CpuLinux();
- virtual ~CpuLinux();
-
- int32_t CpuUsage() override;
- int32_t CpuUsage(int8_t* pProcessName, uint32_t length) override { return 0; }
- int32_t CpuUsage(uint32_t dwProcessID) override { return 0; }
-
- int32_t CpuUsageMultiCore(uint32_t& numCores, uint32_t*& array) override;
-
- void Reset() override { return; }
- void Stop() override { return; }
-
- int GetNumCores() override;
-
- private:
- int GetData(long long& busy,
- long long& idle,
- long long*& busyArray,
- long long*& idleArray);
-
-
- long long m_oldBusyTime;
- long long m_oldIdleTime;
-
- long long* m_oldBusyTimeMulti;
- long long* m_oldIdleTimeMulti;
-
- long long* m_idleArray;
- long long* m_busyArray;
- uint32_t* m_resultArray;
- uint32_t m_numCores;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_LINUX_H_
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_wrapper.h b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_wrapper.h
deleted file mode 100644
index df3c20953..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/cpu/cpu_wrapper.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_WRAPPER_H_
-
-#include
-
-namespace webrtc {
-class CpuWrapper
-{
-public:
- static CpuWrapper* CreateCpu();
- virtual ~CpuWrapper() {}
-
- // Returns the average CPU usage for all processors. The CPU usage can be
- // between and including 0 to 100 (%)
- virtual int32_t CpuUsage() = 0;
- virtual int32_t CpuUsage(int8_t* processName,
- uint32_t length) = 0;
- virtual int32_t CpuUsage(uint32_t dwProcessID) = 0;
-
- // The CPU usage per core is returned in cpu_usage. The CPU can be between
- // and including 0 to 100 (%)
- // Note that the pointer passed as cpu_usage is redirected to a local member
- // of the CPU wrapper.
- // numCores is the number of cores in the cpu_usage array.
- // The return value is -1 for failure or 0-100, indicating the average
- // CPU usage across all cores.
- // Note: on some OSs this class is initialized lazy. This means that it
- // might not yet be possible to retrieve any CPU metrics. When this happens
- // the return value will be zero (indicating that there is not a failure),
- // numCores will be 0 and cpu_usage will be set to NULL (indicating that
- // no metrics are available yet). Once the initialization is completed,
- // which can take in the order of seconds, CPU metrics can be retrieved.
- virtual int32_t CpuUsageMultiCore(uint32_t& numCores,
- uint32_t*& cpu_usage) = 0;
-
- virtual void Reset() = 0;
- virtual void Stop() = 0;
-
- virtual int GetNumCores() = 0;
-
-protected:
- CpuWrapper() {}
-};
-} // namespace webrtc
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_WRAPPER_H_
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/fileutils.cc b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/fileutils.cc
deleted file mode 100644
index 4e49980e5..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/fileutils.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "fileutils.h"
-
-#ifdef WIN32
-#include
-#define GET_CURRENT_DIR _getcwd
-#else
-#include
-#define GET_CURRENT_DIR getcwd
-#endif
-
-#include // To check for directory existence.
-#ifndef S_ISDIR // Not defined in stat.h on Windows.
-#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
-#endif
-
-#include
-#include
-
-
-namespace webrtc {
-namespace test {
-
-#ifdef WIN32
-static const char* kPathDelimiter = "\\";
-#else
-static const char* kPathDelimiter = "/";
-#endif
-
-#ifdef WEBRTC_ANDROID
-static const char* kRootDirName = "/sdcard/";
-static const char* kResourcesDirName = "resources";
-#else
-// The file we're looking for to identify the project root dir.
-static const char* kProjectRootFileName = "h264_benchmark";
-static const char* kOutputDirName = "out";
-static const char* kFallbackPath = "./";
-static const char* kResourcesDirName = "resources";
-#endif
-const char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR";
-
-namespace {
-char relative_dir_path[FILENAME_MAX];
-bool relative_dir_path_set = false;
-}
-
-void SetExecutablePath(const std::string& path) {
- std::string working_dir = WorkingDir();
- std::string temp_path = path;
-
- // Handle absolute paths; convert them to relative paths to the working dir.
- if (path.find(working_dir) != std::string::npos) {
- temp_path = path.substr(working_dir.length() + 1);
- }
- // Trim away the executable name; only store the relative dir path.
- temp_path = temp_path.substr(0, temp_path.find_last_of(kPathDelimiter));
- strncpy(relative_dir_path, temp_path.c_str(), FILENAME_MAX);
- relative_dir_path_set = true;
-}
-
-bool FileExists(std::string& file_name) {
- struct stat file_info = {0};
- return stat(file_name.c_str(), &file_info) == 0;
-}
-
-#ifdef WEBRTC_ANDROID
-
-std::string ProjectRootPath() {
- return kRootDirName;
-}
-
-std::string OutputPath() {
- return kRootDirName;
-}
-
-std::string WorkingDir() {
- return kRootDirName;
-}
-
-#else // WEBRTC_ANDROID
-
-std::string ProjectRootPath() {
- std::string path = WorkingDir();
- if (path == kFallbackPath) {
- return kCannotFindProjectRootDir;
- }
- if (relative_dir_path_set) {
- path = path + kPathDelimiter + relative_dir_path;
- }
- // Check for our file that verifies the root dir.
- size_t path_delimiter_index = path.find_last_of(kPathDelimiter);
- while (path_delimiter_index != std::string::npos) {
- std::string root_filename = path + kPathDelimiter + kProjectRootFileName;
- if (FileExists(root_filename)) {
- return path + kPathDelimiter;
- }
- // Move up one directory in the directory tree.
- path = path.substr(0, path_delimiter_index);
- path_delimiter_index = path.find_last_of(kPathDelimiter);
- }
- // Reached the root directory.
- fprintf(stderr, "Cannot find project root directory!\n");
- return kCannotFindProjectRootDir;
-}
-
-std::string OutputPath() {
- std::string path = ProjectRootPath();
- if (path == kCannotFindProjectRootDir) {
- return kFallbackPath;
- }
- path += kOutputDirName;
- if (!CreateDirectory(path)) {
- return kFallbackPath;
- }
- return path + kPathDelimiter;
-}
-
-std::string WorkingDir() {
- char path_buffer[FILENAME_MAX];
- if (!GET_CURRENT_DIR(path_buffer, sizeof(path_buffer))) {
- fprintf(stderr, "Cannot get current directory!\n");
- return kFallbackPath;
- } else {
- return std::string(path_buffer);
- }
-}
-
-#endif // !WEBRTC_ANDROID
-
-bool CreateDirectory(std::string directory_name) {
- struct stat path_info = {0};
- // Check if the path exists already:
- if (stat(directory_name.c_str(), &path_info) == 0) {
- if (!S_ISDIR(path_info.st_mode)) {
- fprintf(stderr, "Path %s exists but is not a directory! Remove this "
- "file and re-run to create the directory.\n",
- directory_name.c_str());
- return false;
- }
- } else {
-#ifdef WIN32
- return _mkdir(directory_name.c_str()) == 0;
-#else
- return mkdir(directory_name.c_str(), S_IRWXU | S_IRWXG | S_IRWXO) == 0;
-#endif
- }
- return true;
-}
-
-std::string ResourcePath(std::string name, std::string extension) {
- std::string platform = "win";
-#ifdef WEBRTC_LINUX
- platform = "linux";
-#endif // WEBRTC_LINUX
-#ifdef WEBRTC_MAC
- platform = "mac";
-#endif // WEBRTC_MAC
-
-#ifdef WEBRTC_ARCH_64_BITS
- std::string architecture = "64";
-#else
- std::string architecture = "32";
-#endif // WEBRTC_ARCH_64_BITS
-
- std::string resources_path = ProjectRootPath() + kResourcesDirName +
- kPathDelimiter;
- std::string resource_file = resources_path + name + "_" + platform + "_" +
- architecture + "." + extension;
- if (FileExists(resource_file)) {
- return resource_file;
- }
- // Try without architecture.
- resource_file = resources_path + name + "_" + platform + "." + extension;
- if (FileExists(resource_file)) {
- return resource_file;
- }
- // Try without platform.
- resource_file = resources_path + name + "_" + architecture + "." + extension;
- if (FileExists(resource_file)) {
- return resource_file;
- }
-
- // Fall back on name without architecture or platform.
- return resources_path + name + "." + extension;
-}
-
-size_t GetFileSize(std::string filename) {
- FILE* f = fopen(filename.c_str(), "rb");
- size_t size = 0;
- if (f != NULL) {
- if (fseek(f, 0, SEEK_END) == 0) {
- size = ftell(f);
- }
- fclose(f);
- }
- return size;
-}
-
-} // namespace test
-} // namespace webrtc
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/fileutils.h b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/fileutils.h
deleted file mode 100644
index e642a5f03..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/fileutils.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include
-
-// File utilities for testing purposes.
-//
-// The ProjectRootPath() method is a convenient way of getting an absolute
-// path to the project source tree root directory. Using this, it is easy to
-// refer to test resource files in a portable way.
-//
-// Notice that even if Windows platforms use backslash as path delimiter, it is
-// also supported to use slash, so there's no need for #ifdef checks in test
-// code for setting up the paths to the resource files.
-//
-// Example use:
-// Assume we have the following code being used in a test source file:
-// const std::string kInputFile = webrtc::test::ProjectRootPath() +
-// "test/data/voice_engine/audio_long16.wav";
-// // Use the kInputFile for the tests...
-//
-// Then here's some example outputs for different platforms:
-// Linux:
-// * Source tree located in /home/user/webrtc/trunk
-// * Test project located in /home/user/webrtc/trunk/src/testproject
-// * Test binary compiled as:
-// /home/user/webrtc/trunk/out/Debug/testproject_unittests
-// Then ProjectRootPath() will return /home/user/webrtc/trunk/ no matter if
-// the test binary is executed from standing in either of:
-// /home/user/webrtc/trunk
-// or
-// /home/user/webrtc/trunk/out/Debug
-// (or any other directory below the trunk for that matter).
-//
-// Windows:
-// * Source tree located in C:\Users\user\webrtc\trunk
-// * Test project located in C:\Users\user\webrtc\trunk\src\testproject
-// * Test binary compiled as:
-// C:\Users\user\webrtc\trunk\src\testproject\Debug\testproject_unittests.exe
-// Then ProjectRootPath() will return C:\Users\user\webrtc\trunk\ when the
-// test binary is executed from inside Visual Studio.
-// It will also return the same path if the test is executed from a command
-// prompt standing in C:\Users\user\webrtc\trunk\src\testproject\Debug
-//
-// Mac:
-// * Source tree located in /Users/user/webrtc/trunk
-// * Test project located in /Users/user/webrtc/trunk/src/testproject
-// * Test binary compiled as:
-// /Users/user/webrtc/trunk/xcodebuild/Debug/testproject_unittests
-// Then ProjectRootPath() will return /Users/user/webrtc/trunk/ no matter if
-// the test binary is executed from standing in either of:
-// /Users/user/webrtc/trunk
-// or
-// /Users/user/webrtc/trunk/out/Debug
-// (or any other directory below the trunk for that matter).
-
-#ifndef WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
-#define WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
-
-#include
-
-namespace webrtc {
-namespace test {
-
-// This is the "directory" returned if the ProjectPath() function fails
-// to find the project root.
-extern const char* kCannotFindProjectRootDir;
-
-// Finds the root dir of the project, to be able to set correct paths to
-// resource files used by tests.
-// The implementation is simple: it just looks for the file defined by
-// kProjectRootFileName, starting in the current directory (the working
-// directory) and then steps upward until it is found (or it is at the root of
-// the file system).
-// If the current working directory is above the project root dir, it will not
-// be found.
-//
-// If symbolic links occur in the path they will be resolved and the actual
-// directory will be returned.
-//
-// Returns the absolute path to the project root dir (usually the trunk dir)
-// WITH a trailing path delimiter.
-// If the project root is not found, the string specified by
-// kCannotFindProjectRootDir is returned.
-std::string ProjectRootPath();
-
-// Creates and returns the absolute path to the output directory where log files
-// and other test artifacts should be put. The output directory is generally a
-// directory named "out" at the top-level of the project, i.e. a subfolder to
-// the path returned by ProjectRootPath(). The exception is Android where we use
-// /sdcard/ instead.
-//
-// Details described for ProjectRootPath() apply here too.
-//
-// Returns the path WITH a trailing path delimiter. If the project root is not
-// found, the current working directory ("./") is returned as a fallback.
-std::string OutputPath();
-
-// Returns a path to a resource file for the currently executing platform.
-// Adapts to what filenames are currently present in the
-// [project-root]/resources/ dir.
-// Returns an absolute path according to this priority list (the directory
-// part of the path is left out for readability):
-// 1. [name]_[platform]_[architecture].[extension]
-// 2. [name]_[platform].[extension]
-// 3. [name]_[architecture].[extension]
-// 4. [name].[extension]
-// Where
-// * platform is either of "win", "mac" or "linux".
-// * architecture is either of "32" or "64".
-//
-// Arguments:
-// name - Name of the resource file. If a plain filename (no directory path)
-// is supplied, the file is assumed to be located in resources/
-// If a directory path is prepended to the filename, a subdirectory
-// hierarchy reflecting that path is assumed to be present.
-// extension - File extension, without the dot, i.e. "bmp" or "yuv".
-std::string ResourcePath(std::string name, std::string extension);
-
-// Gets the current working directory for the executing program.
-// Returns "./" if for some reason it is not possible to find the working
-// directory.
-std::string WorkingDir();
-
-// Creates a directory if it not already exists.
-// Returns true if successful. Will print an error message to stderr and return
-// false if a file with the same name already exists.
-bool CreateDirectory(std::string directory_name);
-
-// File size of the supplied file in bytes. Will return 0 if the file is
-// empty or if the file does not exist/is readable.
-size_t GetFileSize(std::string filename);
-
-// Sets the executable path, i.e. the path to the executable that is being used
-// when launching it. This is usually the path relative to the working directory
-// but can also be an absolute path. The intention with this function is to pass
-// the argv[0] being sent into the main function to make it possible for
-// fileutils.h to find the correct project paths even when the working directory
-// is outside the project tree (which happens in some cases).
-void SetExecutablePath(const std::string& path_to_executable);
-
-} // namespace test
-} // namespace webrtc
-
-#endif // WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/test_main.cc b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/test_main.cc
deleted file mode 100644
index 6b8209f6d..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/test_main.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "benchmark_nvidia.h"
-#include "benchmark_openh264.h"
-#include "benchmark_vaapi.h"
-#include "stdio.h"
-
-int main(int argc, char** argv) {
-
- std::vector benchmarks;
- benchmarks.push_back(new NvidiaBenchmark());
- //benchmarks.push_back(new VaapiBenchmark());
- benchmarks.push_back(new OpenH264Benchmark());
-
- for (auto benchmark : benchmarks) {
- if (benchmark->IsSupported()) {
- benchmark->Perform();
- }
- }
-
- return 0;
-}
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/video_source.cc b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/video_source.cc
deleted file mode 100644
index 8273c4d85..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/video_source.cc
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "video_source.h"
-
-#include
-
-#include "fileutils.h"
-
-#define ASSERT_TRUE(condition) \
- do { \
- if (!(condition)) { \
- fprintf(stderr, "Assertion failed: %s\n", #condition); \
- abort(); \
- } \
- } while (0)
-
-VideoSource::VideoSource()
-:
-_fileName(webrtc::test::ProjectRootPath() + "resources/foreman_cif.yuv"),
-_width(352),
-_height(288),
-_type(webrtc::VideoType::kI420),
-_frameRate(30)
-{
-}
-
-VideoSource::VideoSource(std::string fileName, VideoSize size,
- int frameRate /*= 30*/, webrtc::VideoType type /*= webrtc::kI420*/)
-:
-_fileName(fileName),
-_type(type),
-_frameRate(frameRate)
-{
- assert(size != kUndefined && size != kNumberOfVideoSizes);
- assert(type != webrtc::VideoType::kUnknown);
- assert(frameRate > 0);
- if (GetWidthHeight(size, _width, _height) != 0) {
- assert(false);
- }
-}
-
-VideoSource::VideoSource(std::string fileName, int width, int height,
- int frameRate /*= 30*/, webrtc::VideoType type /*= webrtc::kI420*/)
-:
-_fileName(fileName),
-_width(width),
-_height(height),
-_type(type),
-_frameRate(frameRate)
-{
- assert(width > 0);
- assert(height > 0);
- assert(type != webrtc::VideoType::kUnknown);
- assert(frameRate > 0);
-}
-
-VideoSize
-VideoSource::GetSize() const
-{
- return GetSize(_width, _height);
-}
-
-VideoSize
-VideoSource::GetSize(uint16_t width, uint16_t height)
-{
- if(width == 128 && height == 96)
- {
- return kSQCIF;
- }else if(width == 160 && height == 120)
- {
- return kQQVGA;
- }else if(width == 176 && height == 144)
- {
- return kQCIF;
- }else if(width == 320 && height == 240)
- {
- return kQVGA;
- }else if(width == 352 && height == 288)
- {
- return kCIF;
- }else if(width == 640 && height == 480)
- {
- return kVGA;
- }else if(width == 720 && height == 480)
- {
- return kNTSC;
- }else if(width == 704 && height == 576)
- {
- return k4CIF;
- }else if(width == 800 && height == 600)
- {
- return kSVGA;
- }else if(width == 960 && height == 720)
- {
- return kHD;
- }else if(width == 1024 && height == 768)
- {
- return kXGA;
- }else if(width == 1440 && height == 1080)
- {
- return kFullHD;
- }else if(width == 400 && height == 240)
- {
- return kWQVGA;
- }else if(width == 800 && height == 480)
- {
- return kWVGA;
- }else if(width == 1280 && height == 720)
- {
- return kWHD;
- }else if(width == 1920 && height == 1080)
- {
- return kWFullHD;
- }
- return kUndefined;
-}
-
-unsigned int
-VideoSource::GetFrameLength() const
-{
- return webrtc::CalcBufferSize(_type, _width, _height);
-}
-
-const char*
-VideoSource::GetMySizeString() const
-{
- return VideoSource::GetSizeString(GetSize());
-}
-
-const char*
-VideoSource::GetSizeString(VideoSize size)
-{
- switch (size)
- {
- case kSQCIF:
- return "SQCIF";
- case kQQVGA:
- return "QQVGA";
- case kQCIF:
- return "QCIF";
- case kQVGA:
- return "QVGA";
- case kCIF:
- return "CIF";
- case kVGA:
- return "VGA";
- case kNTSC:
- return "NTSC";
- case k4CIF:
- return "4CIF";
- case kSVGA:
- return "SVGA";
- case kHD:
- return "HD";
- case kXGA:
- return "XGA";
- case kFullHD:
- return "Full_HD";
- case kWQVGA:
- return "WQVGA";
- case kWHD:
- return "WHD";
- case kWFullHD:
- return "WFull_HD";
- default:
- return "Undefined";
- }
-}
-
-std::string
-VideoSource::GetFilePath() const
-{
- size_t slashPos = _fileName.find_last_of("/\\");
- if (slashPos == std::string::npos)
- {
- return ".";
- }
-
- return _fileName.substr(0, slashPos);
-}
-
-std::string
-VideoSource::GetName() const
-{
- // Remove path.
- size_t slashPos = _fileName.find_last_of("/\\");
- if (slashPos == std::string::npos)
- {
- slashPos = 0;
- }
- else
- {
- slashPos++;
- }
-
- // Remove extension and underscored suffix if it exists.
- return _fileName.substr(slashPos, std::min(_fileName.find_last_of("_"),
- _fileName.find_last_of(".")) - slashPos);
-}
-
-void
-VideoSource::Convert(const VideoSource &target, bool force /* = false */) const
-{
- // Ensure target rate is less than or equal to source
- // (i.e. we are only temporally downsampling).
- ASSERT_TRUE(target.GetFrameRate() <= _frameRate);
- // Only supports YUV420 currently.
- ASSERT_TRUE(_type == webrtc::VideoType::kI420 && target.GetType() == webrtc::VideoType::kI420);
- if (!force && (FileExists(target.GetFileName().c_str()) ||
- (target.GetWidth() == _width && target.GetHeight() == _height && target.GetFrameRate() == _frameRate)))
- {
- // Assume that the filename uniquely defines the content.
- // If the file already exists, it is the correct file.
- return;
- }
- FILE *inFile = NULL;
- FILE *outFile = NULL;
-
- inFile = fopen(_fileName.c_str(), "rb");
- ASSERT_TRUE(inFile != NULL);
-
- outFile = fopen(target.GetFileName().c_str(), "wb");
- ASSERT_TRUE(outFile != NULL);
-
- FrameDropper fd;
- fd.SetFrameRate(target.GetFrameRate(), _frameRate);
-
- const size_t lengthOutFrame = webrtc::CalcBufferSize(target.GetType(),
- target.GetWidth(), target.GetHeight());
- ASSERT_TRUE(lengthOutFrame > 0);
- unsigned char *outFrame = new unsigned char[lengthOutFrame];
-
- const size_t lengthInFrame = webrtc::CalcBufferSize(_type, _width, _height);
- ASSERT_TRUE(lengthInFrame > 0);
- unsigned char *inFrame = new unsigned char[lengthInFrame];
-
- while (fread(inFrame, 1, lengthInFrame, inFile) == lengthInFrame)
- {
- if (!fd.DropFrame())
- {
- ASSERT_TRUE(target.GetWidth() == _width &&
- target.GetHeight() == _height);
- // Add video interpolator here!
- if (fwrite(outFrame, 1, lengthOutFrame,
- outFile) != lengthOutFrame) {
- return;
- }
- }
- }
-
- delete inFrame;
- delete outFrame;
- fclose(inFile);
- fclose(outFile);
-}
-
-bool VideoSource::FileExists(const char* fileName)
-{
- FILE* fp = NULL;
- fp = fopen(fileName, "rb");
- if(fp != NULL)
- {
- fclose(fp);
- return true;
- }
- return false;
-}
-
-
-int
-VideoSource::GetWidthHeight( VideoSize size, int & width, int& height)
-{
- switch(size)
- {
- case kSQCIF:
- width = 128;
- height = 96;
- return 0;
- case kQQVGA:
- width = 160;
- height = 120;
- return 0;
- case kQCIF:
- width = 176;
- height = 144;
- return 0;
- case kCGA:
- width = 320;
- height = 200;
- return 0;
- case kQVGA:
- width = 320;
- height = 240;
- return 0;
- case kSIF:
- width = 352;
- height = 240;
- return 0;
- case kWQVGA:
- width = 400;
- height = 240;
- return 0;
- case kCIF:
- width = 352;
- height = 288;
- return 0;
- case kW288p:
- width = 512;
- height = 288;
- return 0;
- case k448p:
- width = 576;
- height = 448;
- return 0;
- case kVGA:
- width = 640;
- height = 480;
- return 0;
- case k432p:
- width = 720;
- height = 432;
- return 0;
- case kW432p:
- width = 768;
- height = 432;
- return 0;
- case k4SIF:
- width = 704;
- height = 480;
- return 0;
- case kW448p:
- width = 768;
- height = 448;
- return 0;
- case kNTSC:
- width = 720;
- height = 480;
- return 0;
- case kFW448p:
- width = 800;
- height = 448;
- return 0;
- case kWVGA:
- width = 800;
- height = 480;
- return 0;
- case k4CIF:
- width = 704;
- height = 576;
- return 0;
- case kSVGA:
- width = 800;
- height = 600;
- return 0;
- case kW544p:
- width = 960;
- height = 544;
- return 0;
- case kW576p:
- width = 1024;
- height = 576;
- return 0;
- case kHD:
- width = 960;
- height = 720;
- return 0;
- case kXGA:
- width = 1024;
- height = 768;
- return 0;
- case kFullHD:
- width = 1440;
- height = 1080;
- return 0;
- case kWHD:
- width = 1280;
- height = 720;
- return 0;
- case kWFullHD:
- width = 1920;
- height = 1080;
- return 0;
- default:
- return -1;
- }
-}
-
-FrameDropper::FrameDropper()
-:
-_dropsBetweenRenders(0),
-_frameCounter(0)
-{
-}
-
-bool
-FrameDropper::DropFrame()
-{
- _frameCounter++;
- if (_frameCounter > _dropsBetweenRenders)
- {
- _frameCounter = 0;
- return false;
- }
- return true;
-}
-
-unsigned int
-FrameDropper::DropsBetweenRenders()
-{
- return _dropsBetweenRenders;
-}
-
-void
-FrameDropper::SetFrameRate(double frameRate, double maxFrameRate)
-{
- if (frameRate >= 1.0)
- {
- _dropsBetweenRenders = static_cast(maxFrameRate / frameRate + 0.5) - 1;
- }
- else
- {
- _dropsBetweenRenders = 0;
- }
-}
diff --git a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/video_source.h b/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/video_source.h
deleted file mode 100644
index c9da346fc..000000000
--- a/fluxer_desktop/native/webrtc-sender/vendor/webrtc-sys/test/video_source.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_VIDEO_SOURCE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_VIDEO_SOURCE_H_
-
-#include
-#include "common_video/libyuv/include/webrtc_libyuv.h"
-
-enum VideoSize
- {
- kUndefined,
- kSQCIF, // 128*96 = 12 288
- kQQVGA, // 160*120 = 19 200
- kQCIF, // 176*144 = 25 344
- kCGA, // 320*200 = 64 000
- kQVGA, // 320*240 = 76 800
- kSIF, // 352*240 = 84 480
- kWQVGA, // 400*240 = 96 000
- kCIF, // 352*288 = 101 376
- kW288p, // 512*288 = 147 456 (WCIF)
- k448p, // 576*448 = 281 088
- kVGA, // 640*480 = 307 200
- k432p, // 720*432 = 311 040
- kW432p, // 768*432 = 331 776
- k4SIF, // 704*480 = 337 920
- kW448p, // 768*448 = 344 064
- kNTSC, // 720*480 = 345 600
- kFW448p, // 800*448 = 358 400
- kWVGA, // 800*480 = 384 000
- k4CIF, // 704�576 = 405 504
- kSVGA, // 800*600 = 480 000
- kW544p, // 960*544 = 522 240
- kW576p, // 1024*576 = 589 824 (W4CIF)
- kHD, // 960*720 = 691 200
- kXGA, // 1024*768 = 786 432
- kWHD, // 1280*720 = 921 600
- kFullHD, // 1440*1080 = 1 555 200
- kWFullHD, // 1920*1080 = 2 073 600
-
- kNumberOfVideoSizes
- };
-
-class VideoSource
-{
-public:
- VideoSource();
- VideoSource(std::string fileName, VideoSize size, int frameRate = 30,
- webrtc::VideoType type = webrtc::VideoType::kI420);
- VideoSource(std::string fileName, int width, int height, int frameRate = 30,
- webrtc::VideoType type = webrtc::VideoType::kI420);
-
- std::string GetFileName() const { return _fileName; }
- int GetWidth() const { return _width; }
- int GetHeight() const { return _height; }
- webrtc::VideoType GetType() const { return _type; }
- int GetFrameRate() const { return _frameRate; }
-
- // Returns the file path without a trailing slash.
- std::string GetFilePath() const;
-
- // Returns the filename with the path (including the leading slash) removed.
- std::string GetName() const;
-
- VideoSize GetSize() const;
- static VideoSize GetSize(uint16_t width, uint16_t height);
- unsigned int GetFrameLength() const;
-
- // Returns a human-readable size string.
- static const char* GetSizeString(VideoSize size);
- const char* GetMySizeString() const;
-
- // Opens the video source, converting and writing to the specified target.
- // If force is true, the conversion will be done even if the target file
- // already exists.
- void Convert(const VideoSource& target, bool force = false) const;
- static bool FileExists(const char* fileName);
-private:
- static int GetWidthHeight( VideoSize size, int& width, int& height);
- std::string _fileName;
- int _width;
- int _height;
- webrtc::VideoType _type;
- int _frameRate;
-};
-
-class FrameDropper
-{
-public:
- FrameDropper();
- bool DropFrame();
- unsigned int DropsBetweenRenders();
- void SetFrameRate(double frameRate, double maxFrameRate);
-
-private:
- unsigned int _dropsBetweenRenders;
- unsigned int _frameCounter;
-};
-
-
-#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_VIDEO_SOURCE_H_
-
diff --git a/fluxer_desktop/native/win-game-capture/index.test.mjs b/fluxer_desktop/native/win-game-capture/index.test.mjs
index 6fa4b833f..b037eb43c 100644
--- a/fluxer_desktop/native/win-game-capture/index.test.mjs
+++ b/fluxer_desktop/native/win-game-capture/index.test.mjs
@@ -1,20 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import assert from 'node:assert/strict';
-import {existsSync} from 'node:fs';
import {createRequire} from 'node:module';
import {afterEach, describe, test} from 'node:test';
const require = createRequire(import.meta.url);
const winGameCapture = require('./index.js');
-const startupSupported = winGameCapture.isSupported();
-const startupAvailability = winGameCapture.getAvailability();
-const startupHookAvailable = winGameCapture.isGameCaptureHookAvailable();
-const realBindingSkip = startupSupported
- ? false
- : 'no native binding loaded at startup (binding-less platform / unbuilt addon)';
-
const hasBindingHook = typeof winGameCapture.__setBindingForTests === 'function';
const injectionSkip = hasBindingHook ? false : 'no __setBindingForTests hook exported';
@@ -292,38 +284,6 @@ describe('win-game-capture loader wrapper -- arch path resolvers (platform-porta
});
});
-describe('win-game-capture loader wrapper -- real native binding (built Windows box)', () => {
- test('getAvailability() reports available with the windows-game-capture backend', {skip: realBindingSkip}, () => {
- assert.equal(startupAvailability.available, true);
- assert.equal(startupAvailability.backend, 'windows-game-capture');
- });
-
- test('resolveGameHookPath() points at an existing host-arch hook DLL', {skip: realBindingSkip}, () => {
- const r = winGameCapture.resolveGameHookPath();
- assert.equal(typeof r, 'string', 'expected a hook path on a built Windows box');
- assert.ok(existsSync(r), `hook DLL should exist on disk: ${r}`);
- });
-
- test('resolveVulkanLayerManifestPath() points at an existing layer manifest', {skip: realBindingSkip}, () => {
- const r = winGameCapture.resolveVulkanLayerManifestPath();
- assert.equal(typeof r, 'string', 'expected a Vulkan layer manifest path on a built Windows box');
- assert.ok(existsSync(r), `Vulkan layer manifest should exist on disk: ${r}`);
- });
-
- test('the native binding reports hook-based game capture as unavailable', {skip: realBindingSkip}, () => {
- assert.equal(startupHookAvailable, false, 'hook capture is force-disabled in the native crate');
- });
-
- test('requiring the module leaves the Vulkan implicit layer unregistered', {skip: realBindingSkip}, () => {
- assert.equal(
- winGameCapture.registerVulkanLayerManifest(),
- false,
- 'the Vulkan implicit layer must not be registered while hook capture is disabled',
- );
- assert.equal(winGameCapture.getVulkanLayerRegistrationState().registered, false);
- });
-});
-
describe('win-game-capture loader wrapper -- injected fake binding', () => {
test('isGameCaptureHookAvailable() follows the native hook flag', {skip: injectionSkip}, () => {
const {binding} = makeFakeBinding();
diff --git a/fluxer_desktop/native/win-game-capture/package.json b/fluxer_desktop/native/win-game-capture/package.json
index d6c8b5457..27a7e5cbd 100644
--- a/fluxer_desktop/native/win-game-capture/package.json
+++ b/fluxer_desktop/native/win-game-capture/package.json
@@ -35,7 +35,6 @@
"scripts": {
"build": "cargo run --locked --quiet --manifest-path ../../../tools/ci/Cargo.toml -- build-desktop-native-addon",
"test": "cargo test --manifest-path Cargo.toml && node --test index.test.mjs",
- "test:fixtures": "node scripts/fixture-smoke.mjs",
"test:loader": "node --test index.test.mjs"
}
}
diff --git a/fluxer_desktop/native/win-game-capture/scripts/fixture-smoke.mjs b/fluxer_desktop/native/win-game-capture/scripts/fixture-smoke.mjs
deleted file mode 100644
index 300442957..000000000
--- a/fluxer_desktop/native/win-game-capture/scripts/fixture-smoke.mjs
+++ /dev/null
@@ -1,287 +0,0 @@
-#!/usr/bin/env node
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-import {spawn} from 'node:child_process';
-import {existsSync} from 'node:fs';
-import {createRequire} from 'node:module';
-import {dirname, join} from 'node:path';
-import {setTimeout as delay} from 'node:timers/promises';
-import {fileURLToPath} from 'node:url';
-
-const require = createRequire(import.meta.url);
-const capture = require('../index.js');
-
-const ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
-const DEFAULT_FIXTURES = ['d3d11-present-fixture'];
-const ALL_FIXTURES = [
- 'd3d9-present-fixture',
- 'd3d10-present-fixture',
- 'd3d11-present-fixture',
- 'd3d12-present-fixture',
- 'opengl-swapbuffers-fixture',
- 'vulkan-present-fixture',
-];
-const WIDTH = Number.parseInt(process.env.FLUXER_WIN_GAME_CAPTURE_FIXTURE_WIDTH ?? '640', 10);
-const HEIGHT = Number.parseInt(process.env.FLUXER_WIN_GAME_CAPTURE_FIXTURE_HEIGHT ?? '360', 10);
-const FRAME_RATE = Number.parseInt(process.env.FLUXER_WIN_GAME_CAPTURE_FIXTURE_FPS ?? '30', 10);
-const START_TIMEOUT_MS = Number.parseInt(process.env.FLUXER_WIN_GAME_CAPTURE_FIXTURE_START_TIMEOUT_MS ?? '15000', 10);
-const FRAME_TIMEOUT_MS = Number.parseInt(process.env.FLUXER_WIN_GAME_CAPTURE_FIXTURE_FRAME_TIMEOUT_MS ?? '15000', 10);
-
-const MIN_OBSERVED_FRAMES = 3;
-
-const API_NONE = 0;
-const TRANSPORT_MEMORY = 0;
-const FALLBACK_NONE = 0;
-const DXGI_FORMAT_UNKNOWN = 0;
-const EXPECTED_ACTIVE_STRATEGY = 'wgc';
-
-const EXPECTED_DIAGNOSTICS = {
- apiType: API_NONE,
- transport: TRANSPORT_MEMORY,
- fallbackReason: FALLBACK_NONE,
- dxgiFormat: DXGI_FORMAT_UNKNOWN,
-};
-
-function envFlag(name) {
- return /^(1|true|yes|on)$/i.test(process.env[name] ?? '');
-}
-
-function selectedFixtures() {
- const raw = process.argv.slice(2).join(',') || process.env.FLUXER_WIN_GAME_CAPTURE_FIXTURES || '';
- if (!raw.trim()) return DEFAULT_FIXTURES;
- const names = raw
- .split(',')
- .map((name) => name.trim())
- .filter(Boolean);
- return names.flatMap((name) => (name === 'all' ? ALL_FIXTURES : [name]));
-}
-
-function fixtureTarget(fixture) {
- return fixture === 'i686-present-fixture' ? 'i686-pc-windows-msvc' : null;
-}
-
-function fixtureExePath(fixture) {
- const target = fixtureTarget(fixture);
- const targetDir = target
- ? join(ROOT, 'test-apps', fixture, 'target', target, 'release')
- : join(ROOT, 'test-apps', fixture, 'target', 'release');
- return join(targetDir, `${fixture}.exe`);
-}
-
-function envKeyForFixture(fixture) {
- return `FLUXER_WIN_GAME_CAPTURE_FIXTURE_ARGS_${fixture.toUpperCase().replaceAll(/[^A-Z0-9]+/g, '_')}`;
-}
-
-function fixtureEnvValue(baseName, fixture) {
- const fixtureKey = `${baseName}_${fixture.toUpperCase().replaceAll(/[^A-Z0-9]+/g, '_')}`;
- return process.env[fixtureKey] ?? process.env[baseName];
-}
-
-function splitExtraArgs(raw) {
- return (raw ?? '')
- .split(/\s+/)
- .map((arg) => arg.trim())
- .filter(Boolean);
-}
-
-function extraFixtureArgs(fixture) {
- return [
- ...splitExtraArgs(process.env.FLUXER_WIN_GAME_CAPTURE_FIXTURE_ARGS),
- ...splitExtraArgs(process.env[envKeyForFixture(fixture)]),
- ];
-}
-
-function diagnosticOverride(baseName, fixture) {
- const raw = fixtureEnvValue(baseName, fixture);
- if (raw === undefined || raw === '') return undefined;
- const value = Number.parseInt(raw, 10);
- if (!Number.isFinite(value)) throw new Error(`Invalid ${baseName} override: ${raw}`);
- return value;
-}
-
-function runCommand(command, args, options = {}) {
- return new Promise((resolve, reject) => {
- const child = spawn(command, args, {
- cwd: options.cwd ?? ROOT,
- env: process.env,
- stdio: options.stdio ?? ['ignore', 'pipe', 'pipe'],
- windowsHide: false,
- });
- let stdout = '';
- let stderr = '';
- child.stdout?.on('data', (chunk) => {
- stdout += chunk.toString();
- if (options.echo) process.stdout.write(chunk);
- });
- child.stderr?.on('data', (chunk) => {
- stderr += chunk.toString();
- if (options.echo) process.stderr.write(chunk);
- });
- child.once('error', reject);
- child.once('exit', (code, signal) => {
- if (code === 0) {
- resolve({stdout, stderr});
- return;
- }
- reject(new Error(`${command} ${args.join(' ')} failed with ${signal ?? code}\n${stderr || stdout}`));
- });
- });
-}
-
-async function buildFixture(fixture) {
- const manifest = join(ROOT, 'test-apps', fixture, 'Cargo.toml');
- if (!existsSync(manifest)) throw new Error(`unknown fixture: ${fixture}`);
- const exe = fixtureExePath(fixture);
- if (envFlag('FLUXER_WIN_GAME_CAPTURE_FIXTURE_SKIP_BUILD') && existsSync(exe)) {
- console.log(`[fixture-smoke] using existing ${fixture}`);
- return exe;
- }
- const args = ['build', '--release', '--manifest-path', manifest];
- const target = fixtureTarget(fixture);
- if (target) args.push('--target', target);
- console.log(`[fixture-smoke] building ${fixture}`);
- await runCommand('cargo', args, {echo: envFlag('FLUXER_WIN_GAME_CAPTURE_FIXTURE_VERBOSE')});
- if (!existsSync(exe)) throw new Error(`fixture build did not produce ${exe}`);
- return exe;
-}
-
-function waitForHwnd(child, fixture) {
- return new Promise((resolve, reject) => {
- let stdout = '';
- let stderr = '';
- const timeout = setTimeout(() => {
- reject(new Error(`${fixture} did not print HWND within ${START_TIMEOUT_MS}ms\n${stderr || stdout}`));
- }, START_TIMEOUT_MS);
- const finish = (hwnd) => {
- clearTimeout(timeout);
- resolve(hwnd);
- };
- child.stdout.on('data', (chunk) => {
- const text = chunk.toString();
- stdout += text;
- const match = stdout.match(/HWND=(\d+)/);
- if (match) finish(match[1]);
- });
- child.stderr.on('data', (chunk) => {
- stderr += chunk.toString();
- if (envFlag('FLUXER_WIN_GAME_CAPTURE_FIXTURE_VERBOSE')) process.stderr.write(chunk);
- });
- child.once('exit', (code, signal) => {
- clearTimeout(timeout);
- reject(new Error(`${fixture} exited before capture started (${signal ?? code})\n${stderr || stdout}`));
- });
- });
-}
-
-function observedFrameCount(diagnostics) {
- if (!diagnostics) return 0;
- const accepted = Number(diagnostics.frameSinkAccepted ?? 0);
- const coalesced = Number(diagnostics.frameSinkCoalesced ?? 0);
- const droppedWithoutSink = Number(diagnostics.mediaFramesDroppedWithoutSink ?? 0);
- const total = accepted + coalesced + droppedWithoutSink;
- return Number.isFinite(total) ? total : 0;
-}
-
-async function waitForAdvancingFrames(screenCapture, fixture, stalls) {
- let lastDiagnostics = null;
- const start = Date.now();
- while (Date.now() - start < FRAME_TIMEOUT_MS) {
- lastDiagnostics = screenCapture.getDiagnostics?.() ?? lastDiagnostics;
- const frameCount = observedFrameCount(lastDiagnostics);
- if (frameCount >= MIN_OBSERVED_FRAMES) {
- return {frameCount, diagnostics: lastDiagnostics};
- }
- await delay(100);
- }
- throw new Error(
- `${fixture} capture did not deliver advancing frames within ${FRAME_TIMEOUT_MS}ms (frames=${observedFrameCount(lastDiagnostics)}, stalls=${JSON.stringify(stalls)}, diagnostics=${JSON.stringify(lastDiagnostics)})`,
- );
-}
-
-function assertEqualDiagnostic(fixture, diagnostics, key, expected) {
- if (diagnostics?.[key] !== expected) {
- throw new Error(`${fixture} expected diagnostics.${key}=${expected}, got ${JSON.stringify(diagnostics)}`);
- }
-}
-
-function assertFixtureDiagnostics(fixture, diagnostics) {
- const expected = {...EXPECTED_DIAGNOSTICS};
- const apiOverride = diagnosticOverride('FLUXER_WIN_GAME_CAPTURE_EXPECT_API_TYPE', fixture);
- const transportOverride = diagnosticOverride('FLUXER_WIN_GAME_CAPTURE_EXPECT_TRANSPORT', fixture);
- const fallbackOverride = diagnosticOverride('FLUXER_WIN_GAME_CAPTURE_EXPECT_FALLBACK_REASON', fixture);
- if (apiOverride !== undefined) expected.apiType = apiOverride;
- if (transportOverride !== undefined) expected.transport = transportOverride;
- if (fallbackOverride !== undefined) expected.fallbackReason = fallbackOverride;
-
- if (diagnostics?.activeStrategy !== EXPECTED_ACTIVE_STRATEGY) {
- throw new Error(
- `${fixture} expected activeStrategy=${EXPECTED_ACTIVE_STRATEGY}, got ${JSON.stringify(diagnostics)}`,
- );
- }
- assertEqualDiagnostic(fixture, diagnostics, 'apiType', expected.apiType);
- assertEqualDiagnostic(fixture, diagnostics, 'transport', expected.transport);
- assertEqualDiagnostic(fixture, diagnostics, 'fallbackReason', expected.fallbackReason);
- assertEqualDiagnostic(fixture, diagnostics, 'dxgiFormat', expected.dxgiFormat);
- assertEqualDiagnostic(fixture, diagnostics, 'injectionMethod', '');
-}
-
-async function runFixture(fixture) {
- const exe = await buildFixture(fixture);
- const args = ['--frames', '900', '--width', String(WIDTH), '--height', String(HEIGHT), '--windowed'];
- if (fixture === 'vulkan-present-fixture') args.push('--resize-at', '120');
- args.push(...extraFixtureArgs(fixture));
- const child = spawn(exe, args, {
- cwd: dirname(exe),
- stdio: ['ignore', 'pipe', 'pipe'],
- windowsHide: false,
- });
- let started = false;
- try {
- const hwnd = await waitForHwnd(child, fixture);
- const screenCapture = new capture.ScreenCapture({
- sourceId: `window:${hwnd}:0`,
- sourceKind: 'game',
- width: WIDTH,
- height: HEIGHT,
- frameRate: FRAME_RATE,
- injectionMethod: process.env.FLUXER_WIN_GAME_CAPTURE_INJECTION_METHOD || 'auto',
- });
- const stalls = [];
- screenCapture.on('stalled', (message) => stalls.push(message ?? ''));
- let result;
- try {
- result = await screenCapture.start();
- started = true;
- const observed = await waitForAdvancingFrames(screenCapture, fixture, stalls);
- assertFixtureDiagnostics(fixture, observed.diagnostics);
- console.log(
- `[fixture-smoke] PASS ${fixture}: start=${JSON.stringify(result)} frames=${observed.frameCount} stalls=${JSON.stringify(stalls)} diagnostics=${JSON.stringify(observed.diagnostics)}`,
- );
- } finally {
- if (started) await screenCapture.stop().catch(() => {});
- }
- } finally {
- if (!child.killed) child.kill();
- }
-}
-
-async function main() {
- if (process.platform !== 'win32') {
- console.log('[fixture-smoke] SKIP: Windows game-capture fixtures only run on Windows');
- return 0;
- }
- if (!capture.isSupported()) {
- throw new Error(`win-game-capture binding unavailable: ${capture.loadError?.message ?? 'unknown error'}`);
- }
- for (const fixture of selectedFixtures()) {
- await runFixture(fixture);
- }
- return 0;
-}
-
-try {
- process.exitCode = await main();
-} catch (error) {
- console.error(`[fixture-smoke] FAIL: ${error.stack ?? error.message}`);
- process.exitCode = 1;
-}
diff --git a/fluxer_desktop/native/win-game-capture/src/encoder_attach.rs b/fluxer_desktop/native/win-game-capture/src/encoder_attach.rs
index 22a5f0ba9..c610b0598 100644
--- a/fluxer_desktop/native/win-game-capture/src/encoder_attach.rs
+++ b/fluxer_desktop/native/win-game-capture/src/encoder_attach.rs
@@ -421,103 +421,4 @@ mod tests {
let err = EncoderAttachment::try_new(640, 480).err();
assert!(matches!(err, Some(EncoderAttachError::RingInitFailed)));
}
-
- #[cfg(target_os = "windows")]
- #[test]
- fn windows_attach_then_detach_smoke() {
- let attach = match EncoderAttachment::try_new(640, 480) {
- Ok(a) => a,
- Err(_) => return,
- };
- assert!(attach.is_attached());
- assert_eq!(attach.width(), 640);
- assert_eq!(attach.height(), 480);
- assert_eq!(attach.capacity(), 8);
- let stats = attach.stats();
- assert_eq!(stats.frames_submitted, 0, "fresh attach has 0 submissions");
- assert_eq!(stats.failed_blits, 0, "fresh attach has 0 failed blits");
- attach.detach();
- assert!(!attach.is_attached());
- }
-
- #[cfg(target_os = "windows")]
- #[test]
- fn windows_submit_notify_records_stats() {
- let attach = match EncoderAttachment::try_new(64, 64) {
- Ok(a) => a,
- Err(_) => return,
- };
- for _ in 0..3 {
- attach.submit_notify().expect("notify ok");
- }
- let stats = attach.stats();
- assert_eq!(stats.frames_submitted, 3);
- assert_eq!(stats.frames_dropped, 0);
- assert_eq!(stats.ring_full_events, 0);
- }
-
- #[cfg(target_os = "windows")]
- #[test]
- fn windows_submit_rejected_when_detached() {
- let attach = match EncoderAttachment::try_new(64, 64) {
- Ok(a) => a,
- Err(_) => return,
- };
- attach.detach();
- let err = attach.submit_notify().err();
- assert!(matches!(err, Some(EncoderAttachError::NotAttached)));
- }
-
- #[cfg(target_os = "windows")]
- #[test]
- fn windows_wait_next_ready_returns_committed_frame() {
- let attach = match EncoderAttachment::try_new(64, 64) {
- Ok(a) => a,
- Err(_) => return,
- };
- attach.submit_notify().expect("notify ok");
- let ready = attach.wait_next_ready(Duration::from_millis(5));
- let ready = ready.expect("committed frame becomes ready");
- assert_eq!(ready.sequence, 1);
- assert_eq!(ready.duplicate_count, 0);
- }
-
- #[cfg(target_os = "windows")]
- #[test]
- fn windows_wait_next_ready_empty_ring_times_out() {
- let attach = match EncoderAttachment::try_new(64, 64) {
- Ok(a) => a,
- Err(_) => return,
- };
- let ready = attach.wait_next_ready(Duration::from_millis(2));
- assert!(ready.is_none());
- assert!(attach.is_attached());
- }
-
- #[cfg(target_os = "windows")]
- #[test]
- fn windows_wait_next_ready_after_detach_returns_none() {
- let attach = match EncoderAttachment::try_new(64, 64) {
- Ok(a) => a,
- Err(_) => return,
- };
- attach.detach();
- let ready = attach.wait_next_ready(Duration::from_millis(2));
- assert!(ready.is_none());
- assert!(!attach.is_attached());
- }
-
- #[cfg(target_os = "windows")]
- #[test]
- fn windows_ring_usable_after_nvenc_pre_register_attempt() {
- let attach = match EncoderAttachment::try_new(64, 64) {
- Ok(a) => a,
- Err(_) => return,
- };
- let _ = attach.nvenc_pre_registered();
- attach.submit_notify().expect("notify ok");
- let stats = attach.stats();
- assert_eq!(stats.frames_submitted, 1);
- assert_eq!(stats.frames_dropped, 0);
- }
}
diff --git a/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/Cargo.lock b/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/Cargo.lock
deleted file mode 100644
index 9a46411e1..000000000
--- a/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/Cargo.lock
+++ /dev/null
@@ -1,156 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "d3d10-present-fixture"
-version = "0.0.0"
-dependencies = [
- "windows",
- "windows-core",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
-
-[[package]]
-name = "windows"
-version = "0.62.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
-dependencies = [
- "windows-collections",
- "windows-core",
- "windows-future",
- "windows-numerics",
-]
-
-[[package]]
-name = "windows-collections"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
-dependencies = [
- "windows-core",
-]
-
-[[package]]
-name = "windows-core"
-version = "0.62.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
-dependencies = [
- "windows-implement",
- "windows-interface",
- "windows-link",
- "windows-result",
- "windows-strings",
-]
-
-[[package]]
-name = "windows-future"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
-dependencies = [
- "windows-core",
- "windows-link",
- "windows-threading",
-]
-
-[[package]]
-name = "windows-implement"
-version = "0.60.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-interface"
-version = "0.59.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
-
-[[package]]
-name = "windows-numerics"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
-dependencies = [
- "windows-core",
- "windows-link",
-]
-
-[[package]]
-name = "windows-result"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-strings"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-threading"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
-dependencies = [
- "windows-link",
-]
diff --git a/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/Cargo.toml b/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/Cargo.toml
deleted file mode 100644
index 69d699f5f..000000000
--- a/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/Cargo.toml
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-License-Identifier: AGPL-3.0-or-later
-[package]
-name = "d3d10-present-fixture"
-version = "0.0.0"
-edition = "2024"
-license = "AGPL-3.0-or-later"
-publish = false
-
-# Empty workspace table keeps this fixture out of any parent Cargo workspace,
-# matching the sibling crates (hook/, vulkan-layer/) in this package.
-[workspace]
-resolver = "2"
-
-[[bin]]
-name = "d3d10-present-fixture"
-path = "src/main.rs"
-
-[target.'cfg(target_os = "windows")'.dependencies]
-windows = {version = "0.62.2", features = [
- "Win32_Foundation",
- "Win32_Graphics_Direct3D",
- "Win32_Graphics_Direct3D10",
- "Win32_Graphics_Dxgi",
- "Win32_Graphics_Dxgi_Common",
- "Win32_Graphics_Gdi",
- "Win32_System_LibraryLoader",
- "Win32_UI_WindowsAndMessaging",
-]}
-windows-core = "0.62.2"
diff --git a/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/src/main.rs b/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/src/main.rs
deleted file mode 100644
index b4d7ec9c5..000000000
--- a/fluxer_desktop/native/win-game-capture/test-apps/d3d10-present-fixture/src/main.rs
+++ /dev/null
@@ -1,389 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-#[cfg(not(windows))]
-fn main() {
- eprintln!("d3d10-present-fixture is only functional on Windows");
-}
-
-#[cfg(windows)]
-fn main() -> windows_core::Result<()> {
- windows_impl::run()
-}
-
-#[cfg_attr(not(windows), allow(dead_code))]
-mod pattern {
- pub const BARS: [(u8, u8, u8); 8] = [
- (255, 255, 255),
- (255, 255, 0),
- (0, 255, 255),
- (0, 255, 0),
- (255, 0, 255),
- (255, 0, 0),
- (0, 0, 255),
- (0, 0, 0),
- ];
-
- pub const COUNTER_BLOCK: u32 = 16;
-
- pub fn bar_colour(x: u32, width: u32) -> (u8, u8, u8) {
- let width = width.max(1);
- let index = ((x as u64 * BARS.len() as u64) / width as u64) as usize;
- BARS[index.min(BARS.len() - 1)]
- }
-
- pub fn counter_colour(frame_index: u64) -> (u8, u8, u8) {
- let low = (frame_index & 0x00FF_FFFF) as u32;
- (
- (low & 0xFF) as u8,
- ((low >> 8) & 0xFF) as u8,
- ((low >> 16) & 0xFF) as u8,
- )
- }
-}
-
-#[cfg(windows)]
-mod cli {
- pub struct Options {
- pub frames: Option,
- pub width: u32,
- pub height: u32,
- pub borderless: bool,
- }
-
- impl Default for Options {
- fn default() -> Self {
- Self {
- frames: None,
- width: 1280,
- height: 720,
- borderless: false,
- }
- }
- }
-
- impl Options {
- pub fn from_env() -> Self {
- let mut options = Options::default();
- let mut args = std::env::args().skip(1);
- while let Some(arg) = args.next() {
- match arg.as_str() {
- "--frames" => {
- if let Some(value) = args.next().and_then(|v| v.parse().ok()) {
- options.frames = Some(value);
- }
- }
- "--width" => {
- if let Some(value) = args.next().and_then(|v| v.parse().ok()) {
- options.width = value;
- }
- }
- "--height" => {
- if let Some(value) = args.next().and_then(|v| v.parse().ok()) {
- options.height = value;
- }
- }
- "--borderless" => options.borderless = true,
- "--windowed" => options.borderless = false,
- _ => {}
- }
- }
- options
- }
- }
-}
-
-#[cfg(windows)]
-mod windows_impl {
- use super::{cli::Options, pattern};
- use windows::Win32::Foundation::{HMODULE, HWND, LPARAM, LRESULT, WPARAM};
- use windows::Win32::Graphics::Direct3D10::{
- D3D10_DRIVER_TYPE_HARDWARE, D3D10_MAPPED_TEXTURE2D, D3D10_SDK_VERSION, D3D10CreateDevice,
- ID3D10Device, ID3D10RenderTargetView, ID3D10Resource, ID3D10Texture2D,
- };
- use windows::Win32::Graphics::Dxgi::Common::{
- DXGI_FORMAT, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_MODE_DESC,
- DXGI_RATIONAL, DXGI_SAMPLE_DESC,
- };
- use windows::Win32::Graphics::Dxgi::{
- DXGI_PRESENT, DXGI_SWAP_CHAIN_DESC, DXGI_SWAP_EFFECT_DISCARD,
- DXGI_USAGE_RENDER_TARGET_OUTPUT, IDXGIDevice, IDXGIFactory, IDXGISwapChain,
- };
- use windows::Win32::System::LibraryLoader::GetModuleHandleW;
- use windows::Win32::UI::WindowsAndMessaging::{
- CS_HREDRAW, CS_VREDRAW, CW_USEDEFAULT, CreateWindowExW, DefWindowProcW, DispatchMessageW,
- GetClientRect, MSG, PM_REMOVE, PeekMessageW, PostQuitMessage, RegisterClassExW, SW_SHOW,
- ShowWindow, TranslateMessage, WM_DESTROY, WM_QUIT, WNDCLASSEXW, WS_OVERLAPPEDWINDOW,
- WS_POPUP, WS_VISIBLE,
- };
- use windows_core::{BOOL, Interface, Result, w};
-
- extern "system" fn wnd_proc(hwnd: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT {
- unsafe {
- match msg {
- WM_DESTROY => {
- PostQuitMessage(0);
- LRESULT(0)
- }
- _ => DefWindowProcW(hwnd, msg, wparam, lparam),
- }
- }
- }
-
- unsafe fn create_window(width: u32, height: u32, borderless: bool) -> Result {
- unsafe {
- let instance = GetModuleHandleW(None)?;
- let class_name = w!("FluxerD3D10Fixture");
- let wc = WNDCLASSEXW {
- cbSize: size_of::() as u32,
- style: CS_HREDRAW | CS_VREDRAW,
- lpfnWndProc: Some(wnd_proc),
- hInstance: instance.into(),
- lpszClassName: class_name,
- ..Default::default()
- };
- RegisterClassExW(&wc);
- let style = if borderless {
- WS_POPUP | WS_VISIBLE
- } else {
- WS_OVERLAPPEDWINDOW | WS_VISIBLE
- };
- let hwnd = CreateWindowExW(
- Default::default(),
- class_name,
- w!("Fluxer D3D10 Present Fixture"),
- style,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- width as i32,
- height as i32,
- None,
- None,
- Some(instance.into()),
- None,
- )?;
- let _ = ShowWindow(hwnd, SW_SHOW);
- Ok(hwnd)
- }
- }
-
- struct Renderer {
- device: ID3D10Device,
- swap_chain: IDXGISwapChain,
- rtv: ID3D10RenderTargetView,
- width: u32,
- height: u32,
- staging: ID3D10Texture2D,
- format: DXGI_FORMAT,
- }
-
- impl Renderer {
- unsafe fn new(hwnd: HWND, width: u32, height: u32) -> Result {
- unsafe {
- let mut device: Option = None;
- D3D10CreateDevice(
- None,
- D3D10_DRIVER_TYPE_HARDWARE,
- HMODULE::default(),
- 0,
- D3D10_SDK_VERSION,
- Some(&mut device),
- )?;
- let device = device.expect("D3D10CreateDeviceAndSwapChain yielded no device");
-
- let dxgi_device: IDXGIDevice = device.cast()?;
- let adapter = dxgi_device.GetAdapter()?;
- let factory: IDXGIFactory = adapter.GetParent()?;
- let (swap_chain, format) =
- Self::make_swap_chain(&factory, &device, hwnd, width, height)?;
-
- let rtv = Self::make_rtv(&device, &swap_chain)?;
- let staging = Self::make_staging(&device, width, height, format)?;
-
- Ok(Self {
- device,
- swap_chain,
- rtv,
- width,
- height,
- staging,
- format,
- })
- }
- }
-
- unsafe fn make_swap_chain(
- factory: &IDXGIFactory,
- device: &ID3D10Device,
- hwnd: HWND,
- width: u32,
- height: u32,
- ) -> Result<(IDXGISwapChain, DXGI_FORMAT)> {
- unsafe {
- let mut last = windows_core::HRESULT(0);
- for format in [DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM] {
- let desc = DXGI_SWAP_CHAIN_DESC {
- BufferDesc: DXGI_MODE_DESC {
- Width: width,
- Height: height,
- RefreshRate: DXGI_RATIONAL {
- Numerator: 0,
- Denominator: 0,
- },
- Format: format,
- ..Default::default()
- },
- SampleDesc: DXGI_SAMPLE_DESC {
- Count: 1,
- Quality: 0,
- },
- BufferUsage: DXGI_USAGE_RENDER_TARGET_OUTPUT,
- BufferCount: 1,
- OutputWindow: hwnd,
- Windowed: BOOL(1),
- SwapEffect: DXGI_SWAP_EFFECT_DISCARD,
- Flags: 0,
- };
- let mut swap_chain: Option = None;
- let hr = factory.CreateSwapChain(device, &desc, &mut swap_chain);
- if hr.is_ok() {
- return Ok((
- swap_chain.expect("CreateSwapChain yielded no swapchain"),
- format,
- ));
- }
- last = hr;
- }
- last.ok()?;
- unreachable!()
- }
- }
-
- unsafe fn make_rtv(
- device: &ID3D10Device,
- swap_chain: &IDXGISwapChain,
- ) -> Result {
- unsafe {
- let back_buffer: ID3D10Texture2D = swap_chain.GetBuffer(0)?;
- let resource: ID3D10Resource = back_buffer.cast()?;
- let mut rtv: Option = None;
- device.CreateRenderTargetView(&resource, None, Some(&mut rtv))?;
- Ok(rtv.expect("CreateRenderTargetView yielded no view"))
- }
- }
-
- unsafe fn make_staging(
- device: &ID3D10Device,
- width: u32,
- height: u32,
- format: DXGI_FORMAT,
- ) -> Result {
- use windows::Win32::Graphics::Direct3D10::{
- D3D10_CPU_ACCESS_WRITE, D3D10_TEXTURE2D_DESC, D3D10_USAGE_STAGING,
- };
- unsafe {
- let desc = D3D10_TEXTURE2D_DESC {
- Width: width,
- Height: height,
- MipLevels: 1,
- ArraySize: 1,
- Format: format,
- SampleDesc: DXGI_SAMPLE_DESC {
- Count: 1,
- Quality: 0,
- },
- Usage: D3D10_USAGE_STAGING,
- BindFlags: 0,
- CPUAccessFlags: D3D10_CPU_ACCESS_WRITE.0 as u32,
- MiscFlags: 0,
- };
- device.CreateTexture2D(&desc, None)
- }
- }
-
- unsafe fn render_frame(&self, frame_index: u64) -> Result<()> {
- use windows::Win32::Graphics::Direct3D10::D3D10_MAP_WRITE;
- unsafe {
- let (cr, cg, cb) =
- pattern::BARS[(frame_index % pattern::BARS.len() as u64) as usize];
- let clear = [cr as f32 / 255.0, cg as f32 / 255.0, cb as f32 / 255.0, 1.0];
- self.device.ClearRenderTargetView(&self.rtv, &clear);
-
- let mapped: D3D10_MAPPED_TEXTURE2D = self.staging.Map(0, D3D10_MAP_WRITE, 0)?;
- let row_pitch = mapped.RowPitch as usize;
- let base = mapped.pData as *mut u8;
- let counter = pattern::counter_colour(frame_index);
- let luma = (frame_index & 0xFF) as u8;
- for y in 0..self.height {
- let row = base.add(y as usize * row_pitch);
- for x in 0..self.width {
- let (r, g, b) = if x < pattern::COUNTER_BLOCK && y < pattern::COUNTER_BLOCK
- {
- counter
- } else {
- pattern::bar_colour(x, self.width)
- };
- let px = row.add(x as usize * 4);
- if self.format == DXGI_FORMAT_R8G8B8A8_UNORM {
- *px = r;
- *px.add(1) = g;
- *px.add(2) = b.saturating_add(luma / 4);
- } else {
- *px = b.saturating_add(luma / 4);
- *px.add(1) = g;
- *px.add(2) = r;
- }
- *px.add(3) = 255;
- }
- }
- self.staging.Unmap(0);
-
- let back_buffer: ID3D10Texture2D = self.swap_chain.GetBuffer(0)?;
- let dst: ID3D10Resource = back_buffer.cast()?;
- let src: ID3D10Resource = self.staging.cast()?;
- self.device.CopyResource(&dst, &src);
- self.swap_chain.Present(1, DXGI_PRESENT(0)).ok()?;
- let _ = &self.device;
- Ok(())
- }
- }
- }
-
- pub fn run() -> Result<()> {
- let options = Options::from_env();
- unsafe {
- let hwnd = create_window(options.width, options.height, options.borderless)?;
-
- let mut rect = Default::default();
- let _ = GetClientRect(hwnd, &mut rect);
- let width = ((rect.right - rect.left).max(1)) as u32;
- let height = ((rect.bottom - rect.top).max(1)) as u32;
-
- let renderer = Renderer::new(hwnd, width, height)?;
-
- println!("HWND={}", hwnd.0 as isize);
- use std::io::Write;
- let _ = std::io::stdout().flush();
-
- let mut frame_index: u64 = 0;
- let mut msg = MSG::default();
- loop {
- while PeekMessageW(&mut msg, None, 0, 0, PM_REMOVE).as_bool() {
- if msg.message == WM_QUIT {
- return Ok(());
- }
- let _ = TranslateMessage(&msg);
- DispatchMessageW(&msg);
- }
-
- renderer.render_frame(frame_index)?;
- frame_index += 1;
-
- if let Some(limit) = options.frames {
- if frame_index >= limit {
- return Ok(());
- }
- }
- }
- }
- }
-}
diff --git a/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/Cargo.lock b/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/Cargo.lock
deleted file mode 100644
index 5c3a98846..000000000
--- a/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/Cargo.lock
+++ /dev/null
@@ -1,156 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "d3d11-present-fixture"
-version = "0.0.0"
-dependencies = [
- "windows",
- "windows-core",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
-
-[[package]]
-name = "windows"
-version = "0.62.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
-dependencies = [
- "windows-collections",
- "windows-core",
- "windows-future",
- "windows-numerics",
-]
-
-[[package]]
-name = "windows-collections"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
-dependencies = [
- "windows-core",
-]
-
-[[package]]
-name = "windows-core"
-version = "0.62.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
-dependencies = [
- "windows-implement",
- "windows-interface",
- "windows-link",
- "windows-result",
- "windows-strings",
-]
-
-[[package]]
-name = "windows-future"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
-dependencies = [
- "windows-core",
- "windows-link",
- "windows-threading",
-]
-
-[[package]]
-name = "windows-implement"
-version = "0.60.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-interface"
-version = "0.59.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
-
-[[package]]
-name = "windows-numerics"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
-dependencies = [
- "windows-core",
- "windows-link",
-]
-
-[[package]]
-name = "windows-result"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-strings"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-threading"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
-dependencies = [
- "windows-link",
-]
diff --git a/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/Cargo.toml b/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/Cargo.toml
deleted file mode 100644
index 36b168da7..000000000
--- a/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/Cargo.toml
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-License-Identifier: AGPL-3.0-or-later
-[package]
-name = "d3d11-present-fixture"
-version = "0.0.0"
-edition = "2024"
-license = "AGPL-3.0-or-later"
-publish = false
-
-# Empty workspace table keeps this fixture out of any parent Cargo workspace,
-# matching the sibling crates (hook/, vulkan-layer/) in this package.
-[workspace]
-resolver = "2"
-
-[[bin]]
-name = "d3d11-present-fixture"
-path = "src/main.rs"
-
-[target.'cfg(target_os = "windows")'.dependencies]
-windows = {version = "0.62.2", features = [
- "Win32_Foundation",
- "Win32_Graphics_Direct3D",
- "Win32_Graphics_Direct3D11",
- "Win32_Graphics_Dxgi",
- "Win32_Graphics_Dxgi_Common",
- "Win32_Graphics_Gdi",
- "Win32_System_LibraryLoader",
- "Win32_UI_WindowsAndMessaging",
-]}
-windows-core = "0.62.2"
diff --git a/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/src/main.rs b/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/src/main.rs
deleted file mode 100644
index 7b41da2db..000000000
--- a/fluxer_desktop/native/win-game-capture/test-apps/d3d11-present-fixture/src/main.rs
+++ /dev/null
@@ -1,496 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-#[cfg(not(windows))]
-fn main() {
- eprintln!("d3d11-present-fixture is only functional on Windows");
-}
-
-#[cfg(windows)]
-fn main() -> windows_core::Result<()> {
- windows_impl::run()
-}
-
-#[cfg_attr(not(windows), allow(dead_code))]
-mod pattern {
- pub const BARS: [(u8, u8, u8); 8] = [
- (255, 255, 255),
- (255, 255, 0),
- (0, 255, 255),
- (0, 255, 0),
- (255, 0, 255),
- (255, 0, 0),
- (0, 0, 255),
- (0, 0, 0),
- ];
-
- pub const COUNTER_BLOCK: u32 = 16;
-
- pub fn bar_colour(x: u32, width: u32) -> (u8, u8, u8) {
- let width = width.max(1);
- let index = ((x as u64 * BARS.len() as u64) / width as u64) as usize;
- BARS[index.min(BARS.len() - 1)]
- }
-
- pub fn counter_colour(frame_index: u64) -> (u8, u8, u8) {
- let low = (frame_index & 0x00FF_FFFF) as u32;
- (
- (low & 0xFF) as u8,
- ((low >> 8) & 0xFF) as u8,
- ((low >> 16) & 0xFF) as u8,
- )
- }
-}
-
-#[cfg_attr(not(windows), allow(dead_code))]
-mod cli {
- #[derive(Clone, Copy, Debug, PartialEq, Eq)]
- pub enum PresentFormat {
- Bgra8,
- Rgba8,
- R10G10B10A2,
- Rgba16Float,
- }
-
- impl PresentFormat {
- fn parse(value: &str) -> Option {
- match value {
- "bgra8" | "b8g8r8a8" => Some(Self::Bgra8),
- "rgba8" | "r8g8b8a8" => Some(Self::Rgba8),
- "r10g10b10a2" | "rgb10a2" | "10bit" => Some(Self::R10G10B10A2),
- "rgba16f" | "r16g16b16a16f" | "fp16" => Some(Self::Rgba16Float),
- _ => None,
- }
- }
- }
-
- pub struct Options {
- pub frames: Option,
- pub width: u32,
- pub height: u32,
- pub borderless: bool,
- pub format: PresentFormat,
- }
-
- impl Default for Options {
- fn default() -> Self {
- Self {
- frames: None,
- width: 1280,
- height: 720,
- borderless: false,
- format: PresentFormat::Bgra8,
- }
- }
- }
-
- impl Options {
- pub fn from_env() -> Self {
- let mut options = Options::default();
- let mut args = std::env::args().skip(1);
- while let Some(arg) = args.next() {
- match arg.as_str() {
- "--frames" => {
- if let Some(value) = args.next().and_then(|v| v.parse().ok()) {
- options.frames = Some(value);
- }
- }
- "--width" => {
- if let Some(value) = args.next().and_then(|v| v.parse().ok()) {
- options.width = value;
- }
- }
- "--height" => {
- if let Some(value) = args.next().and_then(|v| v.parse().ok()) {
- options.height = value;
- }
- }
- "--borderless" => options.borderless = true,
- "--windowed" => options.borderless = false,
- "--format" => {
- if let Some(format) = args.next().and_then(|v| PresentFormat::parse(&v)) {
- options.format = format;
- }
- }
- _ => {}
- }
- }
- options
- }
- }
-
- #[cfg(test)]
- mod tests {
- use super::PresentFormat;
-
- #[test]
- fn parses_explicit_format_modes() {
- assert_eq!(PresentFormat::parse("bgra8"), Some(PresentFormat::Bgra8));
- assert_eq!(PresentFormat::parse("rgba8"), Some(PresentFormat::Rgba8));
- assert_eq!(
- PresentFormat::parse("r10g10b10a2"),
- Some(PresentFormat::R10G10B10A2)
- );
- assert_eq!(
- PresentFormat::parse("fp16"),
- Some(PresentFormat::Rgba16Float)
- );
- assert_eq!(PresentFormat::parse("unknown"), None);
- }
- }
-}
-
-#[cfg(windows)]
-mod windows_impl {
- use super::{
- cli::{Options, PresentFormat},
- pattern,
- };
- use windows::Win32::Foundation::{HMODULE, HWND, LPARAM, LRESULT, WPARAM};
- use windows::Win32::Graphics::Direct3D::D3D_DRIVER_TYPE_HARDWARE;
- use windows::Win32::Graphics::Direct3D11::{
- D3D11_CREATE_DEVICE_BGRA_SUPPORT, D3D11_MAPPED_SUBRESOURCE, D3D11_SDK_VERSION,
- D3D11CreateDevice, ID3D11Device, ID3D11DeviceContext, ID3D11RenderTargetView,
- ID3D11Resource, ID3D11Texture2D,
- };
- use windows::Win32::Graphics::Dxgi::Common::{
- DXGI_ALPHA_MODE_IGNORE, DXGI_FORMAT, DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_SAMPLE_DESC,
- };
- use windows::Win32::Graphics::Dxgi::{
- DXGI_SCALING_STRETCH, DXGI_SWAP_CHAIN_DESC1, DXGI_SWAP_EFFECT_FLIP_DISCARD,
- DXGI_USAGE_RENDER_TARGET_OUTPUT, IDXGIDevice, IDXGIFactory2, IDXGISwapChain1,
- };
- use windows::Win32::System::LibraryLoader::GetModuleHandleW;
- use windows::Win32::UI::WindowsAndMessaging::{
- CS_HREDRAW, CS_VREDRAW, CW_USEDEFAULT, CreateWindowExW, DefWindowProcW, DispatchMessageW,
- GetClientRect, MSG, PM_REMOVE, PeekMessageW, PostQuitMessage, RegisterClassExW, SW_SHOW,
- ShowWindow, TranslateMessage, WM_DESTROY, WM_QUIT, WNDCLASSEXW, WS_OVERLAPPEDWINDOW,
- WS_POPUP, WS_VISIBLE,
- };
- use windows_core::{Interface, Result, w};
-
- impl PresentFormat {
- fn dxgi(self) -> DXGI_FORMAT {
- match self {
- PresentFormat::Bgra8 => DXGI_FORMAT_B8G8R8A8_UNORM,
- PresentFormat::Rgba8 => DXGI_FORMAT_R8G8B8A8_UNORM,
- PresentFormat::R10G10B10A2 => DXGI_FORMAT_R10G10B10A2_UNORM,
- PresentFormat::Rgba16Float => DXGI_FORMAT_R16G16B16A16_FLOAT,
- }
- }
-
- fn bytes_per_pixel(self) -> usize {
- match self {
- PresentFormat::Bgra8 | PresentFormat::Rgba8 | PresentFormat::R10G10B10A2 => 4,
- PresentFormat::Rgba16Float => 8,
- }
- }
- }
-
- extern "system" fn wnd_proc(hwnd: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT {
- unsafe {
- match msg {
- WM_DESTROY => {
- PostQuitMessage(0);
- LRESULT(0)
- }
- _ => DefWindowProcW(hwnd, msg, wparam, lparam),
- }
- }
- }
-
- unsafe fn create_window(width: u32, height: u32, borderless: bool) -> Result {
- unsafe {
- let instance = GetModuleHandleW(None)?;
- let class_name = w!("FluxerD3D11Fixture");
- let wc = WNDCLASSEXW {
- cbSize: size_of::() as u32,
- style: CS_HREDRAW | CS_VREDRAW,
- lpfnWndProc: Some(wnd_proc),
- hInstance: instance.into(),
- lpszClassName: class_name,
- ..Default::default()
- };
- RegisterClassExW(&wc);
- let style = if borderless {
- WS_POPUP | WS_VISIBLE
- } else {
- WS_OVERLAPPEDWINDOW | WS_VISIBLE
- };
- let hwnd = CreateWindowExW(
- Default::default(),
- class_name,
- w!("Fluxer D3D11 Present Fixture"),
- style,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- width as i32,
- height as i32,
- None,
- None,
- Some(instance.into()),
- None,
- )?;
- let _ = ShowWindow(hwnd, SW_SHOW);
- Ok(hwnd)
- }
- }
-
- struct Renderer {
- device: ID3D11Device,
- context: ID3D11DeviceContext,
- swap_chain: IDXGISwapChain1,
- rtv: ID3D11RenderTargetView,
- width: u32,
- height: u32,
- staging: ID3D11Texture2D,
- format: PresentFormat,
- }
-
- impl Renderer {
- unsafe fn new(hwnd: HWND, width: u32, height: u32, format: PresentFormat) -> Result {
- unsafe {
- let mut device: Option = None;
- let mut context: Option = None;
- D3D11CreateDevice(
- None,
- D3D_DRIVER_TYPE_HARDWARE,
- HMODULE::default(),
- D3D11_CREATE_DEVICE_BGRA_SUPPORT,
- None,
- D3D11_SDK_VERSION,
- Some(&mut device),
- None,
- Some(&mut context),
- )?;
- let device = device.expect("D3D11CreateDevice yielded no device");
- let context = context.expect("D3D11CreateDevice yielded no context");
-
- let dxgi_device: IDXGIDevice = device.cast()?;
- let adapter = dxgi_device.GetAdapter()?;
- let factory: IDXGIFactory2 = adapter.GetParent()?;
-
- let desc = DXGI_SWAP_CHAIN_DESC1 {
- Width: width,
- Height: height,
- Format: format.dxgi(),
- Stereo: false.into(),
- SampleDesc: DXGI_SAMPLE_DESC {
- Count: 1,
- Quality: 0,
- },
- BufferUsage: DXGI_USAGE_RENDER_TARGET_OUTPUT,
- BufferCount: 2,
- Scaling: DXGI_SCALING_STRETCH,
- SwapEffect: DXGI_SWAP_EFFECT_FLIP_DISCARD,
- AlphaMode: DXGI_ALPHA_MODE_IGNORE,
- Flags: 0,
- };
- let swap_chain =
- factory.CreateSwapChainForHwnd(&device, hwnd, &desc, None, None)?;
-
- let rtv = Self::make_rtv(&device, &swap_chain)?;
- let staging = Self::make_staging(&device, width, height, format)?;
-
- Ok(Self {
- device,
- context,
- swap_chain,
- rtv,
- width,
- height,
- staging,
- format,
- })
- }
- }
-
- unsafe fn make_rtv(
- device: &ID3D11Device,
- swap_chain: &IDXGISwapChain1,
- ) -> Result {
- unsafe {
- let back_buffer: ID3D11Texture2D = swap_chain.GetBuffer(0)?;
- let resource: ID3D11Resource = back_buffer.cast()?;
- let mut rtv: Option = None;
- device.CreateRenderTargetView(&resource, None, Some(&mut rtv))?;
- Ok(rtv.expect("CreateRenderTargetView yielded no view"))
- }
- }
-
- unsafe fn make_staging(
- device: &ID3D11Device,
- width: u32,
- height: u32,
- format: PresentFormat,
- ) -> Result {
- use windows::Win32::Graphics::Direct3D11::{
- D3D11_CPU_ACCESS_WRITE, D3D11_TEXTURE2D_DESC, D3D11_USAGE_STAGING,
- };
- unsafe {
- let desc = D3D11_TEXTURE2D_DESC {
- Width: width,
- Height: height,
- MipLevels: 1,
- ArraySize: 1,
- Format: format.dxgi(),
- SampleDesc: DXGI_SAMPLE_DESC {
- Count: 1,
- Quality: 0,
- },
- Usage: D3D11_USAGE_STAGING,
- BindFlags: 0,
- CPUAccessFlags: D3D11_CPU_ACCESS_WRITE.0 as u32,
- MiscFlags: 0,
- };
- let mut staging: Option