Files
stack/apps/orchestrator/src/app.module.ts
Jason Woltje af299abdaf
All checks were successful
ci/woodpecker/push/infra Pipeline was successful
ci/woodpecker/push/orchestrator Pipeline was successful
ci/woodpecker/push/api Pipeline was successful
ci/woodpecker/push/web Pipeline was successful
debug(auth): log session cookie source
2026-02-18 21:36:01 -06:00

61 lines
1.9 KiB
TypeScript

import { Module } from "@nestjs/common";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { BullModule } from "@nestjs/bullmq";
import { ThrottlerModule } from "@nestjs/throttler";
import { HealthModule } from "./api/health/health.module";
import { AgentsModule } from "./api/agents/agents.module";
import { QueueApiModule } from "./api/queue/queue-api.module";
import { CoordinatorModule } from "./coordinator/coordinator.module";
import { BudgetModule } from "./budget/budget.module";
import { CIModule } from "./ci";
import { orchestratorConfig } from "./config/orchestrator.config";
/**
* Rate limiting configuration:
* - 'default': Standard API endpoints (100 requests per minute)
* - 'strict': Spawn/kill endpoints (10 requests per minute) - prevents DoS
* - 'status': Status/health endpoints (200 requests per minute) - higher for polling
*/
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [orchestratorConfig],
}),
BullModule.forRootAsync({
inject: [ConfigService],
useFactory: (configService: ConfigService) => ({
connection: {
host: configService.get<string>("orchestrator.valkey.host", "localhost"),
port: configService.get<number>("orchestrator.valkey.port", 6379),
password: configService.get<string>("orchestrator.valkey.password"),
},
}),
}),
ThrottlerModule.forRoot([
{
name: "default",
ttl: 60000, // 1 minute
limit: 100, // 100 requests per minute
},
{
name: "strict",
ttl: 60000, // 1 minute
limit: 10, // 10 requests per minute for spawn/kill
},
{
name: "status",
ttl: 60000, // 1 minute
limit: 200, // 200 requests per minute for status endpoints
},
]),
HealthModule,
AgentsModule,
QueueApiModule,
CoordinatorModule,
BudgetModule,
CIModule,
],
})
export class AppModule {}