mq-bridge-py-basic 0.3.2__tar.gz → 0.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mq_bridge_py_basic-0.3.3/.github/workflows/benchmark.yml +254 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/workflows/node.yml +23 -1
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/workflows/publish-node.yml +18 -4
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/workflows/publish-python.yml +33 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/CONFIGURATION.md +21 -3
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/Cargo.lock +55 -4
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/Cargo.toml +17 -7
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/PKG-INFO +50 -5
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/README.md +4 -1
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/benches/performance_bench.rs +55 -19
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/bindings-common/Cargo.toml +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/bindings-common/src/lib.rs +2 -0
- mq_bridge_py_basic-0.3.3/bindings-common/src/logging.rs +234 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/mq-bridge.schema.json +183 -12
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/mq_bridge/__init__.py +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/mq_bridge/__init__.pyi +11 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/mq_bridge/config.py +4 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/mq_bridge/config.pyi +31 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/Cargo.toml +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/README.md +49 -4
- mq_bridge_py_basic-0.3.3/python/mq-bridge-py/pyproject-reduced.toml +65 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/src/lib.rs +65 -5
- mq_bridge_py_basic-0.3.3/python/mq-bridge-py/tests/test_logging.py +113 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_public_api.py +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/analysis/debug_ibm_mq_tls.rs +5 -4
- mq_bridge_py_basic-0.3.3/scripts/ci/format_bench_output.sh +11 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/canonical_message.rs +4 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/ibm_mq.rs +10 -18
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/mod.rs +85 -0
- mq_bridge_py_basic-0.3.3/src/endpoints/redis_streams.rs +644 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/models.rs +173 -8
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/test_utils.rs +162 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/kafka.yml +1 -0
- mq_bridge_py_basic-0.3.3/tests/integration/docker-compose/redis.yml +11 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/http.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/kafka.rs +96 -4
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/mariadb.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/mod.rs +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/mysql.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/nats.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/postgres.rs +2 -2
- mq_bridge_py_basic-0.3.3/tests/integration/redis_streams.rs +147 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/sqlite.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/tls_helpers.rs +3 -3
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration_test.rs +36 -0
- mq_bridge_py_basic-0.3.2/.github/workflows/benchmark.yml +0 -102
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/workflows/ci.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/workflows/ibm-mq.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/workflows/python.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/workflows/release.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.github/workflows/test-matrix.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/.gitignore +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/ARCHITECTURE.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/CONTRIBUTING.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/LICENSE +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/benches/router_bench.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/build.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/claude.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/examples/ipc_worker_queue.yaml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/mq_bridge/py.typed +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/package-lock.json +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/example.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/bench_memory.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/consume_pull.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/dlt_source.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/json_route.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/memory.yaml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/raw_route.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/pyproject-basic.toml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_config_types.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_packaging.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_routes.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/uv.lock +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/analysis/benches/metadata_bench.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/http_flamegraph.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/run_http_ladder.sh +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/httparena/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/techempower/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/techempower/postgres.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/techempower/seed.sql +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/techempower/verify.sh +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/command_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/connection_registry.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/amqp.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/aws.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/fanout.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/file.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/grpc.proto +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/grpc.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/http.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/http_stream.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/kafka.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/endpoint.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/ipc_unix.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/ipc_windows.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/memory_transport.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/mod.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/transport.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/mongodb.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/nats.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/null.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/reader.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/response.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/sled.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/sqlx.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/static_endpoint.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/stream_buffer.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/switch.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/websocket.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/endpoints/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/errors.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/event_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/event_store.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/extensions.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/lib.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/buffer.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/cookie_jar.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/deduplication.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/delay.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/dlq.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/limiter.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/metrics.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/mod.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/random_panic.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/retry.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/middleware/weak_join.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/outcomes.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/publisher.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/response.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/route.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/traits.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/src/type_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/armature_integration.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/amqp.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/aws.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/config.toml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/amqp.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/aws.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm_mq.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/kafka-tls.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mariadb.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto.conf +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mq_init.mqsc +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mqtt.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mysql.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/nats.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/postgres.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/file.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/grpc.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/grpc_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/http_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/ibm_mq.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/ibm_mq_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/ipc.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/kafka_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/logic_test.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/memory.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb_raw.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/performance_static.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/route.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/scripts/gen_certs.sh +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/websocket.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/integration/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/memory_leak_test.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/ref_test.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/sqlite_test.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/tls_example.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/unit_tests.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.3}/tests/websocket_test.rs +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
name: Benchmark
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, dev]
|
|
6
|
+
schedule:
|
|
7
|
+
# Nightly full benchmark run (04:00 UTC)
|
|
8
|
+
- cron: '0 4 * * *'
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
env:
|
|
12
|
+
CARGO_TERM_COLOR: always
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
# Compile the bench binary once (release, --features full) and hand the
|
|
16
|
+
# executable to the shard jobs below so none of them need to recompile.
|
|
17
|
+
benchmark-build:
|
|
18
|
+
name: Build Benchmark Binary
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
with:
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
|
|
27
|
+
- name: Install Rust toolchain
|
|
28
|
+
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
|
|
29
|
+
|
|
30
|
+
- name: Cache cargo build
|
|
31
|
+
uses: Swatinem/rust-cache@v2
|
|
32
|
+
with:
|
|
33
|
+
shared-key: release-full
|
|
34
|
+
|
|
35
|
+
- name: Build bench binary
|
|
36
|
+
run: |
|
|
37
|
+
set -o pipefail
|
|
38
|
+
cargo bench --bench performance_bench --features full --no-run --message-format=json | tee build-output.json
|
|
39
|
+
BIN_PATH=$(jq -r 'select(.reason == "compiler-artifact" and (.target.kind // [] | index("bench")) and .executable != null) | .executable' build-output.json | tail -n1)
|
|
40
|
+
if [ -z "$BIN_PATH" ]; then
|
|
41
|
+
echo "Could not locate performance_bench executable in cargo build output" >&2
|
|
42
|
+
exit 1
|
|
43
|
+
fi
|
|
44
|
+
cp "$BIN_PATH" ./performance_bench_bin
|
|
45
|
+
|
|
46
|
+
- name: Upload bench binary
|
|
47
|
+
uses: actions/upload-artifact@v4
|
|
48
|
+
with:
|
|
49
|
+
name: performance-bench-bin
|
|
50
|
+
path: performance_bench_bin
|
|
51
|
+
retention-days: 1
|
|
52
|
+
|
|
53
|
+
# Three independent shards of the same binary, filtered via the
|
|
54
|
+
# MQB_TEST_BACKEND env var that test_utils::should_run_benchmark() already
|
|
55
|
+
# supports. Each only pre-pulls the Docker images it actually needs.
|
|
56
|
+
benchmark-streams:
|
|
57
|
+
name: Benchmark (streams)
|
|
58
|
+
needs: benchmark-build
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
permissions:
|
|
61
|
+
contents: read
|
|
62
|
+
steps:
|
|
63
|
+
- uses: actions/checkout@v4
|
|
64
|
+
with:
|
|
65
|
+
persist-credentials: false
|
|
66
|
+
|
|
67
|
+
- name: Download bench binary
|
|
68
|
+
uses: actions/download-artifact@v4
|
|
69
|
+
with:
|
|
70
|
+
name: performance-bench-bin
|
|
71
|
+
|
|
72
|
+
- name: Pre-pull docker images
|
|
73
|
+
run: |
|
|
74
|
+
for f in aws kafka amqp nats mqtt_performance; do
|
|
75
|
+
docker compose -f "tests/integration/docker-compose/${f}.yml" pull -q
|
|
76
|
+
done
|
|
77
|
+
|
|
78
|
+
- name: Run benchmarks
|
|
79
|
+
shell: bash
|
|
80
|
+
env:
|
|
81
|
+
MQB_TEST_BACKEND: "aws,kafka,amqp,nats,mqtt,ibm-mq"
|
|
82
|
+
run: |
|
|
83
|
+
set -o pipefail
|
|
84
|
+
chmod +x ./performance_bench_bin
|
|
85
|
+
export CARGO_TERM_COLOR=never
|
|
86
|
+
./performance_bench_bin --bench --output-format bencher | tee raw_output_streams.txt
|
|
87
|
+
./scripts/ci/format_bench_output.sh raw_output_streams.txt output_streams.txt
|
|
88
|
+
|
|
89
|
+
- name: Upload shard output
|
|
90
|
+
uses: actions/upload-artifact@v4
|
|
91
|
+
with:
|
|
92
|
+
name: bench-output-streams
|
|
93
|
+
path: |
|
|
94
|
+
raw_output_streams.txt
|
|
95
|
+
output_streams.txt
|
|
96
|
+
retention-days: 1
|
|
97
|
+
|
|
98
|
+
benchmark-database:
|
|
99
|
+
name: Benchmark (database)
|
|
100
|
+
needs: benchmark-build
|
|
101
|
+
runs-on: ubuntu-latest
|
|
102
|
+
permissions:
|
|
103
|
+
contents: read
|
|
104
|
+
steps:
|
|
105
|
+
- uses: actions/checkout@v4
|
|
106
|
+
with:
|
|
107
|
+
persist-credentials: false
|
|
108
|
+
|
|
109
|
+
- name: Download bench binary
|
|
110
|
+
uses: actions/download-artifact@v4
|
|
111
|
+
with:
|
|
112
|
+
name: performance-bench-bin
|
|
113
|
+
|
|
114
|
+
- name: Pre-pull docker images
|
|
115
|
+
run: |
|
|
116
|
+
for f in mongodb postgres; do
|
|
117
|
+
docker compose -f "tests/integration/docker-compose/${f}.yml" pull -q
|
|
118
|
+
done
|
|
119
|
+
|
|
120
|
+
- name: Run benchmarks
|
|
121
|
+
shell: bash
|
|
122
|
+
env:
|
|
123
|
+
MQB_TEST_BACKEND: "mongodb,postgres"
|
|
124
|
+
run: |
|
|
125
|
+
set -o pipefail
|
|
126
|
+
chmod +x ./performance_bench_bin
|
|
127
|
+
export CARGO_TERM_COLOR=never
|
|
128
|
+
./performance_bench_bin --bench --output-format bencher | tee raw_output_database.txt
|
|
129
|
+
./scripts/ci/format_bench_output.sh raw_output_database.txt output_database.txt
|
|
130
|
+
|
|
131
|
+
- name: Upload shard output
|
|
132
|
+
uses: actions/upload-artifact@v4
|
|
133
|
+
with:
|
|
134
|
+
name: bench-output-database
|
|
135
|
+
path: |
|
|
136
|
+
raw_output_database.txt
|
|
137
|
+
output_database.txt
|
|
138
|
+
retention-days: 1
|
|
139
|
+
|
|
140
|
+
benchmark-dockerless:
|
|
141
|
+
name: Benchmark (dockerless)
|
|
142
|
+
needs: benchmark-build
|
|
143
|
+
runs-on: ubuntu-latest
|
|
144
|
+
permissions:
|
|
145
|
+
contents: read
|
|
146
|
+
steps:
|
|
147
|
+
- uses: actions/checkout@v4
|
|
148
|
+
with:
|
|
149
|
+
persist-credentials: false
|
|
150
|
+
|
|
151
|
+
- name: Download bench binary
|
|
152
|
+
uses: actions/download-artifact@v4
|
|
153
|
+
with:
|
|
154
|
+
name: performance-bench-bin
|
|
155
|
+
|
|
156
|
+
- name: Run benchmarks
|
|
157
|
+
shell: bash
|
|
158
|
+
env:
|
|
159
|
+
MQB_TEST_BACKEND: "zeromq,memory,file,http,websocket,grpc"
|
|
160
|
+
run: |
|
|
161
|
+
set -o pipefail
|
|
162
|
+
chmod +x ./performance_bench_bin
|
|
163
|
+
export CARGO_TERM_COLOR=never
|
|
164
|
+
./performance_bench_bin --bench --output-format bencher | tee raw_output_dockerless.txt
|
|
165
|
+
./scripts/ci/format_bench_output.sh raw_output_dockerless.txt output_dockerless.txt
|
|
166
|
+
|
|
167
|
+
- name: Upload shard output
|
|
168
|
+
uses: actions/upload-artifact@v4
|
|
169
|
+
with:
|
|
170
|
+
name: bench-output-dockerless
|
|
171
|
+
path: |
|
|
172
|
+
raw_output_dockerless.txt
|
|
173
|
+
output_dockerless.txt
|
|
174
|
+
retention-days: 1
|
|
175
|
+
|
|
176
|
+
# Merge the three shard outputs back into the single combined report the
|
|
177
|
+
# gh-pages benchmark history / dashboard has always tracked.
|
|
178
|
+
benchmark-collect:
|
|
179
|
+
name: Collect Benchmark Results
|
|
180
|
+
needs: [benchmark-streams, benchmark-database, benchmark-dockerless]
|
|
181
|
+
runs-on: ubuntu-latest
|
|
182
|
+
permissions:
|
|
183
|
+
contents: write
|
|
184
|
+
deployments: write
|
|
185
|
+
steps:
|
|
186
|
+
- uses: actions/checkout@v4
|
|
187
|
+
|
|
188
|
+
- name: Download shard outputs
|
|
189
|
+
uses: actions/download-artifact@v4
|
|
190
|
+
with:
|
|
191
|
+
pattern: bench-output-*
|
|
192
|
+
merge-multiple: true
|
|
193
|
+
path: bench-outputs
|
|
194
|
+
|
|
195
|
+
- name: Merge shard outputs
|
|
196
|
+
run: |
|
|
197
|
+
cat bench-outputs/raw_output_*.txt > raw_output.txt
|
|
198
|
+
cat bench-outputs/output_*.txt > output.txt
|
|
199
|
+
|
|
200
|
+
- name: Generate Throughput Summary
|
|
201
|
+
run: |
|
|
202
|
+
python3 -c '
|
|
203
|
+
import re
|
|
204
|
+
import os
|
|
205
|
+
|
|
206
|
+
data = {}
|
|
207
|
+
try:
|
|
208
|
+
with open("raw_output.txt", "r") as f:
|
|
209
|
+
for line in f:
|
|
210
|
+
# Match lines like: "aws single_write: 1 iters, total time 1.48s, 673.75 msgs/sec"
|
|
211
|
+
m = re.search(r"^\s*(.*): .* ([\d\.]+) msgs/sec", line)
|
|
212
|
+
if m:
|
|
213
|
+
name = m.group(1).strip()
|
|
214
|
+
rate = float(m.group(2))
|
|
215
|
+
if name not in data:
|
|
216
|
+
data[name] = []
|
|
217
|
+
data[name].append(rate)
|
|
218
|
+
|
|
219
|
+
if data:
|
|
220
|
+
with open(os.environ["GITHUB_STEP_SUMMARY"], "a") as f:
|
|
221
|
+
f.write("### Benchmark Throughput Results\n")
|
|
222
|
+
f.write("| Test Case | Average msgs/sec | Samples |\n")
|
|
223
|
+
f.write("|-----------|------------------|---------|\n")
|
|
224
|
+
for name in sorted(data.keys()):
|
|
225
|
+
rates = data[name]
|
|
226
|
+
avg = sum(rates) / len(rates)
|
|
227
|
+
f.write(f"| {name} | {avg:,.2f} | {len(rates)} |\n")
|
|
228
|
+
except Exception as e:
|
|
229
|
+
print(f"Error generating summary: {e}")
|
|
230
|
+
'
|
|
231
|
+
|
|
232
|
+
- name: Create gh-pages branch if missing
|
|
233
|
+
run: |
|
|
234
|
+
git fetch origin gh-pages || {
|
|
235
|
+
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
236
|
+
git config --global user.name "github-actions[bot]"
|
|
237
|
+
git checkout --orphan gh-pages
|
|
238
|
+
git rm -rf .
|
|
239
|
+
git commit --allow-empty -m "Initialize gh-pages branch"
|
|
240
|
+
git push origin gh-pages
|
|
241
|
+
git checkout ${{ github.sha }}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
- name: Store benchmark result
|
|
245
|
+
uses: benchmark-action/github-action-benchmark@v1
|
|
246
|
+
with:
|
|
247
|
+
name: Rust Benchmark
|
|
248
|
+
tool: 'cargo'
|
|
249
|
+
output-file-path: output.txt
|
|
250
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
251
|
+
auto-push: true
|
|
252
|
+
alert-threshold: '40000%'
|
|
253
|
+
comment-on-alert: true
|
|
254
|
+
fail-on-alert: false
|
|
@@ -2,7 +2,7 @@ name: Node
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
-
branches: [main]
|
|
5
|
+
branches: [main, dev]
|
|
6
6
|
paths:
|
|
7
7
|
- ".github/workflows/node.yml"
|
|
8
8
|
- "node/mq-bridge-node/**"
|
|
@@ -23,6 +23,28 @@ env:
|
|
|
23
23
|
CARGO_TERM_COLOR: always
|
|
24
24
|
|
|
25
25
|
jobs:
|
|
26
|
+
# Fast guard: catches package.json/package-lock.json drift (e.g. a version
|
|
27
|
+
# bump that only half-updates the lock) before it reaches the publish flow,
|
|
28
|
+
# where `npm ci` fails after all the native builds have already run.
|
|
29
|
+
lock-sync:
|
|
30
|
+
name: package-lock in sync
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
34
|
+
with:
|
|
35
|
+
persist-credentials: false
|
|
36
|
+
|
|
37
|
+
- name: Set up Node
|
|
38
|
+
uses: actions/setup-node@v4
|
|
39
|
+
with:
|
|
40
|
+
node-version: "20"
|
|
41
|
+
cache: npm
|
|
42
|
+
cache-dependency-path: node/mq-bridge-node/package-lock.json
|
|
43
|
+
|
|
44
|
+
- name: Verify lock is in sync
|
|
45
|
+
working-directory: node/mq-bridge-node
|
|
46
|
+
run: npm ci --ignore-scripts
|
|
47
|
+
|
|
26
48
|
test:
|
|
27
49
|
name: Node binding smoke test
|
|
28
50
|
runs-on: ubuntu-latest
|
|
@@ -59,6 +59,12 @@ jobs:
|
|
|
59
59
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
|
|
60
60
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
61
61
|
|
|
62
|
+
# Regenerate package.json/lock from the Cargo workspace version (source of
|
|
63
|
+
# truth) BEFORE npm ci, so a drifted committed lock can't fail the build.
|
|
64
|
+
- name: Sync version from Cargo workspace
|
|
65
|
+
working-directory: node/mq-bridge-node
|
|
66
|
+
run: npm run sync-version
|
|
67
|
+
|
|
62
68
|
- name: Install Node dependencies
|
|
63
69
|
working-directory: node/mq-bridge-node
|
|
64
70
|
run: npm ci
|
|
@@ -124,6 +130,12 @@ jobs:
|
|
|
124
130
|
with:
|
|
125
131
|
targets: ${{ matrix.target }}
|
|
126
132
|
|
|
133
|
+
# Regenerate package.json/lock from the Cargo workspace version (source of
|
|
134
|
+
# truth) BEFORE npm ci, so a drifted committed lock can't fail the build.
|
|
135
|
+
- name: Sync version from Cargo workspace
|
|
136
|
+
working-directory: node/mq-bridge-node
|
|
137
|
+
run: npm run sync-version
|
|
138
|
+
|
|
127
139
|
- name: Install Node dependencies
|
|
128
140
|
working-directory: node/mq-bridge-node
|
|
129
141
|
run: npm ci
|
|
@@ -170,14 +182,16 @@ jobs:
|
|
|
170
182
|
- name: Update npm
|
|
171
183
|
run: npm install -g npm@11.5.1
|
|
172
184
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
run: npm ci
|
|
176
|
-
|
|
185
|
+
# Regenerate package.json/lock from the Cargo workspace version (source of
|
|
186
|
+
# truth) BEFORE npm ci, so a drifted committed lock can't fail the publish.
|
|
177
187
|
- name: Sync version from Cargo workspace
|
|
178
188
|
working-directory: node/mq-bridge-node
|
|
179
189
|
run: npm run sync-version
|
|
180
190
|
|
|
191
|
+
- name: Install Node dependencies
|
|
192
|
+
working-directory: node/mq-bridge-node
|
|
193
|
+
run: npm ci
|
|
194
|
+
|
|
181
195
|
- name: Download loader into package root
|
|
182
196
|
uses: actions/download-artifact@v4
|
|
183
197
|
with:
|
|
@@ -94,6 +94,39 @@ jobs:
|
|
|
94
94
|
os: linux
|
|
95
95
|
target: aarch64
|
|
96
96
|
args: --release --out dist --find-interpreter
|
|
97
|
+
# Reduced-feature wheels published UNDER THE `mq-bridge-py` NAME so that
|
|
98
|
+
# a single `pip install mq-bridge-py` resolves to the `full` wheel on
|
|
99
|
+
# glibc-Linux/macOS/Windows-x64 and to this `basic`-featured wheel on
|
|
100
|
+
# targets where the full C toolchain doesn't build (musl/Alpine,
|
|
101
|
+
# Windows arm64), picked automatically by platform tag.
|
|
102
|
+
# pyproject-reduced.toml keeps the `mq-bridge-py` project name but
|
|
103
|
+
# compiles the `basic` feature set (no Kafka/sqlx/grpc/IBM-MQ-static).
|
|
104
|
+
# Same aws-lc-sys-native setup as the mq-bridge-py-basic rows.
|
|
105
|
+
- package: mq-bridge-py
|
|
106
|
+
pyproject: pyproject-reduced.toml
|
|
107
|
+
runner: ubuntu-latest
|
|
108
|
+
os: linux
|
|
109
|
+
target: x86_64
|
|
110
|
+
manylinux: musllinux_1_2
|
|
111
|
+
args: --release --out dist --find-interpreter --no-default-features
|
|
112
|
+
- package: mq-bridge-py
|
|
113
|
+
pyproject: pyproject-reduced.toml
|
|
114
|
+
runner: ubuntu-24.04-arm
|
|
115
|
+
os: linux
|
|
116
|
+
target: aarch64
|
|
117
|
+
manylinux: musllinux_1_2
|
|
118
|
+
args: --release --out dist --find-interpreter --no-default-features
|
|
119
|
+
# Windows arm64 gets the reduced set too: `basic` still pulls aws-lc-sys
|
|
120
|
+
# (via amqp+aws), which compiles natively under MSVC on the native
|
|
121
|
+
# windows-11-arm runner. If aws-lc-sys ever fails to build here, drop
|
|
122
|
+
# amqp+aws from a Windows-arm-only feature set rather than reintroducing
|
|
123
|
+
# a cross-compile.
|
|
124
|
+
- package: mq-bridge-py
|
|
125
|
+
pyproject: pyproject-reduced.toml
|
|
126
|
+
runner: windows-11-arm
|
|
127
|
+
os: windows
|
|
128
|
+
target: aarch64
|
|
129
|
+
args: --release --out dist --find-interpreter --no-default-features
|
|
97
130
|
- package: mq-bridge-py
|
|
98
131
|
pyproject: pyproject.toml
|
|
99
132
|
runner: macos-15-intel
|
|
@@ -24,7 +24,7 @@ kafka_to_nats:
|
|
|
24
24
|
output:
|
|
25
25
|
nats:
|
|
26
26
|
url: "nats://localhost:4222"
|
|
27
|
-
subject: "
|
|
27
|
+
subject: "orders_stream.processed"
|
|
28
28
|
stream: "orders_stream"
|
|
29
29
|
|
|
30
30
|
# Route 2: HTTP Webhook to MongoDB with Middleware
|
|
@@ -140,6 +140,22 @@ For example, to set the Kafka topic for the `kafka_to_nats` route:
|
|
|
140
140
|
export MQB__KAFKA_TO_NATS__INPUT__KAFKA__TOPIC="my-other-topic"
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
+
### NATS JetStream Notes
|
|
144
|
+
|
|
145
|
+
Two gotchas worth knowing before wiring up a `nats` endpoint:
|
|
146
|
+
|
|
147
|
+
- **Subject must be prefixed with the stream name.** When mq-bridge auto-creates
|
|
148
|
+
a JetStream stream (no existing stream already covers the subject), it scopes
|
|
149
|
+
the stream to `{stream}.>`. So `stream: "orders_stream"` requires a subject
|
|
150
|
+
like `orders_stream.foo` — a subject such as `orders.foo` will fail to publish
|
|
151
|
+
with "no stream found for given subject". This only applies to
|
|
152
|
+
auto-creation; publishing to a stream that already exists with a wider
|
|
153
|
+
subject filter works regardless of naming.
|
|
154
|
+
- **`stream` is required even in Core NATS mode.** Consumer validation requires
|
|
155
|
+
a `stream` value even when `no_jetstream: true`. It's unused for the actual
|
|
156
|
+
Core NATS subscribe, but validation still rejects a missing value — pass any
|
|
157
|
+
placeholder string.
|
|
158
|
+
|
|
143
159
|
### Middleware Configuration
|
|
144
160
|
Middleware is defined as a list under an endpoint.
|
|
145
161
|
|
|
@@ -195,8 +211,10 @@ tls:
|
|
|
195
211
|
producer_options: [["ssl.cipher.suites", "ECDHE-RSA-AES256-GCM-SHA384"]]
|
|
196
212
|
consumer_options: [["ssl.cipher.suites", "ECDHE-RSA-AES256-GCM-SHA384"]]
|
|
197
213
|
```
|
|
198
|
-
5. **IBM MQ** (native stack): set a strong `cipher_spec` (a TLS 1.2/1.3 CipherSpec) — it
|
|
199
|
-
required for encrypted connections.
|
|
214
|
+
5. **IBM MQ** (native stack): set a strong `tls.cipher_spec` (a TLS 1.2/1.3 CipherSpec) — it
|
|
215
|
+
is required for encrypted connections. Note `cipher_spec` lives under `tls`, not at the
|
|
216
|
+
top level of the `ibmmq` config (a breaking rename from earlier releases, where it was
|
|
217
|
+
`ibmmq.cipher_spec`).
|
|
200
218
|
6. **Keep sensitive payloads out of logs.** Message payloads are emitted at `trace` level;
|
|
201
219
|
run production above `trace` and confirm no cardholder data (PAN) reaches logs or traces.
|
|
202
220
|
7. **Do not commit secrets.** Source passwords and tokens from a secrets manager or env vars
|
|
@@ -142,6 +142,12 @@ dependencies = [
|
|
|
142
142
|
"rustversion",
|
|
143
143
|
]
|
|
144
144
|
|
|
145
|
+
[[package]]
|
|
146
|
+
name = "arcstr"
|
|
147
|
+
version = "1.2.0"
|
|
148
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
149
|
+
checksum = "03918c3dbd7701a85c6b9887732e2921175f26c350b4563841d0958c21d57e6d"
|
|
150
|
+
|
|
145
151
|
[[package]]
|
|
146
152
|
name = "arraydeque"
|
|
147
153
|
version = "0.5.1"
|
|
@@ -1084,7 +1090,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
|
1084
1090
|
checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
|
|
1085
1091
|
dependencies = [
|
|
1086
1092
|
"bytes",
|
|
1093
|
+
"futures-core",
|
|
1087
1094
|
"memchr",
|
|
1095
|
+
"pin-project-lite",
|
|
1096
|
+
"tokio",
|
|
1097
|
+
"tokio-util",
|
|
1088
1098
|
]
|
|
1089
1099
|
|
|
1090
1100
|
[[package]]
|
|
@@ -3109,7 +3119,7 @@ dependencies = [
|
|
|
3109
3119
|
|
|
3110
3120
|
[[package]]
|
|
3111
3121
|
name = "mq-bridge"
|
|
3112
|
-
version = "0.3.
|
|
3122
|
+
version = "0.3.3"
|
|
3113
3123
|
dependencies = [
|
|
3114
3124
|
"anyhow",
|
|
3115
3125
|
"arc-swap",
|
|
@@ -3146,6 +3156,7 @@ dependencies = [
|
|
|
3146
3156
|
"rand 0.10.1",
|
|
3147
3157
|
"rcgen",
|
|
3148
3158
|
"rdkafka",
|
|
3159
|
+
"redis",
|
|
3149
3160
|
"reqwest",
|
|
3150
3161
|
"rmp-serde",
|
|
3151
3162
|
"rumqttc",
|
|
@@ -3177,7 +3188,7 @@ dependencies = [
|
|
|
3177
3188
|
|
|
3178
3189
|
[[package]]
|
|
3179
3190
|
name = "mq-bridge-bindings-common"
|
|
3180
|
-
version = "0.3.
|
|
3191
|
+
version = "0.3.3"
|
|
3181
3192
|
dependencies = [
|
|
3182
3193
|
"anyhow",
|
|
3183
3194
|
"fast-uuid-v7",
|
|
@@ -3185,11 +3196,13 @@ dependencies = [
|
|
|
3185
3196
|
"serde",
|
|
3186
3197
|
"serde_yaml_ng",
|
|
3187
3198
|
"tokio",
|
|
3199
|
+
"tracing",
|
|
3200
|
+
"tracing-subscriber",
|
|
3188
3201
|
]
|
|
3189
3202
|
|
|
3190
3203
|
[[package]]
|
|
3191
3204
|
name = "mq-bridge-node"
|
|
3192
|
-
version = "0.3.
|
|
3205
|
+
version = "0.3.3"
|
|
3193
3206
|
dependencies = [
|
|
3194
3207
|
"anyhow",
|
|
3195
3208
|
"async-trait",
|
|
@@ -3205,11 +3218,12 @@ dependencies = [
|
|
|
3205
3218
|
"serde_yaml_ng",
|
|
3206
3219
|
"tokio",
|
|
3207
3220
|
"tracing",
|
|
3221
|
+
"tracing-subscriber",
|
|
3208
3222
|
]
|
|
3209
3223
|
|
|
3210
3224
|
[[package]]
|
|
3211
3225
|
name = "mq-bridge-py"
|
|
3212
|
-
version = "0.3.
|
|
3226
|
+
version = "0.3.3"
|
|
3213
3227
|
dependencies = [
|
|
3214
3228
|
"anyhow",
|
|
3215
3229
|
"async-trait",
|
|
@@ -3225,6 +3239,7 @@ dependencies = [
|
|
|
3225
3239
|
"serde_yaml_ng",
|
|
3226
3240
|
"tokio",
|
|
3227
3241
|
"tracing",
|
|
3242
|
+
"tracing-subscriber",
|
|
3228
3243
|
]
|
|
3229
3244
|
|
|
3230
3245
|
[[package]]
|
|
@@ -4351,6 +4366,36 @@ dependencies = [
|
|
|
4351
4366
|
"pkg-config",
|
|
4352
4367
|
]
|
|
4353
4368
|
|
|
4369
|
+
[[package]]
|
|
4370
|
+
name = "redis"
|
|
4371
|
+
version = "1.3.0"
|
|
4372
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
4373
|
+
checksum = "2fa6f8e4b491d7a8ef3a9550a4d71969bd0064f46e32b8dbbcc7fc60dad94fed"
|
|
4374
|
+
dependencies = [
|
|
4375
|
+
"arc-swap",
|
|
4376
|
+
"arcstr",
|
|
4377
|
+
"async-lock",
|
|
4378
|
+
"backon",
|
|
4379
|
+
"bytes",
|
|
4380
|
+
"cfg-if",
|
|
4381
|
+
"combine",
|
|
4382
|
+
"futures-channel",
|
|
4383
|
+
"futures-util",
|
|
4384
|
+
"itoa",
|
|
4385
|
+
"percent-encoding",
|
|
4386
|
+
"pin-project-lite",
|
|
4387
|
+
"rustls 0.23.40",
|
|
4388
|
+
"rustls-native-certs",
|
|
4389
|
+
"ryu",
|
|
4390
|
+
"socket2 0.6.4",
|
|
4391
|
+
"tokio",
|
|
4392
|
+
"tokio-rustls 0.26.4",
|
|
4393
|
+
"tokio-util",
|
|
4394
|
+
"url",
|
|
4395
|
+
"webpki-roots 1.0.7",
|
|
4396
|
+
"xxhash-rust",
|
|
4397
|
+
]
|
|
4398
|
+
|
|
4354
4399
|
[[package]]
|
|
4355
4400
|
name = "redox_syscall"
|
|
4356
4401
|
version = "0.2.16"
|
|
@@ -6805,6 +6850,12 @@ version = "0.13.6"
|
|
|
6805
6850
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
6806
6851
|
checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
|
|
6807
6852
|
|
|
6853
|
+
[[package]]
|
|
6854
|
+
name = "xxhash-rust"
|
|
6855
|
+
version = "0.8.16"
|
|
6856
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
6857
|
+
checksum = "4d93c89cdc2d3a63c3ec48ffe926931bdc069eafa8e4402fe6d8f790c9d1e576"
|
|
6858
|
+
|
|
6808
6859
|
[[package]]
|
|
6809
6860
|
name = "yaml-rust2"
|
|
6810
6861
|
version = "0.11.0"
|
|
@@ -16,7 +16,7 @@ members = ["bindings-common", "python/mq-bridge-py"]
|
|
|
16
16
|
resolver = "2"
|
|
17
17
|
|
|
18
18
|
[workspace.package]
|
|
19
|
-
version = "0.3.
|
|
19
|
+
version = "0.3.3"
|
|
20
20
|
|
|
21
21
|
[workspace.dependencies]
|
|
22
22
|
anyhow = "1.0"
|
|
@@ -137,6 +137,11 @@ sqlx = { version = "0.9", features = ["runtime-tokio", "tls-rustls", "postgres",
|
|
|
137
137
|
# ZeroMQ
|
|
138
138
|
zeromq = { version = "0.6", optional = true }
|
|
139
139
|
|
|
140
|
+
# Redis Streams. Pure-Rust client (no C bindings). TLS via rustls (ring), so
|
|
141
|
+
# `rediss://` URLs work; webpki-roots ships the CA bundle so there's no system
|
|
142
|
+
# cert dependency. redis-rs wires its own ring-backed rustls config.
|
|
143
|
+
redis = { version = "1.3", default-features = false, features = ["tokio-comp", "tokio-rustls-comp", "tls-rustls-webpki-roots", "streams", "connection-manager"], optional = true }
|
|
144
|
+
|
|
140
145
|
# gRPC
|
|
141
146
|
tonic = { version = "0.14", optional = true, default-features = false, features = ["codegen", "transport", "tls-webpki-roots"] }
|
|
142
147
|
tonic-prost = { version = "0.14", optional = true }
|
|
@@ -163,12 +168,14 @@ middleware = ["metrics", "dedup"]
|
|
|
163
168
|
# runtime the client is loaded lazily only when an ibm-mq endpoint is opened
|
|
164
169
|
# (clear error if the client isn't installed). Use `ibm-mq-static` instead for
|
|
165
170
|
# static linking.
|
|
166
|
-
full = ["middleware", "mongodb", "kafka", "amqp", "nats", "mqtt", "http", "aws", "zeromq", "sled", "grpc", "sqlx", "websocket", "rustls-aws-lc", "ibm-mq"]
|
|
171
|
+
full = ["middleware", "mongodb", "kafka", "amqp", "nats", "mqtt", "http", "aws", "zeromq", "redis-streams", "sled", "grpc", "sqlx", "websocket", "rustls-aws-lc", "ibm-mq"]
|
|
167
172
|
|
|
168
173
|
# Functionality features
|
|
169
174
|
dedup = ["sled"]
|
|
170
175
|
metrics = ["dep:metrics"]
|
|
171
176
|
test-utils = ["dep:tracing-appender", "dep:tracing-subscriber", "dep:serde_yaml_ng"]
|
|
177
|
+
# Opt-in produce/consume-only isolation benchmarks (throwaway diagnostics, off by default)
|
|
178
|
+
perf-diagnostics = ["test-utils"]
|
|
172
179
|
|
|
173
180
|
# TLS crypto provider selection — pick exactly one when using any TLS endpoint
|
|
174
181
|
# (http, grpc, mqtt, nats, amqp, …). If neither is enabled the application binary
|
|
@@ -197,12 +204,15 @@ aws = ["aws-config", "aws-sdk-sqs", "aws-sdk-sns", "dep:base64"]
|
|
|
197
204
|
# endpoint is actually used.
|
|
198
205
|
# mqi/mqai is required because mqi's always-compiled (doc-hidden) test module
|
|
199
206
|
# references MqaiLibrary on the dlopen2 path; it adds only pregen bindings, no SDK.
|
|
200
|
-
|
|
201
|
-
#
|
|
202
|
-
|
|
203
|
-
#
|
|
204
|
-
ibm-mq
|
|
207
|
+
# Capability level is pinned at mqc_9_3_0_0 (9.2 is EOL); this also unlocks
|
|
208
|
+
# `tls.cert_password` support for password-protected CMS key repositories.
|
|
209
|
+
ibm-mq = ["dep:mqi", "mqi/dlopen2", "mqi/mqai", "mqi/mqc_9_3_0_0", "dep:libmqm-sys", "libmqm-sys/dlopen2"]
|
|
210
|
+
# Static-link IBM MQ client (needs the IBM SDK at build time). Enabling this
|
|
211
|
+
# alongside `ibm-mq` (dlopen) forces static linking — the SDK is then required
|
|
212
|
+
# at build.
|
|
213
|
+
ibm-mq-static = ["dep:mqi", "mqi/link", "mqi/mqc_9_3_0_0"]
|
|
205
214
|
zeromq = ["dep:zeromq"]
|
|
215
|
+
redis-streams = ["dep:redis"]
|
|
206
216
|
# Note: The grpc feature requires protobuf-src which can significantly increase build times.
|
|
207
217
|
grpc = ["tonic", "prost", "tokio-stream", "tonic-prost", "tonic-prost-build", "protoc-bin-vendored", "rustls"]
|
|
208
218
|
sqlx = ["dep:sqlx", "url"]
|