@haskou/ddd-kernel 2.0.15 → 3.0.1

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.
Files changed (57) hide show
  1. package/dist/{RetryPredicate-CLVmhikX.d.cts → RetryPredicate-BKlKFvI4.d.cts} +1 -1
  2. package/dist/{RetryPredicate-Cs5bLFe9.d.ts → RetryPredicate-DG6jcGCX.d.ts} +1 -1
  3. package/dist/{ServiceClass-IInu6j5L.d.ts → ServiceClass-C-ZCUQWE.d.ts} +2 -4
  4. package/dist/{ServiceClass-D_0gCcMr.d.cts → ServiceClass-U0Vk46dN.d.cts} +2 -4
  5. package/dist/{ShutdownHook-D8r9l6N5.d.ts → ShutdownHook-BCQgEMUI.d.ts} +1 -1
  6. package/dist/{ShutdownHook-DC2sOpcz.d.cts → ShutdownHook-CCtg4Ypg.d.cts} +1 -1
  7. package/dist/adapters/index.cjs +28 -27
  8. package/dist/adapters/index.cjs.map +1 -1
  9. package/dist/adapters/index.d.cts +3 -3
  10. package/dist/adapters/index.d.ts +3 -3
  11. package/dist/adapters/index.js +28 -27
  12. package/dist/adapters/index.js.map +1 -1
  13. package/dist/adapters/pubsub/amqp/index.cjs +28 -27
  14. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
  15. package/dist/adapters/pubsub/amqp/index.js +28 -27
  16. package/dist/adapters/pubsub/amqp/index.js.map +1 -1
  17. package/dist/adapters/pubsub/index.cjs +28 -27
  18. package/dist/adapters/pubsub/index.cjs.map +1 -1
  19. package/dist/adapters/pubsub/index.d.cts +3 -3
  20. package/dist/adapters/pubsub/index.d.ts +3 -3
  21. package/dist/adapters/pubsub/index.js +28 -27
  22. package/dist/adapters/pubsub/index.js.map +1 -1
  23. package/dist/adapters/ui/express/index.d.cts +2 -2
  24. package/dist/adapters/ui/express/index.d.ts +2 -2
  25. package/dist/adapters/ui/index.cjs +28 -27
  26. package/dist/adapters/ui/index.cjs.map +1 -1
  27. package/dist/adapters/ui/index.d.cts +2 -2
  28. package/dist/adapters/ui/index.d.ts +2 -2
  29. package/dist/adapters/ui/index.js +28 -27
  30. package/dist/adapters/ui/index.js.map +1 -1
  31. package/dist/adapters/ui/routes/index.cjs +28 -27
  32. package/dist/adapters/ui/routes/index.cjs.map +1 -1
  33. package/dist/adapters/ui/routes/index.js +28 -27
  34. package/dist/adapters/ui/routes/index.js.map +1 -1
  35. package/dist/contracts/index.d.cts +3 -3
  36. package/dist/contracts/index.d.ts +3 -3
  37. package/dist/contracts/kernel/index.d.cts +3 -3
  38. package/dist/contracts/kernel/index.d.ts +3 -3
  39. package/dist/index.cjs +28 -27
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +3 -3
  42. package/dist/index.d.ts +3 -3
  43. package/dist/index.js +28 -27
  44. package/dist/index.js.map +1 -1
  45. package/dist/infrastructure/dependency-injection/index.cjs +28 -27
  46. package/dist/infrastructure/dependency-injection/index.cjs.map +1 -1
  47. package/dist/infrastructure/dependency-injection/index.d.cts +6 -2
  48. package/dist/infrastructure/dependency-injection/index.d.ts +6 -2
  49. package/dist/infrastructure/dependency-injection/index.js +28 -27
  50. package/dist/infrastructure/dependency-injection/index.js.map +1 -1
  51. package/dist/infrastructure/express/index.d.cts +2 -2
  52. package/dist/infrastructure/express/index.d.ts +2 -2
  53. package/dist/infrastructure/scheduler/index.cjs +28 -27
  54. package/dist/infrastructure/scheduler/index.cjs.map +1 -1
  55. package/dist/infrastructure/scheduler/index.js +28 -27
  56. package/dist/infrastructure/scheduler/index.js.map +1 -1
  57. package/package.json +1 -1
@@ -106,7 +106,6 @@ var DependencyInjection = class _DependencyInjection {
106
106
  }
107
107
  options;
108
108
  static configuredInstance;
109
- autowire;
110
109
  loader;
111
110
  container;
112
111
  overrideTokenIds = /* @__PURE__ */ new Map();
@@ -147,20 +146,8 @@ var DependencyInjection = class _DependencyInjection {
147
146
  definition.synthetic = true;
148
147
  this.container.set(id, value);
149
148
  }
150
- parentMatchesService(parentId, serviceClassName) {
151
- if (!parentId) {
152
- return false;
153
- }
154
- const parentName = Buffer.from(parentId, "base64").toString("utf8");
155
- return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);
156
- }
157
- serviceIdMatchesService(serviceId, serviceClassName) {
158
- const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
159
- return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);
160
- }
161
- serviceIdReferencesService(serviceId, serviceClassName) {
162
- const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
163
- return serviceName.endsWith(`__${serviceClassName}`);
149
+ idNamesService(id, serviceClassName) {
150
+ return import_node_path.default.posix.basename(id) === serviceClassName;
164
151
  }
165
152
  getReferenceId(value) {
166
153
  if (typeof value === "object" && value !== null && "id" in value && typeof value.id === "string") {
@@ -184,7 +171,7 @@ var DependencyInjection = class _DependencyInjection {
184
171
  return void 0;
185
172
  }
186
173
  const matches = [...this.definitions.entries()].filter(([, definition]) => definition._abstract !== true).filter(
187
- ([, definition]) => this.parentMatchesService(definition._parent, serviceClassName)
174
+ ([, definition]) => definition._parent && this.idNamesService(definition._parent, serviceClassName)
188
175
  ).map(([id]) => id);
189
176
  return matches[matches.length - 1];
190
177
  }
@@ -194,7 +181,7 @@ var DependencyInjection = class _DependencyInjection {
194
181
  return void 0;
195
182
  }
196
183
  const matches = [...this.definitions.keys()].filter(
197
- (id) => this.serviceIdMatchesService(id, serviceClassName)
184
+ (id) => this.idNamesService(id, serviceClassName)
198
185
  );
199
186
  return matches[matches.length - 1];
200
187
  }
@@ -204,7 +191,7 @@ var DependencyInjection = class _DependencyInjection {
204
191
  return void 0;
205
192
  }
206
193
  const matches = [...this.aliases.keys()].filter(
207
- (id) => this.serviceIdMatchesService(id, serviceClassName)
194
+ (id) => this.idNamesService(id, serviceClassName)
208
195
  );
209
196
  return matches[matches.length - 1];
210
197
  }
@@ -217,9 +204,7 @@ var DependencyInjection = class _DependencyInjection {
217
204
  ...new Set(
218
205
  [...this.definitions.values()].flatMap(
219
206
  (definition) => this.getDefinitionArgumentReferences(definition)
220
- ).filter(
221
- (id) => this.serviceIdReferencesService(id, serviceClassName)
222
- )
207
+ ).filter((id) => this.idNamesService(id, serviceClassName))
223
208
  )
224
209
  ];
225
210
  }
@@ -288,14 +273,31 @@ var DependencyInjection = class _DependencyInjection {
288
273
  this.applyValueOverride(override);
289
274
  }
290
275
  }
291
- async processAutowire() {
276
+ trackAutowireAliasIds(autowire) {
277
+ const internals = autowire;
278
+ const createLegacyServiceId = internals._getLegacyServiceId.bind(autowire);
279
+ const aliasIds = /* @__PURE__ */ new Set();
280
+ internals._getLegacyServiceId = async (...args) => {
281
+ const id = await createLegacyServiceId(...args);
282
+ if (!this.container.hasAlias(id) && !this.container.hasDefinition(id)) {
283
+ aliasIds.add(id);
284
+ }
285
+ return id;
286
+ };
287
+ return aliasIds;
288
+ }
289
+ async processAutowire(autowire) {
292
290
  const previousLogger = this.container.logger;
291
+ const autowireAliasIds = this.trackAutowireAliasIds(autowire);
293
292
  this.container.logger = new AutowireWarningFilter(previousLogger);
294
293
  try {
295
- await this.autowire?.process();
294
+ await autowire.process();
296
295
  } finally {
297
296
  this.container.logger = previousLogger;
298
297
  }
298
+ for (const id of autowireAliasIds) {
299
+ this.aliases.delete(id);
300
+ }
299
301
  }
300
302
  registerParentAliases() {
301
303
  for (const [id, definition] of this.definitions.entries()) {
@@ -308,13 +310,12 @@ var DependencyInjection = class _DependencyInjection {
308
310
  async compile() {
309
311
  if (this.options.containerBuild) {
310
312
  await this.ensureFolderExists(this.options.servicesYamlPath);
311
- this.autowire = new import_node_dependency_injection.Autowire(this.container);
312
- this.autowire.makeIdLegacy();
313
- this.autowire.serviceFile = new import_node_dependency_injection.ServiceFile(
313
+ const autowire = new import_node_dependency_injection.Autowire(this.container);
314
+ autowire.serviceFile = new import_node_dependency_injection.ServiceFile(
314
315
  this.options.servicesYamlPath,
315
316
  false
316
317
  );
317
- await this.processAutowire();
318
+ await this.processAutowire(autowire);
318
319
  } else {
319
320
  this.loader = new import_node_dependency_injection.YamlFileLoader(this.container);
320
321
  await this.loader.load(this.options.servicesYamlPath);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/adapters/pubsub/amqp/index.ts","../../../../src/adapters/pubsub/amqp/AmqpMessageBusAdapter.ts","../../../../src/Kernel.ts","../../../../src/adapters/kernel/console/ConsoleKernelLogger.ts","../../../../src/infrastructure/dependency-injection/AutowireWarningFilter.ts","../../../../src/infrastructure/dependency-injection/DependencyInjection.ts","../../../../src/kernel/KernelEnvironmentValidationError.ts","../../../../src/adapters/pubsub/DefaultPublisherHookErrorPolicy.ts","../../../../src/adapters/pubsub/PublisherHookPipeline.ts","../../../../src/adapters/pubsub/amqp/InvalidDomainEventError.ts","../../../../src/adapters/pubsub/amqp/NoFailedMessagesError.ts"],"sourcesContent":["export * from './AmqpMessage.js';\nexport * from './AmqpMessageBusAdapter.js';\nexport * from './AmqpMessageBusAdapterOptions.js';\nexport * from './ConsumerContext.js';\nexport * from './DomainEventHandler.js';\nexport * from './InvalidDomainEventError.js';\nexport * from './NoFailedMessagesError.js';\nexport { default } from './AmqpMessageBusAdapter.js';\n","import amqplib, {\n type Channel,\n type ChannelModel,\n type ConsumeMessage,\n type GetMessage,\n type MessagePropertyHeaders,\n type Options,\n} from 'amqplib';\nimport { randomUUID } from 'node:crypto';\n\nimport type { PublisherHook } from '../../../contracts/index.js';\nimport type {\n Constructor,\n DomainEvent,\n DomainEventConsumer,\n DomainEventConsumerContext,\n DomainMessageBus,\n DomainEventPublisher,\n} from '../../../domain/index.js';\nimport type { AmqpMessage } from './AmqpMessage.js';\nimport type { AmqpMessageBusAdapterOptions } from './AmqpMessageBusAdapterOptions.js';\nimport type { ConsumerContext } from './ConsumerContext.js';\nimport type { DomainEventHandler } from './DomainEventHandler.js';\n\nimport { Kernel } from '../../../Kernel.js';\nimport { PublisherHookPipeline } from '../PublisherHookPipeline.js';\nimport { InvalidDomainEventError } from './InvalidDomainEventError.js';\nimport { NoFailedMessagesError } from './NoFailedMessagesError.js';\n\nexport default class AmqpMessageBusAdapter\n implements DomainEventConsumer, DomainEventPublisher, DomainMessageBus\n{\n private channelInstance: Channel | undefined;\n private connection: ChannelModel | undefined;\n private readonly delayConsumers: string[] = [];\n private exchange: string;\n private readonly publisherHookPipeline: PublisherHookPipeline;\n\n constructor(private readonly options: AmqpMessageBusAdapterOptions = {}) {\n this.exchange =\n options.exchange ?? options.serviceName ?? process.env.SERVICE_NAME ?? '';\n this.publisherHookPipeline = new PublisherHookPipeline(\n options.publisherHooks,\n options.publisherHookErrorPolicy,\n );\n }\n\n private get dsn(): string {\n return this.options.dsn ?? process.env.TRANSPORT_DSN ?? '';\n }\n\n private get logger(): AmqpMessageBusAdapterOptions['logger'] {\n return this.options.logger ?? Kernel.logger;\n }\n\n private get maxRetries(): number | undefined {\n const configuredRetries =\n this.options.maxRetries ?? process.env.TRANSPORT_MAX_RETRIES;\n\n if (configuredRetries === undefined) {\n return undefined;\n }\n\n return Number(configuredRetries);\n }\n\n private get retryDelayInMilliseconds(): number {\n const retryDelayFromEnv = Number(process.env.TRANSPORT_RETRY_DELAY);\n\n return (\n this.options.retryDelayInMilliseconds ??\n (Number.isFinite(retryDelayFromEnv) ? retryDelayFromEnv : 1000)\n );\n }\n\n private instanceDomainEvent(\n DomainEventInstance: Constructor<DomainEvent>,\n message: AmqpMessage,\n ): DomainEvent {\n if (!message) {\n throw new InvalidDomainEventError(JSON.stringify(message));\n }\n\n return new DomainEventInstance(\n message.aggregate_id,\n message.attributes,\n message.event_id,\n message.occurred_on ? new Date(message.occurred_on) : new Date(),\n message.correlation_id,\n message.causation_id,\n );\n }\n\n private getConsumerContext(\n msg: ConsumeMessage | GetMessage,\n ): DomainEventConsumerContext {\n return {\n metadata: {\n headers: msg.properties.headers ?? {},\n rawMessage: msg,\n retries: Number(msg.properties.headers?.retries ?? 0),\n },\n };\n }\n\n private async handle(\n msg: ConsumeMessage,\n context: ConsumerContext,\n ): Promise<void> {\n const message = JSON.parse(msg.content.toString()) as AmqpMessage;\n\n this.logger?.info(\n `AMQP message bus (${context.queueName}) handling message: ${JSON.stringify(message)}`,\n );\n\n try {\n const domainEvent = this.instanceDomainEvent(\n context.DomainEventInstance,\n message,\n );\n\n await context.handler(domainEvent, this.getConsumerContext(msg));\n } catch (error) {\n await this.handleError(msg, message, context, error);\n }\n }\n\n private async handleError(\n msg: ConsumeMessage,\n message: AmqpMessage,\n context: ConsumerContext,\n error: unknown,\n ): Promise<void> {\n this.logger?.error(error instanceof Error ? error.message : String(error));\n const headers = msg.properties.headers ?? {};\n const retryCount = Number(headers.retries ?? 0);\n\n if (this.maxRetries !== undefined && retryCount <= this.maxRetries) {\n await this.retry(message, headers, context);\n\n return;\n }\n\n await this.sendToDlx(message, context, String(error));\n }\n\n private async retry(\n message: AmqpMessage,\n headers: MessagePropertyHeaders,\n context: ConsumerContext,\n ): Promise<void> {\n const retry = Number(headers.retries || 1);\n const delayTimeInMs = retry * this.retryDelayInMilliseconds;\n const delayedQueueName = `${context.queueName}_delayed_${delayTimeInMs}`;\n const delayedRoutingKey = `${context.queueName}_${context.bindingKey}_delayed_${delayTimeInMs}`;\n const consumerTag = `${delayedQueueName}_${randomUUID()}`;\n\n this.logger?.info(`Retry # ${retry}`);\n\n if (!this.delayConsumers.includes(delayedQueueName)) {\n await this.registerDelayedConsumer(\n delayedQueueName,\n delayedRoutingKey,\n delayTimeInMs,\n consumerTag,\n context,\n );\n }\n\n try {\n const domainEvent = this.instanceDomainEvent(\n context.DomainEventInstance,\n message,\n );\n\n context.channel.publish(\n this.exchange,\n delayedRoutingKey,\n Buffer.from(JSON.stringify(message)),\n this.opts(domainEvent, retry),\n );\n } catch (error: unknown) {\n await context.channel.cancel(consumerTag);\n this.logger?.error(\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n\n private async registerDelayedConsumer(\n delayedQueueName: string,\n delayedRoutingKey: string,\n delayTimeInMs: number,\n consumerTag: string,\n context: ConsumerContext,\n ): Promise<void> {\n await context.channel.assertExchange(this.exchange, 'topic', {\n durable: true,\n });\n await context.channel.assertQueue(delayedQueueName, {\n autoDelete: true,\n deadLetterExchange: this.exchange,\n deadLetterRoutingKey: delayedRoutingKey,\n durable: false,\n messageTtl: delayTimeInMs,\n });\n await context.channel.bindQueue(\n delayedQueueName,\n this.exchange,\n delayedRoutingKey,\n );\n this.delayConsumers.push(delayedQueueName);\n await context.channel.consume(\n delayedQueueName,\n async (msg: ConsumeMessage | null) => {\n if (!msg) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, delayTimeInMs));\n await this.handle(msg, context);\n this.removeDelayConsumer(delayedQueueName);\n await context.channel.cancel(consumerTag);\n },\n { consumerTag, noAck: true },\n );\n }\n\n private removeDelayConsumer(delayedQueueName: string): void {\n const index = this.delayConsumers.indexOf(delayedQueueName);\n\n if (index !== -1) {\n this.delayConsumers.splice(index, 1);\n }\n }\n\n private async sendToDlx(\n message: AmqpMessage,\n context: ConsumerContext,\n error?: string,\n ): Promise<void> {\n await context.channel.assertExchange(this.exchange, 'topic');\n const dlxQueueName = `${context.queueName}_dlx`;\n const dlxRoutingKey = `${context.queueName}_${context.bindingKey}_dlx`;\n\n await context.channel.assertQueue(dlxQueueName, {\n deadLetterExchange: this.exchange,\n deadLetterRoutingKey: dlxRoutingKey,\n durable: true,\n });\n await context.channel.bindQueue(dlxQueueName, this.exchange, dlxRoutingKey);\n\n try {\n const domainEvent = this.instanceDomainEvent(\n context.DomainEventInstance,\n message,\n );\n\n context.channel.publish(\n this.exchange,\n dlxRoutingKey,\n Buffer.from(JSON.stringify(message)),\n this.opts(domainEvent, message.retries, error),\n );\n } catch (publishError: unknown) {\n this.logger?.error(\n publishError instanceof Error\n ? publishError.message\n : String(publishError),\n );\n }\n }\n\n private async connect(): Promise<void> {\n this.connection = await amqplib.connect(this.getConnectionDsn());\n this.channelInstance = await this.connection.createChannel();\n this.channelInstance\n .on('close', async () => {\n this.logger?.error('AMQP message bus event close');\n await this.reconnect();\n })\n .on('error', async (error) => {\n this.logger?.error(`AMQP message bus event error: ${error.message}`);\n await this.reconnect();\n });\n }\n\n private async reconnect(): Promise<void> {\n await this.connect();\n\n for (const consumer of Kernel.consumers) {\n await consumer.init();\n }\n }\n\n private async channel(forceNew = false): Promise<Channel> {\n if (forceNew) {\n const connection = await amqplib.connect(this.getConnectionDsn());\n\n return connection.createChannel();\n }\n\n if (!this.channelInstance) {\n await this.connect();\n }\n\n if (!this.channelInstance) {\n throw new Error('AMQP channel could not be created.');\n }\n\n await this.channelInstance.assertExchange(this.exchange, 'topic', {\n durable: true,\n });\n\n return this.channelInstance;\n }\n\n private getConnectionDsn(): string {\n const separator = this.dsn.includes('?') ? '&' : '?';\n\n return `${this.dsn}${separator}heartbeat=60`;\n }\n\n private opts(\n event: DomainEvent,\n retries?: number,\n error?: string,\n ): Options.Publish {\n return {\n appId: this.options.serviceName ?? process.env.SERVICE_NAME,\n contentEncoding: 'utf-8',\n contentType: 'application/json',\n deliveryMode: 2,\n headers: {\n error,\n retries: retries ? retries + 1 : 0,\n },\n messageId: event.eventId,\n priority: 0,\n timestamp: event.occurredOn.getTime(),\n type: event.eventName(),\n };\n }\n\n private getMessagesToRetry(\n requestedMessagesToRetry: number | undefined,\n availableMessages: number,\n ): number {\n return requestedMessagesToRetry ?? availableMessages;\n }\n\n private async retryDlxMessage(\n msg: ConsumeMessage | GetMessage,\n DomainEventInstance: Constructor<DomainEvent>,\n handler: DomainEventHandler,\n channel: Channel,\n ): Promise<void> {\n const content = msg.content.toString();\n\n this.logger?.info(`Retrying message from DLX ${content}`);\n\n try {\n const message = JSON.parse(content) as AmqpMessage;\n const domainEvent = this.instanceDomainEvent(\n DomainEventInstance,\n message,\n );\n\n await handler(domainEvent, this.getConsumerContext(msg));\n this.logger?.info(`${content} successfully handled.`);\n channel.ack(msg);\n } catch (error: Error | unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n this.logger?.error(`${content} error with ${errorMessage}.`);\n channel.nack(msg);\n }\n }\n\n public async areQueuesBound(): Promise<boolean> {\n if (Kernel.consumers.length === 0) {\n return false;\n }\n\n const channel = await this.channel();\n\n for (const consumer of Kernel.consumers) {\n const queueChecker = await channel.checkQueue(consumer.queueName);\n\n if (queueChecker.consumerCount !== 0) {\n return false;\n }\n }\n\n return true;\n }\n\n public async consumeDlx(\n queueName: string,\n DomainEventInstance: Constructor<DomainEvent>,\n handler: DomainEventHandler,\n messagesToRetry?: number,\n ): Promise<void> {\n const dlxQueueName = `${queueName}_dlx`;\n const channel = await this.channel(true);\n\n channel.on('error', () => {\n this.logger?.error('AMQP message bus event error');\n });\n\n const queue = await channel.checkQueue(dlxQueueName);\n const messagesToRetryCount = this.getMessagesToRetry(\n messagesToRetry,\n queue.messageCount,\n );\n\n this.logger?.info(\n `Retrying ${messagesToRetryCount} messages from DLX ${dlxQueueName}`,\n );\n\n if (messagesToRetryCount > 0 && queue.messageCount !== 0) {\n for (let index = 0; index < messagesToRetryCount; index++) {\n const msg = await channel.get(dlxQueueName);\n\n if (msg === false) {\n continue;\n }\n\n await this.retryDlxMessage(msg, DomainEventInstance, handler, channel);\n }\n\n return;\n }\n\n throw new NoFailedMessagesError(dlxQueueName);\n }\n\n public async consume(\n queueName: string,\n bindingKey: string,\n DomainEventInstance: Constructor<DomainEvent>,\n exchange: string,\n handler: DomainEventHandler,\n ): Promise<void> {\n const channel = await this.channel();\n\n await channel.assertQueue(queueName, { durable: true });\n await channel.assertExchange(exchange, 'topic');\n await channel.prefetch(1);\n await channel.bindQueue(queueName, exchange, bindingKey);\n\n const context: ConsumerContext = {\n bindingKey,\n channel,\n DomainEventInstance,\n handler,\n queueName,\n };\n\n await channel.consume(queueName, async (msg: ConsumeMessage | null) => {\n if (!msg) {\n return;\n }\n\n await this.handle(msg, context);\n channel.ack(msg);\n });\n }\n\n public async publish(domainEvents: DomainEvent[]): Promise<void> {\n const channel = await this.channel();\n\n for (const event of domainEvents) {\n await this.publisherHookPipeline.run(\n {\n domainEvent: event,\n message: {\n metadata: {\n causationId: event.getCausationId(),\n correlationId: event.getCorrelationId(),\n eventId: event.eventId,\n },\n name: event.eventName(),\n payload: event.attributes,\n },\n metadata: {\n eventId: event.eventId,\n exchange: this.exchange,\n },\n topic: event.eventName(),\n },\n () =>\n channel.publish(\n this.exchange,\n event.eventName(),\n Buffer.from(event.decode()),\n this.opts(event),\n ),\n );\n }\n }\n\n public registerPublisherHooks(...hooks: PublisherHook[]): void {\n this.publisherHookPipeline.register(...hooks);\n }\n\n public async close(): Promise<void> {\n await this.channelInstance?.close();\n await this.connection?.close();\n this.channelInstance = undefined;\n this.connection = undefined;\n }\n}\n","import dotenv, { type DotenvConfigOutput } from 'dotenv';\nimport path from 'node:path';\n\nimport type {\n ConsumerMiddleware,\n KernelConsumer,\n KernelLogger,\n KernelRoute,\n ShutdownHook,\n} from './contracts/index.js';\nimport type { ServiceClass } from './infrastructure/dependency-injection/index.js';\nimport type { Initializer, Runtime } from './infrastructure/lifecycle/index.js';\nimport type { Scheduler } from './infrastructure/scheduler/index.js';\nimport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nimport type { KernelEnvironmentForSchema } from './kernel/KernelEnvironmentForSchema.js';\nimport type { KernelEnvironmentSchema } from './kernel/KernelEnvironmentSchema.js';\nimport type { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nimport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nimport type { KernelOptions } from './kernel/KernelOptions.js';\nimport type { ShutdownCandidate } from './kernel/ShutdownCandidate.js';\n\nimport { ConsoleKernelLogger } from './adapters/kernel/index.js';\nimport { DependencyInjection } from './infrastructure/dependency-injection/index.js';\nimport { KernelEnvironmentValidationError } from './kernel/KernelEnvironmentValidationError.js';\n\nexport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nexport type { KernelDefaultEnvironment } from './kernel/KernelDefaultEnvironment.js';\nexport type { KernelEnvironment } from './kernel/KernelEnvironment.js';\nexport type { KernelEnvironmentForSchema } from './kernel/KernelEnvironmentForSchema.js';\nexport type { KernelEnvironmentSchema } from './kernel/KernelEnvironmentSchema.js';\nexport type { KernelEnvironmentSchemaInput } from './kernel/KernelEnvironmentSchemaInput.js';\nexport type { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nexport type { KernelEnvironmentVariableDefinition } from './kernel/KernelEnvironmentVariableDefinition.js';\nexport type { KernelEnvironmentVariablePrimitive } from './kernel/KernelEnvironmentVariablePrimitive.js';\nexport type { KernelEnvironmentVariableResolvedValue } from './kernel/KernelEnvironmentVariableResolvedValue.js';\nexport type { KernelEnvironmentVariableType } from './kernel/KernelEnvironmentVariableType.js';\nexport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nexport type { KernelOptions } from './kernel/KernelOptions.js';\nexport { KernelEnvironmentValidationError } from './kernel/KernelEnvironmentValidationError.js';\n\nexport class Kernel<\n TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined,\n> {\n private static readonly stateKey = Symbol.for(\n '@haskou/ddd-kernel/kernel-state',\n );\n\n private readonly consumerMiddlewares: ConsumerMiddleware[] = [];\n private readonly consumersList: KernelConsumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<KernelRoute>[] = [];\n private readonly schedulersList: Scheduler[] = [];\n private readonly shutdownHooks: ShutdownHook[] = [];\n private dependencyInjectionInstance: DependencyInjection | undefined;\n private environmentVariables =\n process.env as KernelEnvironmentForSchema<TEnvironmentSchema>;\n\n private static get state(): {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n } {\n const stateContainer = globalThis as typeof globalThis & {\n [Kernel.stateKey]?: {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n };\n };\n\n stateContainer[Kernel.stateKey] = stateContainer[Kernel.stateKey] ?? {};\n\n return stateContainer[Kernel.stateKey] as {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n };\n }\n\n public static get configDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'config');\n }\n\n public static get consumers(): KernelConsumer[] {\n return Kernel.getActiveKernel().consumers;\n }\n\n public static get consumerMiddleware(): ConsumerMiddleware[] {\n return Kernel.getActiveKernel().consumerMiddleware;\n }\n\n public static get di(): DependencyInjection {\n return Kernel.getActiveKernel().di;\n }\n\n public static get environment(): NodeJS.ProcessEnv {\n return process.env;\n }\n\n public static get logger(): KernelLogger {\n return Kernel.getActiveKernel().logger;\n }\n\n public static get active(): Kernel<KernelEnvironmentSchema | undefined> {\n return Kernel.getActiveKernel();\n }\n\n public static get rootDirectory(): string {\n return process.cwd();\n }\n\n public static get routes(): ServiceClass<KernelRoute>[] {\n return Kernel.getActiveKernel().routes;\n }\n\n public static get schedulers(): Scheduler[] {\n return Kernel.getActiveKernel().schedulers;\n }\n\n public static get sourceDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'src');\n }\n\n private static getActiveKernel(): Kernel<\n KernelEnvironmentSchema | undefined\n > {\n if (!Kernel.state.activeKernel) {\n Kernel.state.activeKernel = new Kernel();\n }\n\n return Kernel.state.activeKernel;\n }\n\n private static assertRequiredEnvironmentVariable(\n name: string,\n value: string | undefined,\n schema: KernelEnvironmentSchema,\n ): void {\n if (schema[name]?.required === true && value === undefined) {\n throw new KernelEnvironmentValidationError(\n `Missing required environment variable \"${name}\".`,\n );\n }\n }\n\n private static assertRequiredEnvironmentVariableIsNotBlank(\n name: string,\n value: string,\n schema: KernelEnvironmentSchema,\n ): void {\n if (schema[name]?.required === true && value.trim() === '') {\n throw new KernelEnvironmentValidationError(\n `Blank required environment variable \"${name}\".`,\n );\n }\n }\n\n private static assertEnvironmentVariableChoice(\n name: string,\n value: KernelEnvironmentValue,\n schema: KernelEnvironmentSchema,\n ): void {\n const choices = schema[name]?.choices;\n\n if (choices && !choices.includes(value)) {\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be one of: ${choices.join(', ')}.`,\n );\n }\n }\n\n private static getEnvironmentVariablesPath(\n environment: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n >,\n ): string {\n return path.resolve(\n Kernel.rootDirectory,\n options.path ?? (environment ? `.env.${environment}` : '.env'),\n );\n }\n\n private static parseBooleanEnvironmentVariable(\n name: string,\n value: string,\n ): boolean {\n if (['1', 'true', 'yes', 'on'].includes(value.toLowerCase())) {\n return true;\n }\n\n if (['0', 'false', 'no', 'off'].includes(value.toLowerCase())) {\n return false;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" has invalid boolean value \"${value}\".`,\n );\n }\n\n private static parseNumberEnvironmentVariable(\n name: string,\n value: string,\n ): number {\n const parsedValue = Number(value);\n\n if (Number.isFinite(parsedValue)) {\n return parsedValue;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" has invalid number value \"${value}\".`,\n );\n }\n\n private static parseEnvironmentVariable(\n name: string,\n value: string,\n schema: KernelEnvironmentSchema,\n ): KernelEnvironmentValue {\n const definition = schema[name];\n\n if (definition.type === 'boolean') {\n const parsedValue = Kernel.parseBooleanEnvironmentVariable(name, value);\n\n Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);\n\n return parsedValue;\n }\n\n if (definition.type === 'number') {\n const parsedValue = Kernel.parseNumberEnvironmentVariable(name, value);\n\n Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);\n\n return parsedValue;\n }\n\n Kernel.assertEnvironmentVariableChoice(name, value, schema);\n\n return value;\n }\n\n private static getEnvironmentVariableValue(\n name: string,\n definition: KernelEnvironmentSchema[string],\n schema: KernelEnvironmentSchema,\n ): string | undefined {\n const value = process.env[name];\n\n Kernel.assertRequiredEnvironmentVariable(name, value, schema);\n\n if (value !== undefined) {\n Kernel.assertRequiredEnvironmentVariableIsNotBlank(name, value, schema);\n }\n\n if (value !== undefined && value.trim() !== '') {\n return value;\n }\n\n return definition.defaultValue?.toString();\n }\n\n private static shouldUnsetBlankOptionalEnvironmentVariable(\n name: string,\n value: string | undefined,\n valueOrDefault: string | undefined,\n schema: KernelEnvironmentSchema,\n ): boolean {\n return (\n value !== undefined &&\n value.trim() === '' &&\n valueOrDefault === undefined &&\n schema[name]?.required !== true\n );\n }\n\n private static validateEnvironmentVariables<\n TSchema extends KernelEnvironmentSchema,\n >(schema: TSchema): KernelEnvironmentForSchema<TSchema> {\n const environmentVariables: Record<\n string,\n KernelEnvironmentValue | undefined\n > = {};\n\n for (const [name, definition] of Object.entries(schema)) {\n const value = process.env[name];\n const valueOrDefault = Kernel.getEnvironmentVariableValue(\n name,\n definition,\n schema,\n );\n\n if (valueOrDefault !== undefined) {\n environmentVariables[name] = Kernel.parseEnvironmentVariable(\n name,\n valueOrDefault,\n schema,\n );\n } else if (\n Kernel.shouldUnsetBlankOptionalEnvironmentVariable(\n name,\n value,\n valueOrDefault,\n schema,\n )\n ) {\n environmentVariables[name] = undefined;\n }\n }\n\n return {\n ...process.env,\n ...environmentVariables,\n } as KernelEnvironmentForSchema<TSchema>;\n }\n\n public static loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n > = {},\n ): DotenvConfigOutput {\n const environmentName = environment ?? process.env.NODE_ENV ?? 'local';\n\n const result = dotenv.config({\n override: options.override,\n path: Kernel.getEnvironmentVariablesPath(environmentName, options),\n });\n\n if (options.schema) {\n Kernel.validateEnvironmentVariables(options.schema);\n }\n\n return result;\n }\n\n constructor(\n private readonly options: KernelOptions<TEnvironmentSchema> = {},\n ) {\n this.loggerInstance = options.logger ?? new ConsoleKernelLogger();\n this.dependencyInjectionInstance = options.di;\n Kernel.state.activeKernel = this;\n }\n\n private async closeCandidate(candidate: ShutdownCandidate): Promise<void> {\n if (candidate.shutdown) {\n await candidate.shutdown();\n\n return;\n }\n\n if (candidate.close) {\n await candidate.close();\n\n return;\n }\n\n if (candidate.stop) {\n await candidate.stop();\n\n return;\n }\n\n if (candidate.flush) {\n await candidate.flush();\n }\n }\n\n private getConsumerFromClass(\n ClassDefinition: ServiceClass<KernelConsumer>,\n ): KernelConsumer {\n return this.di.getService<KernelConsumer>(ClassDefinition);\n }\n\n private getInitializerFromClass(\n ClassDefinition: ServiceClass<Initializer>,\n ): Initializer {\n return this.di.getService<Initializer>(ClassDefinition);\n }\n\n private getRuntimeFromClass(ClassDefinition: ServiceClass<Runtime>): Runtime {\n return this.di.getService<Runtime>(ClassDefinition);\n }\n\n private getSchedulerFromClass(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Scheduler {\n return this.di.getService<Scheduler>(ClassDefinition);\n }\n\n public get consumers(): KernelConsumer[] {\n return this.consumersList;\n }\n\n public get consumerMiddleware(): ConsumerMiddleware[] {\n return this.consumerMiddlewares;\n }\n\n public get di(): DependencyInjection {\n if (!this.dependencyInjectionInstance) {\n throw new Error('Kernel dependency injection has not been initialized.');\n }\n\n return this.dependencyInjectionInstance;\n }\n\n public get environment(): KernelEnvironmentForSchema<TEnvironmentSchema> {\n return this.environmentVariables;\n }\n\n public get logger(): KernelLogger {\n return this.loggerInstance;\n }\n\n public get routes(): ServiceClass<KernelRoute>[] {\n return this.routesList;\n }\n\n public get schedulers(): Scheduler[] {\n return this.schedulersList;\n }\n\n private getDependencyInjectionOptions(\n options: KernelDependencyInjectionOptions = {},\n ): Required<KernelDependencyInjectionOptions> {\n return {\n containerBuild:\n options.containerBuild ?? process.env.CONTAINER_BUILD === 'true',\n overrides: options.overrides ?? [],\n servicesYamlPath:\n options.servicesYamlPath ??\n this.options.servicesYamlPath ??\n path.resolve(Kernel.configDirectory, 'container', 'services.yaml'),\n sourceDirectory:\n options.sourceDirectory ??\n this.options.sourceDirectory ??\n Kernel.sourceDirectory,\n };\n }\n\n public async dependencyInjection(\n options: KernelDependencyInjectionOptions = {},\n ): Promise<void> {\n Kernel.state.activeKernel = this;\n this.dependencyInjectionInstance =\n this.dependencyInjectionInstance ??\n DependencyInjection.configure(\n this.getDependencyInjectionOptions(options),\n );\n\n await this.dependencyInjectionInstance.compile();\n Kernel.state.activeKernel = this;\n }\n\n public loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n > = {},\n ): DotenvConfigOutput {\n const result = Kernel.loadEnvironmentVariables(environment, {\n ...options,\n schema: options.schema ?? this.options.environmentSchema,\n });\n\n this.environmentVariables = this.options.environmentSchema\n ? Kernel.validateEnvironmentVariables(this.options.environmentSchema)\n : (process.env as KernelEnvironmentForSchema<TEnvironmentSchema>);\n\n return result;\n }\n\n public getRoutes(): ServiceClass<KernelRoute>[] {\n return this.routes;\n }\n\n public registerConsumerMiddleware(\n ...middlewares: ConsumerMiddleware[]\n ): void {\n this.consumerMiddlewares.push(...middlewares);\n }\n\n public registerConsumers(\n ...ClassDefinitions: ServiceClass<KernelConsumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: KernelConsumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(\n ...ClassDefinitions: ServiceClass<KernelRoute>[]\n ): void {\n this.routesList.push(...ClassDefinitions);\n }\n\n public registerSchedulers(\n ...ClassDefinitions: ServiceClass<Scheduler>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));\n }\n }\n\n public registerSchedulerInstances(...schedulers: Scheduler[]): void {\n this.schedulersList.push(...schedulers);\n }\n\n public registerShutdownHook(hook: ShutdownHook): void {\n this.shutdownHooks.push(hook);\n }\n\n public removeConsumers(): void {\n this.consumersList.length = 0;\n }\n\n public removeRoutes(): void {\n this.routesList.length = 0;\n }\n\n public removeSchedulers(): void {\n this.schedulersList.length = 0;\n }\n\n public async runConsumers(): Promise<void> {\n for (const consumer of this.consumersList) {\n await consumer.init();\n }\n }\n\n public async runInitializers(\n ...ClassDefinitions: ServiceClass<Initializer>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n await this.getInitializerFromClass(ClassDefinition).ensure();\n }\n }\n\n public async runRuntimes(\n ...ClassDefinitions: ServiceClass<Runtime>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n const runtime = this.getRuntimeFromClass(ClassDefinition);\n\n await runtime.run();\n this.registerShutdownHook(() =>\n this.closeCandidate(runtime as ShutdownCandidate),\n );\n }\n }\n\n public async runSchedulerNowAndSchedule(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Promise<void> {\n const scheduler = this.getSchedulerFromClass(ClassDefinition);\n\n await scheduler.runOnce();\n await scheduler.init();\n this.schedulersList.push(scheduler);\n }\n\n public async runSchedulers(): Promise<void> {\n for (const scheduler of this.schedulersList) {\n await scheduler.init();\n }\n }\n\n public async shutdown(): Promise<void> {\n for (const consumer of [...this.consumersList].reverse()) {\n await this.closeCandidate(consumer as ShutdownCandidate);\n }\n\n for (const scheduler of [...this.schedulersList].reverse()) {\n await this.closeCandidate(scheduler as ShutdownCandidate);\n }\n\n for (const hook of [...this.shutdownHooks].reverse()) {\n await hook();\n }\n\n await this.closeCandidate(this.loggerInstance as ShutdownCandidate);\n }\n}\n\nexport function createKernel<\n TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined,\n>(options?: KernelOptions<TEnvironmentSchema>): Kernel<TEnvironmentSchema> {\n return new Kernel(options);\n}\n\nexport default Kernel;\n","import type { KernelLogger } from '../../../contracts/index.js';\n\nexport class ConsoleKernelLogger implements KernelLogger {\n public debug(message: string): void {\n // eslint-disable-next-line no-console\n console.debug(message);\n }\n\n public error(message: string): void {\n // eslint-disable-next-line no-console\n console.error(message);\n }\n\n public info(message: string): void {\n // eslint-disable-next-line no-console\n console.info(message);\n }\n\n public warn(message: string): void {\n // eslint-disable-next-line no-console\n console.warn(message);\n }\n}\n","import type { Logger } from 'node-dependency-injection';\n\nexport class AutowireWarningFilter implements Logger {\n constructor(private readonly logger: Logger) {}\n\n private isIgnorableAutowireWarning(message: string): boolean {\n return (\n message.startsWith(\n 'Autowire: file has export default declaration but no runtime default export:',\n ) ||\n message.startsWith('Autowire: failed to create definition for undefined:')\n );\n }\n\n public warn(message?: unknown, ...optionalParams: unknown[]): void {\n if (\n typeof message === 'string' &&\n this.isIgnorableAutowireWarning(message)\n ) {\n this.logger.debug?.(`Ignored ${message}`, ...optionalParams);\n\n return;\n }\n\n this.logger.warn(message, ...optionalParams);\n }\n\n public info(message?: unknown, ...optionalParams: unknown[]): void {\n this.logger.info?.(message, ...optionalParams);\n }\n\n public debug(message?: unknown, ...optionalParams: unknown[]): void {\n this.logger.debug?.(message, ...optionalParams);\n }\n}\n","import fs from 'fs-extra';\nimport {\n Autowire,\n ContainerBuilder,\n ServiceFile,\n YamlFileLoader,\n} from 'node-dependency-injection';\nimport path from 'node:path';\n\nimport type { ServiceResolver } from '../../contracts/index.js';\nimport type { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\nimport type { DependencyOverride } from './DependencyOverride.js';\n\nimport { AutowireWarningFilter } from './AutowireWarningFilter.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private autowire: Autowire | undefined;\n private loader: YamlFileLoader | undefined;\n private readonly container: ContainerBuilder;\n private readonly overrideTokenIds = new Map<unknown, string>();\n\n public static configure(\n options: DependencyInjectionOptions,\n ): DependencyInjection {\n DependencyInjection.configuredInstance = new DependencyInjection(options);\n\n return DependencyInjection.configuredInstance;\n }\n\n public static get instance(): DependencyInjection {\n if (!DependencyInjection.configuredInstance) {\n throw new Error('DependencyInjection has not been configured.');\n }\n\n return DependencyInjection.configuredInstance;\n }\n\n constructor(\n private readonly options: DependencyInjectionOptions = {\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath: path.resolve(\n process.cwd(),\n 'config',\n 'container',\n 'services.yaml',\n ),\n sourceDirectory: path.resolve(process.cwd(), 'src'),\n },\n ) {\n this.container = new ContainerBuilder(false, this.options.sourceDirectory);\n }\n\n private get definitions(): Map<string, DefinitionMetadata> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._definitions || new Map();\n }\n\n private get aliases(): Map<string, string> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._alias || new Map();\n }\n\n private async ensureFolderExists(filePath: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n }\n\n private getServiceClassName(serviceName: unknown): string | undefined {\n return typeof serviceName === 'function' ? serviceName.name : undefined;\n }\n\n private getOverrideId(prefix: string, token: unknown): string {\n const tokenName = this.getServiceClassName(token) ?? String(token);\n\n return `ddd-kernel.override.${prefix}.${tokenName}`;\n }\n\n private hasDirectService(serviceName: unknown): boolean {\n return (\n typeof serviceName === 'string' &&\n (this.definitions.has(serviceName) || this.aliases.has(serviceName))\n );\n }\n\n private ensureSyntheticService(id: string, value: unknown): void {\n const definition = this.container.register(id);\n\n definition.public = true;\n definition.synthetic = true;\n this.container.set(id, value);\n }\n\n private parentMatchesService(\n parentId: string | null | undefined,\n serviceClassName: string,\n ): boolean {\n if (!parentId) {\n return false;\n }\n\n const parentName = Buffer.from(parentId, 'base64').toString('utf8');\n\n return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdMatchesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdReferencesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${serviceClassName}`);\n }\n\n private getReferenceId(value: unknown): string | undefined {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'id' in value &&\n typeof value.id === 'string'\n ) {\n return value.id;\n }\n\n return undefined;\n }\n\n private getDefinitionArgumentReferences(\n definition: DefinitionMetadata,\n ): string[] {\n return [\n ...(definition._args ?? []),\n ...(definition._appendArgs ?? []),\n ...(definition._overrideArgs ?? []),\n ].flatMap((argument) => {\n const referenceId = this.getReferenceId(argument);\n\n return referenceId ? [referenceId] : [];\n });\n }\n\n private findConcreteChildServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.entries()]\n .filter(([, definition]) => definition._abstract !== true)\n .filter(([, definition]) =>\n this.parentMatchesService(definition._parent, serviceClassName),\n )\n .map(([id]) => id);\n\n return matches[matches.length - 1];\n }\n\n private findRegisteredServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.keys()].filter((id) =>\n this.serviceIdMatchesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findAliasServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.aliases.keys()].filter((id) =>\n this.serviceIdMatchesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findReferencedServiceIds(serviceName: unknown): string[] {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return [];\n }\n\n return [\n ...new Set(\n [...this.definitions.values()]\n .flatMap((definition) =>\n this.getDefinitionArgumentReferences(definition),\n )\n .filter((id) =>\n this.serviceIdReferencesService(id, serviceClassName),\n ),\n ),\n ];\n }\n\n private getOverrideTokenIds(token: unknown): string[] {\n const tokenIds = [\n this.findRegisteredServiceId(token),\n this.findAliasServiceId(token),\n ...this.findReferencedServiceIds(token),\n ].filter((id): id is string => id !== undefined);\n const existingTokenIds = [...new Set(tokenIds)];\n\n if (existingTokenIds.length > 0) {\n return existingTokenIds;\n }\n\n const overrideTokenId = this.getOverrideId('token', token);\n\n this.ensureSyntheticService(overrideTokenId, undefined);\n\n return [overrideTokenId];\n }\n\n private getOverrideClassServiceId(\n ClassDefinition: new () => unknown,\n ): string {\n const registeredServiceId = this.findRegisteredServiceId(ClassDefinition);\n\n if (registeredServiceId) {\n return registeredServiceId;\n }\n\n const overrideClassId = this.getOverrideId('class', ClassDefinition);\n\n this.container.register(overrideClassId, ClassDefinition);\n\n return overrideClassId;\n }\n\n private applyClassOverride(override: DependencyOverride): void {\n if (!('useClass' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const classId = this.getOverrideClassServiceId(override.useClass);\n\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, classId);\n }\n }\n\n private applyFactoryOverride(override: DependencyOverride): void {\n if (!('useFactory' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const factoryId = this.getOverrideId('factory', override.token);\n\n this.ensureSyntheticService(factoryId, override.useFactory(this));\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, factoryId);\n }\n }\n\n private applyValueOverride(override: DependencyOverride): void {\n if (!('useValue' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const valueId = this.getOverrideId('value', override.token);\n\n this.ensureSyntheticService(valueId, override.useValue);\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, valueId);\n }\n }\n\n private applyOverrides(): void {\n for (const override of this.options.overrides ?? []) {\n this.applyClassOverride(override);\n this.applyFactoryOverride(override);\n this.applyValueOverride(override);\n }\n }\n\n private async processAutowire(): Promise<void> {\n const previousLogger = this.container.logger;\n\n this.container.logger = new AutowireWarningFilter(previousLogger);\n\n try {\n await this.autowire?.process();\n } finally {\n this.container.logger = previousLogger;\n }\n }\n\n private registerParentAliases(): void {\n for (const [id, definition] of this.definitions.entries()) {\n if (definition._abstract === true || !definition._parent) {\n continue;\n }\n\n this.container.setAlias(definition._parent, id);\n }\n }\n\n public async compile(): Promise<void> {\n if (this.options.containerBuild) {\n await this.ensureFolderExists(this.options.servicesYamlPath);\n this.autowire = new Autowire(this.container);\n this.autowire.makeIdLegacy();\n this.autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.processAutowire();\n } else {\n this.loader = new YamlFileLoader(this.container);\n await this.loader.load(this.options.servicesYamlPath);\n }\n\n this.registerParentAliases();\n this.applyOverrides();\n await this.container.compile();\n }\n\n public getService<T>(serviceName: unknown): T {\n const overrideTokenId = this.overrideTokenIds.get(serviceName);\n\n if (overrideTokenId) {\n return this.container.get<T>(overrideTokenId);\n }\n\n const aliasServiceId = this.findAliasServiceId(serviceName);\n\n if (aliasServiceId) {\n return this.container.get<T>(aliasServiceId);\n }\n\n const childServiceId = this.findConcreteChildServiceId(serviceName);\n\n if (childServiceId) {\n return this.container.get<T>(childServiceId);\n }\n\n const registeredServiceId = this.findRegisteredServiceId(serviceName);\n\n if (registeredServiceId) {\n return this.container.get<T>(registeredServiceId);\n }\n\n // NDI 4 types only string IDs, but still resolves constructors and validates other tokens at runtime.\n return this.container.get<T>(serviceName as string);\n }\n\n public hasService(serviceName: unknown): boolean {\n return (\n this.overrideTokenIds.has(serviceName) ||\n this.findAliasServiceId(serviceName) !== undefined ||\n this.findConcreteChildServiceId(serviceName) !== undefined ||\n this.findRegisteredServiceId(serviceName) !== undefined ||\n this.hasDirectService(serviceName)\n );\n }\n}\n\nexport default DependencyInjection;\n","export class KernelEnvironmentValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'KernelEnvironmentValidationError';\n }\n}\n","import type {\n PublishContext,\n PublisherHookErrorPolicy,\n} from '../../contracts/index.js';\n\nexport class DefaultPublisherHookErrorPolicy implements PublisherHookErrorPolicy {\n public handleAfterPublishError(\n error: unknown,\n context: PublishContext,\n ): void {\n void error;\n void context;\n }\n\n public shouldFailAfterPublish(\n error: unknown,\n context: PublishContext,\n ): boolean {\n void error;\n void context;\n\n return false;\n }\n}\n\nexport default DefaultPublisherHookErrorPolicy;\n","import type {\n PublishContext,\n PublisherHook,\n PublisherHookErrorPolicy,\n} from '../../contracts/index.js';\n\nimport { DefaultPublisherHookErrorPolicy } from './DefaultPublisherHookErrorPolicy.js';\n\nexport class PublisherHookPipeline {\n private readonly hooks: PublisherHook[] = [];\n\n constructor(\n hooks: readonly PublisherHook[] = [],\n private readonly errorPolicy: PublisherHookErrorPolicy = new DefaultPublisherHookErrorPolicy(),\n ) {\n this.hooks.push(...hooks);\n }\n\n private async runAfterPublishHooks(context: PublishContext): Promise<void> {\n for (const hook of this.hooks) {\n await this.runAfterPublishHook(hook, context);\n }\n }\n\n private async runAfterPublishHook(\n hook: PublisherHook,\n context: PublishContext,\n ): Promise<void> {\n try {\n await hook.afterPublish?.(context);\n } catch (error: unknown) {\n await this.errorPolicy.handleAfterPublishError(error, context);\n\n if (this.errorPolicy.shouldFailAfterPublish(error, context)) {\n throw error;\n }\n }\n }\n\n private async runBeforePublishHooks(context: PublishContext): Promise<void> {\n for (const hook of this.hooks) {\n await hook.beforePublish?.(context);\n }\n }\n\n private async runPublishErrorHooks(\n error: unknown,\n context: PublishContext,\n ): Promise<void> {\n for (const hook of this.hooks) {\n await hook.onPublishError?.(error, context);\n }\n }\n\n public register(...hooks: PublisherHook[]): void {\n this.hooks.push(...hooks);\n }\n\n public async run<T>(\n context: PublishContext,\n publish: () => Promise<T> | T,\n ): Promise<T> {\n await this.runBeforePublishHooks(context);\n\n try {\n const result = await publish();\n\n await this.runAfterPublishHooks(context);\n\n return result;\n } catch (error: unknown) {\n await this.runPublishErrorHooks(error, context);\n\n throw error;\n }\n }\n}\n","export class InvalidDomainEventError extends Error {\n constructor(message: string) {\n super(`Invalid domain event: ${message}`);\n this.name = 'InvalidDomainEventError';\n }\n}\n","export class NoFailedMessagesError extends Error {\n constructor(queueName: string) {\n super(`No failed messages found in \"${queueName}\".`);\n this.name = 'NoFailedMessagesError';\n }\n}\n"],"mappings":"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","names":["import_node_path","path","fs","path","dotenv","amqplib"]}
1
+ {"version":3,"sources":["../../../../src/adapters/pubsub/amqp/index.ts","../../../../src/adapters/pubsub/amqp/AmqpMessageBusAdapter.ts","../../../../src/Kernel.ts","../../../../src/adapters/kernel/console/ConsoleKernelLogger.ts","../../../../src/infrastructure/dependency-injection/AutowireWarningFilter.ts","../../../../src/infrastructure/dependency-injection/DependencyInjection.ts","../../../../src/kernel/KernelEnvironmentValidationError.ts","../../../../src/adapters/pubsub/DefaultPublisherHookErrorPolicy.ts","../../../../src/adapters/pubsub/PublisherHookPipeline.ts","../../../../src/adapters/pubsub/amqp/InvalidDomainEventError.ts","../../../../src/adapters/pubsub/amqp/NoFailedMessagesError.ts"],"sourcesContent":["export * from './AmqpMessage.js';\nexport * from './AmqpMessageBusAdapter.js';\nexport * from './AmqpMessageBusAdapterOptions.js';\nexport * from './ConsumerContext.js';\nexport * from './DomainEventHandler.js';\nexport * from './InvalidDomainEventError.js';\nexport * from './NoFailedMessagesError.js';\nexport { default } from './AmqpMessageBusAdapter.js';\n","import amqplib, {\n type Channel,\n type ChannelModel,\n type ConsumeMessage,\n type GetMessage,\n type MessagePropertyHeaders,\n type Options,\n} from 'amqplib';\nimport { randomUUID } from 'node:crypto';\n\nimport type { PublisherHook } from '../../../contracts/index.js';\nimport type {\n Constructor,\n DomainEvent,\n DomainEventConsumer,\n DomainEventConsumerContext,\n DomainMessageBus,\n DomainEventPublisher,\n} from '../../../domain/index.js';\nimport type { AmqpMessage } from './AmqpMessage.js';\nimport type { AmqpMessageBusAdapterOptions } from './AmqpMessageBusAdapterOptions.js';\nimport type { ConsumerContext } from './ConsumerContext.js';\nimport type { DomainEventHandler } from './DomainEventHandler.js';\n\nimport { Kernel } from '../../../Kernel.js';\nimport { PublisherHookPipeline } from '../PublisherHookPipeline.js';\nimport { InvalidDomainEventError } from './InvalidDomainEventError.js';\nimport { NoFailedMessagesError } from './NoFailedMessagesError.js';\n\nexport default class AmqpMessageBusAdapter\n implements DomainEventConsumer, DomainEventPublisher, DomainMessageBus\n{\n private channelInstance: Channel | undefined;\n private connection: ChannelModel | undefined;\n private readonly delayConsumers: string[] = [];\n private exchange: string;\n private readonly publisherHookPipeline: PublisherHookPipeline;\n\n constructor(private readonly options: AmqpMessageBusAdapterOptions = {}) {\n this.exchange =\n options.exchange ?? options.serviceName ?? process.env.SERVICE_NAME ?? '';\n this.publisherHookPipeline = new PublisherHookPipeline(\n options.publisherHooks,\n options.publisherHookErrorPolicy,\n );\n }\n\n private get dsn(): string {\n return this.options.dsn ?? process.env.TRANSPORT_DSN ?? '';\n }\n\n private get logger(): AmqpMessageBusAdapterOptions['logger'] {\n return this.options.logger ?? Kernel.logger;\n }\n\n private get maxRetries(): number | undefined {\n const configuredRetries =\n this.options.maxRetries ?? process.env.TRANSPORT_MAX_RETRIES;\n\n if (configuredRetries === undefined) {\n return undefined;\n }\n\n return Number(configuredRetries);\n }\n\n private get retryDelayInMilliseconds(): number {\n const retryDelayFromEnv = Number(process.env.TRANSPORT_RETRY_DELAY);\n\n return (\n this.options.retryDelayInMilliseconds ??\n (Number.isFinite(retryDelayFromEnv) ? retryDelayFromEnv : 1000)\n );\n }\n\n private instanceDomainEvent(\n DomainEventInstance: Constructor<DomainEvent>,\n message: AmqpMessage,\n ): DomainEvent {\n if (!message) {\n throw new InvalidDomainEventError(JSON.stringify(message));\n }\n\n return new DomainEventInstance(\n message.aggregate_id,\n message.attributes,\n message.event_id,\n message.occurred_on ? new Date(message.occurred_on) : new Date(),\n message.correlation_id,\n message.causation_id,\n );\n }\n\n private getConsumerContext(\n msg: ConsumeMessage | GetMessage,\n ): DomainEventConsumerContext {\n return {\n metadata: {\n headers: msg.properties.headers ?? {},\n rawMessage: msg,\n retries: Number(msg.properties.headers?.retries ?? 0),\n },\n };\n }\n\n private async handle(\n msg: ConsumeMessage,\n context: ConsumerContext,\n ): Promise<void> {\n const message = JSON.parse(msg.content.toString()) as AmqpMessage;\n\n this.logger?.info(\n `AMQP message bus (${context.queueName}) handling message: ${JSON.stringify(message)}`,\n );\n\n try {\n const domainEvent = this.instanceDomainEvent(\n context.DomainEventInstance,\n message,\n );\n\n await context.handler(domainEvent, this.getConsumerContext(msg));\n } catch (error) {\n await this.handleError(msg, message, context, error);\n }\n }\n\n private async handleError(\n msg: ConsumeMessage,\n message: AmqpMessage,\n context: ConsumerContext,\n error: unknown,\n ): Promise<void> {\n this.logger?.error(error instanceof Error ? error.message : String(error));\n const headers = msg.properties.headers ?? {};\n const retryCount = Number(headers.retries ?? 0);\n\n if (this.maxRetries !== undefined && retryCount <= this.maxRetries) {\n await this.retry(message, headers, context);\n\n return;\n }\n\n await this.sendToDlx(message, context, String(error));\n }\n\n private async retry(\n message: AmqpMessage,\n headers: MessagePropertyHeaders,\n context: ConsumerContext,\n ): Promise<void> {\n const retry = Number(headers.retries || 1);\n const delayTimeInMs = retry * this.retryDelayInMilliseconds;\n const delayedQueueName = `${context.queueName}_delayed_${delayTimeInMs}`;\n const delayedRoutingKey = `${context.queueName}_${context.bindingKey}_delayed_${delayTimeInMs}`;\n const consumerTag = `${delayedQueueName}_${randomUUID()}`;\n\n this.logger?.info(`Retry # ${retry}`);\n\n if (!this.delayConsumers.includes(delayedQueueName)) {\n await this.registerDelayedConsumer(\n delayedQueueName,\n delayedRoutingKey,\n delayTimeInMs,\n consumerTag,\n context,\n );\n }\n\n try {\n const domainEvent = this.instanceDomainEvent(\n context.DomainEventInstance,\n message,\n );\n\n context.channel.publish(\n this.exchange,\n delayedRoutingKey,\n Buffer.from(JSON.stringify(message)),\n this.opts(domainEvent, retry),\n );\n } catch (error: unknown) {\n await context.channel.cancel(consumerTag);\n this.logger?.error(\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n\n private async registerDelayedConsumer(\n delayedQueueName: string,\n delayedRoutingKey: string,\n delayTimeInMs: number,\n consumerTag: string,\n context: ConsumerContext,\n ): Promise<void> {\n await context.channel.assertExchange(this.exchange, 'topic', {\n durable: true,\n });\n await context.channel.assertQueue(delayedQueueName, {\n autoDelete: true,\n deadLetterExchange: this.exchange,\n deadLetterRoutingKey: delayedRoutingKey,\n durable: false,\n messageTtl: delayTimeInMs,\n });\n await context.channel.bindQueue(\n delayedQueueName,\n this.exchange,\n delayedRoutingKey,\n );\n this.delayConsumers.push(delayedQueueName);\n await context.channel.consume(\n delayedQueueName,\n async (msg: ConsumeMessage | null) => {\n if (!msg) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, delayTimeInMs));\n await this.handle(msg, context);\n this.removeDelayConsumer(delayedQueueName);\n await context.channel.cancel(consumerTag);\n },\n { consumerTag, noAck: true },\n );\n }\n\n private removeDelayConsumer(delayedQueueName: string): void {\n const index = this.delayConsumers.indexOf(delayedQueueName);\n\n if (index !== -1) {\n this.delayConsumers.splice(index, 1);\n }\n }\n\n private async sendToDlx(\n message: AmqpMessage,\n context: ConsumerContext,\n error?: string,\n ): Promise<void> {\n await context.channel.assertExchange(this.exchange, 'topic');\n const dlxQueueName = `${context.queueName}_dlx`;\n const dlxRoutingKey = `${context.queueName}_${context.bindingKey}_dlx`;\n\n await context.channel.assertQueue(dlxQueueName, {\n deadLetterExchange: this.exchange,\n deadLetterRoutingKey: dlxRoutingKey,\n durable: true,\n });\n await context.channel.bindQueue(dlxQueueName, this.exchange, dlxRoutingKey);\n\n try {\n const domainEvent = this.instanceDomainEvent(\n context.DomainEventInstance,\n message,\n );\n\n context.channel.publish(\n this.exchange,\n dlxRoutingKey,\n Buffer.from(JSON.stringify(message)),\n this.opts(domainEvent, message.retries, error),\n );\n } catch (publishError: unknown) {\n this.logger?.error(\n publishError instanceof Error\n ? publishError.message\n : String(publishError),\n );\n }\n }\n\n private async connect(): Promise<void> {\n this.connection = await amqplib.connect(this.getConnectionDsn());\n this.channelInstance = await this.connection.createChannel();\n this.channelInstance\n .on('close', async () => {\n this.logger?.error('AMQP message bus event close');\n await this.reconnect();\n })\n .on('error', async (error) => {\n this.logger?.error(`AMQP message bus event error: ${error.message}`);\n await this.reconnect();\n });\n }\n\n private async reconnect(): Promise<void> {\n await this.connect();\n\n for (const consumer of Kernel.consumers) {\n await consumer.init();\n }\n }\n\n private async channel(forceNew = false): Promise<Channel> {\n if (forceNew) {\n const connection = await amqplib.connect(this.getConnectionDsn());\n\n return connection.createChannel();\n }\n\n if (!this.channelInstance) {\n await this.connect();\n }\n\n if (!this.channelInstance) {\n throw new Error('AMQP channel could not be created.');\n }\n\n await this.channelInstance.assertExchange(this.exchange, 'topic', {\n durable: true,\n });\n\n return this.channelInstance;\n }\n\n private getConnectionDsn(): string {\n const separator = this.dsn.includes('?') ? '&' : '?';\n\n return `${this.dsn}${separator}heartbeat=60`;\n }\n\n private opts(\n event: DomainEvent,\n retries?: number,\n error?: string,\n ): Options.Publish {\n return {\n appId: this.options.serviceName ?? process.env.SERVICE_NAME,\n contentEncoding: 'utf-8',\n contentType: 'application/json',\n deliveryMode: 2,\n headers: {\n error,\n retries: retries ? retries + 1 : 0,\n },\n messageId: event.eventId,\n priority: 0,\n timestamp: event.occurredOn.getTime(),\n type: event.eventName(),\n };\n }\n\n private getMessagesToRetry(\n requestedMessagesToRetry: number | undefined,\n availableMessages: number,\n ): number {\n return requestedMessagesToRetry ?? availableMessages;\n }\n\n private async retryDlxMessage(\n msg: ConsumeMessage | GetMessage,\n DomainEventInstance: Constructor<DomainEvent>,\n handler: DomainEventHandler,\n channel: Channel,\n ): Promise<void> {\n const content = msg.content.toString();\n\n this.logger?.info(`Retrying message from DLX ${content}`);\n\n try {\n const message = JSON.parse(content) as AmqpMessage;\n const domainEvent = this.instanceDomainEvent(\n DomainEventInstance,\n message,\n );\n\n await handler(domainEvent, this.getConsumerContext(msg));\n this.logger?.info(`${content} successfully handled.`);\n channel.ack(msg);\n } catch (error: Error | unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n this.logger?.error(`${content} error with ${errorMessage}.`);\n channel.nack(msg);\n }\n }\n\n public async areQueuesBound(): Promise<boolean> {\n if (Kernel.consumers.length === 0) {\n return false;\n }\n\n const channel = await this.channel();\n\n for (const consumer of Kernel.consumers) {\n const queueChecker = await channel.checkQueue(consumer.queueName);\n\n if (queueChecker.consumerCount !== 0) {\n return false;\n }\n }\n\n return true;\n }\n\n public async consumeDlx(\n queueName: string,\n DomainEventInstance: Constructor<DomainEvent>,\n handler: DomainEventHandler,\n messagesToRetry?: number,\n ): Promise<void> {\n const dlxQueueName = `${queueName}_dlx`;\n const channel = await this.channel(true);\n\n channel.on('error', () => {\n this.logger?.error('AMQP message bus event error');\n });\n\n const queue = await channel.checkQueue(dlxQueueName);\n const messagesToRetryCount = this.getMessagesToRetry(\n messagesToRetry,\n queue.messageCount,\n );\n\n this.logger?.info(\n `Retrying ${messagesToRetryCount} messages from DLX ${dlxQueueName}`,\n );\n\n if (messagesToRetryCount > 0 && queue.messageCount !== 0) {\n for (let index = 0; index < messagesToRetryCount; index++) {\n const msg = await channel.get(dlxQueueName);\n\n if (msg === false) {\n continue;\n }\n\n await this.retryDlxMessage(msg, DomainEventInstance, handler, channel);\n }\n\n return;\n }\n\n throw new NoFailedMessagesError(dlxQueueName);\n }\n\n public async consume(\n queueName: string,\n bindingKey: string,\n DomainEventInstance: Constructor<DomainEvent>,\n exchange: string,\n handler: DomainEventHandler,\n ): Promise<void> {\n const channel = await this.channel();\n\n await channel.assertQueue(queueName, { durable: true });\n await channel.assertExchange(exchange, 'topic');\n await channel.prefetch(1);\n await channel.bindQueue(queueName, exchange, bindingKey);\n\n const context: ConsumerContext = {\n bindingKey,\n channel,\n DomainEventInstance,\n handler,\n queueName,\n };\n\n await channel.consume(queueName, async (msg: ConsumeMessage | null) => {\n if (!msg) {\n return;\n }\n\n await this.handle(msg, context);\n channel.ack(msg);\n });\n }\n\n public async publish(domainEvents: DomainEvent[]): Promise<void> {\n const channel = await this.channel();\n\n for (const event of domainEvents) {\n await this.publisherHookPipeline.run(\n {\n domainEvent: event,\n message: {\n metadata: {\n causationId: event.getCausationId(),\n correlationId: event.getCorrelationId(),\n eventId: event.eventId,\n },\n name: event.eventName(),\n payload: event.attributes,\n },\n metadata: {\n eventId: event.eventId,\n exchange: this.exchange,\n },\n topic: event.eventName(),\n },\n () =>\n channel.publish(\n this.exchange,\n event.eventName(),\n Buffer.from(event.decode()),\n this.opts(event),\n ),\n );\n }\n }\n\n public registerPublisherHooks(...hooks: PublisherHook[]): void {\n this.publisherHookPipeline.register(...hooks);\n }\n\n public async close(): Promise<void> {\n await this.channelInstance?.close();\n await this.connection?.close();\n this.channelInstance = undefined;\n this.connection = undefined;\n }\n}\n","import dotenv, { type DotenvConfigOutput } from 'dotenv';\nimport path from 'node:path';\n\nimport type {\n ConsumerMiddleware,\n KernelConsumer,\n KernelLogger,\n KernelRoute,\n ShutdownHook,\n} from './contracts/index.js';\nimport type { ServiceClass } from './infrastructure/dependency-injection/index.js';\nimport type { Initializer, Runtime } from './infrastructure/lifecycle/index.js';\nimport type { Scheduler } from './infrastructure/scheduler/index.js';\nimport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nimport type { KernelEnvironmentForSchema } from './kernel/KernelEnvironmentForSchema.js';\nimport type { KernelEnvironmentSchema } from './kernel/KernelEnvironmentSchema.js';\nimport type { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nimport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nimport type { KernelOptions } from './kernel/KernelOptions.js';\nimport type { ShutdownCandidate } from './kernel/ShutdownCandidate.js';\n\nimport { ConsoleKernelLogger } from './adapters/kernel/index.js';\nimport { DependencyInjection } from './infrastructure/dependency-injection/index.js';\nimport { KernelEnvironmentValidationError } from './kernel/KernelEnvironmentValidationError.js';\n\nexport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nexport type { KernelDefaultEnvironment } from './kernel/KernelDefaultEnvironment.js';\nexport type { KernelEnvironment } from './kernel/KernelEnvironment.js';\nexport type { KernelEnvironmentForSchema } from './kernel/KernelEnvironmentForSchema.js';\nexport type { KernelEnvironmentSchema } from './kernel/KernelEnvironmentSchema.js';\nexport type { KernelEnvironmentSchemaInput } from './kernel/KernelEnvironmentSchemaInput.js';\nexport type { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nexport type { KernelEnvironmentVariableDefinition } from './kernel/KernelEnvironmentVariableDefinition.js';\nexport type { KernelEnvironmentVariablePrimitive } from './kernel/KernelEnvironmentVariablePrimitive.js';\nexport type { KernelEnvironmentVariableResolvedValue } from './kernel/KernelEnvironmentVariableResolvedValue.js';\nexport type { KernelEnvironmentVariableType } from './kernel/KernelEnvironmentVariableType.js';\nexport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nexport type { KernelOptions } from './kernel/KernelOptions.js';\nexport { KernelEnvironmentValidationError } from './kernel/KernelEnvironmentValidationError.js';\n\nexport class Kernel<\n TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined,\n> {\n private static readonly stateKey = Symbol.for(\n '@haskou/ddd-kernel/kernel-state',\n );\n\n private readonly consumerMiddlewares: ConsumerMiddleware[] = [];\n private readonly consumersList: KernelConsumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<KernelRoute>[] = [];\n private readonly schedulersList: Scheduler[] = [];\n private readonly shutdownHooks: ShutdownHook[] = [];\n private dependencyInjectionInstance: DependencyInjection | undefined;\n private environmentVariables =\n process.env as KernelEnvironmentForSchema<TEnvironmentSchema>;\n\n private static get state(): {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n } {\n const stateContainer = globalThis as typeof globalThis & {\n [Kernel.stateKey]?: {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n };\n };\n\n stateContainer[Kernel.stateKey] = stateContainer[Kernel.stateKey] ?? {};\n\n return stateContainer[Kernel.stateKey] as {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n };\n }\n\n public static get configDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'config');\n }\n\n public static get consumers(): KernelConsumer[] {\n return Kernel.getActiveKernel().consumers;\n }\n\n public static get consumerMiddleware(): ConsumerMiddleware[] {\n return Kernel.getActiveKernel().consumerMiddleware;\n }\n\n public static get di(): DependencyInjection {\n return Kernel.getActiveKernel().di;\n }\n\n public static get environment(): NodeJS.ProcessEnv {\n return process.env;\n }\n\n public static get logger(): KernelLogger {\n return Kernel.getActiveKernel().logger;\n }\n\n public static get active(): Kernel<KernelEnvironmentSchema | undefined> {\n return Kernel.getActiveKernel();\n }\n\n public static get rootDirectory(): string {\n return process.cwd();\n }\n\n public static get routes(): ServiceClass<KernelRoute>[] {\n return Kernel.getActiveKernel().routes;\n }\n\n public static get schedulers(): Scheduler[] {\n return Kernel.getActiveKernel().schedulers;\n }\n\n public static get sourceDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'src');\n }\n\n private static getActiveKernel(): Kernel<\n KernelEnvironmentSchema | undefined\n > {\n if (!Kernel.state.activeKernel) {\n Kernel.state.activeKernel = new Kernel();\n }\n\n return Kernel.state.activeKernel;\n }\n\n private static assertRequiredEnvironmentVariable(\n name: string,\n value: string | undefined,\n schema: KernelEnvironmentSchema,\n ): void {\n if (schema[name]?.required === true && value === undefined) {\n throw new KernelEnvironmentValidationError(\n `Missing required environment variable \"${name}\".`,\n );\n }\n }\n\n private static assertRequiredEnvironmentVariableIsNotBlank(\n name: string,\n value: string,\n schema: KernelEnvironmentSchema,\n ): void {\n if (schema[name]?.required === true && value.trim() === '') {\n throw new KernelEnvironmentValidationError(\n `Blank required environment variable \"${name}\".`,\n );\n }\n }\n\n private static assertEnvironmentVariableChoice(\n name: string,\n value: KernelEnvironmentValue,\n schema: KernelEnvironmentSchema,\n ): void {\n const choices = schema[name]?.choices;\n\n if (choices && !choices.includes(value)) {\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be one of: ${choices.join(', ')}.`,\n );\n }\n }\n\n private static getEnvironmentVariablesPath(\n environment: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n >,\n ): string {\n return path.resolve(\n Kernel.rootDirectory,\n options.path ?? (environment ? `.env.${environment}` : '.env'),\n );\n }\n\n private static parseBooleanEnvironmentVariable(\n name: string,\n value: string,\n ): boolean {\n if (['1', 'true', 'yes', 'on'].includes(value.toLowerCase())) {\n return true;\n }\n\n if (['0', 'false', 'no', 'off'].includes(value.toLowerCase())) {\n return false;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" has invalid boolean value \"${value}\".`,\n );\n }\n\n private static parseNumberEnvironmentVariable(\n name: string,\n value: string,\n ): number {\n const parsedValue = Number(value);\n\n if (Number.isFinite(parsedValue)) {\n return parsedValue;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" has invalid number value \"${value}\".`,\n );\n }\n\n private static parseEnvironmentVariable(\n name: string,\n value: string,\n schema: KernelEnvironmentSchema,\n ): KernelEnvironmentValue {\n const definition = schema[name];\n\n if (definition.type === 'boolean') {\n const parsedValue = Kernel.parseBooleanEnvironmentVariable(name, value);\n\n Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);\n\n return parsedValue;\n }\n\n if (definition.type === 'number') {\n const parsedValue = Kernel.parseNumberEnvironmentVariable(name, value);\n\n Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);\n\n return parsedValue;\n }\n\n Kernel.assertEnvironmentVariableChoice(name, value, schema);\n\n return value;\n }\n\n private static getEnvironmentVariableValue(\n name: string,\n definition: KernelEnvironmentSchema[string],\n schema: KernelEnvironmentSchema,\n ): string | undefined {\n const value = process.env[name];\n\n Kernel.assertRequiredEnvironmentVariable(name, value, schema);\n\n if (value !== undefined) {\n Kernel.assertRequiredEnvironmentVariableIsNotBlank(name, value, schema);\n }\n\n if (value !== undefined && value.trim() !== '') {\n return value;\n }\n\n return definition.defaultValue?.toString();\n }\n\n private static shouldUnsetBlankOptionalEnvironmentVariable(\n name: string,\n value: string | undefined,\n valueOrDefault: string | undefined,\n schema: KernelEnvironmentSchema,\n ): boolean {\n return (\n value !== undefined &&\n value.trim() === '' &&\n valueOrDefault === undefined &&\n schema[name]?.required !== true\n );\n }\n\n private static validateEnvironmentVariables<\n TSchema extends KernelEnvironmentSchema,\n >(schema: TSchema): KernelEnvironmentForSchema<TSchema> {\n const environmentVariables: Record<\n string,\n KernelEnvironmentValue | undefined\n > = {};\n\n for (const [name, definition] of Object.entries(schema)) {\n const value = process.env[name];\n const valueOrDefault = Kernel.getEnvironmentVariableValue(\n name,\n definition,\n schema,\n );\n\n if (valueOrDefault !== undefined) {\n environmentVariables[name] = Kernel.parseEnvironmentVariable(\n name,\n valueOrDefault,\n schema,\n );\n } else if (\n Kernel.shouldUnsetBlankOptionalEnvironmentVariable(\n name,\n value,\n valueOrDefault,\n schema,\n )\n ) {\n environmentVariables[name] = undefined;\n }\n }\n\n return {\n ...process.env,\n ...environmentVariables,\n } as KernelEnvironmentForSchema<TSchema>;\n }\n\n public static loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n > = {},\n ): DotenvConfigOutput {\n const environmentName = environment ?? process.env.NODE_ENV ?? 'local';\n\n const result = dotenv.config({\n override: options.override,\n path: Kernel.getEnvironmentVariablesPath(environmentName, options),\n });\n\n if (options.schema) {\n Kernel.validateEnvironmentVariables(options.schema);\n }\n\n return result;\n }\n\n constructor(\n private readonly options: KernelOptions<TEnvironmentSchema> = {},\n ) {\n this.loggerInstance = options.logger ?? new ConsoleKernelLogger();\n this.dependencyInjectionInstance = options.di;\n Kernel.state.activeKernel = this;\n }\n\n private async closeCandidate(candidate: ShutdownCandidate): Promise<void> {\n if (candidate.shutdown) {\n await candidate.shutdown();\n\n return;\n }\n\n if (candidate.close) {\n await candidate.close();\n\n return;\n }\n\n if (candidate.stop) {\n await candidate.stop();\n\n return;\n }\n\n if (candidate.flush) {\n await candidate.flush();\n }\n }\n\n private getConsumerFromClass(\n ClassDefinition: ServiceClass<KernelConsumer>,\n ): KernelConsumer {\n return this.di.getService<KernelConsumer>(ClassDefinition);\n }\n\n private getInitializerFromClass(\n ClassDefinition: ServiceClass<Initializer>,\n ): Initializer {\n return this.di.getService<Initializer>(ClassDefinition);\n }\n\n private getRuntimeFromClass(ClassDefinition: ServiceClass<Runtime>): Runtime {\n return this.di.getService<Runtime>(ClassDefinition);\n }\n\n private getSchedulerFromClass(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Scheduler {\n return this.di.getService<Scheduler>(ClassDefinition);\n }\n\n public get consumers(): KernelConsumer[] {\n return this.consumersList;\n }\n\n public get consumerMiddleware(): ConsumerMiddleware[] {\n return this.consumerMiddlewares;\n }\n\n public get di(): DependencyInjection {\n if (!this.dependencyInjectionInstance) {\n throw new Error('Kernel dependency injection has not been initialized.');\n }\n\n return this.dependencyInjectionInstance;\n }\n\n public get environment(): KernelEnvironmentForSchema<TEnvironmentSchema> {\n return this.environmentVariables;\n }\n\n public get logger(): KernelLogger {\n return this.loggerInstance;\n }\n\n public get routes(): ServiceClass<KernelRoute>[] {\n return this.routesList;\n }\n\n public get schedulers(): Scheduler[] {\n return this.schedulersList;\n }\n\n private getDependencyInjectionOptions(\n options: KernelDependencyInjectionOptions = {},\n ): Required<KernelDependencyInjectionOptions> {\n return {\n containerBuild:\n options.containerBuild ?? process.env.CONTAINER_BUILD === 'true',\n overrides: options.overrides ?? [],\n servicesYamlPath:\n options.servicesYamlPath ??\n this.options.servicesYamlPath ??\n path.resolve(Kernel.configDirectory, 'container', 'services.yaml'),\n sourceDirectory:\n options.sourceDirectory ??\n this.options.sourceDirectory ??\n Kernel.sourceDirectory,\n };\n }\n\n public async dependencyInjection(\n options: KernelDependencyInjectionOptions = {},\n ): Promise<void> {\n Kernel.state.activeKernel = this;\n this.dependencyInjectionInstance =\n this.dependencyInjectionInstance ??\n DependencyInjection.configure(\n this.getDependencyInjectionOptions(options),\n );\n\n await this.dependencyInjectionInstance.compile();\n Kernel.state.activeKernel = this;\n }\n\n public loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n > = {},\n ): DotenvConfigOutput {\n const result = Kernel.loadEnvironmentVariables(environment, {\n ...options,\n schema: options.schema ?? this.options.environmentSchema,\n });\n\n this.environmentVariables = this.options.environmentSchema\n ? Kernel.validateEnvironmentVariables(this.options.environmentSchema)\n : (process.env as KernelEnvironmentForSchema<TEnvironmentSchema>);\n\n return result;\n }\n\n public getRoutes(): ServiceClass<KernelRoute>[] {\n return this.routes;\n }\n\n public registerConsumerMiddleware(\n ...middlewares: ConsumerMiddleware[]\n ): void {\n this.consumerMiddlewares.push(...middlewares);\n }\n\n public registerConsumers(\n ...ClassDefinitions: ServiceClass<KernelConsumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: KernelConsumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(\n ...ClassDefinitions: ServiceClass<KernelRoute>[]\n ): void {\n this.routesList.push(...ClassDefinitions);\n }\n\n public registerSchedulers(\n ...ClassDefinitions: ServiceClass<Scheduler>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));\n }\n }\n\n public registerSchedulerInstances(...schedulers: Scheduler[]): void {\n this.schedulersList.push(...schedulers);\n }\n\n public registerShutdownHook(hook: ShutdownHook): void {\n this.shutdownHooks.push(hook);\n }\n\n public removeConsumers(): void {\n this.consumersList.length = 0;\n }\n\n public removeRoutes(): void {\n this.routesList.length = 0;\n }\n\n public removeSchedulers(): void {\n this.schedulersList.length = 0;\n }\n\n public async runConsumers(): Promise<void> {\n for (const consumer of this.consumersList) {\n await consumer.init();\n }\n }\n\n public async runInitializers(\n ...ClassDefinitions: ServiceClass<Initializer>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n await this.getInitializerFromClass(ClassDefinition).ensure();\n }\n }\n\n public async runRuntimes(\n ...ClassDefinitions: ServiceClass<Runtime>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n const runtime = this.getRuntimeFromClass(ClassDefinition);\n\n await runtime.run();\n this.registerShutdownHook(() =>\n this.closeCandidate(runtime as ShutdownCandidate),\n );\n }\n }\n\n public async runSchedulerNowAndSchedule(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Promise<void> {\n const scheduler = this.getSchedulerFromClass(ClassDefinition);\n\n await scheduler.runOnce();\n await scheduler.init();\n this.schedulersList.push(scheduler);\n }\n\n public async runSchedulers(): Promise<void> {\n for (const scheduler of this.schedulersList) {\n await scheduler.init();\n }\n }\n\n public async shutdown(): Promise<void> {\n for (const consumer of [...this.consumersList].reverse()) {\n await this.closeCandidate(consumer as ShutdownCandidate);\n }\n\n for (const scheduler of [...this.schedulersList].reverse()) {\n await this.closeCandidate(scheduler as ShutdownCandidate);\n }\n\n for (const hook of [...this.shutdownHooks].reverse()) {\n await hook();\n }\n\n await this.closeCandidate(this.loggerInstance as ShutdownCandidate);\n }\n}\n\nexport function createKernel<\n TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined,\n>(options?: KernelOptions<TEnvironmentSchema>): Kernel<TEnvironmentSchema> {\n return new Kernel(options);\n}\n\nexport default Kernel;\n","import type { KernelLogger } from '../../../contracts/index.js';\n\nexport class ConsoleKernelLogger implements KernelLogger {\n public debug(message: string): void {\n // eslint-disable-next-line no-console\n console.debug(message);\n }\n\n public error(message: string): void {\n // eslint-disable-next-line no-console\n console.error(message);\n }\n\n public info(message: string): void {\n // eslint-disable-next-line no-console\n console.info(message);\n }\n\n public warn(message: string): void {\n // eslint-disable-next-line no-console\n console.warn(message);\n }\n}\n","import type { Logger } from 'node-dependency-injection';\n\nexport class AutowireWarningFilter implements Logger {\n constructor(private readonly logger: Logger) {}\n\n private isIgnorableAutowireWarning(message: string): boolean {\n return (\n message.startsWith(\n 'Autowire: file has export default declaration but no runtime default export:',\n ) ||\n message.startsWith('Autowire: failed to create definition for undefined:')\n );\n }\n\n public warn(message?: unknown, ...optionalParams: unknown[]): void {\n if (\n typeof message === 'string' &&\n this.isIgnorableAutowireWarning(message)\n ) {\n this.logger.debug?.(`Ignored ${message}`, ...optionalParams);\n\n return;\n }\n\n this.logger.warn(message, ...optionalParams);\n }\n\n public info(message?: unknown, ...optionalParams: unknown[]): void {\n this.logger.info?.(message, ...optionalParams);\n }\n\n public debug(message?: unknown, ...optionalParams: unknown[]): void {\n this.logger.debug?.(message, ...optionalParams);\n }\n}\n","import fs from 'fs-extra';\nimport {\n Autowire,\n ContainerBuilder,\n ServiceFile,\n YamlFileLoader,\n} from 'node-dependency-injection';\nimport path from 'node:path';\n\nimport type { ServiceResolver } from '../../contracts/index.js';\nimport type { AutowireInternals } from './AutowireInternals.js';\nimport type { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\nimport type { DependencyOverride } from './DependencyOverride.js';\n\nimport { AutowireWarningFilter } from './AutowireWarningFilter.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private loader: YamlFileLoader | undefined;\n private readonly container: ContainerBuilder;\n private readonly overrideTokenIds = new Map<unknown, string>();\n\n public static configure(\n options: DependencyInjectionOptions,\n ): DependencyInjection {\n DependencyInjection.configuredInstance = new DependencyInjection(options);\n\n return DependencyInjection.configuredInstance;\n }\n\n public static get instance(): DependencyInjection {\n if (!DependencyInjection.configuredInstance) {\n throw new Error('DependencyInjection has not been configured.');\n }\n\n return DependencyInjection.configuredInstance;\n }\n\n constructor(\n private readonly options: DependencyInjectionOptions = {\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath: path.resolve(\n process.cwd(),\n 'config',\n 'container',\n 'services.yaml',\n ),\n sourceDirectory: path.resolve(process.cwd(), 'src'),\n },\n ) {\n this.container = new ContainerBuilder(false, this.options.sourceDirectory);\n }\n\n private get definitions(): Map<string, DefinitionMetadata> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._definitions || new Map();\n }\n\n private get aliases(): Map<string, string> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._alias || new Map();\n }\n\n private async ensureFolderExists(filePath: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n }\n\n private getServiceClassName(serviceName: unknown): string | undefined {\n return typeof serviceName === 'function' ? serviceName.name : undefined;\n }\n\n private getOverrideId(prefix: string, token: unknown): string {\n const tokenName = this.getServiceClassName(token) ?? String(token);\n\n return `ddd-kernel.override.${prefix}.${tokenName}`;\n }\n\n private hasDirectService(serviceName: unknown): boolean {\n return (\n typeof serviceName === 'string' &&\n (this.definitions.has(serviceName) || this.aliases.has(serviceName))\n );\n }\n\n private ensureSyntheticService(id: string, value: unknown): void {\n const definition = this.container.register(id);\n\n definition.public = true;\n definition.synthetic = true;\n this.container.set(id, value);\n }\n\n private idNamesService(id: string, serviceClassName: string): boolean {\n return path.posix.basename(id) === serviceClassName;\n }\n\n private getReferenceId(value: unknown): string | undefined {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'id' in value &&\n typeof value.id === 'string'\n ) {\n return value.id;\n }\n\n return undefined;\n }\n\n private getDefinitionArgumentReferences(\n definition: DefinitionMetadata,\n ): string[] {\n return [\n ...(definition._args ?? []),\n ...(definition._appendArgs ?? []),\n ...(definition._overrideArgs ?? []),\n ].flatMap((argument) => {\n const referenceId = this.getReferenceId(argument);\n\n return referenceId ? [referenceId] : [];\n });\n }\n\n private findConcreteChildServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.entries()]\n .filter(([, definition]) => definition._abstract !== true)\n .filter(\n ([, definition]) =>\n definition._parent &&\n this.idNamesService(definition._parent, serviceClassName),\n )\n .map(([id]) => id);\n\n return matches[matches.length - 1];\n }\n\n private findRegisteredServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.keys()].filter((id) =>\n this.idNamesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findAliasServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.aliases.keys()].filter((id) =>\n this.idNamesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findReferencedServiceIds(serviceName: unknown): string[] {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return [];\n }\n\n return [\n ...new Set(\n [...this.definitions.values()]\n .flatMap((definition) =>\n this.getDefinitionArgumentReferences(definition),\n )\n .filter((id) => this.idNamesService(id, serviceClassName)),\n ),\n ];\n }\n\n private getOverrideTokenIds(token: unknown): string[] {\n const tokenIds = [\n this.findRegisteredServiceId(token),\n this.findAliasServiceId(token),\n ...this.findReferencedServiceIds(token),\n ].filter((id): id is string => id !== undefined);\n const existingTokenIds = [...new Set(tokenIds)];\n\n if (existingTokenIds.length > 0) {\n return existingTokenIds;\n }\n\n const overrideTokenId = this.getOverrideId('token', token);\n\n this.ensureSyntheticService(overrideTokenId, undefined);\n\n return [overrideTokenId];\n }\n\n private getOverrideClassServiceId(\n ClassDefinition: new () => unknown,\n ): string {\n const registeredServiceId = this.findRegisteredServiceId(ClassDefinition);\n\n if (registeredServiceId) {\n return registeredServiceId;\n }\n\n const overrideClassId = this.getOverrideId('class', ClassDefinition);\n\n this.container.register(overrideClassId, ClassDefinition);\n\n return overrideClassId;\n }\n\n private applyClassOverride(override: DependencyOverride): void {\n if (!('useClass' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const classId = this.getOverrideClassServiceId(override.useClass);\n\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, classId);\n }\n }\n\n private applyFactoryOverride(override: DependencyOverride): void {\n if (!('useFactory' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const factoryId = this.getOverrideId('factory', override.token);\n\n this.ensureSyntheticService(factoryId, override.useFactory(this));\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, factoryId);\n }\n }\n\n private applyValueOverride(override: DependencyOverride): void {\n if (!('useValue' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const valueId = this.getOverrideId('value', override.token);\n\n this.ensureSyntheticService(valueId, override.useValue);\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, valueId);\n }\n }\n\n private applyOverrides(): void {\n for (const override of this.options.overrides ?? []) {\n this.applyClassOverride(override);\n this.applyFactoryOverride(override);\n this.applyValueOverride(override);\n }\n }\n\n private trackAutowireAliasIds(autowire: Autowire): Set<string> {\n const internals = autowire as unknown as AutowireInternals;\n const createLegacyServiceId = internals._getLegacyServiceId.bind(autowire);\n const aliasIds = new Set<string>();\n\n internals._getLegacyServiceId = async (...args) => {\n const id = await createLegacyServiceId(...args);\n\n if (!this.container.hasAlias(id) && !this.container.hasDefinition(id)) {\n aliasIds.add(id);\n }\n\n return id;\n };\n\n return aliasIds;\n }\n\n private async processAutowire(autowire: Autowire): Promise<void> {\n const previousLogger = this.container.logger;\n const autowireAliasIds = this.trackAutowireAliasIds(autowire);\n\n this.container.logger = new AutowireWarningFilter(previousLogger);\n\n try {\n await autowire.process();\n } finally {\n this.container.logger = previousLogger;\n }\n\n for (const id of autowireAliasIds) {\n this.aliases.delete(id);\n }\n }\n\n private registerParentAliases(): void {\n for (const [id, definition] of this.definitions.entries()) {\n if (definition._abstract === true || !definition._parent) {\n continue;\n }\n\n this.container.setAlias(definition._parent, id);\n }\n }\n\n public async compile(): Promise<void> {\n if (this.options.containerBuild) {\n await this.ensureFolderExists(this.options.servicesYamlPath);\n const autowire = new Autowire(this.container);\n\n autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.processAutowire(autowire);\n } else {\n this.loader = new YamlFileLoader(this.container);\n await this.loader.load(this.options.servicesYamlPath);\n }\n\n this.registerParentAliases();\n this.applyOverrides();\n await this.container.compile();\n }\n\n public getService<T>(serviceName: unknown): T {\n const overrideTokenId = this.overrideTokenIds.get(serviceName);\n\n if (overrideTokenId) {\n return this.container.get<T>(overrideTokenId);\n }\n\n const aliasServiceId = this.findAliasServiceId(serviceName);\n\n if (aliasServiceId) {\n return this.container.get<T>(aliasServiceId);\n }\n\n const childServiceId = this.findConcreteChildServiceId(serviceName);\n\n if (childServiceId) {\n return this.container.get<T>(childServiceId);\n }\n\n const registeredServiceId = this.findRegisteredServiceId(serviceName);\n\n if (registeredServiceId) {\n return this.container.get<T>(registeredServiceId);\n }\n\n // NDI 4 types only string IDs, but still resolves constructors and validates other tokens at runtime.\n return this.container.get<T>(serviceName as string);\n }\n\n public hasService(serviceName: unknown): boolean {\n return (\n this.overrideTokenIds.has(serviceName) ||\n this.findAliasServiceId(serviceName) !== undefined ||\n this.findConcreteChildServiceId(serviceName) !== undefined ||\n this.findRegisteredServiceId(serviceName) !== undefined ||\n this.hasDirectService(serviceName)\n );\n }\n}\n\nexport default DependencyInjection;\n","export class KernelEnvironmentValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'KernelEnvironmentValidationError';\n }\n}\n","import type {\n PublishContext,\n PublisherHookErrorPolicy,\n} from '../../contracts/index.js';\n\nexport class DefaultPublisherHookErrorPolicy implements PublisherHookErrorPolicy {\n public handleAfterPublishError(\n error: unknown,\n context: PublishContext,\n ): void {\n void error;\n void context;\n }\n\n public shouldFailAfterPublish(\n error: unknown,\n context: PublishContext,\n ): boolean {\n void error;\n void context;\n\n return false;\n }\n}\n\nexport default DefaultPublisherHookErrorPolicy;\n","import type {\n PublishContext,\n PublisherHook,\n PublisherHookErrorPolicy,\n} from '../../contracts/index.js';\n\nimport { DefaultPublisherHookErrorPolicy } from './DefaultPublisherHookErrorPolicy.js';\n\nexport class PublisherHookPipeline {\n private readonly hooks: PublisherHook[] = [];\n\n constructor(\n hooks: readonly PublisherHook[] = [],\n private readonly errorPolicy: PublisherHookErrorPolicy = new DefaultPublisherHookErrorPolicy(),\n ) {\n this.hooks.push(...hooks);\n }\n\n private async runAfterPublishHooks(context: PublishContext): Promise<void> {\n for (const hook of this.hooks) {\n await this.runAfterPublishHook(hook, context);\n }\n }\n\n private async runAfterPublishHook(\n hook: PublisherHook,\n context: PublishContext,\n ): Promise<void> {\n try {\n await hook.afterPublish?.(context);\n } catch (error: unknown) {\n await this.errorPolicy.handleAfterPublishError(error, context);\n\n if (this.errorPolicy.shouldFailAfterPublish(error, context)) {\n throw error;\n }\n }\n }\n\n private async runBeforePublishHooks(context: PublishContext): Promise<void> {\n for (const hook of this.hooks) {\n await hook.beforePublish?.(context);\n }\n }\n\n private async runPublishErrorHooks(\n error: unknown,\n context: PublishContext,\n ): Promise<void> {\n for (const hook of this.hooks) {\n await hook.onPublishError?.(error, context);\n }\n }\n\n public register(...hooks: PublisherHook[]): void {\n this.hooks.push(...hooks);\n }\n\n public async run<T>(\n context: PublishContext,\n publish: () => Promise<T> | T,\n ): Promise<T> {\n await this.runBeforePublishHooks(context);\n\n try {\n const result = await publish();\n\n await this.runAfterPublishHooks(context);\n\n return result;\n } catch (error: unknown) {\n await this.runPublishErrorHooks(error, context);\n\n throw error;\n }\n }\n}\n","export class InvalidDomainEventError extends Error {\n constructor(message: string) {\n super(`Invalid domain event: ${message}`);\n this.name = 'InvalidDomainEventError';\n }\n}\n","export class NoFailedMessagesError extends Error {\n constructor(queueName: string) {\n super(`No failed messages found in \"${queueName}\".`);\n this.name = 'NoFailedMessagesError';\n }\n}\n"],"mappings":"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","names":["import_node_path","path","fs","path","dotenv","amqplib"]}
@@ -73,7 +73,6 @@ var DependencyInjection = class _DependencyInjection {
73
73
  }
74
74
  options;
75
75
  static configuredInstance;
76
- autowire;
77
76
  loader;
78
77
  container;
79
78
  overrideTokenIds = /* @__PURE__ */ new Map();
@@ -114,20 +113,8 @@ var DependencyInjection = class _DependencyInjection {
114
113
  definition.synthetic = true;
115
114
  this.container.set(id, value);
116
115
  }
117
- parentMatchesService(parentId, serviceClassName) {
118
- if (!parentId) {
119
- return false;
120
- }
121
- const parentName = Buffer.from(parentId, "base64").toString("utf8");
122
- return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);
123
- }
124
- serviceIdMatchesService(serviceId, serviceClassName) {
125
- const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
126
- return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);
127
- }
128
- serviceIdReferencesService(serviceId, serviceClassName) {
129
- const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
130
- return serviceName.endsWith(`__${serviceClassName}`);
116
+ idNamesService(id, serviceClassName) {
117
+ return path.posix.basename(id) === serviceClassName;
131
118
  }
132
119
  getReferenceId(value) {
133
120
  if (typeof value === "object" && value !== null && "id" in value && typeof value.id === "string") {
@@ -151,7 +138,7 @@ var DependencyInjection = class _DependencyInjection {
151
138
  return void 0;
152
139
  }
153
140
  const matches = [...this.definitions.entries()].filter(([, definition]) => definition._abstract !== true).filter(
154
- ([, definition]) => this.parentMatchesService(definition._parent, serviceClassName)
141
+ ([, definition]) => definition._parent && this.idNamesService(definition._parent, serviceClassName)
155
142
  ).map(([id]) => id);
156
143
  return matches[matches.length - 1];
157
144
  }
@@ -161,7 +148,7 @@ var DependencyInjection = class _DependencyInjection {
161
148
  return void 0;
162
149
  }
163
150
  const matches = [...this.definitions.keys()].filter(
164
- (id) => this.serviceIdMatchesService(id, serviceClassName)
151
+ (id) => this.idNamesService(id, serviceClassName)
165
152
  );
166
153
  return matches[matches.length - 1];
167
154
  }
@@ -171,7 +158,7 @@ var DependencyInjection = class _DependencyInjection {
171
158
  return void 0;
172
159
  }
173
160
  const matches = [...this.aliases.keys()].filter(
174
- (id) => this.serviceIdMatchesService(id, serviceClassName)
161
+ (id) => this.idNamesService(id, serviceClassName)
175
162
  );
176
163
  return matches[matches.length - 1];
177
164
  }
@@ -184,9 +171,7 @@ var DependencyInjection = class _DependencyInjection {
184
171
  ...new Set(
185
172
  [...this.definitions.values()].flatMap(
186
173
  (definition) => this.getDefinitionArgumentReferences(definition)
187
- ).filter(
188
- (id) => this.serviceIdReferencesService(id, serviceClassName)
189
- )
174
+ ).filter((id) => this.idNamesService(id, serviceClassName))
190
175
  )
191
176
  ];
192
177
  }
@@ -255,14 +240,31 @@ var DependencyInjection = class _DependencyInjection {
255
240
  this.applyValueOverride(override);
256
241
  }
257
242
  }
258
- async processAutowire() {
243
+ trackAutowireAliasIds(autowire) {
244
+ const internals = autowire;
245
+ const createLegacyServiceId = internals._getLegacyServiceId.bind(autowire);
246
+ const aliasIds = /* @__PURE__ */ new Set();
247
+ internals._getLegacyServiceId = async (...args) => {
248
+ const id = await createLegacyServiceId(...args);
249
+ if (!this.container.hasAlias(id) && !this.container.hasDefinition(id)) {
250
+ aliasIds.add(id);
251
+ }
252
+ return id;
253
+ };
254
+ return aliasIds;
255
+ }
256
+ async processAutowire(autowire) {
259
257
  const previousLogger = this.container.logger;
258
+ const autowireAliasIds = this.trackAutowireAliasIds(autowire);
260
259
  this.container.logger = new AutowireWarningFilter(previousLogger);
261
260
  try {
262
- await this.autowire?.process();
261
+ await autowire.process();
263
262
  } finally {
264
263
  this.container.logger = previousLogger;
265
264
  }
265
+ for (const id of autowireAliasIds) {
266
+ this.aliases.delete(id);
267
+ }
266
268
  }
267
269
  registerParentAliases() {
268
270
  for (const [id, definition] of this.definitions.entries()) {
@@ -275,13 +277,12 @@ var DependencyInjection = class _DependencyInjection {
275
277
  async compile() {
276
278
  if (this.options.containerBuild) {
277
279
  await this.ensureFolderExists(this.options.servicesYamlPath);
278
- this.autowire = new Autowire(this.container);
279
- this.autowire.makeIdLegacy();
280
- this.autowire.serviceFile = new ServiceFile(
280
+ const autowire = new Autowire(this.container);
281
+ autowire.serviceFile = new ServiceFile(
281
282
  this.options.servicesYamlPath,
282
283
  false
283
284
  );
284
- await this.processAutowire();
285
+ await this.processAutowire(autowire);
285
286
  } else {
286
287
  this.loader = new YamlFileLoader(this.container);
287
288
  await this.loader.load(this.options.servicesYamlPath);