mq-bridge-py-basic 0.3.0__tar.gz → 0.3.2__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 (207) hide show
  1. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/benchmark.yml +9 -13
  2. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/ci.yml +88 -39
  3. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/ibm-mq.yml +16 -5
  4. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/publish-node.yml +13 -7
  5. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/publish-python.yml +27 -2
  6. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/Cargo.lock +46 -4
  7. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/Cargo.toml +24 -6
  8. mq_bridge_py_basic-0.3.2/PKG-INFO +320 -0
  9. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/README.md +24 -2
  10. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/benches/performance_bench.rs +26 -14
  11. mq_bridge_py_basic-0.3.2/bindings-common/Cargo.toml +19 -0
  12. mq_bridge_py_basic-0.3.2/bindings-common/src/lib.rs +308 -0
  13. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/mq_bridge/__init__.py +2 -0
  14. mq_bridge_py_basic-0.3.2/mq_bridge/__init__.pyi +255 -0
  15. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/mq_bridge/config.pyi +2 -1
  16. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/pyproject.toml +1 -1
  17. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/Cargo.toml +19 -6
  18. mq_bridge_py_basic-0.3.2/python/mq-bridge-py/README.md +296 -0
  19. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/analysis/bench_http_native.py +7 -9
  20. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/example.py +2 -2
  21. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/examples/bench_memory.py +2 -2
  22. mq_bridge_py_basic-0.3.2/python/mq-bridge-py/examples/consume_pull.py +39 -0
  23. mq_bridge_py_basic-0.3.2/python/mq-bridge-py/examples/dlt_source.py +112 -0
  24. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/examples/json_route.py +2 -2
  25. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/examples/raw_route.py +2 -2
  26. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/pyproject-basic.toml +1 -1
  27. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/scripts/gen_config_types.py +1 -1
  28. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/src/lib.rs +577 -162
  29. mq_bridge_py_basic-0.3.2/python/mq-bridge-py/tests/test_routes.py +334 -0
  30. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/analysis/debug_ibm_mq_tls.rs +1 -1
  31. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/canonical_message.rs +134 -0
  32. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/amqp.rs +28 -0
  33. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/aws.rs +3 -0
  34. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/file.rs +6 -1
  35. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/grpc.rs +22 -4
  36. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/http.rs +4 -0
  37. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/ibm_mq.rs +203 -11
  38. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/kafka.rs +60 -6
  39. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/mod.rs +5 -5
  40. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/mongodb.rs +25 -0
  41. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/mqtt.rs +340 -22
  42. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/nats.rs +83 -1
  43. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/sled.rs +6 -2
  44. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/zeromq.rs +73 -11
  45. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/models.rs +43 -1
  46. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/test_utils.rs +43 -15
  47. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/traits.rs +15 -0
  48. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/armature_integration.rs +39 -33
  49. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mq_init.mqsc +4 -0
  50. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/grpc.rs +4 -4
  51. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/ibm_mq.rs +38 -7
  52. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/ibm_mq_tls.rs +9 -1
  53. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/kafka.rs +3 -3
  54. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/mariadb.rs +8 -2
  55. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/mod.rs +2 -2
  56. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/mysql.rs +3 -2
  57. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/postgres.rs +8 -2
  58. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/route.rs +35 -10
  59. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration_test.rs +10 -10
  60. mq_bridge_py_basic-0.3.0/PKG-INFO +0 -191
  61. mq_bridge_py_basic-0.3.0/mq_bridge/__init__.pyi +0 -146
  62. mq_bridge_py_basic-0.3.0/python/mq-bridge-py/README.md +0 -167
  63. mq_bridge_py_basic-0.3.0/python/mq-bridge-py/tests/test_routes.py +0 -143
  64. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  65. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  66. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  67. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/node.yml +0 -0
  68. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/python.yml +0 -0
  69. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/release.yml +0 -0
  70. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.github/workflows/test-matrix.yml +0 -0
  71. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/.gitignore +0 -0
  72. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/ARCHITECTURE.md +0 -0
  73. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/CONFIGURATION.md +0 -0
  74. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/CONTRIBUTING.md +0 -0
  75. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/LICENSE +0 -0
  76. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/LICENSE.python +0 -0
  77. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/benches/router_bench.rs +0 -0
  78. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/build.rs +0 -0
  79. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/claude.md +0 -0
  80. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/examples/ipc_worker_queue.yaml +0 -0
  81. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/mq-bridge.schema.json +0 -0
  82. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/mq_bridge/config.py +0 -0
  83. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/mq_bridge/py.typed +0 -0
  84. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/package-lock.json +0 -0
  85. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/LICENSE.python +0 -0
  86. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
  87. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/examples/memory.yaml +0 -0
  88. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/tests/test_config_types.py +0 -0
  89. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/tests/test_packaging.py +0 -0
  90. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
  91. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/tests/test_public_api.py +0 -0
  92. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/python/mq-bridge-py/uv.lock +0 -0
  93. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
  94. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/analysis/benches/metadata_bench.rs +0 -0
  95. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
  96. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/analysis/http/http_flamegraph.py +0 -0
  97. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
  98. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/analysis/http/run_http_ladder.sh +0 -0
  99. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/httparena/README.md +0 -0
  100. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
  101. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
  102. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
  103. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
  104. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
  105. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
  106. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
  107. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/techempower/README.md +0 -0
  108. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/techempower/postgres.yml +0 -0
  109. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/techempower/seed.sql +0 -0
  110. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/techempower/verify.sh +0 -0
  111. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/the-benchmarker/README.md +0 -0
  112. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
  113. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
  114. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
  115. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/command_handler.rs +0 -0
  116. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/connection_registry.rs +0 -0
  117. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/fanout.rs +0 -0
  118. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/grpc.proto +0 -0
  119. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/http_stream.rs +0 -0
  120. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/memory/endpoint.rs +0 -0
  121. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/memory/ipc_unix.rs +0 -0
  122. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/memory/ipc_windows.rs +0 -0
  123. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/memory/memory_transport.rs +0 -0
  124. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/memory/mod.rs +0 -0
  125. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/memory/transport.rs +0 -0
  126. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/null.rs +0 -0
  127. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/reader.rs +0 -0
  128. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/response.rs +0 -0
  129. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/sqlx.rs +0 -0
  130. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/static_endpoint.rs +0 -0
  131. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/stream_buffer.rs +0 -0
  132. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/switch.rs +0 -0
  133. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/endpoints/websocket.rs +0 -0
  134. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/errors.rs +0 -0
  135. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/event_handler.rs +0 -0
  136. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/event_store.rs +0 -0
  137. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/extensions.rs +0 -0
  138. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/lib.rs +0 -0
  139. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/buffer.rs +0 -0
  140. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/cookie_jar.rs +0 -0
  141. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/deduplication.rs +0 -0
  142. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/delay.rs +0 -0
  143. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/dlq.rs +0 -0
  144. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/limiter.rs +0 -0
  145. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/metrics.rs +0 -0
  146. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/mod.rs +0 -0
  147. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/random_panic.rs +0 -0
  148. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/retry.rs +0 -0
  149. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/middleware/weak_join.rs +0 -0
  150. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/outcomes.rs +0 -0
  151. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/publisher.rs +0 -0
  152. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/response.rs +0 -0
  153. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/route.rs +0 -0
  154. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/src/type_handler.rs +0 -0
  155. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/README.md +0 -0
  156. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/amqp.rs +0 -0
  157. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/aws.rs +0 -0
  158. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/config.toml +0 -0
  159. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/amqp.yml +0 -0
  160. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/aws.yml +0 -0
  161. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  162. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
  163. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  164. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  165. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  166. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/ibm_mq.yml +0 -0
  167. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
  168. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/kafka-tls.yml +0 -0
  169. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/kafka.yml +0 -0
  170. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mariadb.yml +0 -0
  171. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
  172. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
  173. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mongodb.yml +0 -0
  174. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mosquitto.conf +0 -0
  175. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
  176. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
  177. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
  178. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mqtt.yml +0 -0
  179. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
  180. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/mysql.yml +0 -0
  181. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/nats.yml +0 -0
  182. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/docker-compose/postgres.yml +0 -0
  183. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/file.rs +0 -0
  184. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/grpc_tls.rs +0 -0
  185. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/http.rs +0 -0
  186. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/http_tls.rs +0 -0
  187. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/ipc.rs +0 -0
  188. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/kafka_tls.rs +0 -0
  189. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/logic_test.rs +0 -0
  190. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/memory.rs +0 -0
  191. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/mongodb.rs +0 -0
  192. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/mongodb_raw.rs +0 -0
  193. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/mongodb_tls.rs +0 -0
  194. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/mqtt.rs +0 -0
  195. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/nats.rs +0 -0
  196. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/performance_static.rs +0 -0
  197. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/scripts/gen_certs.sh +0 -0
  198. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/sqlite.rs +0 -0
  199. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/tls_helpers.rs +0 -0
  200. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/websocket.rs +0 -0
  201. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/integration/zeromq.rs +0 -0
  202. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/memory_leak_test.rs +0 -0
  203. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/ref_test.rs +0 -0
  204. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/sqlite_test.rs +0 -0
  205. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/tls_example.rs +0 -0
  206. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/unit_tests.md +0 -0
  207. {mq_bridge_py_basic-0.3.0 → mq_bridge_py_basic-0.3.2}/tests/websocket_test.rs +0 -0
@@ -2,9 +2,10 @@ name: Benchmark
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
5
+ branches: [main, dev]
6
+ schedule:
7
+ # Nightly full benchmark run (04:00 UTC)
8
+ - cron: '0 4 * * *'
8
9
  workflow_dispatch:
9
10
 
10
11
  env:
@@ -24,17 +25,12 @@ jobs:
24
25
  - name: Install Rust toolchain
25
26
  uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
26
27
 
27
- - name: Cache cargo registry
28
- uses: actions/cache@v4
28
+ - name: Cache cargo build
29
+ uses: Swatinem/rust-cache@v2
29
30
  with:
30
- path: |
31
- ~/.cargo/bin/
32
- ~/.cargo/registry/cache/
33
- ~/.cargo/git/db/
34
- target/
35
- key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
36
- restore-keys: |
37
- ${{ runner.os }}-cargo-
31
+ # Shared with the release-mode integration jobs so the full-feature
32
+ # dependency compile is reused across jobs/runs instead of rebuilt.
33
+ shared-key: release-full
38
34
 
39
35
  - name: Pre-pull docker images
40
36
  run: |
@@ -107,35 +107,74 @@ jobs:
107
107
  - name: Memory leak soak (route commit-task JoinSet)
108
108
  run: cargo test --test memory_leak_test --features=full -- --ignored --nocapture
109
109
 
110
- # Integration tests (requires Docker) split into parallel jobs
110
+ # Compile the integration test binaries ONCE (release, full,test-utils) and
111
+ # publish them as a nextest archive. The three run jobs below download this
112
+ # archive instead of each recompiling the same binaries.
113
+ integration-build:
114
+ name: Integration — Build
115
+ runs-on: ubuntu-latest
116
+ steps:
117
+ - uses: actions/checkout@v4
118
+
119
+ - name: Install Rust toolchain
120
+ uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
121
+
122
+ - name: Install cargo-nextest
123
+ uses: taiki-e/install-action@v2
124
+ with:
125
+ tool: nextest
126
+
127
+ - name: Cache cargo build
128
+ uses: Swatinem/rust-cache@v2
129
+ with:
130
+ # Shared with the benchmark job so the full-feature dependency compile
131
+ # is reused across jobs/runs.
132
+ shared-key: release-full
133
+
134
+ - name: Build nextest archive
135
+ run: |
136
+ cargo nextest archive \
137
+ --release --features full,test-utils \
138
+ --test integration_test --test armature_integration \
139
+ --archive-file nextest-archive.tar.zst
140
+
141
+ - name: Upload nextest archive
142
+ uses: actions/upload-artifact@v4
143
+ with:
144
+ name: integration-nextest-archive
145
+ path: nextest-archive.tar.zst
146
+ retention-days: 1
147
+
148
+ # Integration tests (requires Docker) split into parallel jobs. Each runs the
149
+ # prebuilt nextest archive from integration-build — no recompilation.
111
150
  integration-others:
112
151
  name: Integration — Others
113
152
  runs-on: ubuntu-latest
153
+ needs: integration-build
114
154
  services:
115
155
  docker:
116
156
  image: docker:dind
117
157
  options: --privileged
118
158
  steps:
119
159
  - uses: actions/checkout@v4
120
-
121
- - name: Install Rust toolchain
122
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
123
-
124
- - name: Cache cargo build
125
- uses: Swatinem/rust-cache@v2
160
+
161
+ - name: Install cargo-nextest
162
+ uses: taiki-e/install-action@v2
126
163
  with:
127
- # Differentiates the matrix `check` job per feature set; evaluates to an
128
- # empty string (no-op) in non-matrix jobs. rust-cache already keys on the
129
- # job id, OS, rustc version, and lockfiles automatically.
130
- key: ${{ matrix.features }}
131
-
164
+ tool: nextest
165
+
166
+ - name: Download nextest archive
167
+ uses: actions/download-artifact@v4
168
+ with:
169
+ name: integration-nextest-archive
170
+
132
171
  - name: Pre-pull docker images
133
172
  run: |
134
173
  find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
135
- - name: Install JDK (for keytool)
174
+ - name: Install JRE (for keytool)
136
175
  run: |
137
176
  sudo apt-get update
138
- sudo apt-get install -y default-jdk
177
+ sudo apt-get install -y default-jre-headless
139
178
 
140
179
  - name: Generate TLS certs for integration services
141
180
  run: |
@@ -146,15 +185,20 @@ jobs:
146
185
 
147
186
  - name: Run chaos/stability tests
148
187
  run: |
149
- cargo test --test integration_test --release --features full,test-utils -- --ignored --nocapture --test-threads=1 --exact test_all_chaos
188
+ cargo nextest run --archive-file nextest-archive.tar.zst \
189
+ --run-ignored all --no-capture \
190
+ -E 'binary(integration_test) & test(=test_all_chaos)'
150
191
 
151
192
  - name: Run remaining integration tests (excluding chaos & performance)
152
193
  run: |
153
- cargo test --test integration_test --release --features full,test-utils -- --ignored --nocapture --test-threads=1 --skip test_all_chaos --skip test_all_performance_pipeline --skip test_all_performance_direct
194
+ cargo nextest run --archive-file nextest-archive.tar.zst \
195
+ --run-ignored all --no-capture \
196
+ -E 'binary(integration_test) & not test(=test_all_chaos) & not test(=test_all_performance_pipeline) & not test(=test_all_performance_direct)'
154
197
 
155
198
  integration-performance:
156
199
  name: Integration — Performance
157
200
  runs-on: ubuntu-latest
201
+ needs: integration-build
158
202
  services:
159
203
  docker:
160
204
  image: docker:dind
@@ -162,24 +206,23 @@ jobs:
162
206
  steps:
163
207
  - uses: actions/checkout@v4
164
208
 
165
- - name: Install Rust toolchain
166
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
209
+ - name: Install cargo-nextest
210
+ uses: taiki-e/install-action@v2
211
+ with:
212
+ tool: nextest
167
213
 
168
- - name: Cache cargo build
169
- uses: Swatinem/rust-cache@v2
214
+ - name: Download nextest archive
215
+ uses: actions/download-artifact@v4
170
216
  with:
171
- # Differentiates the matrix `check` job per feature set; evaluates to an
172
- # empty string (no-op) in non-matrix jobs. rust-cache already keys on the
173
- # job id, OS, rustc version, and lockfiles automatically.
174
- key: ${{ matrix.features }}
217
+ name: integration-nextest-archive
175
218
 
176
219
  - name: Pre-pull docker images
177
220
  run: |
178
221
  find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
179
- - name: Install JDK (for keytool)
222
+ - name: Install JRE (for keytool)
180
223
  run: |
181
224
  sudo apt-get update
182
- sudo apt-get install -y default-jdk
225
+ sudo apt-get install -y default-jre-headless
183
226
 
184
227
  - name: Generate TLS certs for integration services
185
228
  run: |
@@ -190,15 +233,20 @@ jobs:
190
233
 
191
234
  - name: Run pipeline performance tests
192
235
  run: |
193
- cargo test --test integration_test --release --features full,test-utils -- --ignored --nocapture --test-threads=1 --exact test_all_performance_pipeline
236
+ cargo nextest run --archive-file nextest-archive.tar.zst \
237
+ --run-ignored all --no-capture \
238
+ -E 'binary(integration_test) & test(=test_all_performance_pipeline)'
194
239
 
195
240
  - name: Run other performance tests
196
241
  run: |
197
- cargo test --test integration_test --release --features full,test-utils -- --ignored --nocapture --test-threads=1 --exact test_all_performance_direct
242
+ cargo nextest run --archive-file nextest-archive.tar.zst \
243
+ --run-ignored all --no-capture \
244
+ -E 'binary(integration_test) & test(=test_all_performance_direct)'
198
245
 
199
246
  integration-armature:
200
247
  name: Integration — Armature
201
248
  runs-on: ubuntu-latest
249
+ needs: integration-build
202
250
  services:
203
251
  docker:
204
252
  image: docker:dind
@@ -206,24 +254,23 @@ jobs:
206
254
  steps:
207
255
  - uses: actions/checkout@v4
208
256
 
209
- - name: Install Rust toolchain
210
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
257
+ - name: Install cargo-nextest
258
+ uses: taiki-e/install-action@v2
259
+ with:
260
+ tool: nextest
211
261
 
212
- - name: Cache cargo build
213
- uses: Swatinem/rust-cache@v2
262
+ - name: Download nextest archive
263
+ uses: actions/download-artifact@v4
214
264
  with:
215
- # Differentiates the matrix `check` job per feature set; evaluates to an
216
- # empty string (no-op) in non-matrix jobs. rust-cache already keys on the
217
- # job id, OS, rustc version, and lockfiles automatically.
218
- key: ${{ matrix.features }}
265
+ name: integration-nextest-archive
219
266
 
220
267
  - name: Pre-pull docker images
221
268
  run: |
222
269
  find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
223
- - name: Install JDK (for keytool)
270
+ - name: Install JRE (for keytool)
224
271
  run: |
225
272
  sudo apt-get update
226
- sudo apt-get install -y default-jdk
273
+ sudo apt-get install -y default-jre-headless
227
274
 
228
275
  - name: Generate TLS certs for integration services
229
276
  run: |
@@ -234,7 +281,9 @@ jobs:
234
281
 
235
282
  - name: Run armature integration tests
236
283
  run: |
237
- cargo test --test armature_integration --release --features full,test-utils -- --ignored --nocapture --test-threads=1
284
+ cargo nextest run --archive-file nextest-archive.tar.zst \
285
+ --run-ignored all --no-capture \
286
+ -E 'binary(armature_integration)'
238
287
 
239
288
  # Documentation
240
289
  docs:
@@ -82,10 +82,16 @@ jobs:
82
82
  ls -la /opt/mqm/lib64/ || echo "MQ lib64 directory not found"
83
83
  echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
84
84
 
85
- - name: Build with IBM MQ feature
85
+ # `ibm-mq` (dlopen) is the shipping path and needs no SDK at build; the
86
+ # redist install above only provides headers for the static compile-check.
87
+ - name: Build with IBM MQ feature (dlopen)
86
88
  if: steps.mqclient.outputs.available == 'true'
87
89
  run: cargo build --features ibm-mq
88
90
 
91
+ - name: Build with IBM MQ feature (static link)
92
+ if: steps.mqclient.outputs.available == 'true'
93
+ run: cargo build --features ibm-mq-static
94
+
89
95
  - name: Run clippy on IBM MQ code
90
96
  if: steps.mqclient.outputs.available == 'true'
91
97
  run: cargo clippy --features ibm-mq -- -D warnings
@@ -156,13 +162,18 @@ jobs:
156
162
 
157
163
  - name: Run IBM MQ integration tests
158
164
  if: steps.mqclient.outputs.available == 'true'
165
+ env:
166
+ MQB_TEST_BACKEND: ibm-mq
159
167
  run: |
168
+ # The test fns are named test_all_* (filtered to ibm-mq via
169
+ # MQB_TEST_BACKEND). The previous test_ibm_mq_* filters matched no
170
+ # test, so this job silently ran zero tests.
160
171
  cargo test --test integration_test --features ibm-mq,test-utils,rustls-ring -- \
161
172
  --ignored --nocapture --test-threads=1 \
162
- test_ibm_mq_subscriber_logic \
163
- test_ibm_mq_performance_pipeline \
164
- test_ibm_mq_chaos \
165
- test_ibm_mq_status
173
+ test_all_subscriber_logic \
174
+ test_all_performance_pipeline \
175
+ test_all_chaos \
176
+ test_all_status
166
177
 
167
178
  - name: Run IBM MQ TLS tests
168
179
  if: steps.mqclient.outputs.available == 'true'
@@ -10,11 +10,12 @@ name: Publish Node Package
10
10
  # RHEL 9 (glibc 2.34), Debian 11/12 and Ubuntu 20.04+ — covering the priority
11
11
  # server targets. macOS/Windows build natively.
12
12
  #
13
- # Auth: token-or-OIDC. If the `NPM_TOKEN` secret is set it is used (needed for the
14
- # one-time bootstrap that creates the 5 platform packages, since npm has no
15
- # pending-publisher concept). Once all six packages exist and trusted publishing
16
- # is configured for them, remove the secret and publishing continues via OIDC
17
- # (id-token) with provenance no token.
13
+ # Auth: OIDC trusted publishing. The one-time bootstrap (which used an NPM_TOKEN
14
+ # secret to create the 5 platform packages, since npm has no pending-publisher
15
+ # concept) is done; all six packages exist with trusted publishing configured, so
16
+ # publishing runs via OIDC (id-token) with provenance no token. We deliberately
17
+ # do NOT read NPM_TOKEN: a present-but-expired secret would be sent to the registry
18
+ # and 401 instead of falling back to OIDC, so the credential is left out entirely.
18
19
 
19
20
  on:
20
21
  release:
@@ -67,6 +68,9 @@ jobs:
67
68
  env:
68
69
  CARGO_NET_RETRY: "5"
69
70
  CARGO_NET_GIT_FETCH_WITH_CLI: "true"
71
+ # curl's HTTP/2 multiplexing flakes on Windows runners ("[55] Failed
72
+ # sending data to the peer"); force HTTP/1.1 so fetches are reliable.
73
+ CARGO_HTTP_MULTIPLEXING: "false"
70
74
  run: >-
71
75
  npx napi build --platform --release --strip
72
76
  --target ${{ matrix.target }}
@@ -129,6 +133,9 @@ jobs:
129
133
  env:
130
134
  CARGO_NET_RETRY: "5"
131
135
  CARGO_NET_GIT_FETCH_WITH_CLI: "true"
136
+ # curl's HTTP/2 multiplexing flakes on Windows runners ("[55] Failed
137
+ # sending data to the peer"); force HTTP/1.1 so fetches are reliable.
138
+ CARGO_HTTP_MULTIPLEXING: "false"
132
139
  run: >-
133
140
  npx napi build --platform --release --strip
134
141
  --target ${{ matrix.target }}
@@ -220,8 +227,7 @@ jobs:
220
227
  - name: Publish platform packages and root
221
228
  working-directory: node/mq-bridge-node
222
229
  env:
223
- # Empty when the secret is unset -> npm falls back to OIDC.
224
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
230
+ # No NODE_AUTH_TOKEN: publishing is OIDC-only (trusted publishing).
225
231
  NPM_CONFIG_PROVENANCE: "true"
226
232
  run: |
227
233
  set -e
@@ -39,6 +39,25 @@ jobs:
39
39
  os: linux
40
40
  target: aarch64
41
41
  args: --release --out dist --find-interpreter --no-default-features
42
+ # musl/Alpine wheels for the basic package. basic uses the aws-lc-sys
43
+ # crypto provider (amqp + aws pull it in, same as full); aws-lc-sys
44
+ # compiles its C natively under musl given cmake + gcc, which
45
+ # before-script-linux installs in the musllinux container. The full
46
+ # wheel has no musl build (rdkafka makes it a separate effort).
47
+ - package: mq-bridge-py-basic
48
+ pyproject: pyproject-basic.toml
49
+ runner: ubuntu-latest
50
+ os: linux
51
+ target: x86_64
52
+ manylinux: musllinux_1_2
53
+ args: --release --out dist --find-interpreter --no-default-features
54
+ - package: mq-bridge-py-basic
55
+ pyproject: pyproject-basic.toml
56
+ runner: ubuntu-24.04-arm
57
+ os: linux
58
+ target: aarch64
59
+ manylinux: musllinux_1_2
60
+ args: --release --out dist --find-interpreter --no-default-features
42
61
  - package: mq-bridge-py-basic
43
62
  pyproject: pyproject-basic.toml
44
63
  runner: macos-15-intel
@@ -126,12 +145,18 @@ jobs:
126
145
  target: ${{ matrix.target }}
127
146
  args: ${{ matrix.args }}
128
147
  sccache: "true"
129
- manylinux: auto
148
+ manylinux: ${{ matrix.manylinux || 'auto' }}
149
+ # amqp/aws (and full's kafka) pull aws-lc-sys, which compiles its C with
150
+ # cmake. manylinux containers already ship it; the musllinux (Alpine)
151
+ # container does not, so install it there. Guarded so it's a no-op
152
+ # wherever cmake is already present. Only runs for linux builds.
153
+ before-script-linux: |
154
+ command -v cmake >/dev/null 2>&1 || apk add --no-cache cmake gcc g++ make musl-dev perl
130
155
 
131
156
  - name: Upload wheels
132
157
  uses: actions/upload-artifact@v4
133
158
  with:
134
- name: wheels-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }}
159
+ name: wheels-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }}-${{ matrix.manylinux || 'auto' }}
135
160
  path: python/mq-bridge-py/dist
136
161
 
137
162
  build-sdists:
@@ -1576,6 +1576,29 @@ dependencies = [
1576
1576
  "syn",
1577
1577
  ]
1578
1578
 
1579
+ [[package]]
1580
+ name = "dlopen2"
1581
+ version = "0.8.2"
1582
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1583
+ checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4"
1584
+ dependencies = [
1585
+ "dlopen2_derive",
1586
+ "libc",
1587
+ "once_cell",
1588
+ "winapi",
1589
+ ]
1590
+
1591
+ [[package]]
1592
+ name = "dlopen2_derive"
1593
+ version = "0.4.3"
1594
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1595
+ checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f"
1596
+ dependencies = [
1597
+ "proc-macro2",
1598
+ "quote",
1599
+ "syn",
1600
+ ]
1601
+
1579
1602
  [[package]]
1580
1603
  name = "dlv-list"
1581
1604
  version = "0.5.2"
@@ -2775,6 +2798,10 @@ name = "libmqm-sys"
2775
2798
  version = "0.10.2"
2776
2799
  source = "registry+https://github.com/rust-lang/crates.io-index"
2777
2800
  checksum = "d888946090ed1e149d6978906143db293b9232c9a8cca0b369a1dc4668d9082a"
2801
+ dependencies = [
2802
+ "dlopen2",
2803
+ "libc",
2804
+ ]
2778
2805
 
2779
2806
  [[package]]
2780
2807
  name = "libsqlite3-sys"
@@ -3082,7 +3109,7 @@ dependencies = [
3082
3109
 
3083
3110
  [[package]]
3084
3111
  name = "mq-bridge"
3085
- version = "0.3.0"
3112
+ version = "0.3.2"
3086
3113
  dependencies = [
3087
3114
  "anyhow",
3088
3115
  "arc-swap",
@@ -3107,6 +3134,7 @@ dependencies = [
3107
3134
  "hyper-rustls 0.27.9",
3108
3135
  "hyper-util",
3109
3136
  "lapin",
3137
+ "libmqm-sys",
3110
3138
  "metrics",
3111
3139
  "metrics-util",
3112
3140
  "mongodb",
@@ -3147,20 +3175,32 @@ dependencies = [
3147
3175
  "zeromq",
3148
3176
  ]
3149
3177
 
3178
+ [[package]]
3179
+ name = "mq-bridge-bindings-common"
3180
+ version = "0.3.2"
3181
+ dependencies = [
3182
+ "anyhow",
3183
+ "fast-uuid-v7",
3184
+ "mq-bridge",
3185
+ "serde",
3186
+ "serde_yaml_ng",
3187
+ "tokio",
3188
+ ]
3189
+
3150
3190
  [[package]]
3151
3191
  name = "mq-bridge-node"
3152
- version = "0.3.0"
3192
+ version = "0.3.2"
3153
3193
  dependencies = [
3154
3194
  "anyhow",
3155
3195
  "async-trait",
3156
3196
  "bytes",
3157
3197
  "fast-uuid-v7",
3158
3198
  "mq-bridge",
3199
+ "mq-bridge-bindings-common",
3159
3200
  "napi",
3160
3201
  "napi-build",
3161
3202
  "napi-derive",
3162
3203
  "schemars",
3163
- "serde",
3164
3204
  "serde_json",
3165
3205
  "serde_yaml_ng",
3166
3206
  "tokio",
@@ -3169,13 +3209,14 @@ dependencies = [
3169
3209
 
3170
3210
  [[package]]
3171
3211
  name = "mq-bridge-py"
3172
- version = "0.3.0"
3212
+ version = "0.3.2"
3173
3213
  dependencies = [
3174
3214
  "anyhow",
3175
3215
  "async-trait",
3176
3216
  "bytes",
3177
3217
  "fast-uuid-v7",
3178
3218
  "mq-bridge",
3219
+ "mq-bridge-bindings-common",
3179
3220
  "pyo3",
3180
3221
  "rustls 0.23.40",
3181
3222
  "schemars",
@@ -3193,6 +3234,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3193
3234
  checksum = "298bea58d1259df694242dc973b07ce156660c897a7b3a421e324b1f37905cdc"
3194
3235
  dependencies = [
3195
3236
  "derive_more",
3237
+ "dlopen2",
3196
3238
  "libmqm-constants",
3197
3239
  "libmqm-default",
3198
3240
  "libmqm-sys",
@@ -12,11 +12,11 @@ keywords = ["messaging", "kafka", "nats", "amqp", "cqrs"]
12
12
  categories = ["asynchronous", "network-programming"]
13
13
 
14
14
  [workspace]
15
- members = ["python/mq-bridge-py"]
15
+ members = ["bindings-common", "python/mq-bridge-py"]
16
16
  resolver = "2"
17
17
 
18
18
  [workspace.package]
19
- version = "0.3.0"
19
+ version = "0.3.2"
20
20
 
21
21
  [workspace.dependencies]
22
22
  anyhow = "1.0"
@@ -106,8 +106,13 @@ async-nats = { version = "0.49", optional = true }
106
106
  # or `tokio-rustls?/aws_lc_rs` from the crypto features below.
107
107
  rumqttc = { version = "0.25", default-features = false, features = ["use-rustls-no-provider"], optional = true }
108
108
 
109
- # IBM MQ
110
- mqi = { version = "0.3", optional = true }
109
+ # IBM MQ. default-features off so the version/provider features are chosen per
110
+ # feature below: `ibm-mq` loads the client at runtime via dlopen (no SDK at
111
+ # build), `ibm-mq-static` links the IBM C client at build (needs the SDK).
112
+ mqi = { version = "0.3", optional = true, default-features = false }
113
+ # Direct dep only for the dlopen path, so we can name MqmContainer to load the
114
+ # client at runtime. Features are unified from mqi/dlopen2.
115
+ libmqm-sys = { version = "0.10", optional = true, default-features = false }
111
116
 
112
117
  # HTTP
113
118
  arc-swap = { version = "1", optional = true }
@@ -154,7 +159,11 @@ protoc-bin-vendored = { version = "3.0", optional = true }
154
159
  [features]
155
160
  default = []
156
161
  middleware = ["metrics", "dedup"]
157
- full = ["middleware", "mongodb", "kafka", "amqp", "nats", "mqtt", "http", "aws", "zeromq", "sled", "grpc", "sqlx", "websocket", "rustls-aws-lc"]
162
+ # ibm-mq (dlopen) is safe to include: it needs no IBM SDK at build, and at
163
+ # runtime the client is loaded lazily only when an ibm-mq endpoint is opened
164
+ # (clear error if the client isn't installed). Use `ibm-mq-static` instead for
165
+ # static linking.
166
+ full = ["middleware", "mongodb", "kafka", "amqp", "nats", "mqtt", "http", "aws", "zeromq", "sled", "grpc", "sqlx", "websocket", "rustls-aws-lc", "ibm-mq"]
158
167
 
159
168
  # Functionality features
160
169
  dedup = ["sled"]
@@ -183,7 +192,16 @@ mqtt = ["rumqttc", "rustls", "tokio-rustls", "rustls-pemfile", "url"]
183
192
  http = ["dep:arc-swap", "hyper", "hyper-util", "hyper-rustls", "http-body-util", "dep:http-body", "rustls", "tokio-rustls", "rustls-pemfile", "webpki-roots", "h2", "dep:flate2", "dep:base64"]
184
193
  websocket = ["dep:tokio-websockets"]
185
194
  aws = ["aws-config", "aws-sdk-sqs", "aws-sdk-sns", "dep:base64"]
186
- ibm-mq = ["mqi"]
195
+ # Runtime-loaded IBM MQ client via dlopen: builds with no SDK present; the IBM
196
+ # redistributable client is only needed at runtime, and only if an ibm-mq
197
+ # endpoint is actually used.
198
+ # mqi/mqai is required because mqi's always-compiled (doc-hidden) test module
199
+ # references MqaiLibrary on the dlopen2 path; it adds only pregen bindings, no SDK.
200
+ ibm-mq = ["dep:mqi", "mqi/dlopen2", "mqi/mqai", "mqi/mqc_9_2_0_0", "dep:libmqm-sys", "libmqm-sys/dlopen2"]
201
+ # Static-link IBM MQ client (needs the IBM SDK at build time). mqc_9_2_0_0 matches
202
+ # the crate's previous default so behavior is unchanged. Enabling this alongside
203
+ # `ibm-mq` (dlopen) forces static linking — the SDK is then required at build.
204
+ ibm-mq-static = ["dep:mqi", "mqi/link", "mqi/mqc_9_2_0_0"]
187
205
  zeromq = ["dep:zeromq"]
188
206
  # Note: The grpc feature requires protobuf-src which can significantly increase build times.
189
207
  grpc = ["tonic", "prost", "tokio-stream", "tonic-prost", "tonic-prost-build", "protoc-bin-vendored", "rustls"]