Events
An event is a message emitted by the system when "something" happens. Again this could be a technical task being completed such as a DatabaseBackedUp, LoadBalancerScaledOut or as a result of changes in your business CreditCardCharged, UserRegistered, PackageShipped.
Creating an Event
Events are class definitions that extend from Event
, eg:
import { Event } from '@node-ts/bus-messages'
export class CreditCardCharged extends Event {
/**
* A unique name that identifies the message. This should be done in namespace style syntax,
* ie: organisation/domain/event-name
*/
$name = 'my-app/accounts/credit-card-charged'
/**
* The contract version of this message. This can be incremented if this message changes the
* number of properties etc to maintain backwards compatibility
*/
$version = 1
/**
* A credit card was successfully charged
* @param creditCardToken Identifies the card that was charged
* @param amount The amount, in USD, that the card was charged for
*/
constructor (
readonly creditCardToken: string,
readonly amount: number
) {
}
}
Publishing an Event
Events can have 0-to-many different subscribers, who are generally interested in performing a next action as a result of the event being raised.
Use .publish()
to publish an event:
const creditCardCharged = new CreditCardCharged('abc', 123)
// Publish a message. All subscribers will receive a copy
await bus.publish(creditCardCharged)
// Publish a message along with a set of attributes
await bus.publish(
creditCardCharged,
{ correlationId: 'tok-1adsfas-df1' }
)
Handling an Event
Events get processed by a Handler. This is a function or a class function that receives the message as a parameter and performs an operation. When the handler returns the message is deleted from the queue.
Implementing a function based handler
import { handlerFor } from '@node-ts/bus-core'
// Function based handler
const creditCardChargedHandler = handlerFor(
CreditCardCharged,
async (event: CreditCardCharged) => {
// ...
}
)
Implementing a class based handler
import { Handler } from '@node-ts/bus-core'
// Class based handler
class CreditCardChargedHandler implements Handler<CreditCardCharged> {
messageType = CreditCardCharged
async handle (event: CreditCardCharged) {
// ...
}
}
Register the handler with the bus configuration
const bus = await Bus.configure()
.withHandler(chargeCreditCardHandler) // Function based handler
.withHandler(ChargeCreditCardHandler) // Class function based handler
.initialize()
Remember to .start()
the bus to start handling messages
await bus.start()
Last updated
Was this helpful?