mq-bridge-py-basic 0.3.2__tar.gz → 0.3.3__tar.gz

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