๐
Type Safety & Validation
End-to-end TypeScript inference with automatic runtime validation using Zod, Valibot, or ArkType.
End-to-end type safety ยท Runtime validation ยท Reliable retry patterns
Define your contract once โ get type safety everywhere:
import {
defineContract,
defineExchange,
defineQueue,
defineEventPublisher,
defineEventConsumer,
defineMessage,
} from "@amqp-contract/contract";
import { z } from "zod";
const ordersExchange = defineExchange("orders", "topic", { durable: true });
const ordersDlx = defineExchange("orders-dlx", "topic", { durable: true });
const orderProcessingQueue = defineQueue("order-processing", {
deadLetter: { exchange: ordersDlx },
retry: { mode: "ttl-backoff" }, // Automatic retry with exponential backoff
});
const orderMessage = defineMessage(
z.object({
orderId: z.string(),
amount: z.number(),
}),
);
// Event pattern: publisher broadcasts, consumers subscribe
const orderCreatedEvent = defineEventPublisher(ordersExchange, orderMessage, {
routingKey: "order.created",
});
// Compose contract - configs go directly, bindings auto-generated
export const contract = defineContract({
exchanges: { orders: ordersExchange, ordersDlx },
queues: { orderProcessing: orderProcessingQueue },
publishers: {
// EventPublisherConfig โ auto-extracted to publisher
orderCreated: orderCreatedEvent,
},
consumers: {
// EventConsumerResult โ auto-extracted to consumer + binding
processOrder: defineEventConsumer(orderCreatedEvent, orderProcessingQueue),
},
});import { TypedAmqpClient } from "@amqp-contract/client";
import { contract } from "./contract";
const client = await TypedAmqpClient.create({
contract,
urls: ["amqp://localhost"],
}).resultToPromise();
await client.publish("orderCreated", {
orderId: "ORD-123", // โ
TypeScript knows!
amount: 99.99,
});import { TypedAmqpWorker } from "@amqp-contract/worker";
import { Future, Result } from "@swan-io/boxed";
import { contract } from "./contract";
const worker = await TypedAmqpWorker.create({
contract,
handlers: {
processOrder: ({ payload }) => {
console.log(payload.orderId); // โ
Fully typed!
return Future.value(Result.Ok(undefined));
},
},
urls: ["amqp://localhost"],
}).resultToPromise();