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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. mq_bridge_py_basic-0.3.4/.github/workflows/benchmark.yml +276 -0
  2. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/node.yml +23 -1
  3. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/publish-node.yml +18 -4
  4. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/publish-python.yml +33 -0
  5. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/CONFIGURATION.md +37 -3
  6. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/Cargo.lock +135 -4
  7. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/Cargo.toml +37 -8
  8. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/PKG-INFO +68 -8
  9. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/README.md +51 -20
  10. mq_bridge_py_basic-0.3.4/benches/ETL_BENCHMARKS.md +107 -0
  11. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/benches/performance_bench.rs +55 -19
  12. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/bindings-common/Cargo.toml +2 -0
  13. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/bindings-common/src/lib.rs +2 -0
  14. mq_bridge_py_basic-0.3.4/bindings-common/src/logging.rs +234 -0
  15. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq-bridge.schema.json +545 -14
  16. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/__init__.py +2 -0
  17. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/__init__.pyi +17 -1
  18. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/config.py +10 -0
  19. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/config.pyi +81 -3
  20. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/Cargo.toml +2 -0
  21. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/README.md +67 -7
  22. mq_bridge_py_basic-0.3.4/python/mq-bridge-py/pyproject-reduced.toml +65 -0
  23. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/src/lib.rs +125 -5
  24. mq_bridge_py_basic-0.3.4/python/mq-bridge-py/tests/test_logging.py +113 -0
  25. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_public_api.py +2 -0
  26. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/debug_ibm_mq_tls.rs +5 -4
  27. mq_bridge_py_basic-0.3.4/scripts/ci/format_bench_output.sh +11 -0
  28. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/canonical_message.rs +4 -0
  29. mq_bridge_py_basic-0.3.4/src/checkpoint.rs +520 -0
  30. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/command_handler.rs +80 -90
  31. mq_bridge_py_basic-0.3.4/src/endpoints/clickhouse.rs +706 -0
  32. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/file.rs +353 -17
  33. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/ibm_mq.rs +10 -18
  34. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/kafka.rs +80 -44
  35. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/mod.rs +256 -9
  36. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/mongodb.rs +972 -3
  37. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/mqtt.rs +61 -0
  38. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/nats.rs +15 -0
  39. mq_bridge_py_basic-0.3.4/src/endpoints/poll.rs +64 -0
  40. mq_bridge_py_basic-0.3.4/src/endpoints/postgres/mod.rs +422 -0
  41. mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/decoder.rs +772 -0
  42. mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/messages.rs +246 -0
  43. mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/mod.rs +106 -0
  44. mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/registry.rs +123 -0
  45. mq_bridge_py_basic-0.3.4/src/endpoints/postgres/pgoutput/values.rs +516 -0
  46. mq_bridge_py_basic-0.3.4/src/endpoints/postgres/replication.rs +258 -0
  47. mq_bridge_py_basic-0.3.4/src/endpoints/postgres/state.rs +67 -0
  48. mq_bridge_py_basic-0.3.4/src/endpoints/redis_streams.rs +644 -0
  49. mq_bridge_py_basic-0.3.4/src/endpoints/sqlx.rs +2576 -0
  50. mq_bridge_py_basic-0.3.4/src/lib.rs +77 -0
  51. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/models.rs +446 -9
  52. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/publisher.rs +11 -0
  53. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/route.rs +288 -0
  54. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/test_utils.rs +162 -0
  55. mq_bridge_py_basic-0.3.4/tests/integration/clickhouse.rs +178 -0
  56. mq_bridge_py_basic-0.3.4/tests/integration/docker-compose/clickhouse.yml +21 -0
  57. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/kafka.yml +1 -0
  58. mq_bridge_py_basic-0.3.4/tests/integration/docker-compose/postgres_cdc.yml +29 -0
  59. mq_bridge_py_basic-0.3.4/tests/integration/docker-compose/redis.yml +11 -0
  60. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/http.rs +2 -2
  61. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/kafka.rs +96 -4
  62. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mariadb.rs +2 -2
  63. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mod.rs +6 -0
  64. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mongodb.rs +2 -2
  65. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mysql.rs +2 -2
  66. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/nats.rs +2 -2
  67. mq_bridge_py_basic-0.3.4/tests/integration/postgres.rs +376 -0
  68. mq_bridge_py_basic-0.3.4/tests/integration/postgres_cdc.rs +209 -0
  69. mq_bridge_py_basic-0.3.4/tests/integration/redis_streams.rs +147 -0
  70. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/sqlite.rs +2 -2
  71. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/tls_helpers.rs +3 -3
  72. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration_test.rs +89 -0
  73. mq_bridge_py_basic-0.3.2/.github/workflows/benchmark.yml +0 -102
  74. mq_bridge_py_basic-0.3.2/src/endpoints/sqlx.rs +0 -993
  75. mq_bridge_py_basic-0.3.2/src/lib.rs +0 -40
  76. mq_bridge_py_basic-0.3.2/tests/integration/postgres.rs +0 -202
  77. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  78. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  79. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  80. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/ci.yml +0 -0
  81. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/ibm-mq.yml +0 -0
  82. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/python.yml +0 -0
  83. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/release.yml +0 -0
  84. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.github/workflows/test-matrix.yml +0 -0
  85. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/.gitignore +0 -0
  86. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/ARCHITECTURE.md +0 -0
  87. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/CONTRIBUTING.md +0 -0
  88. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/LICENSE +0 -0
  89. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/LICENSE.python +0 -0
  90. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/benches/router_bench.rs +0 -0
  91. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/build.rs +0 -0
  92. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/claude.md +0 -0
  93. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/examples/ipc_worker_queue.yaml +0 -0
  94. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/mq_bridge/py.typed +0 -0
  95. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/package-lock.json +0 -0
  96. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/pyproject.toml +0 -0
  97. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/LICENSE.python +0 -0
  98. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
  99. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/example.py +0 -0
  100. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/bench_memory.py +0 -0
  101. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
  102. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/consume_pull.py +0 -0
  103. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/dlt_source.py +0 -0
  104. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/json_route.py +0 -0
  105. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/memory.yaml +0 -0
  106. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/examples/raw_route.py +0 -0
  107. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/pyproject-basic.toml +0 -0
  108. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
  109. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_config_types.py +0 -0
  110. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_packaging.py +0 -0
  111. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
  112. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/tests/test_routes.py +0 -0
  113. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/python/mq-bridge-py/uv.lock +0 -0
  114. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
  115. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/benches/metadata_bench.rs +0 -0
  116. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
  117. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/http/http_flamegraph.py +0 -0
  118. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
  119. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/analysis/http/run_http_ladder.sh +0 -0
  120. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/httparena/README.md +0 -0
  121. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
  122. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
  123. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
  124. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
  125. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
  126. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
  127. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
  128. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/README.md +0 -0
  129. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/postgres.yml +0 -0
  130. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/seed.sql +0 -0
  131. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/techempower/verify.sh +0 -0
  132. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/the-benchmarker/README.md +0 -0
  133. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
  134. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
  135. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
  136. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/connection_registry.rs +0 -0
  137. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/amqp.rs +0 -0
  138. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/aws.rs +0 -0
  139. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/fanout.rs +0 -0
  140. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/grpc.proto +0 -0
  141. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/grpc.rs +0 -0
  142. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/http.rs +0 -0
  143. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/http_stream.rs +0 -0
  144. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/endpoint.rs +0 -0
  145. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/ipc_unix.rs +0 -0
  146. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/ipc_windows.rs +0 -0
  147. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/memory_transport.rs +0 -0
  148. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/mod.rs +0 -0
  149. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/memory/transport.rs +0 -0
  150. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/null.rs +0 -0
  151. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/reader.rs +0 -0
  152. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/response.rs +0 -0
  153. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/sled.rs +0 -0
  154. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/static_endpoint.rs +0 -0
  155. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/stream_buffer.rs +0 -0
  156. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/switch.rs +0 -0
  157. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/websocket.rs +0 -0
  158. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/endpoints/zeromq.rs +0 -0
  159. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/errors.rs +0 -0
  160. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/event_handler.rs +0 -0
  161. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/event_store.rs +0 -0
  162. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/extensions.rs +0 -0
  163. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/buffer.rs +0 -0
  164. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/cookie_jar.rs +0 -0
  165. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/deduplication.rs +0 -0
  166. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/delay.rs +0 -0
  167. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/dlq.rs +0 -0
  168. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/limiter.rs +0 -0
  169. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/metrics.rs +0 -0
  170. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/mod.rs +0 -0
  171. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/random_panic.rs +0 -0
  172. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/retry.rs +0 -0
  173. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/middleware/weak_join.rs +0 -0
  174. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/outcomes.rs +0 -0
  175. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/response.rs +0 -0
  176. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/traits.rs +0 -0
  177. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/src/type_handler.rs +0 -0
  178. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/README.md +0 -0
  179. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/armature_integration.rs +0 -0
  180. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/amqp.rs +0 -0
  181. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/aws.rs +0 -0
  182. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/config.toml +0 -0
  183. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/amqp.yml +0 -0
  184. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/aws.yml +0 -0
  185. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  186. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
  187. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  188. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  189. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  190. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm_mq.yml +0 -0
  191. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
  192. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/kafka-tls.yml +0 -0
  193. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mariadb.yml +0 -0
  194. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
  195. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
  196. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mongodb.yml +0 -0
  197. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mosquitto.conf +0 -0
  198. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
  199. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
  200. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mq_init.mqsc +0 -0
  201. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
  202. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mqtt.yml +0 -0
  203. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
  204. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/mysql.yml +0 -0
  205. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/nats.yml +0 -0
  206. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/docker-compose/postgres.yml +0 -0
  207. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/file.rs +0 -0
  208. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/grpc.rs +0 -0
  209. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/grpc_tls.rs +0 -0
  210. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/http_tls.rs +0 -0
  211. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/ibm_mq.rs +0 -0
  212. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/ibm_mq_tls.rs +0 -0
  213. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/ipc.rs +0 -0
  214. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/kafka_tls.rs +0 -0
  215. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/logic_test.rs +0 -0
  216. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/memory.rs +0 -0
  217. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mongodb_raw.rs +0 -0
  218. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mongodb_tls.rs +0 -0
  219. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/mqtt.rs +0 -0
  220. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/performance_static.rs +0 -0
  221. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/route.rs +0 -0
  222. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/scripts/gen_certs.sh +0 -0
  223. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/websocket.rs +0 -0
  224. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/integration/zeromq.rs +0 -0
  225. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/memory_leak_test.rs +0 -0
  226. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/ref_test.rs +0 -0
  227. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/sqlite_test.rs +0 -0
  228. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/tls_example.rs +0 -0
  229. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/unit_tests.md +0 -0
  230. {mq_bridge_py_basic-0.3.2 → mq_bridge_py_basic-0.3.4}/tests/websocket_test.rs +0 -0
@@ -0,0 +1,276 @@
1
+ name: Benchmark
2
+
3
+ on:
4
+ push:
5
+ branches: [main, dev]
6
+ schedule:
7
+ # Nightly full benchmark run (04:00 UTC)
8
+ - cron: '0 4 * * *'
9
+ workflow_dispatch:
10
+
11
+ env:
12
+ CARGO_TERM_COLOR: always
13
+
14
+ jobs:
15
+ # Compile the bench binary once (release, --features full) and hand the
16
+ # executable to the shard jobs below so none of them need to recompile.
17
+ benchmark-build:
18
+ name: Build Benchmark Binary
19
+ runs-on: ubuntu-latest
20
+ permissions:
21
+ contents: read
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ with:
25
+ persist-credentials: false
26
+
27
+ - name: Install Rust toolchain
28
+ uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
29
+
30
+ - name: Cache cargo build
31
+ uses: Swatinem/rust-cache@v2
32
+ with:
33
+ shared-key: release-full
34
+
35
+ - name: Build bench binary
36
+ run: |
37
+ set -o pipefail
38
+ cargo bench --bench performance_bench --features full --no-run --message-format=json | tee build-output.json
39
+ BIN_PATH=$(jq -r 'select(.reason == "compiler-artifact" and (.target.kind // [] | index("bench")) and .executable != null) | .executable' build-output.json | tail -n1)
40
+ if [ -z "$BIN_PATH" ]; then
41
+ echo "Could not locate performance_bench executable in cargo build output" >&2
42
+ exit 1
43
+ fi
44
+ cp "$BIN_PATH" ./performance_bench_bin
45
+
46
+ - name: Upload bench binary
47
+ uses: actions/upload-artifact@v4
48
+ with:
49
+ name: performance-bench-bin
50
+ path: performance_bench_bin
51
+ retention-days: 1
52
+
53
+ # Three independent shards of the same binary, filtered via the
54
+ # MQB_TEST_BACKEND env var that test_utils::should_run_benchmark() already
55
+ # supports. Each only pre-pulls the Docker images it actually needs.
56
+ benchmark-streams:
57
+ name: Benchmark (streams)
58
+ needs: benchmark-build
59
+ runs-on: ubuntu-latest
60
+ permissions:
61
+ contents: read
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ with:
65
+ persist-credentials: false
66
+
67
+ - name: Download bench binary
68
+ uses: actions/download-artifact@v4
69
+ with:
70
+ name: performance-bench-bin
71
+
72
+ - name: Pre-pull docker images
73
+ run: |
74
+ for f in aws kafka amqp nats mqtt_performance; do
75
+ docker compose -f "tests/integration/docker-compose/${f}.yml" pull -q
76
+ done
77
+
78
+ - name: Run benchmarks
79
+ shell: bash
80
+ env:
81
+ MQB_TEST_BACKEND: "aws,kafka,amqp,nats,mqtt,ibm-mq"
82
+ run: |
83
+ set -o pipefail
84
+ chmod +x ./performance_bench_bin
85
+ export CARGO_TERM_COLOR=never
86
+ ./performance_bench_bin --bench --output-format bencher | tee raw_output_streams.txt
87
+ ./scripts/ci/format_bench_output.sh raw_output_streams.txt output_streams.txt
88
+
89
+ - name: Upload shard output
90
+ uses: actions/upload-artifact@v4
91
+ with:
92
+ name: bench-output-streams
93
+ path: |
94
+ raw_output_streams.txt
95
+ output_streams.txt
96
+ retention-days: 1
97
+
98
+ benchmark-database:
99
+ name: Benchmark (database)
100
+ needs: benchmark-build
101
+ runs-on: ubuntu-latest
102
+ permissions:
103
+ contents: read
104
+ steps:
105
+ - uses: actions/checkout@v4
106
+ with:
107
+ persist-credentials: false
108
+
109
+ - name: Download bench binary
110
+ uses: actions/download-artifact@v4
111
+ with:
112
+ name: performance-bench-bin
113
+
114
+ - name: Pre-pull docker images
115
+ run: |
116
+ for f in mongodb postgres; do
117
+ docker compose -f "tests/integration/docker-compose/${f}.yml" pull -q
118
+ done
119
+
120
+ - name: Run benchmarks
121
+ shell: bash
122
+ env:
123
+ MQB_TEST_BACKEND: "mongodb,postgres"
124
+ run: |
125
+ set -o pipefail
126
+ chmod +x ./performance_bench_bin
127
+ export CARGO_TERM_COLOR=never
128
+ ./performance_bench_bin --bench --output-format bencher | tee raw_output_database.txt
129
+ ./scripts/ci/format_bench_output.sh raw_output_database.txt output_database.txt
130
+
131
+ - name: Upload shard output
132
+ uses: actions/upload-artifact@v4
133
+ with:
134
+ name: bench-output-database
135
+ path: |
136
+ raw_output_database.txt
137
+ output_database.txt
138
+ retention-days: 1
139
+
140
+ benchmark-dockerless:
141
+ name: Benchmark (dockerless)
142
+ needs: benchmark-build
143
+ runs-on: ubuntu-latest
144
+ permissions:
145
+ contents: read
146
+ steps:
147
+ - uses: actions/checkout@v4
148
+ with:
149
+ persist-credentials: false
150
+
151
+ - name: Download bench binary
152
+ uses: actions/download-artifact@v4
153
+ with:
154
+ name: performance-bench-bin
155
+
156
+ - name: Run benchmarks
157
+ shell: bash
158
+ env:
159
+ MQB_TEST_BACKEND: "zeromq,memory,file,http,websocket,grpc"
160
+ run: |
161
+ set -o pipefail
162
+ chmod +x ./performance_bench_bin
163
+ export CARGO_TERM_COLOR=never
164
+ ./performance_bench_bin --bench --output-format bencher | tee raw_output_dockerless.txt
165
+ ./scripts/ci/format_bench_output.sh raw_output_dockerless.txt output_dockerless.txt
166
+
167
+ - name: Upload shard output
168
+ uses: actions/upload-artifact@v4
169
+ with:
170
+ name: bench-output-dockerless
171
+ path: |
172
+ raw_output_dockerless.txt
173
+ output_dockerless.txt
174
+ retention-days: 1
175
+
176
+ # Merge the three shard outputs back into the single combined report the
177
+ # gh-pages benchmark history / dashboard has always tracked.
178
+ benchmark-collect:
179
+ name: Collect Benchmark Results
180
+ needs: [benchmark-streams, benchmark-database, benchmark-dockerless]
181
+ runs-on: ubuntu-latest
182
+ # Serialize gh-pages pushes so overlapping runs don't race the Pages build
183
+ # (concurrent pushes make GitHub cancel the superseded deployment -> "failed").
184
+ concurrency:
185
+ group: gh-pages-publish
186
+ cancel-in-progress: false
187
+ permissions:
188
+ contents: write
189
+ deployments: write
190
+ steps:
191
+ - uses: actions/checkout@v4
192
+
193
+ - name: Download shard outputs
194
+ uses: actions/download-artifact@v4
195
+ with:
196
+ pattern: bench-output-*
197
+ merge-multiple: true
198
+ path: bench-outputs
199
+
200
+ - name: Merge shard outputs
201
+ run: |
202
+ cat bench-outputs/raw_output_*.txt > raw_output.txt
203
+ cat bench-outputs/output_*.txt > output.txt
204
+
205
+ - name: Generate Throughput Summary
206
+ run: |
207
+ python3 -c '
208
+ import re
209
+ import os
210
+
211
+ data = {}
212
+ try:
213
+ with open("raw_output.txt", "r") as f:
214
+ for line in f:
215
+ # Match lines like: "aws single_write: 1 iters, total time 1.48s, 673.75 msgs/sec"
216
+ m = re.search(r"^\s*(.*): .* ([\d\.]+) msgs/sec", line)
217
+ if m:
218
+ name = m.group(1).strip()
219
+ rate = float(m.group(2))
220
+ if name not in data:
221
+ data[name] = []
222
+ data[name].append(rate)
223
+
224
+ if data:
225
+ with open(os.environ["GITHUB_STEP_SUMMARY"], "a") as f:
226
+ f.write("### Benchmark Throughput Results\n")
227
+ f.write("| Test Case | Average msgs/sec | Samples |\n")
228
+ f.write("|-----------|------------------|---------|\n")
229
+ for name in sorted(data.keys()):
230
+ rates = data[name]
231
+ avg = sum(rates) / len(rates)
232
+ f.write(f"| {name} | {avg:,.2f} | {len(rates)} |\n")
233
+ except Exception as e:
234
+ print(f"Error generating summary: {e}")
235
+ '
236
+
237
+ - name: Create gh-pages branch if missing
238
+ run: |
239
+ git fetch origin gh-pages || {
240
+ git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
241
+ git config --global user.name "github-actions[bot]"
242
+ git checkout --orphan gh-pages
243
+ git rm -rf .
244
+ git commit --allow-empty -m "Initialize gh-pages branch"
245
+ git push origin gh-pages
246
+ git checkout ${{ github.sha }}
247
+ }
248
+
249
+ - name: Store benchmark result
250
+ uses: benchmark-action/github-action-benchmark@v1
251
+ with:
252
+ name: Rust Benchmark
253
+ tool: 'cargo'
254
+ output-file-path: output.txt
255
+ github-token: ${{ secrets.GITHUB_TOKEN }}
256
+ # Push on both main and dev so dev commits appear in the benchmark graph.
257
+ # This mints a gh-pages deployment per run; the next step prunes old ones.
258
+ auto-push: true
259
+ alert-threshold: '40000%'
260
+ comment-on-alert: true
261
+ fail-on-alert: false
262
+
263
+ # Keep only the most recent gh-pages deployments so the environment's
264
+ # deployment list doesn't grow unbounded (one is minted per push above).
265
+ - name: Prune old gh-pages deployments
266
+ env:
267
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
268
+ KEEP: 20
269
+ run: |
270
+ gh api "repos/${{ github.repository }}/deployments?environment=github-pages&per_page=100" --paginate -q '.[].id' \
271
+ | tail -n +$((KEEP + 1)) \
272
+ | while read -r id; do
273
+ gh api -X POST "repos/${{ github.repository }}/deployments/$id/statuses" -f state=inactive >/dev/null 2>&1 \
274
+ || echo "::warning::failed to mark deployment $id inactive; attempting delete anyway"
275
+ gh api -X DELETE "repos/${{ github.repository }}/deployments/$id" >/dev/null 2>&1 && echo "pruned $id"
276
+ done
@@ -2,7 +2,7 @@ name: Node
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [main]
5
+ branches: [main, dev]
6
6
  paths:
7
7
  - ".github/workflows/node.yml"
8
8
  - "node/mq-bridge-node/**"
@@ -23,6 +23,28 @@ env:
23
23
  CARGO_TERM_COLOR: always
24
24
 
25
25
  jobs:
26
+ # Fast guard: catches package.json/package-lock.json drift (e.g. a version
27
+ # bump that only half-updates the lock) before it reaches the publish flow,
28
+ # where `npm ci` fails after all the native builds have already run.
29
+ lock-sync:
30
+ name: package-lock in sync
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
34
+ with:
35
+ persist-credentials: false
36
+
37
+ - name: Set up Node
38
+ uses: actions/setup-node@v4
39
+ with:
40
+ node-version: "20"
41
+ cache: npm
42
+ cache-dependency-path: node/mq-bridge-node/package-lock.json
43
+
44
+ - name: Verify lock is in sync
45
+ working-directory: node/mq-bridge-node
46
+ run: npm ci --ignore-scripts
47
+
26
48
  test:
27
49
  name: Node binding smoke test
28
50
  runs-on: ubuntu-latest
@@ -59,6 +59,12 @@ jobs:
59
59
  curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
60
60
  echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
61
61
 
62
+ # Regenerate package.json/lock from the Cargo workspace version (source of
63
+ # truth) BEFORE npm ci, so a drifted committed lock can't fail the build.
64
+ - name: Sync version from Cargo workspace
65
+ working-directory: node/mq-bridge-node
66
+ run: npm run sync-version
67
+
62
68
  - name: Install Node dependencies
63
69
  working-directory: node/mq-bridge-node
64
70
  run: npm ci
@@ -124,6 +130,12 @@ jobs:
124
130
  with:
125
131
  targets: ${{ matrix.target }}
126
132
 
133
+ # Regenerate package.json/lock from the Cargo workspace version (source of
134
+ # truth) BEFORE npm ci, so a drifted committed lock can't fail the build.
135
+ - name: Sync version from Cargo workspace
136
+ working-directory: node/mq-bridge-node
137
+ run: npm run sync-version
138
+
127
139
  - name: Install Node dependencies
128
140
  working-directory: node/mq-bridge-node
129
141
  run: npm ci
@@ -170,14 +182,16 @@ jobs:
170
182
  - name: Update npm
171
183
  run: npm install -g npm@11.5.1
172
184
 
173
- - 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
@@ -139,6 +139,38 @@ For example, to set the Kafka topic for the `kafka_to_nats` route:
139
139
  ```sh
140
140
  export MQB__KAFKA_TO_NATS__INPUT__KAFKA__TOPIC="my-other-topic"
141
141
  ```
142
+ #### Postgres CDC example
143
+
144
+ ```yaml
145
+ orders_cdc:
146
+ input:
147
+ postgres_cdc:
148
+ url: "postgres://user:pass@localhost:5432/app"
149
+ publication: "orders_pub" # CREATE PUBLICATION orders_pub FOR TABLE orders;
150
+ slot_name: "mqb_orders" # created if missing (permanent slot, resumable)
151
+ output:
152
+ nats:
153
+ subject: "orders.changes"
154
+ url: "nats://localhost:4222"
155
+ ```
156
+
157
+ Each change arrives as a `CanonicalMessage` whose payload is the flat row and whose `postgres.operation` metadata marks the operation — the same convention as MongoDB CDC, so typed handlers work identically across both. The replication transport uses the published [`pgwire-replication`](https://crates.io/crates/pgwire-replication) crate.
158
+
159
+ ### NATS JetStream Notes
160
+
161
+ Two gotchas worth knowing before wiring up a `nats` endpoint:
162
+
163
+ - **Subject must be prefixed with the stream name.** When mq-bridge auto-creates
164
+ a JetStream stream (no existing stream already covers the subject), it scopes
165
+ the stream to `{stream}.>`. So `stream: "orders_stream"` requires a subject
166
+ like `orders_stream.foo` — a subject such as `orders.foo` will fail to publish
167
+ with "no stream found for given subject". This only applies to
168
+ auto-creation; publishing to a stream that already exists with a wider
169
+ subject filter works regardless of naming.
170
+ - **`stream` is required even in Core NATS mode.** Consumer validation requires
171
+ a `stream` value even when `no_jetstream: true`. It's unused for the actual
172
+ Core NATS subscribe, but validation still rejects a missing value — pass any
173
+ placeholder string.
142
174
 
143
175
  ### Middleware Configuration
144
176
  Middleware is defined as a list under an endpoint.
@@ -195,8 +227,10 @@ tls:
195
227
  producer_options: [["ssl.cipher.suites", "ECDHE-RSA-AES256-GCM-SHA384"]]
196
228
  consumer_options: [["ssl.cipher.suites", "ECDHE-RSA-AES256-GCM-SHA384"]]
197
229
  ```
198
- 5. **IBM MQ** (native stack): set a strong `cipher_spec` (a TLS 1.2/1.3 CipherSpec) — it is
199
- required for encrypted connections.
230
+ 5. **IBM MQ** (native stack): set a strong `tls.cipher_spec` (a TLS 1.2/1.3 CipherSpec) — it
231
+ is required for encrypted connections. Note `cipher_spec` lives under `tls`, not at the
232
+ top level of the `ibmmq` config (a breaking rename from earlier releases, where it was
233
+ `ibmmq.cipher_spec`).
200
234
  6. **Keep sensitive payloads out of logs.** Message payloads are emitted at `trace` level;
201
235
  run production above `trace` and confirm no cardholder data (PAN) reaches logs or traces.
202
236
  7. **Do not commit secrets.** Source passwords and tokens from a secrets manager or env vars