mq-bridge-basic 0.4.18__tar.gz → 0.4.20__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 (402) hide show
  1. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.dockerignore +1 -1
  2. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/dependabot.yml +2 -1
  3. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/app.yml +5 -0
  4. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/ci.yml +5 -0
  5. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/docs.yml +13 -9
  6. mq_bridge_basic-0.4.20/.github/workflows/examples.yml +62 -0
  7. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/AGENTS.md +2 -2
  8. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/CHANGELOG.md +286 -1
  9. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/Cargo.lock +185 -154
  10. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/Cargo.toml +16 -10
  11. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/PKG-INFO +1 -1
  12. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/README.md +21 -16
  13. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/DELIVERY.md +5 -7
  14. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/PLUGINS.md +35 -0
  15. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/REFERENCE.md +148 -13
  16. mq_bridge_basic-0.4.20/examples/c-library/publish.c +40 -0
  17. mq_bridge_basic-0.4.20/examples/c-library/smoke.c +371 -0
  18. mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/README.md +55 -0
  19. mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/docker-compose.yml +53 -0
  20. mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/init.sql +11 -0
  21. mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/routes.yaml +53 -0
  22. mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/search.sh +16 -0
  23. mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/test.sh +43 -0
  24. mq_bridge_basic-0.4.20/examples/transactional-outbox/README.md +49 -0
  25. mq_bridge_basic-0.4.20/examples/transactional-outbox/consume.sh +6 -0
  26. mq_bridge_basic-0.4.20/examples/transactional-outbox/docker-compose.yml +38 -0
  27. mq_bridge_basic-0.4.20/examples/transactional-outbox/init.sql +17 -0
  28. mq_bridge_basic-0.4.20/examples/transactional-outbox/routes.yaml +17 -0
  29. mq_bridge_basic-0.4.20/examples/transactional-outbox/test.sh +50 -0
  30. mq_bridge_basic-0.4.20/include/mq_bridge.h +252 -0
  31. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq-bridge.schema.json +210 -12
  32. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/config.py +12 -0
  33. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/config.pyi +26 -0
  34. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/IBM_MQ.md +1 -1
  35. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/sync-version.mjs +1 -0
  36. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/amqp.rs +1 -1
  37. mq_bridge_basic-0.4.20/src/endpoints/file/csv_dialect.rs +322 -0
  38. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/file/mod.rs +715 -172
  39. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/file/tests.rs +565 -35
  40. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/publisher.rs +5 -1
  41. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/server.rs +8 -10
  42. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http/mod.rs +78 -19
  43. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http/publisher.rs +45 -7
  44. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http/stream.rs +24 -81
  45. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http/tests.rs +543 -42
  46. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/consumer.rs +542 -61
  47. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/mod.rs +12 -7
  48. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/presets.rs +53 -3
  49. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/kafka.rs +7 -2
  50. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/endpoint.rs +35 -46
  51. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mod.rs +205 -12
  52. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/mod.rs +0 -16
  53. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/readers.rs +3 -54
  54. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/tests.rs +40 -12
  55. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mqtt.rs +2 -2
  56. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/nats.rs +10 -13
  57. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/object_store.rs +222 -28
  58. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/mod.rs +113 -6
  59. mq_bridge_basic-0.4.20/src/endpoints/sqlx/columns.rs +597 -0
  60. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sqlx/mod.rs +224 -79
  61. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sqlx/tests.rs +315 -0
  62. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/websocket.rs +9 -3
  63. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/mod.rs +511 -130
  64. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/tests.rs +298 -4
  65. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/buffer.rs +119 -18
  66. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/cookie_jar.rs +34 -7
  67. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/dlq.rs +108 -0
  68. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/filter.rs +55 -2
  69. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/metrics.rs +71 -0
  70. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/mod.rs +164 -0
  71. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/random_panic.rs +117 -0
  72. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/timeout.rs +51 -0
  73. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/builders.rs +262 -0
  74. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/serde_support.rs +1 -0
  75. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/tests.rs +120 -0
  76. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models.rs +152 -14
  77. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/discovery.rs +7 -2
  78. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/mod.rs +79 -6
  79. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/publisher.rs +97 -0
  80. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/route.rs +165 -30
  81. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/crypto_envelope.rs +1 -0
  82. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/mod.rs +10 -0
  83. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/parallel.rs +7 -0
  84. mq_bridge_basic-0.4.20/src/support/redact.rs +57 -0
  85. mq_bridge_basic-0.4.20/src/support/sse.rs +74 -0
  86. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/test_utils.rs +3 -0
  87. mq_bridge_basic-0.4.20/tests/full_plugin_fallback_test.rs +49 -0
  88. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/http.rs +4 -4
  89. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/kafka.rs +11 -6
  90. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/postgres.rs +45 -0
  91. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration_test.rs +9 -0
  92. mq_bridge_basic-0.4.20/tests/plugin_loading_latch_test.rs +28 -0
  93. mq_bridge_basic-0.4.18/benches/ETL_BENCHMARKS.md +0 -85
  94. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.cargo/config.toml +0 -0
  95. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.coderabbit.yaml +0 -0
  96. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  97. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  98. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  99. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/benchmark.yml +0 -0
  100. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/build-node.yml +0 -0
  101. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/conda.yml +0 -0
  102. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/ibm-mq.yml +0 -0
  103. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/node.yml +0 -0
  104. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/publish-node.yml +0 -0
  105. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/publish-python.yml +0 -0
  106. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/python.yml +0 -0
  107. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/release.yml +0 -0
  108. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/test-matrix.yml +0 -0
  109. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.gitignore +0 -0
  110. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.justfile +0 -0
  111. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/CLAUDE.md +0 -0
  112. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/CONTRIBUTING.md +0 -0
  113. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE +0 -0
  114. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE-APACHE +0 -0
  115. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE-APACHE.python +0 -0
  116. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE-MIT +0 -0
  117. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE-MIT.python +0 -0
  118. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE.python +0 -0
  119. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/SECURITY.md +0 -0
  120. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/THIRD_PARTY_LICENSES.txt +0 -0
  121. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/csv_to_json_bench.rs +0 -0
  122. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/middleware_expr_bench.rs +0 -0
  123. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/pack_bench.rs +0 -0
  124. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/performance_bench.rs +0 -0
  125. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/router_bench.rs +0 -0
  126. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/zeromq_backends.rs +0 -0
  127. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/bindings-common/Cargo.toml +0 -0
  128. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/bindings-common/src/lib.rs +0 -0
  129. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/bindings-common/src/logging.rs +0 -0
  130. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/build.rs +0 -0
  131. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/deny.toml +0 -0
  132. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/ARCHITECTURE.md +0 -0
  133. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/CONFIGURATION.md +0 -0
  134. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/EXTENDING.md +0 -0
  135. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/GRPC.md +0 -0
  136. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/THIRD_PARTY_LICENSES.md +0 -0
  137. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/assets/copy-demo.png +0 -0
  138. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/CMakeLists.txt +0 -0
  139. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/README.md +0 -0
  140. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/legacy_ledger.c +0 -0
  141. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/legacy_ledger.h +0 -0
  142. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/legacy_parser.c +0 -0
  143. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/legacy_parser.h +0 -0
  144. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/minimal.c +0 -0
  145. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/plugin.c +0 -0
  146. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/ipc_worker_queue.yaml +0 -0
  147. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/include/cbindgen.toml +0 -0
  148. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/include/mq_bridge_plugin.h +0 -0
  149. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/include/mq_bridge_plugin_helpers.h +0 -0
  150. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/llms.txt +0 -0
  151. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/__init__.py +0 -0
  152. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/__init__.pyi +0 -0
  153. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/plugin_packaging.py +0 -0
  154. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/py.typed +0 -0
  155. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/package-lock.json +0 -0
  156. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/pyproject.toml +0 -0
  157. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/Cargo.toml +0 -0
  158. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/LICENSE-APACHE.python +0 -0
  159. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/LICENSE-MIT.python +0 -0
  160. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/LICENSE.python +0 -0
  161. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/README.md +0 -0
  162. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/THIRD_PARTY_LICENSES.txt +0 -0
  163. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
  164. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/example.py +0 -0
  165. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/bench_memory.py +0 -0
  166. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
  167. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/consume_pull.py +0 -0
  168. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/dlt_source.py +0 -0
  169. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/ibm-mq-input.py +0 -0
  170. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/json_route.py +0 -0
  171. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/memory.yaml +0 -0
  172. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/raw_route.py +0 -0
  173. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/pyproject-basic.toml +0 -0
  174. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/pyproject-reduced.toml +0 -0
  175. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
  176. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/src/lib.rs +0 -0
  177. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_config_types.py +0 -0
  178. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_custom_endpoint.py +0 -0
  179. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_logging.py +0 -0
  180. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_packaging.py +0 -0
  181. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
  182. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_plugin_package.py +0 -0
  183. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_public_api.py +0 -0
  184. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_routes.py +0 -0
  185. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_shutdown.py +0 -0
  186. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/uv.lock +0 -0
  187. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/benches/metadata_bench.rs +0 -0
  188. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
  189. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
  190. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/http/http_flamegraph.py +0 -0
  191. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
  192. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/http/run_http_ladder.sh +0 -0
  193. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/ci/format_bench_output.sh +0 -0
  194. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/README.md +0 -0
  195. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
  196. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
  197. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
  198. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/frameworks/mq-bridge-py/templates/fortunes.html +0 -0
  199. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/mqb-agent.py +0 -0
  200. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
  201. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
  202. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
  203. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
  204. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/README.md +0 -0
  205. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/postgres.yml +0 -0
  206. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/seed.sql +0 -0
  207. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/verify.sh +0 -0
  208. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/the-benchmarker/README.md +0 -0
  209. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
  210. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
  211. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
  212. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/canonical_message.rs +0 -0
  213. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/checkpoint.rs +0 -0
  214. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/command_handler.rs +0 -0
  215. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/config_file.rs +0 -0
  216. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/aws.rs +0 -0
  217. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/clickhouse.rs +0 -0
  218. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/dir_spool/mod.rs +0 -0
  219. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/dir_spool/tests.rs +0 -0
  220. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/consumer.rs +0 -0
  221. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/dynamic.rs +0 -0
  222. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/mod.rs +0 -0
  223. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/proto/mqbridge/bridge.proto +0 -0
  224. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/tests.rs +0 -0
  225. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/auth.rs +0 -0
  226. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/publisher.rs +0 -0
  227. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/query.rs +0 -0
  228. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/ibm_mq.rs +0 -0
  229. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/framed.rs +0 -0
  230. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/ipc_unix.rs +0 -0
  231. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/ipc_windows.rs +0 -0
  232. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/memory_transport.rs +0 -0
  233. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/mod.rs +0 -0
  234. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/transport.rs +0 -0
  235. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/aggregate.rs +0 -0
  236. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/consumer.rs +0 -0
  237. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/dedup.rs +0 -0
  238. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/publisher.rs +0 -0
  239. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/poll.rs +0 -0
  240. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/VENDORED.md +0 -0
  241. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/decoder.rs +0 -0
  242. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/messages.rs +0 -0
  243. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/mod.rs +0 -0
  244. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/registry.rs +0 -0
  245. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/values.rs +0 -0
  246. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/replication.rs +0 -0
  247. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/state.rs +0 -0
  248. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/redis_streams.rs +0 -0
  249. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sled.rs +0 -0
  250. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sqlx/aggregate.rs +0 -0
  251. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sqlx/dedup.rs +0 -0
  252. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/fanout.rs +0 -0
  253. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/mod.rs +0 -0
  254. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/null.rs +0 -0
  255. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/reader.rs +0 -0
  256. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/request.rs +0 -0
  257. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/response.rs +0 -0
  258. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/sequence.rs +0 -0
  259. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/static_endpoint.rs +0 -0
  260. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/stream_buffer.rs +0 -0
  261. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/switch.rs +0 -0
  262. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/zeromq/codec.rs +0 -0
  263. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/zeromq/mod.rs +0 -0
  264. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/zeromq/omq.rs +0 -0
  265. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/zeromq/zmq.rs +0 -0
  266. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/errors.rs +0 -0
  267. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/event_handler.rs +0 -0
  268. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/event_store.rs +0 -0
  269. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/extensions.rs +0 -0
  270. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/lib.rs +0 -0
  271. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/states.rs +0 -0
  272. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/store.rs +0 -0
  273. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/writer.rs +0 -0
  274. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/compression.rs +0 -0
  275. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/deduplication/memory.rs +0 -0
  276. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/deduplication.rs +0 -0
  277. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/deferred_commit.rs +0 -0
  278. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/delay.rs +0 -0
  279. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/encryption.rs +0 -0
  280. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/id.rs +0 -0
  281. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/limiter.rs +0 -0
  282. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/lookup.rs +0 -0
  283. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/otel.rs +0 -0
  284. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/pack.rs +0 -0
  285. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/raw_json.rs +0 -0
  286. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/retry.rs +0 -0
  287. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/coerce.rs +0 -0
  288. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/compiled.rs +0 -0
  289. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/error.rs +0 -0
  290. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/mod.rs +0 -0
  291. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/path.rs +0 -0
  292. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/schema.rs +0 -0
  293. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/tests.rs +0 -0
  294. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/weak_join.rs +0 -0
  295. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/defaults.rs +0 -0
  296. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/secrets.rs +0 -0
  297. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/outcomes.rs +0 -0
  298. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/completion.rs +0 -0
  299. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/conformance.rs +0 -0
  300. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/crash.rs +0 -0
  301. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/endpoint.rs +0 -0
  302. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/forward.rs +0 -0
  303. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/host.rs +0 -0
  304. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/message.rs +0 -0
  305. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/middleware.rs +0 -0
  306. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/sdk.rs +0 -0
  307. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/test_support.rs +0 -0
  308. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/response.rs +0 -0
  309. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/shutdown.rs +0 -0
  310. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/base64_engine.rs +0 -0
  311. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/change_op.rs +0 -0
  312. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/compression.rs +0 -0
  313. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/compression_pool.rs +0 -0
  314. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/config_schema.rs +0 -0
  315. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/connection_registry.rs +0 -0
  316. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/crypto.rs +0 -0
  317. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/http_status.rs +0 -0
  318. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/interpolation.rs +0 -0
  319. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/lookup_batch.rs +0 -0
  320. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/ndjson.rs +0 -0
  321. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/pack.rs +0 -0
  322. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/parquet.rs +0 -0
  323. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/plugin_abi.rs +0 -0
  324. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/poll_job.rs +0 -0
  325. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/source_ranges.rs +0 -0
  326. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/stream_batch.rs +0 -0
  327. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/traits.rs +0 -0
  328. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/type_handler.rs +0 -0
  329. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/README.md +0 -0
  330. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/armature_integration.rs +0 -0
  331. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/compat/python/bridge_client.py +0 -0
  332. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/dedup_store_bench.rs +0 -0
  333. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/delivery_guarantee_test.rs +0 -0
  334. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/amqp.rs +0 -0
  335. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/aws.rs +0 -0
  336. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/clickhouse.rs +0 -0
  337. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/config.toml +0 -0
  338. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/amqp.yml +0 -0
  339. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/aws.yml +0 -0
  340. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/clickhouse.yml +0 -0
  341. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  342. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
  343. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  344. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  345. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  346. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm_mq.yml +0 -0
  347. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
  348. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/kafka-tls.yml +0 -0
  349. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/kafka.yml +0 -0
  350. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mariadb.yml +0 -0
  351. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
  352. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
  353. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mongodb.yml +0 -0
  354. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mosquitto.conf +0 -0
  355. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
  356. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
  357. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mq_init.mqsc +0 -0
  358. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
  359. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mqtt.yml +0 -0
  360. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
  361. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mysql.yml +0 -0
  362. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/nats.yml +0 -0
  363. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/object_store.yml +0 -0
  364. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/postgres.yml +0 -0
  365. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/postgres_cdc.yml +0 -0
  366. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/redis.yml +0 -0
  367. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/file.rs +0 -0
  368. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/grpc.rs +0 -0
  369. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/grpc_tls.rs +0 -0
  370. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/http_tls.rs +0 -0
  371. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/ibm_mq.rs +0 -0
  372. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/ibm_mq_tls.rs +0 -0
  373. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/ipc.rs +0 -0
  374. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/kafka_tls.rs +0 -0
  375. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/logic_test.rs +0 -0
  376. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mariadb.rs +0 -0
  377. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/memory.rs +0 -0
  378. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mod.rs +0 -0
  379. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mongodb.rs +0 -0
  380. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mongodb_raw.rs +0 -0
  381. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mongodb_tls.rs +0 -0
  382. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mqtt.rs +0 -0
  383. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mysql.rs +0 -0
  384. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/nats.rs +0 -0
  385. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/object_store.rs +0 -0
  386. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/performance_static.rs +0 -0
  387. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/postgres_cdc.rs +0 -0
  388. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/redis_streams.rs +0 -0
  389. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/route.rs +0 -0
  390. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/scripts/gen_certs.sh +0 -0
  391. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/sqlite.rs +0 -0
  392. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/tls_helpers.rs +0 -0
  393. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/websocket.rs +0 -0
  394. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/zeromq.rs +0 -0
  395. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/memory_leak_test.rs +0 -0
  396. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/otel_test.rs +0 -0
  397. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/ref_test.rs +0 -0
  398. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/reference_docs_test.rs +0 -0
  399. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/sqlite_test.rs +0 -0
  400. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/tls_example.rs +0 -0
  401. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/unit_tests.md +0 -0
  402. {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/websocket_test.rs +0 -0
@@ -5,7 +5,7 @@ logs
5
5
  target
6
6
  **/target
7
7
  **/node_modules
8
- apps/mq-bridge-app/dev/docs/book
8
+ docs/book/book
9
9
 
10
10
  # Local build output
11
11
  **/.venv
@@ -9,7 +9,8 @@ updates:
9
9
  directory: "/" # Location of package manifests
10
10
  target-branch: "dev"
11
11
  schedule:
12
- interval: "monthly"
12
+ # Same cadence as the app workspace below, so the two lockfiles do not drift.
13
+ interval: "weekly"
13
14
  groups:
14
15
  minor-and-patch:
15
16
  applies-to: version-updates
@@ -51,6 +51,7 @@ jobs:
51
51
  cache-workspace-crates: true
52
52
 
53
53
  - name: Install system dependencies
54
+ timeout-minutes: 5
54
55
  run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev pkg-config zlib1g-dev protobuf-compiler libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
55
56
 
56
57
  - name: Test desktop crate
@@ -116,6 +117,7 @@ jobs:
116
117
  cache-dependency-path: apps/mq-bridge-app/package-lock.json
117
118
 
118
119
  - name: Install system dependencies
120
+ timeout-minutes: 5
119
121
  run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev pkg-config zlib1g-dev protobuf-compiler
120
122
 
121
123
  - name: Install frontend dependencies
@@ -193,6 +195,7 @@ jobs:
193
195
  cache-workspace-crates: true
194
196
 
195
197
  - name: Install system dependencies
198
+ timeout-minutes: 5
196
199
  run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev pkg-config zlib1g-dev protobuf-compiler
197
200
 
198
201
  - name: Run integration suite
@@ -224,6 +227,7 @@ jobs:
224
227
  cache-workspace-crates: true
225
228
 
226
229
  - name: Install system dependencies
230
+ timeout-minutes: 5
227
231
  run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev pkg-config zlib1g-dev protobuf-compiler
228
232
 
229
233
  # The test drives the CLI through `env!("CARGO_BIN_EXE_mq-bridge-app")`, an
@@ -294,6 +298,7 @@ jobs:
294
298
  chmod +x "$cli" docker-suite/test-binary
295
299
 
296
300
  - name: Install runtime libraries
301
+ timeout-minutes: 5
297
302
  run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev zlib1g-dev
298
303
 
299
304
  # The engine's own integration stacks, so there is one definition per
@@ -120,6 +120,11 @@ jobs:
120
120
  - name: C plugin header is current and a C plugin loads
121
121
  run: cargo test -p mq-bridge-plugin-fixture --test plugin_c_header --test plugin_c_abi
122
122
 
123
+ - name: C library header is current and a C program links and runs
124
+ run: cargo test -p mq-bridge-c --no-default-features
125
+ env:
126
+ MQB_C_ASAN: "1" # AddressSanitizer; on Linux it also fails on leaks
127
+
123
128
  - name: Memory leak soak (route commit-task JoinSet)
124
129
  run: cargo test --test memory_leak_test --features=full -- --ignored --nocapture
125
130
 
@@ -5,7 +5,7 @@ on:
5
5
  branches: [main]
6
6
  paths:
7
7
  - "docs/**"
8
- - "apps/mq-bridge-app/dev/docs/**"
8
+ - "llms.txt"
9
9
  - "apps/mq-bridge-app/crates/cli/examples/gen_url_docs.rs"
10
10
  - ".github/workflows/docs.yml"
11
11
  # The benchmark workflow pushes new data to the gh-pages branch; republish the
@@ -38,14 +38,18 @@ jobs:
38
38
  mdbook-version: "0.5.4"
39
39
 
40
40
  - name: Vendor engine docs
41
- run: bash apps/mq-bridge-app/dev/docs/sync-engine-docs.sh
41
+ run: bash docs/book/sync-engine-docs.sh
42
42
 
43
43
  - name: Build book
44
- run: mdbook build apps/mq-bridge-app/dev/docs
44
+ run: mdbook build docs/book
45
45
 
46
- # mdbook copies non-Markdown files from the book source; fail if that ever stops.
47
- - name: Check llms.txt is published
48
- run: test -s apps/mq-bridge-app/dev/docs/book/llms.txt
46
+ # llms.txt lives at the repository root; publish it with the book.
47
+ - name: Publish llms.txt
48
+ run: cp llms.txt docs/book/book/llms.txt
49
+
50
+ # Canonical URLs, meta descriptions, sitemap.xml and llms-full.txt.
51
+ - name: Postprocess book
52
+ run: python3 docs/book/postprocess.py
49
53
 
50
54
  # The benchmark dashboard lives on the gh-pages branch. Copy it into the
51
55
  # book so this workflow is the only thing that publishes to Pages.
@@ -61,8 +65,8 @@ jobs:
61
65
  run: |
62
66
  src=.benchmark-data/dev/bench
63
67
  if [ -d "$src" ]; then
64
- mkdir -p apps/mq-bridge-app/dev/docs/book/dev
65
- cp -R "$src" apps/mq-bridge-app/dev/docs/book/dev/bench
68
+ mkdir -p docs/book/book/dev
69
+ cp -R "$src" docs/book/book/dev/bench
66
70
  else
67
71
  echo "::warning::no benchmark data on gh-pages; /dev/bench/ will be missing"
68
72
  fi
@@ -70,7 +74,7 @@ jobs:
70
74
  - name: Upload Pages artifact
71
75
  uses: actions/upload-pages-artifact@v5
72
76
  with:
73
- path: apps/mq-bridge-app/dev/docs/book
77
+ path: docs/book/book
74
78
 
75
79
  deploy:
76
80
  name: Deploy to Pages
@@ -0,0 +1,62 @@
1
+ name: Examples
2
+
3
+ # Runs the use-case examples under examples/ the way their READMEs describe.
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ paths:
8
+ - "examples/postgres-cdc-to-qdrant/**"
9
+ - "examples/transactional-outbox/**"
10
+ - "examples/test-without-a-broker/**"
11
+ - ".github/workflows/examples.yml"
12
+ pull_request:
13
+ paths:
14
+ - "examples/postgres-cdc-to-qdrant/**"
15
+ - "examples/transactional-outbox/**"
16
+ - "examples/test-without-a-broker/**"
17
+ - ".github/workflows/examples.yml"
18
+ workflow_dispatch:
19
+
20
+ permissions:
21
+ contents: read
22
+
23
+ concurrency:
24
+ group: examples-${{ github.ref }}
25
+ cancel-in-progress: true
26
+
27
+ jobs:
28
+ docker:
29
+ name: ${{ matrix.example }}
30
+ runs-on: ubuntu-latest
31
+ timeout-minutes: 20
32
+ strategy:
33
+ fail-fast: false
34
+ matrix:
35
+ example: [postgres-cdc-to-qdrant, transactional-outbox]
36
+ steps:
37
+ - uses: actions/checkout@v7
38
+ with:
39
+ persist-credentials: false
40
+ - name: Run the example's smoke test
41
+ working-directory: examples/${{ matrix.example }}
42
+ run: ./test.sh
43
+
44
+ test-without-a-broker:
45
+ name: test-without-a-broker
46
+ runs-on: ubuntu-latest
47
+ timeout-minutes: 20
48
+ steps:
49
+ - uses: actions/checkout@v7
50
+ with:
51
+ persist-credentials: false
52
+ - name: Rust
53
+ working-directory: examples/test-without-a-broker
54
+ run: cargo test --locked
55
+ - uses: actions/setup-python@v7
56
+ with:
57
+ python-version: "3.12"
58
+ - name: Python
59
+ working-directory: examples/test-without-a-broker/python
60
+ run: |
61
+ pip install -r requirements.txt
62
+ pytest -q
@@ -186,8 +186,8 @@ The grammar and examples are in [CONFIGURATION.md](docs/CONFIGURATION.md).
186
186
  2. **New middleware**: Add to `middleware/mod.rs`, implement middleware wrapper types
187
187
  3. **Configuration changes**: Update `models.rs` with new config structs, add to `EndpointType`/`Middleware` enums
188
188
  4. **Tests**: Add integration tests in `tests/integration/`, update Docker Compose if needed
189
- 5. **Documentation**: Update README.md and add doc comments; when middleware or endpoint behaviour changes, also check the book's hand-written pages in `apps/mq-bridge-app/dev/docs/cookbook` and `operations`
189
+ 5. **Documentation**: Update README.md and add doc comments; when middleware or endpoint behaviour changes, also check the book's hand-written pages in `docs/book/cookbook` and `operations`
190
190
 
191
191
  ### Dependencies
192
192
 
193
- Dependencies and the feature that gates each optional one are in `Cargo.toml`, with comments explaining the non-obvious choices. The crate has no default features.
193
+ Dependencies and the feature that gates each optional one are in `Cargo.toml`, with comments explaining the non-obvious choices. The only default features are `file` and `dir-spool`; an endpoint whose feature is off is served by a registered factory of the same name if there is one (see `plugins/full`).
@@ -2,6 +2,291 @@
2
2
 
3
3
  All notable changes to `mq-bridge`. Newest first.
4
4
 
5
+ ## 0.4.20
6
+
7
+ Kafka outputs publish faster with their default settings. If you depend on `mq-bridge` with
8
+ `default-features = false` and use the `file` or `dir_spool` endpoint, read "Behaviour
9
+ changes" first: both are Cargo features now.
10
+
11
+ ### Behaviour changes
12
+
13
+ - **`mqb --ui` listens on `127.0.0.1:9091`, not on `0.0.0.0:9091`.** The UI has no login,
14
+ and the old default put it on the network. The Docker image keeps `0.0.0.0:9091` through
15
+ `ENV MQB_UI_DEFAULT_ADDR`. To reach the UI from another machine, set `ui_addr` in the
16
+ config; a start on such an address logs a warning.
17
+ - **A web UI on a loopback address refuses a request with a foreign `Host` header** (403).
18
+ This stops a web page from reaching the UI through DNS rebinding. Behind a reverse proxy
19
+ or a port forward that sends another host name, list the names in `MQB_UI_ALLOWED_HOSTS`.
20
+ - **`GET /config` of the web UI no longer returns secrets** in any storage mode except
21
+ `unencrypted` and `temporary_messages`. Each secret is shown as a reference to the key it
22
+ is stored under, such as `${MQB__PUBLISHERS__<id>__HTTP__BASIC_AUTH__1}`; a URL keeps
23
+ everything but its password. A save replaces each reference by the stored value, so
24
+ cloning, copying and renaming an endpoint keep its secrets. A reference to a key that is
25
+ not stored is refused with 400. A config exported from the UI holds references, and a
26
+ script that read secrets from this endpoint no longer gets them.
27
+ - **An HTTP output with `tls.required: true` and an `http://` URL fails at start.** It sent
28
+ its requests unencrypted before. An `http://` output to another host that carries
29
+ `basic_auth` or custom headers logs a warning.
30
+
31
+ - **`file` and `dir_spool` are Cargo features: `file` and `dir-spool`.** Both endpoints
32
+ were compiled into every build. They are now in the default features, and in `full` and
33
+ `portable`; `object-store` enables `file`.
34
+ - A dependency with default features, `full` or `portable` builds what it built before.
35
+ - A dependency with `default-features = false` loses both endpoints. A route that names
36
+ one fails at start with `Unsupported consumer endpoint type` (or `publisher`), and code
37
+ that names `endpoints::file` or `endpoints::dir_spool` no longer compiles. To keep them:
38
+
39
+ ```toml
40
+ mq-bridge = { version = "0.4", default-features = false, features = ["file", "dir-spool"] }
41
+ ```
42
+
43
+ - The config types (`FileConfig`, `DirSpoolConfig`) and the `EndpointType` variants stay
44
+ in every build, so a configuration still parses.
45
+ - `mq-bridge-app`, the Python package and the Node.js package are unchanged; they enable
46
+ both.
47
+
48
+ ### Added
49
+
50
+ - **A C library.** The new `c/mq-bridge-c` crate builds `libmq_bridge` (shared and static)
51
+ with the header `include/mq_bridge.h`: messages, publishers (send, batch, request/reply),
52
+ pull consumers with commit and per-batch ack/nack, and routes with handlers, configured
53
+ with the same YAML or JSON as the other bindings. Every call blocks. The header is
54
+ generated and carries no ABI stability promise: it ships with its library, and
55
+ `mqb_api_version()` detects a mismatch. There are no prebuilt archives yet; see
56
+ `c/mq-bridge-c/README.md`.
57
+ - **Plugin tables registered from the host program.** `plugin::register_plugin_table`
58
+ (C: `mqb_register_plugin`) registers an `MqbPluginVTable` that lives in the running
59
+ program, so a C or C++ application defines custom endpoints and middleware without
60
+ building a separate plugin library.
61
+ - **Live status in the CLI, the UI and MCP.** `mqb status` lists every route and consumer that
62
+ any `mqb` process of your user is running on the machine, with state, current and average
63
+ rate, total, pending and uptime. On a terminal it redraws every second; `--no-watch` prints
64
+ once and `--json` prints the records. The
65
+ UI has a **Status** tab with the same rows and the last 60 seconds of each rate, and the MCP
66
+ server has a read-only `bridge_status` tool. `mqb copy` and headless config runs now report
67
+ rates and totals too. Error text stays out of these records unless
68
+ `MQB_STATUS_SHOW_ERRORS=1` is set for both the reporting and the reading process.
69
+ - **`http_bulk` reads an open stream.** `read.stream: sse` or `ndjson` sends one request and
70
+ turns every server-sent event or line of the response into a message, instead of asking
71
+ for pages. An SSE source resumes with `Last-Event-ID` from the last acknowledged event, an
72
+ NDJSON source from a field named by `cursor.item`; both save the position in
73
+ `checkpoint_store` and connect again when the response ends. With a stream,
74
+ `request_timeout_ms` is the longest silence, not the length of the response. This is the
75
+ way to consume a remote SSE feed or a one-response export; the `http` endpoint's
76
+ `receive_streamable` and `stream_response_to` are unchanged.
77
+ - **Named `http_bulk` endpoints from your own crate.** `typesense` and `elasticsearch` are
78
+ `http_bulk` configurations behind a name, and that table was closed.
79
+ `endpoints::http_bulk::register_preset_with(name, schema, resolve)` registers one of your
80
+ own as a `custom` endpoint; `preset_schema`, `preset_base_url` and `preset_segment` are the
81
+ helpers the built-in ones use.
82
+ - **Every built-in endpoint as one plugin library.** The new `plugins/full` crate builds
83
+ `libmq_bridge_full`, which registers a factory for each built-in endpoint under its own
84
+ name. A host compiled without an endpoint's feature and with this library loaded keeps
85
+ using `kafka:`, `file:` and the rest unchanged: a built-in the build has no feature for
86
+ is now served by a factory registered under the same name, and fails as before when there
87
+ is none. The library has its own engine, so `memory` channels, `ref` names and factories
88
+ registered in the host are not shared with the endpoints it creates.
89
+ - **`plugin::disable_plugin_loading()`.** After this call the process opens no plugin
90
+ library any more, neither by path nor by discovery, and there is no way to switch it back
91
+ on. `MQB_PLUGIN_DISCOVERY=0` only covers discovery and has to be set in the environment;
92
+ this is for a host that must rule out native code loaded at runtime.
93
+ - **HTTP input: `header_read_timeout_ms` and `max_body_bytes`.** The first closes an HTTP/1
94
+ connection whose request head is not complete in time, the second sets the largest request
95
+ body, also after decompression (default 256 MiB, as before). The timeout is off by default:
96
+ with `30000` set, a debug build served about 15 to 20 % fewer requests per second on a
97
+ `http` to `response` route. Set it on a listener that is reachable from an untrusted network.
98
+
99
+ ### Changed
100
+
101
+ - **CSV files read at their 0.4.15 speed again.** The quote scan that decides where a CSV
102
+ record ends had become about 15% slower in 0.4.16, when it learned to handle a record
103
+ read in pieces. It now jumps from quote to quote instead of visiting every byte, with the
104
+ same result. A 1,000,000-row CSV → JSONL copy on an Apple M1 takes 0.35 s, against 0.41 s
105
+ with 0.4.19.
106
+ - **CSV files and objects are written faster.** A row whose keys follow the header's
107
+ columns, as every row after the first usually does, is written without building a key
108
+ map first, nested objects under `nested: flatten` included. A 1,000,000-row JSONL → CSV
109
+ copy on an Apple M1 takes 1.12 s instead of 1.45 s, and 0.96 s instead of 2.03 s when
110
+ each row flattens a nested object. The output is byte-identical.
111
+ - **`mqb copy --drain` exits within 5 ms of the last row.** It noticed the end of a route by
112
+ polling every 50 ms, which added up to 50 ms to every copy, noticeable on short ones.
113
+ - **Kafka publishing no longer waits 5 ms per batch.** A Kafka output awaits the delivery of
114
+ every batch, and the producer's `linger.ms` of 5 held each batch back for that long before
115
+ sending it. The default is now 1 ms, which still sends a batch as one request per partition.
116
+ With the defaults (`batch_size: 512`, `concurrency: 1`) a local broker took about 71,000
117
+ messages per second instead of 29,000. `delayed_ack: true`, which awaits nothing, keeps
118
+ 5 ms; the producer a Kafka input uses for replies also moves to 1 ms. A
119
+ `linger.ms` in `producer_options` overrides the default as before.
120
+
121
+ ### Fixed
122
+
123
+ - `mq-bridge-app`: saving a config in `sensitive` or `durable` mode removes the secrets
124
+ that an earlier `balanced` save left in the `.env` file.
125
+ - Desktop app: the list of stored secrets keeps the keys of earlier saves, so "delete
126
+ secrets" also reaches the secret of a renamed or removed endpoint.
127
+ - **Passwords no longer appear in connect logs and error text.** The AMQP and MQTT connect
128
+ lines at INFO printed the broker URL with its password. Errors from the HTTP and WebSocket
129
+ outputs quoted it too. All now show `user:***@host`; the HTTP output's `status()` target
130
+ does the same.
131
+ - **`mqb copy` hides more credentials.** The `copy route started` line now also blanks
132
+ `basic_auth`, `custom_headers`, `headers`, API keys and the credentials of a nested endpoint
133
+ URI (`fanout:?to=…`), percent-encoded or not. Errors about a URI or a middleware spec quote
134
+ it with the same redaction instead of as typed.
135
+ - **`cookie_jar` stores every cookie of a response.** A response with several `Set-Cookie`
136
+ headers left only the last one in the jar. The HTTP output now keeps them all in the
137
+ `set-cookie` metadata, one per line, and an HTTP input that replies with that metadata
138
+ sends one header per line.
139
+ - **HTTP `stream_response_to`: a response that breaks before its first item no longer writes
140
+ to the stream.** The send already failed as retryable, but an error and an end marker went to
141
+ the stream first, so its reader saw a closed stream and a retry refilled it behind the
142
+ reader's back. Now nothing is written until the first item. A response that breaks later is
143
+ unchanged: it ends with an item marked `http_stream_error` and the send is acknowledged.
144
+ - **`postgres_cdc`: a `truncate` event no longer carries `postgres.key`.** It had `[null]`, one
145
+ `null` per key column, which a sink that deletes or upserts by key would take for a row. The
146
+ event keeps a deterministic `message_id`, also on tables without a primary key; that id
147
+ differs from the one earlier versions produced.
148
+ - **A large batch no longer fails a SQL output with an `insert_query`.** A batch that needed
149
+ more bind parameters than the database takes in one statement (65,535 on Postgres) failed
150
+ with `too many arguments for query`. It is now written as several statements in one
151
+ transaction, as `columns: auto` already did.
152
+
153
+ ## 0.4.19
154
+
155
+ CSV in more shapes: the reader takes other separators and quoting, and a CSV sink no longer
156
+ mixes JSON into its cells. The second is a behaviour change, listed below.
157
+
158
+ ### Added
159
+
160
+ - **CSV dialects.** `format: csv` took only comma-separated, `"`-quoted files with a header. A
161
+ `csv` block on the `file` endpoint and on an `object_store` source now sets `separator` (one
162
+ character, `tab`, `space`, hex, or `auto`), `quote` (a character or `none`), `header` and
163
+ `columns`. `separator: auto` is for sources and takes whichever of `,` `;` tab `|` occurs
164
+ most often outside quotes in the first record. That covers Excel's semicolon exports, TSV
165
+ from `mongoexport` and `psql`, and headerless dumps; the book's file page lists the setting
166
+ per tool. On the command line it is one parameter, `csv={"separator":"auto"}`.
167
+ `FileConfig` and `ObjectStoreConfig` gain the field `csv`, and `models` the types
168
+ `CsvConfig` and `CsvNested`; code that builds either struct without `..Default::default()`
169
+ needs the new field.
170
+ - **CSV to object storage.** An `object_store` sink rejected `format: csv`. It now writes each
171
+ batch as a CSV file with its own header, taken from that batch's first row, in the dialect
172
+ the `csv` block sets. Set `csv.columns` when every object must have the same columns.
173
+ - **A warning for short CSV rows.** A row with fewer fields than the header was read with the
174
+ missing ones empty and nothing said, which is what a wrong `separator` looks like. It is now
175
+ warned about once per process, as a row with too many fields already was.
176
+
177
+ - **`aggregate`: `on_error`, time-based averages, late-message detection, `read_only`.**
178
+ - `on_error: drop | fail | skip` says what happens to a message that cannot be folded.
179
+ `drop` is the default and what happened before: an input logs, acks and drops it, so an
180
+ HTTP caller gets `202`. `fail` nacks it instead (HTTP `500`). `skip` leaves out only the
181
+ entries that cannot be computed, runs the others, passes the message on and names the
182
+ skipped entries in the metadata `mqb.aggregate.skipped`. Before, one missing field in one
183
+ entry discarded the message for all entries.
184
+ - `ema`, `ema_stddev` and `ema_variance` take a half-life in place of `alpha`
185
+ (`ema(reading, 5m)`): a value counts half after that time, however many messages came.
186
+ The new `time` names the payload field with the event time (epoch seconds or
187
+ milliseconds, or RFC 3339); without it the clock is used.
188
+ - With `time`, a message older than the newest one its state has seen is folded without
189
+ decay and marked with the metadata `mqb.aggregate.late`. It is detected, not reordered.
190
+ - `read_only: true` reads the states from the `store` and never changes them, for a dry run
191
+ or a second route that only reads.
192
+ - The error for a missing field now says `is missing or not a number`.
193
+ - `AggregateMiddleware` gains the fields `time`, `on_error` and `read_only`, and `models`
194
+ the enum `AggregateOnError`; code that builds the struct without `..Default::default()`
195
+ needs the new fields.
196
+ - **Descriptive names for the file formats.** `format: raw` writes only the payload, which
197
+ for JSON payloads is plain JSON lines, while `format: json` writes the whole message
198
+ envelope; the names suggested the opposite. `payload`, `envelope_json`, `envelope_text`
199
+ and `envelope` are now accepted for `raw`, `json`, `text` and `normal`, on `file`,
200
+ `object_store` and `mongodb`. The old names keep working and are what is written back.
201
+ - **`mqb copy`: pipes, `--limit`, progress, compression by file name.**
202
+ - `-` is stdin as the source and stdout as the target (`-?format=csv` takes parameters). A
203
+ `file` source on a pipe, FIFO or terminal is read once without seeking, and its end ends
204
+ the copy, with or without `--drain`. Before, `file:///dev/stdin` failed with `Illegal seek`.
205
+ With stdout as the target the `copied …` summary goes to stderr.
206
+ - `--limit N` stops after `N` rows reached the destination; with `--filter`, `N` matching rows.
207
+ - On a terminal, a running row count is shown on stderr every two seconds.
208
+ - A `file://` path ending in `.gz`, `.zst` or `.lz4` sets `compression`; `compression=none`
209
+ overrides. A sink named `out.jsonl.gz` used to be written uncompressed.
210
+ - A copy without `--drain` now exits when its route ends by itself, on a permanent error or
211
+ the end of a stream. It used to wait for Ctrl-C.
212
+ - **SQL sink: `columns: auto` and `key`.** A SQL sink could write a record's fields into columns
213
+ only through a hand-written `insert_query`, percent-encoded on the command line, and an upsert
214
+ needed its own `ON CONFLICT` clause. With `columns: auto` each top-level JSON field goes into
215
+ the table column of the same name, and `key: id` turns the insert into an upsert, so
216
+ `mqb copy --from 'postgres://…?table=orders&cursor_column=id' --to 'postgres://…?table=orders&columns=auto&key=id'`
217
+ copies a table and can be rerun.
218
+ - The table must exist. A column a record does not name keeps its default (insert) or its
219
+ value (update). A field without a column is not written and is logged once; with
220
+ `extra_column: <name>` those fields go into that column as one JSON object.
221
+ - PostgreSQL casts each value to the column type, so `numeric`, `timestamptz`, `uuid`,
222
+ `jsonb`, enum and array columns take the text a SQL or CSV source delivers.
223
+ - `bulk_copy` works with `columns: auto`, not with `key`. `columns` cannot be combined with
224
+ `insert_query` or `auto_create_table`.
225
+ - `SqlxConfig` gains the fields `columns`, `key` and `extra_column`, and `models` the type `SqlColumns`.
226
+ - **SQL source: `timestamps: rfc3339`.** A Postgres `timestamptz` column is read in Postgres's
227
+ text form, `2026-10-04 09:15:23.923277+00`, which few other systems parse. With
228
+ `timestamps: rfc3339` a `cursor_column` source renders it in UTC as
229
+ `2026-10-04T09:15:23.923277Z`; a `timestamp` without zone gets the `T` and no offset. The
230
+ default is unchanged. `SqlxConfig` gains the field `timestamps` and `models` the type
231
+ `SqlTimestamps`.
232
+
233
+ ### Behaviour changes
234
+
235
+ - **`aggregate`: states in memory only are opt-in.** An `aggregate` without
236
+ a `store` kept its states in the process, lost on restart and wrong with two instances, and
237
+ that was the default. It now needs `consistency: single_writer` next to it; with neither a
238
+ `store` nor that, the route fails to start with an error naming both. Add
239
+ `consistency: single_writer` to a config from 0.4.17 or 0.4.18 that has no `store` to keep
240
+ what it did.
241
+ - **A CSV sink flattens nested objects.** A nested object used to be written as JSON text in
242
+ one cell, so the output of `aggregate` (`{"stats":{"n":3,"avg":2.5}}`) came out as a mix of
243
+ CSV and JSON. It now becomes one column per leaf, named by its path: `stats.n`, `stats.avg`.
244
+ **A new file gets different columns than before; a file that already has a header keeps
245
+ it.** Set `csv.nested: json` for the previous output. Arrays are still written as JSON text.
246
+ - **A drain does not wait for an endpoint.** With `exit_on_empty` (`mqb copy --drain`) a route
247
+ that failed reconnected up to ten times, 5 s apart, before it gave up: about 50 s against a
248
+ closed port, a WebSocket path that answers 404, a NATS subject outside every stream or a gRPC
249
+ topic nobody serves. It now ends on the first failure when nothing has been delivered yet,
250
+ with the endpoint's error. A drain that has delivered something keeps the ten reconnects, so
251
+ a short outage in the middle of a long copy does not end it. Routes without `exit_on_empty`
252
+ reconnect without limit, as before. Add a `retry` middleware to a drain that should wait for
253
+ its sink.
254
+ - **A CSV file that ends inside a quoted field fails a drain.** The reader took everything
255
+ after the open quote as one field and reported success. A drain now writes the records before
256
+ it and fails, naming the byte offset of the open record; a tailing route waits for the writer
257
+ to finish the record.
258
+ - **Blank lines in a line-based file are skipped.** `raw`, `json`, `text` and `normal` sources
259
+ emitted an empty line as a message with an empty payload, which a SQL or Parquet sink then
260
+ rejected. The CSV reader already skipped them. Row counts change for files with blank lines.
261
+ - **A `file` route whose source and sink are the same path is refused.** It doubled the file
262
+ under a drain and would grow it without end otherwise.
263
+ - **SQLite `has no column named` is not retried.** A sink writing to a table without the
264
+ expected columns retried for ever; it is now a non-retryable error like the same case on
265
+ Postgres and MySQL.
266
+ - **An `object_store` source on a local path that does not exist fails a drain.** It reported
267
+ `copied 0 rows`. An empty directory or cloud prefix still does. A drain of a local path also
268
+ ends after one listing instead of waiting out the idle interval.
269
+ - **NATS: a missing `subject` or `stream` stops the route.** It was retried as a connection
270
+ error until the start timeout.
271
+ - **Clearer errors and quieter logs.** A queue read on a plain SQL table names
272
+ `cursor_column`; Postgres errors no longer end in `at line N` (a line of the server's source);
273
+ a closed database port reports `Connection refused` at once; a `filter` that does not compile
274
+ lists the operators, and one with a single `=` says so; a gRPC server names the topic it has
275
+ no consumer for; the drop summary counts messages per cause; an unknown `aggregate` field
276
+ lists the built-ins; `csv` settings without `format: csv` and an `insert_query` token that
277
+ binds NULL each warn once. The WebSocket "falling back to routed mode" line is now DEBUG and
278
+ the MQTT note on restart loss INFO.
279
+
280
+ ### Fixed
281
+
282
+ - **`mqb copy --wait` reports a failed route at once.** A route that failed before it delivered
283
+ anything was retried until the wait ran out, and a later empty attempt could then report
284
+ success. `--wait` now retries only a drain that ended cleanly with nothing to copy.
285
+ - **`aggregate` with a shared `store` no longer keeps the state of a message it rejects.** A
286
+ message whose result had no place in the payload (`into: a.b` where `a` is not an object) was
287
+ counted in the store and then failed, so under `on_error: fail` every redelivery counted it
288
+ again. It now fails before any state changes, as it already did without a shared store.
289
+
5
290
  ## 0.4.18
6
291
 
7
292
  A new generic output for search engines, plus documentation and packaging work. This release
@@ -231,7 +516,7 @@ Each of these changes what an existing setup sees. Check them before upgrading.
231
516
  SOURCE, TARGET and `--filter` of a `copy --resume` job. `reset` prints the old value so
232
517
  `set --value` can undo it. Works for SQL, ClickHouse and object-store cursor readers and
233
518
  MongoDB change streams; Postgres CDC is refused, its slot is authoritative. See
234
- [Checkpoints](apps/mq-bridge-app/dev/docs/cookbook/checkpoints.md#inspecting-and-editing-a-checkpoint).
519
+ [Checkpoints](docs/book/cookbook/checkpoints.md#inspecting-and-editing-a-checkpoint).
235
520
  - **`CheckpointStore::clear`**, implemented for the file, SQL, MongoDB and object-store
236
521
  backends. The default returns an error, so existing implementations still compile.
237
522