import { Message } from '@node-ts/bus-messages'; import { LoggerFactory } from '../logger'; import { ClassConstructor } from '../util'; import { Handler, HandlerDefinition, MessageBase } from './handler'; interface RegisteredHandlers { messageType: ClassConstructor; handlers: HandlerDefinition[]; } export interface HandlerRegistrations { [key: string]: RegisteredHandlers; } /** * Provide a way for externally managed messages to be handled * by the Bus */ export interface CustomResolver { /** * A resolver function that will be executed for each read message * to determine if it's to be handled by the handler declaring this resolver */ resolveWith: (message: MessageType) => boolean; /** * If provided, will attempt to subscribe the queue to this topic. * If not provided, assumes that the queue will be subscribed to the topic manually. */ topicIdentifier?: string; } export interface HandlerResolver { handler: HandlerDefinition; resolver(message: unknown): boolean; messageType: ClassConstructor | undefined; topicIdentifier: string | undefined; } export type MessageName = string; /** * An internal singleton that contains all registrations of messages to functions that handle * those messages. */ export interface HandlerRegistry { /** * Registers that a function handles a particular message type * @param messageType The class type of message to handle * @param handler The function handler to dispatch messages to as they arrive * @param customResolver An optional custom resolver that will be used instead * of the default @node-ts/bus-messages/Message behaviour in terms of matching * incoming messages to handlers. */ register(messageType: ClassConstructor, handler: HandlerDefinition): void; registerCustom(handler: HandlerDefinition, customResolver: CustomResolver): void; /** * Gets all registered message handlers for a given message name * @param message A message that has been received from the bus */ get(loggerFactory: LoggerFactory, message: object): HandlerDefinition[]; /** * Retrieves a list of all messages that have handler registrations */ getMessageNames(): string[]; /** * Returns the class constructor for a message that has a handler registration * @param messageName Message to get a class constructor for */ getMessageConstructor(messageName: string): ClassConstructor | undefined; /** * Retrieves an array of all topic arns that are managed externally but require subscribing to as there are * custom handlers that handle those messages. */ getExternallyManagedTopicIdentifiers(): string[]; /** * Gets all registered message handler resolvers */ getResolvers(): HandlerResolver[]; /** * Gets a list of all class based handlers that have been registered */ getClassHandlers(): Handler[]; /** * Removes all handlers from the registry */ reset(): void; } export {};