Files
brenden 682afacd30 Add native self-hosted instance connection to fluxer_desktop
Trimmed monorepo checkout (fluxer_desktop + packages/voice_engine_v2 +
tools/ci) with a "Connect to a Different Server" menu item and popout
that lets the desktop app switch to any self-hosted Fluxer instance,
plus fixes for well-known discovery on single-domain self-hosted
deployments and a false-positive ERR_ABORTED on same-origin client
redirects during the switch. Defaults to chat.fluxr.chat and uses an
isolated userData directory from the official build.
2026-07-01 18:22:43 -04:00

163 lines
32 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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<AudioFrame>;\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<AudioFrame<'_>>;\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<AudioFrame>;\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<AudioFrame<'_>>;\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\nELIFECYCLE Command failed with exit code 1.\nWARN 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"
}
]
}