@logistically/events-nestjs
Version:
NestJS integration for @logistically/events v3 - Event-driven architecture with Redis Streams
86 lines (85 loc) • 2.87 kB
TypeScript
import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { EventSystemService } from './event-system.service';
export declare class EventDiscoveryService implements OnModuleInit, OnModuleDestroy {
private readonly eventSystemService;
private readonly reflector;
private readonly logger;
private readonly metadataScanner;
private consumer;
private autoRegisteredServices;
private discoveryQueue;
private isInitialized;
private discoveryTimer;
private isProcessing;
private retryAttempts;
private readonly maxRetries;
private readonly baseRetryDelay;
constructor(eventSystemService: EventSystemService, reflector: Reflector);
onModuleInit(): Promise<void>;
onModuleDestroy(): Promise<void>;
private cleanup;
/**
* Start discovery loop only when there are pending services
* Uses event-driven approach instead of continuous polling
*/
private startDiscoveryLoop;
/**
* Stop discovery loop when no services are pending
*/
private stopDiscoveryLoop;
/**
* Process the discovery queue with optimized batching and error handling
*/
private processDiscoveryQueue;
/**
* Handle failed services with exponential backoff retry logic
*/
private handleFailedServices;
/**
* Utility method to chunk array into batches
*/
private chunkArray;
/**
* Add a service to be auto-registered when the event system is ready
* This is the main entry point for automatic discovery
*/
addServiceForAutoRegistration(instance: any): void;
/**
* Manually trigger registration of all pending services
* This can be called by the EventModuleScanner
*/
triggerRegistration(): Promise<void>;
/**
* Get discovery statistics
*/
getDiscoveryStats(): {
pending: number;
registered: number;
queueLength: number;
retryCount: number;
};
private getConsumer;
private initializeConsumer;
/**
* Register a single event handler with explicit metadata
* This method is used by the EventModuleScanner for automatic discovery
*/
registerHandler(instance: any, methodKey: string, metadata: {
eventType: string;
priority?: number;
async?: boolean;
retry?: any;
[key: string]: any;
}): Promise<void>;
/**
* Manually register event handlers from a service instance
* This method can be called by services that want to register their handlers
*/
registerEventHandlers(instance: any): Promise<number>;
/**
* Auto-register a service if it has @AutoEvents decorator
* This method is called automatically by the service lifecycle
*/
autoRegisterService(instance: any): Promise<number>;
}