@haskou/ddd-kernel 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{RetryPredicate-DNdxY_KR.d.cts → RetryPredicate-BFGD3FUP.d.cts} +1 -1
- package/dist/{RetryPredicate-CD9n6cE8.d.ts → RetryPredicate-CuL59f8-.d.ts} +1 -1
- package/dist/{ServiceClass-BkEHcXDi.d.cts → ServiceClass-Cv5KbUSf.d.cts} +1 -0
- package/dist/{ServiceClass-Bq_fBC5R.d.ts → ServiceClass-DXDAxvao.d.ts} +1 -0
- package/dist/{ShutdownHook-D23WfIIc.d.cts → ShutdownHook-6-YKfmzG.d.cts} +4 -1
- package/dist/{ShutdownHook-CUl7zYwd.d.ts → ShutdownHook-dvsrwsQi.d.ts} +4 -1
- package/dist/adapters/index.cjs +74 -12
- package/dist/adapters/index.cjs.map +1 -1
- package/dist/adapters/index.d.cts +3 -3
- package/dist/adapters/index.d.ts +3 -3
- package/dist/adapters/index.js +74 -12
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/pubsub/amqp/index.cjs +74 -12
- package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
- package/dist/adapters/pubsub/amqp/index.js +74 -12
- package/dist/adapters/pubsub/amqp/index.js.map +1 -1
- package/dist/adapters/pubsub/index.cjs +74 -12
- package/dist/adapters/pubsub/index.cjs.map +1 -1
- package/dist/adapters/pubsub/index.d.cts +3 -3
- package/dist/adapters/pubsub/index.d.ts +3 -3
- package/dist/adapters/pubsub/index.js +74 -12
- package/dist/adapters/pubsub/index.js.map +1 -1
- package/dist/adapters/ui/express/index.d.cts +2 -2
- package/dist/adapters/ui/express/index.d.ts +2 -2
- package/dist/adapters/ui/index.cjs +74 -12
- package/dist/adapters/ui/index.cjs.map +1 -1
- package/dist/adapters/ui/index.d.cts +2 -2
- package/dist/adapters/ui/index.d.ts +2 -2
- package/dist/adapters/ui/index.js +74 -12
- package/dist/adapters/ui/index.js.map +1 -1
- package/dist/adapters/ui/routes/index.cjs +74 -12
- package/dist/adapters/ui/routes/index.cjs.map +1 -1
- package/dist/adapters/ui/routes/index.js +74 -12
- package/dist/adapters/ui/routes/index.js.map +1 -1
- package/dist/contracts/index.d.cts +3 -3
- package/dist/contracts/index.d.ts +3 -3
- package/dist/contracts/kernel/index.d.cts +3 -3
- package/dist/contracts/kernel/index.d.ts +3 -3
- package/dist/index.cjs +74 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +74 -12
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/dependency-injection/index.cjs +38 -1
- package/dist/infrastructure/dependency-injection/index.cjs.map +1 -1
- package/dist/infrastructure/dependency-injection/index.d.cts +12 -2
- package/dist/infrastructure/dependency-injection/index.d.ts +12 -2
- package/dist/infrastructure/dependency-injection/index.js +37 -1
- package/dist/infrastructure/dependency-injection/index.js.map +1 -1
- package/dist/infrastructure/express/index.d.cts +2 -2
- package/dist/infrastructure/express/index.d.ts +2 -2
- package/dist/infrastructure/scheduler/index.cjs +74 -12
- package/dist/infrastructure/scheduler/index.cjs.map +1 -1
- package/dist/infrastructure/scheduler/index.js +74 -12
- package/dist/infrastructure/scheduler/index.js.map +1 -1
- package/package.json +4 -3
|
@@ -60,6 +60,32 @@ var ConsoleKernelLogger = class {
|
|
|
60
60
|
}
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
+
// src/infrastructure/dependency-injection/AutowireWarningFilter.ts
|
|
64
|
+
var AutowireWarningFilter = class {
|
|
65
|
+
constructor(logger) {
|
|
66
|
+
this.logger = logger;
|
|
67
|
+
}
|
|
68
|
+
logger;
|
|
69
|
+
isIgnorableAutowireWarning(message) {
|
|
70
|
+
return message.startsWith(
|
|
71
|
+
"Autowire: file has export default declaration but no runtime default export:"
|
|
72
|
+
) || message.startsWith("Autowire: failed to create definition for undefined:");
|
|
73
|
+
}
|
|
74
|
+
warn(message, ...optionalParams) {
|
|
75
|
+
if (typeof message === "string" && this.isIgnorableAutowireWarning(message)) {
|
|
76
|
+
this.logger.debug?.(`Ignored ${message}`, ...optionalParams);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
this.logger.warn(message, ...optionalParams);
|
|
80
|
+
}
|
|
81
|
+
info(message, ...optionalParams) {
|
|
82
|
+
this.logger.info?.(message, ...optionalParams);
|
|
83
|
+
}
|
|
84
|
+
debug(message, ...optionalParams) {
|
|
85
|
+
this.logger.debug?.(message, ...optionalParams);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
63
89
|
// src/infrastructure/dependency-injection/DependencyInjection.ts
|
|
64
90
|
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
65
91
|
var import_node_dependency_injection = require("node-dependency-injection");
|
|
@@ -259,6 +285,15 @@ var DependencyInjection = class _DependencyInjection {
|
|
|
259
285
|
this.applyValueOverride(override);
|
|
260
286
|
}
|
|
261
287
|
}
|
|
288
|
+
async processAutowire() {
|
|
289
|
+
const previousLogger = this.container.logger;
|
|
290
|
+
this.container.logger = new AutowireWarningFilter(previousLogger);
|
|
291
|
+
try {
|
|
292
|
+
await this.autowire?.process();
|
|
293
|
+
} finally {
|
|
294
|
+
this.container.logger = previousLogger;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
262
297
|
registerParentAliases() {
|
|
263
298
|
for (const [id, definition] of this.definitions.entries()) {
|
|
264
299
|
if (definition._abstract === true || !definition._parent) {
|
|
@@ -275,7 +310,7 @@ var DependencyInjection = class _DependencyInjection {
|
|
|
275
310
|
this.options.servicesYamlPath,
|
|
276
311
|
false
|
|
277
312
|
);
|
|
278
|
-
await this.
|
|
313
|
+
await this.processAutowire();
|
|
279
314
|
} else {
|
|
280
315
|
this.loader = new import_node_dependency_injection.YamlFileLoader(this.container);
|
|
281
316
|
await this.loader.load(this.options.servicesYamlPath);
|
|
@@ -384,6 +419,13 @@ var Kernel = class _Kernel {
|
|
|
384
419
|
);
|
|
385
420
|
}
|
|
386
421
|
}
|
|
422
|
+
static assertRequiredEnvironmentVariableIsNotBlank(name, value, schema) {
|
|
423
|
+
if (schema[name]?.required === true && value.trim() === "") {
|
|
424
|
+
throw new KernelEnvironmentValidationError(
|
|
425
|
+
`Blank required environment variable "${name}".`
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
387
429
|
static assertEnvironmentVariableChoice(name, value, schema) {
|
|
388
430
|
const choices = schema[name]?.choices;
|
|
389
431
|
if (choices && !choices.includes(value)) {
|
|
@@ -406,21 +448,16 @@ var Kernel = class _Kernel {
|
|
|
406
448
|
return false;
|
|
407
449
|
}
|
|
408
450
|
throw new KernelEnvironmentValidationError(
|
|
409
|
-
`Environment variable "${name}"
|
|
451
|
+
`Environment variable "${name}" has invalid boolean value "${value}".`
|
|
410
452
|
);
|
|
411
453
|
}
|
|
412
454
|
static parseNumberEnvironmentVariable(name, value) {
|
|
413
|
-
if (value.trim() === "") {
|
|
414
|
-
throw new KernelEnvironmentValidationError(
|
|
415
|
-
`Environment variable "${name}" must be a number.`
|
|
416
|
-
);
|
|
417
|
-
}
|
|
418
455
|
const parsedValue = Number(value);
|
|
419
456
|
if (Number.isFinite(parsedValue)) {
|
|
420
457
|
return parsedValue;
|
|
421
458
|
}
|
|
422
459
|
throw new KernelEnvironmentValidationError(
|
|
423
|
-
`Environment variable "${name}"
|
|
460
|
+
`Environment variable "${name}" has invalid number value "${value}".`
|
|
424
461
|
);
|
|
425
462
|
}
|
|
426
463
|
static parseEnvironmentVariable(name, value, schema) {
|
|
@@ -438,17 +475,42 @@ var Kernel = class _Kernel {
|
|
|
438
475
|
_Kernel.assertEnvironmentVariableChoice(name, value, schema);
|
|
439
476
|
return value;
|
|
440
477
|
}
|
|
478
|
+
static getEnvironmentVariableValue(name, definition, schema) {
|
|
479
|
+
const value = process.env[name];
|
|
480
|
+
_Kernel.assertRequiredEnvironmentVariable(name, value, schema);
|
|
481
|
+
if (value !== void 0) {
|
|
482
|
+
_Kernel.assertRequiredEnvironmentVariableIsNotBlank(name, value, schema);
|
|
483
|
+
}
|
|
484
|
+
if (value !== void 0 && value.trim() !== "") {
|
|
485
|
+
return value;
|
|
486
|
+
}
|
|
487
|
+
return definition.defaultValue?.toString();
|
|
488
|
+
}
|
|
489
|
+
static shouldUnsetBlankOptionalEnvironmentVariable(name, value, valueOrDefault, schema) {
|
|
490
|
+
return value !== void 0 && value.trim() === "" && valueOrDefault === void 0 && schema[name]?.required !== true;
|
|
491
|
+
}
|
|
441
492
|
static validateEnvironmentVariables(schema) {
|
|
442
493
|
const environmentVariables = {};
|
|
443
494
|
for (const [name, definition] of Object.entries(schema)) {
|
|
444
|
-
const value = process.env[name]
|
|
445
|
-
_Kernel.
|
|
446
|
-
|
|
495
|
+
const value = process.env[name];
|
|
496
|
+
const valueOrDefault = _Kernel.getEnvironmentVariableValue(
|
|
497
|
+
name,
|
|
498
|
+
definition,
|
|
499
|
+
schema
|
|
500
|
+
);
|
|
501
|
+
if (valueOrDefault !== void 0) {
|
|
447
502
|
environmentVariables[name] = _Kernel.parseEnvironmentVariable(
|
|
448
503
|
name,
|
|
449
|
-
|
|
504
|
+
valueOrDefault,
|
|
450
505
|
schema
|
|
451
506
|
);
|
|
507
|
+
} else if (_Kernel.shouldUnsetBlankOptionalEnvironmentVariable(
|
|
508
|
+
name,
|
|
509
|
+
value,
|
|
510
|
+
valueOrDefault,
|
|
511
|
+
schema
|
|
512
|
+
)) {
|
|
513
|
+
environmentVariables[name] = void 0;
|
|
452
514
|
}
|
|
453
515
|
}
|
|
454
516
|
return {
|
|
@@ -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/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 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}\" must be a boolean.`,\n );\n }\n\n private static parseNumberEnvironmentVariable(\n name: string,\n value: string,\n ): number {\n if (value.trim() === '') {\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be a number.`,\n );\n }\n\n const parsedValue = Number(value);\n\n if (Number.isFinite(parsedValue)) {\n return parsedValue;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be a number.`,\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 validateEnvironmentVariables<\n TSchema extends KernelEnvironmentSchema,\n >(schema: TSchema): KernelEnvironmentForSchema<TSchema> {\n const environmentVariables: Record<string, KernelEnvironmentValue> = {};\n\n for (const [name, definition] of Object.entries(schema)) {\n const value = process.env[name] ?? definition.defaultValue?.toString();\n\n Kernel.assertRequiredEnvironmentVariable(name, value, schema);\n\n if (value !== undefined) {\n environmentVariables[name] = Kernel.parseEnvironmentVariable(\n name,\n value,\n schema,\n );\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 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\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 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 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.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.autowire.process();\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 return this.container.get<T>(serviceName);\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,qBAOO;AACP,yBAA2B;;;ACR3B,oBAAgD;AAChD,IAAAA,oBAAiB;;;ACCV,IAAM,sBAAN,MAAkD;AAAA,EAChD,MAAM,SAAuB;AAElC,YAAQ,MAAM,OAAO;AAAA,EACvB;AAAA,EAEO,MAAM,SAAuB;AAElC,YAAQ,MAAM,OAAO;AAAA,EACvB;AAAA,EAEO,KAAK,SAAuB;AAEjC,YAAQ,KAAK,OAAO;AAAA,EACtB;AAAA,EAEO,KAAK,SAAuB;AAEjC,YAAQ,KAAK,OAAO;AAAA,EACtB;AACF;;;ACtBA,sBAAe;AACf,uCAKO;AACP,uBAAiB;AAQV,IAAM,sBAAN,MAAM,qBAA+C;AAAA,EAuB1D,YACmB,UAAsC;AAAA,IACrD,gBAAgB,QAAQ,IAAI,oBAAoB;AAAA,IAChD,kBAAkB,iBAAAC,QAAK;AAAA,MACrB,QAAQ,IAAI;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,iBAAAA,QAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK;AAAA,EACpD,GACA;AAViB;AAWjB,SAAK,YAAY,IAAI,kDAAiB,OAAO,KAAK,QAAQ,eAAe;AAAA,EAC3E;AAAA,EAZmB;AAAA,EAvBnB,OAAe;AAAA,EACP;AAAA,EACA;AAAA,EACS;AAAA,EACA,mBAAmB,oBAAI,IAAqB;AAAA,EAE7D,OAAc,UACZ,SACqB;AACrB,yBAAoB,qBAAqB,IAAI,qBAAoB,OAAO;AAExE,WAAO,qBAAoB;AAAA,EAC7B;AAAA,EAEA,WAAkB,WAAgC;AAChD,QAAI,CAAC,qBAAoB,oBAAoB;AAC3C,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,WAAO,qBAAoB;AAAA,EAC7B;AAAA,EAiBA,IAAY,cAA+C;AACzD,UAAM,YAAY,KAAK;AAEvB,WAAO,UAAU,gBAAgB,oBAAI,IAAI;AAAA,EAC3C;AAAA,EAEA,IAAY,UAA+B;AACzC,UAAM,YAAY,KAAK;AAEvB,WAAO,UAAU,UAAU,oBAAI,IAAI;AAAA,EACrC;AAAA,EAEA,MAAc,mBAAmB,UAAiC;AAChE,UAAM,gBAAAC,QAAG,MAAM,iBAAAD,QAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEQ,oBAAoB,aAA0C;AACpE,WAAO,OAAO,gBAAgB,aAAa,YAAY,OAAO;AAAA,EAChE;AAAA,EAEQ,cAAc,QAAgB,OAAwB;AAC5D,UAAM,YAAY,KAAK,oBAAoB,KAAK,KAAK,OAAO,KAAK;AAEjE,WAAO,uBAAuB,MAAM,IAAI,SAAS;AAAA,EACnD;AAAA,EAEQ,uBAAuB,IAAY,OAAsB;AAC/D,UAAM,aAAa,KAAK,UAAU,SAAS,EAAE;AAE7C,eAAW,SAAS;AACpB,eAAW,YAAY;AACvB,SAAK,UAAU,IAAI,IAAI,KAAK;AAAA,EAC9B;AAAA,EAEQ,qBACN,UACA,kBACS;AACT,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,OAAO,KAAK,UAAU,QAAQ,EAAE,SAAS,MAAM;AAElE,WAAO,WAAW,SAAS,KAAK,gBAAgB,KAAK,gBAAgB,EAAE;AAAA,EACzE;AAAA,EAEQ,wBACN,WACA,kBACS;AACT,UAAM,cAAc,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,MAAM;AAEpE,WAAO,YAAY,SAAS,KAAK,gBAAgB,KAAK,gBAAgB,EAAE;AAAA,EAC1E;AAAA,EAEQ,2BACN,WACA,kBACS;AACT,UAAM,cAAc,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,MAAM;AAEpE,WAAO,YAAY,SAAS,KAAK,gBAAgB,EAAE;AAAA,EACrD;AAAA,EAEQ,eAAe,OAAoC;AACzD,QACE,OAAO,UAAU,YACjB,UAAU,QACV,QAAQ,SACR,OAAO,MAAM,OAAO,UACpB;AACA,aAAO,MAAM;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gCACN,YACU;AACV,WAAO;AAAA,MACL,GAAI,WAAW,SAAS,CAAC;AAAA,MACzB,GAAI,WAAW,eAAe,CAAC;AAAA,MAC/B,GAAI,WAAW,iBAAiB,CAAC;AAAA,IACnC,EAAE,QAAQ,CAAC,aAAa;AACtB,YAAM,cAAc,KAAK,eAAe,QAAQ;AAEhD,aAAO,cAAc,CAAC,WAAW,IAAI,CAAC;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEQ,2BAA2B,aAA0C;AAC3E,UAAM,mBAAmB,KAAK,oBAAoB,WAAW;AAE7D,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,CAAC,GAAG,KAAK,YAAY,QAAQ,CAAC,EAC3C,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM,WAAW,cAAc,IAAI,EACxD;AAAA,MAAO,CAAC,CAAC,EAAE,UAAU,MACpB,KAAK,qBAAqB,WAAW,SAAS,gBAAgB;AAAA,IAChE,EACC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE;AAEnB,WAAO,QAAQ,QAAQ,SAAS,CAAC;AAAA,EACnC;AAAA,EAEQ,wBAAwB,aAA0C;AACxE,UAAM,mBAAmB,KAAK,oBAAoB,WAAW;AAE7D,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,EAAE;AAAA,MAAO,CAAC,OACnD,KAAK,wBAAwB,IAAI,gBAAgB;AAAA,IACnD;AAEA,WAAO,QAAQ,QAAQ,SAAS,CAAC;AAAA,EACnC;AAAA,EAEQ,mBAAmB,aAA0C;AACnE,UAAM,mBAAmB,KAAK,oBAAoB,WAAW;AAE7D,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC,EAAE;AAAA,MAAO,CAAC,OAC/C,KAAK,wBAAwB,IAAI,gBAAgB;AAAA,IACnD;AAEA,WAAO,QAAQ,QAAQ,SAAS,CAAC;AAAA,EACnC;AAAA,EAEQ,yBAAyB,aAAgC;AAC/D,UAAM,mBAAmB,KAAK,oBAAoB,WAAW;AAE7D,QAAI,CAAC,kBAAkB;AACrB,aAAO,CAAC;AAAA,IACV;AAEA,WAAO;AAAA,MACL,GAAG,IAAI;AAAA,QACL,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC,EAC1B;AAAA,UAAQ,CAAC,eACR,KAAK,gCAAgC,UAAU;AAAA,QACjD,EACC;AAAA,UAAO,CAAC,OACP,KAAK,2BAA2B,IAAI,gBAAgB;AAAA,QACtD;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,OAA0B;AACpD,UAAM,WAAW;AAAA,MACf,KAAK,wBAAwB,KAAK;AAAA,MAClC,KAAK,mBAAmB,KAAK;AAAA,MAC7B,GAAG,KAAK,yBAAyB,KAAK;AAAA,IACxC,EAAE,OAAO,CAAC,OAAqB,OAAO,MAAS;AAC/C,UAAM,mBAAmB,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAE9C,QAAI,iBAAiB,SAAS,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,KAAK,cAAc,SAAS,KAAK;AAEzD,SAAK,uBAAuB,iBAAiB,MAAS;AAEtD,WAAO,CAAC,eAAe;AAAA,EACzB;AAAA,EAEQ,0BACN,iBACQ;AACR,UAAM,sBAAsB,KAAK,wBAAwB,eAAe;AAExE,QAAI,qBAAqB;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,KAAK,cAAc,SAAS,eAAe;AAEnE,SAAK,UAAU,SAAS,iBAAiB,eAAe;AAExD,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,UAAoC;AAC7D,QAAI,EAAE,cAAc,WAAW;AAC7B;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,oBAAoB,SAAS,KAAK;AACxD,UAAM,UAAU,KAAK,0BAA0B,SAAS,QAAQ;AAEhE,SAAK,iBAAiB,IAAI,SAAS,OAAO,SAAS,CAAC,CAAC;AACrD,eAAW,WAAW,UAAU;AAC9B,WAAK,UAAU,SAAS,SAAS,OAAO;AAAA,IAC1C;AAAA,EACF;AAAA,EAEQ,qBAAqB,UAAoC;AAC/D,QAAI,EAAE,gBAAgB,WAAW;AAC/B;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,oBAAoB,SAAS,KAAK;AACxD,UAAM,YAAY,KAAK,cAAc,WAAW,SAAS,KAAK;AAE9D,SAAK,uBAAuB,WAAW,SAAS,WAAW,IAAI,CAAC;AAChE,SAAK,iBAAiB,IAAI,SAAS,OAAO,SAAS,CAAC,CAAC;AACrD,eAAW,WAAW,UAAU;AAC9B,WAAK,UAAU,SAAS,SAAS,SAAS;AAAA,IAC5C;AAAA,EACF;AAAA,EAEQ,mBAAmB,UAAoC;AAC7D,QAAI,EAAE,cAAc,WAAW;AAC7B;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,oBAAoB,SAAS,KAAK;AACxD,UAAM,UAAU,KAAK,cAAc,SAAS,SAAS,KAAK;AAE1D,SAAK,uBAAuB,SAAS,SAAS,QAAQ;AACtD,SAAK,iBAAiB,IAAI,SAAS,OAAO,SAAS,CAAC,CAAC;AACrD,eAAW,WAAW,UAAU;AAC9B,WAAK,UAAU,SAAS,SAAS,OAAO;AAAA,IAC1C;AAAA,EACF;AAAA,EAEQ,iBAAuB;AAC7B,eAAW,YAAY,KAAK,QAAQ,aAAa,CAAC,GAAG;AACnD,WAAK,mBAAmB,QAAQ;AAChC,WAAK,qBAAqB,QAAQ;AAClC,WAAK,mBAAmB,QAAQ;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,wBAA8B;AACpC,eAAW,CAAC,IAAI,UAAU,KAAK,KAAK,YAAY,QAAQ,GAAG;AACzD,UAAI,WAAW,cAAc,QAAQ,CAAC,WAAW,SAAS;AACxD;AAAA,MACF;AAEA,WAAK,UAAU,SAAS,WAAW,SAAS,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAa,UAAyB;AACpC,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,YAAM,KAAK,mBAAmB,KAAK,QAAQ,gBAAgB;AAC3D,WAAK,WAAW,IAAI,0CAAS,KAAK,SAAS;AAC3C,WAAK,SAAS,cAAc,IAAI;AAAA,QAC9B,KAAK,QAAQ;AAAA,QACb;AAAA,MACF;AACA,YAAM,KAAK,SAAS,QAAQ;AAAA,IAC9B,OAAO;AACL,WAAK,SAAS,IAAI,gDAAe,KAAK,SAAS;AAC/C,YAAM,KAAK,OAAO,KAAK,KAAK,QAAQ,gBAAgB;AAAA,IACtD;AAEA,SAAK,sBAAsB;AAC3B,SAAK,eAAe;AACpB,UAAM,KAAK,UAAU,QAAQ;AAAA,EAC/B;AAAA,EAEO,WAAc,aAAyB;AAC5C,UAAM,kBAAkB,KAAK,iBAAiB,IAAI,WAAW;AAE7D,QAAI,iBAAiB;AACnB,aAAO,KAAK,UAAU,IAAO,eAAe;AAAA,IAC9C;AAEA,UAAM,iBAAiB,KAAK,mBAAmB,WAAW;AAE1D,QAAI,gBAAgB;AAClB,aAAO,KAAK,UAAU,IAAO,cAAc;AAAA,IAC7C;AAEA,UAAM,iBAAiB,KAAK,2BAA2B,WAAW;AAElE,QAAI,gBAAgB;AAClB,aAAO,KAAK,UAAU,IAAO,cAAc;AAAA,IAC7C;AAEA,UAAM,sBAAsB,KAAK,wBAAwB,WAAW;AAEpE,QAAI,qBAAqB;AACvB,aAAO,KAAK,UAAU,IAAO,mBAAmB;AAAA,IAClD;AAEA,WAAO,KAAK,UAAU,IAAO,WAAW;AAAA,EAC1C;AACF;;;ACjWO,IAAM,mCAAN,cAA+C,MAAM;AAAA,EAC1D,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;AHmCO,IAAM,SAAN,MAAM,QAEX;AAAA,EA0OA,YACmB,UAA6C,CAAC,GAC/D;AADiB;AAEjB,SAAK,iBAAiB,QAAQ,UAAU,IAAI,oBAAoB;AAChE,SAAK,8BAA8B,QAAQ;AAC3C,YAAO,MAAM,eAAe;AAAA,EAC9B;AAAA,EALmB;AAAA,EA1OnB,OAAwB,WAAW,uBAAO;AAAA,IACxC;AAAA,EACF;AAAA,EAEiB,sBAA4C,CAAC;AAAA,EAC7C,gBAAkC,CAAC;AAAA,EACnC;AAAA,EACA,aAA0C,CAAC;AAAA,EAC3C,iBAA8B,CAAC;AAAA,EAC/B,gBAAgC,CAAC;AAAA,EAC1C;AAAA,EACA,uBACN,QAAQ;AAAA,EAEV,WAAmB,QAEjB;AACA,UAAM,iBAAiB;AAMvB,mBAAe,QAAO,QAAQ,IAAI,eAAe,QAAO,QAAQ,KAAK,CAAC;AAEtE,WAAO,eAAe,QAAO,QAAQ;AAAA,EAGvC;AAAA,EAEA,WAAkB,kBAA0B;AAC1C,WAAO,kBAAAE,QAAK,QAAQ,QAAO,eAAe,QAAQ;AAAA,EACpD;AAAA,EAEA,WAAkB,YAA8B;AAC9C,WAAO,QAAO,gBAAgB,EAAE;AAAA,EAClC;AAAA,EAEA,WAAkB,qBAA2C;AAC3D,WAAO,QAAO,gBAAgB,EAAE;AAAA,EAClC;AAAA,EAEA,WAAkB,KAA0B;AAC1C,WAAO,QAAO,gBAAgB,EAAE;AAAA,EAClC;AAAA,EAEA,WAAkB,cAAiC;AACjD,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,WAAkB,SAAuB;AACvC,WAAO,QAAO,gBAAgB,EAAE;AAAA,EAClC;AAAA,EAEA,WAAkB,SAAsD;AACtE,WAAO,QAAO,gBAAgB;AAAA,EAChC;AAAA,EAEA,WAAkB,gBAAwB;AACxC,WAAO,QAAQ,IAAI;AAAA,EACrB;AAAA,EAEA,WAAkB,SAAsC;AACtD,WAAO,QAAO,gBAAgB,EAAE;AAAA,EAClC;AAAA,EAEA,WAAkB,aAA0B;AAC1C,WAAO,QAAO,gBAAgB,EAAE;AAAA,EAClC;AAAA,EAEA,WAAkB,kBAA0B;AAC1C,WAAO,kBAAAA,QAAK,QAAQ,QAAO,eAAe,KAAK;AAAA,EACjD;AAAA,EAEA,OAAe,kBAEb;AACA,QAAI,CAAC,QAAO,MAAM,cAAc;AAC9B,cAAO,MAAM,eAAe,IAAI,QAAO;AAAA,IACzC;AAEA,WAAO,QAAO,MAAM;AAAA,EACtB;AAAA,EAEA,OAAe,kCACb,MACA,OACA,QACM;AACN,QAAI,OAAO,IAAI,GAAG,aAAa,QAAQ,UAAU,QAAW;AAC1D,YAAM,IAAI;AAAA,QACR,0CAA0C,IAAI;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,gCACb,MACA,OACA,QACM;AACN,UAAM,UAAU,OAAO,IAAI,GAAG;AAE9B,QAAI,WAAW,CAAC,QAAQ,SAAS,KAAK,GAAG;AACvC,YAAM,IAAI;AAAA,QACR,yBAAyB,IAAI,qBAAqB,QAAQ,KAAK,IAAI,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,4BACb,aACA,SAGQ;AACR,WAAO,kBAAAA,QAAK;AAAA,MACV,QAAO;AAAA,MACP,QAAQ,SAAS,cAAc,QAAQ,WAAW,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,OAAe,gCACb,MACA,OACS;AACT,QAAI,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,MAAM,YAAY,CAAC,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,KAAK,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,YAAY,CAAC,GAAG;AAC7D,aAAO;AAAA,IACT;AAEA,UAAM,IAAI;AAAA,MACR,yBAAyB,IAAI;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,OAAe,+BACb,MACA,OACQ;AACR,QAAI,MAAM,KAAK,MAAM,IAAI;AACvB,YAAM,IAAI;AAAA,QACR,yBAAyB,IAAI;AAAA,MAC/B;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,KAAK;AAEhC,QAAI,OAAO,SAAS,WAAW,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,UAAM,IAAI;AAAA,MACR,yBAAyB,IAAI;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,OAAe,yBACb,MACA,OACA,QACwB;AACxB,UAAM,aAAa,OAAO,IAAI;AAE9B,QAAI,WAAW,SAAS,WAAW;AACjC,YAAM,cAAc,QAAO,gCAAgC,MAAM,KAAK;AAEtE,cAAO,gCAAgC,MAAM,aAAa,MAAM;AAEhE,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,SAAS,UAAU;AAChC,YAAM,cAAc,QAAO,+BAA+B,MAAM,KAAK;AAErE,cAAO,gCAAgC,MAAM,aAAa,MAAM;AAEhE,aAAO;AAAA,IACT;AAEA,YAAO,gCAAgC,MAAM,OAAO,MAAM;AAE1D,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,6BAEb,QAAsD;AACtD,UAAM,uBAA+D,CAAC;AAEtE,eAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,YAAM,QAAQ,QAAQ,IAAI,IAAI,KAAK,WAAW,cAAc,SAAS;AAErE,cAAO,kCAAkC,MAAM,OAAO,MAAM;AAE5D,UAAI,UAAU,QAAW;AACvB,6BAAqB,IAAI,IAAI,QAAO;AAAA,UAClC;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG,QAAQ;AAAA,MACX,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,OAAc,yBACZ,aACA,UAEI,CAAC,GACe;AACpB,UAAM,kBAAkB,eAAe,QAAQ,IAAI,YAAY;AAE/D,UAAM,SAAS,cAAAC,QAAO,OAAO;AAAA,MAC3B,UAAU,QAAQ;AAAA,MAClB,MAAM,QAAO,4BAA4B,iBAAiB,OAAO;AAAA,IACnE,CAAC;AAED,QAAI,QAAQ,QAAQ;AAClB,cAAO,6BAA6B,QAAQ,MAAM;AAAA,IACpD;AAEA,WAAO;AAAA,EACT;AAAA,EAUA,MAAc,eAAe,WAA6C;AACxE,QAAI,UAAU,UAAU;AACtB,YAAM,UAAU,SAAS;AAEzB;AAAA,IACF;AAEA,QAAI,UAAU,OAAO;AACnB,YAAM,UAAU,MAAM;AAEtB;AAAA,IACF;AAEA,QAAI,UAAU,MAAM;AAClB,YAAM,UAAU,KAAK;AAErB;AAAA,IACF;AAEA,QAAI,UAAU,OAAO;AACnB,YAAM,UAAU,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,qBACN,iBACgB;AAChB,WAAO,KAAK,GAAG,WAA2B,eAAe;AAAA,EAC3D;AAAA,EAEQ,wBACN,iBACa;AACb,WAAO,KAAK,GAAG,WAAwB,eAAe;AAAA,EACxD;AAAA,EAEQ,oBAAoB,iBAAiD;AAC3E,WAAO,KAAK,GAAG,WAAoB,eAAe;AAAA,EACpD;AAAA,EAEQ,sBACN,iBACW;AACX,WAAO,KAAK,GAAG,WAAsB,eAAe;AAAA,EACtD;AAAA,EAEA,IAAW,YAA8B;AACvC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,qBAA2C;AACpD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,KAA0B;AACnC,QAAI,CAAC,KAAK,6BAA6B;AACrC,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,cAA8D;AACvE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,SAAuB;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,SAAsC;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,aAA0B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,8BACN,UAA4C,CAAC,GACD;AAC5C,WAAO;AAAA,MACL,gBACE,QAAQ,kBAAkB,QAAQ,IAAI,oBAAoB;AAAA,MAC5D,WAAW,QAAQ,aAAa,CAAC;AAAA,MACjC,kBACE,QAAQ,oBACR,KAAK,QAAQ,oBACb,kBAAAD,QAAK,QAAQ,QAAO,iBAAiB,aAAa,eAAe;AAAA,MACnE,iBACE,QAAQ,mBACR,KAAK,QAAQ,mBACb,QAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAa,oBACX,UAA4C,CAAC,GAC9B;AACf,YAAO,MAAM,eAAe;AAC5B,SAAK,8BACH,KAAK,+BACL,oBAAoB;AAAA,MAClB,KAAK,8BAA8B,OAAO;AAAA,IAC5C;AAEF,UAAM,KAAK,4BAA4B,QAAQ;AAC/C,YAAO,MAAM,eAAe;AAAA,EAC9B;AAAA,EAEO,yBACL,aACA,UAEI,CAAC,GACe;AACpB,UAAM,SAAS,QAAO,yBAAyB,aAAa;AAAA,MAC1D,GAAG;AAAA,MACH,QAAQ,QAAQ,UAAU,KAAK,QAAQ;AAAA,IACzC,CAAC;AAED,SAAK,uBAAuB,KAAK,QAAQ,oBACrC,QAAO,6BAA6B,KAAK,QAAQ,iBAAiB,IACjE,QAAQ;AAEb,WAAO;AAAA,EACT;AAAA,EAEO,YAAyC;AAC9C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,8BACF,aACG;AACN,SAAK,oBAAoB,KAAK,GAAG,WAAW;AAAA,EAC9C;AAAA,EAEO,qBACF,kBACG;AACN,eAAW,mBAAmB,kBAAkB;AAC9C,WAAK,cAAc,KAAK,KAAK,qBAAqB,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEO,6BAA6B,WAAmC;AACrE,SAAK,cAAc,KAAK,GAAG,SAAS;AAAA,EACtC;AAAA,EAEO,kBACF,kBACG;AACN,SAAK,WAAW,KAAK,GAAG,gBAAgB;AAAA,EAC1C;AAAA,EAEO,sBACF,kBACG;AACN,eAAW,mBAAmB,kBAAkB;AAC9C,WAAK,eAAe,KAAK,KAAK,sBAAsB,eAAe,CAAC;AAAA,IACtE;AAAA,EACF;AAAA,EAEO,8BAA8B,YAA+B;AAClE,SAAK,eAAe,KAAK,GAAG,UAAU;AAAA,EACxC;AAAA,EAEO,qBAAqB,MAA0B;AACpD,SAAK,cAAc,KAAK,IAAI;AAAA,EAC9B;AAAA,EAEO,kBAAwB;AAC7B,SAAK,cAAc,SAAS;AAAA,EAC9B;AAAA,EAEO,eAAqB;AAC1B,SAAK,WAAW,SAAS;AAAA,EAC3B;AAAA,EAEO,mBAAyB;AAC9B,SAAK,eAAe,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAa,eAA8B;AACzC,eAAW,YAAY,KAAK,eAAe;AACzC,YAAM,SAAS,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAa,mBACR,kBACY;AACf,eAAW,mBAAmB,kBAAkB;AAC9C,YAAM,KAAK,wBAAwB,eAAe,EAAE,OAAO;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,MAAa,eACR,kBACY;AACf,eAAW,mBAAmB,kBAAkB;AAC9C,YAAM,UAAU,KAAK,oBAAoB,eAAe;AAExD,YAAM,QAAQ,IAAI;AAClB,WAAK;AAAA,QAAqB,MACxB,KAAK,eAAe,OAA4B;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,2BACX,iBACe;AACf,UAAM,YAAY,KAAK,sBAAsB,eAAe;AAE5D,UAAM,UAAU,QAAQ;AACxB,UAAM,UAAU,KAAK;AACrB,SAAK,eAAe,KAAK,SAAS;AAAA,EACpC;AAAA,EAEA,MAAa,gBAA+B;AAC1C,eAAW,aAAa,KAAK,gBAAgB;AAC3C,YAAM,UAAU,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAa,WAA0B;AACrC,eAAW,YAAY,CAAC,GAAG,KAAK,aAAa,EAAE,QAAQ,GAAG;AACxD,YAAM,KAAK,eAAe,QAA6B;AAAA,IACzD;AAEA,eAAW,aAAa,CAAC,GAAG,KAAK,cAAc,EAAE,QAAQ,GAAG;AAC1D,YAAM,KAAK,eAAe,SAA8B;AAAA,IAC1D;AAEA,eAAW,QAAQ,CAAC,GAAG,KAAK,aAAa,EAAE,QAAQ,GAAG;AACpD,YAAM,KAAK;AAAA,IACb;AAEA,UAAM,KAAK,eAAe,KAAK,cAAmC;AAAA,EACpE;AACF;;;AIzgBO,IAAM,kCAAN,MAA0E;AAAA,EACxE,wBACL,OACA,SACM;AACN,SAAK;AACL,SAAK;AAAA,EACP;AAAA,EAEO,uBACL,OACA,SACS;AACT,SAAK;AACL,SAAK;AAEL,WAAO;AAAA,EACT;AACF;;;ACfO,IAAM,wBAAN,MAA4B;AAAA,EAGjC,YACE,QAAkC,CAAC,GAClB,cAAwC,IAAI,gCAAgC,GAC7F;AADiB;AAEjB,SAAK,MAAM,KAAK,GAAG,KAAK;AAAA,EAC1B;AAAA,EAHmB;AAAA,EAJF,QAAyB,CAAC;AAAA,EAS3C,MAAc,qBAAqB,SAAwC;AACzE,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,KAAK,oBAAoB,MAAM,OAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,MACA,SACe;AACf,QAAI;AACF,YAAM,KAAK,eAAe,OAAO;AAAA,IACnC,SAAS,OAAgB;AACvB,YAAM,KAAK,YAAY,wBAAwB,OAAO,OAAO;AAE7D,UAAI,KAAK,YAAY,uBAAuB,OAAO,OAAO,GAAG;AAC3D,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,SAAwC;AAC1E,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,KAAK,gBAAgB,OAAO;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAc,qBACZ,OACA,SACe;AACf,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,KAAK,iBAAiB,OAAO,OAAO;AAAA,IAC5C;AAAA,EACF;AAAA,EAEO,YAAY,OAA8B;AAC/C,SAAK,MAAM,KAAK,GAAG,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAa,IACX,SACA,SACY;AACZ,UAAM,KAAK,sBAAsB,OAAO;AAExC,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ;AAE7B,YAAM,KAAK,qBAAqB,OAAO;AAEvC,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,YAAM,KAAK,qBAAqB,OAAO,OAAO;AAE9C,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AC5EO,IAAM,0BAAN,cAAsC,MAAM;AAAA,EACjD,YAAY,SAAiB;AAC3B,UAAM,yBAAyB,OAAO,EAAE;AACxC,SAAK,OAAO;AAAA,EACd;AACF;;;ACLO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/C,YAAY,WAAmB;AAC7B,UAAM,gCAAgC,SAAS,IAAI;AACnD,SAAK,OAAO;AAAA,EACd;AACF;;;ARwBA,IAAqB,wBAArB,MAEA;AAAA,EAOE,YAA6B,UAAwC,CAAC,GAAG;AAA5C;AAC3B,SAAK,WACH,QAAQ,YAAY,QAAQ,eAAe,QAAQ,IAAI,gBAAgB;AACzE,SAAK,wBAAwB,IAAI;AAAA,MAC/B,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAP6B;AAAA,EANrB;AAAA,EACA;AAAA,EACS,iBAA2B,CAAC;AAAA,EACrC;AAAA,EACS;AAAA,EAWjB,IAAY,MAAc;AACxB,WAAO,KAAK,QAAQ,OAAO,QAAQ,IAAI,iBAAiB;AAAA,EAC1D;AAAA,EAEA,IAAY,SAAiD;AAC3D,WAAO,KAAK,QAAQ,UAAU,OAAO;AAAA,EACvC;AAAA,EAEA,IAAY,aAAiC;AAC3C,UAAM,oBACJ,KAAK,QAAQ,cAAc,QAAQ,IAAI;AAEzC,QAAI,sBAAsB,QAAW;AACnC,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,iBAAiB;AAAA,EACjC;AAAA,EAEA,IAAY,2BAAmC;AAC7C,UAAM,oBAAoB,OAAO,QAAQ,IAAI,qBAAqB;AAElE,WACE,KAAK,QAAQ,6BACZ,OAAO,SAAS,iBAAiB,IAAI,oBAAoB;AAAA,EAE9D;AAAA,EAEQ,oBACN,qBACA,SACa;AACb,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,wBAAwB,KAAK,UAAU,OAAO,CAAC;AAAA,IAC3D;AAEA,WAAO,IAAI;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ,cAAc,IAAI,KAAK,QAAQ,WAAW,IAAI,oBAAI,KAAK;AAAA,MAC/D,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,mBACN,KAC4B;AAC5B,WAAO;AAAA,MACL,UAAU;AAAA,QACR,SAAS,IAAI,WAAW,WAAW,CAAC;AAAA,QACpC,YAAY;AAAA,QACZ,SAAS,OAAO,IAAI,WAAW,SAAS,WAAW,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,OACZ,KACA,SACe;AACf,UAAM,UAAU,KAAK,MAAM,IAAI,QAAQ,SAAS,CAAC;AAEjD,SAAK,QAAQ;AAAA,MACX,qBAAqB,QAAQ,SAAS,uBAAuB,KAAK,UAAU,OAAO,CAAC;AAAA,IACtF;AAEA,QAAI;AACF,YAAM,cAAc,KAAK;AAAA,QACvB,QAAQ;AAAA,QACR;AAAA,MACF;AAEA,YAAM,QAAQ,QAAQ,aAAa,KAAK,mBAAmB,GAAG,CAAC;AAAA,IACjE,SAAS,OAAO;AACd,YAAM,KAAK,YAAY,KAAK,SAAS,SAAS,KAAK;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAc,YACZ,KACA,SACA,SACA,OACe;AACf,SAAK,QAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACzE,UAAM,UAAU,IAAI,WAAW,WAAW,CAAC;AAC3C,UAAM,aAAa,OAAO,QAAQ,WAAW,CAAC;AAE9C,QAAI,KAAK,eAAe,UAAa,cAAc,KAAK,YAAY;AAClE,YAAM,KAAK,MAAM,SAAS,SAAS,OAAO;AAE1C;AAAA,IACF;AAEA,UAAM,KAAK,UAAU,SAAS,SAAS,OAAO,KAAK,CAAC;AAAA,EACtD;AAAA,EAEA,MAAc,MACZ,SACA,SACA,SACe;AACf,UAAM,QAAQ,OAAO,QAAQ,WAAW,CAAC;AACzC,UAAM,gBAAgB,QAAQ,KAAK;AACnC,UAAM,mBAAmB,GAAG,QAAQ,SAAS,YAAY,aAAa;AACtE,UAAM,oBAAoB,GAAG,QAAQ,SAAS,IAAI,QAAQ,UAAU,YAAY,aAAa;AAC7F,UAAM,cAAc,GAAG,gBAAgB,QAAI,+BAAW,CAAC;AAEvD,SAAK,QAAQ,KAAK,WAAW,KAAK,EAAE;AAEpC,QAAI,CAAC,KAAK,eAAe,SAAS,gBAAgB,GAAG;AACnD,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,cAAc,KAAK;AAAA,QACvB,QAAQ;AAAA,QACR;AAAA,MACF;AAEA,cAAQ,QAAQ;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,OAAO,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,QACnC,KAAK,KAAK,aAAa,KAAK;AAAA,MAC9B;AAAA,IACF,SAAS,OAAgB;AACvB,YAAM,QAAQ,QAAQ,OAAO,WAAW;AACxC,WAAK,QAAQ;AAAA,QACX,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,wBACZ,kBACA,mBACA,eACA,aACA,SACe;AACf,UAAM,QAAQ,QAAQ,eAAe,KAAK,UAAU,SAAS;AAAA,MAC3D,SAAS;AAAA,IACX,CAAC;AACD,UAAM,QAAQ,QAAQ,YAAY,kBAAkB;AAAA,MAClD,YAAY;AAAA,MACZ,oBAAoB,KAAK;AAAA,MACzB,sBAAsB;AAAA,MACtB,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAC;AACD,UAAM,QAAQ,QAAQ;AAAA,MACpB;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AACA,SAAK,eAAe,KAAK,gBAAgB;AACzC,UAAM,QAAQ,QAAQ;AAAA,MACpB;AAAA,MACA,OAAO,QAA+B;AACpC,YAAI,CAAC,KAAK;AACR;AAAA,QACF;AAEA,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,aAAa,CAAC;AACjE,cAAM,KAAK,OAAO,KAAK,OAAO;AAC9B,aAAK,oBAAoB,gBAAgB;AACzC,cAAM,QAAQ,QAAQ,OAAO,WAAW;AAAA,MAC1C;AAAA,MACA,EAAE,aAAa,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,oBAAoB,kBAAgC;AAC1D,UAAM,QAAQ,KAAK,eAAe,QAAQ,gBAAgB;AAE1D,QAAI,UAAU,IAAI;AAChB,WAAK,eAAe,OAAO,OAAO,CAAC;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAc,UACZ,SACA,SACA,OACe;AACf,UAAM,QAAQ,QAAQ,eAAe,KAAK,UAAU,OAAO;AAC3D,UAAM,eAAe,GAAG,QAAQ,SAAS;AACzC,UAAM,gBAAgB,GAAG,QAAQ,SAAS,IAAI,QAAQ,UAAU;AAEhE,UAAM,QAAQ,QAAQ,YAAY,cAAc;AAAA,MAC9C,oBAAoB,KAAK;AAAA,MACzB,sBAAsB;AAAA,MACtB,SAAS;AAAA,IACX,CAAC;AACD,UAAM,QAAQ,QAAQ,UAAU,cAAc,KAAK,UAAU,aAAa;AAE1E,QAAI;AACF,YAAM,cAAc,KAAK;AAAA,QACvB,QAAQ;AAAA,QACR;AAAA,MACF;AAEA,cAAQ,QAAQ;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,OAAO,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,QACnC,KAAK,KAAK,aAAa,QAAQ,SAAS,KAAK;AAAA,MAC/C;AAAA,IACF,SAAS,cAAuB;AAC9B,WAAK,QAAQ;AAAA,QACX,wBAAwB,QACpB,aAAa,UACb,OAAO,YAAY;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,UAAyB;AACrC,SAAK,aAAa,MAAM,eAAAE,QAAQ,QAAQ,KAAK,iBAAiB,CAAC;AAC/D,SAAK,kBAAkB,MAAM,KAAK,WAAW,cAAc;AAC3D,SAAK,gBACF,GAAG,SAAS,YAAY;AACvB,WAAK,QAAQ,MAAM,8BAA8B;AACjD,YAAM,KAAK,UAAU;AAAA,IACvB,CAAC,EACA,GAAG,SAAS,OAAO,UAAU;AAC5B,WAAK,QAAQ,MAAM,iCAAiC,MAAM,OAAO,EAAE;AACnE,YAAM,KAAK,UAAU;AAAA,IACvB,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,YAA2B;AACvC,UAAM,KAAK,QAAQ;AAEnB,eAAW,YAAY,OAAO,WAAW;AACvC,YAAM,SAAS,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,QAAQ,WAAW,OAAyB;AACxD,QAAI,UAAU;AACZ,YAAM,aAAa,MAAM,eAAAA,QAAQ,QAAQ,KAAK,iBAAiB,CAAC;AAEhE,aAAO,WAAW,cAAc;AAAA,IAClC;AAEA,QAAI,CAAC,KAAK,iBAAiB;AACzB,YAAM,KAAK,QAAQ;AAAA,IACrB;AAEA,QAAI,CAAC,KAAK,iBAAiB;AACzB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,UAAM,KAAK,gBAAgB,eAAe,KAAK,UAAU,SAAS;AAAA,MAChE,SAAS;AAAA,IACX,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,mBAA2B;AACjC,UAAM,YAAY,KAAK,IAAI,SAAS,GAAG,IAAI,MAAM;AAEjD,WAAO,GAAG,KAAK,GAAG,GAAG,SAAS;AAAA,EAChC;AAAA,EAEQ,KACN,OACA,SACA,OACiB;AACjB,WAAO;AAAA,MACL,OAAO,KAAK,QAAQ,eAAe,QAAQ,IAAI;AAAA,MAC/C,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,SAAS;AAAA,QACP;AAAA,QACA,SAAS,UAAU,UAAU,IAAI;AAAA,MACnC;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,UAAU;AAAA,MACV,WAAW,MAAM,WAAW,QAAQ;AAAA,MACpC,MAAM,MAAM,UAAU;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,mBACN,0BACA,mBACQ;AACR,WAAO,4BAA4B;AAAA,EACrC;AAAA,EAEA,MAAc,gBACZ,KACA,qBACA,SACA,SACe;AACf,UAAM,UAAU,IAAI,QAAQ,SAAS;AAErC,SAAK,QAAQ,KAAK,6BAA6B,OAAO,EAAE;AAExD,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,OAAO;AAClC,YAAM,cAAc,KAAK;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,QAAQ,aAAa,KAAK,mBAAmB,GAAG,CAAC;AACvD,WAAK,QAAQ,KAAK,GAAG,OAAO,wBAAwB;AACpD,cAAQ,IAAI,GAAG;AAAA,IACjB,SAAS,OAAwB;AAC/B,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEvD,WAAK,QAAQ,MAAM,GAAG,OAAO,eAAe,YAAY,GAAG;AAC3D,cAAQ,KAAK,GAAG;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAa,iBAAmC;AAC9C,QAAI,OAAO,UAAU,WAAW,GAAG;AACjC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAM,KAAK,QAAQ;AAEnC,eAAW,YAAY,OAAO,WAAW;AACvC,YAAM,eAAe,MAAM,QAAQ,WAAW,SAAS,SAAS;AAEhE,UAAI,aAAa,kBAAkB,GAAG;AACpC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,WACX,WACA,qBACA,SACA,iBACe;AACf,UAAM,eAAe,GAAG,SAAS;AACjC,UAAM,UAAU,MAAM,KAAK,QAAQ,IAAI;AAEvC,YAAQ,GAAG,SAAS,MAAM;AACxB,WAAK,QAAQ,MAAM,8BAA8B;AAAA,IACnD,CAAC;AAED,UAAM,QAAQ,MAAM,QAAQ,WAAW,YAAY;AACnD,UAAM,uBAAuB,KAAK;AAAA,MAChC;AAAA,MACA,MAAM;AAAA,IACR;AAEA,SAAK,QAAQ;AAAA,MACX,YAAY,oBAAoB,sBAAsB,YAAY;AAAA,IACpE;AAEA,QAAI,uBAAuB,KAAK,MAAM,iBAAiB,GAAG;AACxD,eAAS,QAAQ,GAAG,QAAQ,sBAAsB,SAAS;AACzD,cAAM,MAAM,MAAM,QAAQ,IAAI,YAAY;AAE1C,YAAI,QAAQ,OAAO;AACjB;AAAA,QACF;AAEA,cAAM,KAAK,gBAAgB,KAAK,qBAAqB,SAAS,OAAO;AAAA,MACvE;AAEA;AAAA,IACF;AAEA,UAAM,IAAI,sBAAsB,YAAY;AAAA,EAC9C;AAAA,EAEA,MAAa,QACX,WACA,YACA,qBACA,UACA,SACe;AACf,UAAM,UAAU,MAAM,KAAK,QAAQ;AAEnC,UAAM,QAAQ,YAAY,WAAW,EAAE,SAAS,KAAK,CAAC;AACtD,UAAM,QAAQ,eAAe,UAAU,OAAO;AAC9C,UAAM,QAAQ,SAAS,CAAC;AACxB,UAAM,QAAQ,UAAU,WAAW,UAAU,UAAU;AAEvD,UAAM,UAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,WAAW,OAAO,QAA+B;AACrE,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AAEA,YAAM,KAAK,OAAO,KAAK,OAAO;AAC9B,cAAQ,IAAI,GAAG;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,QAAQ,cAA4C;AAC/D,UAAM,UAAU,MAAM,KAAK,QAAQ;AAEnC,eAAW,SAAS,cAAc;AAChC,YAAM,KAAK,sBAAsB;AAAA,QAC/B;AAAA,UACE,aAAa;AAAA,UACb,SAAS;AAAA,YACP,UAAU;AAAA,cACR,aAAa,MAAM,eAAe;AAAA,cAClC,eAAe,MAAM,iBAAiB;AAAA,cACtC,SAAS,MAAM;AAAA,YACjB;AAAA,YACA,MAAM,MAAM,UAAU;AAAA,YACtB,SAAS,MAAM;AAAA,UACjB;AAAA,UACA,UAAU;AAAA,YACR,SAAS,MAAM;AAAA,YACf,UAAU,KAAK;AAAA,UACjB;AAAA,UACA,OAAO,MAAM,UAAU;AAAA,QACzB;AAAA,QACA,MACE,QAAQ;AAAA,UACN,KAAK;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,OAAO,KAAK,MAAM,OAAO,CAAC;AAAA,UAC1B,KAAK,KAAK,KAAK;AAAA,QACjB;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEO,0BAA0B,OAA8B;AAC7D,SAAK,sBAAsB,SAAS,GAAG,KAAK;AAAA,EAC9C;AAAA,EAEA,MAAa,QAAuB;AAClC,UAAM,KAAK,iBAAiB,MAAM;AAClC,UAAM,KAAK,YAAY,MAAM;AAC7B,SAAK,kBAAkB;AACvB,SAAK,aAAa;AAAA,EACpB;AACF;","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 { 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 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.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 return this.container.get<T>(serviceName);\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"]}
|
|
@@ -22,6 +22,32 @@ var ConsoleKernelLogger = class {
|
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
+
// src/infrastructure/dependency-injection/AutowireWarningFilter.ts
|
|
26
|
+
var AutowireWarningFilter = class {
|
|
27
|
+
constructor(logger) {
|
|
28
|
+
this.logger = logger;
|
|
29
|
+
}
|
|
30
|
+
logger;
|
|
31
|
+
isIgnorableAutowireWarning(message) {
|
|
32
|
+
return message.startsWith(
|
|
33
|
+
"Autowire: file has export default declaration but no runtime default export:"
|
|
34
|
+
) || message.startsWith("Autowire: failed to create definition for undefined:");
|
|
35
|
+
}
|
|
36
|
+
warn(message, ...optionalParams) {
|
|
37
|
+
if (typeof message === "string" && this.isIgnorableAutowireWarning(message)) {
|
|
38
|
+
this.logger.debug?.(`Ignored ${message}`, ...optionalParams);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.logger.warn(message, ...optionalParams);
|
|
42
|
+
}
|
|
43
|
+
info(message, ...optionalParams) {
|
|
44
|
+
this.logger.info?.(message, ...optionalParams);
|
|
45
|
+
}
|
|
46
|
+
debug(message, ...optionalParams) {
|
|
47
|
+
this.logger.debug?.(message, ...optionalParams);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
25
51
|
// src/infrastructure/dependency-injection/DependencyInjection.ts
|
|
26
52
|
import fs from "fs-extra";
|
|
27
53
|
import {
|
|
@@ -226,6 +252,15 @@ var DependencyInjection = class _DependencyInjection {
|
|
|
226
252
|
this.applyValueOverride(override);
|
|
227
253
|
}
|
|
228
254
|
}
|
|
255
|
+
async processAutowire() {
|
|
256
|
+
const previousLogger = this.container.logger;
|
|
257
|
+
this.container.logger = new AutowireWarningFilter(previousLogger);
|
|
258
|
+
try {
|
|
259
|
+
await this.autowire?.process();
|
|
260
|
+
} finally {
|
|
261
|
+
this.container.logger = previousLogger;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
229
264
|
registerParentAliases() {
|
|
230
265
|
for (const [id, definition] of this.definitions.entries()) {
|
|
231
266
|
if (definition._abstract === true || !definition._parent) {
|
|
@@ -242,7 +277,7 @@ var DependencyInjection = class _DependencyInjection {
|
|
|
242
277
|
this.options.servicesYamlPath,
|
|
243
278
|
false
|
|
244
279
|
);
|
|
245
|
-
await this.
|
|
280
|
+
await this.processAutowire();
|
|
246
281
|
} else {
|
|
247
282
|
this.loader = new YamlFileLoader(this.container);
|
|
248
283
|
await this.loader.load(this.options.servicesYamlPath);
|
|
@@ -351,6 +386,13 @@ var Kernel = class _Kernel {
|
|
|
351
386
|
);
|
|
352
387
|
}
|
|
353
388
|
}
|
|
389
|
+
static assertRequiredEnvironmentVariableIsNotBlank(name, value, schema) {
|
|
390
|
+
if (schema[name]?.required === true && value.trim() === "") {
|
|
391
|
+
throw new KernelEnvironmentValidationError(
|
|
392
|
+
`Blank required environment variable "${name}".`
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
354
396
|
static assertEnvironmentVariableChoice(name, value, schema) {
|
|
355
397
|
const choices = schema[name]?.choices;
|
|
356
398
|
if (choices && !choices.includes(value)) {
|
|
@@ -373,21 +415,16 @@ var Kernel = class _Kernel {
|
|
|
373
415
|
return false;
|
|
374
416
|
}
|
|
375
417
|
throw new KernelEnvironmentValidationError(
|
|
376
|
-
`Environment variable "${name}"
|
|
418
|
+
`Environment variable "${name}" has invalid boolean value "${value}".`
|
|
377
419
|
);
|
|
378
420
|
}
|
|
379
421
|
static parseNumberEnvironmentVariable(name, value) {
|
|
380
|
-
if (value.trim() === "") {
|
|
381
|
-
throw new KernelEnvironmentValidationError(
|
|
382
|
-
`Environment variable "${name}" must be a number.`
|
|
383
|
-
);
|
|
384
|
-
}
|
|
385
422
|
const parsedValue = Number(value);
|
|
386
423
|
if (Number.isFinite(parsedValue)) {
|
|
387
424
|
return parsedValue;
|
|
388
425
|
}
|
|
389
426
|
throw new KernelEnvironmentValidationError(
|
|
390
|
-
`Environment variable "${name}"
|
|
427
|
+
`Environment variable "${name}" has invalid number value "${value}".`
|
|
391
428
|
);
|
|
392
429
|
}
|
|
393
430
|
static parseEnvironmentVariable(name, value, schema) {
|
|
@@ -405,17 +442,42 @@ var Kernel = class _Kernel {
|
|
|
405
442
|
_Kernel.assertEnvironmentVariableChoice(name, value, schema);
|
|
406
443
|
return value;
|
|
407
444
|
}
|
|
445
|
+
static getEnvironmentVariableValue(name, definition, schema) {
|
|
446
|
+
const value = process.env[name];
|
|
447
|
+
_Kernel.assertRequiredEnvironmentVariable(name, value, schema);
|
|
448
|
+
if (value !== void 0) {
|
|
449
|
+
_Kernel.assertRequiredEnvironmentVariableIsNotBlank(name, value, schema);
|
|
450
|
+
}
|
|
451
|
+
if (value !== void 0 && value.trim() !== "") {
|
|
452
|
+
return value;
|
|
453
|
+
}
|
|
454
|
+
return definition.defaultValue?.toString();
|
|
455
|
+
}
|
|
456
|
+
static shouldUnsetBlankOptionalEnvironmentVariable(name, value, valueOrDefault, schema) {
|
|
457
|
+
return value !== void 0 && value.trim() === "" && valueOrDefault === void 0 && schema[name]?.required !== true;
|
|
458
|
+
}
|
|
408
459
|
static validateEnvironmentVariables(schema) {
|
|
409
460
|
const environmentVariables = {};
|
|
410
461
|
for (const [name, definition] of Object.entries(schema)) {
|
|
411
|
-
const value = process.env[name]
|
|
412
|
-
_Kernel.
|
|
413
|
-
|
|
462
|
+
const value = process.env[name];
|
|
463
|
+
const valueOrDefault = _Kernel.getEnvironmentVariableValue(
|
|
464
|
+
name,
|
|
465
|
+
definition,
|
|
466
|
+
schema
|
|
467
|
+
);
|
|
468
|
+
if (valueOrDefault !== void 0) {
|
|
414
469
|
environmentVariables[name] = _Kernel.parseEnvironmentVariable(
|
|
415
470
|
name,
|
|
416
|
-
|
|
471
|
+
valueOrDefault,
|
|
417
472
|
schema
|
|
418
473
|
);
|
|
474
|
+
} else if (_Kernel.shouldUnsetBlankOptionalEnvironmentVariable(
|
|
475
|
+
name,
|
|
476
|
+
value,
|
|
477
|
+
valueOrDefault,
|
|
478
|
+
schema
|
|
479
|
+
)) {
|
|
480
|
+
environmentVariables[name] = void 0;
|
|
419
481
|
}
|
|
420
482
|
}
|
|
421
483
|
return {
|