diff --git a/.github/actions/setup-rust-cross/action.yaml b/.github/actions/setup-rust-cross/action.yaml new file mode 100644 index 0000000..d8598ff --- /dev/null +++ b/.github/actions/setup-rust-cross/action.yaml @@ -0,0 +1,28 @@ +# ******************************************************************************** +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# *******************************************************************************/ + +name: "Setup Rust and Cross" +description: "Installs Rust and the Cross crate" +runs: + using: "composite" + steps: + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + + - name: Install Cross + shell: bash + run: cargo install cross --git https://github.com/cross-rs/cross diff --git a/.github/workflows/containerize-and-push.yaml b/.github/workflows/containerize-and-push.yaml new file mode 100644 index 0000000..b21cbaf --- /dev/null +++ b/.github/workflows/containerize-and-push.yaml @@ -0,0 +1,160 @@ +# ******************************************************************************** +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# *******************************************************************************/ + +name: Containerize uStreamer and Push to Container Registry + +on: + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }}/configurable-streamer + +jobs: + setup: + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + steps: + - name: Extract metadata and create tag + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch + type=ref,event=tag + type=ref,event=pr + + build-arm64: + needs: setup + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + outputs: + digest: ${{ steps.build_and_push.outputs.digest }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Install Rust and Cross + uses: ./.github/actions/setup-rust-cross + + - name: Cross Build for arm64 + working-directory: configurable-streamer + run: | + cross build --target aarch64-unknown-linux-musl --release + + - name: Fix Registry and Repository names + shell: bash + run: | + echo "REGISTRY=$(echo $REGISTRY | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + echo "IMAGE_NAME=$(echo $IMAGE_NAME | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + + - name: Build and push Docker image for arm64 + id: build_and_push + uses: docker/build-push-action@v5 + with: + context: . + file: "configurable-streamer/Dockerfile.arm" + push: true + platforms: linux/arm64 + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:arm64-${{ github.sha }} + labels: ${{ needs.setup.outputs.labels }} + + build-amd64: + needs: setup + runs-on: ubuntu-latest + outputs: + digest: ${{ steps.build_and_push.outputs.digest }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Install Rust and Cross + uses: ./.github/actions/setup-rust-cross + + - name: Cross Build for amd64 + working-directory: configurable-streamer + run: | + cross build --target x86_64-unknown-linux-musl --release + + - name: Fix Registry and Repository names + shell: bash + run: | + echo "REGISTRY=$(echo $REGISTRY | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + echo "IMAGE_NAME=$(echo $IMAGE_NAME | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + + - name: Build and push Docker image for amd64 + id: build_and_push + uses: docker/build-push-action@v5 + with: + context: . + file: "configurable-streamer/Dockerfile.amd" + push: true + platforms: linux/amd64 + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:amd64-${{ github.sha }} + labels: ${{ needs.setup.outputs.labels }} + + create-manifest: + needs: [setup, build-arm64, build-amd64] + runs-on: ubuntu-latest + permissions: + packages: write + steps: + - name: Login to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Fix Registry and Repository names + shell: bash + run: | + echo "REGISTRY=$(echo $REGISTRY | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + echo "IMAGE_NAME=$(echo $IMAGE_NAME | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + + - name: Create and push manifest + shell: bash + run: | + for tag in ${{ needs.setup.outputs.tags }}; do + docker buildx imagetools create -t $tag \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:amd64-${{ github.sha }} \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:arm64-${{ github.sha }} + done diff --git a/Cargo.lock b/Cargo.lock index 01f869f..1051518 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,7 +35,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -139,6 +139,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "array-init" version = "2.1.0" @@ -157,7 +163,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -169,7 +175,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "synstructure", ] @@ -181,7 +187,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -393,7 +399,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -451,7 +457,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.86", + "syn 2.0.87", "which", ] @@ -464,7 +470,7 @@ dependencies = [ "autocxx-engine", "env_logger 0.9.3", "indexmap 1.9.3", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -491,9 +497,9 @@ dependencies = [ "rustversion", "serde_json", "strum_macros", - "syn 2.0.86", + "syn 2.0.87", "tempfile", - "thiserror", + "thiserror 1.0.69", "version_check", ] @@ -507,7 +513,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -524,8 +530,41 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.86", - "thiserror", + "syn 2.0.87", + "thiserror 1.0.69", +] + +[[package]] +name = "aws-lc-rs" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa9b6986f250236c27e5a204062434a773a13243d2ffc2955f37bdba4c5c6a1" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "backon" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd0b50b1b78dbadd44ab18b3c794e496f3a139abb9fbc27d9c94c4eebbb96496" +dependencies = [ + "fastrand 2.1.1", + "tokio", ] [[package]] @@ -576,6 +615,29 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.10.5", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.87", + "which", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -613,6 +675,56 @@ dependencies = [ "piper", ] +[[package]] +name = "bollard" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ccca1260af6a459d75994ad5acc1651bcabcbdbc41467cc9786519ab854c30" +dependencies = [ + "base64 0.22.1", + "bollard-stubs", + "bytes", + "futures-core", + "futures-util", + "hex", + "home", + "http", + "http-body-util", + "hyper", + "hyper-named-pipe", + "hyper-rustls", + "hyper-util", + "hyperlocal", + "log", + "pin-project-lite", + "rustls", + "rustls-native-certs 0.8.1", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "serde_urlencoded", + "thiserror 2.0.12", + "tokio", + "tokio-util", + "tower-service", + "url", + "winapi", +] + +[[package]] +name = "bollard-stubs" +version = "1.47.1-rc.27.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f179cfbddb6e77a5472703d4b30436bff32929c0aa8a9008ecf23d1d3cdd0da" +dependencies = [ + "serde", + "serde_repr", + "serde_with", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -627,9 +739,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cache-padded" @@ -639,10 +751,12 @@ checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -683,6 +797,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-targets 0.52.6", ] @@ -739,7 +854,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -792,6 +907,27 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "configurable-streamer" +version = "0.1.0" +dependencies = [ + "async-trait", + "clap", + "env_logger 0.10.2", + "hello-world-protos", + "json5", + "log", + "protobuf", + "serde", + "tokio", + "up-rust", + "up-streamer", + "up-transport-mqtt5", + "up-transport-zenoh", + "usubscription-static-file", + "zenoh", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -828,6 +964,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -911,7 +1057,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -923,7 +1069,7 @@ dependencies = [ "codespan-reporting", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -940,7 +1086,42 @@ checksum = "a1719100f31492cd6adeeab9a0f46cdbc846e615fdb66d7b398aa46ec7fdd06f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.87", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.87", ] [[package]] @@ -981,26 +1162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.86", + "serde", ] [[package]] @@ -1044,9 +1206,26 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", +] + +[[package]] +name = "docker_credential" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31951f49556e34d90ed28342e1df7e1cb7a229c4cab0aecc627b5d91edd41d07" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dyn-clone" version = "1.0.17" @@ -1102,12 +1281,23 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", ] [[package]] @@ -1184,6 +1374,18 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1208,6 +1410,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1232,6 +1440,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures" version = "0.3.31" @@ -1316,7 +1530,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1374,10 +1588,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.31.1" @@ -1401,7 +1627,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1459,9 +1685,14 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -1507,6 +1738,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "hmac" version = "0.12.1" @@ -1565,6 +1802,12 @@ version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "humantime" version = "2.1.0" @@ -1584,6 +1827,7 @@ dependencies = [ "http", "http-body", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -1591,6 +1835,21 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-named-pipe" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" +dependencies = [ + "hex", + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", + "winapi", +] + [[package]] name = "hyper-rustls" version = "0.27.3" @@ -1643,6 +1902,21 @@ dependencies = [ "tracing", ] +[[package]] +name = "hyperlocal" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" +dependencies = [ + "hex", + "http-body-util", + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -1667,47 +1941,183 @@ dependencies = [ ] [[package]] -name = "idna" -version = "0.5.0" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "indexmap" -version = "1.9.3" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "indexmap" -version = "2.6.0" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ - "equivalent", - "hashbrown 0.15.0", + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "indoc" -version = "1.0.9" +name = "icu_locid_transform_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] -name = "inout" -version = "0.1.3" +name = "icu_normalizer" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "indoc" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ "generic-array", ] @@ -1831,7 +2241,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", ] @@ -1841,12 +2251,23 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.2", + "libc", +] + [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1905,9 +2326,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libloading" @@ -1933,6 +2354,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", + "redox_syscall 0.5.7", ] [[package]] @@ -1956,6 +2378,18 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + [[package]] name = "lock_api" version = "0.4.12" @@ -2022,7 +2456,7 @@ dependencies = [ "supports-unicode", "terminal_size", "textwrap", - "thiserror", + "thiserror 1.0.69", "unicode-width", ] @@ -2034,7 +2468,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2066,7 +2500,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -2085,7 +2519,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -2100,7 +2534,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -2133,6 +2567,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nonempty-collections" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f301452dbaf00f14ca0c8204e46cf0c9a96f53543ac72cefa9b4d91c19e0ac" +dependencies = [ + "serde", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -2263,7 +2706,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2320,9 +2763,9 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] name = "paho-mqtt" -version = "0.12.5" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8367868d51cef74c28da328ed8f60529ddd3f04dca1867dd825fcc3085a4308" +checksum = "852a41a43e1fab8cc7d263fa2e475da52aed2b06314424b819cade0cfb085cf9" dependencies = [ "async-channel 1.9.0", "crossbeam-channel", @@ -2331,14 +2774,14 @@ dependencies = [ "libc", "log", "paho-mqtt-sys", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "paho-mqtt-sys" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e482419d847af4ec43c07eed70f5f94f87dc712d267aecc91ab940944ab6bf4" +checksum = "2d5b7bbfa661422a3e92fb8a9494ae0ced1fd8962dfdaa948a875f61796a533a" dependencies = [ "cmake", "openssl-sys", @@ -2351,26 +2794,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] -name = "parking_lot" -version = "0.12.3" +name = "parse-display" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" dependencies = [ - "lock_api", - "parking_lot_core", + "parse-display-derive", + "regex", + "regex-syntax 0.8.5", ] [[package]] -name = "parking_lot_core" -version = "0.9.10" +name = "parse-display-derive" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2ae7800a4c974efd12df917266338e79a7a74415173caf7e70aa0a0707345281" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", + "proc-macro2", + "quote", + "regex", + "regex-syntax 0.8.5", + "structmeta", + "syn 2.0.87", ] [[package]] @@ -2407,7 +2852,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.69", "ucd-trie", ] @@ -2431,7 +2876,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2485,7 +2930,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2632,7 +3077,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2670,21 +3115,21 @@ dependencies = [ [[package]] name = "protobuf" -version = "3.7.1" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" +checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4" dependencies = [ "bytes", "once_cell", "protobuf-support", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "protobuf-codegen" -version = "3.7.1" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144" +checksum = "5d3976825c0014bbd2f3b34f0001876604fe87e0c86cd8fa54251530f1544ace" dependencies = [ "anyhow", "once_cell", @@ -2692,14 +3137,14 @@ dependencies = [ "protobuf-parse", "regex", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "protobuf-parse" -version = "3.7.1" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" +checksum = "b4aeaa1f2460f1d348eeaeed86aea999ce98c1bded6f089ff8514c9d9dbdc973" dependencies = [ "anyhow", "indexmap 2.6.0", @@ -2707,17 +3152,17 @@ dependencies = [ "protobuf", "protobuf-support", "tempfile", - "thiserror", + "thiserror 1.0.69", "which", ] [[package]] name = "protobuf-support" -version = "3.7.1" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" +checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6" dependencies = [ - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2790,7 +3235,7 @@ dependencies = [ "rustc-hash 2.0.0", "rustls", "socket2 0.5.7", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -2808,7 +3253,7 @@ dependencies = [ "rustls", "rustls-platform-verifier", "slab", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tracing", ] @@ -2836,6 +3281,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -2863,7 +3314,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -2886,6 +3337,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.7" @@ -2901,9 +3361,29 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -2952,9 +3432,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64 0.22.1", "bytes", @@ -2986,6 +3466,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", + "tower", "tower-service", "url", "wasm-bindgen", @@ -2996,15 +3477,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3114,12 +3594,26 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", +] + [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ + "aws-lc-rs", "log", "once_cell", "ring", @@ -3139,7 +3633,19 @@ dependencies = [ "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", + "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]] @@ -3163,16 +3669,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" dependencies = [ - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "jni", "log", "once_cell", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.7.3", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "webpki-roots", "winapi", @@ -3190,6 +3696,7 @@ version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -3247,7 +3754,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3279,18 +3786,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "num-bigint", "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.6.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -3319,7 +3839,7 @@ checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3330,7 +3850,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3345,6 +3865,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3357,6 +3888,36 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.6.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -3511,6 +4072,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -3523,6 +4090,29 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "structmeta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329" +dependencies = [ + "proc-macro2", + "quote", + "structmeta-derive", + "syn 2.0.87", +] + +[[package]] +name = "structmeta-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "strum_macros" version = "0.24.3" @@ -3599,9 +4189,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.86" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -3625,7 +4215,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3635,7 +4225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3651,14 +4241,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand 2.1.1", + "getrandom 0.3.2", "once_cell", - "rustix 0.38.38", + "rustix 1.0.5", "windows-sys 0.59.0", ] @@ -3681,6 +4271,35 @@ dependencies = [ "winapi", ] +[[package]] +name = "testcontainers" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a4f01f39bb10fc2a5ab23eb0d888b1e2bb168c157f61a1b98e6c501c639c74" +dependencies = [ + "async-trait", + "bollard", + "bollard-stubs", + "bytes", + "docker_credential", + "either", + "etcetera", + "futures", + "log", + "memchr", + "parse-display", + "pin-project-lite", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tokio-tar", + "tokio-util", + "url", +] + [[package]] name = "textwrap" version = "0.15.2" @@ -3694,22 +4313,42 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.66" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] name = "thiserror-impl" -version = "1.0.66" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3754,8 +4393,18 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.8.0" +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ @@ -3770,13 +4419,13 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tls-listener" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f1d8809f604e448c7bc53a5a0e4c2a0a20ba44cb1fb407314c8eeccb92127f9" +checksum = "ab41256c16d6fc2b3021545f20bf77a73200b18bd54040ac656dddfca6205bfa" dependencies = [ "futures-util", "pin-project-lite", - "thiserror", + "thiserror 2.0.12", "tokio", "tokio-rustls", ] @@ -3792,17 +4441,15 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.0" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", "libc", "mio", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2 0.5.7", "tokio-macros", "tracing", @@ -3820,13 +4467,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3841,15 +4488,40 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tar" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5714c010ca3e5c27114c1cdeb9d14641ace49874aa5626d7149e47aedace75" +dependencies = [ + "filetime", + "futures-core", + "libc", + "redox_syscall 0.3.5", + "tokio", + "tokio-stream", + "xattr", +] + [[package]] name = "tokio-tungstenite" version = "0.24.0" @@ -3877,6 +4549,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -3903,7 +4596,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3978,7 +4671,7 @@ dependencies = [ "log", "rand", "sha1", - "thiserror", + "thiserror 1.0.69", "utf-8", ] @@ -4018,12 +4711,6 @@ dependencies = [ "spin", ] -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" version = "1.0.13" @@ -4036,15 +4723,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-width" version = "0.1.14" @@ -4096,7 +4774,6 @@ dependencies = [ "tokio", "up-rust", "up-streamer", - "up-transport-mqtt5", "up-transport-vsomeip", "up-transport-zenoh", "usubscription-static-file", @@ -4125,14 +4802,13 @@ dependencies = [ "zenoh-plugin-trait", "zenoh-result", "zenoh-util", - "zenoh_backend_traits", ] [[package]] name = "up-rust" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30118ab07c7ca420e2196bbc0f6f380b3100928d03ec1cd960f9220472f48f1a" +checksum = "616da735a2c488128e67d5ce16113f4303c83a5dbeb7c281ae893da281df2a57" dependencies = [ "async-trait", "bytes", @@ -4141,7 +4817,7 @@ dependencies = [ "protobuf-codegen", "protoc-bin-vendored", "rand", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "uriparse", @@ -4172,33 +4848,27 @@ dependencies = [ [[package]] name = "up-transport-mqtt5" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43adade571c38ed57b35440a5e524f642f440be19b3f3a5dd79924e0419ce01b" +version = "0.3.0-SNAPSHOT" +source = "git+https://github.com/eclipse-uprotocol/up-transport-mqtt5-rust#78382e6c6676331ed217678bbbeb8bce8fba0c05" dependencies = [ "async-channel 1.9.0", "async-trait", + "backon", "bytes", - "env_logger 0.10.2", + "clap", "futures", "log", "paho-mqtt", "protobuf", - "rand", - "regex", - "serde", - "serde_json", + "testcontainers", "tokio", - "tokio-macros", "up-rust", - "url", - "uuid", ] [[package]] name = "up-transport-vsomeip" -version = "0.3.0" -source = "git+https://github.com/PLeVasseur/up-client-vsomeip-rust?branch=add-build-script_update-up-rust-version#ed295aba9e979ff7cf59b3d085586677e43c75f5" +version = "0.4.1" +source = "git+https://github.com/eclipse-uprotocol/up-transport-vsomeip-rust#cb0151394966a4ed5047b246da62c4a9352a90a4" dependencies = [ "async-trait", "bimap", @@ -4212,6 +4882,7 @@ dependencies = [ "protobuf", "serde", "serde_json", + "tempfile", "tokio", "up-rust", "vsomeip-proc-macro", @@ -4220,20 +4891,24 @@ dependencies = [ [[package]] name = "up-transport-zenoh" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dba40062ff410f59a9a34a51a9288c8ad92454e4199725264f4f9eaeb604fd9" +checksum = "5b136a2120532bb9d3a426e3575a0cf998cd4c06c5ab0a5dc54ae64363917820" dependencies = [ "anyhow", "async-trait", "bytes", + "hashbrown 0.15.2", "lazy_static", "protobuf", + "ring", + "rustls", "serde_json", "tokio", "tracing", "tracing-subscriber", "up-rust", + "url", "zenoh", ] @@ -4249,13 +4924,14 @@ dependencies = [ [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -4276,6 +4952,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -4288,7 +4976,7 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -4363,19 +5051,19 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" [[package]] name = "vsomeip-proc-macro" -version = "0.1.0" -source = "git+https://github.com/PLeVasseur/up-client-vsomeip-rust?branch=add-build-script_update-up-rust-version#ed295aba9e979ff7cf59b3d085586677e43c75f5" +version = "0.4.1" +source = "git+https://github.com/eclipse-uprotocol/up-transport-vsomeip-rust#cb0151394966a4ed5047b246da62c4a9352a90a4" dependencies = [ "proc-macro2", "quote", "rayon", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] name = "vsomeip-sys" -version = "0.3.0" -source = "git+https://github.com/PLeVasseur/up-client-vsomeip-rust?branch=add-build-script_update-up-rust-version#ed295aba9e979ff7cf59b3d085586677e43c75f5" +version = "0.4.1" +source = "git+https://github.com/eclipse-uprotocol/up-transport-vsomeip-rust#cb0151394966a4ed5047b246da62c4a9352a90a4" dependencies = [ "autocxx", "autocxx-build", @@ -4420,29 +5108,38 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -4460,9 +5157,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4470,22 +5167,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" @@ -4558,34 +5258,39 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", "windows-strings", - "windows-targets 0.52.6", + "windows-targets 0.53.0", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-result", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -4639,13 +5344,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -4658,6 +5379,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -4670,6 +5397,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -4682,12 +5415,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -4700,6 +5445,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -4712,6 +5463,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -4724,6 +5481,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -4736,6 +5499,33 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "x509-parser" version = "0.16.0" @@ -4749,17 +5539,52 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] +[[package]] +name = "xattr" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +dependencies = [ + "libc", + "rustix 1.0.5", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zenoh" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b28b1ce69136eba7567e5ea5c9f37aa0c7cced2673bdc3c1dd7c3c1a2ecb0d21" +checksum = "de466449fe7737d3049886acdb0f5da0ab6258808f7036d8d85f69f681383913" dependencies = [ "ahash", + "arc-swap", "async-trait", "bytes", "flume", @@ -4768,11 +5593,13 @@ dependencies = [ "itertools 0.13.0", "json5", "lazy_static", + "nonempty-collections", "once_cell", "paste", "petgraph", "phf", "rand", + "ref-cast", "rustc_version", "serde", "serde_json", @@ -4802,18 +5629,18 @@ dependencies = [ [[package]] name = "zenoh-buffers" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592504c9854fbc781b9a389cd7225b5878b8dd0cb9a12f15546c8d4eeba9a802" +checksum = "2abb97af455247c76ee504b36a96b8d8f30cd70ebcd620c542d754b6566bb258" dependencies = [ "zenoh-collections", ] [[package]] name = "zenoh-codec" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb0ce6e9104408c6a23e100a69b16b8e5713f904e061b14ac994fef8df6baba" +checksum = "64c34b28cec0ba3885552f9ed4c9350bc062edc5772517753bae7f0b5673cb5d" dependencies = [ "tracing", "uhlc", @@ -4823,26 +5650,29 @@ dependencies = [ [[package]] name = "zenoh-collections" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb27c67033ffda0171506658802fda8dc22e62bcb094b49be86c04f84d8bdab" +checksum = "3495825c18663b7731ce4140ce35ca28cf2dc92cba1e7f164ea68bd1097ed935" [[package]] name = "zenoh-config" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d3ddf489ec055bc7498d66f6bb2cce8278314fbadb40aa34a37bc0125f494f" +checksum = "99c04601c096f0571022b4d50a16c5f4a2218faa63b46e0d73f84d0c109210f7" dependencies = [ "json5", + "nonempty-collections", "num_cpus", "secrecy", "serde", "serde_json", + "serde_with", "serde_yaml", "tracing", "uhlc", "validated_struct", "zenoh-core", + "zenoh-keyexpr", "zenoh-macros", "zenoh-protocol", "zenoh-result", @@ -4851,9 +5681,9 @@ dependencies = [ [[package]] name = "zenoh-core" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3d36d0b828f429cfba005519de8941319a4ca3e0b21c7ede3cf8812e1e5518" +checksum = "6dc29d0ffc588b20eab1f3078f42034b572d7ae2c0a50cc3995807c12b5a7ed9" dependencies = [ "lazy_static", "tokio", @@ -4863,9 +5693,9 @@ dependencies = [ [[package]] name = "zenoh-crypto" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f82ea1bb77132325e7fae5d698cfa5dddd4d6e46e94fc73409e31e65a557d7d" +checksum = "4151a98c653b7c4576fe5a4feb1c26d9328c675abf77df2a4dfa80347b8e25d0" dependencies = [ "aes", "hmac", @@ -4877,10 +5707,11 @@ dependencies = [ [[package]] name = "zenoh-keyexpr" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9adcce6a97d03855e2f2e7e5fafb9659d65c47eebc4dc6049ded397874ff634e" +checksum = "6cfd9842578fddeb8cc2acf48751872ca6284578e4b0433c77cd3b7c7f42d271" dependencies = [ + "getrandom 0.2.15", "hashbrown 0.14.5", "keyed-set", "rand", @@ -4892,9 +5723,9 @@ dependencies = [ [[package]] name = "zenoh-link" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73741cc9d89411d9b9e969cbad3a6e494684f3a79e200caebdad62beb3cb13fe" +checksum = "b478ec81c33f1ac45292e2790d774b872afa21408249147e595eb126a46fdd17" dependencies = [ "zenoh-config", "zenoh-link-commons", @@ -4910,9 +5741,9 @@ dependencies = [ [[package]] name = "zenoh-link-commons" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c74d63df6a0dda46f207699fafea4b832151b288451ce58eab7a56c8a07694d" +checksum = "d5d8e854693ee711a62feb3d031f44bf6255ba1f93f6feea7615a4fc473ec82c" dependencies = [ "async-trait", "flume", @@ -4920,6 +5751,7 @@ dependencies = [ "rustls", "rustls-webpki", "serde", + "time", "tokio", "tokio-util", "tracing", @@ -4934,9 +5766,9 @@ dependencies = [ [[package]] name = "zenoh-link-quic" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9727ec46732859c14717fba67977ef94b866510e714db1270c2f56e19bd80dad" +checksum = "66d55f81d71d9eada2b21eb976f41f67919c18539d8b92e248561f459674cb0a" dependencies = [ "async-trait", "base64 0.22.1", @@ -4946,6 +5778,7 @@ dependencies = [ "rustls-pki-types", "rustls-webpki", "secrecy", + "time", "tokio", "tokio-util", "tracing", @@ -4956,31 +5789,32 @@ dependencies = [ "zenoh-link-commons", "zenoh-protocol", "zenoh-result", + "zenoh-util", ] [[package]] name = "zenoh-link-tcp" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "394d7bd1a098ef102f58b13305f88ce1ffba007c6fe1df2c6d9c4bb350fcb5cb" +checksum = "ba5b12406ce60cfedaeeadb3eb19ce67ef35296cfc92fd3b253d3516288c2a90" dependencies = [ "async-trait", "socket2 0.5.7", "tokio", "tokio-util", "tracing", + "zenoh-config", "zenoh-core", "zenoh-link-commons", "zenoh-protocol", "zenoh-result", - "zenoh-util", ] [[package]] name = "zenoh-link-tls" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9521f53cf61a41b654e976d33cfddb2e94dc0289ecba4cfa39bfb843824f767" +checksum = "464965c87df8c371577cb686cd12eb52b10ff4d304b82529bd198bedd6c01747" dependencies = [ "async-trait", "base64 0.22.1", @@ -4990,6 +5824,7 @@ dependencies = [ "rustls-webpki", "secrecy", "socket2 0.5.7", + "time", "tls-listener", "tokio", "tokio-rustls", @@ -5007,9 +5842,9 @@ dependencies = [ [[package]] name = "zenoh-link-udp" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd6e9814f1f0f7db6e02f8d196106e356e55e2d5814d1bc8f211910e6fb1459" +checksum = "9d0f99553453daa4a20571a0599aa17a08773c18dc5caba3ef2e622dca2be063" dependencies = [ "async-trait", "socket2 0.5.7", @@ -5027,9 +5862,9 @@ dependencies = [ [[package]] name = "zenoh-link-unixsock_stream" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef73ad8357bf0c42abdb057686200bfd6c3fb4646ed07c13f6c18b363f1a0b6" +checksum = "5c30c79e68b506538c8267ad4a738f256f6a578ceb24bfd04aafb1acc163a5d3" dependencies = [ "async-trait", "nix", @@ -5046,9 +5881,9 @@ dependencies = [ [[package]] name = "zenoh-link-ws" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f178df5cff946bc8ef81015df8d3106d19b027e9aff11db8aa2eee1a802cc05" +checksum = "ee436bc5f7ffb04e855bff48e2df1937feb1f059637748c762c21508407d32e1" dependencies = [ "async-trait", "futures-util", @@ -5067,21 +5902,21 @@ dependencies = [ [[package]] name = "zenoh-macros" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528dc367e8de7e84d35d37d21998cf9a45360b0f8bffb4f9e5135bed45fd347f" +checksum = "213359841968c343319c545612a5457d0a119e7416e5e740e4668f117298ed9a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "zenoh-keyexpr", ] [[package]] name = "zenoh-plugin-trait" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24cfd2508d900adad7c88617541b8d4a2ad581c15c307db798b6362554642fe" +checksum = "2cad96c9c65b2c61a34198c574986d75a6ba1802adb727df538a34de9c492ae3" dependencies = [ "git-version", "libloading", @@ -5096,9 +5931,9 @@ dependencies = [ [[package]] name = "zenoh-protocol" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c342042f4e7ed51718803f48ce49d9dc2e1a8060f1ed7f94c21e781c01dac9d9" +checksum = "7d3d55219c672dccc1b14d8dc255cb29d927f3da453de9f1057924541ea304e9" dependencies = [ "const_format", "rand", @@ -5111,33 +5946,35 @@ dependencies = [ [[package]] name = "zenoh-result" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f79737b88aafb33bbb0ea83821c9048e20702f3de7cce8822adac25f100aa7" +checksum = "df0acb62f1b9d51401a38a736c2d20bb2a3c9bec462573f7dd562b93661d0179" dependencies = [ "anyhow", ] [[package]] name = "zenoh-runtime" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30608ef77db6ba23df63901e3359299875474ff812c3d678b0101c88892cd3de" +checksum = "bf2ba23f9579eebf03a4c91d6013634e7c54899fc7d3d2387bc960d32a12fcad" dependencies = [ "lazy_static", "ron", "serde", "tokio", + "tracing", "zenoh-macros", "zenoh-result", ] [[package]] name = "zenoh-sync" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef62536159fcfb7eb51d22b69894d884abea5ce0bf6241cc2c3f9880f486060b" +checksum = "612ae417edc4d25df8ba20e22dd9a68961eb1d9fde289aee77e4402f8fbde014" dependencies = [ + "arc-swap", "event-listener 5.3.1", "futures", "tokio", @@ -5148,9 +5985,9 @@ dependencies = [ [[package]] name = "zenoh-task" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d0efd5f0f70acc408a9bddeac526f91c85e2e42dc2c0d7c29a72bc9e26d6ca" +checksum = "b35052c34d4c1c0b552795f02ec42a8ed60884744dde9ce661d93c36db0847da" dependencies = [ "futures", "tokio", @@ -5162,9 +5999,9 @@ dependencies = [ [[package]] name = "zenoh-transport" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc2a24c34c01775bd0601043dcd75de245eb3af35ce8eff96e0d9126e019812" +checksum = "32289c6655efc953ddd9f0b931c603684f008977cf37487f7274613b4d7fec08" dependencies = [ "async-trait", "crossbeam-utils", @@ -5196,9 +6033,9 @@ dependencies = [ [[package]] name = "zenoh-util" -version = "1.0.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afe24db564df9094e521441b556bfc73f359ae5d7b537a0b03257387404f561d" +checksum = "895e2d7a0dd4fa0a4cb94c1050620d5a71dcde4cdfb7a1c63ec179c19faaa326" dependencies = [ "async-trait", "const_format", @@ -5220,24 +6057,6 @@ dependencies = [ "zenoh-result", ] -[[package]] -name = "zenoh_backend_traits" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812669d74a7200281a6b16e99e1f8b1fa166530982a506cc61dfba523a734b32" -dependencies = [ - "async-trait", - "const_format", - "derive_more", - "either", - "schemars", - "serde_json", - "zenoh", - "zenoh-plugin-trait", - "zenoh-result", - "zenoh-util", -] - [[package]] name = "zerocopy" version = "0.7.35" @@ -5256,7 +6075,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -5264,3 +6104,25 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] diff --git a/Cargo.toml b/Cargo.toml index d4a78c9..b55bdfa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,11 +15,16 @@ members = [ "example-streamer-uses", "utils/hello-world-protos", "utils/integration-test-utils", - "example-streamer-implementations", "up-linux-streamer-plugin", - "up-streamer", "subscription-cache", "utils/usubscription-static-file"] + "example-streamer-implementations", + "configurable-streamer", + "up-linux-streamer-plugin", + "up-streamer", + "subscription-cache", + "utils/usubscription-static-file", +] [workspace.package] -rust-version = "1.76.0" +rust-version = "1.82.0" version = "0.1.0" repository = "https://github.com/eclipse-uprotocol/up-streamer-rust" homepage = "https://github.com/eclipse-uprotocol" @@ -35,22 +40,32 @@ env_logger = { version = "0.10.1" } futures = { version = "0.3.30" } lazy_static = { version = "1.5.0" } log = { version = "0.4.20" } -json5 = { version = "0.4.1" } +json5 = { version = "0.4.1" } serde = { version = "1.0.154", features = ["derive"] } serde_json = { version = "1.0.94" } uuid = { version = "1.7.0" } -tokio = { version = "1.35.1", default-features = false, features = ["rt", "rt-multi-thread", "sync", "time"] } -protobuf = { version = "3.3", features = ["with-bytes"] } -up-rust = { version = "0.3.0", default-features = false } -up-transport-zenoh = { version = "0.4.0" } -up-transport-vsomeip = { version = "0.4.1", default-features = false } -up-transport-mqtt5 = { version = "0.2.0" } -zenoh = { version = "1.0.0", features = ["default", "plugins"] } -zenoh-core = { version = "1.0.0" } -zenoh-plugin-trait = { version = "1.0.0" } -zenoh-result = { version = "1.0.0" } -zenoh-util = { version = "1.0.0" } -zenoh_backend_traits = { version = "1.0.0" } +tokio = { version = "1.44", default-features = false, features = [ + "rt", + "rt-multi-thread", + "sync", + "time", + "macros", +] } +protobuf = { version = "3.7.2", features = ["with-bytes"] } +up-rust = { version = "0.5.0", default-features = false } +up-transport-zenoh = { version = "0.6.0", features = ["zenoh-unstable"] } +up-transport-vsomeip = { git = "https://github.com/eclipse-uprotocol/up-transport-vsomeip-rust", default-features = false } +up-transport-mqtt5 = { git = "https://github.com/eclipse-uprotocol/up-transport-mqtt5-rust" } +zenoh = { version = "1.2.1", features = [ + "default", + "plugins", + "unstable", + "internal", +] } +zenoh-core = { version = "1.2.1" } +zenoh-plugin-trait = { version = "1.2.1" } +zenoh-result = { version = "1.2.1" } +zenoh-util = { version = "1.2.1" } [profile.dev] debug = true diff --git a/Cross.toml b/Cross.toml new file mode 100644 index 0000000..16d4f90 --- /dev/null +++ b/Cross.toml @@ -0,0 +1,20 @@ +# ******************************************************************************** +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# *******************************************************************************/ + +[build.env] +# This overrides the CMake toolchain file that Cross natively wants to use, +# since it causes problems with the vendored OpenSSL version that Paho wants to use +passthrough = [ + "CMAKE_TOOLCHAIN_FILE_aarch64_unknown_linux_musl", + "CMAKE_TOOLCHAIN_FILE_x86_64_unknown_linux_musl", +] diff --git a/configurable-streamer/CONFIG.json5 b/configurable-streamer/CONFIG.json5 new file mode 100644 index 0000000..3251293 --- /dev/null +++ b/configurable-streamer/CONFIG.json5 @@ -0,0 +1,64 @@ +{ + up_streamer_config: { + // The message queue size of each route between endpoints within the UStreamer + // Lower numbers mean that some messages will be dropped + message_queue_size: 10000 + }, + streamer_uuri: { + // Determines the authority_name of the host device + // Used when initializing host transport + authority: "authority_B", + // Determines the ue_id of the streamer + // Used when initializing host transport + ue_id: 78, + // Determines the ue_version_major of the streamer + // Used when initializing host transport + ue_version_major: 1 + }, + usubscription_config: { + // Lists the path to the subscription file when using static file + file_path: "subscription_data.json" + }, + transports: { + zenoh: { + // Path to the zenoh config file + config_file: "ZENOH_CONFIG.json5", + // List of endpoints that use the zenoh transport + endpoints: [ + { + // Authority of the entity that the endpoint represents + authority: "authority_B", + // Identifier of the endpoint + endpoint: "endpoint_zenoh_1", + // List of identifiers of all other endpoints that messages should be forwarded to + forwarding: [ + "endpoint_mqtt_1", + "endpoint_zenoh_2" + ] + }, + { + authority: "authority_C", + // Make sure that each endpoint has a unique identifier or the streamer will not start + endpoint: "endpoint_zenoh_2", + // All endpoint identifiers listed here must also be defined in this config + forwarding: [ + "endpoint_zenoh_1", + ] + } + ] + }, + mqtt: { + // Same as for the zenoh section but for all MQTT5 based endpoints + config_file: "MQTT_CONFIG.json5", + endpoints: [ + { + authority: "authority_A", + endpoint: "endpoint_mqtt_1", + forwarding: [ + "endpoint_zenoh_1", + ] + }, + ] + }, + } +} diff --git a/configurable-streamer/Cargo.toml b/configurable-streamer/Cargo.toml new file mode 100644 index 0000000..77655a4 --- /dev/null +++ b/configurable-streamer/Cargo.toml @@ -0,0 +1,39 @@ +# Copyright (c) 2024 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 + +[package] +name = "configurable-streamer" +rust-version.workspace = true +version.workspace = true +repository.workspace = true +homepage.workspace = true +edition.workspace = true +keywords.workspace = true +license.workspace = true + +[dependencies] +async-trait = { workspace = true } +clap = { workspace = true } +env_logger = { workspace = true } +log = { workspace = true } +json5 = { workspace = true } +protobuf = { workspace = true } +serde = { workspace = true } +tokio = { workspace = true } +up-rust = { workspace = true } +up-streamer = { path = "../up-streamer" } +up-transport-zenoh = { workspace = true } +up-transport-mqtt5 = { workspace = true } +zenoh = { workspace = true } +usubscription-static-file = { path = "../utils/usubscription-static-file" } + +[dev-dependencies] +hello-world-protos = { path = "../utils/hello-world-protos" } diff --git a/configurable-streamer/Dockerfile.amd b/configurable-streamer/Dockerfile.amd new file mode 100644 index 0000000..489b037 --- /dev/null +++ b/configurable-streamer/Dockerfile.amd @@ -0,0 +1,23 @@ +# ******************************************************************************** +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# *******************************************************************************/ + +FROM scratch + +WORKDIR /app + +COPY target/x86_64-unknown-linux-musl/release/configurable-streamer /app/configurable-streamer + +EXPOSE 7447 +EXPOSE 1883 + +CMD ["./configurable-streamer", "--config", "config/CONFIG.json5"] diff --git a/configurable-streamer/Dockerfile.arm b/configurable-streamer/Dockerfile.arm new file mode 100644 index 0000000..79bb445 --- /dev/null +++ b/configurable-streamer/Dockerfile.arm @@ -0,0 +1,23 @@ +# ******************************************************************************** +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# *******************************************************************************/ + +FROM scratch + +WORKDIR /app + +COPY target/aarch64-unknown-linux-musl/release/configurable-streamer /app/configurable-streamer + +EXPOSE 7447 +EXPOSE 1883 + +CMD ["./configurable-streamer", "--config", "config/CONFIG.json5"] diff --git a/configurable-streamer/MQTT_CONFIG.json5 b/configurable-streamer/MQTT_CONFIG.json5 new file mode 100644 index 0000000..c0fe80a --- /dev/null +++ b/configurable-streamer/MQTT_CONFIG.json5 @@ -0,0 +1,14 @@ +{ + // The URL of the MQTT broker (the provided mosquitto broker runs on locahost but docker networks might complicate that) + hostname: "localhost", + // The port of the broker (unencrypted MQTT like the provided mosquitto broker typically uses 1883, encrypted uses 8883) + port: 1883, + // How many messages the broker should buffer for this connections + max_buffered_messages: 100, + // How many individual topic subscriptions are supported through this connection + max_subscriptions: 100, + // How long the connection should stay open for + session_expiry_interval: 3600, + // The username that the mqtt client gives the broker when connecting (usually not important) + username: "user" +} diff --git a/configurable-streamer/README.md b/configurable-streamer/README.md new file mode 100644 index 0000000..67f2a54 --- /dev/null +++ b/configurable-streamer/README.md @@ -0,0 +1,124 @@ +# configurable-streamer + +This is a standalone implementation of a uStreamer. +It is implemented to dynamically link between any number of uEntities that use a mix of either Zenoh or MQTT5. + +## Supported Setups + +Here are the setups that can be built with these streamers and different entities with the Zenoh and MQTT transports. +Run the streamer with: + +```bash +cargo run -- --config="CONFIG.json5" +``` + +The setups that include SOME/IP entities are currently not supported by the configurable streamer. To run those please refer to the "example-streamer-implementations" folder and the zenoh_someip streamer binary found there! + +### Client-Service Setups + +In a setup with one client and one service, the service runs in the background while the client periodically makes requests to it. +Once the server receives a request it will respond with a reply. +The request message contains information on a "sink" (the URI of the service entity which it tries to reach) and a source (the URI of the client so that the service knows where to send the response to). + +For a single setup you can choose either: +- a Zenoh Client and an MQTT Service (A cars' software requesting information from the cloud) +- an MQTT Client and a Zenoh Service (A backend service trying to pull telemetry data from a running car) +- a Zenoh Client and a SOME/IP Service (The infotainment system requesting some mechatronics sensor data) +- or a SOME/IP Client and a Zenoh Service (A mechatronics component asking the infotainment system for input) + +### Publish-Subscribe Setups + +This setup is more straight forward and consists of one publisher broadcasting messages to a topic and a subscriber who listens to the topic. +Messages that the publisher sends contain a "topic" that the message will be available on. There is no response expected so publish messages do not contain the publishers URI. +The subscriber listens to one or multiple topics via a filter. + +For this setup you can also choose: +- a Zenoh Publisher and an MQTT Subscriber (A backend service getting live data from a car) +- an MQTT Publisher and a Zenoh Subscriber (A car getting over the air traffic information) +- a Zenoh Publisher and a SOME/IP Subscriber (An autoedge app pushing some configurations to a mechatronics component) +- or a SOME/IP Publisher and a Zenoh Subscriber (An infotainment app getting live data from a sensor) + +### Notification setups + +There are currently no example entities for notification type messages. These do not exist for SOME/IP but do exist for Zenoh and MQTT. It should be relatively straight forward to implement the yourself if your system needs them! + +## Understanding the Configuration Files + +Reference the `CONFIG.json5` configuration file to understand the basic configuration options for the Streamer. + +The `ZENOH_CONFIG.json5` file is used to set Zenoh configurations. By default, it is only used to set listening endpoints, but can be used with more configurations according to [Zenoh's page on it](https://zenoh.io/docs/manual/configuration/#configuration-files). + +The 'static_subscriptions.json' is only needed when you set up a publish-subscribe system and can be ignored for a client-service system. +Make sure that the UURI of each pub-sub entity is present at least as a key in this json file! + +The 'vsomeip-config/point_to_point.json' is a configuration file only needed for SOME/IP implementations. The list of "services" must include the UEntity IDs of all entities running on the host-protocol (in the reference implementations that means all components running with the Zenoh transport)! The term service in this context comes from SOME/IP and should not be confused with UService entity. + +## Running the Streamer in an example service mesh + +### Running the uStreamer binary + +To run one of the basic examples and see two entities with different transports communicate, you'll need to first run the streamer (see above) to bridge between the two transports in a terminal. This implementation should work out of the box with the given examples and the "CONFIG.json5". + +First run an MQTT broker for example by running: + +```bash +mosquitto -d +``` + +Run the streamer with the default configuration file from here (the example-streamer-implementation folder): + +```bash +cargo run -- --config="DEFAULT_CONFIG.json5" +``` + +This starts the streamer which should now be idle. As soon as a client tries to connect with the streamer, the connection will be logged. +The streamer is set to have Zenoh as its "host protocol" or "host transport". This means that the streamer lives in the same component as the Zenoh transport, and shares its authority. +In this setup "authority_B" is the authority of the Zenoh component (in this example the ECU), "authority_A" is the authority of the MQTT component (i.e. the cloud). + +### Running the Entities in a zenoh - MQTT5 setup + +Execute the following command from the project root directory to start two of the example UEntities: + +```bash +cargo run --bin --features= +``` + +Depending on the setup you want to test, chose any of these combinations for your two UEntities: + +| Entity 1 | Entity 2 | +| --------------- | ------------- | +| mqtt_client | zenoh_service | +| mqtt_service | zenoh_client | +| mqtt_publisher | zenoh_subscriber | +| mqtt_subscriber | zenoh_publisher | + +The service and client will run forever. Every second a new request message is sent from the client via zenoh. That Zenoh message is caught and routed over MQTT to the service. The response to the request makes the same journey in reverse. + +### Running the Entities in a zenoh - SOME/IP setup + +Execute the following command from the project root directory to start one of the Entities: + +```bash +cargo run -p example-streamer-uses --bin +``` + +Depending on the setup you want to test, chose any of these examples: + +| Entity 1 | Entity 2 | +| --------------- | ------------- | +| someip_client | zenoh_service | +| someip_service | zenoh_client | +| someip_publisher | zenoh_subscriber | +| someip_subscriber | zenoh_publisher | + +The two entities will run forever and exchange messages between each other. + +## Going forward from here + +If you have familiarized yourself with the streamer to this point you should be able to continue by yourself. +If the two reference implementations are not enough for your system you can consider the following next steps: + +- Create a streamer between SOME/IP and MQTT (mind that SOME/IP cannot act as the host-transport) +- Run a streamer that can forward messages between all three transports +- Implement your own custom or proprietary UTransport and connect it to one of the three officially supported ones +- Try out a system with your own UEntities. Between MQTT and Zenoh its also possible to send notification type messages diff --git a/configurable-streamer/ZENOH_CONFIG.json5 b/configurable-streamer/ZENOH_CONFIG.json5 new file mode 100644 index 0000000..3c305bf --- /dev/null +++ b/configurable-streamer/ZENOH_CONFIG.json5 @@ -0,0 +1,25 @@ +// This zenoh config is a slimmed down version. +// For a full config example with more details check +// https://github.com/eclipse-zenoh/zenoh/blob/main/DEFAULT_CONFIG.json5 +{ + mode: "router", + connect: { + endpoints: ["tcp/0.0.0.0:7447"], + }, + scouting: { + multicast: { + enabled: false, + }, + gossip: { + enabled: true, + }, + }, + routing: { + router: { + peers_failover_brokering: true, + }, + peer: { + mode: "peer_to_peer", + }, + }, +} diff --git a/configurable-streamer/src/config.rs b/configurable-streamer/src/config.rs new file mode 100644 index 0000000..1475e96 --- /dev/null +++ b/configurable-streamer/src/config.rs @@ -0,0 +1,93 @@ +/******************************************************************************** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct Config { + pub(crate) up_streamer_config: UpStreamerConfig, + pub(crate) streamer_uuri: StreamerUuri, + pub(crate) usubscription_config: USubscriptionConfig, + pub(crate) transports: Transports, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct UpStreamerConfig { + pub(crate) message_queue_size: u16, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct StreamerUuri { + pub(crate) authority: String, + pub(crate) ue_id: u32, + pub(crate) ue_version_major: u8, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct USubscriptionConfig { + pub(crate) file_path: String, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct Transports { + pub(crate) zenoh: ZenohTransport, + pub(crate) mqtt: MqttTransport, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct ZenohTransport { + pub(crate) config_file: String, + pub(crate) endpoints: Vec, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct MqttTransport { + pub(crate) config_file: String, + pub(crate) endpoints: Vec, + #[serde(skip)] + pub(crate) mqtt_details: Option, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct EndpointConfig { + pub(crate) authority: String, + pub(crate) endpoint: String, + pub(crate) forwarding: Vec, +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct MqttConfigDetails { + pub(crate) hostname: String, + pub(crate) port: u16, + pub(crate) max_buffered_messages: i32, + pub(crate) max_subscriptions: i32, + pub(crate) session_expiry_interval: i32, + pub(crate) username: String, +} + +impl MqttTransport { + pub fn load_mqtt_details(&mut self) -> Result<(), Box> { + let config_contents = std::fs::read_to_string(&self.config_file)?; + self.mqtt_details = Some(json5::from_str(&config_contents)?); + Ok(()) + } +} diff --git a/configurable-streamer/src/main.rs b/configurable-streamer/src/main.rs new file mode 100644 index 0000000..4ccedc3 --- /dev/null +++ b/configurable-streamer/src/main.rs @@ -0,0 +1,191 @@ +/******************************************************************************** + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +mod config; + +use crate::config::Config; +use clap::Parser; +use log::info; +use std::io::Read; +use std::sync::Arc; +use std::thread; +use std::{collections::HashMap, fs::File}; +use up_rust::{UCode, UStatus, UTransport, UUri}; +use up_streamer::{Endpoint, UStreamer}; +use up_transport_mqtt5::{Mqtt5Transport, Mqtt5TransportOptions, MqttClientOptions}; +use up_transport_zenoh::UPTransportZenoh; +use usubscription_static_file::USubscriptionStaticFile; +use zenoh::config::Config as ZenohConfig; + +#[derive(Parser)] +#[command()] +struct StreamerArgs { + #[arg(short, long, value_name = "FILE")] + config: String, +} + +#[tokio::main] +async fn main() -> Result<(), UStatus> { + env_logger::init(); + + info!("Started up-linux-streamer-configurable"); + + // Get the config file. + let args = StreamerArgs::parse(); + let mut file = File::open(args.config) + .map_err(|e| UStatus::fail_with_code(UCode::NOT_FOUND, format!("File not found: {e:?}")))?; + let mut contents = String::new(); + file.read_to_string(&mut contents).map_err(|e| { + UStatus::fail_with_code( + UCode::INTERNAL, + format!("Unable to read config file: {e:?}"), + ) + })?; + + let mut config: Config = json5::from_str(&contents).map_err(|e| { + UStatus::fail_with_code( + UCode::INTERNAL, + format!("Unable to parse config file: {e:?}"), + ) + })?; + config.transports.mqtt.load_mqtt_details().unwrap(); + + let subscription_path = config.usubscription_config.file_path; + let usubscription = Arc::new(USubscriptionStaticFile::new(subscription_path)); + + // Start the streamer instance. + let mut streamer = UStreamer::new( + "up-streamer", + config.up_streamer_config.message_queue_size, + usubscription, + ) + .expect("Failed to create uStreamer"); + + let mut endpoints: HashMap = HashMap::new(); + + // build the zenoh transport + let zenoh_config = ZenohConfig::from_file(config.transports.zenoh.config_file).unwrap(); + let uri = UUri::try_from_parts( + &config.streamer_uuri.authority, + config.streamer_uuri.ue_id, + config.streamer_uuri.ue_version_major, + 0, + ) + .unwrap(); + let zenoh_transport: Arc = Arc::new( + UPTransportZenoh::new(zenoh_config, uri) + .await + .expect("Unable to initialize Zenoh UTransport"), + ); + + // build the mqtt5 transport + let mqtt_client_options = MqttClientOptions { + broker_uri: config + .transports + .mqtt + .mqtt_details + .clone() + .unwrap() + .hostname + + ":" + + &config + .transports + .mqtt + .mqtt_details + .unwrap() + .port + .to_string(), + ..Default::default() + }; + let mqtt_transport_options = Mqtt5TransportOptions { + mqtt_client_options, + ..Default::default() + }; + let mqtt5_transport = Mqtt5Transport::new( + mqtt_transport_options, + config.streamer_uuri.authority.clone(), + ) + .await?; + mqtt5_transport.connect().await?; + let mqtt5_transport: Arc = Arc::new(mqtt5_transport); + + // build all zenoh endpoints + for zenoh_endpoint_config in config.transports.zenoh.endpoints.clone() { + let endpoint = Endpoint::new( + &zenoh_endpoint_config.endpoint, + &zenoh_endpoint_config.authority, + zenoh_transport.clone(), + ); + if endpoints + .insert(zenoh_endpoint_config.endpoint.clone(), endpoint) + .is_some() + { + return Err(UStatus::fail_with_code( + UCode::INVALID_ARGUMENT, + format!( + "Duplicate endpoint name found: {}", + zenoh_endpoint_config.endpoint + ), + )); + } + } + + // build all mqtt endpoints + for mqtt_endpoint_config in config.transports.mqtt.endpoints.clone() { + let endpoint = Endpoint::new( + &mqtt_endpoint_config.endpoint, + &mqtt_endpoint_config.authority, + mqtt5_transport.clone(), + ); + if endpoints + .insert(mqtt_endpoint_config.endpoint.clone(), endpoint) + .is_some() + { + return Err(UStatus::fail_with_code( + UCode::INVALID_ARGUMENT, + format!( + "Duplicate endpoint name found: {}", + mqtt_endpoint_config.endpoint + ), + )); + } + } + + // set up the endpoint forwarding for zenoh + for zenoh_endpoint in config.transports.zenoh.endpoints { + for forwarding in zenoh_endpoint.forwarding { + let left_endpoint = endpoints.get(&zenoh_endpoint.endpoint).unwrap(); + let right_endpoint = endpoints.get(&forwarding).unwrap(); + streamer + .add_forwarding_rule(left_endpoint.to_owned(), right_endpoint.to_owned()) + .await + .expect("Could not add forwarding rule from {zenoh.endpoint} to {forwarding}"); + } + } + + // set up the endpoint forwarding for mqtt + for mqtt5_endpoint in config.transports.mqtt.endpoints { + for forwarding in mqtt5_endpoint.forwarding { + let left_endpoint = endpoints.get(&mqtt5_endpoint.endpoint).unwrap(); + let right_endpoint = endpoints.get(&forwarding).unwrap(); + streamer + .add_forwarding_rule(left_endpoint.to_owned(), right_endpoint.to_owned()) + .await + .expect("Could not add forwarding rule from {mqtt.endpoint} to {forwarding}"); + } + } + + thread::park(); + + Ok(()) +} diff --git a/configurable-streamer/subscription_data.json b/configurable-streamer/subscription_data.json new file mode 100644 index 0000000..ca03eaa --- /dev/null +++ b/configurable-streamer/subscription_data.json @@ -0,0 +1,4 @@ +{ + "//authority_B/3039/1/8001": ["//authority_A/5678/1/1234"], + "//authority_A/5BA0/1/8001": ["//authority_B/5678/1/1234"] +} diff --git a/example-streamer-implementations/Cargo.toml b/example-streamer-implementations/Cargo.toml index 8c0ad36..bccc4f9 100644 --- a/example-streamer-implementations/Cargo.toml +++ b/example-streamer-implementations/Cargo.toml @@ -23,14 +23,9 @@ license.workspace = true name = "zenoh_someip" required-features = ["zenoh-transport", "vsomeip-transport"] -[[bin]] -name = "zenoh_mqtt" -required-features = ["zenoh-transport", "mqtt-transport"] - [features] default = [] zenoh-transport = ["up-transport-zenoh", "zenoh"] -mqtt-transport = ["up-transport-mqtt5"] vsomeip-transport = ["up-transport-vsomeip"] bundled-vsomeip = ["up-transport-vsomeip/bundled"] @@ -48,9 +43,8 @@ up-rust = { workspace = true } up-streamer = { path = "../up-streamer" } up-transport-zenoh = { workspace = true, optional = true } up-transport-vsomeip = { workspace = true, optional = true } -up-transport-mqtt5 = { workspace = true, optional = true } zenoh = { workspace = true, optional = true } -usubscription-static-file = {path = "../utils/usubscription-static-file"} +usubscription-static-file = { path = "../utils/usubscription-static-file" } [dev-dependencies] hello-world-protos = { path = "../utils/hello-world-protos" } diff --git a/example-streamer-implementations/DEFAULT_CONFIG.json5 b/example-streamer-implementations/DEFAULT_CONFIG.json5 index 473a6f9..c70ac22 100644 --- a/example-streamer-implementations/DEFAULT_CONFIG.json5 +++ b/example-streamer-implementations/DEFAULT_CONFIG.json5 @@ -33,6 +33,7 @@ transport: "Zenoh", }, mqtt_config: { + authority: "authority_A", // The URL of the MQTT broker (the provided mosquitto broker runs on locahost but docker networks might complicate that) hostname: "localhost", // The port of the broker (unencrypted MQTT like the provided mosquitto broker typically uses 1883, encrypted uses 8883) diff --git a/example-streamer-implementations/ZENOH_CONFIG.json5 b/example-streamer-implementations/ZENOH_CONFIG.json5 index 5cbcc0e..ed2219a 100644 --- a/example-streamer-implementations/ZENOH_CONFIG.json5 +++ b/example-streamer-implementations/ZENOH_CONFIG.json5 @@ -129,7 +129,7 @@ // /// This option does not make LowLatency transport mandatory, the actual implementation of transport // /// used will depend on Establish procedure and other party's settings // /// -// /// NOTE: Currently, the LowLatency transport doesn't preserve QoS prioritization. +// /// NOTE: Currently, the LowLatency transport doesn't preserve QoS prioritization. // /// NOTE: Due to the note above, 'lowlatency' is incompatible with 'qos' option, so in order to // /// enable 'lowlatency' you need to explicitly disable 'qos'. // lowlatency: false, @@ -138,19 +138,19 @@ // enabled: true, // }, // /// Enables compression on unicast communications. -// /// Compression capabilities are negotiated during session establishment. +// /// Compression capabilities are negotiated during session establishment. // /// If both Zenoh nodes support compression, then compression is activated. // compression: { // enabled: false, // }, -// }, +// }, // multicast: { -// /// Enables QoS on multicast communication. +// /// Enables QoS on multicast communication. // /// Default to false for Zenoh-to-Zenoh-Pico out-of-the-box compatibility. // qos: { // enabled: false, // }, -// /// Enables compression on multicast communication. +// /// Enables compression on multicast communication. // /// Default to false for Zenoh-to-Zenoh-Pico out-of-the-box compatibility. // compression: { // enabled: false, @@ -416,4 +416,4 @@ // } // }, -} \ No newline at end of file +} diff --git a/example-streamer-implementations/src/bin/config/mod.rs b/example-streamer-implementations/src/bin/config/mod.rs index f97557a..01600b0 100644 --- a/example-streamer-implementations/src/bin/config/mod.rs +++ b/example-streamer-implementations/src/bin/config/mod.rs @@ -69,6 +69,7 @@ pub struct SomeipConfig { #[derive(Deserialize, Serialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MqttConfig { + pub(crate) authority: String, pub(crate) hostname: String, pub(crate) port: u16, pub(crate) max_buffered_messages: i32, diff --git a/example-streamer-implementations/src/bin/zenoh_mqtt.rs b/example-streamer-implementations/src/bin/zenoh_mqtt.rs deleted file mode 100644 index 2943fc7..0000000 --- a/example-streamer-implementations/src/bin/zenoh_mqtt.rs +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2024 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -mod config; - -use crate::config::Config; -use clap::Parser; -use log::{info, trace}; -use std::fs::File; -use std::io::Read; -use std::sync::Arc; -use std::thread; -use up_rust::{UCode, UStatus, UTransport, UUri, UUID}; -use up_streamer::{Endpoint, UStreamer}; -use up_transport_mqtt5::{MqttConfig, MqttProtocol, UPClientMqtt, UPClientMqttType}; -use up_transport_zenoh::UPTransportZenoh; -use usubscription_static_file::USubscriptionStaticFile; -use zenoh::config::Config as ZenohConfig; - -#[derive(Parser)] -#[command()] -struct StreamerArgs { - #[arg(short, long, value_name = "FILE")] - config: String, -} - -#[tokio::main] -async fn main() -> Result<(), UStatus> { - env_logger::init(); - - info!("Started up-linux-streamer-mqtt-zenoh"); - - // Get the config file. - let args = StreamerArgs::parse(); - let mut file = File::open(args.config) - .map_err(|e| UStatus::fail_with_code(UCode::NOT_FOUND, format!("File not found: {e:?}")))?; - let mut contents = String::new(); - file.read_to_string(&mut contents).map_err(|e| { - UStatus::fail_with_code( - UCode::INTERNAL, - format!("Unable to read config file: {e:?}"), - ) - })?; - - let config: Config = json5::from_str(&contents).map_err(|e| { - UStatus::fail_with_code( - UCode::INTERNAL, - format!("Unable to parse config file: {e:?}"), - ) - })?; - - let subscription_path = config.usubscription_config.file_path; - let usubscription = Arc::new(USubscriptionStaticFile::new(subscription_path)); - - // Start the streamer instance. - let mut streamer = UStreamer::new( - "up-streamer", - config.up_streamer_config.message_queue_size, - usubscription, - ) - .expect("Failed to create uStreamer"); - - // In this implementation we define that the streamer lives in the same ecu component as the zenoh entity and so shares its authority name but with a different service ID. - let streamer_uuri = UUri::try_from_parts( - &config.streamer_uuri.authority, - config.streamer_uuri.ue_id, - config.streamer_uuri.ue_version_major, - 0, - ) - .expect("Unable to form streamer_uuri"); - - trace!("streamer_uuri: {streamer_uuri:#?}"); - let zenoh_config = ZenohConfig::from_file(config.zenoh_transport_config.config_file).unwrap(); - - let zenoh_transport: Arc = Arc::new( - UPTransportZenoh::new(zenoh_config, streamer_uuri) - .await - .expect("Unable to initialize Zenoh UTransport"), - ); - - // Because the streamer runs on the ecu side in this implementation, we call the zenoh endpoint the "host". - let zenoh_endpoint = Endpoint::new( - "host_endpoint", - &config.streamer_uuri.authority, - zenoh_transport.clone(), - ); - - let mqtt_config = MqttConfig { - mqtt_protocol: MqttProtocol::Mqtt, - mqtt_hostname: config.mqtt_config.hostname, - mqtt_port: config.mqtt_config.port, - max_buffered_messages: config.mqtt_config.max_buffered_messages, - max_subscriptions: config.mqtt_config.max_subscriptions, - session_expiry_interval: config.mqtt_config.session_expiry_interval, - ssl_options: None, - username: config.mqtt_config.username, - }; - - let mqtt_transport: Arc = Arc::new( - UPClientMqtt::new( - mqtt_config, - UUID::build(), - "cloud".to_string(), - UPClientMqttType::Device, - ) - .await - .expect("Could not create mqtt transport."), - ); - - // In this implementation, the mqtt entity runs in the cloud and has its own authority. - let mqtt_endpoint = Endpoint::new("cloud_endpoint", "authority_A", mqtt_transport.clone()); - - // Here we tell the streamer to forward any zenoh messages to the mqtt endpoint - streamer - .add_forwarding_rule(zenoh_endpoint.clone(), mqtt_endpoint.clone()) - .await - .expect("Could not add zenoh -> mqtt forwarding rule"); - - // And here we set up the forwarding in the other direction. - streamer - .add_forwarding_rule(mqtt_endpoint.clone(), zenoh_endpoint.clone()) - .await - .expect("Could not add mqtt -> zenoh forwarding rule"); - - thread::park(); - - Ok(()) -} diff --git a/example-streamer-uses/src/bin/mqtt_client.rs b/example-streamer-uses/src/bin/mqtt_client.rs index 46d2f21..1251a28 100644 --- a/example-streamer-uses/src/bin/mqtt_client.rs +++ b/example-streamer-uses/src/bin/mqtt_client.rs @@ -18,8 +18,8 @@ use hello_world_protos::hello_world_service::HelloRequest; use log::info; use std::sync::Arc; use std::time::Duration; -use up_rust::{UListener, UMessageBuilder, UStatus, UTransport, UUri, UUID}; -use up_transport_mqtt5::{MqttConfig, UPClientMqtt, UPClientMqttType}; +use up_rust::{UListener, UMessageBuilder, UStatus, UTransport, UUri}; +use up_transport_mqtt5::{Mqtt5Transport, Mqtt5TransportOptions, MqttClientOptions}; const SERVICE_AUTHORITY: &str = "authority_B"; const SERVICE_UE_ID: u32 = 0x1236; @@ -56,29 +56,19 @@ async fn main() -> Result<(), UStatus> { ) .unwrap(); - let ssl_options = None; - - let mqtt_config = MqttConfig { - mqtt_protocol: up_transport_mqtt5::MqttProtocol::Mqtt, - mqtt_port: 1883, - mqtt_hostname: "localhost".to_string(), - max_buffered_messages: 100, - max_subscriptions: 100, - session_expiry_interval: 3600, - ssl_options, - username: "user".to_string(), + let mqtt_client_options = MqttClientOptions { + broker_uri: "localhost:1883".to_string(), + ..Default::default() + }; + let mqtt_transport_options = Mqtt5TransportOptions { + mqtt_client_options, + ..Default::default() }; + let mqtt5_transport = + Mqtt5Transport::new(mqtt_transport_options, CLIENT_AUTHORITY.to_string()).await?; + mqtt5_transport.connect().await?; - let client: Arc = Arc::new( - UPClientMqtt::new( - mqtt_config, - UUID::build(), - CLIENT_AUTHORITY.to_string(), - UPClientMqttType::Device, - ) - .await - .expect("Could not create mqtt transport."), - ); + let client: Arc = Arc::new(mqtt5_transport); let service_response_listener: Arc = Arc::new(ServiceResponseListener); client diff --git a/example-streamer-uses/src/bin/mqtt_publisher.rs b/example-streamer-uses/src/bin/mqtt_publisher.rs index 4618fca..87220ca 100644 --- a/example-streamer-uses/src/bin/mqtt_publisher.rs +++ b/example-streamer-uses/src/bin/mqtt_publisher.rs @@ -18,8 +18,8 @@ use hello_world_protos::timeofday::TimeOfDay; use log::info; use std::sync::Arc; use std::time::Duration; -use up_rust::{UMessageBuilder, UStatus, UTransport, UUri, UUID}; -use up_transport_mqtt5::{MqttConfig, UPClientMqtt, UPClientMqttType}; +use up_rust::{UMessageBuilder, UStatus, UTransport, UUri}; +use up_transport_mqtt5::{Mqtt5Transport, Mqtt5TransportOptions, MqttClientOptions}; const PUB_TOPIC_AUTHORITY: &str = "authority_A"; const PUB_TOPIC_UE_ID: u32 = 0x5BA0; @@ -41,29 +41,19 @@ async fn main() -> Result<(), UStatus> { ) .unwrap(); - let ssl_options = None; - - let mqtt_config = MqttConfig { - mqtt_protocol: up_transport_mqtt5::MqttProtocol::Mqtt, - mqtt_port: 1883, - mqtt_hostname: "localhost".to_string(), - max_buffered_messages: 100, - max_subscriptions: 100, - session_expiry_interval: 3600, - ssl_options, - username: "user".to_string(), + let mqtt_client_options = MqttClientOptions { + broker_uri: "localhost:1883".to_string(), + ..Default::default() + }; + let mqtt_transport_options = Mqtt5TransportOptions { + mqtt_client_options, + ..Default::default() }; + let mqtt5_transport = + Mqtt5Transport::new(mqtt_transport_options, PUB_TOPIC_AUTHORITY.to_string()).await?; + mqtt5_transport.connect().await?; - let publisher: Arc = Arc::new( - UPClientMqtt::new( - mqtt_config, - UUID::build(), - PUB_TOPIC_AUTHORITY.to_string(), - UPClientMqttType::Device, - ) - .await - .expect("Could not create mqtt transport."), - ); + let publisher: Arc = Arc::new(mqtt5_transport); loop { tokio::time::sleep(Duration::from_millis(1000)).await; diff --git a/example-streamer-uses/src/bin/mqtt_service.rs b/example-streamer-uses/src/bin/mqtt_service.rs index 38b4310..bd9dc01 100644 --- a/example-streamer-uses/src/bin/mqtt_service.rs +++ b/example-streamer-uses/src/bin/mqtt_service.rs @@ -17,8 +17,8 @@ use common::ServiceRequestResponder; use log::info; use std::sync::Arc; use std::thread; -use up_rust::{UListener, UStatus, UTransport, UUri, UUID}; -use up_transport_mqtt5::{MqttConfig, UPClientMqtt, UPClientMqttType}; +use up_rust::{UListener, UStatus, UTransport, UUri}; +use up_transport_mqtt5::{Mqtt5Transport, Mqtt5TransportOptions, MqttClientOptions}; const SERVICE_AUTHORITY: &str = "authority_A"; const SERVICE_UE_ID: u32 = 0x4321; @@ -42,29 +42,19 @@ async fn main() -> Result<(), UStatus> { ) .unwrap(); - let ssl_options = None; - - let mqtt_config = MqttConfig { - mqtt_protocol: up_transport_mqtt5::MqttProtocol::Mqtt, - mqtt_port: 1883, - mqtt_hostname: "localhost".to_string(), - max_buffered_messages: 100, - max_subscriptions: 100, - session_expiry_interval: 3600, - ssl_options, - username: "user".to_string(), + let mqtt_client_options = MqttClientOptions { + broker_uri: "localhost:1883".to_string(), + ..Default::default() + }; + let mqtt_transport_options = Mqtt5TransportOptions { + mqtt_client_options, + ..Default::default() }; + let mqtt5_transport = + Mqtt5Transport::new(mqtt_transport_options, SERVICE_AUTHORITY.to_string()).await?; + mqtt5_transport.connect().await?; - let service: Arc = Arc::new( - UPClientMqtt::new( - mqtt_config, - UUID::build(), - SERVICE_AUTHORITY.to_string(), - UPClientMqttType::Device, // Todo: make sure that UPClientMqttType::Cloud also works - ) - .await - .expect("Could not create mqtt transport."), - ); + let service: Arc = Arc::new(mqtt5_transport); let service_request_responder: Arc = Arc::new(ServiceRequestResponder::new(service.clone())); diff --git a/example-streamer-uses/src/bin/mqtt_subscriber.rs b/example-streamer-uses/src/bin/mqtt_subscriber.rs index 5d28fb1..e217e61 100644 --- a/example-streamer-uses/src/bin/mqtt_subscriber.rs +++ b/example-streamer-uses/src/bin/mqtt_subscriber.rs @@ -17,8 +17,8 @@ use common::PublishReceiver; use log::info; use std::sync::Arc; use std::thread; -use up_rust::{UListener, UStatus, UTransport, UUri, UUID}; -use up_transport_mqtt5::{MqttConfig, UPClientMqtt, UPClientMqttType}; +use up_rust::{UListener, UStatus, UTransport, UUri}; +use up_transport_mqtt5::{Mqtt5Transport, Mqtt5TransportOptions, MqttClientOptions}; const PUB_TOPIC_AUTHORITY: &str = "authority_B"; const PUB_TOPIC_UE_ID: u32 = 0x3039; @@ -42,29 +42,19 @@ async fn main() -> Result<(), UStatus> { ) .unwrap(); - let ssl_options = None; - - let mqtt_config = MqttConfig { - mqtt_protocol: up_transport_mqtt5::MqttProtocol::Mqtt, - mqtt_port: 1883, - mqtt_hostname: "localhost".to_string(), - max_buffered_messages: 100, - max_subscriptions: 100, - session_expiry_interval: 3600, - ssl_options, - username: "user".to_string(), + let mqtt_client_options = MqttClientOptions { + broker_uri: "localhost:1883".to_string(), + ..Default::default() + }; + let mqtt_transport_options = Mqtt5TransportOptions { + mqtt_client_options, + ..Default::default() }; + let mqtt5_transport = + Mqtt5Transport::new(mqtt_transport_options, SUB_TOPIC_AUTHORITY.to_string()).await?; + mqtt5_transport.connect().await?; - let subscriber: Arc = Arc::new( - UPClientMqtt::new( - mqtt_config, - UUID::build(), - SUB_TOPIC_AUTHORITY.to_string(), - UPClientMqttType::Device, - ) - .await - .expect("Could not create mqtt transport."), - ); + let subscriber: Arc = Arc::new(mqtt5_transport); let publish_receiver: Arc = Arc::new(PublishReceiver); subscriber diff --git a/example-streamer-uses/src/bin/zenoh_client.rs b/example-streamer-uses/src/bin/zenoh_client.rs index 3a185d2..4c9e21d 100644 --- a/example-streamer-uses/src/bin/zenoh_client.rs +++ b/example-streamer-uses/src/bin/zenoh_client.rs @@ -50,7 +50,7 @@ fn client_uuri() -> UUri { #[command(version, about, long_about = None)] struct Args { /// The endpoint for Zenoh client to connect to - #[arg(short, long, default_value = "tcp/0.0.0.0:7445")] + #[arg(short, long, default_value = "tcp/127.0.0.1:7447")] endpoint: String, } @@ -71,7 +71,7 @@ async fn main() -> Result<(), UStatus> { // Add the IPv4 endpoint to the Zenoh configuration zenoh_config - .listen + .connect .endpoints .set(vec![ipv4_endpoint]) .expect("Unable to set Zenoh Config"); diff --git a/example-streamer-uses/src/bin/zenoh_publisher.rs b/example-streamer-uses/src/bin/zenoh_publisher.rs index 81eab92..5292213 100644 --- a/example-streamer-uses/src/bin/zenoh_publisher.rs +++ b/example-streamer-uses/src/bin/zenoh_publisher.rs @@ -42,7 +42,7 @@ fn publisher_uuri() -> UUri { #[command(version, about, long_about = None)] struct Args { /// The endpoint for Zenoh client to connect to - #[arg(short, long, default_value = "tcp/0.0.0.0:7444")] + #[arg(short, long, default_value = "tcp/127.0.0.1:7447")] endpoint: String, } @@ -63,7 +63,7 @@ async fn main() -> Result<(), UStatus> { // Add the IPv4 endpoint to the Zenoh configuration zenoh_config - .listen + .connect .endpoints .set(vec![ipv4_endpoint]) .expect("Unable to set Zenoh Config"); diff --git a/example-streamer-uses/src/bin/zenoh_service.rs b/example-streamer-uses/src/bin/zenoh_service.rs index b1f6e15..c450480 100644 --- a/example-streamer-uses/src/bin/zenoh_service.rs +++ b/example-streamer-uses/src/bin/zenoh_service.rs @@ -42,7 +42,7 @@ fn service_uuri() -> UUri { #[command(version, about, long_about = None)] struct Args { /// The endpoint for Zenoh client to connect to - #[arg(short, long, default_value = "tcp/0.0.0.0:7443")] + #[arg(short, long, default_value = "tcp/localhost:7447")] endpoint: String, } @@ -63,7 +63,7 @@ async fn main() -> Result<(), UStatus> { // Add the IPv4 endpoint to the Zenoh configuration zenoh_config - .listen + .connect .endpoints .set(vec![ipv4_endpoint]) .expect("Unable to set Zenoh Config"); diff --git a/example-streamer-uses/src/bin/zenoh_subscriber.rs b/example-streamer-uses/src/bin/zenoh_subscriber.rs index 243808a..d41fe3f 100644 --- a/example-streamer-uses/src/bin/zenoh_subscriber.rs +++ b/example-streamer-uses/src/bin/zenoh_subscriber.rs @@ -46,7 +46,7 @@ fn subscriber_uuri() -> UUri { #[command(version, about, long_about = None)] struct Args { /// The endpoint for Zenoh client to connect to - #[arg(short, long, default_value = "tcp/0.0.0.0:7442")] + #[arg(short, long, default_value = "tcp/127.0.0.1:7447")] endpoint: String, } @@ -67,7 +67,7 @@ async fn main() -> Result<(), UStatus> { // Add the IPv4 endpoint to the Zenoh configuration zenoh_config - .listen + .connect .endpoints .set(vec![ipv4_endpoint]) .expect("Unable to set Zenoh Config"); diff --git a/example-streamer-uses/vsomeip-configs/someip_client.json b/example-streamer-uses/vsomeip-configs/someip_client.json index b5f4ce4..fdf8aaa 100644 --- a/example-streamer-uses/vsomeip-configs/someip_client.json +++ b/example-streamer-uses/vsomeip-configs/someip_client.json @@ -1,9 +1,8 @@ { - "applications" : - [ - { - "name" : "0x5678", - "id" : "0x5678" - } - ] + "applications": [ + { + "name": "0x5678", + "id": "0x5678" + } + ] } diff --git a/example-streamer-uses/vsomeip-configs/someip_publisher.json b/example-streamer-uses/vsomeip-configs/someip_publisher.json index 4ed3ddb..27ed611 100644 --- a/example-streamer-uses/vsomeip-configs/someip_publisher.json +++ b/example-streamer-uses/vsomeip-configs/someip_publisher.json @@ -1,9 +1,8 @@ { - "applications" : - [ - { - "name" : "0x1237", - "id" : "0x1237" - } - ] + "applications": [ + { + "name": "0x1237", + "id": "0x1237" + } + ] } diff --git a/example-streamer-uses/vsomeip-configs/someip_service.json b/example-streamer-uses/vsomeip-configs/someip_service.json index 8f840b1..e2bad4e 100644 --- a/example-streamer-uses/vsomeip-configs/someip_service.json +++ b/example-streamer-uses/vsomeip-configs/someip_service.json @@ -1,9 +1,8 @@ { - "applications" : - [ - { - "name" : "0x4321", - "id" : "0x4321" - } - ] + "applications": [ + { + "name": "0x4321", + "id": "0x4321" + } + ] } diff --git a/example-streamer-uses/vsomeip-configs/someip_subscriber.json b/example-streamer-uses/vsomeip-configs/someip_subscriber.json index 8f840b1..e2bad4e 100644 --- a/example-streamer-uses/vsomeip-configs/someip_subscriber.json +++ b/example-streamer-uses/vsomeip-configs/someip_subscriber.json @@ -1,9 +1,8 @@ { - "applications" : - [ - { - "name" : "0x4321", - "id" : "0x4321" - } - ] + "applications": [ + { + "name": "0x4321", + "id": "0x4321" + } + ] } diff --git a/up-linux-streamer-plugin/Cargo.toml b/up-linux-streamer-plugin/Cargo.toml index bddb08d..7304835 100644 --- a/up-linux-streamer-plugin/Cargo.toml +++ b/up-linux-streamer-plugin/Cargo.toml @@ -21,8 +21,14 @@ license.workspace = true [features] default = ["dynamic_plugin"] -zenoh-transport = ["up-transport-zenoh", "zenoh", "zenoh-core", "zenoh-plugin-trait", - "zenoh-result", "zenoh-util", "zenoh_backend_traits"] +zenoh-transport = [ + "up-transport-zenoh", + "zenoh", + "zenoh-core", + "zenoh-plugin-trait", + "zenoh-result", + "zenoh-util", +] vsomeip-transport = ["up-transport-vsomeip"] bundled-vsomeip = ["up-transport-vsomeip/bundled"] dynamic_plugin = [] @@ -47,13 +53,14 @@ serde = { version = "1.0.154" } serde_json = { version = "1.0.94" } tokio = { version = "1.35.1", default-features = false } up-rust = { workspace = true } -up-transport-zenoh = { workspace = true, optional = true, features = ["zenoh-unstable"] } +up-transport-zenoh = { workspace = true, optional = true, features = [ + "zenoh-unstable", +] } up-transport-vsomeip = { workspace = true, optional = true } up-streamer = { path = "../up-streamer" } -usubscription-static-file = {path = "../utils/usubscription-static-file"} +usubscription-static-file = { path = "../utils/usubscription-static-file" } zenoh = { workspace = true, optional = true } zenoh-core = { workspace = true, optional = true } zenoh-plugin-trait = { workspace = true, optional = true } zenoh-result = { workspace = true, optional = true } zenoh-util = { workspace = true, optional = true } -zenoh_backend_traits = { workspace = true, optional = true } diff --git a/up-streamer/src/ustreamer.rs b/up-streamer/src/ustreamer.rs index a601d45..ccc410e 100644 --- a/up-streamer/src/ustreamer.rs +++ b/up-streamer/src/ustreamer.rs @@ -50,9 +50,13 @@ lazy_static! { } fn uauthority_to_uuri(authority_name: &str) -> UUri { + // let mut uuri = UUri::any(); + // uuri.authority_name = authority_name.to_string(); + // uuri + UUri { authority_name: authority_name.to_string(), - ue_id: 0x0000_FFFF, // any instance, any service + ue_id: 0xFFFF_FFFF, // any instance, any service ue_version_major: 0xFF, // any resource_id: 0xFFFF, // any ..Default::default() @@ -190,6 +194,7 @@ impl ForwardingListeners { pub async fn insert( &self, in_transport: Arc, + in_authority: &str, out_authority: &str, forwarding_id: &str, out_sender: Sender>, @@ -219,9 +224,10 @@ impl ForwardingListeners { // Perform async registration and fetching uuris_to_backpedal.insert((UUri::any(), Some(uauthority_to_uuri(out_authority)))); + if let Err(err) = in_transport .register_listener( - &UUri::any(), + &uauthority_to_uuri(in_authority), Some(&uauthority_to_uuri(out_authority)), forwarding_listener.clone(), ) @@ -271,9 +277,20 @@ impl ForwardingListeners { }; for subscriber in subscribers { + let source_uri = UUri::try_from_parts( + in_authority, + subscriber.topic.ue_id, + subscriber.topic.uentity_major_version(), + subscriber.topic.resource_id(), + ) + .unwrap(); + info!( + "in authority: {}, out authority: {}, source URI filter: {:?}", + in_authority, out_authority, source_uri + ); uuris_to_backpedal.insert((subscriber.topic.clone(), None)); if let Err(err) = in_transport - .register_listener(&subscriber.topic, None, forwarding_listener.clone()) + .register_listener(&source_uri, None, forwarding_listener.clone()) .await { warn!( @@ -567,7 +584,7 @@ impl UStreamer { /// /// * name - Used to uniquely identify this UStreamer in logs /// * message_queue_size - Determines size of channel used to communicate between `ForwardingListener` - /// and the worker tasks for each currently endpointd `UTransport` + /// and the worker tasks for each currently endpointd `UTransport` /// * usubscription - Subscription service which will be used to store subscription info for topics. pub fn new( name: &str, @@ -722,6 +739,7 @@ impl UStreamer { .forwarding_listeners .insert( r#in.transport.clone(), + &r#in.authority, &out.authority, &Self::forwarding_id(&r#in, &out), out_sender, diff --git a/up-streamer/tests/single_local_single_remote.rs b/up-streamer/tests/single_local_single_remote.rs index 0ec9fa4..53b299e 100644 --- a/up-streamer/tests/single_local_single_remote.rs +++ b/up-streamer/tests/single_local_single_remote.rs @@ -33,7 +33,7 @@ use up_rust::{UListener, UTransport}; use up_streamer::{Endpoint, UStreamer}; use usubscription_static_file::USubscriptionStaticFile; -const DURATION_TO_RUN_CLIENTS: u128 = 1_000; +const DURATION_TO_RUN_CLIENTS: u128 = 10; const SENT_MESSAGE_VEC_CAPACITY: usize = 10_000; #[tokio::test(flavor = "multi_thread")] diff --git a/utils/hello-world-protos/Cargo.toml b/utils/hello-world-protos/Cargo.toml index 6004a28..7b33583 100644 --- a/utils/hello-world-protos/Cargo.toml +++ b/utils/hello-world-protos/Cargo.toml @@ -23,4 +23,4 @@ protobuf = { workspace = true } [build-dependencies] protobuf-codegen = { version = "3.3" } protoc-bin-vendored = { version = "3.0" } -reqwest = { version = "0.12", features = ["blocking"] } +reqwest = { version = "0.12.14", features = ["blocking"] } diff --git a/utils/hello-world-protos/build.rs b/utils/hello-world-protos/build.rs index a31951f..3cb5494 100644 --- a/utils/hello-world-protos/build.rs +++ b/utils/hello-world-protos/build.rs @@ -46,7 +46,7 @@ fn get_and_build_protos( let mut proto_files = Vec::new(); for url in urls { - let file_name = url.split('/').last().unwrap(); + let file_name = url.split('/').next_back().unwrap(); let mut file_path_buf = PathBuf::from(&proto_folder); // Check if the URL is from googleapis to determine the correct path diff --git a/utils/integration-test-utils/src/up_client_foo.rs b/utils/integration-test-utils/src/up_client_foo.rs index 2815889..c6f8a15 100644 --- a/utils/integration-test-utils/src/up_client_foo.rs +++ b/utils/integration-test-utils/src/up_client_foo.rs @@ -243,65 +243,28 @@ impl UTransport for UPClientFoo { self.name, source_filter, sink_filter ); - let sink_for_specific = { - if let Some(sink) = sink_filter { - sink.authority_name != "*" - } else { - false - } - }; - - return if source_filter.authority_name == "*" && sink_for_specific { - let sink_authority = sink_filter.unwrap().clone().authority_name; - let mut authority_listeners = self.authority_listeners.lock().await; - let authority = sink_authority; - debug!( - "{}: registering authority listener on authority: {}", - &self.name, authority - ); - let authority_listeners = authority_listeners.entry(authority.clone()).or_default(); - let comparable_listener = ComparableListener::new(listener); - let inserted = authority_listeners.insert(comparable_listener); - - match inserted { - true => { - debug!("{}: successfully registered authority listener for: authority: {}", &self.name, authority); - - Ok(()) - }, - false => Err(UStatus::fail_with_code( - UCode::ALREADY_EXISTS, - format!("{}: UUri and listener already registered! failed to register authority listener for: authority: {}", &self.name, authority) - )), - } - } else { - debug!( - "{}: registering regular listener for: source: {:?} sink: {:?}", - &self.name, source_filter, sink_filter - ); - - let mut listeners = self.listeners.lock().await; - let topic_listeners = listeners - .entry((source_filter.clone(), sink_filter.cloned())) - .or_default(); - let comparable_listener = ComparableListener::new(listener); - let inserted = topic_listeners.insert(comparable_listener); - - match inserted { - true => { - debug!( - "{}: successfully registered regular listener for: source: {:?} sink: {:?}", - &self.name, source_filter, sink_filter - ); - - Ok(()) - } - false => Err(UStatus::fail_with_code( - UCode::ALREADY_EXISTS, - "UUri and listener already registered!", - )), - } - }; + let sink_authority = sink_filter.unwrap().clone().authority_name; + let mut authority_listeners = self.authority_listeners.lock().await; + let authority = sink_authority; + debug!( + "{}: registering authority listener on authority: {}", + &self.name, authority + ); + let authority_listeners = authority_listeners.entry(authority.clone()).or_default(); + let comparable_listener = ComparableListener::new(listener); + let inserted = authority_listeners.insert(comparable_listener); + + match inserted { + true => { + debug!("{}: successfully registered authority listener for: authority: {}", &self.name, authority); + + Ok(()) + }, + false => Err(UStatus::fail_with_code( + UCode::ALREADY_EXISTS, + format!("{}: UUri and listener already registered! failed to register authority listener for: authority: {}", &self.name, authority) + )), + } } async fn unregister_listener( diff --git a/utils/mosquitto/docker-compose.yaml b/utils/mosquitto/docker-compose.yaml index 09e6afd..85b0e02 100644 --- a/utils/mosquitto/docker-compose.yaml +++ b/utils/mosquitto/docker-compose.yaml @@ -3,6 +3,6 @@ services: image: eclipse-mosquitto:2.0 volumes: # read-only prevents the container changing file owners on the host - - ./mosquitto.conf:/mosquitto/config/mosquitto.conf:ro + - ./mosquitto.config:/mosquitto/config/mosquitto.conf:ro ports: - 1883:1883