mq-bridge-py-basic 0.3.3__tar.gz → 0.3.5__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 → mq_bridge_py_basic-0.3.5}/.github/workflows/benchmark.yml +22 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/CONFIGURATION.md +18 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/Cargo.lock +171 -8
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/Cargo.toml +29 -4
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/PKG-INFO +19 -4
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/README.md +75 -20
- mq_bridge_py_basic-0.3.5/benches/ETL_BENCHMARKS.md +107 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/benches/performance_bench.rs +122 -64
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/mq-bridge.schema.json +516 -5
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/mq_bridge/__init__.pyi +6 -1
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/mq_bridge/config.py +12 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/mq_bridge/config.pyi +73 -1
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/README.md +18 -3
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/src/lib.rs +60 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/analysis/http/mq_bridge_http_profile.rs +188 -1
- mq_bridge_py_basic-0.3.5/src/checkpoint.rs +711 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/command_handler.rs +80 -90
- mq_bridge_py_basic-0.3.5/src/endpoints/clickhouse.rs +706 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/file.rs +434 -75
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/http.rs +104 -22
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/kafka.rs +80 -44
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/mod.rs +213 -9
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/mongodb.rs +972 -3
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/mqtt.rs +61 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/nats.rs +15 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/object_store.rs +707 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/poll.rs +64 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/VENDORED.md +81 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/mod.rs +432 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/pgoutput/decoder.rs +772 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/pgoutput/messages.rs +246 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/pgoutput/mod.rs +107 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/pgoutput/registry.rs +123 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/pgoutput/values.rs +516 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/replication.rs +403 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/postgres/state.rs +68 -0
- mq_bridge_py_basic-0.3.5/src/endpoints/sqlx.rs +2576 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/zeromq.rs +322 -15
- mq_bridge_py_basic-0.3.5/src/lib.rs +82 -0
- mq_bridge_py_basic-0.3.5/src/middleware/weak_join.rs +467 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/models.rs +403 -6
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/publisher.rs +11 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/route.rs +530 -59
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/test_utils.rs +93 -20
- mq_bridge_py_basic-0.3.5/tests/integration/clickhouse.rs +178 -0
- mq_bridge_py_basic-0.3.5/tests/integration/docker-compose/clickhouse.yml +21 -0
- mq_bridge_py_basic-0.3.5/tests/integration/docker-compose/object_store.yml +15 -0
- mq_bridge_py_basic-0.3.5/tests/integration/docker-compose/postgres_cdc.yml +29 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/mod.rs +6 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/mongodb.rs +229 -2
- mq_bridge_py_basic-0.3.5/tests/integration/object_store.rs +165 -0
- mq_bridge_py_basic-0.3.5/tests/integration/postgres.rs +376 -0
- mq_bridge_py_basic-0.3.5/tests/integration/postgres_cdc.rs +430 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration_test.rs +124 -0
- mq_bridge_py_basic-0.3.3/src/endpoints/sqlx.rs +0 -993
- mq_bridge_py_basic-0.3.3/src/lib.rs +0 -40
- mq_bridge_py_basic-0.3.3/src/middleware/weak_join.rs +0 -269
- mq_bridge_py_basic-0.3.3/tests/integration/postgres.rs +0 -202
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/workflows/ci.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/workflows/ibm-mq.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/workflows/node.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/workflows/publish-node.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/workflows/publish-python.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/workflows/python.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/workflows/release.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.github/workflows/test-matrix.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/.gitignore +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/ARCHITECTURE.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/CONTRIBUTING.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/LICENSE +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/benches/router_bench.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/bindings-common/Cargo.toml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/bindings-common/src/lib.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/bindings-common/src/logging.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/build.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/claude.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/examples/ipc_worker_queue.yaml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/mq_bridge/__init__.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/mq_bridge/py.typed +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/package-lock.json +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/Cargo.toml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/example.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/examples/bench_memory.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/examples/consume_pull.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/examples/dlt_source.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/examples/json_route.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/examples/memory.yaml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/examples/raw_route.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/pyproject-basic.toml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/pyproject-reduced.toml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/tests/test_config_types.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/tests/test_logging.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/tests/test_packaging.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/tests/test_public_api.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/tests/test_routes.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/python/mq-bridge-py/uv.lock +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/analysis/benches/metadata_bench.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/analysis/http/http_flamegraph.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/analysis/http/run_http_ladder.sh +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/ci/format_bench_output.sh +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/httparena/README.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/techempower/README.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/techempower/postgres.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/techempower/seed.sql +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/techempower/verify.sh +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/the-benchmarker/README.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/canonical_message.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/connection_registry.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/amqp.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/aws.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/fanout.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/grpc.proto +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/grpc.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/http_stream.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/ibm_mq.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/memory/endpoint.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/memory/ipc_unix.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/memory/ipc_windows.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/memory/memory_transport.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/memory/mod.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/memory/transport.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/null.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/reader.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/redis_streams.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/response.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/sled.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/static_endpoint.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/stream_buffer.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/switch.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/endpoints/websocket.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/errors.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/event_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/event_store.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/extensions.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/buffer.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/cookie_jar.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/deduplication.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/delay.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/dlq.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/limiter.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/metrics.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/mod.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/random_panic.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/middleware/retry.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/outcomes.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/response.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/traits.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/src/type_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/README.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/armature_integration.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/amqp.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/aws.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/config.toml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/amqp.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/aws.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/ibm_mq.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/kafka-tls.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/kafka.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mariadb.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mongodb.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mosquitto.conf +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mq_init.mqsc +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mqtt.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/mysql.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/nats.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/postgres.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/docker-compose/redis.yml +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/file.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/grpc.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/grpc_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/http.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/http_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/ibm_mq.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/ibm_mq_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/ipc.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/kafka.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/kafka_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/logic_test.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/mariadb.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/memory.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/mongodb_raw.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/mongodb_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/mysql.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/nats.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/performance_static.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/redis_streams.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/route.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/scripts/gen_certs.sh +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/sqlite.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/tls_helpers.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/websocket.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/integration/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/memory_leak_test.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/ref_test.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/sqlite_test.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/tls_example.rs +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/unit_tests.md +0 -0
- {mq_bridge_py_basic-0.3.3 → mq_bridge_py_basic-0.3.5}/tests/websocket_test.rs +0 -0
|
@@ -179,6 +179,11 @@ jobs:
|
|
|
179
179
|
name: Collect Benchmark Results
|
|
180
180
|
needs: [benchmark-streams, benchmark-database, benchmark-dockerless]
|
|
181
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
|
|
182
187
|
permissions:
|
|
183
188
|
contents: write
|
|
184
189
|
deployments: write
|
|
@@ -248,7 +253,24 @@ jobs:
|
|
|
248
253
|
tool: 'cargo'
|
|
249
254
|
output-file-path: output.txt
|
|
250
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.
|
|
251
258
|
auto-push: true
|
|
252
259
|
alert-threshold: '40000%'
|
|
253
260
|
comment-on-alert: true
|
|
254
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
|
|
@@ -116,6 +116,8 @@ zeromq_pipeline:
|
|
|
116
116
|
url: "tcp://localhost:5556"
|
|
117
117
|
socket_type: "push"
|
|
118
118
|
bind: false
|
|
119
|
+
# format: "raw" # send/receive raw payload bytes per frame instead of JSON-wrapping (e.g. JPEG, Protobuf)
|
|
120
|
+
# format: "raw_framed" # like "raw" but prepends a JSON metadata frame so headers still travel. Default "json".
|
|
119
121
|
|
|
120
122
|
# Route 8: PostgreSQL via SQLx
|
|
121
123
|
sqlx_postgres_route:
|
|
@@ -139,6 +141,22 @@ For example, to set the Kafka topic for the `kafka_to_nats` route:
|
|
|
139
141
|
```sh
|
|
140
142
|
export MQB__KAFKA_TO_NATS__INPUT__KAFKA__TOPIC="my-other-topic"
|
|
141
143
|
```
|
|
144
|
+
#### Postgres CDC example
|
|
145
|
+
|
|
146
|
+
```yaml
|
|
147
|
+
orders_cdc:
|
|
148
|
+
input:
|
|
149
|
+
postgres_cdc:
|
|
150
|
+
url: "postgres://user:pass@localhost:5432/app"
|
|
151
|
+
publication: "orders_pub" # CREATE PUBLICATION orders_pub FOR TABLE orders;
|
|
152
|
+
slot_name: "mqb_orders" # created if missing (permanent slot, resumable)
|
|
153
|
+
output:
|
|
154
|
+
nats:
|
|
155
|
+
subject: "orders.changes"
|
|
156
|
+
url: "nats://localhost:4222"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
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.
|
|
142
160
|
|
|
143
161
|
### NATS JetStream Notes
|
|
144
162
|
|
|
@@ -218,6 +218,18 @@ dependencies = [
|
|
|
218
218
|
"tokio",
|
|
219
219
|
]
|
|
220
220
|
|
|
221
|
+
[[package]]
|
|
222
|
+
name = "async-compression"
|
|
223
|
+
version = "0.4.42"
|
|
224
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
225
|
+
checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac"
|
|
226
|
+
dependencies = [
|
|
227
|
+
"compression-codecs",
|
|
228
|
+
"compression-core",
|
|
229
|
+
"pin-project-lite",
|
|
230
|
+
"tokio",
|
|
231
|
+
]
|
|
232
|
+
|
|
221
233
|
[[package]]
|
|
222
234
|
name = "async-executor"
|
|
223
235
|
version = "1.14.0"
|
|
@@ -990,6 +1002,7 @@ dependencies = [
|
|
|
990
1002
|
"iana-time-zone",
|
|
991
1003
|
"js-sys",
|
|
992
1004
|
"num-traits",
|
|
1005
|
+
"serde",
|
|
993
1006
|
"wasm-bindgen",
|
|
994
1007
|
"windows-link",
|
|
995
1008
|
]
|
|
@@ -1097,6 +1110,23 @@ dependencies = [
|
|
|
1097
1110
|
"tokio-util",
|
|
1098
1111
|
]
|
|
1099
1112
|
|
|
1113
|
+
[[package]]
|
|
1114
|
+
name = "compression-codecs"
|
|
1115
|
+
version = "0.4.38"
|
|
1116
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1117
|
+
checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf"
|
|
1118
|
+
dependencies = [
|
|
1119
|
+
"compression-core",
|
|
1120
|
+
"flate2",
|
|
1121
|
+
"memchr",
|
|
1122
|
+
]
|
|
1123
|
+
|
|
1124
|
+
[[package]]
|
|
1125
|
+
name = "compression-core"
|
|
1126
|
+
version = "0.4.32"
|
|
1127
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1128
|
+
checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789"
|
|
1129
|
+
|
|
1100
1130
|
[[package]]
|
|
1101
1131
|
name = "concurrent-queue"
|
|
1102
1132
|
version = "2.5.0"
|
|
@@ -1250,6 +1280,16 @@ version = "2.5.0"
|
|
|
1250
1280
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1251
1281
|
checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853"
|
|
1252
1282
|
|
|
1283
|
+
[[package]]
|
|
1284
|
+
name = "crc-fast"
|
|
1285
|
+
version = "1.10.0"
|
|
1286
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1287
|
+
checksum = "e75b2483e97a5a7da73ac68a05b629f9c53cff58d8ed1c77866079e18b00dba5"
|
|
1288
|
+
dependencies = [
|
|
1289
|
+
"digest 0.10.7",
|
|
1290
|
+
"spin 0.10.1",
|
|
1291
|
+
]
|
|
1292
|
+
|
|
1253
1293
|
[[package]]
|
|
1254
1294
|
name = "crc32fast"
|
|
1255
1295
|
version = "1.5.0"
|
|
@@ -1742,9 +1782,9 @@ dependencies = [
|
|
|
1742
1782
|
|
|
1743
1783
|
[[package]]
|
|
1744
1784
|
name = "fast-uuid-v7"
|
|
1745
|
-
version = "0.1.
|
|
1785
|
+
version = "0.1.6"
|
|
1746
1786
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1747
|
-
checksum = "
|
|
1787
|
+
checksum = "e8eaa2987e8b03da0c1659e70392d20480a595047e3db7922094ffe364e9d7b0"
|
|
1748
1788
|
dependencies = [
|
|
1749
1789
|
"rand 0.9.4",
|
|
1750
1790
|
]
|
|
@@ -1797,7 +1837,7 @@ checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
|
|
|
1797
1837
|
dependencies = [
|
|
1798
1838
|
"futures-core",
|
|
1799
1839
|
"futures-sink",
|
|
1800
|
-
"spin",
|
|
1840
|
+
"spin 0.9.8",
|
|
1801
1841
|
]
|
|
1802
1842
|
|
|
1803
1843
|
[[package]]
|
|
@@ -1808,7 +1848,7 @@ checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be"
|
|
|
1808
1848
|
dependencies = [
|
|
1809
1849
|
"futures-core",
|
|
1810
1850
|
"futures-sink",
|
|
1811
|
-
"spin",
|
|
1851
|
+
"spin 0.9.8",
|
|
1812
1852
|
]
|
|
1813
1853
|
|
|
1814
1854
|
[[package]]
|
|
@@ -2315,6 +2355,12 @@ version = "1.0.3"
|
|
|
2315
2355
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2316
2356
|
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
|
2317
2357
|
|
|
2358
|
+
[[package]]
|
|
2359
|
+
name = "humantime"
|
|
2360
|
+
version = "2.4.0"
|
|
2361
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2362
|
+
checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15"
|
|
2363
|
+
|
|
2318
2364
|
[[package]]
|
|
2319
2365
|
name = "hybrid-array"
|
|
2320
2366
|
version = "0.4.12"
|
|
@@ -2650,6 +2696,15 @@ dependencies = [
|
|
|
2650
2696
|
"either",
|
|
2651
2697
|
]
|
|
2652
2698
|
|
|
2699
|
+
[[package]]
|
|
2700
|
+
name = "itertools"
|
|
2701
|
+
version = "0.15.0"
|
|
2702
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2703
|
+
checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc"
|
|
2704
|
+
dependencies = [
|
|
2705
|
+
"either",
|
|
2706
|
+
]
|
|
2707
|
+
|
|
2653
2708
|
[[package]]
|
|
2654
2709
|
name = "itoa"
|
|
2655
2710
|
version = "1.0.18"
|
|
@@ -2952,6 +3007,12 @@ dependencies = [
|
|
|
2952
3007
|
"digest 0.11.3",
|
|
2953
3008
|
]
|
|
2954
3009
|
|
|
3010
|
+
[[package]]
|
|
3011
|
+
name = "md5"
|
|
3012
|
+
version = "0.7.0"
|
|
3013
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3014
|
+
checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
|
|
3015
|
+
|
|
2955
3016
|
[[package]]
|
|
2956
3017
|
name = "memchr"
|
|
2957
3018
|
version = "2.8.2"
|
|
@@ -3119,7 +3180,7 @@ dependencies = [
|
|
|
3119
3180
|
|
|
3120
3181
|
[[package]]
|
|
3121
3182
|
name = "mq-bridge"
|
|
3122
|
-
version = "0.3.
|
|
3183
|
+
version = "0.3.5"
|
|
3123
3184
|
dependencies = [
|
|
3124
3185
|
"anyhow",
|
|
3125
3186
|
"arc-swap",
|
|
@@ -3130,6 +3191,7 @@ dependencies = [
|
|
|
3130
3191
|
"aws-sdk-sns",
|
|
3131
3192
|
"aws-sdk-sqs",
|
|
3132
3193
|
"base64",
|
|
3194
|
+
"byteorder",
|
|
3133
3195
|
"bytes",
|
|
3134
3196
|
"chrono",
|
|
3135
3197
|
"config",
|
|
@@ -3138,6 +3200,7 @@ dependencies = [
|
|
|
3138
3200
|
"flate2",
|
|
3139
3201
|
"futures",
|
|
3140
3202
|
"h2 0.4.14",
|
|
3203
|
+
"hex",
|
|
3141
3204
|
"http-body 1.0.1",
|
|
3142
3205
|
"http-body-util",
|
|
3143
3206
|
"hyper 1.10.1",
|
|
@@ -3150,7 +3213,10 @@ dependencies = [
|
|
|
3150
3213
|
"mongodb",
|
|
3151
3214
|
"mq-bridge",
|
|
3152
3215
|
"mqi",
|
|
3216
|
+
"object_store",
|
|
3153
3217
|
"once_cell",
|
|
3218
|
+
"percent-encoding",
|
|
3219
|
+
"pgwire-replication",
|
|
3154
3220
|
"prost",
|
|
3155
3221
|
"protoc-bin-vendored",
|
|
3156
3222
|
"rand 0.10.1",
|
|
@@ -3188,7 +3254,7 @@ dependencies = [
|
|
|
3188
3254
|
|
|
3189
3255
|
[[package]]
|
|
3190
3256
|
name = "mq-bridge-bindings-common"
|
|
3191
|
-
version = "0.3.
|
|
3257
|
+
version = "0.3.5"
|
|
3192
3258
|
dependencies = [
|
|
3193
3259
|
"anyhow",
|
|
3194
3260
|
"fast-uuid-v7",
|
|
@@ -3202,7 +3268,7 @@ dependencies = [
|
|
|
3202
3268
|
|
|
3203
3269
|
[[package]]
|
|
3204
3270
|
name = "mq-bridge-node"
|
|
3205
|
-
version = "0.3.
|
|
3271
|
+
version = "0.3.5"
|
|
3206
3272
|
dependencies = [
|
|
3207
3273
|
"anyhow",
|
|
3208
3274
|
"async-trait",
|
|
@@ -3223,7 +3289,7 @@ dependencies = [
|
|
|
3223
3289
|
|
|
3224
3290
|
[[package]]
|
|
3225
3291
|
name = "mq-bridge-py"
|
|
3226
|
-
version = "0.3.
|
|
3292
|
+
version = "0.3.5"
|
|
3227
3293
|
dependencies = [
|
|
3228
3294
|
"anyhow",
|
|
3229
3295
|
"async-trait",
|
|
@@ -3451,6 +3517,46 @@ dependencies = [
|
|
|
3451
3517
|
"syn",
|
|
3452
3518
|
]
|
|
3453
3519
|
|
|
3520
|
+
[[package]]
|
|
3521
|
+
name = "object_store"
|
|
3522
|
+
version = "0.14.1"
|
|
3523
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3524
|
+
checksum = "d354792e39fa5f0009e47623cf8b15b099bf9a652fa55c6f817fe28ac84fea50"
|
|
3525
|
+
dependencies = [
|
|
3526
|
+
"async-trait",
|
|
3527
|
+
"aws-lc-rs",
|
|
3528
|
+
"base64",
|
|
3529
|
+
"bytes",
|
|
3530
|
+
"chrono",
|
|
3531
|
+
"crc-fast",
|
|
3532
|
+
"form_urlencoded",
|
|
3533
|
+
"futures-channel",
|
|
3534
|
+
"futures-core",
|
|
3535
|
+
"futures-util",
|
|
3536
|
+
"http 1.4.2",
|
|
3537
|
+
"http-body-util",
|
|
3538
|
+
"httparse",
|
|
3539
|
+
"humantime",
|
|
3540
|
+
"hyper 1.10.1",
|
|
3541
|
+
"itertools 0.15.0",
|
|
3542
|
+
"md-5 0.11.0",
|
|
3543
|
+
"parking_lot 0.12.5",
|
|
3544
|
+
"percent-encoding",
|
|
3545
|
+
"quick-xml",
|
|
3546
|
+
"rand 0.10.1",
|
|
3547
|
+
"reqwest",
|
|
3548
|
+
"rustls-pki-types",
|
|
3549
|
+
"serde",
|
|
3550
|
+
"serde_json",
|
|
3551
|
+
"serde_urlencoded",
|
|
3552
|
+
"thiserror 2.0.18",
|
|
3553
|
+
"tokio",
|
|
3554
|
+
"tracing",
|
|
3555
|
+
"url",
|
|
3556
|
+
"wasm-bindgen-futures",
|
|
3557
|
+
"web-time",
|
|
3558
|
+
]
|
|
3559
|
+
|
|
3454
3560
|
[[package]]
|
|
3455
3561
|
name = "oid-registry"
|
|
3456
3562
|
version = "0.8.1"
|
|
@@ -3689,6 +3795,28 @@ dependencies = [
|
|
|
3689
3795
|
"indexmap",
|
|
3690
3796
|
]
|
|
3691
3797
|
|
|
3798
|
+
[[package]]
|
|
3799
|
+
name = "pgwire-replication"
|
|
3800
|
+
version = "0.3.2"
|
|
3801
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3802
|
+
checksum = "7eec6334b2466a0163bd91c29e06a25b391c155231934aee80381b99560e240e"
|
|
3803
|
+
dependencies = [
|
|
3804
|
+
"anyhow",
|
|
3805
|
+
"base64",
|
|
3806
|
+
"bytes",
|
|
3807
|
+
"hmac 0.12.1",
|
|
3808
|
+
"md5",
|
|
3809
|
+
"rand 0.9.4",
|
|
3810
|
+
"rustls 0.23.40",
|
|
3811
|
+
"sha2 0.10.9",
|
|
3812
|
+
"thiserror 1.0.69",
|
|
3813
|
+
"tokio",
|
|
3814
|
+
"tokio-rustls 0.26.4",
|
|
3815
|
+
"tokio-util",
|
|
3816
|
+
"tracing",
|
|
3817
|
+
"webpki-roots 0.26.11",
|
|
3818
|
+
]
|
|
3819
|
+
|
|
3692
3820
|
[[package]]
|
|
3693
3821
|
name = "phf"
|
|
3694
3822
|
version = "0.13.1"
|
|
@@ -4096,6 +4224,16 @@ dependencies = [
|
|
|
4096
4224
|
"winapi",
|
|
4097
4225
|
]
|
|
4098
4226
|
|
|
4227
|
+
[[package]]
|
|
4228
|
+
name = "quick-xml"
|
|
4229
|
+
version = "0.41.0"
|
|
4230
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
4231
|
+
checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1"
|
|
4232
|
+
dependencies = [
|
|
4233
|
+
"memchr",
|
|
4234
|
+
"serde",
|
|
4235
|
+
]
|
|
4236
|
+
|
|
4099
4237
|
[[package]]
|
|
4100
4238
|
name = "quinn"
|
|
4101
4239
|
version = "0.11.9"
|
|
@@ -4496,6 +4634,8 @@ dependencies = [
|
|
|
4496
4634
|
"rustls 0.23.40",
|
|
4497
4635
|
"rustls-pki-types",
|
|
4498
4636
|
"rustls-platform-verifier",
|
|
4637
|
+
"serde",
|
|
4638
|
+
"serde_urlencoded",
|
|
4499
4639
|
"sync_wrapper",
|
|
4500
4640
|
"tokio",
|
|
4501
4641
|
"tokio-rustls 0.26.4",
|
|
@@ -5027,6 +5167,18 @@ dependencies = [
|
|
|
5027
5167
|
"serde_core",
|
|
5028
5168
|
]
|
|
5029
5169
|
|
|
5170
|
+
[[package]]
|
|
5171
|
+
name = "serde_urlencoded"
|
|
5172
|
+
version = "0.7.1"
|
|
5173
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
5174
|
+
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
|
|
5175
|
+
dependencies = [
|
|
5176
|
+
"form_urlencoded",
|
|
5177
|
+
"itoa",
|
|
5178
|
+
"ryu",
|
|
5179
|
+
"serde",
|
|
5180
|
+
]
|
|
5181
|
+
|
|
5030
5182
|
[[package]]
|
|
5031
5183
|
name = "serde_with"
|
|
5032
5184
|
version = "3.21.0"
|
|
@@ -5253,6 +5405,12 @@ dependencies = [
|
|
|
5253
5405
|
"lock_api",
|
|
5254
5406
|
]
|
|
5255
5407
|
|
|
5408
|
+
[[package]]
|
|
5409
|
+
name = "spin"
|
|
5410
|
+
version = "0.10.1"
|
|
5411
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
5412
|
+
checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3"
|
|
5413
|
+
|
|
5256
5414
|
[[package]]
|
|
5257
5415
|
name = "spki"
|
|
5258
5416
|
version = "0.7.3"
|
|
@@ -5948,12 +6106,17 @@ version = "0.6.11"
|
|
|
5948
6106
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
5949
6107
|
checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
|
|
5950
6108
|
dependencies = [
|
|
6109
|
+
"async-compression",
|
|
5951
6110
|
"bitflags 2.13.0",
|
|
5952
6111
|
"bytes",
|
|
6112
|
+
"futures-core",
|
|
5953
6113
|
"futures-util",
|
|
5954
6114
|
"http 1.4.2",
|
|
5955
6115
|
"http-body 1.0.1",
|
|
6116
|
+
"http-body-util",
|
|
5956
6117
|
"pin-project-lite",
|
|
6118
|
+
"tokio",
|
|
6119
|
+
"tokio-util",
|
|
5957
6120
|
"tower",
|
|
5958
6121
|
"tower-layer",
|
|
5959
6122
|
"tower-service",
|
|
@@ -16,13 +16,13 @@ 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.5"
|
|
20
20
|
|
|
21
21
|
[workspace.dependencies]
|
|
22
22
|
anyhow = "1.0"
|
|
23
23
|
async-trait = "0.1"
|
|
24
24
|
bytes = "1"
|
|
25
|
-
fast-uuid-v7 = "0.1.
|
|
25
|
+
fast-uuid-v7 = "0.1.6"
|
|
26
26
|
serde = "1.0"
|
|
27
27
|
serde_json = "1.0"
|
|
28
28
|
serde_yaml_ng = "0.10"
|
|
@@ -97,6 +97,10 @@ lapin = { version = "4.10", default-features = false, features = ["tokio", "rust
|
|
|
97
97
|
# MongoDB
|
|
98
98
|
mongodb = { version = "3.6", optional = true, features = ["cert-key-password"] }
|
|
99
99
|
|
|
100
|
+
# Object store (checkpoint backend): cloud REST via reqwest, not aws-sdk. 0.12 is the
|
|
101
|
+
# last release supporting rust-version 1.75 (0.14 needs 1.85).
|
|
102
|
+
object_store = { version = "0.14", optional = true, default-features = false, features = ["aws", "gcp", "azure", "http"] }
|
|
103
|
+
|
|
100
104
|
# NATS
|
|
101
105
|
async-nats = { version = "0.49", optional = true }
|
|
102
106
|
|
|
@@ -134,6 +138,11 @@ aws-sdk-sns = { version = "1.93", optional = true, default-features = false, fea
|
|
|
134
138
|
# SQLx
|
|
135
139
|
sqlx = { version = "0.9", features = ["runtime-tokio", "tls-rustls", "postgres", "mysql", "sqlite", "any"], optional = true }
|
|
136
140
|
|
|
141
|
+
# ClickHouse — talks the ClickHouse HTTP interface directly (JSONEachRow in/out).
|
|
142
|
+
# reqwest is used rather than the typed `clickhouse` crate because that crate is
|
|
143
|
+
# RowBinary/`Row`-derive only and cannot round-trip arbitrary dynamic JSON payloads.
|
|
144
|
+
reqwest = { version = "0.13", default-features = false, features = ["rustls", "http2", "charset", "query", "gzip"], optional = true }
|
|
145
|
+
|
|
137
146
|
# ZeroMQ
|
|
138
147
|
zeromq = { version = "0.6", optional = true }
|
|
139
148
|
|
|
@@ -149,6 +158,13 @@ prost = { version = "0.14", optional = true, default-features = false, features
|
|
|
149
158
|
tokio-stream = { version = "0.1", optional = true, features = ["net"] }
|
|
150
159
|
|
|
151
160
|
url = { version = "2.5", optional = true }
|
|
161
|
+
percent-encoding = { version = "2.3", optional = true }
|
|
162
|
+
|
|
163
|
+
# Postgres CDC (logical replication / pgoutput). pgwire-replication is a
|
|
164
|
+
# narrowly-scoped wire-protocol client (COPY-both, LSN/standby, TLS/SCRAM) that
|
|
165
|
+
# deliberately avoids tokio-postgres; byteorder backs the pgoutput byte decoder.
|
|
166
|
+
pgwire-replication = { version = "0.3", optional = true, default-features = false, features = ["tls-rustls", "scram", "md5"] }
|
|
167
|
+
byteorder = { version = "1.5", optional = true }
|
|
152
168
|
|
|
153
169
|
# Generate JSON schema
|
|
154
170
|
schemars = { version = "1.2", optional = true }
|
|
@@ -168,7 +184,7 @@ middleware = ["metrics", "dedup"]
|
|
|
168
184
|
# runtime the client is loaded lazily only when an ibm-mq endpoint is opened
|
|
169
185
|
# (clear error if the client isn't installed). Use `ibm-mq-static` instead for
|
|
170
186
|
# static linking.
|
|
171
|
-
full = ["middleware", "mongodb", "kafka", "amqp", "nats", "mqtt", "http", "aws", "zeromq", "redis-streams", "sled", "grpc", "sqlx", "websocket", "rustls-aws-lc", "ibm-mq"]
|
|
187
|
+
full = ["middleware", "mongodb", "kafka", "amqp", "nats", "mqtt", "http", "aws", "zeromq", "redis-streams", "sled", "grpc", "sqlx", "clickhouse", "websocket", "postgres-cdc", "object-store", "rustls-aws-lc", "ibm-mq"]
|
|
172
188
|
|
|
173
189
|
# Functionality features
|
|
174
190
|
dedup = ["sled"]
|
|
@@ -194,7 +210,7 @@ schema = ["dep:schemars"]
|
|
|
194
210
|
kafka = ["rdkafka"]
|
|
195
211
|
amqp = ["lapin", "rustls", "rustls-pemfile", "url"]
|
|
196
212
|
nats = ["async-nats", "rustls", "rustls-pemfile"]
|
|
197
|
-
mongodb = ["dep:mongodb"]
|
|
213
|
+
mongodb = ["dep:mongodb", "url"]
|
|
198
214
|
mqtt = ["rumqttc", "rustls", "tokio-rustls", "rustls-pemfile", "url"]
|
|
199
215
|
http = ["dep:arc-swap", "hyper", "hyper-util", "hyper-rustls", "http-body-util", "dep:http-body", "rustls", "tokio-rustls", "rustls-pemfile", "webpki-roots", "h2", "dep:flate2", "dep:base64"]
|
|
200
216
|
websocket = ["dep:tokio-websockets"]
|
|
@@ -216,6 +232,13 @@ redis-streams = ["dep:redis"]
|
|
|
216
232
|
# Note: The grpc feature requires protobuf-src which can significantly increase build times.
|
|
217
233
|
grpc = ["tonic", "prost", "tokio-stream", "tonic-prost", "tonic-prost-build", "protoc-bin-vendored", "rustls"]
|
|
218
234
|
sqlx = ["dep:sqlx", "url"]
|
|
235
|
+
clickhouse = ["dep:reqwest", "dep:flate2", "url"]
|
|
236
|
+
# Cloud object-store checkpoint backend (S3/GCS/Azure/R2). Talks cloud REST via reqwest.
|
|
237
|
+
object-store = ["dep:object_store", "url"]
|
|
238
|
+
# Postgres logical-replication CDC (pgoutput). Reuses the sqlx dependency for the
|
|
239
|
+
# slot-lifecycle control plane; the streaming wire protocol is pgwire-replication.
|
|
240
|
+
# Needs Rust 1.88 (pgwire-replication MSRV), like the amqp feature gate.
|
|
241
|
+
postgres-cdc = ["dep:pgwire-replication", "dep:byteorder", "sqlx", "dep:base64", "url", "dep:percent-encoding"]
|
|
219
242
|
|
|
220
243
|
[dev-dependencies]
|
|
221
244
|
config = { version = "0.15" }
|
|
@@ -223,6 +246,8 @@ serde_yaml_ng = "0.10"
|
|
|
223
246
|
tempfile = "3.10"
|
|
224
247
|
chrono = "0.4"
|
|
225
248
|
metrics-util = "0.20"
|
|
249
|
+
# pgoutput decoder unit tests decode hex-encoded wire fixtures.
|
|
250
|
+
hex = "0.4"
|
|
226
251
|
criterion = { version = "0.8", features = ["async", "async_tokio"] }
|
|
227
252
|
# Used by the router_bench microbench to model the proposed lock-free route table.
|
|
228
253
|
arc-swap = "1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mq-bridge-py-basic
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.5
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: License :: OSI Approved :: MIT License
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -113,9 +113,24 @@ schema = config_schema() # the JSON Schema as a dict
|
|
|
113
113
|
```
|
|
114
114
|
|
|
115
115
|
`config_schema()` is handy for editor validation of YAML configs too — dump it
|
|
116
|
-
to a file and point your `# yaml-language-server: $schema=` line at it.
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
to a file and point your `# yaml-language-server: $schema=` line at it.
|
|
117
|
+
|
|
118
|
+
### Regenerating the config types
|
|
119
|
+
|
|
120
|
+
`mq_bridge/config.pyi` and `mq_bridge/config.py` are **generated — do not edit by
|
|
121
|
+
hand**. Regenerate them whenever the Rust config models change (e.g. adding a
|
|
122
|
+
field or a new endpoint). Because the generator reads the schema from the
|
|
123
|
+
compiled extension, you must rebuild first:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# from python/mq-bridge-py/
|
|
127
|
+
uv run maturin develop # rebuild the extension
|
|
128
|
+
uv run --no-sync python scripts/gen_config_types.py # regenerate config.pyi / config.py
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Then commit the updated `config.pyi`/`config.py`. `tests/test_config_types.py`
|
|
132
|
+
asserts the checked-in output matches the schema, so CI (the "Python package
|
|
133
|
+
smoke test" job) fails if you skip this after a models change.
|
|
119
134
|
|
|
120
135
|
## Running a route
|
|
121
136
|
|