@zdavison/matador-nest 2.0.12 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/discovery/subscriber-discovery.service.d.ts +1 -1
- package/dist/discovery/subscriber-discovery.service.d.ts.map +1 -1
- package/dist/discovery/subscriber-discovery.service.js +7 -2
- package/dist/index.cjs +12 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/module/matador.module.d.ts.map +1 -1
- package/dist/module/matador.module.js +2 -1
- package/dist/services/matador.service.d.ts.map +1 -1
- package/dist/testing/matador-testing.module.d.ts.map +1 -1
- package/dist/testing/matador-testing.module.js +1 -0
- package/dist/testing.cjs +12 -5
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.js.map +1 -1
- package/package.json +6 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type OnModuleInit } from '@nestjs/common';
|
|
2
|
-
import
|
|
2
|
+
import { DiscoveryService } from '@nestjs/core';
|
|
3
3
|
import { type MatadorSchema } from '@zdavison/matador';
|
|
4
4
|
import type { MatadorModuleOptions } from '../types.js';
|
|
5
5
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriber-discovery.service.d.ts","sourceRoot":"","sources":["../../src/discovery/subscriber-discovery.service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"subscriber-discovery.service.d.ts","sourceRoot":"","sources":["../../src/discovery/subscriber-discovery.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAIL,KAAK,aAAa,EAGnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAEV,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAYrB;;;GAGG;AACH,qBACa,0BAA2B,YAAW,YAAY;IAM3D,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IALnC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAS;gBAIR,gBAAgB,EAAE,gBAAgB;IAGrD,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAmDvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;;OAGG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;CAoB9D"}
|
|
@@ -7,7 +7,11 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
|
-
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
14
|
+
import { DiscoveryService } from '@nestjs/core';
|
|
11
15
|
import { createSubscriber, } from '@zdavison/matador';
|
|
12
16
|
import { MATADOR_EVENT_HANDLERS } from '../constants.js';
|
|
13
17
|
/**
|
|
@@ -138,6 +142,7 @@ let SubscriberDiscoveryService = class SubscriberDiscoveryService {
|
|
|
138
142
|
};
|
|
139
143
|
SubscriberDiscoveryService = __decorate([
|
|
140
144
|
Injectable(),
|
|
141
|
-
|
|
145
|
+
__param(0, Inject(DiscoveryService)),
|
|
146
|
+
__metadata("design:paramtypes", [DiscoveryService])
|
|
142
147
|
], SubscriberDiscoveryService);
|
|
143
148
|
export { SubscriberDiscoveryService };
|
package/dist/index.cjs
CHANGED
|
@@ -49,6 +49,12 @@ function _ts_metadata(k, v) {
|
|
|
49
49
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
50
50
|
}
|
|
51
51
|
__name(_ts_metadata, "_ts_metadata");
|
|
52
|
+
function _ts_param(paramIndex, decorator) {
|
|
53
|
+
return function(target, key) {
|
|
54
|
+
decorator(target, key, paramIndex);
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
__name(_ts_param, "_ts_param");
|
|
52
58
|
exports.SubscriberDiscoveryService = class SubscriberDiscoveryService2 {
|
|
53
59
|
static {
|
|
54
60
|
__name(this, "SubscriberDiscoveryService");
|
|
@@ -180,9 +186,10 @@ exports.SubscriberDiscoveryService = class SubscriberDiscoveryService2 {
|
|
|
180
186
|
};
|
|
181
187
|
exports.SubscriberDiscoveryService = _ts_decorate([
|
|
182
188
|
common.Injectable(),
|
|
189
|
+
_ts_param(0, common.Inject(core.DiscoveryService)),
|
|
183
190
|
_ts_metadata("design:type", Function),
|
|
184
191
|
_ts_metadata("design:paramtypes", [
|
|
185
|
-
typeof DiscoveryService === "undefined" ? Object : DiscoveryService
|
|
192
|
+
typeof core.DiscoveryService === "undefined" ? Object : core.DiscoveryService
|
|
186
193
|
])
|
|
187
194
|
], exports.SubscriberDiscoveryService);
|
|
188
195
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
@@ -196,12 +203,12 @@ function _ts_metadata2(k, v) {
|
|
|
196
203
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
197
204
|
}
|
|
198
205
|
__name(_ts_metadata2, "_ts_metadata");
|
|
199
|
-
function
|
|
206
|
+
function _ts_param2(paramIndex, decorator) {
|
|
200
207
|
return function(target, key) {
|
|
201
208
|
decorator(target, key, paramIndex);
|
|
202
209
|
};
|
|
203
210
|
}
|
|
204
|
-
__name(
|
|
211
|
+
__name(_ts_param2, "_ts_param");
|
|
205
212
|
exports.MatadorService = class _MatadorService {
|
|
206
213
|
static {
|
|
207
214
|
__name(this, "MatadorService");
|
|
@@ -396,7 +403,7 @@ exports.MatadorService = class _MatadorService {
|
|
|
396
403
|
};
|
|
397
404
|
exports.MatadorService = _ts_decorate2([
|
|
398
405
|
common.Injectable(),
|
|
399
|
-
|
|
406
|
+
_ts_param2(0, common.Inject(MATADOR_OPTIONS)),
|
|
400
407
|
_ts_metadata2("design:type", Function),
|
|
401
408
|
_ts_metadata2("design:paramtypes", [
|
|
402
409
|
typeof MatadorModuleOptions === "undefined" ? Object : MatadorModuleOptions,
|
|
@@ -450,7 +457,7 @@ exports.MatadorModule = class _MatadorModule {
|
|
|
450
457
|
* @returns Dynamic module configuration
|
|
451
458
|
*/
|
|
452
459
|
static forRootAsync(options) {
|
|
453
|
-
const asyncProviders =
|
|
460
|
+
const asyncProviders = _MatadorModule.createAsyncProviders(options);
|
|
454
461
|
return {
|
|
455
462
|
module: _MatadorModule,
|
|
456
463
|
imports: [
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/decorators/on-matador-event.decorator.ts","../src/decorators/matador-subscriber.decorator.ts","../src/discovery/subscriber-discovery.service.ts","../src/services/matador.service.ts","../src/module/matador.module.ts"],"names":["MATADOR_EVENT_HANDLER","MATADOR_EVENT_HANDLERS","MATADOR_OPTIONS","OnMatadorEvent","eventClass","options","target","propertyKey","descriptor","metadata","methodName","String","value","Reflect","defineMetadata","existingHandlers","getMetadata","MatadorSubscriber","Injectable","SubscriberDiscoveryService","schema","discovered","discoveryService","onModuleInit","discoverSubscribers","providers","getProviders","wrapper","instance","handlers","length","handler","registerHandler","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","DiscoveryService","exports","forRootAsync","asyncProviders","createAsyncProviders","useFactory","inject","useClass","factory","createMatadorOptions","useExisting"],"mappings":"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","file":"index.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 type { EventClass } from '@zdavison/matador';\nimport { MATADOR_EVENT_HANDLER, MATADOR_EVENT_HANDLERS } from '../constants.js';\nimport type {\n MatadorEventHandlerMetadata,\n OnMatadorEventOptions,\n} from '../types.js';\n\n/**\n * Method decorator that marks a method as a Matador event subscriber.\n *\n * @param eventClass - The event class to subscribe to\n * @param options - Subscriber options (description is required)\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class NotificationService {\n * @OnMatadorEvent(UserCreatedEvent, {\n * description: 'Sends welcome email to new users',\n * idempotent: 'yes',\n * })\n * async onUserCreated(envelope: Envelope<UserCreatedEvent['data']>) {\n * await this.emailService.sendWelcome(envelope.data.email);\n * }\n * }\n * ```\n */\nexport function OnMatadorEvent<T>(\n eventClass: EventClass<T>,\n options: OnMatadorEventOptions,\n): (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n) => PropertyDescriptor {\n return (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor => {\n const metadata: MatadorEventHandlerMetadata = {\n eventClass: eventClass as EventClass<unknown>,\n options,\n methodName: String(propertyKey),\n };\n\n // Store metadata on the method itself\n if (descriptor.value != null) {\n Reflect.defineMetadata(\n MATADOR_EVENT_HANDLER,\n metadata,\n descriptor.value as object,\n );\n }\n\n // Maintain a list of all handlers on the class for discovery\n const existingHandlers: MatadorEventHandlerMetadata[] =\n Reflect.getMetadata(MATADOR_EVENT_HANDLERS, target.constructor) ?? [];\n\n Reflect.defineMetadata(\n MATADOR_EVENT_HANDLERS,\n [...existingHandlers, metadata],\n target.constructor,\n );\n\n return descriptor;\n };\n}\n","import { Injectable, type Type } from '@nestjs/common';\n\n/**\n * Optional class decorator that marks a class as a Matador subscriber.\n * Classes with @OnMatadorEvent methods are auto-discovered, so this decorator\n * is optional. Use it for explicit documentation or when you want to ensure\n * a class is treated as a subscriber even if it has no decorated methods yet.\n *\n * @example\n * ```typescript\n * @MatadorSubscriber()\n * @Injectable()\n * export class NotificationService {\n * @OnMatadorEvent(UserCreatedEvent, { description: '...' })\n * async onUserCreated(envelope: Envelope<...>) {\n * // ...\n * }\n * }\n * ```\n */\nexport function MatadorSubscriber(): ClassDecorator {\n return (target: object): void => {\n // Ensure the class is injectable (apply @Injectable if not already)\n // This is a no-op if @Injectable was already applied\n Injectable()(target as Type<unknown>);\n };\n}\n","import { Injectable, type OnModuleInit } from '@nestjs/common';\nimport type { 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(private readonly discoveryService: DiscoveryService) {}\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';\nimport type { 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('[Matador] ⏳ Graceful shutdown initiated, draining in-flight messages');\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, DiscoveryService } 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({})\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 DiscoveryService,\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 = this.createAsyncProviders(options);\n\n return {\n module: MatadorModule,\n imports: [DiscoveryModule, ...(options.imports ?? [])],\n providers: [\n ...asyncProviders,\n DiscoveryService,\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/decorators/on-matador-event.decorator.ts","../src/decorators/matador-subscriber.decorator.ts","../src/discovery/subscriber-discovery.service.ts","../src/services/matador.service.ts","../src/module/matador.module.ts"],"names":["MATADOR_EVENT_HANDLER","MATADOR_EVENT_HANDLERS","MATADOR_OPTIONS","OnMatadorEvent","eventClass","options","target","propertyKey","descriptor","metadata","methodName","String","value","Reflect","defineMetadata","existingHandlers","getMetadata","MatadorSubscriber","Injectable","SubscriberDiscoveryService","schema","discovered","discoveryService","onModuleInit","discoverSubscribers","providers","getProviders","wrapper","instance","handlers","length","handler","registerHandler","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","DiscoveryService","exports","forRootAsync","asyncProviders","createAsyncProviders","useFactory","inject","useClass","factory","createMatadorOptions","useExisting"],"mappings":"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","file":"index.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 type { EventClass } from '@zdavison/matador';\nimport { MATADOR_EVENT_HANDLER, MATADOR_EVENT_HANDLERS } from '../constants.js';\nimport type {\n MatadorEventHandlerMetadata,\n OnMatadorEventOptions,\n} from '../types.js';\n\n/**\n * Method decorator that marks a method as a Matador event subscriber.\n *\n * @param eventClass - The event class to subscribe to\n * @param options - Subscriber options (description is required)\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class NotificationService {\n * @OnMatadorEvent(UserCreatedEvent, {\n * description: 'Sends welcome email to new users',\n * idempotent: 'yes',\n * })\n * async onUserCreated(envelope: Envelope<UserCreatedEvent['data']>) {\n * await this.emailService.sendWelcome(envelope.data.email);\n * }\n * }\n * ```\n */\nexport function OnMatadorEvent<T>(\n eventClass: EventClass<T>,\n options: OnMatadorEventOptions,\n): (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n) => PropertyDescriptor {\n return (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor => {\n const metadata: MatadorEventHandlerMetadata = {\n eventClass: eventClass as EventClass<unknown>,\n options,\n methodName: String(propertyKey),\n };\n\n // Store metadata on the method itself\n if (descriptor.value != null) {\n Reflect.defineMetadata(\n MATADOR_EVENT_HANDLER,\n metadata,\n descriptor.value as object,\n );\n }\n\n // Maintain a list of all handlers on the class for discovery\n const existingHandlers: MatadorEventHandlerMetadata[] =\n Reflect.getMetadata(MATADOR_EVENT_HANDLERS, target.constructor) ?? [];\n\n Reflect.defineMetadata(\n MATADOR_EVENT_HANDLERS,\n [...existingHandlers, metadata],\n target.constructor,\n );\n\n return descriptor;\n };\n}\n","import { Injectable, type Type } from '@nestjs/common';\n\n/**\n * Optional class decorator that marks a class as a Matador subscriber.\n * Classes with @OnMatadorEvent methods are auto-discovered, so this decorator\n * is optional. Use it for explicit documentation or when you want to ensure\n * a class is treated as a subscriber even if it has no decorated methods yet.\n *\n * @example\n * ```typescript\n * @MatadorSubscriber()\n * @Injectable()\n * export class NotificationService {\n * @OnMatadorEvent(UserCreatedEvent, { description: '...' })\n * async onUserCreated(envelope: Envelope<...>) {\n * // ...\n * }\n * }\n * ```\n */\nexport function MatadorSubscriber(): ClassDecorator {\n return (target: object): void => {\n // Ensure the class is injectable (apply @Injectable if not already)\n // This is a no-op if @Injectable was already applied\n Injectable()(target as Type<unknown>);\n };\n}\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';\nimport type { 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, DiscoveryService } 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 DiscoveryService,\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 DiscoveryService,\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"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/decorators/on-matador-event.decorator.ts","../src/decorators/matador-subscriber.decorator.ts","../src/discovery/subscriber-discovery.service.ts","../src/services/matador.service.ts","../src/module/matador.module.ts"],"names":["MATADOR_EVENT_HANDLER","MATADOR_EVENT_HANDLERS","MATADOR_OPTIONS","OnMatadorEvent","eventClass","options","target","propertyKey","descriptor","metadata","methodName","String","value","Reflect","defineMetadata","existingHandlers","getMetadata","MatadorSubscriber","Injectable","SubscriberDiscoveryService","schema","discovered","discoveryService","onModuleInit","discoverSubscribers","providers","getProviders","wrapper","instance","handlers","length","handler","registerHandler","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","DiscoveryService","exports","forRootAsync","asyncProviders","createAsyncProviders","useFactory","inject","useClass","factory","createMatadorOptions","useExisting"],"mappings":"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","file":"index.js","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 type { EventClass } from '@zdavison/matador';\nimport { MATADOR_EVENT_HANDLER, MATADOR_EVENT_HANDLERS } from '../constants.js';\nimport type {\n MatadorEventHandlerMetadata,\n OnMatadorEventOptions,\n} from '../types.js';\n\n/**\n * Method decorator that marks a method as a Matador event subscriber.\n *\n * @param eventClass - The event class to subscribe to\n * @param options - Subscriber options (description is required)\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class NotificationService {\n * @OnMatadorEvent(UserCreatedEvent, {\n * description: 'Sends welcome email to new users',\n * idempotent: 'yes',\n * })\n * async onUserCreated(envelope: Envelope<UserCreatedEvent['data']>) {\n * await this.emailService.sendWelcome(envelope.data.email);\n * }\n * }\n * ```\n */\nexport function OnMatadorEvent<T>(\n eventClass: EventClass<T>,\n options: OnMatadorEventOptions,\n): (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n) => PropertyDescriptor {\n return (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor => {\n const metadata: MatadorEventHandlerMetadata = {\n eventClass: eventClass as EventClass<unknown>,\n options,\n methodName: String(propertyKey),\n };\n\n // Store metadata on the method itself\n if (descriptor.value != null) {\n Reflect.defineMetadata(\n MATADOR_EVENT_HANDLER,\n metadata,\n descriptor.value as object,\n );\n }\n\n // Maintain a list of all handlers on the class for discovery\n const existingHandlers: MatadorEventHandlerMetadata[] =\n Reflect.getMetadata(MATADOR_EVENT_HANDLERS, target.constructor) ?? [];\n\n Reflect.defineMetadata(\n MATADOR_EVENT_HANDLERS,\n [...existingHandlers, metadata],\n target.constructor,\n );\n\n return descriptor;\n };\n}\n","import { Injectable, type Type } from '@nestjs/common';\n\n/**\n * Optional class decorator that marks a class as a Matador subscriber.\n * Classes with @OnMatadorEvent methods are auto-discovered, so this decorator\n * is optional. Use it for explicit documentation or when you want to ensure\n * a class is treated as a subscriber even if it has no decorated methods yet.\n *\n * @example\n * ```typescript\n * @MatadorSubscriber()\n * @Injectable()\n * export class NotificationService {\n * @OnMatadorEvent(UserCreatedEvent, { description: '...' })\n * async onUserCreated(envelope: Envelope<...>) {\n * // ...\n * }\n * }\n * ```\n */\nexport function MatadorSubscriber(): ClassDecorator {\n return (target: object): void => {\n // Ensure the class is injectable (apply @Injectable if not already)\n // This is a no-op if @Injectable was already applied\n Injectable()(target as Type<unknown>);\n };\n}\n","import { Injectable, type OnModuleInit } from '@nestjs/common';\nimport type { 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(private readonly discoveryService: DiscoveryService) {}\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';\nimport type { 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('[Matador] ⏳ Graceful shutdown initiated, draining in-flight messages');\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, DiscoveryService } 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({})\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 DiscoveryService,\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 = this.createAsyncProviders(options);\n\n return {\n module: MatadorModule,\n imports: [DiscoveryModule, ...(options.imports ?? [])],\n providers: [\n ...asyncProviders,\n DiscoveryService,\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/decorators/on-matador-event.decorator.ts","../src/decorators/matador-subscriber.decorator.ts","../src/discovery/subscriber-discovery.service.ts","../src/services/matador.service.ts","../src/module/matador.module.ts"],"names":["MATADOR_EVENT_HANDLER","MATADOR_EVENT_HANDLERS","MATADOR_OPTIONS","OnMatadorEvent","eventClass","options","target","propertyKey","descriptor","metadata","methodName","String","value","Reflect","defineMetadata","existingHandlers","getMetadata","MatadorSubscriber","Injectable","SubscriberDiscoveryService","schema","discovered","discoveryService","onModuleInit","discoverSubscribers","providers","getProviders","wrapper","instance","handlers","length","handler","registerHandler","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","DiscoveryService","exports","forRootAsync","asyncProviders","createAsyncProviders","useFactory","inject","useClass","factory","createMatadorOptions","useExisting"],"mappings":"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","file":"index.js","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 type { EventClass } from '@zdavison/matador';\nimport { MATADOR_EVENT_HANDLER, MATADOR_EVENT_HANDLERS } from '../constants.js';\nimport type {\n MatadorEventHandlerMetadata,\n OnMatadorEventOptions,\n} from '../types.js';\n\n/**\n * Method decorator that marks a method as a Matador event subscriber.\n *\n * @param eventClass - The event class to subscribe to\n * @param options - Subscriber options (description is required)\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class NotificationService {\n * @OnMatadorEvent(UserCreatedEvent, {\n * description: 'Sends welcome email to new users',\n * idempotent: 'yes',\n * })\n * async onUserCreated(envelope: Envelope<UserCreatedEvent['data']>) {\n * await this.emailService.sendWelcome(envelope.data.email);\n * }\n * }\n * ```\n */\nexport function OnMatadorEvent<T>(\n eventClass: EventClass<T>,\n options: OnMatadorEventOptions,\n): (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n) => PropertyDescriptor {\n return (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor => {\n const metadata: MatadorEventHandlerMetadata = {\n eventClass: eventClass as EventClass<unknown>,\n options,\n methodName: String(propertyKey),\n };\n\n // Store metadata on the method itself\n if (descriptor.value != null) {\n Reflect.defineMetadata(\n MATADOR_EVENT_HANDLER,\n metadata,\n descriptor.value as object,\n );\n }\n\n // Maintain a list of all handlers on the class for discovery\n const existingHandlers: MatadorEventHandlerMetadata[] =\n Reflect.getMetadata(MATADOR_EVENT_HANDLERS, target.constructor) ?? [];\n\n Reflect.defineMetadata(\n MATADOR_EVENT_HANDLERS,\n [...existingHandlers, metadata],\n target.constructor,\n );\n\n return descriptor;\n };\n}\n","import { Injectable, type Type } from '@nestjs/common';\n\n/**\n * Optional class decorator that marks a class as a Matador subscriber.\n * Classes with @OnMatadorEvent methods are auto-discovered, so this decorator\n * is optional. Use it for explicit documentation or when you want to ensure\n * a class is treated as a subscriber even if it has no decorated methods yet.\n *\n * @example\n * ```typescript\n * @MatadorSubscriber()\n * @Injectable()\n * export class NotificationService {\n * @OnMatadorEvent(UserCreatedEvent, { description: '...' })\n * async onUserCreated(envelope: Envelope<...>) {\n * // ...\n * }\n * }\n * ```\n */\nexport function MatadorSubscriber(): ClassDecorator {\n return (target: object): void => {\n // Ensure the class is injectable (apply @Injectable if not already)\n // This is a no-op if @Injectable was already applied\n Injectable()(target as Type<unknown>);\n };\n}\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';\nimport type { 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, DiscoveryService } 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 DiscoveryService,\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 DiscoveryService,\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matador.module.d.ts","sourceRoot":"","sources":["../../src/module/matador.module.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,
|
|
1
|
+
{"version":3,"file":"matador.module.d.ts","sourceRoot":"","sources":["../../src/module/matador.module.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAGa,aAAa;IACxB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;IAiB5D;;;;;;OAMG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,aAAa;IAgBtE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;CA6CpC"}
|
|
@@ -92,7 +92,7 @@ let MatadorModule = MatadorModule_1 = class MatadorModule {
|
|
|
92
92
|
* @returns Dynamic module configuration
|
|
93
93
|
*/
|
|
94
94
|
static forRootAsync(options) {
|
|
95
|
-
const asyncProviders =
|
|
95
|
+
const asyncProviders = MatadorModule_1.createAsyncProviders(options);
|
|
96
96
|
return {
|
|
97
97
|
module: MatadorModule_1,
|
|
98
98
|
imports: [DiscoveryModule, ...(options.imports ?? [])],
|
|
@@ -146,5 +146,6 @@ let MatadorModule = MatadorModule_1 = class MatadorModule {
|
|
|
146
146
|
MatadorModule = MatadorModule_1 = __decorate([
|
|
147
147
|
Global(),
|
|
148
148
|
Module({})
|
|
149
|
+
// biome-ignore lint/complexity/noStaticOnlyClass: NestJS modules require class-based pattern with static factory methods
|
|
149
150
|
], MatadorModule);
|
|
150
151
|
export { MatadorModule };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matador.service.d.ts","sourceRoot":"","sources":["../../src/services/matador.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,yBAAyB,EAI9B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,OAAO,EAEP,KAAK,UAAU,EAEhB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC/F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBACa,cACX,YACE,YAAY,EACZ,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,qBAAqB;IAQI,OAAO,CAAC,QAAQ,CAAC,OAAO;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAPnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAGkB,OAAO,EAAE,oBAAoB,EACtD,gBAAgB,EAAE,0BAA0B;IAG/D;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC;;;OAGG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7C;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC;;;OAGG;IACG,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhD;;;OAGG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5C;;;;;;;;;;;;;;OAcG;IACG,IAAI,CAAC,CAAC,EACV,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA2B3E;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACG,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAavC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2CzB,OAAO,CAAC,eAAe;YAIT,OAAO;YAUP,UAAU;
|
|
1
|
+
{"version":3,"file":"matador.service.d.ts","sourceRoot":"","sources":["../../src/services/matador.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,yBAAyB,EAI9B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,OAAO,EAEP,KAAK,UAAU,EAEhB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC/F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBACa,cACX,YACE,YAAY,EACZ,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,qBAAqB;IAQI,OAAO,CAAC,QAAQ,CAAC,OAAO;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAPnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAGkB,OAAO,EAAE,oBAAoB,EACtD,gBAAgB,EAAE,0BAA0B;IAG/D;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC;;;OAGG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7C;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC;;;OAGG;IACG,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhD;;;OAGG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5C;;;;;;;;;;;;;;OAcG;IACG,IAAI,CAAC,CAAC,EACV,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC;IAChB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA2B3E;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACG,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAavC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2CzB,OAAO,CAAC,eAAe;YAIT,OAAO;YAUP,UAAU;CAazB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matador-testing.module.d.ts","sourceRoot":"","sources":["../../src/testing/matador-testing.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAG5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,
|
|
1
|
+
{"version":3,"file":"matador-testing.module.d.ts","sourceRoot":"","sources":["../../src/testing/matador-testing.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAG5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,qBAEa,oBAAoB;IAC/B;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,aAAa;CAgBzE"}
|
|
@@ -73,5 +73,6 @@ let MatadorTestingModule = class MatadorTestingModule {
|
|
|
73
73
|
};
|
|
74
74
|
MatadorTestingModule = __decorate([
|
|
75
75
|
Module({})
|
|
76
|
+
// biome-ignore lint/complexity/noStaticOnlyClass: NestJS modules require class-based pattern with static factory methods
|
|
76
77
|
], MatadorTestingModule);
|
|
77
78
|
export { MatadorTestingModule };
|
package/dist/testing.cjs
CHANGED
|
@@ -21,6 +21,12 @@ function _ts_metadata(k, v) {
|
|
|
21
21
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
22
|
}
|
|
23
23
|
__name(_ts_metadata, "_ts_metadata");
|
|
24
|
+
function _ts_param(paramIndex, decorator) {
|
|
25
|
+
return function(target, key) {
|
|
26
|
+
decorator(target, key, paramIndex);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
__name(_ts_param, "_ts_param");
|
|
24
30
|
var SubscriberDiscoveryService2 = class {
|
|
25
31
|
static {
|
|
26
32
|
__name(this, "SubscriberDiscoveryService");
|
|
@@ -152,9 +158,10 @@ var SubscriberDiscoveryService2 = class {
|
|
|
152
158
|
};
|
|
153
159
|
SubscriberDiscoveryService2 = _ts_decorate([
|
|
154
160
|
common.Injectable(),
|
|
161
|
+
_ts_param(0, common.Inject(core.DiscoveryService)),
|
|
155
162
|
_ts_metadata("design:type", Function),
|
|
156
163
|
_ts_metadata("design:paramtypes", [
|
|
157
|
-
typeof DiscoveryService === "undefined" ? Object : DiscoveryService
|
|
164
|
+
typeof core.DiscoveryService === "undefined" ? Object : core.DiscoveryService
|
|
158
165
|
])
|
|
159
166
|
], SubscriberDiscoveryService2);
|
|
160
167
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
@@ -168,12 +175,12 @@ function _ts_metadata2(k, v) {
|
|
|
168
175
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
169
176
|
}
|
|
170
177
|
__name(_ts_metadata2, "_ts_metadata");
|
|
171
|
-
function
|
|
178
|
+
function _ts_param2(paramIndex, decorator) {
|
|
172
179
|
return function(target, key) {
|
|
173
180
|
decorator(target, key, paramIndex);
|
|
174
181
|
};
|
|
175
182
|
}
|
|
176
|
-
__name(
|
|
183
|
+
__name(_ts_param2, "_ts_param");
|
|
177
184
|
var MatadorService = class _MatadorService {
|
|
178
185
|
static {
|
|
179
186
|
__name(this, "MatadorService");
|
|
@@ -368,7 +375,7 @@ var MatadorService = class _MatadorService {
|
|
|
368
375
|
};
|
|
369
376
|
MatadorService = _ts_decorate2([
|
|
370
377
|
common.Injectable(),
|
|
371
|
-
|
|
378
|
+
_ts_param2(0, common.Inject(MATADOR_OPTIONS)),
|
|
372
379
|
_ts_metadata2("design:type", Function),
|
|
373
380
|
_ts_metadata2("design:paramtypes", [
|
|
374
381
|
typeof MatadorModuleOptions === "undefined" ? Object : MatadorModuleOptions,
|
|
@@ -422,7 +429,7 @@ var MatadorModule = class _MatadorModule {
|
|
|
422
429
|
* @returns Dynamic module configuration
|
|
423
430
|
*/
|
|
424
431
|
static forRootAsync(options) {
|
|
425
|
-
const asyncProviders =
|
|
432
|
+
const asyncProviders = _MatadorModule.createAsyncProviders(options);
|
|
426
433
|
return {
|
|
427
434
|
module: _MatadorModule,
|
|
428
435
|
imports: [
|
package/dist/testing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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","DiscoveryService","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 { Injectable, type OnModuleInit } from '@nestjs/common';\nimport type { 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(private readonly discoveryService: DiscoveryService) {}\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';\nimport type { 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('[Matador] ⏳ Graceful shutdown initiated, draining in-flight messages');\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, DiscoveryService } 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({})\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 DiscoveryService,\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 = this.createAsyncProviders(options);\n\n return {\n module: MatadorModule,\n imports: [DiscoveryModule, ...(options.imports ?? [])],\n providers: [\n ...asyncProviders,\n DiscoveryService,\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({})\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"]}
|
|
1
|
+
{"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","DiscoveryService","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';\nimport type { 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, DiscoveryService } 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 DiscoveryService,\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 DiscoveryService,\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"]}
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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","DiscoveryService","exports","forRootAsync","asyncProviders","createAsyncProviders","useFactory","inject","useClass","factory","createMatadorOptions","useExisting","MatadorTestingModule","forTest","overrides","defaultOptions","LocalTransport","TopologyBuilder","create","withNamespace","addQueue","build"],"mappings":";;;;;;;;AAQO,IAAMA,sBAAAA,0BAAgC,wBAAA,CAAA;AAKtC,IAAMC,eAAAA,0BAAyB,iBAAA,CAAA;;;;;;;;;;;;ACkB/B,IAAMC,8BAAN,MAAMA;AAAAA,EAAAA;;;;AACHC,EAAAA,MAAAA,GAAwB,EAAC;EACzBC,UAAAA,GAAa,KAAA;AAErB,EAAA,WAAA,CAA6BC,gBAAAA,EAAoC;SAApCA,gBAAAA,GAAAA,gBAAAA;AAAqC,EAAA;EAElEC,YAAAA,GAAqB;AACnB,IAAA,IAAA,CAAKC,mBAAAA,EAAmB;AAC1B,EAAA;;;;EAKQA,mBAAAA,GAA4B;AAClC,IAAA,IAAI,KAAKH,UAAAA,EAAY;AACnB,MAAA;AACF,IAAA;AAEA,IAAA,MAAMI,SAAAA,GAAY,IAAA,CAAKH,gBAAAA,CAAiBI,YAAAA,EAAY;AAEpD,IAAA,KAAA,MAAWC,WAAWF,SAAAA,EAAW;AAC/B,MAAA,MAAM,EAAEG,UAAQ,GAAKD,OAAAA;AACrB,MAAA,IAAI,CAACC,QAAAA,IAAY,OAAOA,QAAAA,KAAa,QAAA,EAAU;AAC7C,QAAA;AACF,MAAA;AAEA,MAAA,MAAMC,QAAAA,GACJC,OAAAA,CAAQC,WAAAA,CAAYd,sBAAAA,EAAwBW,SAAS,WAAW,CAAA;AAElE,MAAA,IAAI,CAACC,QAAAA,IAAYA,QAAAA,CAASG,MAAAA,KAAW,CAAA,EAAG;AACtC,QAAA;AACF,MAAA;AAEA,MAAA,KAAA,MAAWC,WAAWJ,QAAAA,EAAU;AAC9B,QAAA,IAAA,CAAKK,eAAAA,CAAgBN,UAAUK,OAAAA,CAAAA;AACjC,MAAA;AACF,IAAA;AAEA,IAAA,IAAA,CAAKZ,UAAAA,GAAa,IAAA;AACpB,EAAA;;;;AAKQa,EAAAA,eAAAA,CACNN,UACAO,QAAAA,EACM;AACN,IAAA,MAAM,EAAEC,UAAAA,EAAYC,OAAAA,EAASC,UAAAA,EAAU,GAAKH,QAAAA;AAC5C,IAAA,MAAMI,SAAAA,GAAYX,SAAS,WAAA,CAAYY,IAAAA;AAGvC,IAAA,MAAMC,iBAAiBJ,OAAAA,CAAQG,IAAAA,IAAQ,CAAA,EAAGD,SAAAA,IAAaD,UAAAA,CAAAA,CAAAA;AAGvD,IAAA,MAAMI,WAAAA,GAAcL,QAAQM,UAAAA,KAAe,WAAA;AAI3C,IAAA,MAAMC,WAAAA,GAAehB,QAAAA,CAAiCU,UAAAA,CAAAA,CAAYO,KAChEjB,QAAAA,CAAAA;AAIF,IAAA,MAAMkB,UAAAA,GAA4BJ,cAC9BK,gBAAAA,CAAiB;MACfP,IAAAA,EAAMC,cAAAA;AACNO,MAAAA,WAAAA,EAAaX,OAAAA,CAAQW,WAAAA;MACrBL,UAAAA,EAAY,WAAA;AACZM,MAAAA,UAAAA,EAAYZ,OAAAA,CAAQY,UAAAA;AACpBC,MAAAA,WAAAA,EAAab,OAAAA,CAAQa,WAAAA;AACrBC,MAAAA,OAAAA,EAASd,OAAAA,CAAQc,OAAAA;MACjBC,QAAAA,kBAAU,MAAA,CAAA,OACRC,UACAC,OAAAA,KAAAA;AAEA,QAAA,MAAMV,WAAAA,CAAYS,UAAUC,OAAAA,CAAAA;MAC9B,CAAA,EALU,UAAA;AAMZ,KAAA,IACAP,gBAAAA,CAAiB;MACfP,IAAAA,EAAMC,cAAAA;AACNO,MAAAA,WAAAA,EAAaX,OAAAA,CAAQW,WAAAA;AACrBL,MAAAA,UAAAA,EAAYN,OAAAA,CAAQM,UAAAA;AACpBM,MAAAA,UAAAA,EAAYZ,OAAAA,CAAQY,UAAAA;AACpBC,MAAAA,WAAAA,EAAab,OAAAA,CAAQa,WAAAA;AACrBC,MAAAA,OAAAA,EAASd,OAAAA,CAAQc,OAAAA;AACjBC,MAAAA,QAAAA,gCAAiBC,QAAAA,KAAAA;AACf,QAAA,MAAMT,YAAYS,QAAAA,CAAAA;MACpB,CAAA,EAFU,UAAA;KAGZ,CAAA;AAGJ,IAAA,IAAA,CAAKE,WAAAA,CAAYnB,YAAYU,UAAAA,CAAAA;AAC/B,EAAA;;;;AAKQS,EAAAA,WAAAA,CACNnB,YACAU,UAAAA,EACM;AACN,IAAA,MAAMU,WAAWpB,UAAAA,CAAWqB,GAAAA;AAC5B,IAAA,MAAMC,QAAAA,GAAW,IAAA,CAAKtC,MAAAA,CAAOoC,QAAAA,CAAAA;AAE7B,IAAA,IAAIE,QAAAA,EAAU;AAEZ,MAAA,MAAM,CAACC,kBAAAA,EAAoBC,mBAAAA,CAAAA,GAAuBF,QAAAA;AAClD,MAAA,IAAA,CAAKtC,MAAAA,CAAOoC,QAAAA,CAAAA,GAAY;AACtBG,QAAAA,kBAAAA;AACA,QAAA;AAAIC,UAAAA,GAAAA,mBAAAA;AAAqBd,UAAAA;;;IAE7B,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK1B,MAAAA,CAAOoC,QAAAA,CAAAA,GAAY;AAACpB,QAAAA,UAAAA;AAAY,QAAA;AAACU,UAAAA;;;AACxC,IAAA;AACF,EAAA;;;;;EAMAe,SAAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAKzC,MAAAA;AACd,EAAA;;;;AAKA0C,EAAAA,eAAAA,CAAgBzB,OAAAA,EAA8C;AAC5D,IAAA,MAAM0B,YAAAA,GAA8B;AAAE,MAAA,GAAG,IAAA,CAAK3C;AAAO,KAAA;AAErD,IAAA,IAAIiB,QAAQ2B,gBAAAA,EAAkB;AAC5B,MAAA,KAAA,MAAW,CAAC5B,UAAAA,EAAY6B,WAAAA,CAAAA,IAAgB5B,QAAQ2B,gBAAAA,EAAkB;AAChE,QAAA,MAAMN,QAAAA,GAAWK,YAAAA,CAAa3B,UAAAA,CAAWqB,GAAG,CAAA;AAC5C,QAAA,IAAIC,QAAAA,EAAU;AACZ,UAAA,MAAM,CAACC,kBAAAA,EAAoBC,mBAAAA,CAAAA,GAAuBF,QAAAA;AAClDK,UAAAA,YAAAA,CAAa3B,UAAAA,CAAWqB,GAAG,CAAA,GAAI;AAC7BE,YAAAA,kBAAAA;AACA,YAAA;AAAIC,cAAAA,GAAAA,mBAAAA;AAAwBK,cAAAA,GAAAA;;;QAEhC,CAAA,MAAO;AACLF,UAAAA,YAAAA,CAAa3B,UAAAA,CAAWqB,GAAG,CAAA,GAAI;AAACrB,YAAAA,UAAAA;AAAY6B,YAAAA;;AAC9C,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,OAAOF,YAAAA;AACT,EAAA;AACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;ACtIO,IAAMG,cAAAA,GAAN,MAAMA,eAAAA,CAAAA;AAAAA,EAAAA;;;;;EAQMC,MAAAA,GAAS,IAAIC,MAAAA,CAAOF,eAAAA,CAAe1B,IAAI,CAAA;AAChD6B,EAAAA,OAAAA;EACAC,cAAAA,GAAiB,KAAA;EACjBC,SAAAA,GAAY,KAAA;AAEpB,EAAA,WAAA,CAC4ClC,SACzBf,gBAAAA,EACjB;SAF0Ce,OAAAA,GAAAA,OAAAA;SACzBf,gBAAAA,GAAAA,gBAAAA;AAChB,EAAA;;;;;AAMH,EAAA,MAAMC,YAAAA,GAA8B;AAClC,IAAA,IAAA,CAAKiD,iBAAAA,EAAiB;AAEtB,IAAA,IAAI,KAAKC,eAAAA,EAAe,IAAM,IAAA,CAAKpC,OAAAA,CAAQqC,YAAY,cAAA,EAAgB;AACrE,MAAA,MAAM,KAAKC,OAAAA,EAAO;AACpB,IAAA;AACF,EAAA;;;;;AAMA,EAAA,MAAMC,sBAAAA,GAAwC;AAC5C,IAAA,MAAMF,OAAAA,GAAU,IAAA,CAAKrC,OAAAA,CAAQqC,OAAAA,IAAW,wBAAA;AACxC,IAAA,IAAI,IAAA,CAAKD,eAAAA,EAAe,IAAMC,OAAAA,KAAY,wBAAA,EAA0B;AAClE,MAAA,MAAM,KAAKC,OAAAA,EAAO;AACpB,IAAA;AACF,EAAA;;;;;AAMA,EAAA,MAAME,eAAAA,GAAiC;AACrC,IAAA,IAAI,IAAA,CAAKxC,OAAAA,CAAQyC,UAAAA,KAAe,iBAAA,EAAmB;AACjD,MAAA,MAAM,KAAKC,UAAAA,EAAU;AACvB,IAAA;AACF,EAAA;;;;;AAMA,EAAA,MAAMC,yBAAAA,GAA2C;AAC/C,IAAA,MAAMF,UAAAA,GAAa,IAAA,CAAKzC,OAAAA,CAAQyC,UAAAA,IAAc,2BAAA;AAC9C,IAAA,IAAIA,eAAe,2BAAA,EAA6B;AAC9C,MAAA,MAAM,KAAKC,UAAAA,EAAU;AACvB,IAAA;AACF,EAAA;;;;;AAMA,EAAA,MAAME,qBAAAA,GAAuC;AAC3C,IAAA,IAAI,IAAA,CAAK5C,OAAAA,CAAQyC,UAAAA,KAAe,uBAAA,EAAyB;AACvD,MAAA,MAAM,KAAKC,UAAAA,EAAU;AACvB,IAAA;AACF,EAAA;EAuBA,MAAMG,IAAAA,CACJC,YAAAA,EACAC,aAAAA,EACA/C,OAAAA,EACqB;AACrB,IAAA,IAAI,KAAKiC,cAAAA,EAAgB;AACvB,MAAA,MAAM,IAAIe,MAAM,oCAAA,CAAA;AAClB,IAAA;AAGA,IAAA,MAAMC,YAAAA,GACJ,OAAOH,YAAAA,KAAiB,UAAA,IAAc,KAAA,IAASA,YAAAA;AAEjD,IAAA,IAAIG,YAAAA,EAAc;AAChB,MAAA,OAAO,IAAA,CAAKjB,OAAAA,CAAQa,IAAAA,CAClBC,YAAAA,EACAC,eACA/C,OAAAA,CAAAA;AAEJ,IAAA;AACA,IAAA,OAAO,IAAA,CAAKgC,OAAAA,CAAQa,IAAAA,CAClBC,YAAAA,EACAC,aAAAA,CAAAA;AAEJ,EAAA;;;;EAKAG,UAAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAKlB,OAAAA;AACd,EAAA;;;;AAKA,EAAA,MAAMmB,KAAAA,GAAuB;AAC3B,IAAA,OAAO,KAAKb,OAAAA,EAAO;AACrB,EAAA;;;;EAKAc,WAAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAKpB,OAAAA,EAASoB,WAAAA,EAAAA,IAAiB,KAAA;AACxC,EAAA;;;;EAKAC,oBAAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAKpB,cAAAA;AACd,EAAA;;;;AAKA,EAAA,MAAMqB,YAAYC,SAAAA,EAAsC;AACtD,IAAA,OAAO,IAAA,CAAKvB,OAAAA,CAAQsB,WAAAA,CAAYC,SAAAA,CAAAA;AAClC,EAAA;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,EAAA,MAAMC,aAAAA,GAAkC;AACtC,IAAA,IAAI,CAAC,KAAKtB,SAAAA,EAAW;AACnB,MAAA,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAA,CAAKJ,MAAAA,CAAO2B,IAAI,6CAAA,CAAA;AAChB,IAAA,MAAMC,MAAAA,GAAS,MAAM,IAAA,CAAK1B,OAAAA,CAAQwB,aAAAA,EAAa;AAC/C,IAAA,IAAIE,MAAAA,EAAQ;AACV,MAAA,IAAA,CAAK5B,MAAAA,CAAO2B,IAAI,+CAAA,CAAA;AAClB,IAAA;AACA,IAAA,OAAOC,MAAAA;AACT,EAAA;;;;EAKQvB,iBAAAA,GAA0B;AAChC,IAAA,MAAMT,YAAAA,GAAe,IAAA,CAAKzC,gBAAAA,CAAiBwC,eAAAA,CAAgB,KAAKzB,OAAO,CAAA;AAGvE,IAAA,MAAM2D,QAAAA,GAAW,IAAIC,cAAAA,EAAAA;AACrB,IAAA,KAAA,MAAWC,KAAAA,IAASC,MAAAA,CAAOC,MAAAA,CAAOrC,YAAAA,CAAAA,EAAe;AAC/C,MAAA,IAAIsC,kBAAAA,CAAmBH,KAAAA,CAAAA,EAAQ;AAC7B,QAAA,MAAM,CAAC9D,UAAAA,EAAY6B,WAAAA,CAAAA,GAAeiC,KAAAA;AAClCF,QAAAA,QAAAA,CAASM,QAAAA,CAASlE,YAAY6B,WAAAA,CAAAA;MAChC,CAAA,MAAO;AACL+B,QAAAA,QAAAA,CAASM,QAAAA,CAASJ,KAAAA,CAAM9D,UAAAA,EAAY8D,KAAAA,CAAMjC,WAAW,CAAA;AACvD,MAAA;AACF,IAAA;AAEA,IAAA,MAAMsC,UAAAA,GAAaP,SAASQ,QAAAA,EAAQ;AACpC,IAAA,IAAI,CAACD,WAAWE,KAAAA,EAAO;AACrB,MAAA,MAAMC,MAAAA,GAASH,WAAWI,MAAAA,CAAOC,MAAAA,CAAO,CAACC,CAAAA,KAAMA,CAAAA,CAAEC,aAAa,OAAA,CAAA;AAC9D,MAAA,IAAIJ,MAAAA,CAAO1E,SAAS,CAAA,EAAG;AACrB,QAAA,MAAM,IAAIqD,KAAAA,CACR,CAAA,wBAAA,EAA2BqB,MAAAA,CAAOK,GAAAA,CAAI,CAACF,CAAAA,KAAMA,CAAAA,CAAEG,OAAO,CAAA,CAAEC,IAAAA,CAAK,IAAA,CAAA,CAAA,CAAO,CAAA;AAExE,MAAA;AACF,IAAA;AAEA,IAAA,IAAA,CAAK5C,OAAAA,GAAU,IAAI6C,OAAAA,CACjB;AACEC,MAAAA,SAAAA,EAAW,KAAK9E,OAAAA,CAAQ8E,SAAAA;AACxBC,MAAAA,QAAAA,EAAU,KAAK/E,OAAAA,CAAQ+E,QAAAA;MACvBhG,MAAAA,EAAQ2C,YAAAA;MACRsD,WAAAA,EAAa,IAAA,CAAKhF,QAAQgF,WAAAA,GACtB;AAAI,QAAA,GAAA,IAAA,CAAKhF,OAAAA,CAAQgF;AACjBC,OAAAA,GAAAA,MAAAA;AACJC,MAAAA,KAAAA,EAAO,KAAKlF,OAAAA,CAAQkF,KAAAA;AACpBC,MAAAA,WAAAA,EAAa,KAAKnF,OAAAA,CAAQmF,WAAAA;AAC1BC,MAAAA,eAAAA,EAAiB,KAAKpF,OAAAA,CAAQoF,eAAAA;AAC9BC,MAAAA,cAAAA,EAAgB,KAAKrF,OAAAA,CAAQqF;KAC/B,EACA,IAAA,CAAKrF,QAAQsF,KAAK,CAAA;AAGpB,IAAA,IAAA,CAAKxD,MAAAA,CAAO2B,IAAI,+CAAA,CAAA;AAClB,EAAA;EAEQrB,eAAAA,GAA2B;AACjC,IAAA,OAAO,IAAA,CAAKpC,QAAQuF,SAAAA,KAAc,KAAA;AACpC,EAAA;AAEA,EAAA,MAAcjD,OAAAA,GAAyB;AACrC,IAAA,IAAI,KAAKJ,SAAAA,EAAW;AAClB,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,IAAA,CAAKF,QAAQmB,KAAAA,EAAK;AACxB,IAAA,IAAA,CAAKjB,SAAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAKJ,MAAAA,CAAO2B,IAAI,6BAAA,CAAA;AAClB,EAAA;AAEA,EAAA,MAAcf,UAAAA,GAA4B;AACxC,IAAA,IAAI,CAAC,IAAA,CAAKR,SAAAA,IAAa,IAAA,CAAKD,cAAAA,EAAgB;AAC1C,MAAA;AACF,IAAA;AAEA,IAAA,IAAA,CAAKA,cAAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAKH,MAAAA,CAAO2B,IAAI,2EAAA,CAAA;AAEhB,IAAA,MAAM,IAAA,CAAKzB,QAAQwD,QAAAA,EAAQ;AAC3B,IAAA,IAAA,CAAK1D,MAAAA,CAAO2B,IAAI,uCAAA,CAAA;AAClB,EAAA;AACF,CAAA;;;;;;;;;;;;;;;;;;;AC7OO,IAAMgC,aAAAA,GAAN,MAAMA,cAAAA,CAAAA;AAAAA,EAAAA;;;;;;;;;AAOX,EAAA,OAAOC,QAAQ1F,OAAAA,EAA8C;AAC3D,IAAA,OAAO;MACL2F,MAAAA,EAAQF,cAAAA;MACRG,OAAAA,EAAS;AAACC,QAAAA;;MACVzG,SAAAA,EAAW;AACT,QAAA;UACE0G,OAAAA,EAASjH,eAAAA;UACTkH,QAAAA,EAAU/F;AACZ,SAAA;AACAgG,QAAAA,kBAAAA;AACAlH,QAAAA,2BAAAA;AACA+C,QAAAA;;MAEFoE,OAAAA,EAAS;AAACpE,QAAAA;;AACZ,KAAA;AACF,EAAA;;;;;;;;AASA,EAAA,OAAOqE,aAAalG,OAAAA,EAAmD;AACrE,IAAA,MAAMmG,cAAAA,GAAiB,IAAA,CAAKC,oBAAAA,CAAqBpG,OAAAA,CAAAA;AAEjD,IAAA,OAAO;MACL2F,MAAAA,EAAQF,cAAAA;MACRG,OAAAA,EAAS;AAACC,QAAAA,eAAAA;AAAqB7F,QAAAA,GAAAA,OAAAA,CAAQ4F,WAAW;;MAClDxG,SAAAA,EAAW;AACN+G,QAAAA,GAAAA,cAAAA;AACHH,QAAAA,kBAAAA;AACAlH,QAAAA,2BAAAA;AACA+C,QAAAA;;MAEFoE,OAAAA,EAAS;AAACpE,QAAAA;;AACZ,KAAA;AACF,EAAA;;;;AAKA,EAAA,OAAeuE,qBACbpG,OAAAA,EACY;AACZ,IAAA,IAAIA,QAAQqG,UAAAA,EAAY;AACtB,MAAA,OAAO;AACL,QAAA;UACEP,OAAAA,EAASjH,eAAAA;AACTwH,UAAAA,UAAAA,EAAYrG,OAAAA,CAAQqG,UAAAA;UACpBC,MAAAA,EAAStG,OAAAA,CAAQsG,UAAU;AAC7B;;AAEJ,IAAA;AAEA,IAAA,IAAItG,QAAQuG,QAAAA,EAAU;AACpB,MAAA,OAAO;AACL,QAAA;AACET,UAAAA,OAAAA,EAAS9F,OAAAA,CAAQuG,QAAAA;AACjBA,UAAAA,QAAAA,EAAUvG,OAAAA,CAAQuG;AACpB,SAAA;AACA,QAAA;UACET,OAAAA,EAASjH,eAAAA;AACTwH,UAAAA,UAAAA,kBAAY,MAAA,CAAA,OACVG,OAAAA,KACkCA,OAAAA,CAAQC,oBAAAA,EAAoB,EAFpD,YAAA,CAAA;UAGZH,MAAAA,EAAQ;YAACtG,OAAAA,CAAQuG;;AACnB;;AAEJ,IAAA;AAEA,IAAA,IAAIvG,QAAQ0G,WAAAA,EAAa;AACvB,MAAA,OAAO;AACL,QAAA;UACEZ,OAAAA,EAASjH,eAAAA;AACTwH,UAAAA,UAAAA,kBAAY,MAAA,CAAA,OACVG,OAAAA,KACkCA,OAAAA,CAAQC,oBAAAA,EAAoB,EAFpD,YAAA,CAAA;UAGZH,MAAAA,EAAQ;YAACtG,OAAAA,CAAQ0G;;AACnB;;AAEJ,IAAA;AAEA,IAAA,MAAM,IAAI1D,MACR,4EAAA,CAAA;AAEJ,EAAA;AACF,CAAA;;;;;;;;;;;;;;ACtHO,IAAM2D,uBAAN,MAAMA;AAAAA,EAAAA;;;;;;;;;AAOX,EAAA,OAAOC,QAAQC,SAAAA,EAA0D;AACvE,IAAA,MAAMC,cAAAA,GAAuC;AAC3ChC,MAAAA,SAAAA,EAAW,IAAIiC,cAAAA,EAAAA;MACfhC,QAAAA,EAAUiC,eAAAA,CAAgBC,QAAM,CAC7BC,aAAAA,CAAc,MAAA,CAAA,CACdC,QAAAA,CAAS,QAAA,CAAA,CACTC,KAAAA,EAAK;MACRpC,WAAAA,EAAa;AAAC,QAAA;;MACdO,SAAAA,EAAW;AACb,KAAA;AAEA,IAAA,OAAOE,cAAcC,OAAAA,CAAQ;MAC3B,GAAGoB,cAAAA;MACH,GAAGD;KACL,CAAA;AACF,EAAA;AACF","file":"testing.js","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 { Injectable, type OnModuleInit } from '@nestjs/common';\nimport type { 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(private readonly discoveryService: DiscoveryService) {}\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';\nimport type { 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('[Matador] ⏳ Graceful shutdown initiated, draining in-flight messages');\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, DiscoveryService } 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({})\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 DiscoveryService,\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 = this.createAsyncProviders(options);\n\n return {\n module: MatadorModule,\n imports: [DiscoveryModule, ...(options.imports ?? [])],\n providers: [\n ...asyncProviders,\n DiscoveryService,\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({})\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"]}
|
|
1
|
+
{"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","DiscoveryService","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.js","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';\nimport type { 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, DiscoveryService } 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 DiscoveryService,\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 DiscoveryService,\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zdavison/matador-nest",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.2",
|
|
4
4
|
"description": "NestJS integration for Matador event processing library",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -40,15 +40,15 @@
|
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"@nestjs/common": "^10.0.0 || ^11.0.0",
|
|
42
42
|
"@nestjs/core": "^10.0.0 || ^11.0.0",
|
|
43
|
-
"@zdavison/matador": "^
|
|
43
|
+
"@zdavison/matador": "^3.0.2",
|
|
44
44
|
"reflect-metadata": "^0.1.13 || ^0.2.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@nestjs/common": "^
|
|
48
|
-
"@nestjs/core": "^
|
|
49
|
-
"@nestjs/testing": "^
|
|
47
|
+
"@nestjs/common": "^11.0.0",
|
|
48
|
+
"@nestjs/core": "^11.0.0",
|
|
49
|
+
"@nestjs/testing": "^11.0.0",
|
|
50
50
|
"@swc/core": "^1.15.3",
|
|
51
|
-
"@zdavison/matador": "
|
|
51
|
+
"@zdavison/matador": "3.0.2",
|
|
52
52
|
"reflect-metadata": "^0.2.0",
|
|
53
53
|
"rxjs": "^7.0.0",
|
|
54
54
|
"tsup": "^8.3.5"
|