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.
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/ibm-mq.yml +37 -11
- mq_bridge_py_basic-0.2.21/.github/workflows/node.yml +69 -0
- mq_bridge_py_basic-0.2.21/.github/workflows/publish-node.yml +211 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/publish-python.yml +6 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/python.yml +13 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/Cargo.lock +114 -2
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/Cargo.toml +1 -1
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/PKG-INFO +1 -1
- mq_bridge_py_basic-0.2.21/package-lock.json +6 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/Cargo.toml +9 -6
- {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
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/src/lib.rs +44 -4
- {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
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +2 -2
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/canonical_message.rs +2 -2
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/amqp.rs +67 -8
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/http.rs +153 -22
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/websocket.rs +73 -12
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/weak_join.rs +2 -1
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/route.rs +4 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/test_utils.rs +15 -5
- mq_bridge_py_basic-0.2.21/tests/README.md +29 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/armature_integration.rs +2 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/amqp.rs +65 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/grpc_tls.rs +2 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/http_tls.rs +2 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/ibm_mq_tls.rs +2 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/kafka_tls.rs +1 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mongodb_tls.rs +1 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration_test.rs +8 -2
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/sqlite_test.rs +3 -1
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/websocket_test.rs +48 -0
- mq_bridge_py_basic-0.2.20/tests/README.md +0 -19
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/benchmark.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/ci.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/release.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/test-matrix.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.gitignore +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/ARCHITECTURE.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/CONFIGURATION.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/CONTRIBUTING.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/LICENSE +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/README.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/benches/performance_bench.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/benches/router_bench.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/build.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/claude.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/examples/ipc_worker_queue.yaml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq-bridge.schema.json +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/__init__.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/__init__.pyi +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/config.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/config.pyi +152 -152
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/mq_bridge/py.typed +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/README.md +0 -0
- {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
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/example.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/bench_memory.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/json_route.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/memory.yaml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/examples/raw_route.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/pyproject-basic.toml +0 -0
- {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
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/tests/test_packaging.py +0 -0
- {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
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/tests/test_routes.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/python/mq-bridge-py/uv.lock +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/benches/metadata_bench.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/http/http_flamegraph.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/analysis/http/run_http_ladder.sh +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/httparena/README.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
- {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
- {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
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/README.md +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/postgres.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/seed.sql +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/techempower/verify.sh +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/scripts/the-benchmarker/README.md +0 -0
- {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
- {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
- {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
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/command_handler.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/aws.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/fanout.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/file.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/grpc.proto +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/grpc.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/http_stream.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/ibm_mq.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/kafka.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/endpoint.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/ipc_unix.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/ipc_windows.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/memory_transport.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/mod.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/memory/transport.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/mod.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/mongodb.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/nats.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/null.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/reader.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/response.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/sled.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/sqlx.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/static_endpoint.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/stream_buffer.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/switch.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/endpoints/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/errors.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/event_handler.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/event_store.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/extensions.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/lib.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/buffer.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/cookie_jar.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/deduplication.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/delay.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/dlq.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/limiter.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/metrics.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/mod.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/random_panic.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/middleware/retry.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/models.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/outcomes.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/publisher.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/response.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/traits.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/src/type_handler.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/aws.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/config.toml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/amqp.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/aws.yml +0 -0
- {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
- {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
- {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
- {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
- {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
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm_mq.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/kafka-tls.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/kafka.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mariadb.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mongodb.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mosquitto.conf +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mq_init.mqsc +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mqtt.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/mysql.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/nats.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/docker-compose/postgres.yml +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/file.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/grpc.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/http.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/ibm_mq.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/ipc.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/kafka.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/logic_test.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mariadb.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/memory.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mod.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mongodb.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mongodb_raw.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/mysql.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/nats.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/performance_static.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/postgres.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/route.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/scripts/gen_certs.sh +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/sqlite.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/tls_helpers.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/websocket.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/integration/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/ref_test.rs +0 -0
- {mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/tests/tls_example.rs +0 -0
- {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
|
-
|
|
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
|
-
|
|
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
|
{mq_bridge_py_basic-0.2.20 → mq_bridge_py_basic-0.2.21}/.github/workflows/publish-python.yml
RENAMED
|
@@ -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.
|
|
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.
|
|
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"
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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"
|