diff --git a/containerfiles/runner.Containerfile b/containerfiles/runner.Containerfile index c4484526..f3e9ef5c 100644 --- a/containerfiles/runner.Containerfile +++ b/containerfiles/runner.Containerfile @@ -86,7 +86,7 @@ RUN --mount=type=cache,target=/var/cache/pacman/pkg \ libxkbcommon wayland gstreamer gst-plugins-base gst-plugins-good libinput # Clone repository -RUN git clone --depth 1 -b "dev-dmabuf" https://github.com/DatCaptainHorse/gst-wayland-display.git +RUN git clone --depth 1 --rev "dfeebb19b48f32207469e166a3955f5d65b5e6c6" https://github.com/games-on-whales/gst-wayland-display.git #-------------------------------------------------------------------- FROM gst-wayland-deps AS gst-wayland-planner @@ -121,58 +121,50 @@ RUN --mount=type=cache,target=${CARGO_HOME}/registry \ #****************************************************************************** FROM base AS runtime -### System Configuration ### -RUN sed -i \ - -e '/#\[multilib\]/,/#Include = \/etc\/pacman.d\/mirrorlist/ s/#//' \ - -e "s/#Color/Color/" /etc/pacman.conf && \ - pacman --noconfirm -Sy archlinux-keyring && \ - dirmngr /dev/null 2>&1 - ### Package Installation ### # Core system components RUN --mount=type=cache,target=/var/cache/pacman/pkg \ pacman -Sy --needed --noconfirm \ vulkan-intel lib32-vulkan-intel vpl-gpu-rt \ vulkan-radeon lib32-vulkan-radeon \ - mesa \ - steam steam-native-runtime proton-cachyos gtk3 lib32-gtk3 \ + mesa steam-native-runtime proton-cachyos lib32-mesa \ + steam gtk3 lib32-gtk3 \ sudo xorg-xwayland seatd libinput gamescope mangohud wlr-randr \ libssh2 curl wget \ pipewire pipewire-pulse pipewire-alsa wireplumber \ noto-fonts-cjk supervisor jq chwd lshw pacman-contrib \ - openssh && \ + hwdata openssh \ # GStreamer stack - pacman -Sy --needed --noconfirm \ gstreamer gst-plugins-base gst-plugins-good \ gst-plugins-bad gst-plugin-pipewire \ gst-plugin-webrtchttp gst-plugin-rswebrtc gst-plugin-rsrtp \ - gst-plugin-va gst-plugin-qsv && \ + gst-plugin-va gst-plugin-qsv \ # lib32 GStreamer stack to fix some games with videos - pacman -Sy --needed --noconfirm \ lib32-gstreamer lib32-gst-plugins-base lib32-gst-plugins-good && \ # Cleanup paccache -rk1 && \ rm -rf /usr/share/{info,man,doc}/* ### User Configuration ### -ENV USER="nestri" \ - UID=1000 \ - GID=1000 \ - USER_PWD="nestri1234" \ - XDG_RUNTIME_DIR=/run/user/1000 \ - HOME=/home/nestri \ +ARG NESTRI_USER_PWD="" +ENV NESTRI_USER="nestri" \ + NESTRI_UID=1000 \ + NESTRI_GID=1000 \ + NESTRI_LANG=en_US.UTF-8 \ + NESTRI_XDG_RUNTIME_DIR=/run/user/1000 \ + NESTRI_HOME=/home/nestri \ NVIDIA_DRIVER_CAPABILITIES=all -RUN mkdir -p /home/${USER} && \ - groupadd -g ${GID} ${USER} && \ - useradd -d /home/${USER} -u ${UID} -g ${GID} -s /bin/bash ${USER} && \ - chown -R ${USER}:${USER} /home/${USER} && \ - echo "${USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \ - echo "${USER}:${USER_PWD}" | chpasswd && \ - mkdir -p /run/user/${UID} && \ - chown ${USER}:${USER} /run/user/${UID} && \ - usermod -aG input,video,render,seat root && \ - usermod -aG input,video,render,seat ${USER} +RUN mkdir -p "/home/${NESTRI_USER}" && \ + groupadd -g "${NESTRI_GID}" "${NESTRI_USER}" && \ + useradd -d "/home/${NESTRI_USER}" -u "${NESTRI_UID}" -g "${NESTRI_GID}" -s /bin/bash "${NESTRI_USER}" && \ + echo "${NESTRI_USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \ + NESTRI_USER_PWD="${NESTRI_USER_PWD:-$(openssl rand -base64 12)}" && \ + echo "Setting password for ${NESTRI_USER} as: ${NESTRI_USER_PWD}" && \ + echo "${NESTRI_USER}:${NESTRI_USER_PWD}" | chpasswd && \ + mkdir -p "${NESTRI_XDG_RUNTIME_DIR}" && \ + chown "${NESTRI_USER}:${NESTRI_USER}" "${NESTRI_XDG_RUNTIME_DIR}" && \ + usermod -aG input,video,render,seat "${NESTRI_USER}" ### System Services Configuration ### RUN mkdir -p /run/dbus && \ @@ -182,29 +174,17 @@ RUN mkdir -p /run/dbus && \ -e '/wants = \[/{s/hooks\.node\.suspend\s*//; s/,\s*\]/]/}' \ /usr/share/wireplumber/wireplumber.conf -### PipeWire Latency Optimizations (1-5ms instead of 20ms) ### +### Audio Systems Configs - Latency optimizations + Loopback ### RUN mkdir -p /etc/pipewire/pipewire.conf.d && \ - echo "[audio]\ - \n default.clock.rate = 48000\ - \n default.clock.quantum = 128\ - \n default.clock.min-quantum = 128\ - \n default.clock.max-quantum = 256" > /etc/pipewire/pipewire.conf.d/low-latency.conf && \ - mkdir -p /etc/wireplumber/main.lua.d && \ - echo 'table.insert(default_nodes.rules, {\ - \n matches = { { { "node.name", "matches", ".*" } } },\ - \n apply_properties = {\ - \n ["audio.format"] = "S16LE",\ - \n ["audio.rate"] = 48000,\ - \n ["audio.channels"] = 2,\ - \n ["api.alsa.period-size"] = 128,\ - \n ["api.alsa.headroom"] = 0,\ - \n ["session.suspend-timeout-seconds"] = 0\ - \n }\ - \n})' > /etc/wireplumber/main.lua.d/50-low-latency.lua && \ - echo "default-fragments = 2\ - \ndefault-fragment-size-msec = 2" >> /etc/pulse/daemon.conf && \ - echo "load-module module-loopback latency_msec=1" >> /etc/pipewire/pipewire.conf.d/loopback.conf + mkdir -p /etc/wireplumber/wireplumber.conf.d +COPY packages/configs/wireplumber.conf.d/* /etc/wireplumber/wireplumber.conf.d/ +COPY packages/configs/pipewire.conf.d/* /etc/pipewire/pipewire.conf.d/ + +## Steam Configs - Proton (CachyOS flavor) ## +RUN mkdir -p "${NESTRI_HOME}/.local/share/Steam/config" + +COPY packages/configs/steam/config.vdf "${NESTRI_HOME}/.local/share/Steam/config/" ### Artifacts and Verification ### COPY --from=nestri-server-cached-builder /artifacts/nestri-server /usr/bin/ @@ -215,6 +195,10 @@ RUN which nestri-server && ls -la /usr/lib/ | grep 'gstwaylanddisplay' ### Scripts and Final Configuration ### COPY packages/scripts/ /etc/nestri/ RUN chmod +x /etc/nestri/{envs.sh,entrypoint*.sh} && \ - locale-gen + chown -R "${NESTRI_USER}:${NESTRI_USER}" "${NESTRI_HOME}" && \ + sed -i 's/^#\(en_US\.UTF-8\)/\1/' /etc/locale.gen && \ + LANG=en_US.UTF-8 locale-gen +# Root for most container engines, nestri-user compatible for apptainer without fakeroot +USER root ENTRYPOINT ["supervisord", "-c", "/etc/nestri/supervisord.conf"] diff --git a/packages/configs/pipewire.conf.d/nestri-loopback.conf b/packages/configs/pipewire.conf.d/nestri-loopback.conf new file mode 100644 index 00000000..f7e647bf --- /dev/null +++ b/packages/configs/pipewire.conf.d/nestri-loopback.conf @@ -0,0 +1,16 @@ +context.modules = [ + { + name = libpipewire-module-loopback + args = { + node.description = "Loopback" + capture.props = { + node.name = "Loopback Capture" + media.class = "Audio/Sink" + } + playback.props = { + node.name = "Loopback Playback" + media.class = "Audio/Source" + } + } + } +] \ No newline at end of file diff --git a/packages/configs/pipewire.conf.d/nestri-low-latency.conf b/packages/configs/pipewire.conf.d/nestri-low-latency.conf new file mode 100644 index 00000000..768d6c59 --- /dev/null +++ b/packages/configs/pipewire.conf.d/nestri-low-latency.conf @@ -0,0 +1,7 @@ +context.properties = { + default.clock.rate = 48000 + default.clock.allowed-rates = [48000] + default.clock.min-quantum = 128 + default.clock.max-quantum = 256 + default.clock.quantum = 128 +} \ No newline at end of file diff --git a/packages/configs/steam/config.vdf b/packages/configs/steam/config.vdf new file mode 100644 index 00000000..cfebdb65 --- /dev/null +++ b/packages/configs/steam/config.vdf @@ -0,0 +1,21 @@ +"InstallConfigStore" +{ + "Software" + { + "Valve" + { + "Steam" + { + "CompatToolMapping" + { + "0" + { + "name" "proton-cachyos" + "config" "" + "priority" "75" + } + } + } + } + } +} diff --git a/packages/configs/wireplumber.conf.d/nestri-low-latency.conf b/packages/configs/wireplumber.conf.d/nestri-low-latency.conf new file mode 100644 index 00000000..ae37de2d --- /dev/null +++ b/packages/configs/wireplumber.conf.d/nestri-low-latency.conf @@ -0,0 +1,30 @@ +{ + "wireplumber.rules": [ + { + "description": "Global audio format and rate for audio nodes", + "matches": [ + { "media.class": "Audio/Sink" }, + { "media.class": "Audio/Source" } + ], + "apply_properties": { + "audio.format": "F32P", + "audio.rate": 48000, + "audio.channels": 2, + "session.suspend-timeout-seconds": 0 + } + }, + + { + "description": "PulseAudio bridge specific tweaks", + "matches": [ + { "node.name": "pulse_sink" }, + { "node.name": "pulse_source" } + ], + "apply_properties": { + "pulse.min.req": 128, + "pulse.max.req": 256, + "pulse.idle.timeout": 0 + } + } + ] +} diff --git a/packages/scripts/common.sh b/packages/scripts/common.sh new file mode 100644 index 00000000..fdc13d11 --- /dev/null +++ b/packages/scripts/common.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +function log { + printf '[%s] %s\n' "$(date +'%Y-%m-%d %H:%M:%S')" "$*" +} + +if [[ ! -f /etc/nestri/envs.sh ]]; then + log "Error: Environment variables script not found at /etc/nestri/envs.sh" + exit 1 +fi +source /etc/nestri/envs.sh || { log "Error: Failed to source /etc/nestri/envs.sh"; exit 1; } + +if [[ ! -f /etc/nestri/container_helpers.sh ]]; then + log "Error: Container helpers script not found at /etc/nestri/container_helpers.sh" + exit 1 +fi +source /etc/nestri/container_helpers.sh || { log "Error: Failed to source /etc/nestri/container_helpers.sh"; exit 1; } + +if [[ ! -f /etc/nestri/gpu_helpers.sh ]]; then + log "Error: GPU helpers script not found at /etc/nestri/gpu_helpers.sh" + exit 1 +fi +source /etc/nestri/gpu_helpers.sh || { log "Error: Failed to source /etc/nestri/gpu_helpers.sh"; exit 1; } diff --git a/packages/scripts/container_helpers.sh b/packages/scripts/container_helpers.sh new file mode 100644 index 00000000..05ab2f97 --- /dev/null +++ b/packages/scripts/container_helpers.sh @@ -0,0 +1,79 @@ +#!/bin/bash +set -euo pipefail + +declare container_runtime="none" +declare -Ag container_info=() + +function detect_container_runtime { + if [[ -n "${SINGULARITY_CONTAINER:-}" ]] || [[ -n "${APPTAINER_CONTAINER:-}" ]] || [[ -d "/.singularity.d" ]]; then + echo "apptainer" + elif [[ "${container:-}" == "podman" ]] || [[ -f "/run/.containerenv" ]]; then + echo "podman" + elif [[ -f "/.dockerenv" ]]; then + echo "docker" + else + # General check for containerization signs + if grep -qE "docker|lxc|kubepods|containerd" "/proc/1/cgroup" 2>/dev/null; then + echo "unknown" + else + echo "none" + fi + fi +} + +function collect_container_info { + local runtime="$1" + case "$runtime" in + apptainer) + container_info["runtime"]="apptainer" + container_info["version"]="${SINGULARITY_VERSION:-${APPTAINER_VERSION:-unknown}}" + container_info["image"]="${SINGULARITY_CONTAINER:-${APPTAINER_CONTAINER:-unknown}}" + ;; + podman) + container_info["runtime"]="podman" + if [[ -f "/run/.containerenv" ]]; then + if grep -q "name=" "/run/.containerenv" 2>/dev/null; then + container_info["name"]=$(grep "^name=" "/run/.containerenv" | sed 's/^name=//' | tr -d '"' | xargs) + fi + if grep -q "image=" "/run/.containerenv" 2>/dev/null; then + container_info["image"]=$(grep "^image=" "/run/.containerenv" | sed 's/^image=//' | tr -d '"' | xargs) + fi + fi + ;; + docker) + container_info["runtime"]="docker" + container_info["detected_via"]="dockerenv" + ;; + unknown) + container_info["runtime"]="unknown" + container_info["detected_via"]="cgroup_generic" + ;; + esac +} + +function get_container_info { + container_runtime=$(detect_container_runtime) + if [[ "${container_runtime}" != "none" ]]; then + collect_container_info "$container_runtime" + fi +} + +function debug_container_info { + echo "Container Detection Results:" + echo "> Runtime: $container_runtime" + + if [[ "$container_runtime" != "none" ]]; then + for key in "${!container_info[@]}"; do + echo ">> $key: ${container_info[$key]}" + done + else + echo "> Status: Not running in a known container" + fi +} + +# # Usage examples: +# get_container_info +# debug_container_info + +# # Get runtime +# echo "Container runtime: ${container_runtime}" diff --git a/packages/scripts/entrypoint.sh b/packages/scripts/entrypoint.sh index 5599a6e7..304ed5ed 100644 --- a/packages/scripts/entrypoint.sh +++ b/packages/scripts/entrypoint.sh @@ -1,20 +1,24 @@ #!/bin/bash set -euo pipefail +# Common helpers as requirement +if [[ -f /etc/nestri/common.sh ]]; then + source /etc/nestri/common.sh +else + echo "Error: Common script not found at /etc/nestri/common.sh" >&2 + exit 1 +fi + # Configuration -CACHE_DIR="/home/nestri/.cache/nvidia" +CACHE_DIR="${NESTRI_HOME}/.cache/nestri" NVIDIA_INSTALLER_DIR="/tmp" TIMEOUT_SECONDS=10 - -log() { - echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" -} +ENTCMD_PREFIX="" # Ensures user directory ownership chown_user_directory() { - local user_group="${USER}:${GID}" - if ! chown -h --no-preserve-root "$user_group" "${HOME}" 2>/dev/null; then - echo "Error: Failed to change ownership of ${HOME} to ${user_group}" >&2 + if ! $ENTCMD_PREFIX chown "${NESTRI_USER}:${NESTRI_USER}" "${NESTRI_HOME}" 2>/dev/null; then + echo "Error: Failed to change ownership of ${NESTRI_HOME} to ${NESTRI_USER}:${NESTRI_USER}" >&2 return 1 fi return 0 @@ -38,8 +42,8 @@ wait_for_socket() { # Prepares environment for namespace-less applications (like Steam) setup_namespaceless() { - rm -f /run/systemd/container || true - mkdir -p /run/pressure-vessel || true + $ENTCMD_PREFIX rm -f /run/systemd/container || true + $ENTCMD_PREFIX mkdir -p /run/pressure-vessel || true } # Ensures cache directory exists @@ -49,7 +53,7 @@ setup_cache() { log "Warning: Failed to create cache directory, continuing without cache." return 1 } - chown nestri:nestri "$CACHE_DIR" 2>/dev/null || { + $ENTCMD_PREFIX chown "${NESTRI_USER}:${NESTRI_USER}" "$CACHE_DIR" 2>/dev/null || { log "Warning: Failed to set cache directory ownership, continuing..." } } @@ -94,7 +98,7 @@ get_nvidia_installer() { # Cache the downloaded file cp "$tmp_file" "$cached_file" 2>/dev/null && \ - chown nestri:nestri "$cached_file" 2>/dev/null || \ + $ENTCMD_PREFIX chown "${NESTRI_USER}:${NESTRI_USER}" "$cached_file" 2>/dev/null || \ log "Warning: Failed to cache NVIDIA driver, continuing..." fi @@ -109,7 +113,7 @@ get_nvidia_installer() { install_nvidia_driver() { local filename="$1" log "Installing NVIDIA driver components from $filename..." - bash ./"$filename" \ + $ENTCMD_PREFIX bash ./"$filename" \ --silent \ --skip-depmod \ --skip-module-unload \ @@ -120,24 +124,32 @@ install_nvidia_driver() { --no-systemd \ --no-rpms \ --no-backup \ + --no-distro-scripts \ + --no-libglx-indirect \ + --no-install-libglvnd \ --no-check-for-alternate-installs || { log "Error: NVIDIA driver installation failed." return 1 } - # Install CUDA package - log "Checking if CUDA is already installed" - if ! pacman -Q cuda &>/dev/null; then - log "Installing CUDA package" - pacman -S --noconfirm cuda --assume-installed opencl-nvidia - else - log "CUDA package is already installed, skipping" - fi - log "NVIDIA driver installation completed." return 0 } +log_container_info() { + if ! declare -p container_runtime &>/dev/null; then + log "Warning: container_runtime is not defined" + return + fi + + if [[ "${container_runtime:-none}" != "none" ]]; then + log "Detected container:" + log "> ${container_runtime}" + else + log "No container runtime detected" + fi +} + log_gpu_info() { if ! declare -p vendor_devices &>/dev/null; then log "Warning: vendor_devices array is not defined" @@ -164,23 +176,17 @@ configure_ssh() { log "Configuring SSH server on port ${SSH_ENABLE_PORT} with public key authentication" # Ensure SSH host keys exist - ssh-keygen -A 2>/dev/null || { + $ENTCMD_PREFIX ssh-keygen -A 2>/dev/null || { log "Error: Failed to generate SSH host keys" return 1 } # Create .ssh directory and authorized_keys file for nestri user - mkdir -p /home/nestri/.ssh - echo "${SSH_ALLOWED_KEY}" > /home/nestri/.ssh/authorized_keys - chmod 700 /home/nestri/.ssh - chmod 600 /home/nestri/.ssh/authorized_keys - chown -R nestri:nestri /home/nestri/.ssh - - # Update SSHD config - sed -i -E "s/^#?Port .*/Port ${SSH_ENABLE_PORT}/" /etc/ssh/sshd_config || { - log "Error: Failed to update SSH port configuration" - return 1 - } + mkdir -p "${NESTRI_HOME}/.ssh" + echo "${SSH_ALLOWED_KEY}" > "${NESTRI_HOME}/.ssh/authorized_keys" + chmod 700 "${NESTRI_HOME}/.ssh" + chmod 600 "${NESTRI_HOME}/.ssh/authorized_keys" + chown -R "${NESTRI_USER}:${NESTRI_USER}" "${NESTRI_HOME}/.ssh" # Configure secure SSH settings { @@ -190,12 +196,14 @@ configure_ssh() { echo "UsePAM no" echo "PubkeyAuthentication yes" } | while read -r line; do - grep -qF "$line" /etc/ssh/sshd_config || echo "$line" >> /etc/ssh/sshd_config + if ! grep -qF "$line" /etc/ssh/sshd_config; then + printf '%s\n' "$line" | $ENTCMD_PREFIX tee -a /etc/ssh/sshd_config >/dev/null + fi done # Start SSH server log "Starting SSH server on port ${SSH_ENABLE_PORT}" - /usr/sbin/sshd -D -p "${SSH_ENABLE_PORT}" & + $ENTCMD_PREFIX /usr/sbin/sshd -D -p "${SSH_ENABLE_PORT}" & SSH_PID=$! # Verify the process started @@ -209,6 +217,20 @@ configure_ssh() { } main() { + # Wait for required sockets + wait_for_socket "${NESTRI_XDG_RUNTIME_DIR}/dbus-1" "DBus" || exit 1 + wait_for_socket "${NESTRI_XDG_RUNTIME_DIR}/pipewire-0" "PipeWire" || exit 1 + + # Start by getting the container we are running under + get_container_info || { + log "Warning: Failed to detect container information." + } + log_container_info + + if [[ "$container_runtime" != "apptainer" ]]; then + ENTCMD_PREFIX="sudo -E" + fi + # Configure SSH if [ -n "${SSH_ENABLE_PORT+x}" ] && [ "${SSH_ENABLE_PORT:-0}" -ne 0 ] && \ [ -n "${SSH_ALLOWED_KEY+x}" ] && [ -n "${SSH_ALLOWED_KEY}" ]; then @@ -220,17 +242,7 @@ main() { log "SSH not configured (missing SSH_ENABLE_PORT or SSH_ALLOWED_KEY)" fi - # Wait for required sockets - wait_for_socket "/run/dbus/system_bus_socket" "DBus" || exit 1 - wait_for_socket "/run/user/${UID}/pipewire-0" "PipeWire" || exit 1 - - # Load GPU helpers and detect GPU - log "Detecting GPU vendor..." - if [[ ! -f /etc/nestri/gpu_helpers.sh ]]; then - log "Error: GPU helpers script not found at /etc/nestri/gpu_helpers.sh." - exit 1 - fi - source /etc/nestri/gpu_helpers.sh + # Get and detect GPU(s) get_gpu_info || { log "Error: Failed to detect GPU information." exit 1 @@ -307,20 +319,26 @@ main() { log "Ensuring user directory permissions..." chown_user_directory || exit 1 - # Setup namespaceless env - log "Applying namespace-less configuration" - setup_namespaceless + # Setup namespaceless env if needed for container runtime + if [[ "$container_runtime" != "podman" ]]; then + log "Applying namespace-less configuration" + setup_namespaceless + fi - # Switch to nestri user - log "Switching to nestri user for application startup..." - if [[ ! -x /etc/nestri/entrypoint_nestri.sh ]]; then - log "Error: Entry point script /etc/nestri/entrypoint_nestri.sh not found or not executable." + # Switch to nestri runner entrypoint + log "Switching to application startup entrypoint..." + if [[ ! -f /etc/nestri/entrypoint_nestri.sh ]]; then + log "Error: Application entrypoint script /etc/nestri/entrypoint_nestri.sh not found" exit 1 fi - exec sudo -E -u nestri /etc/nestri/entrypoint_nestri.sh + if [[ "$container_runtime" == "apptainer" ]]; then + exec /etc/nestri/entrypoint_nestri.sh + else + exec sudo -E -u "${NESTRI_USER}" /etc/nestri/entrypoint_nestri.sh + fi } # Trap signals for clean exit trap 'log "Received termination signal, exiting..."; exit 1' SIGINT SIGTERM -main \ No newline at end of file +main diff --git a/packages/scripts/entrypoint_nestri.sh b/packages/scripts/entrypoint_nestri.sh index 5955dd27..9f58b052 100644 --- a/packages/scripts/entrypoint_nestri.sh +++ b/packages/scripts/entrypoint_nestri.sh @@ -1,8 +1,12 @@ #!/bin/bash -log() { - echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" -} +# Common helpers as requirement +if [[ -f /etc/nestri/common.sh ]]; then + source /etc/nestri/common.sh +else + echo "Error: Common script not found at /etc/nestri/common.sh" >&2 + exit 1 +fi # Parses resolution string parse_resolution() { @@ -23,20 +27,10 @@ parse_resolution() { return 0 } -# Loads environment variables -load_envs() { - if [[ -f /etc/nestri/envs.sh ]]; then - log "Sourcing environment variables from envs.sh..." - source /etc/nestri/envs.sh - else - log "Error: envs.sh not found at /etc/nestri/envs.sh" - exit 1 - fi -} - # Configuration MAX_RETRIES=3 RETRY_COUNT=0 +WAYLAND_READY_DELAY=3 # Kills process if running kill_if_running() { @@ -125,15 +119,15 @@ start_nestri_server() { WAYLAND_SOCKET="${XDG_RUNTIME_DIR}/wayland-1" for ((i=1; i<=15; i++)); do if [[ -e "$WAYLAND_SOCKET" ]]; then - log "Wayland display 'wayland-1' ready." - sleep 3 + log "Wayland display 'wayland-1' ready" + sleep "${WAYLAND_READY_DELAY:-3}" start_compositor return fi sleep 1 done - log "Error: Wayland display 'wayland-1' not available." + log "Error: Wayland display 'wayland-1' not available" # Workaround for gstreamer being bit slow at times log "Clearing gstreamer cache.." @@ -156,8 +150,8 @@ start_compositor() { NESTRI_LAUNCH_COMPOSITOR="gamescope --backend wayland --force-grab-cursor -g -f --rt --mangoapp -W ${WIDTH} -H ${HEIGHT} -r ${FRAMERATE:-60}" fi - # Start Steam patcher only if Steam command is present - if [[ -n "${NESTRI_LAUNCH_CMD}" ]] && [[ "$NESTRI_LAUNCH_CMD" == *"steam"* ]]; then + # Start Steam patcher only if Steam command is present and if needed for container runtime + if [[ -n "${NESTRI_LAUNCH_CMD}" ]] && [[ "$NESTRI_LAUNCH_CMD" == *"steam"* ]] && [[ "${container_runtime:-}" != "podman" ]]; then start_steam_namespaceless_patcher fi @@ -200,17 +194,23 @@ start_compositor() { local OUTPUT_NAME OUTPUT_NAME=$(WAYLAND_DISPLAY=wayland-0 wlr-randr --json | jq -r '.[] | select(.enabled == true) | .name' | head -n 1) if [ -z "$OUTPUT_NAME" ]; then - log "Warning: No enabled outputs detected. Skipping wlr-randr resolution patch." + log "Warning: No enabled outputs detected. Skipping wlr-randr resolution patch" return fi WAYLAND_DISPLAY=wayland-0 wlr-randr --output "$OUTPUT_NAME" --custom-mode "$WIDTH"x"$HEIGHT" - log "Patched resolution with wlr-randr." + log "Patched resolution with wlr-randr" + + if [[ -n "${NESTRI_LAUNCH_CMD}" ]]; then + log "Starting application: $NESTRI_LAUNCH_CMD" + WAYLAND_DISPLAY=wayland-0 /bin/bash -c "$NESTRI_LAUNCH_CMD" & + APP_PID=$! + fi fi return fi sleep 1 done - log "Warning: Compositor socket not found after 15 seconds ($COMPOSITOR_SOCKET)." + log "Warning: Compositor socket not found after 15 seconds ($COMPOSITOR_SOCKET)" else # Launch standalone application if no compositor if [[ -n "${NESTRI_LAUNCH_CMD}" ]]; then @@ -218,7 +218,7 @@ start_compositor() { WAYLAND_DISPLAY=wayland-1 /bin/bash -c "$NESTRI_LAUNCH_CMD" & APP_PID=$! else - log "No compositor or application configured." + log "No compositor or application configured" fi fi } @@ -228,7 +228,7 @@ increment_retry() { local component="$1" ((RETRY_COUNT++)) if [[ "$RETRY_COUNT" -ge "$MAX_RETRIES" ]]; then - log "Error: Max retries reached for $component." + log "Error: Max retries reached for $component" exit 1 fi } @@ -259,22 +259,22 @@ main_loop() { sleep 1 # Check nestri-server if [[ -n "${NESTRI_PID:-}" ]] && ! kill -0 "${NESTRI_PID}" 2>/dev/null; then - log "nestri-server died." + log "nestri-server died" increment_retry "nestri-server" restart_chain # Check compositor elif [[ -n "${COMPOSITOR_PID:-}" ]] && ! kill -0 "${COMPOSITOR_PID}" 2>/dev/null; then - log "compositor died." + log "compositor died" increment_retry "compositor" start_compositor # Check application elif [[ -n "${APP_PID:-}" ]] && ! kill -0 "${APP_PID}" 2>/dev/null; then - log "application died." + log "application died" increment_retry "application" start_compositor # Check patcher elif [[ -n "${PATCHER_PID:-}" ]] && ! kill -0 "${PATCHER_PID}" 2>/dev/null; then - log "steam-patcher died." + log "steam-patcher died" increment_retry "steam-patcher" start_steam_namespaceless_patcher fi @@ -282,10 +282,18 @@ main_loop() { } main() { - load_envs parse_resolution "${RESOLUTION:-1920x1080}" || exit 1 + get_container_info || { + log "Warning: Failed to detect container information." + } + + # Ensure DBus session env exists + if command -v dbus-launch >/dev/null 2>&1 && [[ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]]; then + eval "$(dbus-launch)" + fi + restart_chain main_loop } -main \ No newline at end of file +main diff --git a/packages/scripts/envs.sh b/packages/scripts/envs.sh index 72741fb4..2542da6c 100644 --- a/packages/scripts/envs.sh +++ b/packages/scripts/envs.sh @@ -1,9 +1,11 @@ #!/bin/bash -export XDG_RUNTIME_DIR=/run/user/${UID}/ +export USER=${NESTRI_USER} +export LANG=${NESTRI_LANG} +export HOME=${NESTRI_HOME} +export XDG_RUNTIME_DIR=${NESTRI_XDG_RUNTIME_DIR} export XDG_SESSION_TYPE=x11 export DISPLAY=:0 -export $(dbus-launch) # Causes some setups to break export PROTON_NO_FSYNC=1 diff --git a/packages/scripts/supervisord.conf b/packages/scripts/supervisord.conf index 91f458fc..2c402f87 100644 --- a/packages/scripts/supervisord.conf +++ b/packages/scripts/supervisord.conf @@ -1,24 +1,15 @@ [supervisord] -user=root nodaemon=true loglevel=info logfile=/tmp/supervisord.log [program:dbus] -user=root command=dbus-daemon --system --nofork --nopidfile autorestart=true autostart=true startretries=3 priority=1 - -[program:seatd] -user=root -command=seatd -autorestart=true -autostart=true -startretries=3 -priority=2 +environment=XDG_RUNTIME_DIR=%(ENV_NESTRI_XDG_RUNTIME_DIR)s [program:pipewire] user=nestri @@ -28,6 +19,7 @@ autostart=true startretries=3 priority=3 nice=-10 +environment=HOME=%(ENV_NESTRI_HOME)s,XDG_RUNTIME_DIR=%(ENV_NESTRI_XDG_RUNTIME_DIR)s [program:pipewire-pulse] user=nestri @@ -37,6 +29,7 @@ autostart=true startretries=3 priority=4 nice=-10 +environment=HOME=%(ENV_NESTRI_HOME)s,XDG_RUNTIME_DIR=%(ENV_NESTRI_XDG_RUNTIME_DIR)s [program:wireplumber] user=nestri @@ -46,9 +39,9 @@ autostart=true startretries=3 priority=5 nice=-10 +environment=HOME=%(ENV_NESTRI_HOME)s,XDG_RUNTIME_DIR=%(ENV_NESTRI_XDG_RUNTIME_DIR)s [program:entrypoint] -user=root command=/etc/nestri/entrypoint.sh autorestart=false autostart=true diff --git a/packages/server/Cargo.lock b/packages/server/Cargo.lock index 964d8a40..1a812341 100644 --- a/packages/server/Cargo.lock +++ b/packages/server/Cargo.lock @@ -79,12 +79,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -96,9 +90,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -126,29 +120,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "arc-swap" @@ -168,7 +162,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" dependencies = [ - "asn1-rs-derive", + "asn1-rs-derive 0.5.1", "asn1-rs-impl", "displaydoc", "nom", @@ -178,6 +172,22 @@ dependencies = [ "time", ] +[[package]] +name = "asn1-rs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" +dependencies = [ + "asn1-rs-derive 0.6.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.16", + "time", +] + [[package]] name = "asn1-rs-derive" version = "0.5.1" @@ -190,6 +200,18 @@ dependencies = [ "synstructure", ] +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "asn1-rs-impl" version = "0.2.0" @@ -203,9 +225,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -215,9 +237,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" +checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" dependencies = [ "async-lock", "cfg-if", @@ -226,17 +248,16 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 1.0.7", + "rustix 1.0.8", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ "event-listener", "event-listener-strategy", @@ -256,9 +277,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -267,9 +288,9 @@ dependencies = [ [[package]] name = "async-tungstenite" -version = "0.29.1" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef0f7efedeac57d9b26170f72965ecfd31473ca52ca7a64e925b0b6f5f079886" +checksum = "ee88b4c88ac8c9ea446ad43498955750a4bbe64c4392f21ccfe5d952865e318f" dependencies = [ "atomic-waker", "futures-core", @@ -281,7 +302,7 @@ dependencies = [ "pin-project-lite", "tokio", "tokio-native-tls", - "tungstenite 0.26.2", + "tungstenite 0.27.0", ] [[package]] @@ -311,68 +332,27 @@ checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" [[package]] name = "attohttpc" -version = "0.24.1" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" +checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" dependencies = [ - "http 0.2.12", + "base64 0.22.1", + "http 1.3.1", "log", "url", ] [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "aws-config" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455e9fb7743c6f6267eb2830ccc08686fbb3d13c9a689369562fd4d4ef9ea462" -dependencies = [ - "aws-credential-types", - "aws-runtime", - "aws-sdk-sso", - "aws-sdk-ssooidc", - "aws-sdk-sts", - "aws-smithy-async", - "aws-smithy-http 0.62.1", - "aws-smithy-json", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "fastrand", - "hex", - "http 1.3.1", - "ring", - "time", - "tokio", - "tracing", - "url", - "zeroize", -] - -[[package]] -name = "aws-credential-types" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687bc16bc431a8533fe0097c7f0182874767f920989d7260950172ae8e3c4465" -dependencies = [ - "aws-smithy-async", - "aws-smithy-runtime-api", - "aws-smithy-types", - "zeroize", -] +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" dependencies = [ "aws-lc-sys", "zeroize", @@ -380,9 +360,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" dependencies = [ "bindgen", "cc", @@ -391,361 +371,6 @@ dependencies = [ "fs_extra", ] -[[package]] -name = "aws-runtime" -version = "1.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f6c68419d8ba16d9a7463671593c54f81ba58cab466e9b759418da606dcc2e2" -dependencies = [ - "aws-credential-types", - "aws-sigv4", - "aws-smithy-async", - "aws-smithy-http 0.62.1", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "fastrand", - "http 0.2.12", - "http-body 0.4.6", - "percent-encoding", - "pin-project-lite", - "tracing", - "uuid", -] - -[[package]] -name = "aws-sdk-kinesisvideo" -version = "1.74.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9684b455fb5bd87ba61fca7444add088724f41ba115e6326dcb1b45d1d6ee348" -dependencies = [ - "aws-credential-types", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http 0.62.1", - "aws-smithy-json", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "fastrand", - "http 0.2.12", - "regex-lite", - "tracing", -] - -[[package]] -name = "aws-sdk-kinesisvideosignaling" -version = "1.73.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af014a33946080634dc1b99a81d46d4e2bc59e1ccc1b95049bde219a03a83e01" -dependencies = [ - "aws-credential-types", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http 0.62.1", - "aws-smithy-json", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "fastrand", - "http 0.2.12", - "regex-lite", - "tracing", -] - -[[package]] -name = "aws-sdk-sso" -version = "1.73.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ac1674cba7872061a29baaf02209fefe499ff034dfd91bd4cc59e4d7741489" -dependencies = [ - "aws-credential-types", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http 0.62.1", - "aws-smithy-json", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "fastrand", - "http 0.2.12", - "regex-lite", - "tracing", -] - -[[package]] -name = "aws-sdk-ssooidc" -version = "1.74.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6a22f077f5fd3e3c0270d4e1a110346cddf6769e9433eb9e6daceb4ca3b149" -dependencies = [ - "aws-credential-types", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http 0.62.1", - "aws-smithy-json", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "fastrand", - "http 0.2.12", - "regex-lite", - "tracing", -] - -[[package]] -name = "aws-sdk-sts" -version = "1.74.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d440e1d368759bd10df0dbdddbfff6473d7cd73e9d9ef2363dc9995ac2d711" -dependencies = [ - "aws-credential-types", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http 0.62.1", - "aws-smithy-json", - "aws-smithy-query", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-smithy-xml", - "aws-types", - "fastrand", - "http 0.2.12", - "regex-lite", - "tracing", -] - -[[package]] -name = "aws-sigv4" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfb9021f581b71870a17eac25b52335b82211cdc092e02b6876b2bcefa61666" -dependencies = [ - "aws-credential-types", - "aws-smithy-http 0.62.1", - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "form_urlencoded", - "hex", - "hmac", - "http 0.2.12", - "http 1.3.1", - "percent-encoding", - "sha2", - "time", - "tracing", -] - -[[package]] -name = "aws-smithy-async" -version = "1.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" -dependencies = [ - "futures-util", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "aws-smithy-http" -version = "0.60.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7809c27ad8da6a6a68c454e651d4962479e81472aa19ae99e59f9aba1f9713cc" -dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.12", - "http-body 0.4.6", - "once_cell", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tracing", -] - -[[package]] -name = "aws-smithy-http" -version = "0.62.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" -dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tracing", -] - -[[package]] -name = "aws-smithy-http-client" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f491388e741b7ca73b24130ff464c1478acc34d5b331b7dd0a2ee4643595a15" -dependencies = [ - "aws-smithy-async", - "aws-smithy-runtime-api", - "aws-smithy-types", - "h2 0.3.26", - "h2 0.4.10", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper 1.6.0", - "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", - "hyper-util", - "pin-project-lite", - "rustls 0.21.12", - "rustls 0.23.27", - "rustls-native-certs 0.8.1", - "rustls-pki-types", - "tokio", - "tower", - "tracing", -] - -[[package]] -name = "aws-smithy-json" -version = "0.61.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a16e040799d29c17412943bdbf488fd75db04112d0c0d4b9290bacf5ae0014b9" -dependencies = [ - "aws-smithy-types", -] - -[[package]] -name = "aws-smithy-observability" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" -dependencies = [ - "aws-smithy-runtime-api", -] - -[[package]] -name = "aws-smithy-query" -version = "0.60.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" -dependencies = [ - "aws-smithy-types", - "urlencoding", -] - -[[package]] -name = "aws-smithy-runtime" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14302f06d1d5b7d333fd819943075b13d27c7700b414f574c3c35859bfb55d5e" -dependencies = [ - "aws-smithy-async", - "aws-smithy-http 0.62.1", - "aws-smithy-http-client", - "aws-smithy-observability", - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "fastrand", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "http-body 1.0.1", - "pin-project-lite", - "pin-utils", - "tokio", - "tracing", -] - -[[package]] -name = "aws-smithy-runtime-api" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8531b6d8882fd8f48f82a9754e682e29dd44cff27154af51fa3eb730f59efb" -dependencies = [ - "aws-smithy-async", - "aws-smithy-types", - "bytes", - "http 0.2.12", - "http 1.3.1", - "pin-project-lite", - "tokio", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-smithy-types" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" -dependencies = [ - "base64-simd", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "http-body 1.0.1", - "http-body-util", - "itoa", - "num-integer", - "pin-project-lite", - "pin-utils", - "ryu", - "serde", - "time", - "tokio", - "tokio-util", -] - -[[package]] -name = "aws-smithy-xml" -version = "0.60.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" -dependencies = [ - "xmlparser", -] - -[[package]] -name = "aws-types" -version = "1.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a322fec39e4df22777ed3ad8ea868ac2f94cd15e1a55f6ee8d8d6305057689a" -dependencies = [ - "aws-credential-types", - "aws-smithy-async", - "aws-smithy-runtime-api", - "aws-smithy-types", - "rustc_version", - "tracing", -] - [[package]] name = "backtrace" version = "0.3.75" @@ -785,16 +410,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64-simd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" -dependencies = [ - "outref", - "vsimd", -] - [[package]] name = "base64ct" version = "1.8.0" @@ -816,7 +431,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools 0.12.1", @@ -841,9 +456,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "blake2" @@ -883,9 +498,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.18.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -902,16 +517,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - [[package]] name = "cbc" version = "0.1.2" @@ -923,10 +528,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.27" +version = "1.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -955,9 +561,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34e221e91c7eb5e8315b5c9cf1a61670938c0626451f954a51693ed44b37f45" +checksum = "c8d458d63f0f0f482c8da9b7c8b76c21bd885a02056cc94c6404d861ca2b8206" dependencies = [ "smallvec", "target-lexicon", @@ -965,9 +571,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -1001,16 +607,15 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-link", + "windows-link 0.2.0", ] [[package]] @@ -1037,9 +642,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -1047,9 +652,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -1059,11 +664,11 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn", @@ -1115,16 +720,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1164,6 +759,12 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -1190,9 +791,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" @@ -1228,12 +829,13 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.7" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" +checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" dependencies = [ + "dispatch", "nix 0.30.1", - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -1320,7 +922,21 @@ version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" dependencies = [ - "asn1-rs", + "asn1-rs 0.6.2", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs 0.7.1", "displaydoc", "nom", "num-bigint", @@ -1330,9 +946,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", ] @@ -1349,6 +965,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + [[package]] name = "displaydoc" version = "0.2.5" @@ -1398,13 +1020,12 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", - "rand_core 0.6.4", "serde", "sha2", "subtle", @@ -1453,7 +1074,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn", @@ -1467,19 +1088,19 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1519,10 +1140,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] -name = "fixedbitset" -version = "0.4.2" +name = "find-msvc-tools" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" [[package]] name = "fnv" @@ -1553,9 +1174,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1627,9 +1248,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "futures-core", "pin-project-lite", @@ -1653,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ "futures-io", - "rustls 0.23.27", + "rustls 0.23.31", "rustls-pki-types", ] @@ -1695,9 +1316,9 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" dependencies = [ "cc", "cfg-if", @@ -1741,7 +1362,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.4+wasi-0.2.4", "wasm-bindgen", ] @@ -1763,9 +1384,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" -version = "0.20.11" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a5c3829f5794cb15120db87707b2ec03720edff7ad09eb7b711b532e3fe747" +checksum = "52b5e3f390d01b79e30da451dd00e27cd1ac2de81658e3abf6c1fc3229b24c5f" dependencies = [ "futures-channel", "futures-core", @@ -1780,24 +1401,24 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.20.10" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521e93a7e56fc89e84aea9a52cfc9436816a4b363b030260b699950ff1336c83" +checksum = "a03f2234671e5a588cfe1f59c2b22c103f5772ea351be9cc824a9ce0d06d99fd" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "glib" -version = "0.20.10" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c501c495842c2b23cdacead803a5a343ca2a5d7a7ddaff14cc5f6cf22cfb92c2" +checksum = "60bdc26493257b5794ba9301f7cbaf7ab0d69a570bfbefa4d7d360e781cb5205" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "futures-channel", "futures-core", "futures-executor", @@ -1814,11 +1435,11 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.20.10" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe6dc9ce29887c4b3b74d78d5ba473db160a258ae7ed883d23632ac7fed7bc9" +checksum = "e772291ebea14c28eb11bb75741f62f4a4894f25e60ce80100797b6b010ef0f9" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro-crate", "proc-macro2", "quote", @@ -1827,9 +1448,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.20.10" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ab79e1ed126803a8fb827e3de0e2ff95191912b8db65cee467edb56fc4cc215" +checksum = "dc7c43cff6a7dc43821e45ebf172399437acd6716fa2186b6852d2b397bf622d" dependencies = [ "libc", "system-deps", @@ -1837,15 +1458,15 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gobject-sys" -version = "0.20.10" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9aca94bb73989e3cfdbf8f2e0f1f6da04db4d291c431f444838925c4c63eda" +checksum = "3e9a190eef2bce144a6aa8434e306974c6062c398e0a33a146d60238f9062d5c" dependencies = [ "glib-sys", "libc", @@ -1865,37 +1486,29 @@ dependencies = [ [[package]] name = "gst-plugin-version-helper" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e5e874f1660252fd2ec81c602066df3633b3a6fcbe2b196f7f93c27cf069b2a" +checksum = "a68a894ef2d738054b950e1dbef5d9012b63fd968d4d32dbccd31bd8d8d4b219" dependencies = [ "chrono", - "toml_edit", + "toml_edit 0.23.4", ] [[package]] name = "gst-plugin-webrtc" -version = "0.13.6" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a5c83ae8a8ed03c689884b55be023725a0a3fa6e64834987a0c876f6829ee7" +checksum = "11b2dc7d79a320e490632c5dc814864ec9fb3a9101398266058cc01c2857394b" dependencies = [ "anyhow", "async-recursion", "async-tungstenite", - "aws-config", - "aws-credential-types", - "aws-sdk-kinesisvideo", - "aws-sdk-kinesisvideosignaling", - "aws-sigv4", - "aws-smithy-http 0.60.12", - "aws-smithy-types", - "aws-types", "chrono", "ctrlc", - "data-encoding", "fastrand", "futures", "gst-plugin-version-helper", + "gst-plugin-webrtc-signalling", "gst-plugin-webrtc-signalling-protocol", "gstreamer", "gstreamer-app", @@ -1909,29 +1522,53 @@ dependencies = [ "gstreamer-webrtc", "http 1.3.1", "human_bytes", - "livekit-api", - "livekit-protocol", - "once_cell", + "itertools 0.14.0", "parse_link_header", - "rand 0.9.1", - "reqwest 0.12.20", + "rand 0.9.2", + "reqwest", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tokio-native-tls", "tokio-stream", + "tracing", + "tracing-log", + "tracing-subscriber", "url", - "url-escape", "uuid", "warp", ] [[package]] -name = "gst-plugin-webrtc-signalling-protocol" -version = "0.13.6" +name = "gst-plugin-webrtc-signalling" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abd6bb4c991682bf22ce3d79dc285b4e51ff1fdce75362778a281f8d97644cef" +checksum = "03579025cafc1560539778f694dffa3270b6c8ddb26df6a0b53841fb56faaf71" +dependencies = [ + "anyhow", + "async-tungstenite", + "clap", + "futures", + "gst-plugin-webrtc-signalling-protocol", + "pin-project-lite", + "serde", + "serde_json", + "test-log", + "thiserror 2.0.16", + "tokio", + "tokio-native-tls", + "tracing", + "tracing-log", + "tracing-subscriber", + "uuid", +] + +[[package]] +name = "gst-plugin-webrtc-signalling-protocol" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a0b7b440bb3a2cbe5ac1ef5f99bda9926d18e77b153faaaeb49933f50ad1abf" dependencies = [ "serde", "serde_json", @@ -1939,9 +1576,9 @@ dependencies = [ [[package]] name = "gstreamer" -version = "0.23.6" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ab4c88f731596a2511a6f14cabdd666e0d8efab62a1d58e6ddb57faa96e22e" +checksum = "32f5db514ad5ccf70ad35485058aa8b894bb81cfcf76bb994af135d9789427c6" dependencies = [ "cfg-if", "futures-channel", @@ -1950,25 +1587,25 @@ dependencies = [ "glib", "gstreamer-sys", "itertools 0.14.0", + "kstring", "libc", "muldiv", "num-integer", "num-rational", - "once_cell", "option-operations", "paste", "pin-project-lite", "serde", "serde_bytes", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] name = "gstreamer-app" -version = "0.23.5" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9a883eb21aebcf1289158225c05f7aea5da6ecf71fa7f0ff1ce4d25baf004e" +checksum = "fad8ae64a7af6d1aa04e96db085a0cbd64a6b838d85c115c99fa053ab8902d98" dependencies = [ "futures-core", "futures-sink", @@ -1981,9 +1618,9 @@ dependencies = [ [[package]] name = "gstreamer-app-sys" -version = "0.23.5" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f7ef838306fe51852d503a14dc79ac42de005a59008a05098de3ecdaf05455" +checksum = "aaf1a3af017f9493c34ccc8439cbce5c48f6ddff6ec0514c23996b374ff25f9a" dependencies = [ "glib-sys", "gstreamer-base-sys", @@ -1994,9 +1631,9 @@ dependencies = [ [[package]] name = "gstreamer-audio" -version = "0.23.6" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7ec7e0374298897e669db7c79544bc44df12011985e7dd5f38644edaf2caf4" +checksum = "7404c5d0cbb2189e6a10d05801e93f47fe60b195e4d73dd1c540d055f7b340b8" dependencies = [ "cfg-if", "glib", @@ -2004,16 +1641,15 @@ dependencies = [ "gstreamer-audio-sys", "gstreamer-base", "libc", - "once_cell", "serde", "smallvec", ] [[package]] name = "gstreamer-audio-sys" -version = "0.23.6" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5f3e09e7c04ec91d78c2a6ca78d50b574b9ed49fdf5e72f3693adca4306a87" +checksum = "626cd3130bc155a8b6d4ac48cfddc15774b5a6cc76fcb191aab09a2655bad8f5" dependencies = [ "glib-sys", "gobject-sys", @@ -2025,9 +1661,9 @@ dependencies = [ [[package]] name = "gstreamer-base" -version = "0.23.6" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f19a74fd04ffdcb847dd322640f2cf520897129d00a7bcb92fd62a63f3e27404" +checksum = "34745d3726a080e0d57e402a314e37073d0b341f3a5754258550311ca45e4754" dependencies = [ "atomic_refcell", "cfg-if", @@ -2039,9 +1675,9 @@ dependencies = [ [[package]] name = "gstreamer-base-sys" -version = "0.23.6" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f2fb0037b6d3c5b51f60dea11e667910f33be222308ca5a101450018a09840" +checksum = "dfad00fa63ddd8132306feef9d5095a3636192f09d925adfd0a9be0d82b9ea91" dependencies = [ "glib-sys", "gobject-sys", @@ -2052,9 +1688,9 @@ dependencies = [ [[package]] name = "gstreamer-net" -version = "0.23.5" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7a57013f1af740373c5cbf1602b6ff25238d4a0e300eff179b75676c9c7781e" +checksum = "9d41a2a029755cdd1d9ed45a7d9e3afeea5f3a6720258ffd52e7bf7f04edff51" dependencies = [ "gio", "glib", @@ -2064,9 +1700,9 @@ dependencies = [ [[package]] name = "gstreamer-net-sys" -version = "0.23.5" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0291a3064e6e94d640f2d662264b726e5e0c2067ceb17f2b56dec6f6920877" +checksum = "a13de01b565d802d7e700a1ca961ad4113384a47bb1ca1c17618cb7e503fdc02" dependencies = [ "gio-sys", "glib-sys", @@ -2077,9 +1713,9 @@ dependencies = [ [[package]] name = "gstreamer-rtp" -version = "0.23.5" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf35002f6eff177f5afc255fa7a2e7ab718fe8186a737dfdb791784e63571154" +checksum = "ee61184f6e51e53c2e28432ad10f5db235fa819ef23293ca435ae9c72a6086b2" dependencies = [ "glib", "gstreamer", @@ -2089,9 +1725,9 @@ dependencies = [ [[package]] name = "gstreamer-rtp-sys" -version = "0.23.5" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b874248d40bd6678be9c7218ec880735258cf2ba77000c72efda8bb3271b0fe" +checksum = "30092ae1870c4d475a2fc2c830653e038d88be9185ac5a362f17bd1442aac3fb" dependencies = [ "glib-sys", "gstreamer-base-sys", @@ -2102,9 +1738,9 @@ dependencies = [ [[package]] name = "gstreamer-sdp" -version = "0.23.5" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f94ab92cb1dbd6d00e41208ab463b5fbce3eca65a4c9710585fede015a9d65" +checksum = "a52ff511d54d6d7d2f1061175294b54450968ef6a37314f01ae84f8ab1efaf9d" dependencies = [ "glib", "gstreamer", @@ -2113,9 +1749,9 @@ dependencies = [ [[package]] name = "gstreamer-sdp-sys" -version = "0.23.5" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de44d5e90138ac1786a6418a38c73d9a78ee0d15680129f09f91df5309d658e0" +checksum = "32f6e545a903d95174270f0a6a2d7eca649b63e2534d3ef9899b2d3a92de0b6a" dependencies = [ "glib-sys", "gstreamer-sys", @@ -2125,10 +1761,11 @@ dependencies = [ [[package]] name = "gstreamer-sys" -version = "0.23.6" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feea73b4d92dbf9c24a203c9cd0bcc740d584f6b5960d5faf359febf288919b2" +checksum = "36f46b35f9dc4b5a0dca3f19d2118bb5355c3112f228a99a84ed555f48ce5cf9" dependencies = [ + "cfg-if", "glib-sys", "gobject-sys", "libc", @@ -2137,22 +1774,21 @@ dependencies = [ [[package]] name = "gstreamer-utils" -version = "0.23.6" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ff07fd1ba426dfe311baa90c7b27d1896725952f6edb91b70cd59c773e9d1a" +checksum = "aa9bd5380da0440b8fe2fdafa113653971bddc77424201e193e2272f38c8ef52" dependencies = [ "gstreamer", "gstreamer-app", "gstreamer-video", - "once_cell", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] name = "gstreamer-video" -version = "0.23.6" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1318b599d77ca4f7702ecbdeac1672d6304cb16b7e5752fabb3ee8260449a666" +checksum = "a2a0e4dbc6b5563fa252eaeb4297ca04e7dd2e239c68f67eeeb95148f7d31652" dependencies = [ "cfg-if", "futures-channel", @@ -2161,16 +1797,15 @@ dependencies = [ "gstreamer-base", "gstreamer-video-sys", "libc", - "once_cell", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] name = "gstreamer-video-sys" -version = "0.23.6" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a70f0947f12d253b9de9bc3fd92f981e4d025336c18389c7f08cdf388a99f5c" +checksum = "8d944b1492bdd7a72a02ae9a5da6e34a29194b8623d3bd02752590b06fb837a7" dependencies = [ "glib-sys", "gobject-sys", @@ -2182,9 +1817,9 @@ dependencies = [ [[package]] name = "gstreamer-webrtc" -version = "0.23.5" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c475e2fa45c6c14b971e2ac40e7bae035f19592cac68c391d12eb659fd1722b" +checksum = "b8cd0bd74b94dacdf9379e429241cd7a4ed281eecb2bfe8eeca238403f5aad91" dependencies = [ "glib", "gstreamer", @@ -2195,9 +1830,9 @@ dependencies = [ [[package]] name = "gstreamer-webrtc-sys" -version = "0.23.5" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0ce6dd5e17757933233bf3fce2226eb2e8c06ec2325c2459a1022ae1d7d279" +checksum = "a0c68178e913ab770d404cdb46eab793178f4ea6549d3bd7d90e543bf0d0e684" dependencies = [ "glib-sys", "gstreamer-sdp-sys", @@ -2208,9 +1843,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -2227,9 +1862,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -2255,9 +1890,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -2297,12 +1932,6 @@ dependencies = [ "http 0.2.12", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -2329,11 +1958,10 @@ checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" [[package]] name = "hickory-proto" -version = "0.25.0-alpha.5" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d00147af6310f4392a31680db52a3ed45a2e0f68eb18e8c3fe5537ecc96d9e2" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" dependencies = [ - "async-recursion", "async-trait", "cfg-if", "data-encoding", @@ -2344,9 +1972,10 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.1", - "socket2", - "thiserror 2.0.12", + "rand 0.9.2", + "ring", + "socket2 0.5.10", + "thiserror 2.0.16", "tinyvec", "tokio", "tracing", @@ -2355,9 +1984,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.25.0-alpha.5" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5762f69ebdbd4ddb2e975cd24690bf21fe6b2604039189c26acddbc427f12887" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" dependencies = [ "cfg-if", "futures-util", @@ -2366,10 +1995,10 @@ dependencies = [ "moka", "once_cell", "parking_lot", - "rand 0.9.1", + "rand 0.9.2", "resolv-conf", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -2485,14 +2114,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -2501,40 +2130,26 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", - "h2 0.4.10", + "futures-core", + "h2 0.4.12", "http 1.3.1", "http-body 1.0.1", "httparse", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "log", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.7" @@ -2542,29 +2157,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.3.1", - "hyper 1.6.0", + "hyper 1.7.0", "hyper-util", - "rustls 0.23.27", - "rustls-native-certs 0.8.1", + "rustls 0.23.31", "rustls-pki-types", "tokio", "tokio-rustls 0.26.2", "tower-service", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.32", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -2573,7 +2174,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.6.0", + "hyper 1.7.0", "hyper-util", "native-tls", "tokio", @@ -2583,9 +2184,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -2594,13 +2195,13 @@ dependencies = [ "futures-util", "http 1.3.1", "http-body 1.0.1", - "hyper 1.6.0", + "hyper 1.7.0", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2", - "system-configuration 0.6.1", + "socket2 0.6.0", + "system-configuration", "tokio", "tower-service", "tracing", @@ -2719,9 +2320,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2755,7 +2356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" dependencies = [ "async-io", - "core-foundation 0.9.4", + "core-foundation", "fnv", "futures", "if-addrs", @@ -2766,16 +2367,16 @@ dependencies = [ "netlink-proto", "netlink-sys", "rtnetlink", - "system-configuration 0.6.1", + "system-configuration", "tokio", "windows 0.53.0", ] [[package]] name = "igd-next" -version = "0.15.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b0d7d4541def58a37bf8efc559683f21edce7c82f0d866c93ac21f7e098f93" +checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" dependencies = [ "async-trait", "attohttpc", @@ -2783,10 +2384,10 @@ dependencies = [ "futures", "http 1.3.1", "http-body-util", - "hyper 1.6.0", + "hyper 1.7.0", "hyper-util", "log", - "rand 0.8.5", + "rand 0.9.2", "tokio", "url", "xmltree", @@ -2794,12 +2395,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.15.5", ] [[package]] @@ -2832,13 +2433,24 @@ dependencies = [ "webrtc-util", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2", + "socket2 0.5.10", "widestring", "windows-sys 0.48.0", "winreg", @@ -2866,15 +2478,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.12.1" @@ -2901,9 +2504,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -2911,25 +2514,21 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] -name = "jsonwebtoken" -version = "9.3.1" +name = "kstring" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" dependencies = [ - "base64 0.22.1", - "js-sys", - "ring", - "serde", - "serde_json", + "static_assertions", ] [[package]] @@ -2946,9 +2545,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.173" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libloading" @@ -2957,14 +2556,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] name = "libp2p" -version = "0.55.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72dc443ddd0254cb49a794ed6b6728400ee446a0f7ab4a07d0209ee98de20e9" +checksum = "ce71348bf5838e46449ae240631117b487073d5f347c06d434caddcb91dceb5a" dependencies = [ "bytes", "either", @@ -2993,14 +2592,14 @@ dependencies = [ "multiaddr", "pin-project", "rw-stream-sink", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] name = "libp2p-allow-block-list" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38944b7cb981cc93f2f0fb411ff82d0e983bd226fbcc8d559639a3a73236568b" +checksum = "d16ccf824ee859ca83df301e1c0205270206223fd4b1f2e512a693e1912a8f4a" dependencies = [ "libp2p-core", "libp2p-identity", @@ -3009,9 +2608,9 @@ dependencies = [ [[package]] name = "libp2p-autonat" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e297bfc6cabb70c6180707f8fa05661b77ecb9cb67e8e8e1c469301358fa21d0" +checksum = "fab5e25c49a7d48dac83d95d8f3bac0a290d8a5df717012f6e34ce9886396c0b" dependencies = [ "async-trait", "asynchronous-codec", @@ -3027,16 +2626,16 @@ dependencies = [ "quick-protobuf-codec", "rand 0.8.5", "rand_core 0.6.4", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "web-time", ] [[package]] name = "libp2p-connection-limits" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe9323175a17caa8a2ed4feaf8a548eeef5e0b72d03840a0eab4bcb0210ce1c" +checksum = "a18b8b607cf3bfa2f8c57db9c7d8569a315d5cc0a282e6bfd5ebfc0a9840b2a0" dependencies = [ "libp2p-core", "libp2p-identity", @@ -3045,9 +2644,9 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.43.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193c75710ba43f7504ad8f58a62ca0615b1d7e572cb0f1780bc607252c39e9ef" +checksum = "4d28e2d2def7c344170f5c6450c0dbe3dfef655610dbfde2f6ac28a527abbe36" dependencies = [ "either", "fnv", @@ -3057,13 +2656,12 @@ dependencies = [ "multiaddr", "multihash", "multistream-select", - "once_cell", "parking_lot", "pin-project", "quick-protobuf", "rand 0.8.5", "rw-stream-sink", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "unsigned-varint 0.8.0", "web-time", @@ -3071,9 +2669,9 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.43.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b780a1150214155b0ed1cdf09fbd2e1b0442604f9146a431d1b21d23eef7bd7" +checksum = "0b770c1c8476736ca98c578cba4b505104ff8e842c2876b528925f9766379f9a" dependencies = [ "async-trait", "futures", @@ -3087,9 +2685,9 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" -version = "0.48.0" +version = "0.49.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d558548fa3b5a8e9b66392f785921e363c57c05dcadfda4db0d41ae82d313e4a" +checksum = "c7f58e37d8d6848e5c4c9e3c35c6f61133235bff2960c9c00a663b0849301221" dependencies = [ "async-channel", "asynchronous-codec", @@ -3106,7 +2704,6 @@ dependencies = [ "libp2p-core", "libp2p-identity", "libp2p-swarm", - "prometheus-client", "quick-protobuf", "quick-protobuf-codec", "rand 0.8.5", @@ -3119,9 +2716,9 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.46.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c06862544f02d05d62780ff590cc25a75f5c2b9df38ec7a370dcae8bb873cf" +checksum = "8ab792a8b68fdef443a62155b01970c81c3aadab5e659621b063ef252a8e65e8" dependencies = [ "asynchronous-codec", "either", @@ -3134,15 +2731,15 @@ dependencies = [ "quick-protobuf", "quick-protobuf-codec", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", ] [[package]] name = "libp2p-identity" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb68ea10844211a59ce46230909fd0ea040e8a192454d4cc2ee0d53e12280eb" +checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" dependencies = [ "bs58", "ed25519-dalek", @@ -3152,16 +2749,16 @@ dependencies = [ "rand 0.8.5", "serde", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "zeroize", ] [[package]] name = "libp2p-kad" -version = "0.47.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bab0466a27ebe955bcbc27328fae5429c5b48c915fd6174931414149802ec23" +checksum = "13d3fd632a5872ec804d37e7413ceea20588f69d027a0fa3c46f82574f4dee60" dependencies = [ "asynchronous-codec", "bytes", @@ -3179,7 +2776,7 @@ dependencies = [ "serde", "sha2", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "uint", "web-time", @@ -3187,9 +2784,9 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.47.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d0ba095e1175d797540e16b62e7576846b883cb5046d4159086837b36846cc" +checksum = "c66872d0f1ffcded2788683f76931be1c52e27f343edb93bc6d0bcd8887be443" dependencies = [ "futures", "hickory-proto", @@ -3199,16 +2796,16 @@ dependencies = [ "libp2p-swarm", "rand 0.8.5", "smallvec", - "socket2", + "socket2 0.5.10", "tokio", "tracing", ] [[package]] name = "libp2p-metrics" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ce58c64292e87af624fcb86465e7dd8342e46a388d71e8fec0ab37ee789630a" +checksum = "805a555148522cb3414493a5153451910cb1a146c53ffbf4385708349baf62b7" dependencies = [ "futures", "libp2p-core", @@ -3223,9 +2820,9 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.46.0" +version = "0.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcc133e0f3cea07acde6eb8a9665cb11b600bd61110b010593a0210b8153b16" +checksum = "bc73eacbe6462a0eb92a6527cac6e63f02026e5407f8831bde8293f19217bfbf" dependencies = [ "asynchronous-codec", "bytes", @@ -3234,12 +2831,11 @@ dependencies = [ "libp2p-identity", "multiaddr", "multihash", - "once_cell", "quick-protobuf", "rand 0.8.5", "snow", "static_assertions", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "x25519-dalek", "zeroize", @@ -3247,9 +2843,9 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.46.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2529993ff22deb2504c0130a58b60fb77f036be555053922db1a0490b5798b" +checksum = "74bb7fcdfd9fead4144a3859da0b49576f171a8c8c7c0bfc7c541921d25e60d3" dependencies = [ "futures", "futures-timer", @@ -3263,9 +2859,9 @@ dependencies = [ [[package]] name = "libp2p-quic" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41432a159b00424a0abaa2c80d786cddff81055ac24aa127e0cf375f7858d880" +checksum = "8dc448b2de9f4745784e3751fe8bc6c473d01b8317edd5ababcb0dec803d843f" dependencies = [ "futures", "futures-timer", @@ -3276,18 +2872,18 @@ dependencies = [ "quinn", "rand 0.8.5", "ring", - "rustls 0.23.27", - "socket2", - "thiserror 2.0.12", + "rustls 0.23.31", + "socket2 0.5.10", + "thiserror 2.0.16", "tokio", "tracing", ] [[package]] name = "libp2p-request-response" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "548fe44a80ff275d400f1b26b090d441d83ef73efabbeb6415f4ce37e5aed865" +checksum = "a9f1cca83488b90102abac7b67d5c36fc65bc02ed47620228af7ed002e6a1478" dependencies = [ "async-trait", "futures", @@ -3302,9 +2898,9 @@ dependencies = [ [[package]] name = "libp2p-stream" -version = "0.3.0-alpha" +version = "0.4.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826716f1ee125895f1fb44911413cba023485b552ff96c7a2159bd037ac619bb" +checksum = "1d6bd8025c80205ec2810cfb28b02f362ab48a01bee32c50ab5f12761e033464" dependencies = [ "futures", "libp2p-core", @@ -3316,9 +2912,9 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.46.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803399b4b6f68adb85e63ab573ac568154b193e9a640f03e0f2890eabbcb37f8" +checksum = "6aa762e5215919a34e31c35d4b18bf2e18566ecab7f8a3d39535f4a3068f8b62" dependencies = [ "either", "fnv", @@ -3329,7 +2925,6 @@ dependencies = [ "libp2p-swarm-derive", "lru", "multistream-select", - "once_cell", "rand 0.8.5", "smallvec", "tokio", @@ -3339,37 +2934,36 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" -version = "0.35.0" +version = "0.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206e0aa0ebe004d778d79fb0966aa0de996c19894e2c0605ba2f8524dd4443d8" +checksum = "dd297cf53f0cb3dee4d2620bb319ae47ef27c702684309f682bdb7e55a18ae9c" dependencies = [ - "heck 0.5.0", - "proc-macro2", + "heck", "quote", "syn", ] [[package]] name = "libp2p-tcp" -version = "0.43.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65346fb4d36035b23fec4e7be4c320436ba53537ce9b6be1d1db1f70c905cad0" +checksum = "65b4e030c52c46c8d01559b2b8ca9b7c4185f10576016853129ca1fe5cd1a644" dependencies = [ "futures", "futures-timer", "if-watch", "libc", "libp2p-core", - "socket2", + "socket2 0.5.10", "tokio", "tracing", ] [[package]] name = "libp2p-tls" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42bbf5084fb44133267ad4caaa72a253d68d709edd2ed1cf9b42431a8ead8fd5" +checksum = "96ff65a82e35375cbc31ebb99cacbbf28cb6c4fefe26bf13756ddcf708d40080" dependencies = [ "futures", "futures-rustls", @@ -3377,18 +2971,18 @@ dependencies = [ "libp2p-identity", "rcgen", "ring", - "rustls 0.23.27", - "rustls-webpki 0.101.7", - "thiserror 2.0.12", - "x509-parser", + "rustls 0.23.31", + "rustls-webpki 0.103.4", + "thiserror 2.0.16", + "x509-parser 0.17.0", "yasna", ] [[package]] name = "libp2p-upnp" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d457b9ecceb66e7199f049926fad447f1f17f040e8d29d690c086b4cab8ed14a" +checksum = "4757e65fe69399c1a243bbb90ec1ae5a2114b907467bf09f3575e899815bb8d3" dependencies = [ "futures", "futures-timer", @@ -3401,9 +2995,9 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.45.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf5d48a4d8fad8a49fbf23816a878cac25623549f415d74da8ef4327e6196a9" +checksum = "520e29066a48674c007bc11defe5dce49908c24cafd8fad2f5e1a6a8726ced53" dependencies = [ "either", "futures", @@ -3414,10 +3008,10 @@ dependencies = [ "pin-project-lite", "rw-stream-sink", "soketto", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "url", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -3429,10 +3023,10 @@ dependencies = [ "either", "futures", "libp2p-core", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "yamux 0.12.1", - "yamux 0.13.5", + "yamux 0.13.6", ] [[package]] @@ -3453,45 +3047,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" -[[package]] -name = "livekit-api" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e20c3fc3de5944ce6b5c8da4084cf828bbae7216671e32e83b767ce61feeb7e0" -dependencies = [ - "futures-util", - "jsonwebtoken", - "livekit-protocol", - "log", - "parking_lot", - "prost 0.12.6", - "reqwest 0.11.27", - "scopeguard", - "serde", - "sha2", - "thiserror 1.0.69", - "tokio", - "tokio-tungstenite 0.20.1", - "url", -] - -[[package]] -name = "livekit-protocol" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a1bd23257110be29d024d8d816adff70df18ea1d22ceb1aab6f3ad4aab0d523" -dependencies = [ - "futures-util", - "parking_lot", - "pbjson", - "pbjson-types", - "prost 0.12.6", - "prost-types 0.12.6", - "serde", - "thiserror 1.0.69", - "tokio", -] - [[package]] name = "lock_api" version = "0.4.13" @@ -3504,9 +3059,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -3527,7 +3082,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.5", ] [[package]] @@ -3538,11 +3093,11 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -3696,12 +3251,6 @@ dependencies = [ "unsigned-varint 0.8.0", ] -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - [[package]] name = "multistream-select" version = "0.13.0" @@ -3728,7 +3277,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework 2.11.1", + "security-framework", "security-framework-sys", "tempfile", ] @@ -3746,13 +3295,21 @@ dependencies = [ "gstreamer", "gstreamer-webrtc", "libp2p", + "libp2p-autonat", + "libp2p-dns", + "libp2p-identify", + "libp2p-noise", + "libp2p-ping", "libp2p-stream", + "libp2p-tcp", + "libp2p-websocket", + "libp2p-yamux", "parking_lot", - "prost 0.14.0", - "prost-types 0.14.0", - "rand 0.9.1", + "prost", + "prost-types", + "rand 0.9.2", "regex", - "rustls 0.23.27", + "rustls 0.23.31", "serde", "serde_json", "tokio", @@ -3810,7 +3367,7 @@ dependencies = [ "log", "netlink-packet-core", "netlink-sys", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -3845,7 +3402,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -3869,12 +3426,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -3947,7 +3503,16 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" dependencies = [ - "asn1-rs", + "asn1-rs 0.6.2", +] + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs 0.7.1", ] [[package]] @@ -3955,6 +3520,10 @@ name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] [[package]] name = "once_cell_polyfill" @@ -3974,7 +3543,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -4021,18 +3590,6 @@ dependencies = [ "paste", ] -[[package]] -name = "outref" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "p256" version = "0.13.2" @@ -4104,43 +3661,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pbjson" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1030c719b0ec2a2d25a5df729d6cff1acf3cc230bf766f4f97833591f7577b90" -dependencies = [ - "base64 0.21.7", - "serde", -] - -[[package]] -name = "pbjson-build" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2580e33f2292d34be285c5bc3dba5259542b083cfad6037b6d70345f24dcb735" -dependencies = [ - "heck 0.4.1", - "itertools 0.11.0", - "prost 0.12.6", - "prost-types 0.12.6", -] - -[[package]] -name = "pbjson-types" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18f596653ba4ac51bdecbb4ef6773bc7f56042dc13927910de1684ad3d32aa12" -dependencies = [ - "bytes", - "chrono", - "pbjson", - "pbjson-build", - "prost 0.12.6", - "prost-build", - "serde", -] - [[package]] name = "pem" version = "3.0.5" @@ -4162,19 +3682,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" @@ -4226,17 +3736,16 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polling" -version = "3.8.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" +checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.0.7", - "tracing", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -4270,9 +3779,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -4294,9 +3803,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.34" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn", @@ -4317,23 +3826,23 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit", + "toml_edit 0.22.27", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "prometheus-client" -version = "0.22.3" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504ee9ff529add891127c4827eb481bd69dc0ebc72e9a682e187db4caa60c3ca" +checksum = "cf41c1a7c32ed72abe5082fb19505b969095c12da9f5732a4bc9878757fd087c" dependencies = [ "dtoa", "itoa", @@ -4354,63 +3863,19 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.6" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" dependencies = [ "bytes", - "prost-derive 0.12.6", -] - -[[package]] -name = "prost" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe28332295ca4451b7d779aff2749b144cabe5e6e05fe86f31337831d7df232" -dependencies = [ - "bytes", - "prost-derive 0.14.0", -] - -[[package]] -name = "prost-build" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" -dependencies = [ - "bytes", - "heck 0.5.0", - "itertools 0.12.1", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost 0.12.6", - "prost-types 0.12.6", - "regex", - "syn", - "tempfile", + "prost-derive", ] [[package]] name = "prost-derive" -version = "0.12.6" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "prost-derive" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ac3e3c6b0e1c219e61ceda600eaad26d7195ecc9b5c027925c904091374ab5" +checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", "itertools 0.14.0", @@ -4421,20 +3886,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.6" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" dependencies = [ - "prost 0.12.6", -] - -[[package]] -name = "prost-types" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2bfff0dbd11dbadf180fea466aa146cdf20aed230e1c42b8bae192df8f0469a" -dependencies = [ - "prost 0.14.0", + "prost", ] [[package]] @@ -4461,9 +3917,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -4472,9 +3928,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.27", - "socket2", - "thiserror 2.0.12", + "rustls 0.23.31", + "socket2 0.6.0", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -4482,20 +3938,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash 2.1.1", - "rustls 0.23.27", + "rustls 0.23.31", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -4503,16 +3959,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.12" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.6.0", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4526,9 +3982,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -4543,9 +3999,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -4599,126 +4055,65 @@ dependencies = [ "ring", "rustls-pki-types", "time", - "x509-parser", + "x509-parser 0.16.0", "yasna", ] [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.10" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] -[[package]] -name = "regex-lite" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" - [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", "futures-core", - "h2 0.4.10", + "h2 0.4.12", "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", - "hyper-rustls 0.27.7", - "hyper-tls 0.6.0", + "hyper 1.7.0", + "hyper-rustls", + "hyper-tls", "hyper-util", "js-sys", "log", @@ -4730,7 +4125,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tokio-native-tls", "tower", @@ -4818,9 +4213,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -4858,7 +4253,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4867,76 +4262,54 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "rustls" -version = "0.21.12" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring", - "rustls-webpki 0.101.7", - "sct", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", ] [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework 2.11.1", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.2.0", -] - [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.7", + "rustls-pki-types", ] [[package]] @@ -4951,19 +4324,20 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", + "rustls-pki-types", "untrusted", ] [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "aws-lc-rs", "ring", @@ -4973,9 +4347,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rw-stream-sink" @@ -5015,16 +4389,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sdp" version = "0.8.0" @@ -5057,21 +4421,8 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" -dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.10.1", + "bitflags 2.9.4", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -5079,9 +4430,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -5124,9 +4475,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", "memchr", @@ -5194,9 +4545,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -5213,12 +4564,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -5262,6 +4610,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "soketto" version = "0.8.1" @@ -5347,21 +4705,15 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.103" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.2" @@ -5382,36 +4734,15 @@ dependencies = [ "syn", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys 0.5.0", -] - [[package]] name = "system-configuration" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.9.4", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "bitflags 2.9.4", + "core-foundation", + "system-configuration-sys", ] [[package]] @@ -5431,7 +4762,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4be53aa0cba896d2dc615bd42bbc130acdcffa239e0a2d965ea5b3b2a86ffdb" dependencies = [ "cfg-expr", - "heck 0.5.0", + "heck", "pkg-config", "toml", "version-compare", @@ -5451,15 +4782,36 @@ checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" [[package]] name = "tempfile" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.7", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", +] + +[[package]] +name = "test-log" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e33b98a582ea0be1168eba097538ee8dd4bbe0f2b01b22ac92ea30054e5be7b" +dependencies = [ + "test-log-macros", + "tracing-subscriber", +] + +[[package]] +name = "test-log-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -5473,11 +4825,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.16", ] [[package]] @@ -5493,9 +4845,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", @@ -5513,12 +4865,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde", @@ -5528,15 +4879,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -5554,9 +4905,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -5569,20 +4920,22 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5608,11 +4961,12 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.21.12", + "rustls 0.22.4", + "rustls-pki-types", "tokio", ] @@ -5622,7 +4976,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.27", + "rustls 0.23.31", "tokio", ] @@ -5638,20 +4992,6 @@ dependencies = [ "tokio-util", ] -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "native-tls", - "tokio", - "tokio-native-tls", - "tungstenite 0.20.1", -] - [[package]] name = "tokio-tungstenite" version = "0.21.0" @@ -5666,9 +5006,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -5685,8 +5025,8 @@ checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", - "toml_datetime", - "toml_edit", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] @@ -5698,6 +5038,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.22.27" @@ -5707,7 +5056,28 @@ dependencies = [ "indexmap", "serde", "serde_spanned", - "toml_datetime", + "toml_datetime 0.6.11", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7211ff1b8f0d3adae1663b7da9ffe396eabe1ca25f0b0bee42b0da29a9ddce93" +dependencies = [ + "indexmap", + "toml_datetime 0.7.0", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" +dependencies = [ "winnow", ] @@ -5720,7 +5090,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -5732,7 +5102,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "bytes", "futures-util", "http 1.3.1", @@ -5770,9 +5140,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -5802,14 +5172,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -5824,26 +5194,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 0.2.12", - "httparse", - "log", - "native-tls", - "rand 0.8.5", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.21.0" @@ -5865,9 +5215,9 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.26.2" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" dependencies = [ "bytes", "data-encoding", @@ -5875,9 +5225,9 @@ dependencies = [ "httparse", "log", "native-tls", - "rand 0.9.1", + "rand 0.9.2", "sha1", - "thiserror 2.0.12", + "thiserror 2.0.16", "url", "utf-8", ] @@ -5963,30 +5313,16 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] -[[package]] -name = "url-escape" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44e0ce4d1246d075ca5abec4b41d33e87a6054d08e2366b63205665e950db218" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf-8" version = "0.7.6" @@ -6007,9 +5343,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -6040,12 +5376,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vsimd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" - [[package]] name = "waitgroup" version = "0.1.2" @@ -6082,12 +5412,14 @@ dependencies = [ "multer", "percent-encoding", "pin-project", + "rustls-pemfile", "scoped-tls", "serde", "serde_json", "serde_urlencoded", "tokio", - "tokio-tungstenite 0.21.0", + "tokio-rustls 0.25.0", + "tokio-tungstenite", "tokio-util", "tower-service", "tracing", @@ -6101,30 +5433,31 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.4+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "88a5f4a424faf49c3c2c344f166f0662341d470ea185e939657aaff130f0ec4a" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" dependencies = [ "bumpalo", "log", @@ -6136,9 +5469,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" dependencies = [ "cfg-if", "js-sys", @@ -6149,9 +5482,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6159,9 +5492,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" dependencies = [ "proc-macro2", "quote", @@ -6172,18 +5505,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" dependencies = [ "js-sys", "wasm-bindgen", @@ -6201,9 +5534,21 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.2", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "webrtc" @@ -6226,7 +5571,7 @@ dependencies = [ "ring", "rtcp", "rtp", - "rustls 0.23.27", + "rustls 0.23.31", "sdp", "serde", "serde_json", @@ -6277,7 +5622,7 @@ dependencies = [ "byteorder", "cbc", "ccm", - "der-parser", + "der-parser 9.0.0", "hkdf", "hmac", "log", @@ -6288,7 +5633,7 @@ dependencies = [ "rand_core 0.6.4", "rcgen", "ring", - "rustls 0.23.27", + "rustls 0.23.31", "sec1", "serde", "sha1", @@ -6298,7 +5643,7 @@ dependencies = [ "tokio", "webrtc-util", "x25519-dalek", - "x509-parser", + "x509-parser 0.16.0", ] [[package]] @@ -6333,7 +5678,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "979cc85259c53b7b620803509d10d35e2546fa505d228850cbe3f08765ea6ea8" dependencies = [ "log", - "socket2", + "socket2 0.5.10", "thiserror 1.0.69", "tokio", "webrtc-util", @@ -6473,7 +5818,7 @@ dependencies = [ "windows-collections", "windows-core 0.61.2", "windows-future", - "windows-link", + "windows-link 0.1.3", "windows-numerics", ] @@ -6504,7 +5849,7 @@ checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", - "windows-link", + "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings", ] @@ -6516,7 +5861,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", - "windows-link", + "windows-link 0.1.3", "windows-threading", ] @@ -6548,6 +5893,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + [[package]] name = "windows-numerics" version = "0.2.0" @@ -6555,16 +5906,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ "windows-core 0.61.2", - "windows-link", + "windows-link 0.1.3", ] [[package]] name = "windows-registry" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings", ] @@ -6584,7 +5935,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -6593,7 +5944,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -6623,6 +5974,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -6656,10 +6025,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -6676,7 +6046,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -6819,9 +6189,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -6837,13 +6207,10 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] +checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" [[package]] name = "writeable" @@ -6869,12 +6236,12 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" dependencies = [ - "asn1-rs", + "asn1-rs 0.6.2", "data-encoding", - "der-parser", + "der-parser 9.0.0", "lazy_static", "nom", - "oid-registry", + "oid-registry 0.7.1", "ring", "rusticata-macros", "thiserror 1.0.69", @@ -6882,16 +6249,27 @@ dependencies = [ ] [[package]] -name = "xml-rs" -version = "0.8.26" +name = "x509-parser" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "4569f339c0c402346d4a75a9e39cf8dad310e287eef1ff56d4c68e5067f53460" +dependencies = [ + "asn1-rs 0.7.1", + "data-encoding", + "der-parser 10.0.0", + "lazy_static", + "nom", + "oid-registry 0.8.1", + "rusticata-macros", + "thiserror 2.0.16", + "time", +] [[package]] -name = "xmlparser" -version = "0.13.6" +name = "xml-rs" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "xmltree" @@ -6919,16 +6297,16 @@ dependencies = [ [[package]] name = "yamux" -version = "0.13.5" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da1acad1c2dc53f0dde419115a38bd8221d8c3e47ae9aeceaf453266d29307e" +checksum = "2b2dd50a6d6115feb3e5d7d0efd45e8ca364b6c83722c1e9c602f5764e0e9597" dependencies = [ "futures", "log", "nohash-hasher", "parking_lot", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "static_assertions", "web-time", ] @@ -6968,18 +6346,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -7040,9 +6418,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", diff --git a/packages/server/Cargo.toml b/packages/server/Cargo.toml index c3202e79..79d9ab96 100644 --- a/packages/server/Cargo.toml +++ b/packages/server/Cargo.toml @@ -8,9 +8,9 @@ name = "nestri-server" path = "src/main.rs" [dependencies] -gstreamer = { version = "0.23", features = ["v1_26"] } -gstreamer-webrtc = { version = "0.23", features = ["v1_26"] } -gst-plugin-webrtc = { version = "0.13", features = ["v1_22"] } +gstreamer = { version = "0.24", features = ["v1_26"] } +gstreamer-webrtc = { version = "0.24", features = ["v1_26"] } +gst-plugin-webrtc = { version = "0.14" } serde = {version = "1.0", features = ["derive"] } tokio = { version = "1.45", features = ["full"] } tokio-stream = { version = "0.1", features = ["full"] } @@ -28,6 +28,14 @@ prost-types = "0.14" parking_lot = "0.12" atomic_refcell = "0.1" byteorder = "1.5" -libp2p = { version = "0.55", features = ["identify", "dns", "tcp", "noise", "ping", "tokio", "serde", "yamux", "macros", "websocket", "autonat"] } -libp2p-stream = { version = "0.3.0-alpha" } +libp2p = { version = "0.56", features = ["identify", "dns", "tcp", "noise", "ping", "tokio", "serde", "yamux", "macros", "websocket", "autonat"] } +libp2p-identify = "0.47" +libp2p-ping = "0.47" +libp2p-autonat = { version = "0.15", features = ["v2"] } +libp2p-stream = "0.4.0-alpha" +libp2p-yamux = "0.47" +libp2p-noise = "0.46" +libp2p-dns = { version = "0.44", features = ["tokio"] } +libp2p-tcp = { version = "0.44", features = ["tokio"] } +libp2p-websocket = "0.45" dashmap = "6.1" diff --git a/packages/server/rust-toolchain.toml b/packages/server/rust-toolchain.toml new file mode 100644 index 00000000..f4436887 --- /dev/null +++ b/packages/server/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.89" \ No newline at end of file diff --git a/packages/server/src/args.rs b/packages/server/src/args.rs index d49f2337..568d6e87 100644 --- a/packages/server/src/args.rs +++ b/packages/server/src/args.rs @@ -1,5 +1,6 @@ use crate::args::encoding_args::AudioCaptureMethod; use crate::enc_helper::{AudioCodec, EncoderType, VideoCodec}; +use clap::builder::TypedValueParser; use clap::builder::{BoolishValueParser, NonEmptyStringValueParser}; use clap::{Arg, Command, value_parser}; @@ -25,15 +26,6 @@ impl Args { .value_parser(BoolishValueParser::new()) .default_value("false"), ) - .arg( - Arg::new("debug") - .short('d') - .long("debug") - .env("DEBUG") - .help("Enable additional debugging features") - .value_parser(BoolishValueParser::new()) - .default_value("false"), - ) .arg( Arg::new("relay-url") .short('u') @@ -88,8 +80,8 @@ impl Args { .long("gpu-index") .env("GPU_INDEX") .help("GPU to use by index") - .value_parser(value_parser!(i32).range(-1..)) - .default_value("-1"), + .value_parser(value_parser!(u32).range(0..)) + .required(false), ) .arg( Arg::new("gpu-card-path") @@ -154,13 +146,24 @@ impl Args { .value_parser(value_parser!(EncoderType)) .default_value("hardware"), ) + .arg( + Arg::new("video-bit-depth") + .long("video-bit-depth") + .env("VIDEO_BIT_DEPTH") + .help("Video bit depth (8 or 10), only with DMA-BUF and non-H264 codec") + .value_parser( + clap::builder::PossibleValuesParser::new(["8", "10"]) + .map(|s| s.parse::().unwrap()), + ) + .default_value("8"), + ) .arg( Arg::new("audio-capture-method") .long("audio-capture-method") .env("AUDIO_CAPTURE_METHOD") .help("Audio capture method") .value_parser(value_parser!(AudioCaptureMethod)) - .default_value("pulseaudio"), + .default_value("pipewire"), ) .arg( Arg::new("audio-codec") diff --git a/packages/server/src/args/app_args.rs b/packages/server/src/args/app_args.rs index 754579af..d5323f9a 100644 --- a/packages/server/src/args/app_args.rs +++ b/packages/server/src/args/app_args.rs @@ -1,8 +1,6 @@ pub struct AppArgs { /// Verbose output mode pub verbose: bool, - /// Enable additional debug information and features, may affect performance - pub debug: bool, /// Virtual display resolution pub resolution: (u32, u32), @@ -15,13 +13,13 @@ pub struct AppArgs { pub room: String, /// Experimental DMA-BUF support + /// TODO: Move to video encoding flags pub dma_buf: bool, } impl AppArgs { pub fn from_matches(matches: &clap::ArgMatches) -> Self { Self { verbose: matches.get_one::("verbose").unwrap_or(&false).clone(), - debug: matches.get_one::("debug").unwrap_or(&false).clone(), resolution: { let res = matches .get_one::("resolution") @@ -54,7 +52,6 @@ impl AppArgs { pub fn debug_print(&self) { tracing::info!("AppArgs:"); tracing::info!("> verbose: {}", self.verbose); - tracing::info!("> debug: {}", self.debug); tracing::info!( "> resolution: '{}x{}'", self.resolution.0, diff --git a/packages/server/src/args/device_args.rs b/packages/server/src/args/device_args.rs index 38f94020..2e0d525c 100644 --- a/packages/server/src/args/device_args.rs +++ b/packages/server/src/args/device_args.rs @@ -1,37 +1,48 @@ pub struct DeviceArgs { /// GPU vendor (e.g. "intel") - pub gpu_vendor: String, + pub gpu_vendor: Option, /// GPU name (e.g. "a770") - pub gpu_name: String, - /// GPU index, if multiple same GPUs are present, -1 for auto-selection - pub gpu_index: i32, + pub gpu_name: Option, + /// GPU index, if multiple same GPUs are present, None for auto-selection + pub gpu_index: Option, /// GPU card/render path, sets card explicitly from such path - pub gpu_card_path: String, + pub gpu_card_path: Option, } impl DeviceArgs { pub fn from_matches(matches: &clap::ArgMatches) -> Self { Self { gpu_vendor: matches .get_one::("gpu-vendor") - .unwrap_or(&"".to_string()) - .clone(), + .cloned(), gpu_name: matches .get_one::("gpu-name") - .unwrap_or(&"".to_string()) - .clone(), - gpu_index: matches.get_one::("gpu-index").unwrap_or(&-1).clone(), + .cloned(), + gpu_index: matches + .get_one::("gpu-index") + .cloned(), gpu_card_path: matches .get_one::("gpu-card-path") - .unwrap_or(&"".to_string()) - .clone(), + .cloned(), } } pub fn debug_print(&self) { tracing::info!("DeviceArgs:"); - tracing::info!("> gpu_vendor: '{}'", self.gpu_vendor); - tracing::info!("> gpu_name: '{}'", self.gpu_name); - tracing::info!("> gpu_index: {}", self.gpu_index); - tracing::info!("> gpu_card_path: '{}'", self.gpu_card_path); + tracing::info!( + "> gpu_vendor: '{}'", + self.gpu_vendor.as_deref().unwrap_or("auto") + ); + tracing::info!( + "> gpu_name: '{}'", + self.gpu_name.as_deref().unwrap_or("auto") + ); + tracing::info!( + "> gpu_index: {}", + self.gpu_index.map_or("auto".to_string(), |i| i.to_string()) + ); + tracing::info!( + "> gpu_card_path: '{}'", + self.gpu_card_path.as_deref().unwrap_or("auto") + ); } } diff --git a/packages/server/src/args/encoding_args.rs b/packages/server/src/args/encoding_args.rs index d2e8828f..7fc1c6c6 100644 --- a/packages/server/src/args/encoding_args.rs +++ b/packages/server/src/args/encoding_args.rs @@ -64,14 +64,14 @@ pub struct EncodingOptionsBase { /// Codec (e.g. "h264", "opus" etc.) pub codec: Codec, /// Overridable encoder (e.g. "vah264lpenc", "opusenc" etc.) - pub encoder: String, + pub encoder: Option, /// Rate control method (e.g. "cqp", "vbr", "cbr") pub rate_control: RateControl, } impl EncodingOptionsBase { pub fn debug_print(&self) { tracing::info!("> Codec: '{}'", self.codec.as_str()); - tracing::info!("> Encoder: '{}'", self.encoder); + tracing::info!("> Encoder: '{}'", self.encoder.as_deref().unwrap_or("auto")); match &self.rate_control { RateControl::CQP(cqp) => { tracing::info!("> Rate Control: CQP"); @@ -93,6 +93,7 @@ impl EncodingOptionsBase { pub struct VideoEncodingOptions { pub base: EncodingOptionsBase, pub encoder_type: EncoderType, + pub bit_depth: u32, } impl VideoEncodingOptions { pub fn from_matches(matches: &clap::ArgMatches) -> Self { @@ -104,10 +105,7 @@ impl VideoEncodingOptions { .unwrap_or(&VideoCodec::H264) .clone(), ), - encoder: matches - .get_one::("video-encoder") - .unwrap_or(&"".to_string()) - .clone(), + encoder: matches.get_one::("video-encoder").cloned(), rate_control: match matches .get_one::("video-rate-control") .unwrap_or(&RateControlMethod::CBR) @@ -132,6 +130,10 @@ impl VideoEncodingOptions { .get_one::("video-encoder-type") .unwrap_or(&EncoderType::HARDWARE) .clone(), + bit_depth: matches + .get_one::("video-bit-depth") + .copied() + .unwrap_or(8), } } @@ -139,6 +141,7 @@ impl VideoEncodingOptions { tracing::info!("Video Encoding Options:"); self.base.debug_print(); tracing::info!("> Encoder Type: {}", self.encoder_type.as_str()); + tracing::info!("> Bit Depth: {}", self.bit_depth); } } impl Deref for VideoEncodingOptions { @@ -191,10 +194,7 @@ impl AudioEncodingOptions { .unwrap_or(&AudioCodec::OPUS) .clone(), ), - encoder: matches - .get_one::("audio-encoder") - .unwrap_or(&"".to_string()) - .clone(), + encoder: matches.get_one::("audio-encoder").cloned(), rate_control: match matches .get_one::("audio-rate-control") .unwrap_or(&RateControlMethod::CBR) diff --git a/packages/server/src/enc_helper.rs b/packages/server/src/enc_helper.rs index 3879c8d6..6286e954 100644 --- a/packages/server/src/enc_helper.rs +++ b/packages/server/src/enc_helper.rs @@ -1,5 +1,5 @@ use crate::args::encoding_args::RateControl; -use crate::gpu::{GPUInfo, get_gpu_by_card_path, get_gpus_by_vendor, get_nvidia_gpu_by_cuda_id}; +use crate::gpu::{GPUInfo, GPUVendor, get_gpu_by_card_path, get_gpus_by_vendor}; use clap::ValueEnum; use gstreamer::prelude::*; use std::error::Error; @@ -148,7 +148,7 @@ impl VideoEncoderInfo { pub fn apply_parameters(&self, element: &gstreamer::Element, verbose: bool) { for (key, value) in &self.parameters { - if element.has_property(key, None) { + if element.has_property(key) { if verbose { tracing::debug!("Setting property {} to {}", key, value); } @@ -273,7 +273,7 @@ pub fn encoder_gop_params(encoder: &VideoEncoderInfo, gop_size: u32) -> VideoEnc pub fn encoder_low_latency_params( encoder: &VideoEncoderInfo, - rate_control: &RateControl, + _rate_control: &RateControl, framerate: u32, ) -> VideoEncoderInfo { // 2 second GOP size, maybe lower to 1 second for fast recovery, if needed? @@ -375,9 +375,9 @@ pub fn get_compatible_encoders(gpus: &Vec) -> Vec { match api { EncoderAPI::QSV | EncoderAPI::VAAPI => { // Safe property access with panic protection, gstreamer-rs is fun - let path = if element.has_property("device-path", None) { + let path = if element.has_property("device-path") { Some(element.property::("device-path")) - } else if element.has_property("device", None) { + } else if element.has_property("device") { Some(element.property::("device")) } else { None @@ -385,15 +385,46 @@ pub fn get_compatible_encoders(gpus: &Vec) -> Vec { path.and_then(|p| get_gpu_by_card_path(&gpus, &p)) } - EncoderAPI::NVENC if element.has_property("cuda-device-id", None) => { - let cuda_id = element.property::("cuda-device-id"); - get_nvidia_gpu_by_cuda_id(&gpus, cuda_id as usize) + EncoderAPI::NVENC => { + if encoder_name.contains("device") { + // Parse by element name's index (i.e. "nvh264device{N}enc") + let re = regex::Regex::new(r"device(\d+)").unwrap(); + if let Some(caps) = re.captures(encoder_name.as_str()) { + if let Some(m) = caps.get(1) { + if let Ok(id) = m.as_str().parse::() { + return get_gpus_by_vendor(&gpus, GPUVendor::NVIDIA) + .get(id) + .cloned(); + } + } + } + None + } else if element.has_property("cuda-device-id") { + let device_id = + match element.property_value("cuda-device-id").get::() { + Ok(v) if v >= 0 => Some(v as usize), + _ => None, + }; + + // We'll just treat cuda-device-id as an index + device_id.and_then(|id| { + get_gpus_by_vendor(&gpus, GPUVendor::NVIDIA) + .get(id) + .cloned() + }) + } else { + None + } } - EncoderAPI::AMF if element.has_property("device", None) => { - let device_id = element.property::("device"); - get_gpus_by_vendor(&gpus, "amd") - .get(device_id as usize) - .cloned() + EncoderAPI::AMF if element.has_property("device") => { + let device_id = match element.property_value("device").get::() { + Ok(v) => Some(v as usize), + Err(_) => None, + }; + + device_id.and_then(|id| { + get_gpus_by_vendor(&gpus, GPUVendor::AMD).get(id).cloned() + }) } _ => None, } diff --git a/packages/server/src/gpu.rs b/packages/server/src/gpu.rs index 841c3fc2..dc8feabf 100644 --- a/packages/server/src/gpu.rs +++ b/packages/server/src/gpu.rs @@ -1,14 +1,53 @@ -use regex::Regex; +use std::error::Error; use std::fs; -use std::process::Command; use std::str; #[derive(Debug, Eq, PartialEq, Clone, Hash)] pub enum GPUVendor { - UNKNOWN, - INTEL, - NVIDIA, - AMD, + UNKNOWN = 0x0000, + INTEL = 0x8086, + NVIDIA = 0x10de, + AMD = 0x1002, +} +impl From for GPUVendor { + fn from(value: u16) -> Self { + match value { + 0x8086 => GPUVendor::INTEL, + 0x10de => GPUVendor::NVIDIA, + 0x1002 => GPUVendor::AMD, + _ => GPUVendor::UNKNOWN, + } + } +} +impl From<&str> for GPUVendor { + fn from(value: &str) -> Self { + match value.to_lowercase().as_str() { + "intel" => GPUVendor::INTEL, + "nvidia" => GPUVendor::NVIDIA, + "amd" => GPUVendor::AMD, + _ => GPUVendor::UNKNOWN, + } + } +} +impl From for GPUVendor { + fn from(value: String) -> Self { + GPUVendor::from(value.as_str()) + } +} +impl GPUVendor { + pub fn as_str(&self) -> &str { + match self { + GPUVendor::INTEL => "Intel", + GPUVendor::NVIDIA => "NVIDIA", + GPUVendor::AMD => "AMD", + GPUVendor::UNKNOWN => "Unknown", + } + } +} +impl std::fmt::Display for GPUVendor { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.as_str()) + } } #[derive(Debug, Clone, Eq, PartialEq, Hash)] @@ -19,21 +58,11 @@ pub struct GPUInfo { device_name: String, pci_bus_id: String, } - impl GPUInfo { pub fn vendor(&self) -> &GPUVendor { &self.vendor } - pub fn vendor_string(&self) -> &str { - match self.vendor { - GPUVendor::INTEL => "Intel", - GPUVendor::NVIDIA => "NVIDIA", - GPUVendor::AMD => "AMD", - GPUVendor::UNKNOWN => "Unknown", - } - } - pub fn card_path(&self) -> &str { &self.card_path } @@ -49,73 +78,122 @@ impl GPUInfo { pub fn pci_bus_id(&self) -> &str { &self.pci_bus_id } -} -fn get_gpu_vendor(vendor_id: &str) -> GPUVendor { - match vendor_id { - "8086" => GPUVendor::INTEL, - "10de" => GPUVendor::NVIDIA, - "1002" => GPUVendor::AMD, - _ => GPUVendor::UNKNOWN, + pub fn as_str(&self) -> String { + format!( + "{} (Vendor: {}, Card Path: {}, Render Path: {}, PCI Bus ID: {})", + self.device_name, self.vendor, self.card_path, self.render_path, self.pci_bus_id + ) + } +} +impl std::fmt::Display for GPUInfo { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.as_str()) } } /// Retrieves a list of GPUs available on the system. /// # Returns /// * `Vec` - A vector containing information about each GPU. -pub fn get_gpus() -> Vec { - let output = Command::new("lspci") - .args(["-mm", "-nn"]) - .output() - .expect("Failed to execute lspci"); +pub fn get_gpus() -> Result, Box> { + // Use "/sys/class/drm/card{}" to find all GPU devices + let mut gpus = Vec::new(); + let re = regex::Regex::new(r"^card(\d+)$")?; + for entry in fs::read_dir("/sys/class/drm")? { + let entry = entry?; + let file_name = entry.file_name(); + let file_name_str = file_name.to_string_lossy(); - str::from_utf8(&output.stdout) - .unwrap() - .lines() - .filter_map(|line| parse_pci_device(line)) - .filter(|(class_id, _, _, _)| matches!(class_id.as_str(), "0300" | "0302" | "0380")) - .filter_map(|(_, vendor_id, device_name, pci_addr)| { - get_dri_device_path(&pci_addr) - .map(|(card, render)| (vendor_id, card, render, device_name, pci_addr)) - }) - .map( - |(vid, card_path, render_path, device_name, pci_bus_id)| GPUInfo { - vendor: get_gpu_vendor(&vid), + // We are only interested in entries that match "cardN", and getting the minor number + let caps = match re.captures(&file_name_str) { + Some(caps) => caps, + None => continue, + }; + let minor = &caps[1]; + + // Read vendor and device ID + let vendor_str = fs::read_to_string(format!("/sys/class/drm/card{}/device/vendor", minor))?; + let vendor_str = vendor_str.trim_start_matches("0x").trim_end_matches('\n'); + let vendor = u16::from_str_radix(vendor_str, 16)?; + + let device_str = fs::read_to_string(format!("/sys/class/drm/card{}/device/device", minor))?; + let device_str = device_str.trim_start_matches("0x").trim_end_matches('\n'); + + // Look up in hwdata PCI database + let device_name = match fs::read_to_string("/usr/share/hwdata/pci.ids") { + Ok(pci_ids) => parse_pci_ids(&pci_ids, vendor_str, device_str).unwrap_or("".to_owned()), + Err(e) => { + tracing::warn!("Failed to read /usr/share/hwdata/pci.ids: {}", e); + "".to_owned() + } + }; + + // Read PCI bus ID + let pci_bus_id = fs::read_to_string(format!("/sys/class/drm/card{}/device/uevent", minor))?; + let pci_bus_id = pci_bus_id + .lines() + .find_map(|line| { + if line.starts_with("PCI_SLOT_NAME=") { + Some(line.trim_start_matches("PCI_SLOT_NAME=").to_owned()) + } else { + None + } + }) + .ok_or("PCI_SLOT_NAME not found")?; + + // Get DRI device paths + if let Some((card_path, render_path)) = get_dri_device_path(pci_bus_id.as_str()) { + gpus.push(GPUInfo { + vendor: vendor.into(), card_path, render_path, device_name, pci_bus_id, - }, - ) - .collect() + }); + } + } + + Ok(gpus) } -fn parse_pci_device(line: &str) -> Option<(String, String, String, String)> { - let re = Regex::new( - r#"^(?P\S+)\s+"[^\[]*\[(?P[0-9a-f]{4})\].*?"\s+"[^"]*?\[(?P[0-9a-f]{4})\][^"]*?"\s+"(?P[^"]+?)""#, - ).unwrap(); +fn parse_pci_ids(pci_data: &str, vendor_id: &str, device_id: &str) -> Option { + let mut current_vendor = String::new(); + let vendor_id = vendor_id.to_lowercase(); + let device_id = device_id.to_lowercase(); - let caps = re.captures(line)?; + for line in pci_data.lines() { + // Skip comments and empty lines + if line.starts_with('#') || line.is_empty() { + continue; + } - // Clean device name by removing only the trailing device ID - let device_name = caps.name("device_name")?.as_str().trim(); - let clean_re = Regex::new(r"\s+\[[0-9a-f]{4}\]$").unwrap(); - let cleaned_name = clean_re.replace(device_name, "").trim().to_string(); + // Check for vendor lines (no leading whitespace) + if !line.starts_with(['\t', ' ']) { + let mut parts = line.splitn(2, ' '); + if let (Some(vendor), Some(_)) = (parts.next(), parts.next()) { + current_vendor = vendor.to_lowercase(); + } + continue; + } - Some(( - caps.name("class_id")?.as_str().to_lowercase(), - caps.name("vendor_id")?.as_str().to_lowercase(), - cleaned_name, - caps.name("pci_addr")?.as_str().to_string(), - )) + // Check for device lines (leading whitespace) + let line = line.trim_start(); + let mut parts = line.splitn(2, ' '); + if let (Some(dev_id), Some(desc)) = (parts.next(), parts.next()) { + if dev_id.to_lowercase() == device_id && current_vendor == vendor_id { + return Some(desc.trim().to_owned()); + } + } + } + + None } fn get_dri_device_path(pci_addr: &str) -> Option<(String, String)> { - let target_dir = format!("0000:{}", pci_addr); let entries = fs::read_dir("/sys/bus/pci/devices").ok()?; for entry in entries.flatten() { - if !entry.path().to_string_lossy().contains(&target_dir) { + if !entry.path().to_string_lossy().contains(&pci_addr) { continue; } @@ -145,10 +223,9 @@ fn get_dri_device_path(pci_addr: &str) -> Option<(String, String)> { None } -pub fn get_gpus_by_vendor(gpus: &[GPUInfo], vendor: &str) -> Vec { - let target = vendor.to_lowercase(); +pub fn get_gpus_by_vendor(gpus: &[GPUInfo], vendor: GPUVendor) -> Vec { gpus.iter() - .filter(|gpu| gpu.vendor_string().to_lowercase() == target) + .filter(|gpu| *gpu.vendor() == vendor) .cloned() .collect() } @@ -169,42 +246,22 @@ pub fn get_gpu_by_card_path(gpus: &[GPUInfo], path: &str) -> Option { .cloned() } -pub fn get_nvidia_gpu_by_cuda_id(gpus: &[GPUInfo], cuda_device_id: usize) -> Option { - // Check if nvidia-smi is available - if Command::new("nvidia-smi").arg("--help").output().is_err() { - tracing::warn!("nvidia-smi is not available"); - return None; +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[ignore = "requires access to /sys/class/drm and a GPU; not suitable for default CI"] + fn test_get_gpus() { + let gpus = get_gpus().unwrap(); + // Environment-dependent; just print for manual runs. + if gpus.is_empty() { + eprintln!("No GPUs found; skipping assertions"); + return; + } + // Print the GPUs found for manual verification + for gpu in &gpus { + println!("{}", gpu); + } } - - // Run nvidia-smi to get information about the CUDA device - let output = Command::new("nvidia-smi") - .args([ - "--query-gpu=pci.bus_id", - "--format=csv,noheader", - "-i", - &cuda_device_id.to_string(), - ]) - .output() - .ok()?; - - if !output.status.success() { - return None; - } - - // Parse the output to get the PCI bus ID - let pci_bus_id = str::from_utf8(&output.stdout).ok()?.trim().to_uppercase(); // nvidia-smi returns uppercase PCI IDs - - // Convert from 00000000:05:00.0 to 05:00.0 if needed - let pci_bus_id = if pci_bus_id.starts_with("00000000:") { - pci_bus_id[9..].to_string() // Skip the domain part - } else if pci_bus_id.starts_with("0000:") { - pci_bus_id[5..].to_string() // Alternate check for older nvidia-smi versions - } else { - pci_bus_id - }; - - // Find the GPU with the matching PCI bus ID - gpus.iter() - .find(|gpu| gpu.vendor == GPUVendor::NVIDIA && gpu.pci_bus_id.to_uppercase() == pci_bus_id) - .cloned() } diff --git a/packages/server/src/main.rs b/packages/server/src/main.rs index 7a10186a..d2fd81b0 100644 --- a/packages/server/src/main.rs +++ b/packages/server/src/main.rs @@ -25,43 +25,42 @@ use tracing_subscriber::filter::LevelFilter; // Handles gathering GPU information and selecting the most suitable GPU fn handle_gpus(args: &args::Args) -> Result, Box> { tracing::info!("Gathering GPU information.."); - let mut gpus = gpu::get_gpus(); + let mut gpus = gpu::get_gpus()?; if gpus.is_empty() { return Err("No GPUs found".into()); } for (i, gpu) in gpus.iter().enumerate() { - tracing::info!( - "> [GPU:{}] Vendor: '{}', Card Path: '{}', Render Path: '{}', Device Name: '{}'", - i, - gpu.vendor_string(), - gpu.card_path(), - gpu.render_path(), - gpu.device_name() - ); + tracing::info!("> [GPU:{}] {}", i, gpu); } // Additional GPU filtering - if !args.device.gpu_card_path.is_empty() { - if let Some(gpu) = gpu::get_gpu_by_card_path(&gpus, &args.device.gpu_card_path) { - return Ok(Vec::from([gpu])); - } + if let Some(gpu_card_path) = &args.device.gpu_card_path { + return match gpu::get_gpu_by_card_path(&gpus, gpu_card_path.as_str()) { + Some(gpu) => Ok(Vec::from([gpu])), + None => Err(format!( + "No GPU found with the specified card path: '{}'", + gpu_card_path + ) + .into()), + }; } else { // Run all filters that are not empty let mut filtered_gpus = gpus.clone(); - if !args.device.gpu_vendor.is_empty() { - filtered_gpus = gpu::get_gpus_by_vendor(&filtered_gpus, &args.device.gpu_vendor); + if let Some(gpu_vendor) = &args.device.gpu_vendor { + filtered_gpus = + gpu::get_gpus_by_vendor(&filtered_gpus, GPUVendor::from(gpu_vendor.clone())); } - if !args.device.gpu_name.is_empty() { - filtered_gpus = gpu::get_gpus_by_device_name(&filtered_gpus, &args.device.gpu_name); + if let Some(gpu_name) = &args.device.gpu_name { + filtered_gpus = gpu::get_gpus_by_device_name(&filtered_gpus, gpu_name.as_str()); } - if args.device.gpu_index > -1 { + if let Some(gpu_index) = &args.device.gpu_index { // get single GPU by index - let gpu_index = args.device.gpu_index as usize; + let gpu_index = *gpu_index as usize; if gpu_index >= filtered_gpus.len() { return Err(format!( "GPU index {} is out of bounds for available GPUs (0-{})", gpu_index, - filtered_gpus.len() - 1 + filtered_gpus.len().saturating_sub(1) ) .into()); } @@ -77,10 +76,10 @@ fn handle_gpus(args: &args::Args) -> Result, Box> { if gpus.is_empty() { return Err(format!( "No GPU(s) found with the specified parameters: vendor='{}', name='{}', index='{}', card_path='{}'", - args.device.gpu_vendor, - args.device.gpu_name, - args.device.gpu_index, - args.device.gpu_card_path + args.device.gpu_vendor.as_deref().unwrap_or("auto"), + args.device.gpu_name.as_deref().unwrap_or("auto"), + args.device.gpu_index.map_or("auto".to_string(), |i| i.to_string()), + args.device.gpu_card_path.as_deref().unwrap_or("auto") ).into()); } Ok(gpus) @@ -112,9 +111,8 @@ fn handle_encoder_video( } // Pick most suitable video encoder based on given arguments let video_encoder; - if !args.encoding.video.encoder.is_empty() { - video_encoder = - enc_helper::get_encoder_by_name(&video_encoders, &args.encoding.video.encoder)?; + if let Some(wanted_encoder) = &args.encoding.video.encoder { + video_encoder = enc_helper::get_encoder_by_name(&video_encoders, wanted_encoder.as_str())?; } else { video_encoder = enc_helper::get_best_working_encoder( &video_encoders, @@ -164,11 +162,12 @@ fn handle_encoder_video_settings( // Handles picking audio encoder // TODO: Expand enc_helper with audio types, for now just opus fn handle_encoder_audio(args: &args::Args) -> String { - let audio_encoder = if args.encoding.audio.encoder.is_empty() { - "opusenc".to_string() - } else { - args.encoding.audio.encoder.clone() - }; + let audio_encoder = args + .encoding + .audio + .encoder + .clone() + .unwrap_or_else(|| "opusenc".to_string()); tracing::info!("Selected audio encoder: '{}'", audio_encoder); audio_encoder } @@ -197,10 +196,6 @@ async fn main() -> Result<(), Box> { // Get relay URL from arguments let relay_url = args.app.relay_url.trim(); - // Initialize libp2p (logically the sink should handle the connection to be independent) - let nestri_p2p = Arc::new(NestriP2P::new().await?); - let p2p_conn = nestri_p2p.connect(relay_url).await?; - gstreamer::init()?; let _ = gstrswebrtc::plugin_register_static(); // Might be already registered, so we'll pass.. @@ -239,6 +234,10 @@ async fn main() -> Result<(), Box> { // Handle audio encoder selection let audio_encoder = handle_encoder_audio(&args); + // Initialize libp2p (logically the sink should handle the connection to be independent) + let nestri_p2p = Arc::new(NestriP2P::new().await?); + let p2p_conn = nestri_p2p.connect(relay_url).await?; + /*** PIPELINE CREATION ***/ // Create the pipeline let pipeline = Arc::new(gstreamer::Pipeline::new()); @@ -250,7 +249,9 @@ async fn main() -> Result<(), Box> { gstreamer::ElementFactory::make("pulsesrc").build()? } encoding_args::AudioCaptureMethod::PIPEWIRE => { - gstreamer::ElementFactory::make("pipewiresrc").build()? + let pw_element = gstreamer::ElementFactory::make("pipewiresrc").build()?; + pw_element.set_property("use-bufferpool", &false); // false for audio + pw_element } encoding_args::AudioCaptureMethod::ALSA => { gstreamer::ElementFactory::make("alsasrc").build()? @@ -279,7 +280,7 @@ async fn main() -> Result<(), Box> { }, ); // If has "frame-size" (opus), set to 10 for lower latency (below 10 seems to be too low?) - if audio_encoder.has_property("frame-size", None) { + if audio_encoder.has_property("frame-size") { audio_encoder.set_property_from_str("frame-size", "10"); } @@ -313,6 +314,17 @@ async fn main() -> Result<(), Box> { ))?; caps_filter.set_property("caps", &caps); + // Get bit-depth and choose appropriate format (NV12 or P010_10LE) + // H.264 does not support above 8-bit. Also we require DMA-BUF. + let video_format = if args.encoding.video.bit_depth == 10 + && args.app.dma_buf + && video_encoder_info.codec != enc_helper::VideoCodec::H264 + { + "P010_10LE" + } else { + "NV12" + }; + // GL and CUDA elements (NVIDIA only..) let mut glupload = None; let mut glconvert = None; @@ -325,7 +337,9 @@ async fn main() -> Result<(), Box> { glconvert = Some(gstreamer::ElementFactory::make("glcolorconvert").build()?); // GL color convert caps let caps_filter = gstreamer::ElementFactory::make("capsfilter").build()?; - let gl_caps = gstreamer::Caps::from_str("video/x-raw(memory:GLMemory),format=NV12")?; + let gl_caps = gstreamer::Caps::from_str( + format!("video/x-raw(memory:GLMemory),format={video_format}").as_str(), + )?; caps_filter.set_property("caps", &gl_caps); gl_caps_filter = Some(caps_filter); // CUDA upload element @@ -341,7 +355,9 @@ async fn main() -> Result<(), Box> { vapostproc = Some(gstreamer::ElementFactory::make("vapostproc").build()?); // VA caps filter let caps_filter = gstreamer::ElementFactory::make("capsfilter").build()?; - let va_caps = gstreamer::Caps::from_str("video/x-raw(memory:VAMemory),format=NV12")?; + let va_caps = gstreamer::Caps::from_str( + format!("video/x-raw(memory:VAMemory),format={video_format}").as_str(), + )?; caps_filter.set_property("caps", &va_caps); va_caps_filter = Some(caps_filter); } diff --git a/packages/server/src/nestrisink/imp.rs b/packages/server/src/nestrisink/imp.rs index 9d98c82f..c109fea0 100644 --- a/packages/server/src/nestrisink/imp.rs +++ b/packages/server/src/nestrisink/imp.rs @@ -9,7 +9,7 @@ use atomic_refcell::AtomicRefCell; use glib::subclass::prelude::*; use gstreamer::glib; use gstreamer::prelude::*; -use gstreamer_webrtc::{gst_sdp, WebRTCSDPType, WebRTCSessionDescription}; +use gstreamer_webrtc::{WebRTCSDPType, WebRTCSessionDescription, gst_sdp}; use gstrswebrtc::signaller::{Signallable, SignallableImpl}; use parking_lot::RwLock as PLRwLock; use prost::Message; diff --git a/packages/server/src/p2p.rs b/packages/server/src/p2p.rs index 23d325b3..5d73a2ee 100644 --- a/packages/server/src/p2p.rs +++ b/packages/server/src/p2p.rs @@ -1,3 +1,3 @@ pub mod p2p; +pub mod p2p_protocol_stream; pub mod p2p_safestream; -pub mod p2p_protocol_stream; \ No newline at end of file diff --git a/packages/server/src/p2p/p2p.rs b/packages/server/src/p2p/p2p.rs index a9d66f9f..586dc20a 100644 --- a/packages/server/src/p2p/p2p.rs +++ b/packages/server/src/p2p/p2p.rs @@ -1,10 +1,16 @@ use libp2p::futures::StreamExt; use libp2p::multiaddr::Protocol; use libp2p::{ - Multiaddr, PeerId, Swarm, identify, noise, ping, + Multiaddr, PeerId, Swarm, identity, swarm::{NetworkBehaviour, SwarmEvent}, - tcp, yamux, }; +use libp2p_autonat as autonat; +use libp2p_identify as identify; +use libp2p_noise as noise; +use libp2p_ping as ping; +use libp2p_stream as stream; +use libp2p_tcp as tcp; +use libp2p_yamux as yamux; use std::error::Error; use std::sync::Arc; use tokio::sync::Mutex; @@ -12,15 +18,28 @@ use tokio::sync::Mutex; #[derive(Clone)] pub struct NestriConnection { pub peer_id: PeerId, - pub control: libp2p_stream::Control, + pub control: stream::Control, } #[derive(NetworkBehaviour)] struct NestriBehaviour { identify: identify::Behaviour, ping: ping::Behaviour, - stream: libp2p_stream::Behaviour, - autonatv2: libp2p::autonat::v2::client::Behaviour, + stream: stream::Behaviour, + autonatv2: autonat::v2::client::Behaviour, +} +impl NestriBehaviour { + fn new(key: identity::PublicKey) -> Self { + Self { + identify: identify::Behaviour::new(identify::Config::new( + "/ipfs/id/1.0.0".to_string(), + key, + )), + ping: ping::Behaviour::default(), + stream: stream::Behaviour::default(), + autonatv2: autonat::v2::client::Behaviour::default(), + } + } } pub struct NestriP2P { @@ -39,22 +58,7 @@ impl NestriP2P { .with_dns()? .with_websocket(noise::Config::new, yamux::Config::default) .await? - .with_behaviour(|key| { - let identify_behaviour = identify::Behaviour::new(identify::Config::new( - "/ipfs/id/1.0.0".to_string(), - key.public(), - )); - let ping_behaviour = ping::Behaviour::default(); - let stream_behaviour = libp2p_stream::Behaviour::default(); - let autonatv2_behaviour = libp2p::autonat::v2::client::Behaviour::default(); - - Ok(NestriBehaviour { - identify: identify_behaviour, - ping: ping_behaviour, - stream: stream_behaviour, - autonatv2: autonatv2_behaviour, - }) - })? + .with_behaviour(|key| NestriBehaviour::new(key.public()))? .build(), )); @@ -62,12 +66,6 @@ impl NestriP2P { let swarm_clone = swarm.clone(); tokio::spawn(swarm_loop(swarm_clone)); - { - let mut swarm_lock = swarm.lock().await; - swarm_lock.listen_on("/ip4/0.0.0.0/tcp/0".parse()?)?; // IPv4 - TCP Raw - swarm_lock.listen_on("/ip6/::/tcp/0".parse()?)?; // IPv6 - TCP Raw - } - Ok(NestriP2P { swarm }) } @@ -95,6 +93,55 @@ async fn swarm_loop(swarm: Arc>>) { swarm_lock.select_next_some().await }; match event { + /* Ping Events */ + SwarmEvent::Behaviour(NestriBehaviourEvent::Ping(ping::Event { + peer, + connection, + result, + })) => { + if let Ok(latency) = result { + tracing::debug!( + "Ping event - peer: {}, connection: {:?}, latency: {} us", + peer, + connection, + latency.as_micros() + ); + } else if let Err(err) = result { + tracing::warn!( + "Ping event - peer: {}, connection: {:?}, error: {:?}", + peer, + connection, + err + ); + } + } + /* Autonat (v2) Events */ + SwarmEvent::Behaviour(NestriBehaviourEvent::Autonatv2( + autonat::v2::client::Event { + server, + tested_addr, + bytes_sent, + result, + }, + )) => { + if let Ok(()) = result { + tracing::debug!( + "AutonatV2 event - test server '{}' verified address '{}' with {} bytes sent", + server, + tested_addr, + bytes_sent + ); + } else if let Err(err) = result { + tracing::warn!( + "AutonatV2 event - test server '{}' failed to verify address '{}' with {} bytes sent: {:?}", + server, + tested_addr, + bytes_sent, + err + ); + } + } + /* Swarm Events */ SwarmEvent::NewListenAddr { address, .. } => { tracing::info!("Listening on: '{}'", address); } @@ -130,6 +177,13 @@ async fn swarm_loop(swarm: Arc>>) { tracing::error!("Failed to connect: {}", error); } } + SwarmEvent::ExternalAddrConfirmed { address } => { + tracing::info!("Confirmed external address: {}", address); + } + /* Unhandled Events */ + SwarmEvent::Behaviour(event) => { + tracing::warn!("Unhandled Behaviour event: {:?}", event); + } _ => {} } } diff --git a/packages/server/src/p2p/p2p_safestream.rs b/packages/server/src/p2p/p2p_safestream.rs index f243be21..3a83373e 100644 --- a/packages/server/src/p2p/p2p_safestream.rs +++ b/packages/server/src/p2p/p2p_safestream.rs @@ -1,9 +1,6 @@ use byteorder::{BigEndian, ByteOrder}; use libp2p::futures::io::{ReadHalf, WriteHalf}; use libp2p::futures::{AsyncReadExt, AsyncWriteExt}; -use prost::Message; -use serde::Serialize; -use serde::de::DeserializeOwned; use std::sync::Arc; use tokio::sync::Mutex; @@ -22,37 +19,6 @@ impl SafeStream { } } - pub async fn send_json( - &self, - data: &T, - ) -> Result<(), Box> { - let json_data = serde_json::to_vec(data)?; - tracing::info!("Sending JSON"); - let e = self.send_with_length_prefix(&json_data).await; - tracing::info!("Sent JSON"); - e - } - - pub async fn receive_json(&self) -> Result> { - let data = self.receive_with_length_prefix().await?; - let msg = serde_json::from_slice(&data)?; - Ok(msg) - } - - pub async fn send_proto(&self, msg: &M) -> Result<(), Box> { - let mut proto_data = Vec::new(); - msg.encode(&mut proto_data)?; - self.send_with_length_prefix(&proto_data).await - } - - pub async fn receive_proto( - &self, - ) -> Result> { - let data = self.receive_with_length_prefix().await?; - let msg = M::decode(&*data)?; - Ok(msg) - } - pub async fn send_raw(&self, data: &[u8]) -> Result<(), Box> { self.send_with_length_prefix(data).await } diff --git a/packages/server/src/proto/proto.rs b/packages/server/src/proto/proto.rs index 3c1e3d56..5c070b86 100644 --- a/packages/server/src/proto/proto.rs +++ b/packages/server/src/proto/proto.rs @@ -3,17 +3,17 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoTimestampEntry { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub stage: ::prost::alloc::string::String, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub time: ::core::option::Option<::prost_types::Timestamp>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoLatencyTracker { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub sequence_id: ::prost::alloc::string::String, - #[prost(message, repeated, tag="2")] + #[prost(message, repeated, tag = "2")] pub timestamps: ::prost::alloc::vec::Vec, } /// MouseMove message @@ -21,11 +21,11 @@ pub struct ProtoLatencyTracker { #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoMouseMove { /// Fixed value "MouseMove" - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub r#type: ::prost::alloc::string::String, - #[prost(int32, tag="2")] + #[prost(int32, tag = "2")] pub x: i32, - #[prost(int32, tag="3")] + #[prost(int32, tag = "3")] pub y: i32, } /// MouseMoveAbs message @@ -33,11 +33,11 @@ pub struct ProtoMouseMove { #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoMouseMoveAbs { /// Fixed value "MouseMoveAbs" - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub r#type: ::prost::alloc::string::String, - #[prost(int32, tag="2")] + #[prost(int32, tag = "2")] pub x: i32, - #[prost(int32, tag="3")] + #[prost(int32, tag = "3")] pub y: i32, } /// MouseWheel message @@ -45,11 +45,11 @@ pub struct ProtoMouseMoveAbs { #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoMouseWheel { /// Fixed value "MouseWheel" - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub r#type: ::prost::alloc::string::String, - #[prost(int32, tag="2")] + #[prost(int32, tag = "2")] pub x: i32, - #[prost(int32, tag="3")] + #[prost(int32, tag = "3")] pub y: i32, } /// MouseKeyDown message @@ -57,9 +57,9 @@ pub struct ProtoMouseWheel { #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoMouseKeyDown { /// Fixed value "MouseKeyDown" - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub r#type: ::prost::alloc::string::String, - #[prost(int32, tag="2")] + #[prost(int32, tag = "2")] pub key: i32, } /// MouseKeyUp message @@ -67,9 +67,9 @@ pub struct ProtoMouseKeyDown { #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoMouseKeyUp { /// Fixed value "MouseKeyUp" - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub r#type: ::prost::alloc::string::String, - #[prost(int32, tag="2")] + #[prost(int32, tag = "2")] pub key: i32, } /// KeyDown message @@ -77,9 +77,9 @@ pub struct ProtoMouseKeyUp { #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoKeyDown { /// Fixed value "KeyDown" - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub r#type: ::prost::alloc::string::String, - #[prost(int32, tag="2")] + #[prost(int32, tag = "2")] pub key: i32, } /// KeyUp message @@ -87,53 +87,53 @@ pub struct ProtoKeyDown { #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoKeyUp { /// Fixed value "KeyUp" - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub r#type: ::prost::alloc::string::String, - #[prost(int32, tag="2")] + #[prost(int32, tag = "2")] pub key: i32, } /// Union of all Input types #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoInput { - #[prost(oneof="proto_input::InputType", tags="1, 2, 3, 4, 5, 6, 7")] + #[prost(oneof = "proto_input::InputType", tags = "1, 2, 3, 4, 5, 6, 7")] pub input_type: ::core::option::Option, } /// Nested message and enum types in `ProtoInput`. pub mod proto_input { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum InputType { - #[prost(message, tag="1")] + #[prost(message, tag = "1")] MouseMove(super::ProtoMouseMove), - #[prost(message, tag="2")] + #[prost(message, tag = "2")] MouseMoveAbs(super::ProtoMouseMoveAbs), - #[prost(message, tag="3")] + #[prost(message, tag = "3")] MouseWheel(super::ProtoMouseWheel), - #[prost(message, tag="4")] + #[prost(message, tag = "4")] MouseKeyDown(super::ProtoMouseKeyDown), - #[prost(message, tag="5")] + #[prost(message, tag = "5")] MouseKeyUp(super::ProtoMouseKeyUp), - #[prost(message, tag="6")] + #[prost(message, tag = "6")] KeyDown(super::ProtoKeyDown), - #[prost(message, tag="7")] + #[prost(message, tag = "7")] KeyUp(super::ProtoKeyUp), } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoMessageBase { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub payload_type: ::prost::alloc::string::String, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub latency: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProtoMessageInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub message_base: ::core::option::Option, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub data: ::core::option::Option, } // @@protoc_insertion_point(module)