import { isObject, isNumber, isNil, isSymbol, } from '@nestjs/common/utils/shared.utils'; import { PATTERN_HANDLER_METADATA, PATTERN_METADATA, TRANSPORT_METADATA, PATTERN_EXTRAS_METADATA, } from '../constants'; import { PatternHandler } from '../enums/pattern-handler.enum'; import { Transport } from '../enums'; /** * Subscribes to incoming events which fulfils chosen pattern. */ export const EventPattern: { (metadata?: T): MethodDecorator; (metadata?: T, transport?: Transport | symbol): MethodDecorator; (metadata?: T, extras?: Record): MethodDecorator; ( metadata?: T, transport?: Transport | symbol, extras?: Record, ): MethodDecorator; } = ( metadata?: T, transportOrExtras?: Transport | symbol | Record, maybeExtras?: Record, ): MethodDecorator => { let transport: Transport | symbol; let extras: Record; if ( (isNumber(transportOrExtras) || isSymbol(transportOrExtras)) && isNil(maybeExtras) ) { transport = transportOrExtras; } else if (isObject(transportOrExtras) && isNil(maybeExtras)) { extras = transportOrExtras; } else { transport = transportOrExtras as Transport | symbol; extras = maybeExtras; } return ( target: object, key: string | symbol, descriptor: PropertyDescriptor, ) => { Reflect.defineMetadata( PATTERN_METADATA, [].concat(metadata), descriptor.value, ); Reflect.defineMetadata( PATTERN_HANDLER_METADATA, PatternHandler.EVENT, descriptor.value, ); Reflect.defineMetadata(TRANSPORT_METADATA, transport, descriptor.value); Reflect.defineMetadata(PATTERN_EXTRAS_METADATA, extras, descriptor.value); return descriptor; }; };