{"version":3,"sources":["../src/constants.ts","../src/discovery/subscriber-discovery.service.ts","../src/services/matador.service.ts","../src/module/matador.module.ts","../src/testing/matador-testing.module.ts"],"names":["MATADOR_EVENT_HANDLERS","MATADOR_OPTIONS","SubscriberDiscoveryService","schema","discovered","discoveryService","onModuleInit","discoverSubscribers","providers","getProviders","wrapper","instance","handlers","Reflect","getMetadata","length","handler","registerHandler","metadata","eventClass","options","methodName","className","name","subscriberName","isResumable","idempotent","boundMethod","bind","subscriber","createSubscriber","description","importance","targetQueue","enabled","callback","envelope","context","addToSchema","eventKey","key","existing","existingEventClass","existingSubscribers","getSchema","getMergedSchema","mergedSchema","additionalEvents","subscribers","MatadorService","logger","Logger","matador","isShuttingDown","isStarted","initializeMatador","shouldAutoStart","startOn","doStart","onApplicationBootstrap","onModuleDestroy","shutdownOn","doShutdown","beforeApplicationShutdown","onApplicationShutdown","send","eventOrClass","dataOrOptions","Error","isEventClass","getMatador","start","isConnected","isShutdownInProgress","waitForIdle","timeoutMs","stopReceiving","log","result","registry","SchemaRegistry","entry","Object","values","isSchemaEntryTuple","register","validation","validate","valid","errors","issues","filter","i","severity","map","message","join","Matador","transport","topology","consumeFrom","undefined","codec","retryPolicy","checkpointStore","shutdownConfig","hooks","autoStart","shutdown","MatadorModule","forRoot","module","imports","DiscoveryModule","provide","useValue","exports","forRootAsync","asyncProviders","createAsyncProviders","useFactory","inject","useClass","factory","createMatadorOptions","useExisting","MatadorTestingModule","forTest","overrides","defaultOptions","LocalTransport","TopologyBuilder","create","withNamespace","addQueue","build"],"mappings":"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","file":"testing.cjs","sourcesContent":["/**\n * Metadata key for storing event handler metadata on methods.\n */\nexport const MATADOR_EVENT_HANDLER = Symbol('MATADOR_EVENT_HANDLER');\n\n/**\n * Metadata key for storing a list of all event handlers on a class.\n */\nexport const MATADOR_EVENT_HANDLERS = Symbol('MATADOR_EVENT_HANDLERS');\n\n/**\n * Injection token for module options.\n */\nexport const MATADOR_OPTIONS = Symbol('MATADOR_OPTIONS');\n","import { Inject, Injectable, type OnModuleInit } from '@nestjs/common';\nimport { DiscoveryService } from '@nestjs/core';\nimport {\n  type AnySubscriber,\n  type Envelope,\n  type EventClass,\n  type MatadorSchema,\n  type SubscriberContext,\n  createSubscriber,\n} from '@zdavison/matador';\nimport { MATADOR_EVENT_HANDLERS } from '../constants.js';\nimport type {\n  MatadorEventHandlerMetadata,\n  MatadorModuleOptions,\n} from '../types.js';\n\n/**\n * Schema entry tuple type for building the schema.\n */\ntype SchemaEntryTuple = [EventClass<unknown>, readonly AnySubscriber[]];\n\n/**\n * Mutable schema type for building during discovery.\n */\ntype MutableSchema = Record<string, SchemaEntryTuple>;\n\n/**\n * Service that discovers all @OnMatadorEvent decorated methods in the application\n * and builds a Matador schema from them.\n */\n@Injectable()\nexport class SubscriberDiscoveryService implements OnModuleInit {\n  private schema: MutableSchema = {};\n  private discovered = false;\n\n  constructor(\n    @Inject(DiscoveryService)\n    private readonly discoveryService: DiscoveryService,\n  ) {}\n\n  onModuleInit(): void {\n    this.discoverSubscribers();\n  }\n\n  /**\n   * Discovers all @OnMatadorEvent decorated methods and builds the schema.\n   */\n  private discoverSubscribers(): void {\n    if (this.discovered) {\n      return;\n    }\n\n    const providers = this.discoveryService.getProviders();\n\n    for (const wrapper of providers) {\n      const { instance } = wrapper;\n      if (!instance || typeof instance !== 'object') {\n        continue;\n      }\n\n      const handlers: MatadorEventHandlerMetadata[] | undefined =\n        Reflect.getMetadata(MATADOR_EVENT_HANDLERS, instance.constructor);\n\n      if (!handlers || handlers.length === 0) {\n        continue;\n      }\n\n      for (const handler of handlers) {\n        this.registerHandler(instance, handler);\n      }\n    }\n\n    this.discovered = true;\n  }\n\n  /**\n   * Registers a single handler method as a subscriber.\n   */\n  private registerHandler(\n    instance: object,\n    metadata: MatadorEventHandlerMetadata,\n  ): void {\n    const { eventClass, options, methodName } = metadata;\n    const className = instance.constructor.name;\n\n    // Auto-generate name if not provided: ClassName.methodName\n    const subscriberName = options.name ?? `${className}.${methodName}`;\n\n    // Determine if this is a resumable subscriber\n    const isResumable = options.idempotent === 'resumable';\n\n    // Create the callback that calls the instance method\n    // biome-ignore lint/suspicious/noExplicitAny: Instance methods may have various signatures\n    const boundMethod = (instance as Record<string, any>)[methodName].bind(\n      instance,\n    );\n\n    // Create a subscriber that calls the instance method\n    const subscriber: AnySubscriber = isResumable\n      ? createSubscriber({\n          name: subscriberName,\n          description: options.description,\n          idempotent: 'resumable',\n          importance: options.importance,\n          targetQueue: options.targetQueue,\n          enabled: options.enabled,\n          callback: async (\n            envelope: Envelope<unknown>,\n            context: SubscriberContext,\n          ) => {\n            await boundMethod(envelope, context);\n          },\n        })\n      : createSubscriber({\n          name: subscriberName,\n          description: options.description,\n          idempotent: options.idempotent,\n          importance: options.importance,\n          targetQueue: options.targetQueue,\n          enabled: options.enabled,\n          callback: async (envelope: Envelope<unknown>) => {\n            await boundMethod(envelope);\n          },\n        });\n\n    // Add to schema\n    this.addToSchema(eventClass, subscriber);\n  }\n\n  /**\n   * Adds a subscriber to the schema for an event.\n   */\n  private addToSchema(\n    eventClass: EventClass<unknown>,\n    subscriber: AnySubscriber,\n  ): void {\n    const eventKey = eventClass.key;\n    const existing = this.schema[eventKey];\n\n    if (existing) {\n      // Add subscriber to existing event entry\n      const [existingEventClass, existingSubscribers] = existing;\n      this.schema[eventKey] = [\n        existingEventClass,\n        [...existingSubscribers, subscriber],\n      ];\n    } else {\n      // Create new entry\n      this.schema[eventKey] = [eventClass, [subscriber]];\n    }\n  }\n\n  /**\n   * Gets the discovered schema.\n   * Must be called after onModuleInit has run.\n   */\n  getSchema(): MatadorSchema {\n    return this.schema;\n  }\n\n  /**\n   * Gets the schema merged with additional events from options.\n   */\n  getMergedSchema(options: MatadorModuleOptions): MatadorSchema {\n    const mergedSchema: MutableSchema = { ...this.schema };\n\n    if (options.additionalEvents) {\n      for (const [eventClass, subscribers] of options.additionalEvents) {\n        const existing = mergedSchema[eventClass.key];\n        if (existing) {\n          const [existingEventClass, existingSubscribers] = existing;\n          mergedSchema[eventClass.key] = [\n            existingEventClass,\n            [...existingSubscribers, ...subscribers],\n          ];\n        } else {\n          mergedSchema[eventClass.key] = [eventClass, subscribers];\n        }\n      }\n    }\n\n    return mergedSchema;\n  }\n}\n","import {\n  type BeforeApplicationShutdown,\n  Inject,\n  Injectable,\n  Logger,\n  type OnApplicationBootstrap,\n  type OnApplicationShutdown,\n  type OnModuleDestroy,\n  type OnModuleInit,\n} from '@nestjs/common';\nimport {\n  type Event,\n  type EventClass,\n  type EventOptions,\n  Matador,\n  SchemaRegistry,\n  type SendResult,\n  isSchemaEntryTuple,\n} from '@zdavison/matador';\nimport { MATADOR_OPTIONS } from '../constants.js';\n// biome-ignore lint/style/useImportType: must be a runtime value import — Nest reads it from emitDecoratorMetadata to inject this constructor dependency; `import type` erases it and breaks DI.\nimport { SubscriberDiscoveryService } from '../discovery/subscriber-discovery.service.js';\nimport type { MatadorModuleOptions } from '../types.js';\n\n/**\n * Injectable service that wraps Matador and integrates with NestJS lifecycle.\n *\n * This service handles:\n * - Building the Matador instance with discovered subscribers\n * - Starting Matador at the configured lifecycle hook\n * - Graceful shutdown with drain timeout\n * - Preventing event sending during shutdown\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class OrderService {\n *   constructor(private readonly matador: MatadorService) {}\n *\n *   async createOrder(data: CreateOrderDto) {\n *     // ... create order logic ...\n *     await this.matador.send(OrderCreatedEvent, { orderId: order.id });\n *   }\n * }\n * ```\n */\n@Injectable()\nexport class MatadorService\n  implements\n    OnModuleInit,\n    OnApplicationBootstrap,\n    OnModuleDestroy,\n    BeforeApplicationShutdown,\n    OnApplicationShutdown\n{\n  private readonly logger = new Logger(MatadorService.name);\n  private matador!: Matador;\n  private isShuttingDown = false;\n  private isStarted = false;\n\n  constructor(\n    @Inject(MATADOR_OPTIONS) private readonly options: MatadorModuleOptions,\n    private readonly discoveryService: SubscriberDiscoveryService,\n  ) {}\n\n  /**\n   * Called when MatadorModule is initialized.\n   * Builds Matador instance and starts if startOn === 'onModuleInit'.\n   */\n  async onModuleInit(): Promise<void> {\n    this.initializeMatador();\n\n    if (this.shouldAutoStart() && this.options.startOn === 'onModuleInit') {\n      await this.doStart();\n    }\n  }\n\n  /**\n   * Called after all modules are initialized and the app is ready to start.\n   * Starts Matador if startOn === 'onApplicationBootstrap' (default).\n   */\n  async onApplicationBootstrap(): Promise<void> {\n    const startOn = this.options.startOn ?? 'onApplicationBootstrap';\n    if (this.shouldAutoStart() && startOn === 'onApplicationBootstrap') {\n      await this.doStart();\n    }\n  }\n\n  /**\n   * Called when MatadorModule is destroyed.\n   * Shuts down Matador if shutdownOn === 'onModuleDestroy'.\n   */\n  async onModuleDestroy(): Promise<void> {\n    if (this.options.shutdownOn === 'onModuleDestroy') {\n      await this.doShutdown();\n    }\n  }\n\n  /**\n   * Called when the application receives a shutdown signal (SIGTERM, etc).\n   * Shuts down Matador if shutdownOn === 'beforeApplicationShutdown' (default).\n   */\n  async beforeApplicationShutdown(): Promise<void> {\n    const shutdownOn = this.options.shutdownOn ?? 'beforeApplicationShutdown';\n    if (shutdownOn === 'beforeApplicationShutdown') {\n      await this.doShutdown();\n    }\n  }\n\n  /**\n   * Called after beforeApplicationShutdown completes.\n   * Shuts down Matador if shutdownOn === 'onApplicationShutdown'.\n   */\n  async onApplicationShutdown(): Promise<void> {\n    if (this.options.shutdownOn === 'onApplicationShutdown') {\n      await this.doShutdown();\n    }\n  }\n\n  /**\n   * Sends an event to all registered subscribers.\n   *\n   * @throws Error if called during shutdown\n   *\n   * @example\n   * ```typescript\n   * // Pass the event class and data directly\n   * await matadorService.send(UserCreatedEvent, { userId: '123' });\n   *\n   * // Or pass an event instance\n   * const event = new UserCreatedEvent({ userId: '123' });\n   * await matadorService.send(event);\n   * ```\n   */\n  async send<T>(\n    eventClass: EventClass<T>,\n    data: T,\n    options?: EventOptions,\n  ): Promise<SendResult>;\n  async send<T>(event: Event<T>, options?: EventOptions): Promise<SendResult>;\n  async send<T>(\n    eventOrClass: EventClass<T> | Event<T>,\n    dataOrOptions?: T | EventOptions,\n    options?: EventOptions,\n  ): Promise<SendResult> {\n    if (this.isShuttingDown) {\n      throw new Error('Cannot send events during shutdown');\n    }\n\n    // Determine if first arg is an event instance or event class\n    const isEventClass =\n      typeof eventOrClass === 'function' && 'key' in eventOrClass;\n\n    if (isEventClass) {\n      return this.matador.send(\n        eventOrClass as EventClass<T>,\n        dataOrOptions as T,\n        options,\n      );\n    }\n    return this.matador.send(\n      eventOrClass as Event<T>,\n      dataOrOptions as EventOptions | undefined,\n    );\n  }\n\n  /**\n   * Gets the underlying Matador instance for advanced operations.\n   */\n  getMatador(): Matador {\n    return this.matador;\n  }\n\n  /**\n   * Starts consuming (if autoStart was false).\n   */\n  async start(): Promise<void> {\n    return this.doStart();\n  }\n\n  /**\n   * Checks if connected to transport.\n   */\n  isConnected(): boolean {\n    return this.matador?.isConnected() ?? false;\n  }\n\n  /**\n   * Checks if shutdown is in progress.\n   */\n  isShutdownInProgress(): boolean {\n    return this.isShuttingDown;\n  }\n\n  /**\n   * Waits for all pending messages to be processed.\n   */\n  async waitForIdle(timeoutMs?: number): Promise<boolean> {\n    return this.matador.waitForIdle(timeoutMs);\n  }\n\n  /**\n   * Stops receiving new messages without performing full shutdown.\n   * After calling this, no new messages will be delivered from the transport.\n   * The transport remains connected for later shutdown.\n   *\n   * Use this when you need to coordinate shutdown across multiple systems:\n   * 1. Call stopReceiving() to stop new message delivery\n   * 2. Wait for both Matador and your other systems to idle\n   * 3. Let NestJS lifecycle handle disconnect via app.close()\n   *\n   * @returns true if receiving was stopped, false if not started or already stopped\n   *\n   * @example\n   * ```typescript\n   * // In your graceful shutdown handler:\n   * await matadorService.stopReceiving();\n   * await Promise.all([\n   *   matadorService.waitForIdle(30000),\n   *   myOtherService.waitForPendingWork()\n   * ]);\n   * await app.close(); // NestJS lifecycle will disconnect transport\n   * ```\n   */\n  async stopReceiving(): Promise<boolean> {\n    if (!this.isStarted) {\n      return false;\n    }\n\n    this.logger.log('[Matador] ⏳ Stopping message receiving');\n    const result = await this.matador.stopReceiving();\n    if (result) {\n      this.logger.log('[Matador] 🟢 Message receiving stopped');\n    }\n    return result;\n  }\n\n  /**\n   * Initializes the Matador instance with discovered schema.\n   */\n  private initializeMatador(): void {\n    const mergedSchema = this.discoveryService.getMergedSchema(this.options);\n\n    // Validate schema at startup\n    const registry = new SchemaRegistry();\n    for (const entry of Object.values(mergedSchema)) {\n      if (isSchemaEntryTuple(entry)) {\n        const [eventClass, subscribers] = entry;\n        registry.register(eventClass, subscribers);\n      } else {\n        registry.register(entry.eventClass, entry.subscribers);\n      }\n    }\n\n    const validation = registry.validate();\n    if (!validation.valid) {\n      const errors = validation.issues.filter((i) => i.severity === 'error');\n      if (errors.length > 0) {\n        throw new Error(\n          `Invalid Matador schema: ${errors.map((i) => i.message).join(', ')}`,\n        );\n      }\n    }\n\n    this.matador = new Matador(\n      {\n        transport: this.options.transport,\n        topology: this.options.topology,\n        schema: mergedSchema,\n        consumeFrom: this.options.consumeFrom\n          ? [...this.options.consumeFrom]\n          : undefined,\n        codec: this.options.codec,\n        retryPolicy: this.options.retryPolicy,\n        checkpointStore: this.options.checkpointStore,\n        shutdownConfig: this.options.shutdownConfig,\n      },\n      this.options.hooks,\n    );\n\n    this.logger.log('[Matador] 🟢 matador-nest initialized.');\n  }\n\n  private shouldAutoStart(): boolean {\n    return this.options.autoStart !== false;\n  }\n\n  private async doStart(): Promise<void> {\n    if (this.isStarted) {\n      return;\n    }\n\n    await this.matador.start();\n    this.isStarted = true;\n    this.logger.log('[Matador] 🟢 Started');\n  }\n\n  private async doShutdown(): Promise<void> {\n    if (!this.isStarted || this.isShuttingDown) {\n      return;\n    }\n\n    this.isShuttingDown = true;\n    this.logger.log(\n      '[Matador] ⏳ Graceful shutdown initiated, draining in-flight messages',\n    );\n\n    await this.matador.shutdown();\n    this.logger.log('[Matador] 🟢 Shutdown complete');\n  }\n}\n","import {\n  type DynamicModule,\n  Global,\n  type InjectionToken,\n  Module,\n  type Provider,\n} from '@nestjs/common';\nimport { DiscoveryModule } from '@nestjs/core';\nimport { MATADOR_OPTIONS } from '../constants.js';\nimport { SubscriberDiscoveryService } from '../discovery/subscriber-discovery.service.js';\nimport { MatadorService } from '../services/matador.service.js';\nimport type {\n  MatadorModuleAsyncOptions,\n  MatadorModuleOptions,\n  MatadorOptionsFactory,\n} from '../types.js';\n\n/**\n * NestJS module for integrating Matador event processing.\n *\n * Use `MatadorModule.forRoot()` for synchronous configuration or\n * `MatadorModule.forRootAsync()` for async configuration with dependency injection.\n *\n * @example Synchronous configuration\n * ```typescript\n * @Module({\n *   imports: [\n *     MatadorModule.forRoot({\n *       transport: new RabbitMQTransport({\n *         url: 'amqp://localhost',\n *         connectionName: 'myapp',\n *       }),\n *       topology: TopologyBuilder.create()\n *         .withNamespace('myapp')\n *         .addQueue('events', { concurrency: 10 })\n *         .build(),\n *       consumeFrom: ['events'],\n *     }),\n *   ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example Async configuration with ConfigService\n * ```typescript\n * @Module({\n *   imports: [\n *     ConfigModule.forRoot(),\n *     MatadorModule.forRootAsync({\n *       imports: [ConfigModule],\n *       inject: [ConfigService],\n *       useFactory: (config: ConfigService) => ({\n *         transport: new RabbitMQTransport({\n *           url: config.get('RABBITMQ_URL'),\n *           connectionName: config.get('APP_NAME'),\n *         }),\n *         topology: TopologyBuilder.create()\n *           .withNamespace(config.get('APP_NAME'))\n *           .addQueue('events')\n *           .build(),\n *         consumeFrom: ['events'],\n *       }),\n *     }),\n *   ],\n * })\n * export class AppModule {}\n * ```\n */\n@Global()\n@Module({})\n// biome-ignore lint/complexity/noStaticOnlyClass: NestJS modules require class-based pattern with static factory methods\nexport class MatadorModule {\n  /**\n   * Configures the MatadorModule with static options.\n   *\n   * @param options - Module configuration options\n   * @returns Dynamic module configuration\n   */\n  static forRoot(options: MatadorModuleOptions): DynamicModule {\n    return {\n      module: MatadorModule,\n      imports: [DiscoveryModule],\n      providers: [\n        {\n          provide: MATADOR_OPTIONS,\n          useValue: options,\n        },\n        SubscriberDiscoveryService,\n        MatadorService,\n      ],\n      exports: [MatadorService],\n    };\n  }\n\n  /**\n   * Configures the MatadorModule with async options.\n   * Use this when you need to inject dependencies like ConfigService.\n   *\n   * @param options - Async module configuration options\n   * @returns Dynamic module configuration\n   */\n  static forRootAsync(options: MatadorModuleAsyncOptions): DynamicModule {\n    const asyncProviders = MatadorModule.createAsyncProviders(options);\n\n    return {\n      module: MatadorModule,\n      imports: [DiscoveryModule, ...(options.imports ?? [])],\n      providers: [\n        ...asyncProviders,\n        SubscriberDiscoveryService,\n        MatadorService,\n      ],\n      exports: [MatadorService],\n    };\n  }\n\n  /**\n   * Creates async providers for the module options.\n   */\n  private static createAsyncProviders(\n    options: MatadorModuleAsyncOptions,\n  ): Provider[] {\n    if (options.useFactory) {\n      return [\n        {\n          provide: MATADOR_OPTIONS,\n          useFactory: options.useFactory,\n          inject: (options.inject ?? []) as InjectionToken[],\n        },\n      ];\n    }\n\n    if (options.useClass) {\n      return [\n        {\n          provide: options.useClass,\n          useClass: options.useClass,\n        },\n        {\n          provide: MATADOR_OPTIONS,\n          useFactory: async (\n            factory: MatadorOptionsFactory,\n          ): Promise<MatadorModuleOptions> => factory.createMatadorOptions(),\n          inject: [options.useClass],\n        },\n      ];\n    }\n\n    if (options.useExisting) {\n      return [\n        {\n          provide: MATADOR_OPTIONS,\n          useFactory: async (\n            factory: MatadorOptionsFactory,\n          ): Promise<MatadorModuleOptions> => factory.createMatadorOptions(),\n          inject: [options.useExisting],\n        },\n      ];\n    }\n\n    throw new Error(\n      'MatadorModule.forRootAsync() requires useFactory, useClass, or useExisting',\n    );\n  }\n}\n","import { type DynamicModule, Module } from '@nestjs/common';\nimport { LocalTransport, TopologyBuilder } from '@zdavison/matador';\nimport { MatadorModule } from '../module/matador.module.js';\nimport type { MatadorModuleOptions } from '../types.js';\n\n/**\n * Testing module for Matador with sensible defaults for unit/integration tests.\n *\n * Uses LocalTransport by default, which processes messages synchronously\n * in-memory without requiring external infrastructure.\n *\n * @example Basic usage\n * ```typescript\n * describe('NotificationService', () => {\n *   let module: TestingModule;\n *   let matadorService: MatadorService;\n *\n *   beforeEach(async () => {\n *     module = await Test.createTestingModule({\n *       imports: [MatadorTestingModule.forTest()],\n *       providers: [NotificationService],\n *     }).compile();\n *\n *     matadorService = module.get(MatadorService);\n *     await module.init();\n *   });\n *\n *   it('processes events', async () => {\n *     await matadorService.send(UserCreatedEvent, { userId: '123' });\n *     await matadorService.waitForIdle();\n *     // Assert expected behavior\n *   });\n * });\n * ```\n *\n * @example With custom overrides\n * ```typescript\n * MatadorTestingModule.forTest({\n *   topology: TopologyBuilder.create()\n *     .withNamespace('custom-test')\n *     .addQueue('my-queue')\n *     .build(),\n *   consumeFrom: ['my-queue'],\n * })\n * ```\n */\n@Module({})\n// biome-ignore lint/complexity/noStaticOnlyClass: NestJS modules require class-based pattern with static factory methods\nexport class MatadorTestingModule {\n  /**\n   * Creates a testing module with LocalTransport and default configuration.\n   *\n   * @param overrides - Optional overrides for the default configuration\n   * @returns Dynamic module configuration\n   */\n  static forTest(overrides?: Partial<MatadorModuleOptions>): DynamicModule {\n    const defaultOptions: MatadorModuleOptions = {\n      transport: new LocalTransport(),\n      topology: TopologyBuilder.create()\n        .withNamespace('test')\n        .addQueue('events')\n        .build(),\n      consumeFrom: ['events'],\n      autoStart: true,\n    };\n\n    return MatadorModule.forRoot({\n      ...defaultOptions,\n      ...overrides,\n    });\n  }\n}\n"]}