mq-bridge-py-basic 0.3.2__tar.gz → 0.3.4__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.4/.github/workflows/benchmark.yml +276 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/node.yml +23 -1
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/publish-node.yml +18 -4
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/publish-python.yml +33 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/CONFIGURATION.md +37 -3
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/Cargo.lock +135 -4
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/Cargo.toml +37 -8
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/PKG-INFO +68 -8
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/README.md +51 -20
- mq_bridge_py_basic-0.3.4/benches/ETL_BENCHMARKS.md +107 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/benches/performance_bench.rs +55 -19
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/bindings-common/Cargo.toml +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/bindings-common/src/lib.rs +2 -0
- mq_bridge_py_basic-0.3.4/bindings-common/src/logging.rs +234 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq-bridge.schema.json +545 -14
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/__init__.py +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/__init__.pyi +17 -1
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/config.py +10 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/config.pyi +81 -3
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/Cargo.toml +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/README.md +67 -7
- mq_bridge_py_basic-0.3.4/python/mq-bridge-py/pyproject-reduced.toml +65 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/src/lib.rs +125 -5
- mq_bridge_py_basic-0.3.4/python/mq-bridge-py/tests/test_logging.py +113 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_public_api.py +2 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/debug_ibm_mq_tls.rs +5 -4
- mq_bridge_py_basic-0.3.4/scripts/ci/format_bench_output.sh +11 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/canonical_message.rs +4 -0
- mq_bridge_py_basic-0.3.4/src/checkpoint.rs +520 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/command_handler.rs +80 -90
- mq_bridge_py_basic-0.3.4/src/endpoints/clickhouse.rs +706 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/file.rs +353 -17
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/ibm_mq.rs +10 -18
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/kafka.rs +80 -44
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/mod.rs +256 -9
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/mongodb.rs +972 -3
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/mqtt.rs +61 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/nats.rs +15 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/poll.rs +64 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/postgres/mod.rs +422 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/decoder.rs +772 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/messages.rs +246 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/mod.rs +106 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/registry.rs +123 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/values.rs +516 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/postgres/replication.rs +258 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/postgres/state.rs +67 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/redis_streams.rs +644 -0
- mq_bridge_py_basic-0.3.4/src/endpoints/sqlx.rs +2576 -0
- mq_bridge_py_basic-0.3.4/src/lib.rs +77 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/models.rs +446 -9
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/publisher.rs +11 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/route.rs +288 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/test_utils.rs +162 -0
- mq_bridge_py_basic-0.3.4/tests/integration/clickhouse.rs +178 -0
- mq_bridge_py_basic-0.3.4/tests/integration/docker-compose/clickhouse.yml +21 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/kafka.yml +1 -0
- mq_bridge_py_basic-0.3.4/tests/integration/docker-compose/postgres_cdc.yml +29 -0
- mq_bridge_py_basic-0.3.4/tests/integration/docker-compose/redis.yml +11 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/http.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/kafka.rs +96 -4
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mariadb.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mod.rs +6 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mongodb.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mysql.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/nats.rs +2 -2
- mq_bridge_py_basic-0.3.4/tests/integration/postgres.rs +376 -0
- mq_bridge_py_basic-0.3.4/tests/integration/postgres_cdc.rs +209 -0
- mq_bridge_py_basic-0.3.4/tests/integration/redis_streams.rs +147 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/sqlite.rs +2 -2
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/tls_helpers.rs +3 -3
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration_test.rs +89 -0
- mq_bridge_py_basic-0.3.2/.github/workflows/benchmark.yml +0 -102
- mq_bridge_py_basic-0.3.2/src/endpoints/sqlx.rs +0 -993
- mq_bridge_py_basic-0.3.2/src/lib.rs +0 -40
- mq_bridge_py_basic-0.3.2/tests/integration/postgres.rs +0 -202
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/ci.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/ibm-mq.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/python.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/release.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/test-matrix.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.gitignore +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/ARCHITECTURE.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/CONTRIBUTING.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/LICENSE +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/benches/router_bench.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/build.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/claude.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/examples/ipc_worker_queue.yaml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/py.typed +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/package-lock.json +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/example.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/bench_memory.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/consume_pull.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/dlt_source.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/json_route.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/memory.yaml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/raw_route.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/pyproject-basic.toml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_config_types.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_packaging.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_routes.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/uv.lock +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/benches/metadata_bench.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/http/http_flamegraph.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/http/run_http_ladder.sh +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/httparena/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/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.4}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/postgres.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/seed.sql +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/verify.sh +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/the-benchmarker/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/connection_registry.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/amqp.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/aws.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/fanout.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/grpc.proto +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/grpc.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/http.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/http_stream.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/endpoint.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/ipc_unix.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/ipc_windows.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/memory_transport.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/mod.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/transport.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/null.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/reader.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/response.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/sled.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/static_endpoint.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/stream_buffer.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/switch.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/websocket.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/errors.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/event_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/event_store.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/extensions.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/buffer.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/cookie_jar.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/deduplication.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/delay.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/dlq.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/limiter.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/metrics.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/mod.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/random_panic.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/retry.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/weak_join.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/outcomes.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/response.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/traits.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/type_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/README.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/armature_integration.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/amqp.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/aws.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/config.toml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/amqp.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/aws.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm_mq.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/kafka-tls.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mariadb.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mongodb.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mosquitto.conf +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mq_init.mqsc +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mqtt.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mysql.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/nats.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/postgres.yml +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/file.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/grpc.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/grpc_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/http_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/ibm_mq.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/ibm_mq_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/ipc.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/kafka_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/logic_test.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/memory.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mongodb_raw.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mongodb_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/performance_static.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/route.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/scripts/gen_certs.sh +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/websocket.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/memory_leak_test.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/ref_test.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/sqlite_test.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/tls_example.rs +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/unit_tests.md +0 -0
- {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/websocket_test.rs +0 -0
|
@@ -0,0 +1,276 @@
|
|
|
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
|
+
# Serialize gh-pages pushes so overlapping runs don't race the Pages build
|
|
183
|
+
# (concurrent pushes make GitHub cancel the superseded deployment -> "failed").
|
|
184
|
+
concurrency:
|
|
185
|
+
group: gh-pages-publish
|
|
186
|
+
cancel-in-progress: false
|
|
187
|
+
permissions:
|
|
188
|
+
contents: write
|
|
189
|
+
deployments: write
|
|
190
|
+
steps:
|
|
191
|
+
- uses: actions/checkout@v4
|
|
192
|
+
|
|
193
|
+
- name: Download shard outputs
|
|
194
|
+
uses: actions/download-artifact@v4
|
|
195
|
+
with:
|
|
196
|
+
pattern: bench-output-*
|
|
197
|
+
merge-multiple: true
|
|
198
|
+
path: bench-outputs
|
|
199
|
+
|
|
200
|
+
- name: Merge shard outputs
|
|
201
|
+
run: |
|
|
202
|
+
cat bench-outputs/raw_output_*.txt > raw_output.txt
|
|
203
|
+
cat bench-outputs/output_*.txt > output.txt
|
|
204
|
+
|
|
205
|
+
- name: Generate Throughput Summary
|
|
206
|
+
run: |
|
|
207
|
+
python3 -c '
|
|
208
|
+
import re
|
|
209
|
+
import os
|
|
210
|
+
|
|
211
|
+
data = {}
|
|
212
|
+
try:
|
|
213
|
+
with open("raw_output.txt", "r") as f:
|
|
214
|
+
for line in f:
|
|
215
|
+
# Match lines like: "aws single_write: 1 iters, total time 1.48s, 673.75 msgs/sec"
|
|
216
|
+
m = re.search(r"^\s*(.*): .* ([\d\.]+) msgs/sec", line)
|
|
217
|
+
if m:
|
|
218
|
+
name = m.group(1).strip()
|
|
219
|
+
rate = float(m.group(2))
|
|
220
|
+
if name not in data:
|
|
221
|
+
data[name] = []
|
|
222
|
+
data[name].append(rate)
|
|
223
|
+
|
|
224
|
+
if data:
|
|
225
|
+
with open(os.environ["GITHUB_STEP_SUMMARY"], "a") as f:
|
|
226
|
+
f.write("### Benchmark Throughput Results\n")
|
|
227
|
+
f.write("| Test Case | Average msgs/sec | Samples |\n")
|
|
228
|
+
f.write("|-----------|------------------|---------|\n")
|
|
229
|
+
for name in sorted(data.keys()):
|
|
230
|
+
rates = data[name]
|
|
231
|
+
avg = sum(rates) / len(rates)
|
|
232
|
+
f.write(f"| {name} | {avg:,.2f} | {len(rates)} |\n")
|
|
233
|
+
except Exception as e:
|
|
234
|
+
print(f"Error generating summary: {e}")
|
|
235
|
+
'
|
|
236
|
+
|
|
237
|
+
- name: Create gh-pages branch if missing
|
|
238
|
+
run: |
|
|
239
|
+
git fetch origin gh-pages || {
|
|
240
|
+
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
241
|
+
git config --global user.name "github-actions[bot]"
|
|
242
|
+
git checkout --orphan gh-pages
|
|
243
|
+
git rm -rf .
|
|
244
|
+
git commit --allow-empty -m "Initialize gh-pages branch"
|
|
245
|
+
git push origin gh-pages
|
|
246
|
+
git checkout ${{ github.sha }}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
- name: Store benchmark result
|
|
250
|
+
uses: benchmark-action/github-action-benchmark@v1
|
|
251
|
+
with:
|
|
252
|
+
name: Rust Benchmark
|
|
253
|
+
tool: 'cargo'
|
|
254
|
+
output-file-path: output.txt
|
|
255
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
256
|
+
# Push on both main and dev so dev commits appear in the benchmark graph.
|
|
257
|
+
# This mints a gh-pages deployment per run; the next step prunes old ones.
|
|
258
|
+
auto-push: true
|
|
259
|
+
alert-threshold: '40000%'
|
|
260
|
+
comment-on-alert: true
|
|
261
|
+
fail-on-alert: false
|
|
262
|
+
|
|
263
|
+
# Keep only the most recent gh-pages deployments so the environment's
|
|
264
|
+
# deployment list doesn't grow unbounded (one is minted per push above).
|
|
265
|
+
- name: Prune old gh-pages deployments
|
|
266
|
+
env:
|
|
267
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
268
|
+
KEEP: 20
|
|
269
|
+
run: |
|
|
270
|
+
gh api "repos/${{ github.repository }}/deployments?environment=github-pages&per_page=100" --paginate -q '.[].id' \
|
|
271
|
+
| tail -n +$((KEEP + 1)) \
|
|
272
|
+
| while read -r id; do
|
|
273
|
+
gh api -X POST "repos/${{ github.repository }}/deployments/$id/statuses" -f state=inactive >/dev/null 2>&1 \
|
|
274
|
+
|| echo "::warning::failed to mark deployment $id inactive; attempting delete anyway"
|
|
275
|
+
gh api -X DELETE "repos/${{ github.repository }}/deployments/$id" >/dev/null 2>&1 && echo "pruned $id"
|
|
276
|
+
done
|
|
@@ -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
|
|
@@ -139,6 +139,38 @@ For example, to set the Kafka topic for the `kafka_to_nats` route:
|
|
|
139
139
|
```sh
|
|
140
140
|
export MQB__KAFKA_TO_NATS__INPUT__KAFKA__TOPIC="my-other-topic"
|
|
141
141
|
```
|
|
142
|
+
#### Postgres CDC example
|
|
143
|
+
|
|
144
|
+
```yaml
|
|
145
|
+
orders_cdc:
|
|
146
|
+
input:
|
|
147
|
+
postgres_cdc:
|
|
148
|
+
url: "postgres://user:pass@localhost:5432/app"
|
|
149
|
+
publication: "orders_pub" # CREATE PUBLICATION orders_pub FOR TABLE orders;
|
|
150
|
+
slot_name: "mqb_orders" # created if missing (permanent slot, resumable)
|
|
151
|
+
output:
|
|
152
|
+
nats:
|
|
153
|
+
subject: "orders.changes"
|
|
154
|
+
url: "nats://localhost:4222"
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Each change arrives as a `CanonicalMessage` whose payload is the flat row and whose `postgres.operation` metadata marks the operation — the same convention as MongoDB CDC, so typed handlers work identically across both. The replication transport uses the published [`pgwire-replication`](https://crates.io/crates/pgwire-replication) crate.
|
|
158
|
+
|
|
159
|
+
### NATS JetStream Notes
|
|
160
|
+
|
|
161
|
+
Two gotchas worth knowing before wiring up a `nats` endpoint:
|
|
162
|
+
|
|
163
|
+
- **Subject must be prefixed with the stream name.** When mq-bridge auto-creates
|
|
164
|
+
a JetStream stream (no existing stream already covers the subject), it scopes
|
|
165
|
+
the stream to `{stream}.>`. So `stream: "orders_stream"` requires a subject
|
|
166
|
+
like `orders_stream.foo` — a subject such as `orders.foo` will fail to publish
|
|
167
|
+
with "no stream found for given subject". This only applies to
|
|
168
|
+
auto-creation; publishing to a stream that already exists with a wider
|
|
169
|
+
subject filter works regardless of naming.
|
|
170
|
+
- **`stream` is required even in Core NATS mode.** Consumer validation requires
|
|
171
|
+
a `stream` value even when `no_jetstream: true`. It's unused for the actual
|
|
172
|
+
Core NATS subscribe, but validation still rejects a missing value — pass any
|
|
173
|
+
placeholder string.
|
|
142
174
|
|
|
143
175
|
### Middleware Configuration
|
|
144
176
|
Middleware is defined as a list under an endpoint.
|
|
@@ -195,8 +227,10 @@ tls:
|
|
|
195
227
|
producer_options: [["ssl.cipher.suites", "ECDHE-RSA-AES256-GCM-SHA384"]]
|
|
196
228
|
consumer_options: [["ssl.cipher.suites", "ECDHE-RSA-AES256-GCM-SHA384"]]
|
|
197
229
|
```
|
|
198
|
-
5. **IBM MQ** (native stack): set a strong `cipher_spec` (a TLS 1.2/1.3 CipherSpec) — it
|
|
199
|
-
required for encrypted connections.
|
|
230
|
+
5. **IBM MQ** (native stack): set a strong `tls.cipher_spec` (a TLS 1.2/1.3 CipherSpec) — it
|
|
231
|
+
is required for encrypted connections. Note `cipher_spec` lives under `tls`, not at the
|
|
232
|
+
top level of the `ibmmq` config (a breaking rename from earlier releases, where it was
|
|
233
|
+
`ibmmq.cipher_spec`).
|
|
200
234
|
6. **Keep sensitive payloads out of logs.** Message payloads are emitted at `trace` level;
|
|
201
235
|
run production above `trace` and confirm no cardholder data (PAN) reaches logs or traces.
|
|
202
236
|
7. **Do not commit secrets.** Source passwords and tokens from a secrets manager or env vars
|