mq-bridge-py-basic 0.4.5__tar.gz → 0.4.7__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.4.5 → mq_bridge_py_basic-0.4.7}/CHANGELOG.md +117 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/CLAUDE.md +3 -1
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/Cargo.lock +360 -8
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/Cargo.toml +12 -2
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/PKG-INFO +1 -1
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/CONFIGURATION.md +7 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/REFERENCE.md +169 -14
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq-bridge.schema.json +60 -10
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/config.py +2 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/config.pyi +17 -2
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/scripts/gen_config_types.py +22 -3
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/http/publisher.rs +3 -1
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/http/tests.rs +71 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mod.rs +522 -7
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/consumer.rs +84 -29
- mq_bridge_py_basic-0.4.7/src/endpoints/structural/fanout.rs +615 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/request.rs +73 -7
- mq_bridge_py_basic-0.4.7/src/endpoints/structural/switch.rs +645 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/deduplication.rs +61 -8
- mq_bridge_py_basic-0.4.7/src/middleware/deferred_commit.rs +170 -0
- mq_bridge_py_basic-0.4.7/src/middleware/filter.rs +1278 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/mod.rs +11 -0
- mq_bridge_py_basic-0.4.7/src/middleware/raw_json.rs +31 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/compiled.rs +84 -3
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/error.rs +4 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/schema.rs +0 -34
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/tests.rs +48 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/builders.rs +2 -2
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/defaults.rs +1 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/serde_support.rs +1 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/tests.rs +102 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models.rs +77 -6
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/endpoint.rs +46 -5
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/route.rs +502 -53
- mq_bridge_py_basic-0.4.5/src/endpoints/structural/fanout.rs +0 -285
- mq_bridge_py_basic-0.4.5/src/endpoints/structural/switch.rs +0 -264
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/dependabot.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/benchmark.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/ci.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/ibm-mq.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/node.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/publish-node.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/publish-python.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/python.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/release.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/test-matrix.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.gitignore +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/CONTRIBUTING.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/LICENSE +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/README.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/SECURITY.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/benches/ETL_BENCHMARKS.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/benches/performance_bench.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/benches/router_bench.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/benches/zeromq_backends.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/bindings-common/Cargo.toml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/bindings-common/src/lib.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/bindings-common/src/logging.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/build.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/deny.toml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/ARCHITECTURE.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/DELIVERY.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/EXTENDING.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/PLUGINS.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/examples/ipc_worker_queue.yaml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/__init__.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/__init__.pyi +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/plugin_packaging.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/py.typed +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/package-lock.json +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/Cargo.toml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/README.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/example.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/bench_memory.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/consume_pull.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/dlt_source.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/json_route.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/memory.yaml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/raw_route.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/pyproject-basic.toml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/pyproject-reduced.toml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/src/lib.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_config_types.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_custom_endpoint.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_logging.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_packaging.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_plugin_package.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_public_api.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_routes.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/uv.lock +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/benches/metadata_bench.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/http/http_flamegraph.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/http/run_http_ladder.sh +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/ci/format_bench_output.sh +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/httparena/README.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/README.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/postgres.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/seed.sql +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/verify.sh +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/the-benchmarker/README.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/canonical_message.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/checkpoint.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/command_handler.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/amqp.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/aws.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/clickhouse.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/file/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/file/tests.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/grpc.proto +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/grpc.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/http/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/http/stream.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/ibm_mq.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/kafka.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/endpoint.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/framed.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/ipc_unix.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/ipc_windows.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/memory_transport.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/transport.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/dedup.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/publisher.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/readers.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/tests.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/nats.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/object_store.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/poll.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/VENDORED.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/decoder.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/messages.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/registry.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/values.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/replication.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/state.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/redis_streams.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/sled.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/sqlx/dedup.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/sqlx/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/sqlx/tests.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/null.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/reader.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/response.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/static_endpoint.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/stream_buffer.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/websocket.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/zeromq/codec.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/zeromq/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/zeromq/omq.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/zeromq/zmq.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/errors.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/event_handler.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/event_store.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/extensions.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/lib.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/buffer.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/compression.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/cookie_jar.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/delay.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/dlq.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/encryption.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/id.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/limiter.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/metrics.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/random_panic.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/retry.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/coerce.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/path.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/weak_join.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/secrets.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/outcomes.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/conformance.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/message.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/middleware.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/sdk.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/test_support.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/publisher.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/response.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/base64_engine.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/compression.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/connection_registry.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/crypto.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/crypto_envelope.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/interpolation.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/plugin_abi.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/source_ranges.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/test_utils.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/traits.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/type_handler.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/README.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/armature_integration.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/amqp.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/aws.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/clickhouse.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/config.toml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/amqp.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/aws.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/clickhouse.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm_mq.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/kafka-tls.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/kafka.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mariadb.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mongodb.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mosquitto.conf +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mq_init.mqsc +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mqtt.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mysql.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/nats.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/object_store.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/postgres.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/postgres_cdc.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/redis.yml +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/file.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/grpc.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/grpc_tls.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/http.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/http_tls.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/ibm_mq.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/ibm_mq_tls.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/ipc.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/kafka.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/kafka_tls.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/logic_test.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mariadb.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/memory.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mod.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mongodb.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mongodb_raw.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mongodb_tls.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mysql.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/nats.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/object_store.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/performance_static.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/postgres.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/postgres_cdc.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/redis_streams.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/route.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/scripts/gen_certs.sh +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/sqlite.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/tls_helpers.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/websocket.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration_test.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/memory_leak_test.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/ref_test.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/reference_docs_test.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/sqlite_test.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/tls_example.rs +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/unit_tests.md +0 -0
- {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/websocket_test.rs +0 -0
|
@@ -2,6 +2,123 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `mq-bridge`. Newest first.
|
|
4
4
|
|
|
5
|
+
## 0.4.7
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- **The startup failure message distinguishes its two causes.** A route that never became ready
|
|
10
|
+
reports `failed to start: did not become ready within {n}ms`; a route whose task ended before
|
|
11
|
+
signalling ready reports `failed to start: ended before it signalled ready (outcome: ...)`.
|
|
12
|
+
The second case returns immediately and never involved the timeout, so reporting it as one
|
|
13
|
+
sent the reader looking for a stall that never happened. Both now carry the cause the
|
|
14
|
+
reconnect loop recorded, which the old message dropped. Code matching on the old
|
|
15
|
+
`failed to start within {n}ms or encountered an error` text needs updating; the substring
|
|
16
|
+
`failed to start` is unchanged.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **A route that ran to completion is no longer reported as one that failed to start.** The run
|
|
21
|
+
task signals ready before its consume loop, so a drain over a small source can reach its
|
|
22
|
+
terminal while that signal is still buffered — leaving the reconnect loop's `select!` with two
|
|
23
|
+
ready branches and free to take the terminal one, dropping the startup channel unread.
|
|
24
|
+
`Route::run()` then returned an error for a drain that had already written its output, and
|
|
25
|
+
`mqb copy --drain` exited non-zero on a successful copy. Both terminal arms now forward a
|
|
26
|
+
ready signal that was already emitted.
|
|
27
|
+
|
|
28
|
+
- **A completed route reports the messages it dropped even after an earlier reconnect failure.**
|
|
29
|
+
The drop report was suppressed whenever `EndpointStatus::error` was already set, including by a
|
|
30
|
+
transient failure the route recovered from. Only a `Failed` route's cause now outranks it.
|
|
31
|
+
|
|
32
|
+
- **A plugin endpoint that rejects its config no longer reconnects forever.** `create_consumer`
|
|
33
|
+
and `create_publisher` flattened the plugin's status into a bare message, and the reconnect
|
|
34
|
+
loop decides by downcasting to `ConsumerError`/`PublisherError` — so every failure to open
|
|
35
|
+
looked like a connection fault worth retrying. A plugin answering `MQB_ERR_INVALID_CONFIG`,
|
|
36
|
+
`MQB_ERR_UNSUPPORTED`, `MQB_ERR_PERMANENT` or `MQB_ERR_PANIC` now stops the route with that
|
|
37
|
+
cause; `MQB_ERR_CONNECTION` and `MQB_ERR_RETRYABLE` still get the reconnect loop.
|
|
38
|
+
|
|
39
|
+
## 0.4.6
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- **`filter` middleware.** Keeps only the messages matching an expression and drops the rest,
|
|
44
|
+
on the input or the output: `- filter: "amount > 100"`. Payload fields are read by bare name
|
|
45
|
+
(`amount`, `order.status`), metadata under `meta.` and always as text, so a numeric comparison
|
|
46
|
+
needs a cast (`number(meta.http_status_code) >= 400`); `&&`/`||` and `and`/`or` both work. A
|
|
47
|
+
metadata-only expression never parses the payload. **Prefer the input** — a filter there drops
|
|
48
|
+
the message before the rest of the route touches it and acks it at the source. Requires the
|
|
49
|
+
new `filter` feature (it pulls the `zen-expression` engine), which is part of `middleware` and
|
|
50
|
+
`full` but **not** of `portable`.
|
|
51
|
+
|
|
52
|
+
- **Predicate mode for `switch`.** `when: [{ if, to }, ...]` routes on the same expression
|
|
53
|
+
language, first match wins, so overlapping thresholds are safe to write and a payload-derived
|
|
54
|
+
key no longer has to be promoted into metadata first. A `switch` uses exactly one of `when` or
|
|
55
|
+
`metadata_key`/`cases`; naming both or neither is a startup error, as is a `when` list in a
|
|
56
|
+
build without the `filter` feature. Value lookup stays the cheaper mode when the key is
|
|
57
|
+
already in metadata.
|
|
58
|
+
|
|
59
|
+
- **`expression` on `transform`.** A Zen expression producing the output document, applied after
|
|
60
|
+
`mapping` and before `schema` — for values that have to be calculated rather than copied.
|
|
61
|
+
Needs the `zen` feature.
|
|
62
|
+
|
|
63
|
+
- **A `fanout` can reply.** If one branch produces a response — a `response` or `static` leg, or
|
|
64
|
+
a `request` whose `forward_to` replies — that response goes back to the caller, so a
|
|
65
|
+
request/reply input can fan a message out and still answer. Only one branch may answer: if
|
|
66
|
+
several do, the first in list order wins, and the route warns once rather than on every
|
|
67
|
+
message. A branch that *fails* nacks the whole fan-out, so the caller gets a `500` rather than
|
|
68
|
+
an answer that hides a lost message; opt out per branch with a `request` whose `forward_to`
|
|
69
|
+
does not reply, or a `dlq` on a plain branch.
|
|
70
|
+
|
|
71
|
+
- **`pass_through_status` on the `http` endpoint.** On a **publisher**, a non-2xx response
|
|
72
|
+
becomes response data instead of a publisher error, so a route can branch on
|
|
73
|
+
`http_status_code` with a `switch` rather than treating every 404 as a failed send. Transport
|
|
74
|
+
failures and unreadable responses are still errors. On a **consumer**, once every output sink
|
|
75
|
+
opts in, a transient sink failure answers the request with `502` instead of stopping and
|
|
76
|
+
reconnecting a non-streaming request/reply route. Composite outputs such as `fanout` need the
|
|
77
|
+
flag on every leaf sink — a mixed output keeps the normal stop-and-reconnect policy — and
|
|
78
|
+
streamable HTTP inputs keep their protocol-specific error frames.
|
|
79
|
+
|
|
80
|
+
### Changed
|
|
81
|
+
|
|
82
|
+
- **A middleware that empties a batch no longer acknowledges ahead of the route.** `filter` and
|
|
83
|
+
`deduplication` can filter a batch down to nothing, and acking that straight away jumps ahead
|
|
84
|
+
of batches the route is still writing on a source with cumulative acks — the ordered sequencer
|
|
85
|
+
only sees the commits `receive_batch` returns, so a crash in that window lost them. On those
|
|
86
|
+
sources the emptied batch's commit is now held and runs from inside the next retained batch's
|
|
87
|
+
commit, which the sequencer does order.
|
|
88
|
+
|
|
89
|
+
- **An `object_store` sink on `name_by: auto` switches to `write_time` names when a row-dropping
|
|
90
|
+
middleware is on the route.** A source-range name covers one *contiguous* run of positions, so
|
|
91
|
+
a batch with holes punched in it would be written as one object per surviving run — a filter
|
|
92
|
+
keeping 80% of rows turns one upload into roughly a hundred. The route logs one line at
|
|
93
|
+
startup saying it made the switch. This covers `filter`, `deduplication`, `weak_join`,
|
|
94
|
+
`transform` with `on_error: reject`, and a `switch` in `when` mode with no `default`. Set
|
|
95
|
+
`name_by: source_position` explicitly to keep replay-safe names and accept the fragmentation.
|
|
96
|
+
|
|
97
|
+
- **`filter` expressions and a `switch`'s `when` cases are compiled when the config is loaded.**
|
|
98
|
+
An invalid expression is now a startup error naming the expression, instead of a per-message
|
|
99
|
+
failure that only surfaces once traffic arrives.
|
|
100
|
+
|
|
101
|
+
### Fixed
|
|
102
|
+
|
|
103
|
+
- **`switch` forwards connect and disconnect hooks to its destinations**, `cases` and `default`
|
|
104
|
+
alike, and one failing teardown no longer skips the rest.
|
|
105
|
+
|
|
106
|
+
- **A failed `request` whose `forward_to` answers the caller surfaces the error** instead of
|
|
107
|
+
echoing the original message back as a success. The route then nacks (HTTP `500`) and a
|
|
108
|
+
`retry` or `dlq` on the endpoint sees the failure as usual. Forwarding to a plain sink still
|
|
109
|
+
acks, so routing a status with a `switch` is unchanged.
|
|
110
|
+
|
|
111
|
+
- **Concurrent MongoDB consumers no longer claim documents out from under each other.** Two
|
|
112
|
+
consumers polling within the same second write the same `locked_until`, which is all the claim
|
|
113
|
+
query had to work with, so one poll could read back documents another had just taken. Each
|
|
114
|
+
claim now carries a unique `claim_token`, and the read-back, unlock, ack and delete are all
|
|
115
|
+
scoped to it — an expired lease that was re-claimed elsewhere is no longer deleted from under
|
|
116
|
+
its new owner.
|
|
117
|
+
|
|
118
|
+
## 0.4.5
|
|
119
|
+
|
|
120
|
+
No library changes: CI workflow timeouts and a version bump.
|
|
121
|
+
|
|
5
122
|
## 0.4.4
|
|
6
123
|
|
|
7
124
|
### Breaking
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Looking for what middleware or structural endpoints exist, and how to configure them?**
|
|
4
4
|
> [REFERENCE.md](docs/REFERENCE.md) is the complete, authoritative list — every middleware
|
|
5
|
-
> (`retry`, `dlq`, `transform`, `id`, `deduplication`, `weak_join`, `buffer`, `limiter`, `delay`,
|
|
5
|
+
> (`retry`, `dlq`, `transform`, `id`, `filter`, `deduplication`, `weak_join`, `buffer`, `limiter`, `delay`,
|
|
6
6
|
> `cookie_jar`, `encryption`, `compression`, `metrics`, `random_panic`, `custom`) and every structural endpoint (`ref`,
|
|
7
7
|
> `fanout`, `switch`, `request`, `response`, `reader`, `static`, `stream_buffer`, `null`,
|
|
8
8
|
> `custom`), each with its fields, defaults, and a working YAML example. Do not infer these
|
|
@@ -77,8 +77,10 @@ src/
|
|
|
77
77
|
│ ├── cookie_jar.rs # Cookie / metadata persistence across requests
|
|
78
78
|
│ ├── deduplication.rs # Message deduplication (sled)
|
|
79
79
|
│ ├── delay.rs # Artificial delay
|
|
80
|
+
│ ├── deferred_commit.rs # Hold commits for batches a middleware emptied
|
|
80
81
|
│ ├── dlq.rs # Dead-letter queue
|
|
81
82
|
│ ├── encryption.rs # AEAD payload encryption
|
|
83
|
+
│ ├── filter.rs # Expression predicate: keep only matching messages
|
|
82
84
|
│ ├── id.rs # Replay-stable business identity into `mqb.id`
|
|
83
85
|
│ ├── limiter.rs # Throughput limiting (msg/s)
|
|
84
86
|
│ ├── metrics.rs # Metrics collection
|