mq-bridge-basic 0.4.18__tar.gz → 0.4.20__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_basic-0.4.18 → mq_bridge_basic-0.4.20}/.dockerignore +1 -1
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/dependabot.yml +2 -1
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/app.yml +5 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/ci.yml +5 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/docs.yml +13 -9
- mq_bridge_basic-0.4.20/.github/workflows/examples.yml +62 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/AGENTS.md +2 -2
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/CHANGELOG.md +286 -1
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/Cargo.lock +185 -154
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/Cargo.toml +16 -10
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/PKG-INFO +1 -1
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/README.md +21 -16
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/DELIVERY.md +5 -7
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/PLUGINS.md +35 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/REFERENCE.md +148 -13
- mq_bridge_basic-0.4.20/examples/c-library/publish.c +40 -0
- mq_bridge_basic-0.4.20/examples/c-library/smoke.c +371 -0
- mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/README.md +55 -0
- mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/docker-compose.yml +53 -0
- mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/init.sql +11 -0
- mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/routes.yaml +53 -0
- mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/search.sh +16 -0
- mq_bridge_basic-0.4.20/examples/postgres-cdc-to-qdrant/test.sh +43 -0
- mq_bridge_basic-0.4.20/examples/transactional-outbox/README.md +49 -0
- mq_bridge_basic-0.4.20/examples/transactional-outbox/consume.sh +6 -0
- mq_bridge_basic-0.4.20/examples/transactional-outbox/docker-compose.yml +38 -0
- mq_bridge_basic-0.4.20/examples/transactional-outbox/init.sql +17 -0
- mq_bridge_basic-0.4.20/examples/transactional-outbox/routes.yaml +17 -0
- mq_bridge_basic-0.4.20/examples/transactional-outbox/test.sh +50 -0
- mq_bridge_basic-0.4.20/include/mq_bridge.h +252 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq-bridge.schema.json +210 -12
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/config.py +12 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/config.pyi +26 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/IBM_MQ.md +1 -1
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/sync-version.mjs +1 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/amqp.rs +1 -1
- mq_bridge_basic-0.4.20/src/endpoints/file/csv_dialect.rs +322 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/file/mod.rs +715 -172
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/file/tests.rs +565 -35
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/publisher.rs +5 -1
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/server.rs +8 -10
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http/mod.rs +78 -19
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http/publisher.rs +45 -7
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http/stream.rs +24 -81
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http/tests.rs +543 -42
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/consumer.rs +542 -61
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/mod.rs +12 -7
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/presets.rs +53 -3
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/kafka.rs +7 -2
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/endpoint.rs +35 -46
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mod.rs +205 -12
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/mod.rs +0 -16
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/readers.rs +3 -54
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/tests.rs +40 -12
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mqtt.rs +2 -2
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/nats.rs +10 -13
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/object_store.rs +222 -28
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/mod.rs +113 -6
- mq_bridge_basic-0.4.20/src/endpoints/sqlx/columns.rs +597 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sqlx/mod.rs +224 -79
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sqlx/tests.rs +315 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/websocket.rs +9 -3
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/mod.rs +511 -130
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/tests.rs +298 -4
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/buffer.rs +119 -18
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/cookie_jar.rs +34 -7
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/dlq.rs +108 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/filter.rs +55 -2
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/metrics.rs +71 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/mod.rs +164 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/random_panic.rs +117 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/timeout.rs +51 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/builders.rs +262 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/serde_support.rs +1 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/tests.rs +120 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models.rs +152 -14
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/discovery.rs +7 -2
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/mod.rs +79 -6
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/publisher.rs +97 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/route.rs +165 -30
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/crypto_envelope.rs +1 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/mod.rs +10 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/parallel.rs +7 -0
- mq_bridge_basic-0.4.20/src/support/redact.rs +57 -0
- mq_bridge_basic-0.4.20/src/support/sse.rs +74 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/test_utils.rs +3 -0
- mq_bridge_basic-0.4.20/tests/full_plugin_fallback_test.rs +49 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/http.rs +4 -4
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/kafka.rs +11 -6
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/postgres.rs +45 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration_test.rs +9 -0
- mq_bridge_basic-0.4.20/tests/plugin_loading_latch_test.rs +28 -0
- mq_bridge_basic-0.4.18/benches/ETL_BENCHMARKS.md +0 -85
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.cargo/config.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.coderabbit.yaml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/benchmark.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/build-node.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/conda.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/ibm-mq.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/node.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/publish-node.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/publish-python.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/python.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/release.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.github/workflows/test-matrix.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.gitignore +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/.justfile +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/CLAUDE.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/CONTRIBUTING.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE-APACHE +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE-APACHE.python +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE-MIT +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE-MIT.python +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/LICENSE.python +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/SECURITY.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/THIRD_PARTY_LICENSES.txt +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/csv_to_json_bench.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/middleware_expr_bench.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/pack_bench.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/performance_bench.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/router_bench.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/benches/zeromq_backends.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/bindings-common/Cargo.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/bindings-common/src/lib.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/bindings-common/src/logging.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/build.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/deny.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/ARCHITECTURE.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/CONFIGURATION.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/EXTENDING.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/GRPC.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/THIRD_PARTY_LICENSES.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/docs/assets/copy-demo.png +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/CMakeLists.txt +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/README.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/legacy_ledger.c +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/legacy_ledger.h +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/legacy_parser.c +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/legacy_parser.h +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/minimal.c +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/c-plugin/plugin.c +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/examples/ipc_worker_queue.yaml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/include/cbindgen.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/include/mq_bridge_plugin.h +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/include/mq_bridge_plugin_helpers.h +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/llms.txt +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/__init__.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/__init__.pyi +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/plugin_packaging.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/mq_bridge/py.typed +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/package-lock.json +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/pyproject.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/Cargo.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/LICENSE-APACHE.python +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/LICENSE-MIT.python +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/LICENSE.python +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/README.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/THIRD_PARTY_LICENSES.txt +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/example.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/bench_memory.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/consume_pull.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/dlt_source.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/ibm-mq-input.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/json_route.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/memory.yaml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/examples/raw_route.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/pyproject-basic.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/pyproject-reduced.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/src/lib.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_config_types.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_custom_endpoint.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_logging.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_packaging.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_plugin_package.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_public_api.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_routes.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/tests/test_shutdown.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/python/mq-bridge-py/uv.lock +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/benches/metadata_bench.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/debug_ibm_mq_tls.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/http/http_flamegraph.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/analysis/http/run_http_ladder.sh +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/ci/format_bench_output.sh +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/README.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/httparena/frameworks/mq-bridge-py/templates/fortunes.html +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/mqb-agent.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/README.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/postgres.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/seed.sql +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/techempower/verify.sh +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/the-benchmarker/README.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/canonical_message.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/checkpoint.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/command_handler.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/config_file.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/aws.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/clickhouse.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/dir_spool/mod.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/dir_spool/tests.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/consumer.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/dynamic.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/mod.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/proto/mqbridge/bridge.proto +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/grpc/tests.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/auth.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/publisher.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/http_bulk/query.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/ibm_mq.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/framed.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/ipc_unix.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/ipc_windows.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/memory_transport.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/mod.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/memory/transport.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/aggregate.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/consumer.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/dedup.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/mongodb/publisher.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/poll.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/VENDORED.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/decoder.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/messages.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/mod.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/registry.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/pgoutput/values.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/replication.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/postgres/state.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/redis_streams.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sled.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sqlx/aggregate.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/sqlx/dedup.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/fanout.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/mod.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/null.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/reader.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/request.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/response.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/sequence.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/static_endpoint.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/stream_buffer.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/structural/switch.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/zeromq/codec.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/zeromq/mod.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/zeromq/omq.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/endpoints/zeromq/zmq.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/errors.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/event_handler.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/event_store.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/extensions.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/lib.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/states.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/store.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/aggregate/writer.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/compression.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/deduplication/memory.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/deduplication.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/deferred_commit.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/delay.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/encryption.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/id.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/limiter.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/lookup.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/otel.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/pack.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/raw_json.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/retry.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/coerce.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/compiled.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/error.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/mod.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/path.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/schema.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/transform/tests.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/middleware/weak_join.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/defaults.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/models/secrets.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/outcomes.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/completion.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/conformance.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/crash.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/endpoint.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/forward.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/host.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/message.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/middleware.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/sdk.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/plugin/test_support.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/response.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/shutdown.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/base64_engine.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/change_op.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/compression.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/compression_pool.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/config_schema.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/connection_registry.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/crypto.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/http_status.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/interpolation.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/lookup_batch.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/ndjson.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/pack.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/parquet.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/plugin_abi.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/poll_job.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/source_ranges.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/support/stream_batch.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/traits.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/src/type_handler.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/README.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/armature_integration.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/compat/python/bridge_client.py +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/dedup_store_bench.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/delivery_guarantee_test.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/amqp.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/aws.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/clickhouse.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/config.toml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/amqp.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/aws.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/clickhouse.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm_mq.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/kafka-tls.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/kafka.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mariadb.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mongodb.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mosquitto.conf +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mq_init.mqsc +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mqtt.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/mysql.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/nats.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/object_store.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/postgres.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/postgres_cdc.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/docker-compose/redis.yml +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/file.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/grpc.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/grpc_tls.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/http_tls.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/ibm_mq.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/ibm_mq_tls.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/ipc.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/kafka_tls.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/logic_test.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mariadb.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/memory.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mod.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mongodb.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mongodb_raw.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mongodb_tls.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mqtt.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/mysql.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/nats.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/object_store.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/performance_static.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/postgres_cdc.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/redis_streams.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/route.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/scripts/gen_certs.sh +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/sqlite.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/tls_helpers.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/websocket.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/integration/zeromq.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/memory_leak_test.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/otel_test.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/ref_test.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/reference_docs_test.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/sqlite_test.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/tls_example.rs +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/unit_tests.md +0 -0
- {mq_bridge_basic-0.4.18 → mq_bridge_basic-0.4.20}/tests/websocket_test.rs +0 -0
|
@@ -9,7 +9,8 @@ updates:
|
|
|
9
9
|
directory: "/" # Location of package manifests
|
|
10
10
|
target-branch: "dev"
|
|
11
11
|
schedule:
|
|
12
|
-
|
|
12
|
+
# Same cadence as the app workspace below, so the two lockfiles do not drift.
|
|
13
|
+
interval: "weekly"
|
|
13
14
|
groups:
|
|
14
15
|
minor-and-patch:
|
|
15
16
|
applies-to: version-updates
|
|
@@ -51,6 +51,7 @@ jobs:
|
|
|
51
51
|
cache-workspace-crates: true
|
|
52
52
|
|
|
53
53
|
- name: Install system dependencies
|
|
54
|
+
timeout-minutes: 5
|
|
54
55
|
run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev pkg-config zlib1g-dev protobuf-compiler libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
|
|
55
56
|
|
|
56
57
|
- name: Test desktop crate
|
|
@@ -116,6 +117,7 @@ jobs:
|
|
|
116
117
|
cache-dependency-path: apps/mq-bridge-app/package-lock.json
|
|
117
118
|
|
|
118
119
|
- name: Install system dependencies
|
|
120
|
+
timeout-minutes: 5
|
|
119
121
|
run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev pkg-config zlib1g-dev protobuf-compiler
|
|
120
122
|
|
|
121
123
|
- name: Install frontend dependencies
|
|
@@ -193,6 +195,7 @@ jobs:
|
|
|
193
195
|
cache-workspace-crates: true
|
|
194
196
|
|
|
195
197
|
- name: Install system dependencies
|
|
198
|
+
timeout-minutes: 5
|
|
196
199
|
run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev pkg-config zlib1g-dev protobuf-compiler
|
|
197
200
|
|
|
198
201
|
- name: Run integration suite
|
|
@@ -224,6 +227,7 @@ jobs:
|
|
|
224
227
|
cache-workspace-crates: true
|
|
225
228
|
|
|
226
229
|
- name: Install system dependencies
|
|
230
|
+
timeout-minutes: 5
|
|
227
231
|
run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev pkg-config zlib1g-dev protobuf-compiler
|
|
228
232
|
|
|
229
233
|
# The test drives the CLI through `env!("CARGO_BIN_EXE_mq-bridge-app")`, an
|
|
@@ -294,6 +298,7 @@ jobs:
|
|
|
294
298
|
chmod +x "$cli" docker-suite/test-binary
|
|
295
299
|
|
|
296
300
|
- name: Install runtime libraries
|
|
301
|
+
timeout-minutes: 5
|
|
297
302
|
run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev libssl-dev zlib1g-dev
|
|
298
303
|
|
|
299
304
|
# The engine's own integration stacks, so there is one definition per
|
|
@@ -120,6 +120,11 @@ jobs:
|
|
|
120
120
|
- name: C plugin header is current and a C plugin loads
|
|
121
121
|
run: cargo test -p mq-bridge-plugin-fixture --test plugin_c_header --test plugin_c_abi
|
|
122
122
|
|
|
123
|
+
- name: C library header is current and a C program links and runs
|
|
124
|
+
run: cargo test -p mq-bridge-c --no-default-features
|
|
125
|
+
env:
|
|
126
|
+
MQB_C_ASAN: "1" # AddressSanitizer; on Linux it also fails on leaks
|
|
127
|
+
|
|
123
128
|
- name: Memory leak soak (route commit-task JoinSet)
|
|
124
129
|
run: cargo test --test memory_leak_test --features=full -- --ignored --nocapture
|
|
125
130
|
|
|
@@ -5,7 +5,7 @@ on:
|
|
|
5
5
|
branches: [main]
|
|
6
6
|
paths:
|
|
7
7
|
- "docs/**"
|
|
8
|
-
- "
|
|
8
|
+
- "llms.txt"
|
|
9
9
|
- "apps/mq-bridge-app/crates/cli/examples/gen_url_docs.rs"
|
|
10
10
|
- ".github/workflows/docs.yml"
|
|
11
11
|
# The benchmark workflow pushes new data to the gh-pages branch; republish the
|
|
@@ -38,14 +38,18 @@ jobs:
|
|
|
38
38
|
mdbook-version: "0.5.4"
|
|
39
39
|
|
|
40
40
|
- name: Vendor engine docs
|
|
41
|
-
run: bash
|
|
41
|
+
run: bash docs/book/sync-engine-docs.sh
|
|
42
42
|
|
|
43
43
|
- name: Build book
|
|
44
|
-
run: mdbook build
|
|
44
|
+
run: mdbook build docs/book
|
|
45
45
|
|
|
46
|
-
#
|
|
47
|
-
- name:
|
|
48
|
-
run:
|
|
46
|
+
# llms.txt lives at the repository root; publish it with the book.
|
|
47
|
+
- name: Publish llms.txt
|
|
48
|
+
run: cp llms.txt docs/book/book/llms.txt
|
|
49
|
+
|
|
50
|
+
# Canonical URLs, meta descriptions, sitemap.xml and llms-full.txt.
|
|
51
|
+
- name: Postprocess book
|
|
52
|
+
run: python3 docs/book/postprocess.py
|
|
49
53
|
|
|
50
54
|
# The benchmark dashboard lives on the gh-pages branch. Copy it into the
|
|
51
55
|
# book so this workflow is the only thing that publishes to Pages.
|
|
@@ -61,8 +65,8 @@ jobs:
|
|
|
61
65
|
run: |
|
|
62
66
|
src=.benchmark-data/dev/bench
|
|
63
67
|
if [ -d "$src" ]; then
|
|
64
|
-
mkdir -p
|
|
65
|
-
cp -R "$src"
|
|
68
|
+
mkdir -p docs/book/book/dev
|
|
69
|
+
cp -R "$src" docs/book/book/dev/bench
|
|
66
70
|
else
|
|
67
71
|
echo "::warning::no benchmark data on gh-pages; /dev/bench/ will be missing"
|
|
68
72
|
fi
|
|
@@ -70,7 +74,7 @@ jobs:
|
|
|
70
74
|
- name: Upload Pages artifact
|
|
71
75
|
uses: actions/upload-pages-artifact@v5
|
|
72
76
|
with:
|
|
73
|
-
path:
|
|
77
|
+
path: docs/book/book
|
|
74
78
|
|
|
75
79
|
deploy:
|
|
76
80
|
name: Deploy to Pages
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: Examples
|
|
2
|
+
|
|
3
|
+
# Runs the use-case examples under examples/ the way their READMEs describe.
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
paths:
|
|
8
|
+
- "examples/postgres-cdc-to-qdrant/**"
|
|
9
|
+
- "examples/transactional-outbox/**"
|
|
10
|
+
- "examples/test-without-a-broker/**"
|
|
11
|
+
- ".github/workflows/examples.yml"
|
|
12
|
+
pull_request:
|
|
13
|
+
paths:
|
|
14
|
+
- "examples/postgres-cdc-to-qdrant/**"
|
|
15
|
+
- "examples/transactional-outbox/**"
|
|
16
|
+
- "examples/test-without-a-broker/**"
|
|
17
|
+
- ".github/workflows/examples.yml"
|
|
18
|
+
workflow_dispatch:
|
|
19
|
+
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
|
|
23
|
+
concurrency:
|
|
24
|
+
group: examples-${{ github.ref }}
|
|
25
|
+
cancel-in-progress: true
|
|
26
|
+
|
|
27
|
+
jobs:
|
|
28
|
+
docker:
|
|
29
|
+
name: ${{ matrix.example }}
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
timeout-minutes: 20
|
|
32
|
+
strategy:
|
|
33
|
+
fail-fast: false
|
|
34
|
+
matrix:
|
|
35
|
+
example: [postgres-cdc-to-qdrant, transactional-outbox]
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v7
|
|
38
|
+
with:
|
|
39
|
+
persist-credentials: false
|
|
40
|
+
- name: Run the example's smoke test
|
|
41
|
+
working-directory: examples/${{ matrix.example }}
|
|
42
|
+
run: ./test.sh
|
|
43
|
+
|
|
44
|
+
test-without-a-broker:
|
|
45
|
+
name: test-without-a-broker
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
timeout-minutes: 20
|
|
48
|
+
steps:
|
|
49
|
+
- uses: actions/checkout@v7
|
|
50
|
+
with:
|
|
51
|
+
persist-credentials: false
|
|
52
|
+
- name: Rust
|
|
53
|
+
working-directory: examples/test-without-a-broker
|
|
54
|
+
run: cargo test --locked
|
|
55
|
+
- uses: actions/setup-python@v7
|
|
56
|
+
with:
|
|
57
|
+
python-version: "3.12"
|
|
58
|
+
- name: Python
|
|
59
|
+
working-directory: examples/test-without-a-broker/python
|
|
60
|
+
run: |
|
|
61
|
+
pip install -r requirements.txt
|
|
62
|
+
pytest -q
|
|
@@ -186,8 +186,8 @@ The grammar and examples are in [CONFIGURATION.md](docs/CONFIGURATION.md).
|
|
|
186
186
|
2. **New middleware**: Add to `middleware/mod.rs`, implement middleware wrapper types
|
|
187
187
|
3. **Configuration changes**: Update `models.rs` with new config structs, add to `EndpointType`/`Middleware` enums
|
|
188
188
|
4. **Tests**: Add integration tests in `tests/integration/`, update Docker Compose if needed
|
|
189
|
-
5. **Documentation**: Update README.md and add doc comments; when middleware or endpoint behaviour changes, also check the book's hand-written pages in `
|
|
189
|
+
5. **Documentation**: Update README.md and add doc comments; when middleware or endpoint behaviour changes, also check the book's hand-written pages in `docs/book/cookbook` and `operations`
|
|
190
190
|
|
|
191
191
|
### Dependencies
|
|
192
192
|
|
|
193
|
-
Dependencies and the feature that gates each optional one are in `Cargo.toml`, with comments explaining the non-obvious choices. The
|
|
193
|
+
Dependencies and the feature that gates each optional one are in `Cargo.toml`, with comments explaining the non-obvious choices. The only default features are `file` and `dir-spool`; an endpoint whose feature is off is served by a registered factory of the same name if there is one (see `plugins/full`).
|
|
@@ -2,6 +2,291 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `mq-bridge`. Newest first.
|
|
4
4
|
|
|
5
|
+
## 0.4.20
|
|
6
|
+
|
|
7
|
+
Kafka outputs publish faster with their default settings. If you depend on `mq-bridge` with
|
|
8
|
+
`default-features = false` and use the `file` or `dir_spool` endpoint, read "Behaviour
|
|
9
|
+
changes" first: both are Cargo features now.
|
|
10
|
+
|
|
11
|
+
### Behaviour changes
|
|
12
|
+
|
|
13
|
+
- **`mqb --ui` listens on `127.0.0.1:9091`, not on `0.0.0.0:9091`.** The UI has no login,
|
|
14
|
+
and the old default put it on the network. The Docker image keeps `0.0.0.0:9091` through
|
|
15
|
+
`ENV MQB_UI_DEFAULT_ADDR`. To reach the UI from another machine, set `ui_addr` in the
|
|
16
|
+
config; a start on such an address logs a warning.
|
|
17
|
+
- **A web UI on a loopback address refuses a request with a foreign `Host` header** (403).
|
|
18
|
+
This stops a web page from reaching the UI through DNS rebinding. Behind a reverse proxy
|
|
19
|
+
or a port forward that sends another host name, list the names in `MQB_UI_ALLOWED_HOSTS`.
|
|
20
|
+
- **`GET /config` of the web UI no longer returns secrets** in any storage mode except
|
|
21
|
+
`unencrypted` and `temporary_messages`. Each secret is shown as a reference to the key it
|
|
22
|
+
is stored under, such as `${MQB__PUBLISHERS__<id>__HTTP__BASIC_AUTH__1}`; a URL keeps
|
|
23
|
+
everything but its password. A save replaces each reference by the stored value, so
|
|
24
|
+
cloning, copying and renaming an endpoint keep its secrets. A reference to a key that is
|
|
25
|
+
not stored is refused with 400. A config exported from the UI holds references, and a
|
|
26
|
+
script that read secrets from this endpoint no longer gets them.
|
|
27
|
+
- **An HTTP output with `tls.required: true` and an `http://` URL fails at start.** It sent
|
|
28
|
+
its requests unencrypted before. An `http://` output to another host that carries
|
|
29
|
+
`basic_auth` or custom headers logs a warning.
|
|
30
|
+
|
|
31
|
+
- **`file` and `dir_spool` are Cargo features: `file` and `dir-spool`.** Both endpoints
|
|
32
|
+
were compiled into every build. They are now in the default features, and in `full` and
|
|
33
|
+
`portable`; `object-store` enables `file`.
|
|
34
|
+
- A dependency with default features, `full` or `portable` builds what it built before.
|
|
35
|
+
- A dependency with `default-features = false` loses both endpoints. A route that names
|
|
36
|
+
one fails at start with `Unsupported consumer endpoint type` (or `publisher`), and code
|
|
37
|
+
that names `endpoints::file` or `endpoints::dir_spool` no longer compiles. To keep them:
|
|
38
|
+
|
|
39
|
+
```toml
|
|
40
|
+
mq-bridge = { version = "0.4", default-features = false, features = ["file", "dir-spool"] }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- The config types (`FileConfig`, `DirSpoolConfig`) and the `EndpointType` variants stay
|
|
44
|
+
in every build, so a configuration still parses.
|
|
45
|
+
- `mq-bridge-app`, the Python package and the Node.js package are unchanged; they enable
|
|
46
|
+
both.
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
|
|
50
|
+
- **A C library.** The new `c/mq-bridge-c` crate builds `libmq_bridge` (shared and static)
|
|
51
|
+
with the header `include/mq_bridge.h`: messages, publishers (send, batch, request/reply),
|
|
52
|
+
pull consumers with commit and per-batch ack/nack, and routes with handlers, configured
|
|
53
|
+
with the same YAML or JSON as the other bindings. Every call blocks. The header is
|
|
54
|
+
generated and carries no ABI stability promise: it ships with its library, and
|
|
55
|
+
`mqb_api_version()` detects a mismatch. There are no prebuilt archives yet; see
|
|
56
|
+
`c/mq-bridge-c/README.md`.
|
|
57
|
+
- **Plugin tables registered from the host program.** `plugin::register_plugin_table`
|
|
58
|
+
(C: `mqb_register_plugin`) registers an `MqbPluginVTable` that lives in the running
|
|
59
|
+
program, so a C or C++ application defines custom endpoints and middleware without
|
|
60
|
+
building a separate plugin library.
|
|
61
|
+
- **Live status in the CLI, the UI and MCP.** `mqb status` lists every route and consumer that
|
|
62
|
+
any `mqb` process of your user is running on the machine, with state, current and average
|
|
63
|
+
rate, total, pending and uptime. On a terminal it redraws every second; `--no-watch` prints
|
|
64
|
+
once and `--json` prints the records. The
|
|
65
|
+
UI has a **Status** tab with the same rows and the last 60 seconds of each rate, and the MCP
|
|
66
|
+
server has a read-only `bridge_status` tool. `mqb copy` and headless config runs now report
|
|
67
|
+
rates and totals too. Error text stays out of these records unless
|
|
68
|
+
`MQB_STATUS_SHOW_ERRORS=1` is set for both the reporting and the reading process.
|
|
69
|
+
- **`http_bulk` reads an open stream.** `read.stream: sse` or `ndjson` sends one request and
|
|
70
|
+
turns every server-sent event or line of the response into a message, instead of asking
|
|
71
|
+
for pages. An SSE source resumes with `Last-Event-ID` from the last acknowledged event, an
|
|
72
|
+
NDJSON source from a field named by `cursor.item`; both save the position in
|
|
73
|
+
`checkpoint_store` and connect again when the response ends. With a stream,
|
|
74
|
+
`request_timeout_ms` is the longest silence, not the length of the response. This is the
|
|
75
|
+
way to consume a remote SSE feed or a one-response export; the `http` endpoint's
|
|
76
|
+
`receive_streamable` and `stream_response_to` are unchanged.
|
|
77
|
+
- **Named `http_bulk` endpoints from your own crate.** `typesense` and `elasticsearch` are
|
|
78
|
+
`http_bulk` configurations behind a name, and that table was closed.
|
|
79
|
+
`endpoints::http_bulk::register_preset_with(name, schema, resolve)` registers one of your
|
|
80
|
+
own as a `custom` endpoint; `preset_schema`, `preset_base_url` and `preset_segment` are the
|
|
81
|
+
helpers the built-in ones use.
|
|
82
|
+
- **Every built-in endpoint as one plugin library.** The new `plugins/full` crate builds
|
|
83
|
+
`libmq_bridge_full`, which registers a factory for each built-in endpoint under its own
|
|
84
|
+
name. A host compiled without an endpoint's feature and with this library loaded keeps
|
|
85
|
+
using `kafka:`, `file:` and the rest unchanged: a built-in the build has no feature for
|
|
86
|
+
is now served by a factory registered under the same name, and fails as before when there
|
|
87
|
+
is none. The library has its own engine, so `memory` channels, `ref` names and factories
|
|
88
|
+
registered in the host are not shared with the endpoints it creates.
|
|
89
|
+
- **`plugin::disable_plugin_loading()`.** After this call the process opens no plugin
|
|
90
|
+
library any more, neither by path nor by discovery, and there is no way to switch it back
|
|
91
|
+
on. `MQB_PLUGIN_DISCOVERY=0` only covers discovery and has to be set in the environment;
|
|
92
|
+
this is for a host that must rule out native code loaded at runtime.
|
|
93
|
+
- **HTTP input: `header_read_timeout_ms` and `max_body_bytes`.** The first closes an HTTP/1
|
|
94
|
+
connection whose request head is not complete in time, the second sets the largest request
|
|
95
|
+
body, also after decompression (default 256 MiB, as before). The timeout is off by default:
|
|
96
|
+
with `30000` set, a debug build served about 15 to 20 % fewer requests per second on a
|
|
97
|
+
`http` to `response` route. Set it on a listener that is reachable from an untrusted network.
|
|
98
|
+
|
|
99
|
+
### Changed
|
|
100
|
+
|
|
101
|
+
- **CSV files read at their 0.4.15 speed again.** The quote scan that decides where a CSV
|
|
102
|
+
record ends had become about 15% slower in 0.4.16, when it learned to handle a record
|
|
103
|
+
read in pieces. It now jumps from quote to quote instead of visiting every byte, with the
|
|
104
|
+
same result. A 1,000,000-row CSV → JSONL copy on an Apple M1 takes 0.35 s, against 0.41 s
|
|
105
|
+
with 0.4.19.
|
|
106
|
+
- **CSV files and objects are written faster.** A row whose keys follow the header's
|
|
107
|
+
columns, as every row after the first usually does, is written without building a key
|
|
108
|
+
map first, nested objects under `nested: flatten` included. A 1,000,000-row JSONL → CSV
|
|
109
|
+
copy on an Apple M1 takes 1.12 s instead of 1.45 s, and 0.96 s instead of 2.03 s when
|
|
110
|
+
each row flattens a nested object. The output is byte-identical.
|
|
111
|
+
- **`mqb copy --drain` exits within 5 ms of the last row.** It noticed the end of a route by
|
|
112
|
+
polling every 50 ms, which added up to 50 ms to every copy, noticeable on short ones.
|
|
113
|
+
- **Kafka publishing no longer waits 5 ms per batch.** A Kafka output awaits the delivery of
|
|
114
|
+
every batch, and the producer's `linger.ms` of 5 held each batch back for that long before
|
|
115
|
+
sending it. The default is now 1 ms, which still sends a batch as one request per partition.
|
|
116
|
+
With the defaults (`batch_size: 512`, `concurrency: 1`) a local broker took about 71,000
|
|
117
|
+
messages per second instead of 29,000. `delayed_ack: true`, which awaits nothing, keeps
|
|
118
|
+
5 ms; the producer a Kafka input uses for replies also moves to 1 ms. A
|
|
119
|
+
`linger.ms` in `producer_options` overrides the default as before.
|
|
120
|
+
|
|
121
|
+
### Fixed
|
|
122
|
+
|
|
123
|
+
- `mq-bridge-app`: saving a config in `sensitive` or `durable` mode removes the secrets
|
|
124
|
+
that an earlier `balanced` save left in the `.env` file.
|
|
125
|
+
- Desktop app: the list of stored secrets keeps the keys of earlier saves, so "delete
|
|
126
|
+
secrets" also reaches the secret of a renamed or removed endpoint.
|
|
127
|
+
- **Passwords no longer appear in connect logs and error text.** The AMQP and MQTT connect
|
|
128
|
+
lines at INFO printed the broker URL with its password. Errors from the HTTP and WebSocket
|
|
129
|
+
outputs quoted it too. All now show `user:***@host`; the HTTP output's `status()` target
|
|
130
|
+
does the same.
|
|
131
|
+
- **`mqb copy` hides more credentials.** The `copy route started` line now also blanks
|
|
132
|
+
`basic_auth`, `custom_headers`, `headers`, API keys and the credentials of a nested endpoint
|
|
133
|
+
URI (`fanout:?to=…`), percent-encoded or not. Errors about a URI or a middleware spec quote
|
|
134
|
+
it with the same redaction instead of as typed.
|
|
135
|
+
- **`cookie_jar` stores every cookie of a response.** A response with several `Set-Cookie`
|
|
136
|
+
headers left only the last one in the jar. The HTTP output now keeps them all in the
|
|
137
|
+
`set-cookie` metadata, one per line, and an HTTP input that replies with that metadata
|
|
138
|
+
sends one header per line.
|
|
139
|
+
- **HTTP `stream_response_to`: a response that breaks before its first item no longer writes
|
|
140
|
+
to the stream.** The send already failed as retryable, but an error and an end marker went to
|
|
141
|
+
the stream first, so its reader saw a closed stream and a retry refilled it behind the
|
|
142
|
+
reader's back. Now nothing is written until the first item. A response that breaks later is
|
|
143
|
+
unchanged: it ends with an item marked `http_stream_error` and the send is acknowledged.
|
|
144
|
+
- **`postgres_cdc`: a `truncate` event no longer carries `postgres.key`.** It had `[null]`, one
|
|
145
|
+
`null` per key column, which a sink that deletes or upserts by key would take for a row. The
|
|
146
|
+
event keeps a deterministic `message_id`, also on tables without a primary key; that id
|
|
147
|
+
differs from the one earlier versions produced.
|
|
148
|
+
- **A large batch no longer fails a SQL output with an `insert_query`.** A batch that needed
|
|
149
|
+
more bind parameters than the database takes in one statement (65,535 on Postgres) failed
|
|
150
|
+
with `too many arguments for query`. It is now written as several statements in one
|
|
151
|
+
transaction, as `columns: auto` already did.
|
|
152
|
+
|
|
153
|
+
## 0.4.19
|
|
154
|
+
|
|
155
|
+
CSV in more shapes: the reader takes other separators and quoting, and a CSV sink no longer
|
|
156
|
+
mixes JSON into its cells. The second is a behaviour change, listed below.
|
|
157
|
+
|
|
158
|
+
### Added
|
|
159
|
+
|
|
160
|
+
- **CSV dialects.** `format: csv` took only comma-separated, `"`-quoted files with a header. A
|
|
161
|
+
`csv` block on the `file` endpoint and on an `object_store` source now sets `separator` (one
|
|
162
|
+
character, `tab`, `space`, hex, or `auto`), `quote` (a character or `none`), `header` and
|
|
163
|
+
`columns`. `separator: auto` is for sources and takes whichever of `,` `;` tab `|` occurs
|
|
164
|
+
most often outside quotes in the first record. That covers Excel's semicolon exports, TSV
|
|
165
|
+
from `mongoexport` and `psql`, and headerless dumps; the book's file page lists the setting
|
|
166
|
+
per tool. On the command line it is one parameter, `csv={"separator":"auto"}`.
|
|
167
|
+
`FileConfig` and `ObjectStoreConfig` gain the field `csv`, and `models` the types
|
|
168
|
+
`CsvConfig` and `CsvNested`; code that builds either struct without `..Default::default()`
|
|
169
|
+
needs the new field.
|
|
170
|
+
- **CSV to object storage.** An `object_store` sink rejected `format: csv`. It now writes each
|
|
171
|
+
batch as a CSV file with its own header, taken from that batch's first row, in the dialect
|
|
172
|
+
the `csv` block sets. Set `csv.columns` when every object must have the same columns.
|
|
173
|
+
- **A warning for short CSV rows.** A row with fewer fields than the header was read with the
|
|
174
|
+
missing ones empty and nothing said, which is what a wrong `separator` looks like. It is now
|
|
175
|
+
warned about once per process, as a row with too many fields already was.
|
|
176
|
+
|
|
177
|
+
- **`aggregate`: `on_error`, time-based averages, late-message detection, `read_only`.**
|
|
178
|
+
- `on_error: drop | fail | skip` says what happens to a message that cannot be folded.
|
|
179
|
+
`drop` is the default and what happened before: an input logs, acks and drops it, so an
|
|
180
|
+
HTTP caller gets `202`. `fail` nacks it instead (HTTP `500`). `skip` leaves out only the
|
|
181
|
+
entries that cannot be computed, runs the others, passes the message on and names the
|
|
182
|
+
skipped entries in the metadata `mqb.aggregate.skipped`. Before, one missing field in one
|
|
183
|
+
entry discarded the message for all entries.
|
|
184
|
+
- `ema`, `ema_stddev` and `ema_variance` take a half-life in place of `alpha`
|
|
185
|
+
(`ema(reading, 5m)`): a value counts half after that time, however many messages came.
|
|
186
|
+
The new `time` names the payload field with the event time (epoch seconds or
|
|
187
|
+
milliseconds, or RFC 3339); without it the clock is used.
|
|
188
|
+
- With `time`, a message older than the newest one its state has seen is folded without
|
|
189
|
+
decay and marked with the metadata `mqb.aggregate.late`. It is detected, not reordered.
|
|
190
|
+
- `read_only: true` reads the states from the `store` and never changes them, for a dry run
|
|
191
|
+
or a second route that only reads.
|
|
192
|
+
- The error for a missing field now says `is missing or not a number`.
|
|
193
|
+
- `AggregateMiddleware` gains the fields `time`, `on_error` and `read_only`, and `models`
|
|
194
|
+
the enum `AggregateOnError`; code that builds the struct without `..Default::default()`
|
|
195
|
+
needs the new fields.
|
|
196
|
+
- **Descriptive names for the file formats.** `format: raw` writes only the payload, which
|
|
197
|
+
for JSON payloads is plain JSON lines, while `format: json` writes the whole message
|
|
198
|
+
envelope; the names suggested the opposite. `payload`, `envelope_json`, `envelope_text`
|
|
199
|
+
and `envelope` are now accepted for `raw`, `json`, `text` and `normal`, on `file`,
|
|
200
|
+
`object_store` and `mongodb`. The old names keep working and are what is written back.
|
|
201
|
+
- **`mqb copy`: pipes, `--limit`, progress, compression by file name.**
|
|
202
|
+
- `-` is stdin as the source and stdout as the target (`-?format=csv` takes parameters). A
|
|
203
|
+
`file` source on a pipe, FIFO or terminal is read once without seeking, and its end ends
|
|
204
|
+
the copy, with or without `--drain`. Before, `file:///dev/stdin` failed with `Illegal seek`.
|
|
205
|
+
With stdout as the target the `copied …` summary goes to stderr.
|
|
206
|
+
- `--limit N` stops after `N` rows reached the destination; with `--filter`, `N` matching rows.
|
|
207
|
+
- On a terminal, a running row count is shown on stderr every two seconds.
|
|
208
|
+
- A `file://` path ending in `.gz`, `.zst` or `.lz4` sets `compression`; `compression=none`
|
|
209
|
+
overrides. A sink named `out.jsonl.gz` used to be written uncompressed.
|
|
210
|
+
- A copy without `--drain` now exits when its route ends by itself, on a permanent error or
|
|
211
|
+
the end of a stream. It used to wait for Ctrl-C.
|
|
212
|
+
- **SQL sink: `columns: auto` and `key`.** A SQL sink could write a record's fields into columns
|
|
213
|
+
only through a hand-written `insert_query`, percent-encoded on the command line, and an upsert
|
|
214
|
+
needed its own `ON CONFLICT` clause. With `columns: auto` each top-level JSON field goes into
|
|
215
|
+
the table column of the same name, and `key: id` turns the insert into an upsert, so
|
|
216
|
+
`mqb copy --from 'postgres://…?table=orders&cursor_column=id' --to 'postgres://…?table=orders&columns=auto&key=id'`
|
|
217
|
+
copies a table and can be rerun.
|
|
218
|
+
- The table must exist. A column a record does not name keeps its default (insert) or its
|
|
219
|
+
value (update). A field without a column is not written and is logged once; with
|
|
220
|
+
`extra_column: <name>` those fields go into that column as one JSON object.
|
|
221
|
+
- PostgreSQL casts each value to the column type, so `numeric`, `timestamptz`, `uuid`,
|
|
222
|
+
`jsonb`, enum and array columns take the text a SQL or CSV source delivers.
|
|
223
|
+
- `bulk_copy` works with `columns: auto`, not with `key`. `columns` cannot be combined with
|
|
224
|
+
`insert_query` or `auto_create_table`.
|
|
225
|
+
- `SqlxConfig` gains the fields `columns`, `key` and `extra_column`, and `models` the type `SqlColumns`.
|
|
226
|
+
- **SQL source: `timestamps: rfc3339`.** A Postgres `timestamptz` column is read in Postgres's
|
|
227
|
+
text form, `2026-10-04 09:15:23.923277+00`, which few other systems parse. With
|
|
228
|
+
`timestamps: rfc3339` a `cursor_column` source renders it in UTC as
|
|
229
|
+
`2026-10-04T09:15:23.923277Z`; a `timestamp` without zone gets the `T` and no offset. The
|
|
230
|
+
default is unchanged. `SqlxConfig` gains the field `timestamps` and `models` the type
|
|
231
|
+
`SqlTimestamps`.
|
|
232
|
+
|
|
233
|
+
### Behaviour changes
|
|
234
|
+
|
|
235
|
+
- **`aggregate`: states in memory only are opt-in.** An `aggregate` without
|
|
236
|
+
a `store` kept its states in the process, lost on restart and wrong with two instances, and
|
|
237
|
+
that was the default. It now needs `consistency: single_writer` next to it; with neither a
|
|
238
|
+
`store` nor that, the route fails to start with an error naming both. Add
|
|
239
|
+
`consistency: single_writer` to a config from 0.4.17 or 0.4.18 that has no `store` to keep
|
|
240
|
+
what it did.
|
|
241
|
+
- **A CSV sink flattens nested objects.** A nested object used to be written as JSON text in
|
|
242
|
+
one cell, so the output of `aggregate` (`{"stats":{"n":3,"avg":2.5}}`) came out as a mix of
|
|
243
|
+
CSV and JSON. It now becomes one column per leaf, named by its path: `stats.n`, `stats.avg`.
|
|
244
|
+
**A new file gets different columns than before; a file that already has a header keeps
|
|
245
|
+
it.** Set `csv.nested: json` for the previous output. Arrays are still written as JSON text.
|
|
246
|
+
- **A drain does not wait for an endpoint.** With `exit_on_empty` (`mqb copy --drain`) a route
|
|
247
|
+
that failed reconnected up to ten times, 5 s apart, before it gave up: about 50 s against a
|
|
248
|
+
closed port, a WebSocket path that answers 404, a NATS subject outside every stream or a gRPC
|
|
249
|
+
topic nobody serves. It now ends on the first failure when nothing has been delivered yet,
|
|
250
|
+
with the endpoint's error. A drain that has delivered something keeps the ten reconnects, so
|
|
251
|
+
a short outage in the middle of a long copy does not end it. Routes without `exit_on_empty`
|
|
252
|
+
reconnect without limit, as before. Add a `retry` middleware to a drain that should wait for
|
|
253
|
+
its sink.
|
|
254
|
+
- **A CSV file that ends inside a quoted field fails a drain.** The reader took everything
|
|
255
|
+
after the open quote as one field and reported success. A drain now writes the records before
|
|
256
|
+
it and fails, naming the byte offset of the open record; a tailing route waits for the writer
|
|
257
|
+
to finish the record.
|
|
258
|
+
- **Blank lines in a line-based file are skipped.** `raw`, `json`, `text` and `normal` sources
|
|
259
|
+
emitted an empty line as a message with an empty payload, which a SQL or Parquet sink then
|
|
260
|
+
rejected. The CSV reader already skipped them. Row counts change for files with blank lines.
|
|
261
|
+
- **A `file` route whose source and sink are the same path is refused.** It doubled the file
|
|
262
|
+
under a drain and would grow it without end otherwise.
|
|
263
|
+
- **SQLite `has no column named` is not retried.** A sink writing to a table without the
|
|
264
|
+
expected columns retried for ever; it is now a non-retryable error like the same case on
|
|
265
|
+
Postgres and MySQL.
|
|
266
|
+
- **An `object_store` source on a local path that does not exist fails a drain.** It reported
|
|
267
|
+
`copied 0 rows`. An empty directory or cloud prefix still does. A drain of a local path also
|
|
268
|
+
ends after one listing instead of waiting out the idle interval.
|
|
269
|
+
- **NATS: a missing `subject` or `stream` stops the route.** It was retried as a connection
|
|
270
|
+
error until the start timeout.
|
|
271
|
+
- **Clearer errors and quieter logs.** A queue read on a plain SQL table names
|
|
272
|
+
`cursor_column`; Postgres errors no longer end in `at line N` (a line of the server's source);
|
|
273
|
+
a closed database port reports `Connection refused` at once; a `filter` that does not compile
|
|
274
|
+
lists the operators, and one with a single `=` says so; a gRPC server names the topic it has
|
|
275
|
+
no consumer for; the drop summary counts messages per cause; an unknown `aggregate` field
|
|
276
|
+
lists the built-ins; `csv` settings without `format: csv` and an `insert_query` token that
|
|
277
|
+
binds NULL each warn once. The WebSocket "falling back to routed mode" line is now DEBUG and
|
|
278
|
+
the MQTT note on restart loss INFO.
|
|
279
|
+
|
|
280
|
+
### Fixed
|
|
281
|
+
|
|
282
|
+
- **`mqb copy --wait` reports a failed route at once.** A route that failed before it delivered
|
|
283
|
+
anything was retried until the wait ran out, and a later empty attempt could then report
|
|
284
|
+
success. `--wait` now retries only a drain that ended cleanly with nothing to copy.
|
|
285
|
+
- **`aggregate` with a shared `store` no longer keeps the state of a message it rejects.** A
|
|
286
|
+
message whose result had no place in the payload (`into: a.b` where `a` is not an object) was
|
|
287
|
+
counted in the store and then failed, so under `on_error: fail` every redelivery counted it
|
|
288
|
+
again. It now fails before any state changes, as it already did without a shared store.
|
|
289
|
+
|
|
5
290
|
## 0.4.18
|
|
6
291
|
|
|
7
292
|
A new generic output for search engines, plus documentation and packaging work. This release
|
|
@@ -231,7 +516,7 @@ Each of these changes what an existing setup sees. Check them before upgrading.
|
|
|
231
516
|
SOURCE, TARGET and `--filter` of a `copy --resume` job. `reset` prints the old value so
|
|
232
517
|
`set --value` can undo it. Works for SQL, ClickHouse and object-store cursor readers and
|
|
233
518
|
MongoDB change streams; Postgres CDC is refused, its slot is authoritative. See
|
|
234
|
-
[Checkpoints](
|
|
519
|
+
[Checkpoints](docs/book/cookbook/checkpoints.md#inspecting-and-editing-a-checkpoint).
|
|
235
520
|
- **`CheckpointStore::clear`**, implemented for the file, SQL, MongoDB and object-store
|
|
236
521
|
backends. The default returns an error, so existing implementations still compile.
|
|
237
522
|
|