Relaybus is a broker-agnostic messaging SDK with a stable envelope contract across Go, TypeScript, and Python.
It is designed for teams that want transport flexibility (AMQP/NATS/Kafka/HTTP) without changing message semantics between languages.
- Opaque payloads: relaybus never interprets your bytes; you control serialization.
- Stable envelope: all transports use the same versioned JSON envelope.
- Cross-language parity: shared corpus tests validate behavior across SDKs.
- Library-first: small transport packages, no required runtime service from relaybus itself.
- Current schema:
v1 - Current transports: AMQP, NATS, Kafka, HTTP across Go/TypeScript/Python
- Go-only extra: in-memory publisher adapter (
memorydestination)
Prerequisites:
- Docker + Docker Compose
- Go
- Node 20+
- Python 3.11+
pnpm install
docker compose -f docker-compose.yaml up -d
make e2e
docker compose -f docker-compose.yaml down -vThis runs Go, TypeScript, and Python e2e flows against real brokers.
TypeScript:
npm install @relaymesh/relaybus-core @relaymesh/relaybus-amqp @relaymesh/relaybus-nats @relaymesh/relaybus-kafka @relaymesh/relaybus-httpPython:
pip install relaybus-core relaybus-amqp relaybus-nats relaybus-kafka relaybus-httpGo:
go get github.com/relaymesh/relaybus/sdk/core/go| Adapter | Go | TypeScript | Python |
|---|---|---|---|
| AMQP | publish + subscribe | publish + subscribe | publish + subscribe |
| NATS | publish + subscribe | publish + subscribe | publish + subscribe |
| Kafka | publish + subscribe | publish + subscribe | publish + subscribe |
| HTTP | publish + subscribe | publish + subscribe | publish + subscribe |
| Memory | publish only | - | - |
Every message is encoded as JSON with a base64 payload field.
Required fields:
vidtopictscontent_typepayload_b64meta
Defaults:
content_typedefaults toapplication/octet-streammetais always present (empty object allowed)
Source of truth:
- JSON Schema:
spec/envelope_v1.jsonschema - Cross-language corpus:
spec/corpus/samples,spec/corpus/expected
package main
import (
"context"
"log"
"time"
amqpadapter "github.com/relaymesh/relaybus/sdk/amqp/go"
"github.com/relaymesh/relaybus/sdk/core/go"
)
func main() {
pub, err := core.NewPublisher(core.Config{
Destination: "amqp",
AMQP: amqpadapter.Config{
URL: "amqp://guest:guest@localhost:5672/",
RoutingKeyTemplate: "{topic}",
},
})
if err != nil {
log.Fatal(err)
}
defer pub.Close()
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
err = pub.Publish(ctx, "relaybus.demo", core.Message{
Topic: "relaybus.demo",
Payload: []byte("hello from go"),
})
if err != nil {
log.Fatal(err)
}
}import { AmqpSubscriber } from "@relaymesh/relaybus-amqp";
async function main() {
const sub = await AmqpSubscriber.connect({
url: "amqp://guest:guest@localhost:5672/",
onMessage: (msg) => {
console.log(msg.topic, msg.payload.toString());
}
});
await sub.start("relaybus.demo");
await sub.close();
}
main().catch((err) => {
console.error(err);
process.exit(1);
});TypeScript:
sdk/core/typescript/README.mdsdk/amqp/typescript/README.mdsdk/nats/typescript/README.mdsdk/kafka/typescript/README.mdsdk/http/typescript/README.md
Python:
sdk/core/python/README.mdsdk/amqp/python/README.mdsdk/nats/python/README.mdsdk/kafka/python/README.mdsdk/http/python/README.md
Go:
sdk/core/gosdk/amqp/gosdk/nats/gosdk/kafka/gosdk/http/go
This repository is a multi-language monorepo.
Top-level layout:
sdk/core/{go,typescript,python}: shared envelope/core behaviorsdk/{amqp,http,nats,kafka}/{go,typescript,python}: transport adaptersspec/: schema + corpus fixtures used by testsscripts/: repo tooling (sync_core.py,bump_versions.py,e2e.sh)
Install JS workspace dependencies:
pnpm installRun all unit tests:
make testRun e2e locally:
docker compose -f docker-compose.yaml up -d
make e2e
docker compose -f docker-compose.yaml down -vSync vendored core code into adapters (required after core TS/Python changes):
python3 scripts/sync_core.py- CI workflow:
.github/workflows/ci.yml - Release workflow:
.github/workflows/release.yml(tag pushv*)
Version bump helper:
make bump VERSION=0.x.y- E2E fails to connect to brokers: ensure Docker services are up with
docker compose -f docker-compose.yaml up -d. - TypeScript tests fail with missing binaries: run
pnpm installat repo root. - Cross-language behavior mismatch after core edits: run
python3 scripts/sync_core.pyand re-run tests.