mq-bridge-basic 0.4.20__tar.gz → 1.0.1__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-1.0.1/.gitattributes +1 -0
  2. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/app.yml +103 -26
  3. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/benchmark.yml +2 -1
  4. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/ci.yml +55 -3
  5. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/ibm-mq.yml +24 -21
  6. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/publish-python.yml +11 -4
  7. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/release.yml +114 -1
  8. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/CHANGELOG.md +922 -2
  9. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/Cargo.lock +80 -47
  10. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/Cargo.toml +44 -22
  11. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/PKG-INFO +1 -1
  12. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/README.md +11 -2
  13. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/THIRD_PARTY_LICENSES.txt +517 -408
  14. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/benches/csv_to_json_bench.rs +2 -2
  15. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/benches/performance_bench.rs +2 -1
  16. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/bindings-common/Cargo.toml +1 -1
  17. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/bindings-common/src/lib.rs +31 -10
  18. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/build.rs +2 -1
  19. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/ARCHITECTURE.md +5 -1
  20. mq_bridge_basic-1.0.1/docs/CAPABILITIES.md +201 -0
  21. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/CONFIGURATION.md +77 -12
  22. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/DELIVERY.md +46 -13
  23. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/EXTENDING.md +1 -1
  24. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/GRPC.md +5 -0
  25. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/PLUGINS.md +17 -4
  26. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/REFERENCE.md +167 -28
  27. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/THIRD_PARTY_LICENSES.md +9 -1
  28. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/postgres-cdc-to-qdrant/README.md +3 -2
  29. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/include/mq_bridge.h +1 -1
  30. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/llms.txt +4 -0
  31. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/mq-bridge.schema.json +4930 -4047
  32. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/mq_bridge/config.py +26 -0
  33. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/mq_bridge/config.pyi +137 -2
  34. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/Cargo.toml +1 -1
  35. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/THIRD_PARTY_LICENSES.txt +517 -408
  36. mq_bridge_basic-1.0.1/rustfmt.toml +3 -0
  37. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/analysis/http/mq_bridge_http_profile.rs +199 -0
  38. mq_bridge_basic-1.0.1/scripts/ci/check_third_party_notices.sh +41 -0
  39. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/canonical_message.rs +44 -1
  40. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/checkpoint.rs +95 -23
  41. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/config_file.rs +56 -18
  42. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/amqp.rs +242 -101
  43. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/aws.rs +273 -73
  44. mq_bridge_basic-1.0.1/src/endpoints/capabilities.rs +647 -0
  45. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/clickhouse.rs +498 -99
  46. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/dir_spool/mod.rs +245 -50
  47. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/dir_spool/tests.rs +191 -0
  48. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/file/csv_dialect.rs +15 -1
  49. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/file/mod.rs +359 -103
  50. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/file/tests.rs +400 -3
  51. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/grpc/consumer.rs +105 -81
  52. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/grpc/mod.rs +19 -2
  53. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/grpc/server.rs +11 -1
  54. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/grpc/tests.rs +222 -1
  55. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/http/mod.rs +65 -167
  56. mq_bridge_basic-1.0.1/src/endpoints/http/pool.rs +242 -0
  57. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/http/publisher.rs +35 -99
  58. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/http/stream.rs +49 -50
  59. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/http/tests.rs +246 -0
  60. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/http_bulk/auth.rs +56 -0
  61. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/http_bulk/consumer.rs +401 -34
  62. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/http_bulk/mod.rs +47 -14
  63. mq_bridge_basic-1.0.1/src/endpoints/http_bulk/presets.rs +1427 -0
  64. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/http_bulk/publisher.rs +442 -70
  65. mq_bridge_basic-1.0.1/src/endpoints/http_bulk/query.rs +764 -0
  66. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/ibm_mq.rs +137 -41
  67. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/kafka.rs +564 -45
  68. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/memory/endpoint.rs +34 -2
  69. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/memory/framed.rs +1 -1
  70. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/memory/ipc_unix.rs +179 -59
  71. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/memory/transport.rs +6 -1
  72. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mod.rs +363 -46
  73. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mongodb/aggregate.rs +6 -3
  74. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mongodb/consumer.rs +6 -2
  75. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mongodb/dedup.rs +25 -3
  76. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mongodb/mod.rs +66 -4
  77. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mongodb/publisher.rs +71 -144
  78. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mongodb/readers.rs +349 -148
  79. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mongodb/tests.rs +113 -1
  80. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/mqtt.rs +108 -13
  81. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/nats.rs +318 -157
  82. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/object_store.rs +266 -77
  83. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/VENDORED.md +18 -0
  84. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/mod.rs +263 -44
  85. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/pgoutput/values.rs +2 -2
  86. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/replication.rs +187 -59
  87. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/redis_streams.rs +241 -53
  88. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/sled.rs +116 -28
  89. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/sqlx/aggregate.rs +6 -3
  90. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/sqlx/columns.rs +57 -3
  91. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/sqlx/dedup.rs +26 -3
  92. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/sqlx/mod.rs +528 -188
  93. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/sqlx/tests.rs +233 -0
  94. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/fanout.rs +68 -11
  95. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/reader.rs +46 -6
  96. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/request.rs +113 -17
  97. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/sequence.rs +268 -15
  98. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/stream_buffer.rs +15 -21
  99. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/switch.rs +160 -3
  100. mq_bridge_basic-1.0.1/src/endpoints/websocket.rs +1589 -0
  101. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/zeromq/codec.rs +20 -1
  102. mq_bridge_basic-1.0.1/src/endpoints/zeromq/mod.rs +403 -0
  103. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/zeromq/omq.rs +5 -2
  104. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/zeromq/zmq.rs +259 -205
  105. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/errors.rs +29 -3
  106. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/event_store.rs +41 -2
  107. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/lib.rs +23 -7
  108. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/aggregate/mod.rs +143 -47
  109. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/aggregate/tests.rs +105 -2
  110. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/buffer.rs +63 -5
  111. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/compression.rs +176 -27
  112. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/deduplication/memory.rs +17 -0
  113. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/deduplication.rs +281 -28
  114. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/deferred_commit.rs +106 -9
  115. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/dlq.rs +17 -8
  116. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/encryption.rs +135 -15
  117. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/filter.rs +109 -17
  118. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/limiter.rs +11 -5
  119. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/lookup.rs +81 -10
  120. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/mod.rs +70 -35
  121. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/pack.rs +52 -13
  122. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/retry.rs +100 -2
  123. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/weak_join.rs +136 -12
  124. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/models/builders.rs +194 -5
  125. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/models/defaults.rs +20 -0
  126. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/models/secrets.rs +336 -7
  127. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/models/serde_support.rs +103 -1
  128. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/models/tests.rs +178 -1
  129. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/models.rs +520 -50
  130. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/completion.rs +53 -9
  131. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/conformance.rs +54 -2
  132. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/crash.rs +47 -7
  133. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/endpoint.rs +105 -9
  134. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/middleware.rs +359 -5
  135. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/sdk.rs +144 -22
  136. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/test_support.rs +21 -3
  137. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/publisher.rs +10 -5
  138. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/response.rs +9 -2
  139. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/route.rs +679 -101
  140. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/shutdown.rs +2 -3
  141. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/config_schema.rs +14 -1
  142. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/crypto.rs +2 -2
  143. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/interpolation.rs +4 -7
  144. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/mod.rs +23 -6
  145. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/pack.rs +16 -0
  146. mq_bridge_basic-1.0.1/src/support/redact.rs +125 -0
  147. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/stream_batch.rs +14 -1
  148. mq_bridge_basic-1.0.1/src/support/tls.rs +196 -0
  149. mq_bridge_basic-1.0.1/src/support/tls_check.rs +122 -0
  150. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/traits.rs +82 -10
  151. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/amqp.rs +69 -44
  152. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/aws.rs +53 -32
  153. mq_bridge_basic-1.0.1/tests/integration/contract.rs +320 -0
  154. mq_bridge_basic-1.0.1/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  155. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
  156. mq_bridge_basic-1.0.1/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  157. mq_bridge_basic-1.0.1/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  158. mq_bridge_basic-1.0.1/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  159. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/http_tls.rs +1 -1
  160. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/ibm_mq.rs +113 -4
  161. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/kafka.rs +2 -30
  162. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/mariadb.rs +2 -20
  163. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/memory.rs +0 -9
  164. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/mod.rs +1 -0
  165. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/mongodb.rs +314 -26
  166. mq_bridge_basic-1.0.1/tests/integration/mongodb_raw.rs +58 -0
  167. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/mqtt.rs +47 -30
  168. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/mysql.rs +2 -20
  169. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/nats.rs +2 -113
  170. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/object_store.rs +8 -5
  171. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/postgres.rs +85 -29
  172. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/postgres_cdc.rs +222 -0
  173. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/redis_streams.rs +138 -95
  174. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/route.rs +23 -13
  175. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/sqlite.rs +0 -5
  176. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration_test.rs +101 -75
  177. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/reference_docs_test.rs +3 -3
  178. mq_bridge_basic-0.4.20/src/endpoints/http_bulk/presets.rs +0 -826
  179. mq_bridge_basic-0.4.20/src/endpoints/http_bulk/query.rs +0 -429
  180. mq_bridge_basic-0.4.20/src/endpoints/websocket.rs +0 -843
  181. mq_bridge_basic-0.4.20/src/endpoints/zeromq/mod.rs +0 -106
  182. mq_bridge_basic-0.4.20/src/support/redact.rs +0 -57
  183. mq_bridge_basic-0.4.20/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  184. mq_bridge_basic-0.4.20/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  185. mq_bridge_basic-0.4.20/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  186. mq_bridge_basic-0.4.20/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  187. mq_bridge_basic-0.4.20/tests/integration/mongodb_raw.rs +0 -62
  188. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.cargo/config.toml +0 -0
  189. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.coderabbit.yaml +0 -0
  190. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.dockerignore +0 -0
  191. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  192. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  193. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  194. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/dependabot.yml +0 -0
  195. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/build-node.yml +0 -0
  196. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/conda.yml +0 -0
  197. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/docs.yml +0 -0
  198. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/examples.yml +0 -0
  199. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/node.yml +0 -0
  200. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/publish-node.yml +0 -0
  201. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/python.yml +0 -0
  202. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.github/workflows/test-matrix.yml +0 -0
  203. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.gitignore +0 -0
  204. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/.justfile +0 -0
  205. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/AGENTS.md +0 -0
  206. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/CLAUDE.md +0 -0
  207. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/CONTRIBUTING.md +0 -0
  208. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/LICENSE +0 -0
  209. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/LICENSE-APACHE +0 -0
  210. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/LICENSE-APACHE.python +0 -0
  211. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/LICENSE-MIT +0 -0
  212. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/LICENSE-MIT.python +0 -0
  213. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/LICENSE.python +0 -0
  214. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/SECURITY.md +0 -0
  215. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/benches/middleware_expr_bench.rs +0 -0
  216. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/benches/pack_bench.rs +0 -0
  217. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/benches/router_bench.rs +0 -0
  218. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/benches/zeromq_backends.rs +0 -0
  219. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/bindings-common/src/logging.rs +0 -0
  220. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/deny.toml +0 -0
  221. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/docs/assets/copy-demo.png +0 -0
  222. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-library/publish.c +0 -0
  223. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-library/smoke.c +0 -0
  224. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-plugin/CMakeLists.txt +0 -0
  225. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-plugin/README.md +0 -0
  226. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-plugin/legacy_ledger.c +0 -0
  227. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-plugin/legacy_ledger.h +0 -0
  228. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-plugin/legacy_parser.c +0 -0
  229. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-plugin/legacy_parser.h +0 -0
  230. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-plugin/minimal.c +0 -0
  231. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/c-plugin/plugin.c +0 -0
  232. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/ipc_worker_queue.yaml +0 -0
  233. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/postgres-cdc-to-qdrant/docker-compose.yml +0 -0
  234. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/postgres-cdc-to-qdrant/init.sql +0 -0
  235. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/postgres-cdc-to-qdrant/routes.yaml +0 -0
  236. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/postgres-cdc-to-qdrant/search.sh +0 -0
  237. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/postgres-cdc-to-qdrant/test.sh +0 -0
  238. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/transactional-outbox/README.md +0 -0
  239. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/transactional-outbox/consume.sh +0 -0
  240. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/transactional-outbox/docker-compose.yml +0 -0
  241. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/transactional-outbox/init.sql +0 -0
  242. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/transactional-outbox/routes.yaml +0 -0
  243. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/examples/transactional-outbox/test.sh +0 -0
  244. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/include/cbindgen.toml +0 -0
  245. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/include/mq_bridge_plugin.h +0 -0
  246. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/include/mq_bridge_plugin_helpers.h +0 -0
  247. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/mq_bridge/__init__.py +0 -0
  248. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/mq_bridge/__init__.pyi +0 -0
  249. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/mq_bridge/plugin_packaging.py +0 -0
  250. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/mq_bridge/py.typed +0 -0
  251. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/package-lock.json +0 -0
  252. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/pyproject.toml +0 -0
  253. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/LICENSE-APACHE.python +0 -0
  254. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/LICENSE-MIT.python +0 -0
  255. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/LICENSE.python +0 -0
  256. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/README.md +0 -0
  257. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
  258. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/example.py +0 -0
  259. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/IBM_MQ.md +0 -0
  260. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/bench_memory.py +0 -0
  261. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
  262. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/consume_pull.py +0 -0
  263. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/dlt_source.py +0 -0
  264. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/ibm-mq-input.py +0 -0
  265. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/json_route.py +0 -0
  266. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/memory.yaml +0 -0
  267. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/examples/raw_route.py +0 -0
  268. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/pyproject-basic.toml +0 -0
  269. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/pyproject-reduced.toml +0 -0
  270. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
  271. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/src/lib.rs +0 -0
  272. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_config_types.py +0 -0
  273. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_custom_endpoint.py +0 -0
  274. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_logging.py +0 -0
  275. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_packaging.py +0 -0
  276. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
  277. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_plugin_package.py +0 -0
  278. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_public_api.py +0 -0
  279. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_routes.py +0 -0
  280. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/tests/test_shutdown.py +0 -0
  281. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/python/mq-bridge-py/uv.lock +0 -0
  282. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/analysis/benches/metadata_bench.rs +0 -0
  283. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
  284. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
  285. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/analysis/http/http_flamegraph.py +0 -0
  286. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/analysis/http/run_http_ladder.sh +0 -0
  287. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/ci/format_bench_output.sh +0 -0
  288. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/httparena/README.md +0 -0
  289. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
  290. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
  291. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
  292. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/httparena/frameworks/mq-bridge-py/templates/fortunes.html +0 -0
  293. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/mqb-agent.py +0 -0
  294. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/sync-version.mjs +0 -0
  295. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
  296. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
  297. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
  298. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
  299. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/techempower/README.md +0 -0
  300. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/techempower/postgres.yml +0 -0
  301. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/techempower/seed.sql +0 -0
  302. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/techempower/verify.sh +0 -0
  303. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/the-benchmarker/README.md +0 -0
  304. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
  305. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
  306. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
  307. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/command_handler.rs +0 -0
  308. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/grpc/dynamic.rs +0 -0
  309. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/grpc/proto/mqbridge/bridge.proto +0 -0
  310. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/grpc/publisher.rs +0 -0
  311. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/memory/ipc_windows.rs +0 -0
  312. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/memory/memory_transport.rs +0 -0
  313. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/memory/mod.rs +0 -0
  314. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/poll.rs +0 -0
  315. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/pgoutput/decoder.rs +0 -0
  316. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/pgoutput/messages.rs +0 -0
  317. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/pgoutput/mod.rs +0 -0
  318. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/pgoutput/registry.rs +0 -0
  319. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/postgres/state.rs +0 -0
  320. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/mod.rs +0 -0
  321. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/null.rs +0 -0
  322. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/response.rs +0 -0
  323. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/endpoints/structural/static_endpoint.rs +0 -0
  324. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/event_handler.rs +0 -0
  325. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/extensions.rs +0 -0
  326. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/aggregate/states.rs +0 -0
  327. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/aggregate/store.rs +0 -0
  328. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/aggregate/writer.rs +0 -0
  329. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/cookie_jar.rs +0 -0
  330. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/delay.rs +0 -0
  331. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/id.rs +0 -0
  332. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/metrics.rs +0 -0
  333. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/otel.rs +0 -0
  334. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/random_panic.rs +0 -0
  335. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/raw_json.rs +0 -0
  336. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/timeout.rs +0 -0
  337. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/transform/coerce.rs +0 -0
  338. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/transform/compiled.rs +0 -0
  339. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/transform/error.rs +0 -0
  340. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/transform/mod.rs +0 -0
  341. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/transform/path.rs +0 -0
  342. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/transform/schema.rs +0 -0
  343. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/middleware/transform/tests.rs +0 -0
  344. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/outcomes.rs +0 -0
  345. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/discovery.rs +0 -0
  346. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/forward.rs +0 -0
  347. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/host.rs +0 -0
  348. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/message.rs +0 -0
  349. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/plugin/mod.rs +0 -0
  350. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/base64_engine.rs +0 -0
  351. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/change_op.rs +0 -0
  352. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/compression.rs +0 -0
  353. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/compression_pool.rs +0 -0
  354. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/connection_registry.rs +0 -0
  355. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/crypto_envelope.rs +0 -0
  356. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/http_status.rs +0 -0
  357. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/lookup_batch.rs +0 -0
  358. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/ndjson.rs +0 -0
  359. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/parallel.rs +0 -0
  360. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/parquet.rs +0 -0
  361. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/plugin_abi.rs +0 -0
  362. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/poll_job.rs +0 -0
  363. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/source_ranges.rs +0 -0
  364. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/support/sse.rs +0 -0
  365. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/test_utils.rs +0 -0
  366. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/src/type_handler.rs +0 -0
  367. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/README.md +0 -0
  368. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/armature_integration.rs +0 -0
  369. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/compat/python/bridge_client.py +0 -0
  370. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/dedup_store_bench.rs +0 -0
  371. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/delivery_guarantee_test.rs +0 -0
  372. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/full_plugin_fallback_test.rs +0 -0
  373. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/clickhouse.rs +0 -0
  374. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/config.toml +0 -0
  375. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/amqp.yml +0 -0
  376. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/aws.yml +0 -0
  377. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/clickhouse.yml +0 -0
  378. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/ibm_mq.yml +0 -0
  379. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
  380. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/kafka-tls.yml +0 -0
  381. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/kafka.yml +0 -0
  382. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mariadb.yml +0 -0
  383. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
  384. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
  385. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mongodb.yml +0 -0
  386. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mosquitto.conf +0 -0
  387. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
  388. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
  389. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mq_init.mqsc +0 -0
  390. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
  391. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mqtt.yml +0 -0
  392. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
  393. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/mysql.yml +0 -0
  394. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/nats.yml +0 -0
  395. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/object_store.yml +0 -0
  396. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/postgres.yml +0 -0
  397. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/postgres_cdc.yml +0 -0
  398. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/docker-compose/redis.yml +0 -0
  399. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/file.rs +0 -0
  400. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/grpc.rs +0 -0
  401. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/grpc_tls.rs +0 -0
  402. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/http.rs +0 -0
  403. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/ibm_mq_tls.rs +0 -0
  404. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/ipc.rs +0 -0
  405. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/kafka_tls.rs +0 -0
  406. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/logic_test.rs +0 -0
  407. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/mongodb_tls.rs +0 -0
  408. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/performance_static.rs +0 -0
  409. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/scripts/gen_certs.sh +0 -0
  410. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/tls_helpers.rs +0 -0
  411. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/websocket.rs +0 -0
  412. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/integration/zeromq.rs +0 -0
  413. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/memory_leak_test.rs +0 -0
  414. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/otel_test.rs +0 -0
  415. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/plugin_loading_latch_test.rs +0 -0
  416. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/ref_test.rs +0 -0
  417. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/sqlite_test.rs +0 -0
  418. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/tls_example.rs +0 -0
  419. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/unit_tests.md +0 -0
  420. {mq_bridge_basic-0.4.20 → mq_bridge_basic-1.0.1}/tests/websocket_test.rs +0 -0
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -238,24 +238,29 @@ jobs:
238
238
  # cargo reports the binary it just built; a restored cache can leave several
239
239
  # older `cli_copy_docker_test-<hash>` files next to it, so globbing deps/
240
240
  # would pick an arbitrary one.
241
- - name: Build the docker test binary
241
+ - name: Build the docker test binaries
242
242
  working-directory: apps/mq-bridge-app
243
243
  shell: bash
244
244
  run: |
245
- cargo test -p mq-bridge-app --test cli_copy_docker_test --no-run \
245
+ cargo test -p mq-bridge-app --test cli_copy_docker_test \
246
+ --test cli_scenario_docker_test --no-run \
246
247
  --message-format=json > "$RUNNER_TEMP/build.json"
247
248
  jq -r 'select(.target.name == "cli_copy_docker_test") | .executable // empty' \
248
249
  "$RUNNER_TEMP/build.json" | tail -1 > "$RUNNER_TEMP/test-binary"
250
+ jq -r 'select(.target.name == "cli_scenario_docker_test") | .executable // empty' \
251
+ "$RUNNER_TEMP/build.json" | tail -1 > "$RUNNER_TEMP/scenario-binary"
249
252
  jq -r 'select(.target.name == "mq-bridge-app"
250
253
  and (.target.kind // [] | index("bin"))) | .executable // empty' \
251
254
  "$RUNNER_TEMP/build.json" | tail -1 > "$RUNNER_TEMP/cli-binary"
252
- test -s "$RUNNER_TEMP/test-binary" && test -s "$RUNNER_TEMP/cli-binary"
255
+ test -s "$RUNNER_TEMP/test-binary" && test -s "$RUNNER_TEMP/scenario-binary" \
256
+ && test -s "$RUNNER_TEMP/cli-binary"
253
257
 
254
258
  - name: Collect binaries
255
259
  shell: bash
256
260
  run: |
257
261
  mkdir -p docker-suite
258
262
  cp "$(cat "$RUNNER_TEMP/test-binary")" docker-suite/test-binary
263
+ cp "$(cat "$RUNNER_TEMP/scenario-binary")" docker-suite/scenario-binary
259
264
  cp "$(cat "$RUNNER_TEMP/cli-binary")" docker-suite/mq-bridge-app
260
265
  cp "$RUNNER_TEMP/cli-binary" docker-suite/cli-path
261
266
 
@@ -266,18 +271,14 @@ jobs:
266
271
  path: docker-suite
267
272
  retention-days: 1
268
273
 
269
- # One backend per runner, so the servers never compete for memory or for the
270
- # fixed host ports the test URIs use. `run_docker_tests.sh` does the same loop
271
- # locally, one at a time.
274
+ # One backend at a time on one runner, so the servers never compete for memory
275
+ # or for the fixed host ports the test URIs use. `run_docker_tests.sh` does the
276
+ # same loop locally. Nine runners for ~20 s of tests each held slots the rest
277
+ # of the workflows were queuing for.
272
278
  docker:
273
- name: App docker (${{ matrix.backend }})
279
+ name: App docker
274
280
  runs-on: ubuntu-latest
275
281
  needs: docker-build
276
- strategy:
277
- fail-fast: false
278
- matrix:
279
- backend:
280
- [postgres, mysql, mariadb, kafka, nats, mongodb, redis, amqp, mqtt]
281
282
  steps:
282
283
  - uses: actions/checkout@v7
283
284
 
@@ -295,7 +296,7 @@ jobs:
295
296
  cli="$(cat docker-suite/cli-path)"
296
297
  mkdir -p "$(dirname "$cli")"
297
298
  mv docker-suite/mq-bridge-app "$cli"
298
- chmod +x "$cli" docker-suite/test-binary
299
+ chmod +x "$cli" docker-suite/test-binary docker-suite/scenario-binary
299
300
 
300
301
  - name: Install runtime libraries
301
302
  timeout-minutes: 5
@@ -303,24 +304,100 @@ jobs:
303
304
 
304
305
  # The engine's own integration stacks, so there is one definition per
305
306
  # service rather than a second copy that can drift.
306
- - name: Start ${{ matrix.backend }}
307
- run: docker compose -f tests/integration/docker-compose/${{ matrix.backend }}.yml up -d --wait --wait-timeout 300
308
-
307
+ #
309
308
  # The backend name filters the test names as well as MQB_TEST_BACKEND:
310
309
  # `backend!` skips by returning, so without the name filter every excluded
311
310
  # test still reports `ok` and a broken service would look green.
312
- - name: Run ${{ matrix.backend }} tests
311
+ #
312
+ # A failing backend does not stop the loop; the step fails at the end and
313
+ # names every backend that failed.
314
+ - name: Run the backends one after another
315
+ timeout-minutes: 45
313
316
  # `shell: bash` for pipefail: the default shell would take `tee`'s exit
314
317
  # status and report a failing test run as a pass.
315
318
  shell: bash
316
- env:
317
- MQB_TEST_BACKEND: ${{ matrix.backend }}
318
319
  run: |
319
- ./docker-suite/test-binary \
320
- --ignored --test-threads=1 ${{ matrix.backend }} 2>&1 | tee result.log
321
- grep -qE 'test result: ok\. [1-9]' result.log \
322
- || { echo "no ${{ matrix.backend }} tests ran"; exit 1; }
320
+ failed=()
321
+ for backend in postgres mysql mariadb kafka nats mongodb redis amqp mqtt; do
322
+ compose="tests/integration/docker-compose/$backend.yml"
323
+ echo "::group::$backend"
324
+ ok=1
325
+ docker compose -f "$compose" up -d --wait --wait-timeout 300 || ok=0
326
+ if [ "$ok" = 1 ]; then
327
+ MQB_TEST_BACKEND="$backend" ./docker-suite/test-binary \
328
+ --ignored --test-threads=1 "$backend" 2>&1 | tee result.log || ok=0
329
+ grep -qE 'test result: ok\. [1-9]' result.log \
330
+ || { echo "no $backend tests ran"; ok=0; }
331
+ fi
332
+ if [ "$ok" = 0 ]; then
333
+ failed+=("$backend")
334
+ docker compose -f "$compose" logs --tail 200 || true
335
+ fi
336
+ docker compose -f "$compose" down -v --remove-orphans || true
337
+ echo "::endgroup::"
338
+ done
339
+ if [ "${#failed[@]}" -gt 0 ]; then
340
+ echo "::error::failed backends: ${failed[*]}"
341
+ exit 1
342
+ fi
343
+
344
+ # Route-level scenarios through the binary: broker restarts, SIGTERM and
345
+ # `kill -9` resumes. A job of its own so these slower runs never hold up the
346
+ # copy matrix above; same binaries, same one-backend-at-a-time loop.
347
+ docker-scenario:
348
+ name: App docker — Scenarios
349
+ runs-on: ubuntu-latest
350
+ needs: docker-build
351
+ steps:
352
+ - uses: actions/checkout@v7
323
353
 
324
- - name: Service logs
325
- if: failure()
326
- run: docker compose -f tests/integration/docker-compose/${{ matrix.backend }}.yml logs --tail 200
354
+ - name: Download docker suite binaries
355
+ uses: actions/download-artifact@v8
356
+ with:
357
+ name: app-docker-suite
358
+ path: docker-suite
359
+
360
+ - name: Restore binaries
361
+ shell: bash
362
+ run: |
363
+ cli="$(cat docker-suite/cli-path)"
364
+ mkdir -p "$(dirname "$cli")"
365
+ mv docker-suite/mq-bridge-app "$cli"
366
+ chmod +x "$cli" docker-suite/scenario-binary
367
+
368
+ - name: Install runtime libraries
369
+ timeout-minutes: 5
370
+ run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev zlib1g-dev
371
+
372
+ # Name filter plus MQB_TEST_BACKEND, and a zero-test run fails, for the
373
+ # reasons given on the copy loop above.
374
+ - name: Run the scenarios one backend after another
375
+ timeout-minutes: 30
376
+ shell: bash
377
+ run: |
378
+ failed=()
379
+ for backend in kafka postgres nats amqp mqtt mongodb mysql mariadb; do
380
+ stack="$backend"
381
+ # CDC needs logical replication; the cursor scenarios run on it too.
382
+ [ "$backend" = postgres ] && stack=postgres_cdc
383
+ compose="tests/integration/docker-compose/$stack.yml"
384
+ echo "::group::$backend"
385
+ ok=1
386
+ docker compose -f "$compose" up -d --wait --wait-timeout 300 || ok=0
387
+ if [ "$ok" = 1 ]; then
388
+ MQB_TEST_BACKEND="$backend" ./docker-suite/scenario-binary \
389
+ --ignored --test-threads=1 "$backend" 2>&1 | tee result.log || ok=0
390
+ grep -qE 'test result: ok\. [1-9]' result.log \
391
+ || { echo "no $backend scenarios ran"; ok=0; }
392
+ fi
393
+ if [ "$ok" = 0 ]; then
394
+ failed+=("$backend")
395
+ docker compose -f "$compose" logs --tail 200 || true
396
+ fi
397
+ docker compose -f "$compose" down -v --remove-orphans || true
398
+ echo "::endgroup::"
399
+ done
400
+ if [ "${#failed[@]}" -gt 0 ]; then
401
+ echo "::error::failed backends: ${failed[*]}"
402
+ exit 1
403
+ 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
@@ -182,12 +208,10 @@ jobs:
182
208
  include:
183
209
  - name: Status
184
210
  filter: 'binary(integration_test) & test(=test_all_status)'
185
- - name: Chaos
186
- filter: 'binary(integration_test) & test(=test_all_chaos)'
187
211
  - name: Logic
188
212
  filter: 'binary(integration_test) & (test(=test_all_request_reply) | test(=test_all_subscriber_logic))'
189
213
  - name: Endpoints
190
- filter: 'binary(integration_test) & not test(=test_all_status) & not test(=test_all_chaos) & not test(=test_all_request_reply) & not test(=test_all_subscriber_logic) & not test(=test_all_performance_pipeline) & not test(=test_all_performance_direct)'
214
+ filter: 'binary(integration_test) & not test(=test_all_status) & not test(=test_all_request_reply) & not test(=test_all_subscriber_logic) & not test(=test_all_performance_pipeline) & not test(=test_all_performance_direct)'
191
215
  - name: Performance Pipeline
192
216
  filter: 'binary(integration_test) & test(=test_all_performance_pipeline)'
193
217
  - name: Performance Direct
@@ -244,9 +268,11 @@ jobs:
244
268
 
245
269
  # Armature clones an external repo and runs its test suite: no docker stacks, no
246
270
  # TLS certs, no keytool. It used to pay ~1.3m of setup for 1.7m of tests.
271
+ # Advisory: it builds armature's `develop` head unlocked, so their breakage shows here.
247
272
  integration-armature:
248
273
  name: Integration — Armature
249
274
  runs-on: ubuntu-latest
275
+ continue-on-error: true
250
276
  needs: integration-build
251
277
  steps:
252
278
  - uses: actions/checkout@v7
@@ -283,6 +309,27 @@ jobs:
283
309
  - name: Build documentation (deny warnings)
284
310
  run: RUSTDOCFLAGS="-D warnings" cargo doc --features lint-all --no-deps
285
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
+
286
333
  # Supply chain: licenses, banned crates, source registries, RustSec advisories
287
334
  supply-chain:
288
335
  name: Supply Chain
@@ -301,6 +348,11 @@ jobs:
301
348
  with:
302
349
  command: check bans licenses sources
303
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
+
304
356
  # Informational: every current advisory is in a transitive dependency we
305
357
  # cannot upgrade ourselves, and RustSec updates daily. SECURITY.md records
306
358
  # the per-feature reachability analysis; deny.toml carries the reasoning.
@@ -62,15 +62,23 @@ jobs:
62
62
  ${{ runner.os }}-cargo-ibmmq-
63
63
  ${{ runner.os }}-cargo-
64
64
 
65
+ # Only a cache miss reaches IBM's download host.
66
+ - name: Cache IBM MQ redist archive
67
+ uses: actions/cache@v6
68
+ with:
69
+ path: ~/ibm-mq-redist
70
+ key: ibm-mq-redist-${{ env.IBM_MQ_REDIST_SHA256 }}
71
+
65
72
  - name: Install IBM MQ Client Libraries
66
73
  id: mqclient
67
74
  run: |
68
- archive_url="$IBM_MQ_REDIST_URL"
69
- archive_name="$(basename "$archive_url")"
75
+ archive_name="$HOME/ibm-mq-redist/$(basename "$IBM_MQ_REDIST_URL")"
70
76
  # IBM's download host is occasionally unreachable from runners. Treat a
71
77
  # download failure as infrastructure flakiness and skip the rest of the
72
78
  # job (see `if:` guards below). Checksum/extract failures still fail.
73
- if ! curl -fsSLO --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 "$archive_url"; then
79
+ # Download outside the cached dir so a failure never caches an empty one.
80
+ tmp="$RUNNER_TEMP/$(basename "$archive_name")"
81
+ if [ ! -f "$archive_name" ] && ! { curl -fsSL --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 -o "$tmp" "$IBM_MQ_REDIST_URL" && mkdir -p "$(dirname "$archive_name")" && mv "$tmp" "$archive_name"; }; then
74
82
  echo "::warning::IBM MQ redist download failed (host unreachable); skipping IBM MQ build."
75
83
  echo "available=false" >> "$GITHUB_OUTPUT"
76
84
  exit 0
@@ -131,15 +139,23 @@ jobs:
131
139
  ${{ runner.os }}-cargo-ibmmq-
132
140
  ${{ runner.os }}-cargo-
133
141
 
142
+ # Only a cache miss reaches IBM's download host.
143
+ - name: Cache IBM MQ redist archive
144
+ uses: actions/cache@v6
145
+ with:
146
+ path: ~/ibm-mq-redist
147
+ key: ibm-mq-redist-${{ env.IBM_MQ_REDIST_SHA256 }}
148
+
134
149
  - name: Install IBM MQ Client Libraries
135
150
  id: mqclient
136
151
  run: |
137
- archive_url="$IBM_MQ_REDIST_URL"
138
- archive_name="$(basename "$archive_url")"
152
+ archive_name="$HOME/ibm-mq-redist/$(basename "$IBM_MQ_REDIST_URL")"
139
153
  # IBM's download host is occasionally unreachable from runners. Treat a
140
154
  # download failure as infrastructure flakiness and skip the rest of the
141
155
  # job (see `if:` guards below). Checksum/extract failures still fail.
142
- if ! curl -fsSLO --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 "$archive_url"; then
156
+ # Download outside the cached dir so a failure never caches an empty one.
157
+ tmp="$RUNNER_TEMP/$(basename "$archive_name")"
158
+ if [ ! -f "$archive_name" ] && ! { curl -fsSL --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 -o "$tmp" "$IBM_MQ_REDIST_URL" && mkdir -p "$(dirname "$archive_name")" && mv "$tmp" "$archive_name"; }; then
143
159
  echo "::warning::IBM MQ redist download failed (host unreachable); skipping IBM MQ integration tests."
144
160
  echo "available=false" >> "$GITHUB_OUTPUT"
145
161
  exit 0
@@ -188,7 +204,7 @@ jobs:
188
204
  --ignored --nocapture --test-threads=1 \
189
205
  test_all_subscriber_logic \
190
206
  test_all_performance_pipeline \
191
- test_all_chaos \
207
+ test_ibm_mq_chaos \
192
208
  test_all_status
193
209
 
194
210
  - name: Run IBM MQ TLS tests
@@ -223,20 +239,7 @@ jobs:
223
239
  restore-keys: |
224
240
  ${{ runner.os }}-cargo-ibmmq-
225
241
 
226
- - name: Install IBM MQ Client Libraries
227
- run: |
228
- archive_url="$IBM_MQ_REDIST_URL"
229
- archive_name="$(basename "$archive_url")"
230
- curl -fsSLO --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 "$archive_url"
231
- echo "${IBM_MQ_REDIST_SHA256} ${archive_name}" | sha256sum -c -
232
- # The redist archive extracts a self-contained MQ install tree
233
- # (bin/, lib64/, inc/, ...) with no top-level mqm/ dir, so unpack
234
- # it directly into the installation path.
235
- sudo mkdir -p /opt/mqm
236
- sudo tar -xzf "$archive_name" -C /opt/mqm
237
- echo "LD_LIBRARY_PATH=/opt/mqm/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
238
- echo "MQ_INSTALLATION_PATH=/opt/mqm" >> $GITHUB_ENV
239
-
242
+ # `ibm-mq` loads the client at runtime, so rustdoc needs no IBM MQ SDK.
240
243
  - name: Build documentation
241
244
  run: cargo doc --features ibm-mq --no-deps
242
245
 
@@ -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