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

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