Skip to main content

Combining Routers

Organize consumers by domain using nested routers.

Nested Routers

Use nested kafkaRouter for topic prefixing:

import { init, kafkaRouter } from "@alt-stack/kafka-core";

const { procedure } = init<AppContext>();

const userRouter = kafkaRouter<AppContext>({
created: procedure.input({ message: UserCreatedSchema }).subscribe(handleUserCreated),
updated: procedure.input({ message: UserUpdatedSchema }).subscribe(handleUserUpdated),
});

const orderRouter = kafkaRouter<AppContext>({
created: procedure.input({ message: OrderCreatedSchema }).subscribe(handleOrderCreated),
cancelled: procedure.input({ message: OrderCancelledSchema }).subscribe(handleOrderCancelled),
});

// Topics become: users/created, users/updated, orders/created, orders/cancelled
const mainRouter = kafkaRouter<AppContext>({
users: userRouter,
orders: orderRouter,
});

Merging Flat Routers

Use mergeKafkaRouters to combine routers without prefixing:

import { mergeKafkaRouters } from "@alt-stack/kafka-core";

const router1 = kafkaRouter({
"user-events": procedure.input({ message: UserSchema }).subscribe(() => {}),
});

const router2 = kafkaRouter({
"order-events": procedure.input({ message: OrderSchema }).subscribe(() => {}),
});

// Topics remain: user-events, order-events (no prefix)
const mainRouter = mergeKafkaRouters(router1, router2);

Using init() Factory

const { router, mergeRouters, procedure } = init<AppContext>();

const r1 = router();
r1.registerProcedure("events", procedure.input({ message: Schema }).subscribe(() => {}));

const r2 = router();
r2.registerProcedure("other", procedure.input({ message: Schema }).subscribe(() => {}));

const merged = mergeRouters(r1, r2);