{"id":34952266,"url":"https://github.com/mariotoffia/gobridge","last_synced_at":"2026-05-21T22:03:47.069Z","repository":{"id":321102008,"uuid":"1084138541","full_name":"mariotoffia/gobridge","owner":"mariotoffia","description":"This is a bridge between the stateless world and the stateful such as Lambda/SQS \u003c-\u003e MQTT or Azure Service Bus","archived":false,"fork":false,"pushed_at":"2026-05-13T13:52:02.000Z","size":4313,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T15:35:53.092Z","etag":null,"topics":["aws","azure","broker","mqtt","serverless"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mariotoffia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":"audit/test-timing-allowlist.txt","citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-10-27T09:22:43.000Z","updated_at":"2026-05-13T13:50:50.000Z","dependencies_parsed_at":"2025-10-27T20:36:48.804Z","dependency_job_id":"6a4fb8ad-287c-4c1f-b0c6-ea4a51942d68","html_url":"https://github.com/mariotoffia/gobridge","commit_stats":null,"previous_names":["mariotoffia/gobridge"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/mariotoffia/gobridge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariotoffia%2Fgobridge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariotoffia%2Fgobridge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariotoffia%2Fgobridge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariotoffia%2Fgobridge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mariotoffia","download_url":"https://codeload.github.com/mariotoffia/gobridge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariotoffia%2Fgobridge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33130364,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T06:27:06.342Z","status":"ssl_error","status_checked_at":"2026-05-17T06:26:59.432Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","azure","broker","mqtt","serverless"],"created_at":"2025-12-26T21:40:34.126Z","updated_at":"2026-05-21T22:03:47.058Z","avatar_url":"https://github.com/mariotoffia.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gobridge\n\nA message-bridge framework for Go. Route messages between MQTT, AWS SQS, Azure Service Bus, RabbitMQ (AMQP 0-9-1), AMQP 1.0 brokers, and other transports with pluggable processors, durable outbox delivery, dead-letter queue management, and observability.\n\n## Features\n\n- **Multi-transport routing**: MQTT v5, AWS SQS, Azure Service Bus, RabbitMQ (AMQP 0-9-1), AMQP 1.0 with a clean port/adapter model\n- **Delivery guarantees**: DirectHold (send-then-ack) and SharedOutbox (persist-then-ack with durable outbox drainer)\n- **Processor chain**: Middleware for filtering, transformation, circuit breaking, and tenant isolation\n- **Pluggable stores**: LeaseStore, OutboxStore, DLQStore with Memory and DynamoDB implementations; SQLite for OutboxStore and DLQStore\n- **Credential management**: URI-based resolution (file://, pms://) with scheme dispatch and caching\n- **HTTP APIs**: Admin server for bridge lifecycle, route injection, and DLQ management; Monitor server for health probes and topology\n- **Observability**: OpenTelemetry metrics and tracing, CloudWatch metrics, correlation-aware structured logging via slog\n- **Zero-dependency core**: The root module has no external dependencies -- only import the adapters you need\n\n## Quick Start\n\nThe simplest possible bridge — a single MQTT topic forwarded to another topic — is walked through end to end (YAML config + Go bootstrap + variations) in **[Scenario 1: MQTT-to-MQTT Bridge](docs/scenarios/01-mqtt-to-mqtt.md)**.\n\nFor richer setups, see the [scenarios index](docs/scenarios/) (durable outbox, clustered exclusive sessions, multi-tenant routing, custom processors, …) or jump straight to the [Configuration Overview](docs/configuration-overview.md).\n\n## Installation\n\n```bash\n# Core module (domain, ports, runtime, config, bridge) -- zero external deps\ngo get github.com/mariotoffia/gobridge\n\n# MQTT transport adapter\ngo get github.com/mariotoffia/gobridge/adapters/mqtt/transport/paho\n\n# AWS SQS transport adapter\ngo get github.com/mariotoffia/gobridge/adapters/aws/transport/sqs\n\n# Azure Service Bus transport adapter\ngo get github.com/mariotoffia/gobridge/adapters/azure/transport/servicebus\n\n# RabbitMQ (AMQP 0-9-1) transport adapter\ngo get github.com/mariotoffia/gobridge/adapters/amqp/transport/amqp091\n\n# AMQP 1.0 transport adapter (Artemis, Solace, Qpid, etc.)\ngo get github.com/mariotoffia/gobridge/adapters/amqp/transport/amqp10\n\n# Native stores (memory, SQLite)\ngo get github.com/mariotoffia/gobridge/adapters/native/store\n\n# DynamoDB stores\ngo get github.com/mariotoffia/gobridge/adapters/aws/store\n```\n\n## Documentation\n\n| Document | Description |\n|----------|-------------|\n| [Architecture](ARCHITECTURE.md) | System design, hexagonal layers, core concepts, message flow |\n| [Domain Model (DDD)](DDD.md) | Bounded contexts, aggregates, invariants, context map |\n| [Ubiquitous Language](UBIQUITOUS.md) | Authoritative glossary of terms used in code, config, logs, and docs |\n| [Development](DEVELOPMENT.md) | Prerequisites, workspace setup, building, testing, CI |\n| [Plugins](PLUGIN.md) | How to write transport, store, credential, and processor plugins |\n| [Testing](TESTS.md) | Rules for writing non-flaky, architecturally-correct unit, integration, and long-running tests |\n\n### Guides\n\n| Guide | Description |\n|-------|-------------|\n| [Configuration Overview](docs/configuration-overview.md) | Configuration lifecycle, sources, layered config, dynamic reconfiguration |\n| [Configuration Reference](docs/configuration-reference.md) | Field-by-field reference for `BridgeConfig` |\n| [Transport Configuration](docs/transport-configuration.md) | MQTT, SQS, Azure Service Bus, RabbitMQ, AMQP 1.0, HTTP transport options |\n| [Processors and Stores](docs/processors-and-stores.md) | Processor chain (filter, transform, circuit breaker, tenant) and store backends |\n| [Credentials and HTTP API](docs/credentials-and-http-api.md) | URI-based credential resolution and Admin/Monitor HTTP API |\n| [Scenarios](docs/scenarios/) | Progressive walkthroughs from basic MQTT forwarding to cross-protocol AMQP bridging |\n\n### Machine-readable specs\n\n| Spec | Description |\n|------|-------------|\n| [`spec/httpapi/http-api.yaml`](spec/httpapi/http-api.yaml) | OpenAPI 3.x contract for the Admin and Monitor HTTP servers |\n| [`spec/httpapi/components.yaml`](spec/httpapi/components.yaml) | Shared OpenAPI component schemas for the bridge HTTP surface |\n| [`spec/httpapi/config-components.yaml`](spec/httpapi/config-components.yaml) | OpenAPI schema for the `BridgeConfig` blueprint exposed via the Admin API |\n\n## Project Structure\n\n```\ngobridge/\n├── domain/           Core value types (Envelope, RoutePolicy, errors)\n├── ports/            Port interfaces (Receiver, Sender, stores, Processor)\n├── runtime/          Route execution engine (Runtime, RouteRunner)\n├── bridge/           Composition root (Builder wires config to runtime)\n├── config/           Inner-ring shared kernel: validate, merge, Manager (stdlib-only)\n│   └── parser/       Wire-format adapter: YAML/JSON parser, FileStore (yaml.v3, mapstructure)\n├── validate/         Cross-cutting blueprint validation (used by config + admin API)\n├── httpapi/          Admin and monitor HTTP servers\n├── observability/    Context helpers and correlation slog handler\n├── adapters/\n│   ├── mqtt/         MQTT v5 via Paho\n│   ├── aws/          SQS, DynamoDB stores, SSM credentials, CloudWatch, ECS cluster\n│   ├── amqp/         RabbitMQ (AMQP 0-9-1) and AMQP 1.0 (Artemis, Solace, Qpid)\n│   ├── azure/        Azure Service Bus\n│   ├── http/         HTTP POST ingress, SSE egress\n│   ├── native/       Memory and SQLite stores, file credentials, file config\n│   └── otel/         OpenTelemetry metrics and tracing\n├── processors/       Filter, transform, circuit breaker, tenant\n├── cmd/gobridge/     Example binary\n└── testutil/         Docker test helpers (DynamoDB, SQS, ASB, RabbitMQ, Artemis, S3)\n```\n\n## Transports\n\n| Transport | Module | Features |\n|-----------|--------|----------|\n| MQTT v5 | `adapters/mqtt/transport/paho` | Shared sessions, QoS 0/1/2, topic wildcards, autopaho reconnect |\n| AWS SQS | `adapters/aws/transport/sqs` | Long polling, batch send, visibility extension, FIFO support |\n| Azure Service Bus | `adapters/azure/transport/servicebus` | Queues, topics/subscriptions, batch send, auto-extend lock |\n| RabbitMQ (AMQP 0-9-1) | `adapters/amqp/transport/amqp091` | Exchanges, queues, bindings, publisher confirms, prefetch, reconnect |\n| AMQP 1.0 | `adapters/amqp/transport/amqp10` | Artemis/Solace/Qpid, link credit flow, reconnect, settlement mapping |\n| HTTP | `adapters/http/transport` (root module) | POST ingress, SSE egress, path-based routing |\n\n## Stores\n\n| Store | Module | Use Case |\n|-------|--------|----------|\n| Memory | `adapters/native/store/memory*` | Development and testing |\n| SQLite | `adapters/native/store/sqlite*` | Single-process deployments (OutboxStore, DLQStore only) |\n| DynamoDB | `adapters/aws/store/dynamodb*` | Production, clustered deployments |\n\n## Development\n\n```bash\nmake install          # Install all dev tools (golangci-lint, govulncheck, gomajor, etc.)\nmake build            # Build all modules\nmake test             # Unit tests (no Docker)\nmake test-integration # All tests (Docker required)\nmake lint             # Lint all modules\nmake tidy             # Sync workspace + tidy all module deps\nmake update           # Upgrade deps to latest minor/patch\nmake update-major     # Show available major version upgrades\nmake vulncheck        # Scan for known vulnerabilities\nmake check            # Build + lint + unit tests\n```\n\nSee [DEVELOPMENT.md](DEVELOPMENT.md) for full setup instructions.\n\n## License\n\nMIT License -- see [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariotoffia%2Fgobridge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmariotoffia%2Fgobridge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariotoffia%2Fgobridge/lists"}