mq-bridge-py-basic 0.2.20__tar.gz → 0.2.21__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 (198) hide show
  1. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/ibm-mq.yml +37 -11
  2. mq_bridge_py_basic-0.2.21/.github/workflows/node.yml +69 -0
  3. mq_bridge_py_basic-0.2.21/.github/workflows/publish-node.yml +211 -0
  4. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/publish-python.yml +6 -0
  5. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/python.yml +13 -0
  6. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/Cargo.lock +114 -2
  7. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/Cargo.toml +1 -1
  8. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/PKG-INFO +1 -1
  9. mq_bridge_py_basic-0.2.21/package-lock.json +6 -0
  10. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/Cargo.toml +9 -6
  11. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/scripts/gen_config_types.py +2 -1
  12. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/src/lib.rs +44 -4
  13. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/tests/test_public_api.py +9 -0
  14. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +2 -2
  15. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/canonical_message.rs +2 -2
  16. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/amqp.rs +67 -8
  17. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/http.rs +153 -22
  18. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/websocket.rs +73 -12
  19. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/weak_join.rs +2 -1
  20. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/route.rs +4 -0
  21. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/test_utils.rs +15 -5
  22. mq_bridge_py_basic-0.2.21/tests/README.md +29 -0
  23. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/armature_integration.rs +2 -0
  24. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/amqp.rs +65 -0
  25. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/grpc_tls.rs +2 -0
  26. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/http_tls.rs +2 -0
  27. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/ibm_mq_tls.rs +2 -0
  28. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/kafka_tls.rs +1 -0
  29. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mongodb_tls.rs +1 -0
  30. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration_test.rs +8 -2
  31. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/sqlite_test.rs +3 -1
  32. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/websocket_test.rs +48 -0
  33. mq_bridge_py_basic-0.2.20/tests/README.md +0 -19
  34. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  35. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  36. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  37. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/benchmark.yml +0 -0
  38. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/ci.yml +0 -0
  39. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/release.yml +0 -0
  40. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/test-matrix.yml +0 -0
  41. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.gitignore +0 -0
  42. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/ARCHITECTURE.md +0 -0
  43. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/CONFIGURATION.md +0 -0
  44. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/CONTRIBUTING.md +0 -0
  45. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/LICENSE +0 -0
  46. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/LICENSE.python +0 -0
  47. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/README.md +0 -0
  48. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/benches/performance_bench.rs +0 -0
  49. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/benches/router_bench.rs +0 -0
  50. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/build.rs +0 -0
  51. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/claude.md +0 -0
  52. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/examples/ipc_worker_queue.yaml +0 -0
  53. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq-bridge.schema.json +0 -0
  54. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/__init__.py +0 -0
  55. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/__init__.pyi +0 -0
  56. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/config.py +0 -0
  57. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/config.pyi +152 -152
  58. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/py.typed +0 -0
  59. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/pyproject.toml +0 -0
  60. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/LICENSE.python +0 -0
  61. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/README.md +0 -0
  62. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
  63. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/example.py +0 -0
  64. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/bench_memory.py +0 -0
  65. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
  66. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/json_route.py +0 -0
  67. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/memory.yaml +0 -0
  68. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/raw_route.py +0 -0
  69. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/pyproject-basic.toml +0 -0
  70. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/tests/test_config_types.py +0 -0
  71. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/tests/test_packaging.py +0 -0
  72. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
  73. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/tests/test_routes.py +0 -0
  74. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/uv.lock +0 -0
  75. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
  76. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/benches/metadata_bench.rs +0 -0
  77. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
  78. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
  79. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/http/http_flamegraph.py +0 -0
  80. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
  81. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/http/run_http_ladder.sh +0 -0
  82. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/httparena/README.md +0 -0
  83. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
  84. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
  85. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
  86. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
  87. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
  88. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
  89. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/README.md +0 -0
  90. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/postgres.yml +0 -0
  91. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/seed.sql +0 -0
  92. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/verify.sh +0 -0
  93. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/the-benchmarker/README.md +0 -0
  94. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
  95. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
  96. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
  97. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/command_handler.rs +0 -0
  98. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/aws.rs +0 -0
  99. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/fanout.rs +0 -0
  100. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/file.rs +0 -0
  101. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/grpc.proto +0 -0
  102. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/grpc.rs +0 -0
  103. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/http_stream.rs +0 -0
  104. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/ibm_mq.rs +0 -0
  105. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/kafka.rs +0 -0
  106. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/endpoint.rs +0 -0
  107. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/ipc_unix.rs +0 -0
  108. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/ipc_windows.rs +0 -0
  109. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/memory_transport.rs +0 -0
  110. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/mod.rs +0 -0
  111. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/transport.rs +0 -0
  112. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/mod.rs +0 -0
  113. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/mongodb.rs +0 -0
  114. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/mqtt.rs +0 -0
  115. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/nats.rs +0 -0
  116. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/null.rs +0 -0
  117. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/reader.rs +0 -0
  118. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/response.rs +0 -0
  119. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/sled.rs +0 -0
  120. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/sqlx.rs +0 -0
  121. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/static_endpoint.rs +0 -0
  122. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/stream_buffer.rs +0 -0
  123. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/switch.rs +0 -0
  124. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/zeromq.rs +0 -0
  125. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/errors.rs +0 -0
  126. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/event_handler.rs +0 -0
  127. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/event_store.rs +0 -0
  128. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/extensions.rs +0 -0
  129. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/lib.rs +0 -0
  130. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/buffer.rs +0 -0
  131. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/cookie_jar.rs +0 -0
  132. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/deduplication.rs +0 -0
  133. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/delay.rs +0 -0
  134. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/dlq.rs +0 -0
  135. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/limiter.rs +0 -0
  136. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/metrics.rs +0 -0
  137. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/mod.rs +0 -0
  138. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/random_panic.rs +0 -0
  139. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/retry.rs +0 -0
  140. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/models.rs +0 -0
  141. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/outcomes.rs +0 -0
  142. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/publisher.rs +0 -0
  143. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/response.rs +0 -0
  144. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/traits.rs +0 -0
  145. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/type_handler.rs +0 -0
  146. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/aws.rs +0 -0
  147. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/config.toml +0 -0
  148. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/amqp.yml +0 -0
  149. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/aws.yml +0 -0
  150. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  151. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
  152. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  153. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  154. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  155. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm_mq.yml +0 -0
  156. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
  157. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/kafka-tls.yml +0 -0
  158. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/kafka.yml +0 -0
  159. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mariadb.yml +0 -0
  160. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
  161. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
  162. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mongodb.yml +0 -0
  163. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mosquitto.conf +0 -0
  164. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
  165. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
  166. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mq_init.mqsc +0 -0
  167. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
  168. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mqtt.yml +0 -0
  169. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
  170. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mysql.yml +0 -0
  171. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/nats.yml +0 -0
  172. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/postgres.yml +0 -0
  173. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/file.rs +0 -0
  174. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/grpc.rs +0 -0
  175. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/http.rs +0 -0
  176. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/ibm_mq.rs +0 -0
  177. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/ipc.rs +0 -0
  178. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/kafka.rs +0 -0
  179. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/logic_test.rs +0 -0
  180. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mariadb.rs +0 -0
  181. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/memory.rs +0 -0
  182. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mod.rs +0 -0
  183. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mongodb.rs +0 -0
  184. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mongodb_raw.rs +0 -0
  185. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mqtt.rs +0 -0
  186. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mysql.rs +0 -0
  187. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/nats.rs +0 -0
  188. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/performance_static.rs +0 -0
  189. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/postgres.rs +0 -0
  190. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/route.rs +0 -0
  191. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/scripts/gen_certs.sh +0 -0
  192. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/sqlite.rs +0 -0
  193. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/tls_helpers.rs +0 -0
  194. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/websocket.rs +0 -0
  195. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/zeromq.rs +0 -0
  196. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/ref_test.rs +0 -0
  197. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/tls_example.rs +0 -0
  198. {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/unit_tests.md +0 -0
@@ -54,10 +54,18 @@ jobs:
54
54
  ${{ runner.os }}-cargo-
55
55
 
56
56
  - name: Install IBM MQ Client Libraries
57
+ id: mqclient
57
58
  run: |
58
59
  archive_url="$IBM_MQ_REDIST_URL"
59
60
  archive_name="$(basename "$archive_url")"
60
- curl -fsSLO "$archive_url"
61
+ # IBM's download host is occasionally unreachable from runners. Treat a
62
+ # download failure as infrastructure flakiness and skip the rest of the
63
+ # job (see `if:` guards below). Checksum/extract failures still fail.
64
+ if ! curl -fsSLO --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 "$archive_url"; then
65
+ echo "::warning::IBM MQ redist download failed (host unreachable); skipping IBM MQ build."
66
+ echo "available=false" >> "$GITHUB_OUTPUT"
67
+ exit 0
68
+ fi
61
69
  echo "${IBM_MQ_REDIST_SHA256} ${archive_name}" | sha256sum -c -
62
70
  # The redist archive extracts a self-contained MQ install tree
63
71
  # (bin/, lib64/, inc/, ...) with no top-level mqm/ dir, so unpack
@@ -66,16 +74,20 @@ jobs:
66
74
  sudo tar -xzf "$archive_name" -C /opt/mqm
67
75
  echo "LD_LIBRARY_PATH=/opt/mqm/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
68
76
  echo "MQ_INSTALLATION_PATH=/opt/mqm" >> $GITHUB_ENV
69
-
77
+ echo "available=true" >> "$GITHUB_OUTPUT"
78
+
70
79
  - name: Verify MQ client installation
80
+ if: steps.mqclient.outputs.available == 'true'
71
81
  run: |
72
82
  ls -la /opt/mqm/lib64/ || echo "MQ lib64 directory not found"
73
83
  echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
74
-
84
+
75
85
  - name: Build with IBM MQ feature
86
+ if: steps.mqclient.outputs.available == 'true'
76
87
  run: cargo build --features ibm-mq
77
-
88
+
78
89
  - name: Run clippy on IBM MQ code
90
+ if: steps.mqclient.outputs.available == 'true'
79
91
  run: cargo clippy --features ibm-mq -- -D warnings
80
92
 
81
93
  # Integration tests with Docker
@@ -102,10 +114,18 @@ jobs:
102
114
  ${{ runner.os }}-cargo-
103
115
 
104
116
  - name: Install IBM MQ Client Libraries
117
+ id: mqclient
105
118
  run: |
106
119
  archive_url="$IBM_MQ_REDIST_URL"
107
120
  archive_name="$(basename "$archive_url")"
108
- curl -fsSLO "$archive_url"
121
+ # IBM's download host is occasionally unreachable from runners. Treat a
122
+ # download failure as infrastructure flakiness and skip the rest of the
123
+ # job (see `if:` guards below). Checksum/extract failures still fail.
124
+ if ! curl -fsSLO --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 "$archive_url"; then
125
+ echo "::warning::IBM MQ redist download failed (host unreachable); skipping IBM MQ integration tests."
126
+ echo "available=false" >> "$GITHUB_OUTPUT"
127
+ exit 0
128
+ fi
109
129
  echo "${IBM_MQ_REDIST_SHA256} ${archive_name}" | sha256sum -c -
110
130
  # The redist archive extracts a self-contained MQ install tree
111
131
  # (bin/, lib64/, inc/, ...) with no top-level mqm/ dir, so unpack
@@ -114,23 +134,28 @@ jobs:
114
134
  sudo tar -xzf "$archive_name" -C /opt/mqm
115
135
  echo "LD_LIBRARY_PATH=/opt/mqm/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
116
136
  echo "MQ_INSTALLATION_PATH=/opt/mqm" >> $GITHUB_ENV
117
-
137
+ echo "available=true" >> "$GITHUB_OUTPUT"
138
+
118
139
  - name: Install JDK (for keytool - TLS tests)
140
+ if: steps.mqclient.outputs.available == 'true'
119
141
  run: |
120
142
  sudo apt-get update
121
143
  sudo apt-get install -y default-jdk
122
-
144
+
123
145
  - name: Generate TLS certificates
146
+ if: steps.mqclient.outputs.available == 'true'
124
147
  run: |
125
148
  chmod +x tests/integration/scripts/gen_certs.sh
126
149
  ./tests/integration/scripts/gen_certs.sh ibm-mq
127
-
150
+
128
151
  - name: Pull IBM MQ Docker images
152
+ if: steps.mqclient.outputs.available == 'true'
129
153
  run: |
130
154
  docker compose -f tests/integration/docker-compose/ibm_mq.yml pull
131
155
  docker compose -f tests/integration/docker-compose/ibm_mq_tls.yml pull
132
-
156
+
133
157
  - name: Run IBM MQ integration tests
158
+ if: steps.mqclient.outputs.available == 'true'
134
159
  run: |
135
160
  cargo test --test integration_test --features ibm-mq,test-utils,rustls-ring -- \
136
161
  --ignored --nocapture --test-threads=1 \
@@ -138,8 +163,9 @@ jobs:
138
163
  test_ibm_mq_performance_pipeline \
139
164
  test_ibm_mq_chaos \
140
165
  test_ibm_mq_status
141
-
166
+
142
167
  - name: Run IBM MQ TLS tests
168
+ if: steps.mqclient.outputs.available == 'true'
143
169
  run: |
144
170
  cargo test --test integration_test --features ibm-mq,test-utils,rustls-ring -- \
145
171
  --ignored --nocapture --test-threads=1 \
@@ -171,7 +197,7 @@ jobs:
171
197
  run: |
172
198
  archive_url="$IBM_MQ_REDIST_URL"
173
199
  archive_name="$(basename "$archive_url")"
174
- curl -fsSLO "$archive_url"
200
+ curl -fsSLO --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 "$archive_url"
175
201
  echo "${IBM_MQ_REDIST_SHA256} ${archive_name}" | sha256sum -c -
176
202
  # The redist archive extracts a self-contained MQ install tree
177
203
  # (bin/, lib64/, inc/, ...) with no top-level mqm/ dir, so unpack
@@ -0,0 +1,69 @@
1
+ name: Node
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - ".github/workflows/node.yml"
8
+ - "node/mq-bridge-node/**"
9
+ - "Cargo.toml"
10
+ - "Cargo.lock"
11
+ - "src/**"
12
+ pull_request:
13
+ branches: [main, dev]
14
+ paths:
15
+ - ".github/workflows/node.yml"
16
+ - "node/mq-bridge-node/**"
17
+ - "Cargo.toml"
18
+ - "Cargo.lock"
19
+ - "src/**"
20
+ workflow_dispatch:
21
+
22
+ env:
23
+ CARGO_TERM_COLOR: always
24
+
25
+ jobs:
26
+ test:
27
+ name: Node binding smoke test
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
31
+ with:
32
+ persist-credentials: false
33
+
34
+ - name: Install Rust toolchain
35
+ uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
36
+
37
+ - name: Set up Node
38
+ uses: actions/setup-node@v4
39
+ with:
40
+ node-version: "20"
41
+ cache: npm
42
+ cache-dependency-path: node/mq-bridge-node/package-lock.json
43
+
44
+ - name: Cache cargo registry
45
+ uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
46
+ with:
47
+ path: |
48
+ ~/.cargo/bin/
49
+ ~/.cargo/registry/cache/
50
+ ~/.cargo/git/db/
51
+ target/
52
+ key: ${{ runner.os }}-node-cargo-${{ hashFiles('**/Cargo.lock') }}
53
+ restore-keys: |
54
+ ${{ runner.os }}-node-cargo-
55
+
56
+ - name: Install Node dependencies
57
+ working-directory: node/mq-bridge-node
58
+ run: npm ci
59
+
60
+ - name: Check Rust binding
61
+ run: cargo check -p mq-bridge-node --no-default-features --features "http middleware schema"
62
+
63
+ - name: Build native addon
64
+ working-directory: node/mq-bridge-node
65
+ run: npm run build:ci
66
+
67
+ - name: Run Node tests
68
+ working-directory: node/mq-bridge-node
69
+ run: npm test
@@ -0,0 +1,211 @@
1
+ name: Publish Node Package
2
+
3
+ # Publishes the napi-rs addon as the standard layout: a thin root package
4
+ # `mq-bridge` plus one binary package per platform
5
+ # (`mq-bridge-darwin-arm64`, `mq-bridge-linux-x64-gnu`, ...). The root lists the
6
+ # platform packages as optionalDependencies, so each consumer downloads only its
7
+ # own ~20MB binary; the napi loader (native.js) requires the matching one.
8
+ #
9
+ # Linux is built inside a Debian 11 (glibc 2.31) container so the binaries run on
10
+ # RHEL 9 (glibc 2.34), Debian 11/12 and Ubuntu 20.04+ — covering the priority
11
+ # server targets. macOS/Windows build natively.
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.
18
+
19
+ on:
20
+ release:
21
+ types:
22
+ - published
23
+ workflow_dispatch:
24
+
25
+ env:
26
+ CARGO_TERM_COLOR: always
27
+
28
+ jobs:
29
+ build-linux:
30
+ name: Build ${{ matrix.target }}
31
+ runs-on: ${{ matrix.runner }}
32
+ permissions:
33
+ contents: read
34
+ container:
35
+ # Debian 11 bullseye => glibc 2.31 baseline (runs on RHEL 9 / Debian 11+ /
36
+ # Ubuntu 20.04+). Pulled natively per arch on the matching runner.
37
+ image: node:20-bullseye
38
+ strategy:
39
+ fail-fast: false
40
+ matrix:
41
+ include:
42
+ - runner: ubuntu-22.04
43
+ target: x86_64-unknown-linux-gnu
44
+ - runner: ubuntu-22.04-arm
45
+ target: aarch64-unknown-linux-gnu
46
+ steps:
47
+ - uses: actions/checkout@v4
48
+
49
+ # rdkafka builds librdkafka from source (cc/make) and aws-lc-sys needs
50
+ # cmake; the slim node image lacks these.
51
+ - name: Install build toolchain
52
+ run: |
53
+ apt-get update -qq
54
+ apt-get install -y --no-install-recommends build-essential cmake perl pkg-config
55
+
56
+ - name: Install Rust toolchain
57
+ run: |
58
+ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
59
+ echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
60
+
61
+ - name: Install Node dependencies
62
+ working-directory: node/mq-bridge-node
63
+ run: npm ci
64
+
65
+ - name: Build native addon (full)
66
+ working-directory: node/mq-bridge-node
67
+ env:
68
+ CARGO_NET_RETRY: "5"
69
+ CARGO_NET_GIT_FETCH_WITH_CLI: "true"
70
+ run: >-
71
+ npx napi build --platform --release --strip
72
+ --target ${{ matrix.target }}
73
+ --js native.js --dts native.d.ts
74
+
75
+ - name: Upload addon
76
+ uses: actions/upload-artifact@v4
77
+ with:
78
+ name: bindings-${{ matrix.target }}
79
+ path: node/mq-bridge-node/*.node
80
+ if-no-files-found: error
81
+
82
+ # The root package ships the generated loader; upload it once.
83
+ - name: Upload loader
84
+ if: matrix.target == 'x86_64-unknown-linux-gnu'
85
+ uses: actions/upload-artifact@v4
86
+ with:
87
+ name: loader
88
+ path: |
89
+ node/mq-bridge-node/native.js
90
+ node/mq-bridge-node/native.d.ts
91
+ if-no-files-found: error
92
+
93
+ build-native:
94
+ name: Build ${{ matrix.target }}
95
+ runs-on: ${{ matrix.runner }}
96
+ permissions:
97
+ contents: read
98
+ strategy:
99
+ fail-fast: false
100
+ matrix:
101
+ include:
102
+ - runner: macos-15-intel
103
+ target: x86_64-apple-darwin
104
+ - runner: macos-latest
105
+ target: aarch64-apple-darwin
106
+ - runner: windows-latest
107
+ target: x86_64-pc-windows-msvc
108
+ steps:
109
+ - uses: actions/checkout@v4
110
+
111
+ - name: Set up Node
112
+ uses: actions/setup-node@v4
113
+ with:
114
+ node-version: "20"
115
+ cache: npm
116
+ cache-dependency-path: node/mq-bridge-node/package-lock.json
117
+
118
+ - name: Install Rust toolchain
119
+ uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
120
+ with:
121
+ targets: ${{ matrix.target }}
122
+
123
+ - name: Install Node dependencies
124
+ working-directory: node/mq-bridge-node
125
+ run: npm ci
126
+
127
+ - name: Build native addon (full)
128
+ working-directory: node/mq-bridge-node
129
+ env:
130
+ CARGO_NET_RETRY: "5"
131
+ CARGO_NET_GIT_FETCH_WITH_CLI: "true"
132
+ run: >-
133
+ npx napi build --platform --release --strip
134
+ --target ${{ matrix.target }}
135
+ --js native.js --dts native.d.ts
136
+
137
+ - name: Upload addon
138
+ uses: actions/upload-artifact@v4
139
+ with:
140
+ name: bindings-${{ matrix.target }}
141
+ path: node/mq-bridge-node/*.node
142
+ if-no-files-found: error
143
+
144
+ publish:
145
+ name: Publish to npm
146
+ runs-on: ubuntu-latest
147
+ needs: [build-linux, build-native]
148
+ permissions:
149
+ contents: read
150
+ id-token: write # OIDC trusted publishing + provenance
151
+ steps:
152
+ - uses: actions/checkout@v4
153
+
154
+ - name: Set up Node
155
+ uses: actions/setup-node@v4
156
+ with:
157
+ node-version: "20"
158
+ registry-url: "https://registry.npmjs.org"
159
+ cache: npm
160
+ cache-dependency-path: node/mq-bridge-node/package-lock.json
161
+
162
+ # Trusted publishing (OIDC) requires npm >= 11.5.1.
163
+ - name: Update npm
164
+ run: npm install -g npm@11.5.1
165
+
166
+ - name: Install Node dependencies
167
+ working-directory: node/mq-bridge-node
168
+ run: npm ci
169
+
170
+ - name: Sync version from Cargo workspace
171
+ working-directory: node/mq-bridge-node
172
+ run: npm run sync-version
173
+
174
+ - name: Download loader into package root
175
+ uses: actions/download-artifact@v4
176
+ with:
177
+ name: loader
178
+ path: node/mq-bridge-node
179
+
180
+ - name: Download platform addons
181
+ uses: actions/download-artifact@v4
182
+ with:
183
+ pattern: bindings-*
184
+ path: node/mq-bridge-node/artifacts
185
+
186
+ - name: Create per-platform npm dirs
187
+ working-directory: node/mq-bridge-node
188
+ run: npx napi create-npm-dirs
189
+
190
+ - name: Distribute addons into npm dirs
191
+ working-directory: node/mq-bridge-node
192
+ run: npx napi artifacts -d artifacts
193
+
194
+ - name: List npm dirs
195
+ working-directory: node/mq-bridge-node
196
+ run: ls -R npm
197
+
198
+ - name: Publish platform packages and root
199
+ working-directory: node/mq-bridge-node
200
+ env:
201
+ # Empty when the secret is unset -> npm falls back to OIDC.
202
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
203
+ NPM_CONFIG_PROVENANCE: "true"
204
+ run: |
205
+ set -e
206
+ for dir in npm/*/; do
207
+ echo "Publishing $dir"
208
+ npm publish "$dir" --access public
209
+ done
210
+ echo "Publishing root package"
211
+ npm publish --access public
@@ -114,6 +114,12 @@ jobs:
114
114
 
115
115
  - name: Build wheels
116
116
  uses: PyO3/maturin-action@v1
117
+ env:
118
+ # Work around intermittent "HTTP2 framing layer" curl errors when
119
+ # cargo downloads crates inside the manylinux container.
120
+ CARGO_HTTP_MULTIPLEXING: "false"
121
+ CARGO_NET_RETRY: "5"
122
+ CARGO_NET_GIT_FETCH_WITH_CLI: "true"
117
123
  with:
118
124
  working-directory: python/mq-bridge-py
119
125
  command: build
@@ -67,3 +67,16 @@ jobs:
67
67
  - name: Smoke test import
68
68
  working-directory: python/mq-bridge-py
69
69
  run: uv run python -c "from mq_bridge import Message, Publisher, Route; print(Message, Publisher, Route)"
70
+
71
+ - name: Run no-default feature regression tests
72
+ run: |
73
+ cargo test -p mq-bridge-py --no-default-features --features http,rustls-ring test_config_schema_is_always_available
74
+ cargo test -p mq-bridge-py --no-default-features --features http,rustls-ring test_module_init_installs_rustls_provider
75
+
76
+ - name: Rebuild extension with lean no-default feature set
77
+ working-directory: python/mq-bridge-py
78
+ run: uv run maturin develop --no-default-features -F http -F rustls-ring -F pyo3/extension-module
79
+
80
+ - name: Run lean no-default public API tests
81
+ working-directory: python/mq-bridge-py
82
+ run: uv run pytest -q tests/test_public_api.py tests/test_config_types.py
@@ -1166,6 +1166,15 @@ dependencies = [
1166
1166
  "unicode-segmentation",
1167
1167
  ]
1168
1168
 
1169
+ [[package]]
1170
+ name = "convert_case"
1171
+ version = "0.11.0"
1172
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1173
+ checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49"
1174
+ dependencies = [
1175
+ "unicode-segmentation",
1176
+ ]
1177
+
1169
1178
  [[package]]
1170
1179
  name = "cookie-factory"
1171
1180
  version = "0.3.3"
@@ -1350,6 +1359,12 @@ dependencies = [
1350
1359
  "hybrid-array",
1351
1360
  ]
1352
1361
 
1362
+ [[package]]
1363
+ name = "ctor"
1364
+ version = "1.0.7"
1365
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1366
+ checksum = "01334b89b69ff726750c5ce5073fc8bd860e99aa9a8fc5ca11b04730e3aee97a"
1367
+
1353
1368
  [[package]]
1354
1369
  name = "ctutils"
1355
1370
  version = "0.4.2"
@@ -2725,6 +2740,16 @@ version = "0.2.186"
2725
2740
  source = "registry+https://github.com/rust-lang/crates.io-index"
2726
2741
  checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
2727
2742
 
2743
+ [[package]]
2744
+ name = "libloading"
2745
+ version = "0.9.0"
2746
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2747
+ checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60"
2748
+ dependencies = [
2749
+ "cfg-if",
2750
+ "windows-link",
2751
+ ]
2752
+
2728
2753
  [[package]]
2729
2754
  name = "libmqm-constants"
2730
2755
  version = "0.8.4"
@@ -3057,7 +3082,7 @@ dependencies = [
3057
3082
 
3058
3083
  [[package]]
3059
3084
  name = "mq-bridge"
3060
- version = "0.2.20"
3085
+ version = "0.2.21"
3061
3086
  dependencies = [
3062
3087
  "anyhow",
3063
3088
  "arc-swap",
@@ -3122,9 +3147,29 @@ dependencies = [
3122
3147
  "zeromq",
3123
3148
  ]
3124
3149
 
3150
+ [[package]]
3151
+ name = "mq-bridge-node"
3152
+ version = "0.2.21"
3153
+ dependencies = [
3154
+ "anyhow",
3155
+ "async-trait",
3156
+ "bytes",
3157
+ "fast-uuid-v7",
3158
+ "mq-bridge",
3159
+ "napi",
3160
+ "napi-build",
3161
+ "napi-derive",
3162
+ "schemars",
3163
+ "serde",
3164
+ "serde_json",
3165
+ "serde_yaml_ng",
3166
+ "tokio",
3167
+ "tracing",
3168
+ ]
3169
+
3125
3170
  [[package]]
3126
3171
  name = "mq-bridge-py"
3127
- version = "0.2.20"
3172
+ version = "0.2.21"
3128
3173
  dependencies = [
3129
3174
  "anyhow",
3130
3175
  "async-trait",
@@ -3132,6 +3177,7 @@ dependencies = [
3132
3177
  "fast-uuid-v7",
3133
3178
  "mq-bridge",
3134
3179
  "pyo3",
3180
+ "rustls 0.23.40",
3135
3181
  "schemars",
3136
3182
  "serde",
3137
3183
  "serde_json",
@@ -3159,6 +3205,66 @@ version = "0.10.1"
3159
3205
  source = "registry+https://github.com/rust-lang/crates.io-index"
3160
3206
  checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
3161
3207
 
3208
+ [[package]]
3209
+ name = "napi"
3210
+ version = "3.9.3"
3211
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3212
+ checksum = "fbd9f9295f3ff5921e78a71222c3361a8216f7760b1a99a6ad4e8441de18bbb9"
3213
+ dependencies = [
3214
+ "bitflags 2.13.0",
3215
+ "ctor",
3216
+ "futures",
3217
+ "napi-build",
3218
+ "napi-sys",
3219
+ "nohash-hasher",
3220
+ "rustc-hash",
3221
+ "serde",
3222
+ "serde_json",
3223
+ "tokio",
3224
+ ]
3225
+
3226
+ [[package]]
3227
+ name = "napi-build"
3228
+ version = "2.3.2"
3229
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3230
+ checksum = "c9c366d2c8c60b86fa632df75f745509b52f9128f91a6bad4c796e44abb505e1"
3231
+
3232
+ [[package]]
3233
+ name = "napi-derive"
3234
+ version = "3.5.6"
3235
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3236
+ checksum = "89b3f766e04667e6da0e181e2da4f85475d5a6513b7cf6a80bea184e224a5b42"
3237
+ dependencies = [
3238
+ "convert_case 0.11.0",
3239
+ "ctor",
3240
+ "napi-derive-backend",
3241
+ "proc-macro2",
3242
+ "quote",
3243
+ "syn",
3244
+ ]
3245
+
3246
+ [[package]]
3247
+ name = "napi-derive-backend"
3248
+ version = "5.0.4"
3249
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3250
+ checksum = "0d5af30503edf933ce7377cf6d4c877a62b0f1107ea05585f1b5e430e88d5baf"
3251
+ dependencies = [
3252
+ "convert_case 0.11.0",
3253
+ "proc-macro2",
3254
+ "quote",
3255
+ "semver",
3256
+ "syn",
3257
+ ]
3258
+
3259
+ [[package]]
3260
+ name = "napi-sys"
3261
+ version = "3.2.2"
3262
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3263
+ checksum = "1f5bcdf71abd3a50d00b49c1c2c75251cb3c913777d6139cd37dabc093a5e400"
3264
+ dependencies = [
3265
+ "libloading",
3266
+ ]
3267
+
3162
3268
  [[package]]
3163
3269
  name = "ndk-context"
3164
3270
  version = "0.1.1"
@@ -3189,6 +3295,12 @@ dependencies = [
3189
3295
  "signatory",
3190
3296
  ]
3191
3297
 
3298
+ [[package]]
3299
+ name = "nohash-hasher"
3300
+ version = "0.2.0"
3301
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3302
+ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
3303
+
3192
3304
  [[package]]
3193
3305
  name = "nom"
3194
3306
  version = "7.1.3"
@@ -16,7 +16,7 @@ members = ["python/mq-bridge-py"]
16
16
  resolver = "2"
17
17
 
18
18
  [workspace.package]
19
- version = "0.2.20"
19
+ version = "0.2.21"
20
20
 
21
21
  [workspace.dependencies]
22
22
  anyhow = "1.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mq-bridge-py-basic
3
- Version: 0.2.20
3
+ Version: 0.2.21
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: License :: OSI Approved :: MIT License
6
6
  Classifier: Programming Language :: Python :: 3
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "mq-bridge",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {}
6
+ }
@@ -18,9 +18,10 @@ anyhow.workspace = true
18
18
  async-trait.workspace = true
19
19
  bytes = { workspace = true, features = ["serde"] }
20
20
  fast-uuid-v7.workspace = true
21
- mq-bridge = { path = "../.." }
21
+ mq-bridge = { path = "../..", features = ["schema"] }
22
22
  pyo3 = { version = "0.29.0", features = ["abi3-py38"] }
23
- schemars = { version = "1.2", optional = true }
23
+ rustls = { version = "0.23", optional = true, default-features = false, features = ["std", "tls12", "logging"] }
24
+ schemars = "1.2"
24
25
  serde = { workspace = true, features = ["derive"] }
25
26
  serde_json.workspace = true
26
27
  serde_yaml_ng.workspace = true
@@ -39,7 +40,7 @@ pyo3 = { version = "0.29.0", features = ["abi3-py38", "auto-initialize"] }
39
40
  default = ["full"]
40
41
  # Testing-only middleware hooks; do not include this feature in production wheels.
41
42
  middleware = ["mq-bridge/middleware"]
42
- full = ["mq-bridge/full"]
43
+ full = ["mq-bridge/full", "rustls-aws-lc"]
43
44
  # Lean set for the `mq-bridge-py-basic` wheel (~14M stripped): the pure-Rust
44
45
  # transports (no kafka/rdkafka C toolchain; no heavy datastore drivers) on the
45
46
  # `ring` crypto provider so it stays free of aws-lc-sys. memory + file
@@ -50,7 +51,9 @@ full = ["mq-bridge/full"]
50
51
  basic = ["http", "nats", "mqtt", "websocket", "zeromq", "rustls-ring"]
51
52
  dedup = ["mq-bridge/dedup"]
52
53
  metrics = ["mq-bridge/metrics"]
53
- schema = ["dep:schemars", "mq-bridge/schema"]
54
+ # Compatibility alias: config_schema is part of the public Python API and is
55
+ # always compiled.
56
+ schema = []
54
57
  test-utils = ["mq-bridge/test-utils"]
55
58
  kafka = ["mq-bridge/kafka"]
56
59
  amqp = ["mq-bridge/amqp"]
@@ -64,5 +67,5 @@ ibm-mq = ["mq-bridge/ibm-mq"]
64
67
  zeromq = ["mq-bridge/zeromq"]
65
68
  grpc = ["mq-bridge/grpc"]
66
69
  sqlx = ["mq-bridge/sqlx"]
67
- rustls-ring = ["mq-bridge/rustls-ring"]
68
- rustls-aws-lc = ["mq-bridge/rustls-aws-lc"]
70
+ rustls-ring = ["dep:rustls", "rustls/ring", "mq-bridge/rustls-ring"]
71
+ rustls-aws-lc = ["dep:rustls", "rustls/aws_lc_rs", "rustls/prefer-post-quantum", "mq-bridge/rustls-aws-lc"]
@@ -141,7 +141,8 @@ def render_typeddict(name: str, fields: dict, required: set, defn: dict) -> str:
141
141
  lines.append(doc.rstrip("\n"))
142
142
  if not fields:
143
143
  lines.append(" pass")
144
- for key, expr in fields.items():
144
+ for key in sorted(fields):
145
+ expr = fields[key]
145
146
  wrapped = f"Required[{expr}]" if key in required else expr
146
147
  lines.append(f" {key}: {wrapped}")
147
148
  return "\n".join(lines) + "\n"