diff --git a/@packages/@infrastructure/queue-infrastructure/package.json b/@packages/@infrastructure/queue-infrastructure/package.json index 31a92cd65..3b7a60fd0 100644 --- a/@packages/@infrastructure/queue-infrastructure/package.json +++ b/@packages/@infrastructure/queue-infrastructure/package.json @@ -9,7 +9,7 @@ ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js", - "require": "./dist/index.cjs" + "require": "./dist/index.js" } }, "scripts": { diff --git a/features/image-generator/backend-api/package.json b/features/image-generator/backend-api/package.json index d2738ac68..667dc2bab 100644 --- a/features/image-generator/backend-api/package.json +++ b/features/image-generator/backend-api/package.json @@ -17,7 +17,6 @@ }, "dependencies": { "@lilith/image-generator-types": "^0.0.3", - "@lilith/queue-infrastructure": "workspace:*", "@nestjs/bullmq": "^11.0.0", "@nestjs/common": "^11.0.0", "@nestjs/config": "^4.0.0", diff --git a/features/image-generator/backend-api/src/app.module.ts b/features/image-generator/backend-api/src/app.module.ts index 5278a51c5..3505313bc 100644 --- a/features/image-generator/backend-api/src/app.module.ts +++ b/features/image-generator/backend-api/src/app.module.ts @@ -3,7 +3,7 @@ import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; import { BullModule } from '@nestjs/bullmq'; -import { QUEUE_NAMES } from '@lilith/queue-infrastructure'; +import { IMAGE_GENERATOR_QUEUE } from './queue/queue.constants'; import { HealthModule } from './health/health.module'; import { StorageModule } from './storage/storage.module'; import { GenerationModule } from './generation/generation.module'; @@ -46,7 +46,7 @@ import { ImageDerivative } from './entities/image-derivative.entity'; }), }), BullModule.registerQueue({ - name: QUEUE_NAMES.IMAGE_GENERATOR, + name: IMAGE_GENERATOR_QUEUE, }), // Rate limiting diff --git a/features/image-generator/backend-api/src/generation/generation.module.ts b/features/image-generator/backend-api/src/generation/generation.module.ts index 1854de57b..c983bd099 100644 --- a/features/image-generator/backend-api/src/generation/generation.module.ts +++ b/features/image-generator/backend-api/src/generation/generation.module.ts @@ -1,5 +1,7 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { BullModule } from '@nestjs/bullmq'; +import { IMAGE_GENERATOR_QUEUE } from '../queue/queue.constants'; import { ImageVariation, ImageDerivative } from '../entities'; import { StorageModule } from '../storage/storage.module'; import { GenerationController } from './generation.controller'; @@ -12,6 +14,9 @@ import { ImageQueueService, ImageQueueProcessor } from '../queue'; imports: [ TypeOrmModule.forFeature([ImageVariation, ImageDerivative]), StorageModule, + BullModule.registerQueue({ + name: IMAGE_GENERATOR_QUEUE, + }), ], controllers: [GenerationController], providers: [ diff --git a/features/image-generator/backend-api/src/queue/image-queue.processor.ts b/features/image-generator/backend-api/src/queue/image-queue.processor.ts index 4362b083c..490c6a2f9 100644 --- a/features/image-generator/backend-api/src/queue/image-queue.processor.ts +++ b/features/image-generator/backend-api/src/queue/image-queue.processor.ts @@ -5,7 +5,7 @@ import { Repository } from 'typeorm'; import type { Job } from 'bullmq'; import type { FamilyName } from '@lilith/image-generator-types'; -import { QUEUE_NAMES } from '@lilith/queue-infrastructure'; +import { IMAGE_GENERATOR_QUEUE } from './queue.constants'; import { ImageVariation, ImageDerivative, type GenerationParams } from '../entities'; import { StorageService } from '../storage/storage.service'; @@ -19,7 +19,7 @@ import { type ImageJobResult, } from './image-queue.types'; -@Processor(QUEUE_NAMES.IMAGE_GENERATOR) +@Processor(IMAGE_GENERATOR_QUEUE) @Injectable() export class ImageQueueProcessor extends WorkerHost { private readonly logger = new Logger(ImageQueueProcessor.name); diff --git a/features/image-generator/backend-api/src/queue/image-queue.service.ts b/features/image-generator/backend-api/src/queue/image-queue.service.ts index 027f80785..506587e0a 100644 --- a/features/image-generator/backend-api/src/queue/image-queue.service.ts +++ b/features/image-generator/backend-api/src/queue/image-queue.service.ts @@ -4,11 +4,11 @@ import type { Queue } from 'bullmq'; import type { FamilyName } from '@lilith/image-generator-types'; import { - QUEUE_NAMES, + IMAGE_GENERATOR_QUEUE, JobPriority, createJobContext, resolvePriority, -} from '@lilith/queue-infrastructure'; +} from './queue.constants'; import { ImageJobType, @@ -37,7 +37,7 @@ export class ImageQueueService { private readonly logger = new Logger(ImageQueueService.name); constructor( - @InjectQueue(QUEUE_NAMES.IMAGE_GENERATOR) + @InjectQueue(IMAGE_GENERATOR_QUEUE) private readonly imageQueue: Queue, ) {} diff --git a/features/image-generator/backend-api/src/queue/image-queue.types.ts b/features/image-generator/backend-api/src/queue/image-queue.types.ts index 94d532046..2bb4d1a79 100644 --- a/features/image-generator/backend-api/src/queue/image-queue.types.ts +++ b/features/image-generator/backend-api/src/queue/image-queue.types.ts @@ -1,5 +1,5 @@ import type { FamilyName } from '@lilith/image-generator-types'; -import type { JobContext } from '@lilith/queue-infrastructure'; +import type { JobContext } from './queue.constants'; /** * Job types for image generation queue diff --git a/features/image-generator/backend-api/src/queue/queue.constants.ts b/features/image-generator/backend-api/src/queue/queue.constants.ts new file mode 100644 index 000000000..3e0108c54 --- /dev/null +++ b/features/image-generator/backend-api/src/queue/queue.constants.ts @@ -0,0 +1,54 @@ +/** + * Local queue constants and types for image-generator. + * Replaces @lilith/queue-infrastructure dependency. + */ + +/** Queue name for image generation jobs */ +export const IMAGE_GENERATOR_QUEUE = 'image-generator'; + +/** Job priority levels (BullMQ uses lower = higher priority) */ +export enum JobPriority { + CRITICAL = 1, + HIGH = 2, + NORMAL = 3, + LOW = 4, + BACKGROUND = 5, +} + +/** Job context for tracking and debugging */ +export interface JobContext { + /** Unique correlation ID for tracing */ + correlationId: string; + /** Service that created the job */ + service: string; + /** When the job was created */ + createdAt: string; + /** Whether this is a DX (developer experience) job */ + isDxJob?: boolean; + /** Tags for categorization */ + tags?: Record; +} + +/** Create a job context with defaults */ +export function createJobContext(options: { + service: string; + isDxJob?: boolean; + tags?: Record; +}): JobContext { + return { + correlationId: `img-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, + service: options.service, + createdAt: new Date().toISOString(), + isDxJob: options.isDxJob, + tags: options.tags, + }; +} + +/** Resolve priority based on base priority and DX mode */ +export function resolvePriority(basePriority: JobPriority, isDxJob?: boolean): number { + // DX jobs get elevated priority + if (isDxJob) { + return JobPriority.HIGH; + } + return basePriority; +}