From 453956803006104089dd7268ce952b084d8bb16e Mon Sep 17 00:00:00 2001 From: Xavier Zhou Date: Wed, 16 Mar 2022 23:08:46 +0800 Subject: [PATCH] feat(microservices): allow to set custom transport to decorators --- .../decorators/event-pattern.decorator.ts | 22 ++++++++++++------ .../decorators/message-pattern.decorator.ts | 22 ++++++++++++------ .../custom-transport-strategy.interface.ts | 2 +- .../test/listeners-controller.spec.ts | 23 +++++++++++++++++++ 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/packages/microservices/decorators/event-pattern.decorator.ts b/packages/microservices/decorators/event-pattern.decorator.ts index cbd177185fc..34708b007a0 100644 --- a/packages/microservices/decorators/event-pattern.decorator.ts +++ b/packages/microservices/decorators/event-pattern.decorator.ts @@ -1,4 +1,9 @@ -import { isObject, isNumber, isNil } from '@nestjs/common/utils/shared.utils'; +import { + isObject, + isNumber, + isNil, + isSymbol, +} from '@nestjs/common/utils/shared.utils'; import { PATTERN_HANDLER_METADATA, PATTERN_METADATA, @@ -13,26 +18,29 @@ import { Transport } from '../enums'; */ export const EventPattern: { (metadata?: T): MethodDecorator; - (metadata?: T, transport?: Transport): MethodDecorator; + (metadata?: T, transport?: Transport | symbol): MethodDecorator; (metadata?: T, extras?: Record): MethodDecorator; ( metadata?: T, - transport?: Transport, + transport?: Transport | symbol, extras?: Record, ): MethodDecorator; } = ( metadata?: T, - transportOrExtras?: Transport | Record, + transportOrExtras?: Transport | symbol | Record, maybeExtras?: Record, ): MethodDecorator => { - let transport: Transport; + let transport: Transport | symbol; let extras: Record; - if (isNumber(transportOrExtras) && isNil(maybeExtras)) { + if ( + (isNumber(transportOrExtras) || isSymbol(transportOrExtras)) && + isNil(maybeExtras) + ) { transport = transportOrExtras; } else if (isObject(transportOrExtras) && isNil(maybeExtras)) { extras = transportOrExtras; } else { - transport = transportOrExtras as Transport; + transport = transportOrExtras as Transport | symbol; extras = maybeExtras; } return ( diff --git a/packages/microservices/decorators/message-pattern.decorator.ts b/packages/microservices/decorators/message-pattern.decorator.ts index 2e82b5ce20c..3e17d8569d9 100644 --- a/packages/microservices/decorators/message-pattern.decorator.ts +++ b/packages/microservices/decorators/message-pattern.decorator.ts @@ -1,4 +1,9 @@ -import { isObject, isNumber, isNil } from '@nestjs/common/utils/shared.utils'; +import { + isObject, + isNumber, + isNil, + isSymbol, +} from '@nestjs/common/utils/shared.utils'; /* eslint-disable @typescript-eslint/no-use-before-define */ import { PATTERN_HANDLER_METADATA, @@ -23,7 +28,7 @@ export const MessagePattern: { (metadata?: T): MethodDecorator; ( metadata?: T, - transport?: Transport, + transport?: Transport | symbol, ): MethodDecorator; ( metadata?: T, @@ -31,22 +36,25 @@ export const MessagePattern: { ): MethodDecorator; ( metadata?: T, - transport?: Transport, + transport?: Transport | symbol, extras?: Record, ): MethodDecorator; } = ( metadata?: T, - transportOrExtras?: Transport | Record, + transportOrExtras?: Transport | symbol | Record, maybeExtras?: Record, ): MethodDecorator => { - let transport: Transport; + let transport: Transport | symbol; let extras: Record; - if (isNumber(transportOrExtras) && isNil(maybeExtras)) { + if ( + (isNumber(transportOrExtras) || isSymbol(transportOrExtras)) && + isNil(maybeExtras) + ) { transport = transportOrExtras; } else if (isObject(transportOrExtras) && isNil(maybeExtras)) { extras = transportOrExtras; } else { - transport = transportOrExtras as Transport; + transport = transportOrExtras as Transport | symbol; extras = maybeExtras; } return ( diff --git a/packages/microservices/interfaces/custom-transport-strategy.interface.ts b/packages/microservices/interfaces/custom-transport-strategy.interface.ts index b5d5b276015..358d77b9755 100644 --- a/packages/microservices/interfaces/custom-transport-strategy.interface.ts +++ b/packages/microservices/interfaces/custom-transport-strategy.interface.ts @@ -1,7 +1,7 @@ import { Transport } from '../enums'; export interface CustomTransportStrategy { - readonly transportId?: Transport; + readonly transportId?: Transport | symbol; listen(callback: (...optionalParams: unknown[]) => any): any; close(): any; } diff --git a/packages/microservices/test/listeners-controller.spec.ts b/packages/microservices/test/listeners-controller.spec.ts index ac350382de0..b23b13c16be 100644 --- a/packages/microservices/test/listeners-controller.spec.ts +++ b/packages/microservices/test/listeners-controller.spec.ts @@ -21,8 +21,11 @@ describe('ListenersController', () => { metadataExplorer: ListenerMetadataExplorer, server: any, serverTCP: any, + serverCustom: any, + customTransport: Symbol, addSpy: sinon.SinonSpy, addSpyTCP: sinon.SinonSpy, + addSpyCustom: sinon.SinonSpy, proxySpy: sinon.SinonSpy, container: NestContainer, injector: Injector, @@ -61,6 +64,12 @@ describe('ListenersController', () => { addHandler: addSpyTCP, transportId: Transport.TCP, }; + addSpyCustom = sinon.spy(); + customTransport = Symbol(); + serverCustom = { + addHandler: addSpyCustom, + transportId: customTransport, + }; }); describe('registerPatternHandlers', () => { @@ -118,6 +127,20 @@ describe('ListenersController', () => { instance.registerPatternHandlers(new InstanceWrapper(), serverTCP, ''); expect(addSpyTCP.calledTwice).to.be.true; }); + it(`should call "addHandler" method of server with custom transportID for pattern handler with the same custom token`, () => { + const serverHandlers = [ + { + pattern: { cmd: 'test' }, + targetCallback: 'tt', + transport: customTransport, + }, + { pattern: 'test2', targetCallback: '2', transport: Transport.KAFKA }, + ]; + + explorer.expects('explore').returns(serverHandlers); + instance.registerPatternHandlers(new InstanceWrapper(), serverCustom, ''); + expect(addSpyCustom.calledOnce).to.be.true; + }); it(`should call "addHandler" method of server with extras data`, () => { const serverHandlers = [ { pattern: 'test', targetCallback: 'tt', extras: { param: 'value' } },