mq-bridge-basic 0.4.19__tar.gz → 1.0.0__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 (420) hide show
  1. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.dockerignore +1 -1
  2. mq_bridge_basic-1.0.0/.gitattributes +1 -0
  3. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/dependabot.yml +2 -1
  4. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/app.yml +39 -23
  5. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/benchmark.yml +2 -1
  6. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/ci.yml +57 -0
  7. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/docs.yml +13 -9
  8. mq_bridge_basic-1.0.0/.github/workflows/examples.yml +62 -0
  9. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/publish-python.yml +11 -4
  10. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/release.yml +114 -1
  11. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/AGENTS.md +2 -2
  12. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/CHANGELOG.md +993 -1
  13. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/Cargo.lock +213 -156
  14. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/Cargo.toml +57 -30
  15. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/PKG-INFO +1 -1
  16. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/README.md +28 -11
  17. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/THIRD_PARTY_LICENSES.txt +517 -408
  18. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/benches/csv_to_json_bench.rs +2 -2
  19. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/benches/performance_bench.rs +2 -1
  20. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/bindings-common/Cargo.toml +1 -1
  21. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/bindings-common/src/lib.rs +31 -10
  22. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/build.rs +2 -1
  23. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/ARCHITECTURE.md +5 -1
  24. mq_bridge_basic-1.0.0/docs/CAPABILITIES.md +201 -0
  25. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/CONFIGURATION.md +77 -12
  26. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/DELIVERY.md +51 -20
  27. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/EXTENDING.md +1 -1
  28. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/GRPC.md +5 -0
  29. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/PLUGINS.md +51 -3
  30. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/REFERENCE.md +142 -20
  31. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/THIRD_PARTY_LICENSES.md +9 -1
  32. mq_bridge_basic-1.0.0/examples/c-library/publish.c +40 -0
  33. mq_bridge_basic-1.0.0/examples/c-library/smoke.c +371 -0
  34. mq_bridge_basic-1.0.0/examples/postgres-cdc-to-qdrant/README.md +56 -0
  35. mq_bridge_basic-1.0.0/examples/postgres-cdc-to-qdrant/docker-compose.yml +53 -0
  36. mq_bridge_basic-1.0.0/examples/postgres-cdc-to-qdrant/init.sql +11 -0
  37. mq_bridge_basic-1.0.0/examples/postgres-cdc-to-qdrant/routes.yaml +53 -0
  38. mq_bridge_basic-1.0.0/examples/postgres-cdc-to-qdrant/search.sh +16 -0
  39. mq_bridge_basic-1.0.0/examples/postgres-cdc-to-qdrant/test.sh +43 -0
  40. mq_bridge_basic-1.0.0/examples/transactional-outbox/README.md +49 -0
  41. mq_bridge_basic-1.0.0/examples/transactional-outbox/consume.sh +6 -0
  42. mq_bridge_basic-1.0.0/examples/transactional-outbox/docker-compose.yml +38 -0
  43. mq_bridge_basic-1.0.0/examples/transactional-outbox/init.sql +17 -0
  44. mq_bridge_basic-1.0.0/examples/transactional-outbox/routes.yaml +17 -0
  45. mq_bridge_basic-1.0.0/examples/transactional-outbox/test.sh +50 -0
  46. mq_bridge_basic-1.0.0/include/mq_bridge.h +252 -0
  47. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/llms.txt +4 -0
  48. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/mq-bridge.schema.json +4863 -3998
  49. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/mq_bridge/config.py +26 -0
  50. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/mq_bridge/config.pyi +128 -2
  51. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/Cargo.toml +1 -1
  52. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/THIRD_PARTY_LICENSES.txt +517 -408
  53. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/IBM_MQ.md +1 -1
  54. mq_bridge_basic-1.0.0/rustfmt.toml +3 -0
  55. mq_bridge_basic-1.0.0/scripts/ci/check_third_party_notices.sh +41 -0
  56. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/sync-version.mjs +1 -0
  57. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/canonical_message.rs +44 -1
  58. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/checkpoint.rs +95 -23
  59. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/config_file.rs +56 -18
  60. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/amqp.rs +242 -101
  61. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/aws.rs +273 -73
  62. mq_bridge_basic-1.0.0/src/endpoints/capabilities.rs +647 -0
  63. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/clickhouse.rs +498 -99
  64. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/dir_spool/mod.rs +245 -50
  65. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/dir_spool/tests.rs +191 -0
  66. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/file/csv_dialect.rs +15 -1
  67. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/file/mod.rs +533 -116
  68. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/file/tests.rs +513 -3
  69. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/grpc/consumer.rs +105 -81
  70. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/grpc/mod.rs +19 -2
  71. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/grpc/server.rs +11 -1
  72. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/grpc/tests.rs +222 -1
  73. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/http/mod.rs +138 -182
  74. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/http/publisher.rs +59 -9
  75. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/http/stream.rs +73 -131
  76. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/http/tests.rs +662 -42
  77. mq_bridge_basic-1.0.0/src/endpoints/http_bulk/consumer.rs +1338 -0
  78. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/http_bulk/mod.rs +51 -13
  79. mq_bridge_basic-1.0.0/src/endpoints/http_bulk/presets.rs +1390 -0
  80. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/http_bulk/publisher.rs +168 -16
  81. mq_bridge_basic-1.0.0/src/endpoints/http_bulk/query.rs +764 -0
  82. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/ibm_mq.rs +137 -41
  83. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/kafka.rs +315 -39
  84. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/memory/endpoint.rs +34 -2
  85. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/memory/framed.rs +1 -1
  86. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/memory/ipc_unix.rs +179 -59
  87. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/memory/transport.rs +6 -1
  88. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mod.rs +492 -47
  89. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mongodb/aggregate.rs +6 -3
  90. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mongodb/consumer.rs +6 -2
  91. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mongodb/dedup.rs +25 -3
  92. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mongodb/mod.rs +66 -20
  93. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mongodb/publisher.rs +71 -144
  94. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mongodb/readers.rs +350 -200
  95. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mongodb/tests.rs +153 -13
  96. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/mqtt.rs +109 -14
  97. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/nats.rs +255 -150
  98. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/object_store.rs +266 -77
  99. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/VENDORED.md +18 -0
  100. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/mod.rs +369 -45
  101. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/pgoutput/values.rs +2 -2
  102. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/replication.rs +187 -59
  103. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/redis_streams.rs +241 -53
  104. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/sled.rs +116 -28
  105. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/sqlx/aggregate.rs +6 -3
  106. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/sqlx/columns.rs +58 -4
  107. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/sqlx/dedup.rs +26 -3
  108. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/sqlx/mod.rs +468 -210
  109. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/sqlx/tests.rs +262 -0
  110. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/fanout.rs +68 -11
  111. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/reader.rs +46 -6
  112. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/request.rs +113 -17
  113. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/sequence.rs +268 -15
  114. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/stream_buffer.rs +15 -21
  115. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/switch.rs +160 -3
  116. mq_bridge_basic-1.0.0/src/endpoints/websocket.rs +1589 -0
  117. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/zeromq/codec.rs +20 -1
  118. mq_bridge_basic-1.0.0/src/endpoints/zeromq/mod.rs +403 -0
  119. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/zeromq/omq.rs +5 -2
  120. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/zeromq/zmq.rs +259 -205
  121. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/errors.rs +29 -3
  122. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/event_store.rs +41 -2
  123. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/lib.rs +23 -7
  124. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/buffer.rs +182 -23
  125. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/compression.rs +176 -27
  126. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/cookie_jar.rs +34 -7
  127. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/deduplication/memory.rs +17 -0
  128. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/deduplication.rs +281 -28
  129. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/deferred_commit.rs +106 -9
  130. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/dlq.rs +125 -8
  131. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/encryption.rs +135 -15
  132. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/filter.rs +109 -17
  133. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/limiter.rs +11 -5
  134. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/lookup.rs +81 -10
  135. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/metrics.rs +71 -0
  136. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/mod.rs +214 -15
  137. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/pack.rs +52 -13
  138. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/random_panic.rs +117 -0
  139. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/retry.rs +100 -2
  140. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/timeout.rs +51 -0
  141. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/weak_join.rs +136 -12
  142. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/models/builders.rs +455 -5
  143. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/models/defaults.rs +20 -0
  144. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/models/secrets.rs +336 -7
  145. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/models/serde_support.rs +103 -1
  146. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/models/tests.rs +276 -1
  147. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/models.rs +514 -52
  148. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/completion.rs +53 -9
  149. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/conformance.rs +54 -2
  150. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/crash.rs +47 -7
  151. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/discovery.rs +7 -2
  152. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/endpoint.rs +105 -9
  153. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/middleware.rs +359 -5
  154. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/mod.rs +79 -6
  155. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/sdk.rs +144 -22
  156. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/publisher.rs +107 -5
  157. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/response.rs +9 -2
  158. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/route.rs +679 -101
  159. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/shutdown.rs +2 -3
  160. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/config_schema.rs +14 -1
  161. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/crypto.rs +2 -2
  162. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/crypto_envelope.rs +1 -0
  163. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/interpolation.rs +4 -7
  164. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/mod.rs +27 -0
  165. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/pack.rs +16 -0
  166. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/parallel.rs +7 -0
  167. mq_bridge_basic-1.0.0/src/support/redact.rs +125 -0
  168. mq_bridge_basic-1.0.0/src/support/sse.rs +74 -0
  169. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/stream_batch.rs +14 -1
  170. mq_bridge_basic-1.0.0/src/support/tls.rs +196 -0
  171. mq_bridge_basic-1.0.0/src/support/tls_check.rs +122 -0
  172. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/test_utils.rs +3 -0
  173. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/traits.rs +82 -10
  174. mq_bridge_basic-1.0.0/tests/full_plugin_fallback_test.rs +49 -0
  175. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/amqp.rs +69 -17
  176. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/aws.rs +51 -0
  177. mq_bridge_basic-1.0.0/tests/integration/contract.rs +320 -0
  178. mq_bridge_basic-1.0.0/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  179. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
  180. mq_bridge_basic-1.0.0/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  181. mq_bridge_basic-1.0.0/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  182. mq_bridge_basic-1.0.0/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  183. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/http.rs +4 -4
  184. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/http_tls.rs +1 -1
  185. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/ibm_mq.rs +103 -0
  186. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/kafka.rs +11 -6
  187. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/mod.rs +1 -0
  188. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/mongodb.rs +321 -6
  189. mq_bridge_basic-1.0.0/tests/integration/mongodb_raw.rs +58 -0
  190. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/mqtt.rs +45 -0
  191. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/object_store.rs +8 -5
  192. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/postgres.rs +83 -0
  193. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/postgres_cdc.rs +222 -0
  194. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/redis_streams.rs +136 -0
  195. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/route.rs +23 -13
  196. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/sqlite.rs +0 -5
  197. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration_test.rs +101 -0
  198. mq_bridge_basic-1.0.0/tests/plugin_loading_latch_test.rs +28 -0
  199. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/reference_docs_test.rs +3 -3
  200. mq_bridge_basic-0.4.19/benches/ETL_BENCHMARKS.md +0 -85
  201. mq_bridge_basic-0.4.19/src/endpoints/http_bulk/consumer.rs +0 -710
  202. mq_bridge_basic-0.4.19/src/endpoints/http_bulk/presets.rs +0 -776
  203. mq_bridge_basic-0.4.19/src/endpoints/http_bulk/query.rs +0 -429
  204. mq_bridge_basic-0.4.19/src/endpoints/websocket.rs +0 -837
  205. mq_bridge_basic-0.4.19/src/endpoints/zeromq/mod.rs +0 -106
  206. mq_bridge_basic-0.4.19/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  207. mq_bridge_basic-0.4.19/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  208. mq_bridge_basic-0.4.19/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  209. mq_bridge_basic-0.4.19/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  210. mq_bridge_basic-0.4.19/tests/integration/mongodb_raw.rs +0 -62
  211. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.cargo/config.toml +0 -0
  212. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.coderabbit.yaml +0 -0
  213. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  214. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  215. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  216. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/build-node.yml +0 -0
  217. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/conda.yml +0 -0
  218. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/ibm-mq.yml +0 -0
  219. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/node.yml +0 -0
  220. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/publish-node.yml +0 -0
  221. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/python.yml +0 -0
  222. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.github/workflows/test-matrix.yml +0 -0
  223. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.gitignore +0 -0
  224. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/.justfile +0 -0
  225. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/CLAUDE.md +0 -0
  226. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/CONTRIBUTING.md +0 -0
  227. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/LICENSE +0 -0
  228. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/LICENSE-APACHE +0 -0
  229. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/LICENSE-APACHE.python +0 -0
  230. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/LICENSE-MIT +0 -0
  231. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/LICENSE-MIT.python +0 -0
  232. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/LICENSE.python +0 -0
  233. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/SECURITY.md +0 -0
  234. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/benches/middleware_expr_bench.rs +0 -0
  235. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/benches/pack_bench.rs +0 -0
  236. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/benches/router_bench.rs +0 -0
  237. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/benches/zeromq_backends.rs +0 -0
  238. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/bindings-common/src/logging.rs +0 -0
  239. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/deny.toml +0 -0
  240. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/docs/assets/copy-demo.png +0 -0
  241. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/c-plugin/CMakeLists.txt +0 -0
  242. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/c-plugin/README.md +0 -0
  243. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/c-plugin/legacy_ledger.c +0 -0
  244. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/c-plugin/legacy_ledger.h +0 -0
  245. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/c-plugin/legacy_parser.c +0 -0
  246. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/c-plugin/legacy_parser.h +0 -0
  247. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/c-plugin/minimal.c +0 -0
  248. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/c-plugin/plugin.c +0 -0
  249. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/examples/ipc_worker_queue.yaml +0 -0
  250. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/include/cbindgen.toml +0 -0
  251. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/include/mq_bridge_plugin.h +0 -0
  252. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/include/mq_bridge_plugin_helpers.h +0 -0
  253. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/mq_bridge/__init__.py +0 -0
  254. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/mq_bridge/__init__.pyi +0 -0
  255. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/mq_bridge/plugin_packaging.py +0 -0
  256. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/mq_bridge/py.typed +0 -0
  257. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/package-lock.json +0 -0
  258. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/pyproject.toml +0 -0
  259. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/LICENSE-APACHE.python +0 -0
  260. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/LICENSE-MIT.python +0 -0
  261. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/LICENSE.python +0 -0
  262. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/README.md +0 -0
  263. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
  264. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/example.py +0 -0
  265. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/bench_memory.py +0 -0
  266. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
  267. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/consume_pull.py +0 -0
  268. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/dlt_source.py +0 -0
  269. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/ibm-mq-input.py +0 -0
  270. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/json_route.py +0 -0
  271. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/memory.yaml +0 -0
  272. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/examples/raw_route.py +0 -0
  273. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/pyproject-basic.toml +0 -0
  274. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/pyproject-reduced.toml +0 -0
  275. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
  276. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/src/lib.rs +0 -0
  277. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_config_types.py +0 -0
  278. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_custom_endpoint.py +0 -0
  279. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_logging.py +0 -0
  280. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_packaging.py +0 -0
  281. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
  282. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_plugin_package.py +0 -0
  283. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_public_api.py +0 -0
  284. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_routes.py +0 -0
  285. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/tests/test_shutdown.py +0 -0
  286. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/python/mq-bridge-py/uv.lock +0 -0
  287. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/analysis/benches/metadata_bench.rs +0 -0
  288. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
  289. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
  290. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/analysis/http/http_flamegraph.py +0 -0
  291. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
  292. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/analysis/http/run_http_ladder.sh +0 -0
  293. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/ci/format_bench_output.sh +0 -0
  294. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/httparena/README.md +0 -0
  295. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
  296. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
  297. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
  298. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/httparena/frameworks/mq-bridge-py/templates/fortunes.html +0 -0
  299. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/mqb-agent.py +0 -0
  300. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
  301. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
  302. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
  303. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
  304. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/techempower/README.md +0 -0
  305. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/techempower/postgres.yml +0 -0
  306. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/techempower/seed.sql +0 -0
  307. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/techempower/verify.sh +0 -0
  308. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/the-benchmarker/README.md +0 -0
  309. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
  310. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
  311. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
  312. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/command_handler.rs +0 -0
  313. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/grpc/dynamic.rs +0 -0
  314. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/grpc/proto/mqbridge/bridge.proto +0 -0
  315. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/grpc/publisher.rs +0 -0
  316. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/http_bulk/auth.rs +0 -0
  317. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/memory/ipc_windows.rs +0 -0
  318. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/memory/memory_transport.rs +0 -0
  319. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/memory/mod.rs +0 -0
  320. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/poll.rs +0 -0
  321. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/pgoutput/decoder.rs +0 -0
  322. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/pgoutput/messages.rs +0 -0
  323. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/pgoutput/mod.rs +0 -0
  324. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/pgoutput/registry.rs +0 -0
  325. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/postgres/state.rs +0 -0
  326. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/mod.rs +0 -0
  327. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/null.rs +0 -0
  328. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/response.rs +0 -0
  329. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/endpoints/structural/static_endpoint.rs +0 -0
  330. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/event_handler.rs +0 -0
  331. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/extensions.rs +0 -0
  332. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/aggregate/mod.rs +0 -0
  333. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/aggregate/states.rs +0 -0
  334. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/aggregate/store.rs +0 -0
  335. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/aggregate/tests.rs +0 -0
  336. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/aggregate/writer.rs +0 -0
  337. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/delay.rs +0 -0
  338. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/id.rs +0 -0
  339. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/otel.rs +0 -0
  340. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/raw_json.rs +0 -0
  341. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/transform/coerce.rs +0 -0
  342. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/transform/compiled.rs +0 -0
  343. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/transform/error.rs +0 -0
  344. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/transform/mod.rs +0 -0
  345. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/transform/path.rs +0 -0
  346. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/transform/schema.rs +0 -0
  347. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/middleware/transform/tests.rs +0 -0
  348. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/outcomes.rs +0 -0
  349. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/forward.rs +0 -0
  350. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/host.rs +0 -0
  351. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/message.rs +0 -0
  352. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/plugin/test_support.rs +0 -0
  353. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/base64_engine.rs +0 -0
  354. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/change_op.rs +0 -0
  355. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/compression.rs +0 -0
  356. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/compression_pool.rs +0 -0
  357. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/connection_registry.rs +0 -0
  358. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/http_status.rs +0 -0
  359. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/lookup_batch.rs +0 -0
  360. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/ndjson.rs +0 -0
  361. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/parquet.rs +0 -0
  362. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/plugin_abi.rs +0 -0
  363. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/poll_job.rs +0 -0
  364. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/support/source_ranges.rs +0 -0
  365. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/src/type_handler.rs +0 -0
  366. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/README.md +0 -0
  367. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/armature_integration.rs +0 -0
  368. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/compat/python/bridge_client.py +0 -0
  369. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/dedup_store_bench.rs +0 -0
  370. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/delivery_guarantee_test.rs +0 -0
  371. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/clickhouse.rs +0 -0
  372. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/config.toml +0 -0
  373. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/amqp.yml +0 -0
  374. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/aws.yml +0 -0
  375. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/clickhouse.yml +0 -0
  376. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/ibm_mq.yml +0 -0
  377. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
  378. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/kafka-tls.yml +0 -0
  379. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/kafka.yml +0 -0
  380. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mariadb.yml +0 -0
  381. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
  382. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
  383. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mongodb.yml +0 -0
  384. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mosquitto.conf +0 -0
  385. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
  386. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
  387. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mq_init.mqsc +0 -0
  388. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
  389. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mqtt.yml +0 -0
  390. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
  391. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/mysql.yml +0 -0
  392. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/nats.yml +0 -0
  393. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/object_store.yml +0 -0
  394. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/postgres.yml +0 -0
  395. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/postgres_cdc.yml +0 -0
  396. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/docker-compose/redis.yml +0 -0
  397. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/file.rs +0 -0
  398. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/grpc.rs +0 -0
  399. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/grpc_tls.rs +0 -0
  400. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/ibm_mq_tls.rs +0 -0
  401. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/ipc.rs +0 -0
  402. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/kafka_tls.rs +0 -0
  403. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/logic_test.rs +0 -0
  404. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/mariadb.rs +0 -0
  405. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/memory.rs +0 -0
  406. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/mongodb_tls.rs +0 -0
  407. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/mysql.rs +0 -0
  408. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/nats.rs +0 -0
  409. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/performance_static.rs +0 -0
  410. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/scripts/gen_certs.sh +0 -0
  411. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/tls_helpers.rs +0 -0
  412. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/websocket.rs +0 -0
  413. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/integration/zeromq.rs +0 -0
  414. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/memory_leak_test.rs +0 -0
  415. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/otel_test.rs +0 -0
  416. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/ref_test.rs +0 -0
  417. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/sqlite_test.rs +0 -0
  418. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/tls_example.rs +0 -0
  419. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/tests/unit_tests.md +0 -0
  420. {mq_bridge_basic-0.4.19 → mq_bridge_basic-1.0.0}/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
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -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
@@ -262,18 +266,14 @@ jobs:
262
266
  path: docker-suite
263
267
  retention-days: 1
264
268
 
265
- # One backend per runner, so the servers never compete for memory or for the
266
- # fixed host ports the test URIs use. `run_docker_tests.sh` does the same loop
267
- # locally, one at a time.
269
+ # One backend at a time on one runner, so the servers never compete for memory
270
+ # or for the fixed host ports the test URIs use. `run_docker_tests.sh` does the
271
+ # same loop locally. Nine runners for ~20 s of tests each held slots the rest
272
+ # of the workflows were queuing for.
268
273
  docker:
269
- name: App docker (${{ matrix.backend }})
274
+ name: App docker
270
275
  runs-on: ubuntu-latest
271
276
  needs: docker-build
272
- strategy:
273
- fail-fast: false
274
- matrix:
275
- backend:
276
- [postgres, mysql, mariadb, kafka, nats, mongodb, redis, amqp, mqtt]
277
277
  steps:
278
278
  - uses: actions/checkout@v7
279
279
 
@@ -294,28 +294,44 @@ jobs:
294
294
  chmod +x "$cli" docker-suite/test-binary
295
295
 
296
296
  - name: Install runtime libraries
297
+ timeout-minutes: 5
297
298
  run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev zlib1g-dev
298
299
 
299
300
  # The engine's own integration stacks, so there is one definition per
300
301
  # service rather than a second copy that can drift.
301
- - name: Start ${{ matrix.backend }}
302
- run: docker compose -f tests/integration/docker-compose/${{ matrix.backend }}.yml up -d --wait --wait-timeout 300
303
-
302
+ #
304
303
  # The backend name filters the test names as well as MQB_TEST_BACKEND:
305
304
  # `backend!` skips by returning, so without the name filter every excluded
306
305
  # test still reports `ok` and a broken service would look green.
307
- - name: Run ${{ matrix.backend }} tests
306
+ #
307
+ # A failing backend does not stop the loop; the step fails at the end and
308
+ # names every backend that failed.
309
+ - name: Run the backends one after another
310
+ timeout-minutes: 45
308
311
  # `shell: bash` for pipefail: the default shell would take `tee`'s exit
309
312
  # status and report a failing test run as a pass.
310
313
  shell: bash
311
- env:
312
- MQB_TEST_BACKEND: ${{ matrix.backend }}
313
314
  run: |
314
- ./docker-suite/test-binary \
315
- --ignored --test-threads=1 ${{ matrix.backend }} 2>&1 | tee result.log
316
- grep -qE 'test result: ok\. [1-9]' result.log \
317
- || { echo "no ${{ matrix.backend }} tests ran"; exit 1; }
318
-
319
- - name: Service logs
320
- if: failure()
321
- run: docker compose -f tests/integration/docker-compose/${{ matrix.backend }}.yml logs --tail 200
315
+ failed=()
316
+ for backend in postgres mysql mariadb kafka nats mongodb redis amqp mqtt; do
317
+ compose="tests/integration/docker-compose/$backend.yml"
318
+ echo "::group::$backend"
319
+ ok=1
320
+ docker compose -f "$compose" up -d --wait --wait-timeout 300 || ok=0
321
+ if [ "$ok" = 1 ]; then
322
+ MQB_TEST_BACKEND="$backend" ./docker-suite/test-binary \
323
+ --ignored --test-threads=1 "$backend" 2>&1 | tee result.log || ok=0
324
+ grep -qE 'test result: ok\. [1-9]' result.log \
325
+ || { echo "no $backend tests ran"; ok=0; }
326
+ fi
327
+ if [ "$ok" = 0 ]; then
328
+ failed+=("$backend")
329
+ docker compose -f "$compose" logs --tail 200 || true
330
+ fi
331
+ docker compose -f "$compose" down -v --remove-orphans || true
332
+ echo "::endgroup::"
333
+ done
334
+ if [ "${#failed[@]}" -gt 0 ]; then
335
+ echo "::error::failed backends: ${failed[*]}"
336
+ exit 1
337
+ fi
@@ -1,8 +1,9 @@
1
1
  name: Benchmark
2
2
 
3
3
  on:
4
+ # Not on `dev`: benchmarks are no gate, and the nightly run records the trend.
4
5
  push:
5
- branches: [main, dev]
6
+ branches: [main]
6
7
  schedule:
7
8
  # Nightly full benchmark run (04:00 UTC)
8
9
  - cron: '0 4 * * *'
@@ -86,6 +86,32 @@ jobs:
86
86
  exit 1
87
87
  fi
88
88
 
89
+ # The Rust versions the README promises, with the checked-in lock.
90
+ msrv:
91
+ name: MSRV (${{ matrix.toolchain }})
92
+ runs-on: ubuntu-latest
93
+ strategy:
94
+ fail-fast: false
95
+ matrix:
96
+ include:
97
+ - toolchain: "1.89.0"
98
+ features: "file,dir-spool,middleware,yaml,plugin,mongodb,kafka,amqp,nats,mqtt,http,zeromq,redis-streams,sled,grpc,clickhouse,http-bulk,websocket,object-store,parquet,avro,rustls-aws-lc,ibm-mq"
99
+ - toolchain: "1.94.1"
100
+ features: "full"
101
+ steps:
102
+ - uses: actions/checkout@v7
103
+
104
+ - name: Install Rust toolchain
105
+ uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
106
+ with:
107
+ toolchain: ${{ matrix.toolchain }}
108
+
109
+ - name: Cache cargo build
110
+ uses: Swatinem/rust-cache@v2
111
+
112
+ - name: Check with the minimum Rust version
113
+ run: cargo check --lib --locked --features ${{ matrix.features }}
114
+
89
115
  # Unit tests
90
116
  test:
91
117
  name: Test
@@ -120,6 +146,11 @@ jobs:
120
146
  - name: C plugin header is current and a C plugin loads
121
147
  run: cargo test -p mq-bridge-plugin-fixture --test plugin_c_header --test plugin_c_abi
122
148
 
149
+ - name: C library header is current and a C program links and runs
150
+ run: cargo test -p mq-bridge-c --no-default-features
151
+ env:
152
+ MQB_C_ASAN: "1" # AddressSanitizer; on Linux it also fails on leaks
153
+
123
154
  - name: Memory leak soak (route commit-task JoinSet)
124
155
  run: cargo test --test memory_leak_test --features=full -- --ignored --nocapture
125
156
 
@@ -278,6 +309,27 @@ jobs:
278
309
  - name: Build documentation (deny warnings)
279
310
  run: RUSTDOCFLAGS="-D warnings" cargo doc --features lint-all --no-deps
280
311
 
312
+ # Public Rust API against the latest release on crates.io: a change that breaks a
313
+ # downstream crate needs a major version. A new config field or enum variant
314
+ # needs a minor one; Cargo.toml sets that under `cargo-semver-checks.lints`.
315
+ semver:
316
+ name: SemVer
317
+ runs-on: ubuntu-latest
318
+ steps:
319
+ - uses: actions/checkout@v7
320
+
321
+ - name: Install Rust toolchain
322
+ uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
323
+
324
+ # Not a gate until it has passed once; see production-review-decisions-4.md, 4-7.
325
+ - name: Check semver
326
+ continue-on-error: true
327
+ uses: obi1kenobi/cargo-semver-checks-action@v2
328
+ with:
329
+ package: mq-bridge
330
+ feature-group: only-explicit-features
331
+ features: full,plugin-sdk
332
+
281
333
  # Supply chain: licenses, banned crates, source registries, RustSec advisories
282
334
  supply-chain:
283
335
  name: Supply Chain
@@ -296,6 +348,11 @@ jobs:
296
348
  with:
297
349
  command: check bans licenses sources
298
350
 
351
+ # cargo-deny approves licenses; this checks the shipped notice files name
352
+ # every crate that ends up in a release artifact.
353
+ - name: Third-party notices list every shipped crate
354
+ run: scripts/ci/check_third_party_notices.sh
355
+
299
356
  # Informational: every current advisory is in a transitive dependency we
300
357
  # cannot upgrade ourselves, and RustSec updates daily. SECURITY.md records
301
358
  # the per-feature reachability analysis; deny.toml carries the reasoning.
@@ -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
@@ -24,11 +24,12 @@ on:
24
24
  workflow_dispatch:
25
25
  inputs:
26
26
  target:
27
- description: "Where to publish the packages"
27
+ description: "Where to publish the packages (build-only uploads nothing)"
28
28
  required: true
29
- default: "testpypi"
29
+ default: "build-only"
30
30
  type: choice
31
31
  options:
32
+ - build-only
32
33
  - testpypi
33
34
  - pypi
34
35
 
@@ -200,8 +201,14 @@ jobs:
200
201
  # cmake. manylinux containers already ship it; the musllinux (Alpine)
201
202
  # container does not, so install it there. Guarded so it's a no-op
202
203
  # wherever cmake is already present. Only runs for linux builds.
204
+ # full's `kafka-ssl` builds OpenSSL, whose Configure needs perl modules
205
+ # (IPC::Cmd, ...) the manylinux image leaves out.
203
206
  before-script-linux: |
204
- command -v cmake >/dev/null 2>&1 || apk add --no-cache cmake gcc g++ make musl-dev perl
207
+ if command -v apk >/dev/null 2>&1; then
208
+ command -v cmake >/dev/null 2>&1 || apk add --no-cache cmake gcc g++ make musl-dev perl
209
+ elif command -v yum >/dev/null 2>&1; then
210
+ yum install -y perl-core || yum install -y perl perl-IPC-Cmd
211
+ fi
205
212
 
206
213
  - name: Upload wheels
207
214
  uses: actions/upload-artifact@v7
@@ -256,7 +263,7 @@ jobs:
256
263
  # Direct runs only. Publishing from here under release.yml authenticates
257
264
  # (PyPI matches the reusable workflow) but the attestation is signed with the
258
265
  # *caller's* identity, which PyPI then rejects. release.yml uploads instead.
259
- if: ${{ !inputs.skip_publish }}
266
+ if: ${{ !inputs.skip_publish && inputs.target != 'build-only' }}
260
267
  runs-on: ubuntu-latest
261
268
  needs: [build-wheels, build-sdists]
262
269
  permissions:
@@ -451,6 +451,10 @@ jobs:
451
451
  name: Build CLI asset for ${{ matrix.target }}
452
452
  needs: [metadata, release]
453
453
  runs-on: ${{ matrix.os }}
454
+ # Asset builds must not fail on warnings: MSVC emits LNK4099 for the vendored
455
+ # OpenSSL objects. Presetting this stops setup-rust-toolchain from denying them.
456
+ env:
457
+ CARGO_BUILD_WARNINGS: warn
454
458
  permissions:
455
459
  contents: write
456
460
  strategy:
@@ -496,9 +500,13 @@ jobs:
496
500
  if: runner.os == 'Linux'
497
501
  run: sudo apt-get update && sudo apt-get install -y libssl-dev pkg-config zlib1g-dev cmake libcurl4-openssl-dev protobuf-compiler
498
502
 
503
+ # `kafka-ssl` builds OpenSSL with perl. The bash build step would pick Git's
504
+ # perl, which lacks the modules; pin the Strawberry perl this shell resolves.
499
505
  - name: Install dependencies (Windows)
500
506
  if: runner.os == 'Windows'
501
- run: choco install protoc --no-progress -y
507
+ run: |
508
+ choco install protoc --no-progress -y
509
+ "OPENSSL_SRC_PERL=$((Get-Command perl).Source)" >> $env:GITHUB_ENV
502
510
 
503
511
  - name: Install dependencies (macOS)
504
512
  if: runner.os == 'macOS'
@@ -541,6 +549,110 @@ jobs:
541
549
  tag_name: ${{ needs.metadata.outputs.release_tag }}
542
550
  files: ${{ env.ASSET_PATH }}
543
551
 
552
+ # The C library has no ABI stability, so each archive carries the header that
553
+ # matches its library. Shared library only: a `full` static archive is huge and
554
+ # needs a per-target native link line.
555
+ build-c-library:
556
+ name: Build C library asset for ${{ matrix.target }}
557
+ needs: [metadata, release]
558
+ runs-on: ${{ matrix.os }}
559
+ # Same LNK4099 reason as build-release.
560
+ env:
561
+ CARGO_BUILD_WARNINGS: warn
562
+ permissions:
563
+ contents: write
564
+ strategy:
565
+ fail-fast: false
566
+ matrix:
567
+ include:
568
+ # Same runners as the CLI assets, so both share one glibc floor.
569
+ - os: ubuntu-22.04
570
+ target: x86_64-unknown-linux-gnu
571
+ - os: macos-latest
572
+ target: aarch64-apple-darwin
573
+ - os: windows-2022
574
+ target: x86_64-pc-windows-msvc
575
+ steps:
576
+ - name: Checkout repository
577
+ uses: actions/checkout@v7
578
+ with:
579
+ ref: ${{ inputs.tag_name || github.ref }}
580
+
581
+ - name: Install Rust toolchain
582
+ uses: actions-rust-lang/setup-rust-toolchain@v2
583
+ with:
584
+ toolchain: stable
585
+ target: ${{ matrix.target }}
586
+
587
+ - name: Install dependencies (Linux)
588
+ if: runner.os == 'Linux'
589
+ run: sudo apt-get update && sudo apt-get install -y libssl-dev pkg-config zlib1g-dev cmake libcurl4-openssl-dev protobuf-compiler
590
+
591
+ # `kafka-ssl` builds OpenSSL with perl. The bash build step would pick Git's
592
+ # perl, which lacks the modules; pin the Strawberry perl this shell resolves.
593
+ - name: Install dependencies (Windows)
594
+ if: runner.os == 'Windows'
595
+ run: |
596
+ choco install protoc --no-progress -y
597
+ "OPENSSL_SRC_PERL=$((Get-Command perl).Source)" >> $env:GITHUB_ENV
598
+
599
+ - name: Install dependencies (macOS)
600
+ if: runner.os == 'macOS'
601
+ run: brew install cmake pkg-config openssl@3 protobuf
602
+
603
+ # `cargo rustc --crate-type` skips the static library the manifest also declares.
604
+ - name: Build shared library (full)
605
+ shell: bash
606
+ run: cargo rustc -p mq-bridge-c --release --target ${{ matrix.target }} --crate-type cdylib
607
+
608
+ - name: Package artifacts
609
+ shell: bash
610
+ run: |
611
+ ASSET_NAME="mq-bridge-c-${{ matrix.target }}"
612
+ OUT="target/${{ matrix.target }}/release"
613
+ mkdir -p staging/lib staging/include
614
+ case "$RUNNER_OS" in
615
+ Windows) cp "$OUT/mq_bridge.dll" "$OUT/mq_bridge.dll.lib" staging/lib/ ;;
616
+ macOS)
617
+ cp "$OUT/libmq_bridge.dylib" staging/lib/
618
+ # Pin the install name so programs find the library through their rpath.
619
+ install_name_tool -id @rpath/libmq_bridge.dylib staging/lib/libmq_bridge.dylib
620
+ codesign --force --sign - staging/lib/libmq_bridge.dylib
621
+ ;;
622
+ *) cp "$OUT/libmq_bridge.so" staging/lib/ ;;
623
+ esac
624
+ cp include/*.h staging/include/
625
+ cp LICENSE LICENSE-MIT LICENSE-APACHE staging/
626
+ cp c/mq-bridge-c/README.md staging/README.md
627
+ cp c/mq-bridge-c/THIRD_PARTY_LICENSES.txt staging/
628
+ if [ "$RUNNER_OS" == "Windows" ]; then
629
+ 7z a "${ASSET_NAME}.zip" ./staging/*
630
+ echo "ASSET_PATH=${ASSET_NAME}.zip" >> "$GITHUB_ENV"
631
+ else
632
+ tar -czf "${ASSET_NAME}.tar.gz" -C staging .
633
+ echo "ASSET_PATH=${ASSET_NAME}.tar.gz" >> "$GITHUB_ENV"
634
+ fi
635
+
636
+ # CI only links the `--no-default-features` build; this is the one place a C
637
+ # program meets the `full` library, and it uses the archive as a user would.
638
+ - name: Smoke test the archive
639
+ if: runner.os != 'Windows'
640
+ shell: bash
641
+ run: |
642
+ mkdir unpacked
643
+ tar -xzf "$ASSET_PATH" -C unpacked
644
+ cc -std=c11 -I unpacked/include examples/c-library/smoke.c \
645
+ -L unpacked/lib -lmq_bridge "-Wl,-rpath,$PWD/unpacked/lib" -o smoke
646
+ if [ "$RUNNER_OS" == "macOS" ]; then otool -L unpacked/lib/libmq_bridge.dylib; else ldd unpacked/lib/libmq_bridge.so; fi
647
+ ./smoke "$RUNNER_TEMP" | tee smoke.log
648
+ grep -q "smoke test passed" smoke.log
649
+
650
+ - name: Upload Release Asset
651
+ uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
652
+ with:
653
+ tag_name: ${{ needs.metadata.outputs.release_tag }}
654
+ files: ${{ env.ASSET_PATH }}
655
+
544
656
  build-linux-amd64:
545
657
  name: Build docker linux/amd64
546
658
  needs: [metadata, preflight, test, app-checks, package-dry-run]
@@ -833,6 +945,7 @@ jobs:
833
945
  needs:
834
946
  - metadata
835
947
  - build-release
948
+ - build-c-library
836
949
  - build-linux-arm64-asset
837
950
  - build-tauri-release
838
951
  - publish-manifest
@@ -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`).