import type IMiddleware from "./Middleware"; import type { Message, NextMiddleware } from "./Middleware"; /** * Abstract base class for message buses implementing the middleware pattern. * @typeParam TMessage - The type of message this bus processes (Command or Query) * @typeParam TResponse - The type of response returned by the middleware chain */ export default abstract class MessageBus { protected readonly middlewareChain: (message: TMessage) => Promise; protected constructor( ...middlewares: IMiddleware[] ) { this.middlewareChain = this.createChain(middlewares.filter(Boolean)); } private createChain(middlewares: IMiddleware[]): (message: TMessage) => Promise { const chain: Record> = {}; MessageBus.reverse(middlewares).filter(Boolean).forEach((middleware: IMiddleware, key: number) => { chain[key] = async (message: TMessage): Promise => middleware.execute(message, chain[key - 1]); }); return chain[middlewares.length - 1]; } private static reverse(middlewares: T[]): T[] { return middlewares.reverse(); } }