Skip to content

Commit e3a47cb

Browse files
authored
Customer resolvers for message handler mappings (#49)
* remove name based mappings * handler tests * rebuild int tests * overload handler registration * transport fixes * test updates * mem test fixes * duplicate handler tests * more test updates * increase int test timeouts * sqs test updates * sqs tests * int test changes * hidden console.log * rabbit-mq tests * test blocks
1 parent 6b11f29 commit e3a47cb

25 files changed

+422
-200
lines changed

packages/bus-core/src/application-bootstrap/application-bootstrap.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Logger } from '@node-ts/logger-core'
66
import { Container } from 'inversify'
77
import { TestCommandHandler, TestCommand } from '../test'
88
import { Transport } from '../transport'
9+
import { Message } from '@node-ts/bus-messages'
910

1011
describe('ApplicationBootstrap', () => {
1112
let sut: ApplicationBootstrap
@@ -57,7 +58,7 @@ describe('ApplicationBootstrap', () => {
5758
it('should add the handler to the registry', () => {
5859
handlerRegistry.verify(
5960
h => h.register(
60-
TestCommand.NAME,
61+
It.isAny(),
6162
It.isAny(),
6263
TestCommandHandler,
6364
TestCommand

packages/bus-core/src/application-bootstrap/application-bootstrap.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Message } from '@node-ts/bus-messages'
22
import { LOGGER_SYMBOLS, Logger } from '@node-ts/logger-core'
33
import { Container, inject, injectable } from 'inversify'
44
import { BUS_SYMBOLS } from '../bus-symbols'
5-
import { Handler, HandlerPrototype } from '../handler/handler'
5+
import { Handler, HandlerPrototype, MessageType } from '../handler/handler'
66
import { HandlerRegistry } from '../handler'
77
import { Bus } from '../service-bus'
88
import { ClassConstructor } from '../util'
@@ -51,28 +51,21 @@ export class ApplicationBootstrap {
5151
this.logger.info('Bus application disposed')
5252
}
5353

54-
registerHandler (handler: ClassConstructor<Handler<Message>>): void {
54+
registerHandler (handler: ClassConstructor<Handler<MessageType>>): void {
5555
if (this.isInitialized) {
5656
throw new Error('Cannot call registerHandler() after initialize() has been called')
5757
}
5858

59-
const prototype = handler.prototype as HandlerPrototype
59+
const prototype = handler.prototype as HandlerPrototype<MessageType>
6060
if (!prototype.$symbol) {
6161
throw new Error(
6262
`Missing symbol on ${prototype.constructor}.`
6363
+ 'This could mean the handler class is missing the @Handles() decorator.'
6464
)
6565
}
6666

67-
if (!prototype.$messageName) {
68-
throw new Error(
69-
`Missing message type on ${prototype.constructor}.`
70-
+ 'This could mean the handler class is missing the @Handles() decorator.'
71-
)
72-
}
73-
7467
this.handlerRegistry.register(
75-
prototype.$messageName,
68+
prototype.$resolver,
7669
prototype.$symbol,
7770
handler,
7871
prototype.$message

packages/bus-core/src/handler/handler-registry.spec.ts

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import { HandlerRegistry } from './handler-registry'
22
import { Mock, IMock, Times, It } from 'typemoq'
33
import { Logger } from '@node-ts/logger-core'
4-
import { TestEvent, TestEventHandler, TestCommandHandler } from '../test'
4+
import { TestEvent, TestEventHandler, TestCommandHandler, TestCommand } from '../test'
55
import { Container, interfaces } from 'inversify'
6+
import { Message } from '@node-ts/bus-messages'
67

78
describe('HandlerRegistry', () => {
89
let sut: HandlerRegistry
910

1011
let logger: IMock<Logger>
1112

12-
const messageName = TestEvent.name
13+
const messageName = TestEvent.NAME
1314
const symbol = Symbol()
1415
const handler = TestEventHandler
1516
const messageType = TestEvent
@@ -21,16 +22,21 @@ describe('HandlerRegistry', () => {
2122
)
2223
})
2324

24-
describe('when registring a handler', () => {
25+
describe('when registering a handler for a bus message', () => {
2526
beforeEach(() => {
26-
sut.register(messageName, symbol, handler, messageType)
27+
sut.register((m: Message) => m.$name === messageName, symbol, handler, messageType)
2728
})
2829

2930
it('should register the handler', () => {
30-
const handlers = sut.get(messageName)
31+
const handlers = sut.get(new TestEvent())
3132
expect(handlers).toHaveLength(1)
3233
})
3334

35+
it('should add it to the subscribed bus messages list', () => {
36+
const subscription = sut.subscribedBusMessages.find(s => new s().$name === messageType.NAME)
37+
expect(subscription).toBeDefined()
38+
})
39+
3440
describe('when binding handlers to the container', () => {
3541
let container: IMock<Container>
3642
let bindingTo: IMock<interfaces.BindingToSyntax<{}>>
@@ -66,10 +72,21 @@ describe('HandlerRegistry', () => {
6672
})
6773
})
6874

69-
describe('when registrying a handler twice', () => {
75+
describe('when registering a handler for an external message', () => {
7076
beforeEach(() => {
71-
sut.register(messageName, symbol, handler, messageType)
72-
sut.register(messageName, symbol, handler, messageType)
77+
sut.register((m: Message) => m.$name === messageName, symbol, handler)
78+
})
79+
80+
it('should not include the message in the subscribed bus messages list', () => {
81+
const messageSubscription = sut.subscribedBusMessages.find(m => new m().$name === messageName)
82+
expect(messageSubscription).toBeUndefined()
83+
})
84+
})
85+
86+
describe('when registering a handler twice', () => {
87+
beforeEach(() => {
88+
sut.register((m: Message) => m.$name === messageName, symbol, handler, messageType)
89+
sut.register((m: Message) => m.$name === messageName, symbol, handler, messageType)
7390
})
7491

7592
it('should warn that the handler is already registered', () => {
@@ -80,32 +97,25 @@ describe('HandlerRegistry', () => {
8097
})
8198

8299
it('should register a single instance of the handler', () => {
83-
const handlers = sut.get(messageName)
100+
const handlers = sut.get(new TestEvent())
84101
expect(handlers).toHaveLength(1)
85102
})
86103
})
87104

88-
describe('when adding two handlers of the same name', () => {
89-
it('should throw an error', () => {
90-
sut.register(messageName, symbol, handler, messageType)
91-
expect(() => sut.register('random', symbol, handler, messageType)).toThrowError()
92-
})
93-
})
94-
95105
describe('when getting a handler', () => {
96-
it('should return an empty array for an unregisterd handler', () => {
97-
expect(sut.get('')).toHaveLength(0)
106+
it('should return an empty array for an unregistered handler', () => {
107+
expect(sut.get(new TestCommand())).toHaveLength(0)
98108
})
99109

100110
it('should return a single handler for a single registration', () => {
101-
sut.register(messageName, symbol, handler, messageType)
102-
expect(sut.get(messageName)).toHaveLength(1)
111+
sut.register((m: Message) => m.$name === messageName, symbol, handler, messageType)
112+
expect(sut.get(new TestEvent())).toHaveLength(1)
103113
})
104114

105115
it('should return a multiple handlers for multiple registrations', () => {
106-
sut.register(messageName, symbol, handler, messageType)
107-
sut.register(messageName, Symbol(), TestCommandHandler, messageType)
108-
expect(sut.get(messageName)).toHaveLength(2)
116+
sut.register((m: Message) => m.$name === messageName, symbol, handler, messageType)
117+
sut.register((m: Message) => m.$name === messageName, Symbol(), TestCommandHandler, messageType)
118+
expect(sut.get(new TestEvent())).toHaveLength(2)
109119
})
110120
})
111121

0 commit comments

Comments
 (0)