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.
Files changed (293) hide show
  1. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/CHANGELOG.md +117 -0
  2. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/CLAUDE.md +3 -1
  3. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/Cargo.lock +360 -8
  4. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/Cargo.toml +12 -2
  5. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/PKG-INFO +1 -1
  6. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/CONFIGURATION.md +7 -0
  7. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/REFERENCE.md +169 -14
  8. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq-bridge.schema.json +60 -10
  9. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/config.py +2 -0
  10. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/config.pyi +17 -2
  11. {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
  12. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/http/publisher.rs +3 -1
  13. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/http/tests.rs +71 -0
  14. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mod.rs +522 -7
  15. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/consumer.rs +84 -29
  16. mq_bridge_py_basic-0.4.7/src/endpoints/structural/fanout.rs +615 -0
  17. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/request.rs +73 -7
  18. mq_bridge_py_basic-0.4.7/src/endpoints/structural/switch.rs +645 -0
  19. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/deduplication.rs +61 -8
  20. mq_bridge_py_basic-0.4.7/src/middleware/deferred_commit.rs +170 -0
  21. mq_bridge_py_basic-0.4.7/src/middleware/filter.rs +1278 -0
  22. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/mod.rs +11 -0
  23. mq_bridge_py_basic-0.4.7/src/middleware/raw_json.rs +31 -0
  24. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/compiled.rs +84 -3
  25. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/error.rs +4 -0
  26. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/schema.rs +0 -34
  27. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/tests.rs +48 -0
  28. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/builders.rs +2 -2
  29. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/defaults.rs +1 -0
  30. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/serde_support.rs +1 -0
  31. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/tests.rs +102 -0
  32. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models.rs +77 -6
  33. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/endpoint.rs +46 -5
  34. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/route.rs +502 -53
  35. mq_bridge_py_basic-0.4.5/src/endpoints/structural/fanout.rs +0 -285
  36. mq_bridge_py_basic-0.4.5/src/endpoints/structural/switch.rs +0 -264
  37. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  38. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  39. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  40. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/dependabot.yml +0 -0
  41. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/benchmark.yml +0 -0
  42. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/ci.yml +0 -0
  43. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/ibm-mq.yml +0 -0
  44. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/node.yml +0 -0
  45. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/publish-node.yml +0 -0
  46. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/publish-python.yml +0 -0
  47. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/python.yml +0 -0
  48. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/release.yml +0 -0
  49. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.github/workflows/test-matrix.yml +0 -0
  50. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/.gitignore +0 -0
  51. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/CONTRIBUTING.md +0 -0
  52. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/LICENSE +0 -0
  53. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/LICENSE.python +0 -0
  54. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/README.md +0 -0
  55. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/SECURITY.md +0 -0
  56. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/benches/ETL_BENCHMARKS.md +0 -0
  57. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/benches/performance_bench.rs +0 -0
  58. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/benches/router_bench.rs +0 -0
  59. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/benches/zeromq_backends.rs +0 -0
  60. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/bindings-common/Cargo.toml +0 -0
  61. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/bindings-common/src/lib.rs +0 -0
  62. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/bindings-common/src/logging.rs +0 -0
  63. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/build.rs +0 -0
  64. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/deny.toml +0 -0
  65. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/ARCHITECTURE.md +0 -0
  66. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/DELIVERY.md +0 -0
  67. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/EXTENDING.md +0 -0
  68. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/docs/PLUGINS.md +0 -0
  69. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/examples/ipc_worker_queue.yaml +0 -0
  70. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/__init__.py +0 -0
  71. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/__init__.pyi +0 -0
  72. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/plugin_packaging.py +0 -0
  73. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/mq_bridge/py.typed +0 -0
  74. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/package-lock.json +0 -0
  75. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/pyproject.toml +0 -0
  76. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/Cargo.toml +0 -0
  77. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/LICENSE.python +0 -0
  78. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/README.md +0 -0
  79. {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
  80. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/example.py +0 -0
  81. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/bench_memory.py +0 -0
  82. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
  83. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/consume_pull.py +0 -0
  84. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/dlt_source.py +0 -0
  85. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/json_route.py +0 -0
  86. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/memory.yaml +0 -0
  87. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/examples/raw_route.py +0 -0
  88. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/pyproject-basic.toml +0 -0
  89. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/pyproject-reduced.toml +0 -0
  90. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/src/lib.rs +0 -0
  91. {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
  92. {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
  93. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_logging.py +0 -0
  94. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_packaging.py +0 -0
  95. {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
  96. {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
  97. {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
  98. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/tests/test_routes.py +0 -0
  99. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/python/mq-bridge-py/uv.lock +0 -0
  100. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/benches/metadata_bench.rs +0 -0
  101. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
  102. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
  103. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/http/http_flamegraph.py +0 -0
  104. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
  105. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/analysis/http/run_http_ladder.sh +0 -0
  106. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/ci/format_bench_output.sh +0 -0
  107. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/httparena/README.md +0 -0
  108. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
  109. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
  110. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
  111. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
  112. {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
  113. {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
  114. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
  115. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/README.md +0 -0
  116. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/postgres.yml +0 -0
  117. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/seed.sql +0 -0
  118. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/techempower/verify.sh +0 -0
  119. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/scripts/the-benchmarker/README.md +0 -0
  120. {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
  121. {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
  122. {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
  123. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/canonical_message.rs +0 -0
  124. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/checkpoint.rs +0 -0
  125. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/command_handler.rs +0 -0
  126. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/amqp.rs +0 -0
  127. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/aws.rs +0 -0
  128. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/clickhouse.rs +0 -0
  129. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/file/mod.rs +0 -0
  130. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/file/tests.rs +0 -0
  131. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/grpc.proto +0 -0
  132. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/grpc.rs +0 -0
  133. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/http/mod.rs +0 -0
  134. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/http/stream.rs +0 -0
  135. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/ibm_mq.rs +0 -0
  136. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/kafka.rs +0 -0
  137. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/endpoint.rs +0 -0
  138. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/framed.rs +0 -0
  139. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/ipc_unix.rs +0 -0
  140. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/ipc_windows.rs +0 -0
  141. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/memory_transport.rs +0 -0
  142. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/mod.rs +0 -0
  143. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/memory/transport.rs +0 -0
  144. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/dedup.rs +0 -0
  145. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/mod.rs +0 -0
  146. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/publisher.rs +0 -0
  147. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/readers.rs +0 -0
  148. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mongodb/tests.rs +0 -0
  149. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/mqtt.rs +0 -0
  150. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/nats.rs +0 -0
  151. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/object_store.rs +0 -0
  152. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/poll.rs +0 -0
  153. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/VENDORED.md +0 -0
  154. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/mod.rs +0 -0
  155. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/decoder.rs +0 -0
  156. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/messages.rs +0 -0
  157. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/mod.rs +0 -0
  158. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/registry.rs +0 -0
  159. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/pgoutput/values.rs +0 -0
  160. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/replication.rs +0 -0
  161. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/postgres/state.rs +0 -0
  162. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/redis_streams.rs +0 -0
  163. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/sled.rs +0 -0
  164. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/sqlx/dedup.rs +0 -0
  165. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/sqlx/mod.rs +0 -0
  166. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/sqlx/tests.rs +0 -0
  167. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/mod.rs +0 -0
  168. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/null.rs +0 -0
  169. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/reader.rs +0 -0
  170. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/response.rs +0 -0
  171. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/static_endpoint.rs +0 -0
  172. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/structural/stream_buffer.rs +0 -0
  173. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/websocket.rs +0 -0
  174. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/zeromq/codec.rs +0 -0
  175. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/zeromq/mod.rs +0 -0
  176. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/zeromq/omq.rs +0 -0
  177. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/endpoints/zeromq/zmq.rs +0 -0
  178. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/errors.rs +0 -0
  179. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/event_handler.rs +0 -0
  180. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/event_store.rs +0 -0
  181. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/extensions.rs +0 -0
  182. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/lib.rs +0 -0
  183. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/buffer.rs +0 -0
  184. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/compression.rs +0 -0
  185. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/cookie_jar.rs +0 -0
  186. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/delay.rs +0 -0
  187. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/dlq.rs +0 -0
  188. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/encryption.rs +0 -0
  189. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/id.rs +0 -0
  190. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/limiter.rs +0 -0
  191. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/metrics.rs +0 -0
  192. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/random_panic.rs +0 -0
  193. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/retry.rs +0 -0
  194. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/coerce.rs +0 -0
  195. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/mod.rs +0 -0
  196. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/transform/path.rs +0 -0
  197. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/middleware/weak_join.rs +0 -0
  198. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/models/secrets.rs +0 -0
  199. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/outcomes.rs +0 -0
  200. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/conformance.rs +0 -0
  201. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/message.rs +0 -0
  202. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/middleware.rs +0 -0
  203. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/mod.rs +0 -0
  204. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/sdk.rs +0 -0
  205. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/plugin/test_support.rs +0 -0
  206. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/publisher.rs +0 -0
  207. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/response.rs +0 -0
  208. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/base64_engine.rs +0 -0
  209. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/compression.rs +0 -0
  210. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/connection_registry.rs +0 -0
  211. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/crypto.rs +0 -0
  212. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/crypto_envelope.rs +0 -0
  213. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/interpolation.rs +0 -0
  214. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/mod.rs +0 -0
  215. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/plugin_abi.rs +0 -0
  216. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/support/source_ranges.rs +0 -0
  217. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/test_utils.rs +0 -0
  218. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/traits.rs +0 -0
  219. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/src/type_handler.rs +0 -0
  220. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/README.md +0 -0
  221. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/armature_integration.rs +0 -0
  222. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/amqp.rs +0 -0
  223. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/aws.rs +0 -0
  224. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/clickhouse.rs +0 -0
  225. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/config.toml +0 -0
  226. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/amqp.yml +0 -0
  227. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/aws.yml +0 -0
  228. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/clickhouse.yml +0 -0
  229. {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
  230. {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
  231. {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
  232. {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
  233. {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
  234. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm_mq.yml +0 -0
  235. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
  236. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/kafka-tls.yml +0 -0
  237. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/kafka.yml +0 -0
  238. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mariadb.yml +0 -0
  239. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
  240. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
  241. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mongodb.yml +0 -0
  242. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mosquitto.conf +0 -0
  243. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
  244. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
  245. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mq_init.mqsc +0 -0
  246. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
  247. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mqtt.yml +0 -0
  248. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
  249. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/mysql.yml +0 -0
  250. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/nats.yml +0 -0
  251. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/object_store.yml +0 -0
  252. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/postgres.yml +0 -0
  253. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/postgres_cdc.yml +0 -0
  254. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/docker-compose/redis.yml +0 -0
  255. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/file.rs +0 -0
  256. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/grpc.rs +0 -0
  257. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/grpc_tls.rs +0 -0
  258. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/http.rs +0 -0
  259. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/http_tls.rs +0 -0
  260. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/ibm_mq.rs +0 -0
  261. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/ibm_mq_tls.rs +0 -0
  262. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/ipc.rs +0 -0
  263. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/kafka.rs +0 -0
  264. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/kafka_tls.rs +0 -0
  265. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/logic_test.rs +0 -0
  266. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mariadb.rs +0 -0
  267. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/memory.rs +0 -0
  268. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mod.rs +0 -0
  269. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mongodb.rs +0 -0
  270. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mongodb_raw.rs +0 -0
  271. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mongodb_tls.rs +0 -0
  272. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mqtt.rs +0 -0
  273. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/mysql.rs +0 -0
  274. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/nats.rs +0 -0
  275. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/object_store.rs +0 -0
  276. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/performance_static.rs +0 -0
  277. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/postgres.rs +0 -0
  278. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/postgres_cdc.rs +0 -0
  279. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/redis_streams.rs +0 -0
  280. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/route.rs +0 -0
  281. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/scripts/gen_certs.sh +0 -0
  282. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/sqlite.rs +0 -0
  283. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/tls_helpers.rs +0 -0
  284. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/websocket.rs +0 -0
  285. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration/zeromq.rs +0 -0
  286. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/integration_test.rs +0 -0
  287. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/memory_leak_test.rs +0 -0
  288. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/ref_test.rs +0 -0
  289. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/reference_docs_test.rs +0 -0
  290. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/sqlite_test.rs +0 -0
  291. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/tls_example.rs +0 -0
  292. {mq_bridge_py_basic-0.4.5 → mq_bridge_py_basic-0.4.7}/tests/unit_tests.md +0 -0
  293. {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