Skip to content

Commit 13e12ea

Browse files
feat: generics in registry + handle multiple messages on the same handler (#23)
* feat: Generics in registry + handle multiple messages on the same handler via routing keys * feat: Generics in registry + handle multiple messages on the same handler via routing keys * feat: Generics in registry + handle multiple messages on the same handler via routing keys
1 parent 3520c8c commit 13e12ea

File tree

8 files changed

+23
-14
lines changed

8 files changed

+23
-14
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ import { SendMessage } from './send-message';
8989
import { MessageResponse, MessageHandler, IMessageHandler } from '@nestjstools/messaging';
9090
import { Injectable } from '@nestjs/common';
9191

92-
92+
// You can define multiple routing messages on the same handler: @MessageHandler('your.message', 'your.message2')
9393
@Injectable()
9494
@MessageHandler('your.message')
9595
export class SendMessageHandler implements IMessageHandler<SendMessage> {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nestjstools/messaging",
3-
"version": "2.14.0",
3+
"version": "2.15.0",
44
"description": "Simplifies asynchronous and synchronous message handling with support for buses, handlers, channels, and consumers. Build scalable, decoupled applications with ease and reliability.",
55
"author": "Sebastian Iwanczyszyn",
66
"license": "MIT",

src/dependency-injection/decorator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export const MESSAGING_NORMALIZER_METADATA = 'MESSAGING_NORMALIZER_METADATA';
99
export const MESSAGING_EXCEPTION_LISTENER_METADATA = 'MESSAGING_EXCEPTION_LISTENER_METADATA';
1010
export const MESSAGING_MESSAGE_METADATA = 'MESSAGING_MESSAGE_METADATA';
1111

12-
export const MessageHandler = (routingKey: string): ClassDecorator => {
12+
export const MessageHandler = (...routingKey: string[]): ClassDecorator => {
1313
return (target: Function) => {
1414
Reflect.defineMetadata(MESSAGE_HANDLER_METADATA, routingKey, target);
1515
};

src/dependency-injection/register.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import {
88
} from './decorator';
99
import { DEFAULT_MIDDLEWARE, DEFAULT_NORMALIZER } from '../const';
1010
import { Registry } from '../shared/registry';
11+
import { MiddlewareRegistry } from '../middleware/middleware.registry';
12+
import { ExceptionListenerRegistry } from '../exception-listener/exception-listener.registry';
13+
import { NormalizerRegistry } from '../normalizer/normalizer.registry';
1114

1215
export const registerHandlers = (
1316
moduleRef: ModuleRef,
@@ -38,32 +41,32 @@ export const registerMiddlewares = (
3841
moduleRef: ModuleRef,
3942
discoveryService: DiscoveryService,
4043
) => {
41-
register(moduleRef, discoveryService, Service.MIDDLEWARE_REGISTRY, MESSAGING_MIDDLEWARE_METADATA, 'Middleware');
44+
register<MiddlewareRegistry>(moduleRef, discoveryService, Service.MIDDLEWARE_REGISTRY, MESSAGING_MIDDLEWARE_METADATA, 'Middleware');
4245
};
4346

4447
export const registerMessageNormalizers = (
4548
moduleRef: ModuleRef,
4649
discoveryService: DiscoveryService,
4750
) => {
48-
register(moduleRef, discoveryService, Service.MESSAGE_NORMALIZERS_REGISTRY, MESSAGING_NORMALIZER_METADATA, 'MessageNormalizer');
51+
register<NormalizerRegistry>(moduleRef, discoveryService, Service.MESSAGE_NORMALIZERS_REGISTRY, MESSAGING_NORMALIZER_METADATA, 'MessageNormalizer');
4952
};
5053

5154
export const registerExceptionListener = (
5255
moduleRef: ModuleRef,
5356
discoveryService: DiscoveryService,
5457
) => {
55-
register(moduleRef, discoveryService, Service.EXCEPTION_LISTENER_REGISTRY, MESSAGING_EXCEPTION_LISTENER_METADATA, 'ExceptionListener');
58+
register<ExceptionListenerRegistry>(moduleRef, discoveryService, Service.EXCEPTION_LISTENER_REGISTRY, MESSAGING_EXCEPTION_LISTENER_METADATA, 'ExceptionListener');
5659
};
5760

58-
const register = (
61+
const register = <T extends Registry<object>>(
5962
moduleRef: ModuleRef,
6063
discoveryService: DiscoveryService,
6164
registryProvider: string,
6265
decoratorMetadata: string,
6366
name: string,
6467
) => {
6568
const exceptions = [DEFAULT_NORMALIZER, DEFAULT_MIDDLEWARE];
66-
const registry: Registry<any> = moduleRef.get(
69+
const registry: Registry<T> = moduleRef.get(
6770
registryProvider,
6871
);
6972
const logger: MessagingLogger = moduleRef.get(Service.LOGGER);

src/handler/message-handler.registry.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ import { HandlerForMessageNotFoundException } from '../exception/handler-for-mes
44
export class MessageHandlerRegistry {
55
private registry: Map<string, IMessageHandler<any>[]> = new Map();
66

7-
register(name: string, handler: IMessageHandler<any>): void {
7+
register(names: string[], handler: IMessageHandler<any>): void {
8+
names.forEach((name) => {
9+
this.registerSingle(name, handler);
10+
});
11+
}
12+
13+
private registerSingle(name: string, handler: IMessageHandler<any>): void {
814
if (this.registry.has(name)) {
915
const bucket = this.registry.get(name) as Array<IMessageHandler<any>>;
1016

test/unit/bus/in-memory-message.bus.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ describe('InMemoryMessageBus', () => {
7171
handle: jest.fn(),
7272
} as unknown as IMessageHandler<any>
7373

74-
handlerRegistry.register('my_routing.key', handler)
74+
handlerRegistry.register(['my_routing.key'], handler)
7575

7676
const subjectUnderTest = new InMemoryMessageBus(
7777
handlerRegistry,

test/unit/handler/message-handler.registry.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ describe('MessageHandlerRegistry', () => {
1212
});
1313

1414
test('should register a handler for a given name', () => {
15-
registry.register('testEvent', mockHandler);
15+
registry.register(['testEvent'], mockHandler);
1616
expect(registry.getByRoutingKey('testEvent')).toContain(mockHandler);
1717
});
1818

1919
test('should not register the same handler twice for the same name', () => {
20-
registry.register('testEvent', mockHandler);
21-
registry.register('testEvent', mockHandler);
20+
registry.register(['testEvent'], mockHandler);
21+
registry.register(['testEvent'], mockHandler);
2222
expect(registry.getByRoutingKey('testEvent').length).toBe(1);
2323
});
2424

test/unit/middleware/handler-middleware.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ describe('HandlerMiddleware', () => {
1010
beforeEach(() => {
1111
logger = SpyLogger.create();
1212
registry = new MessageHandlerRegistry();
13-
registry.register('abc', { handle: jest.fn(() => null) } as IMessageHandler<any>);
13+
registry.register(['abc'], { handle: jest.fn(() => null) } as IMessageHandler<any>);
1414
});
1515

1616
test('should found a handler', () => {

0 commit comments

Comments
 (0)