@haskou/ddd-kernel 0.1.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +5 -10
  2. package/dist/DomainEventConsumer-Bg-bOwmh.d.cts +11 -0
  3. package/dist/DomainEventConsumer-BroJmVty.d.ts +11 -0
  4. package/dist/DomainMessageBus-3jYk7TPw.d.ts +13 -0
  5. package/dist/DomainMessageBus-OyliPu3Z.d.cts +13 -0
  6. package/dist/MessageBus-BtUXnd0Y.d.cts +10 -0
  7. package/dist/MessageBus-oQ9BnW84.d.ts +10 -0
  8. package/dist/{NoFailedMessagesError-0YJKRWPF.d.ts → NoFailedMessagesError-BLpGI-G4.d.ts} +6 -1
  9. package/dist/{NoFailedMessagesError-Kz7CYWpT.d.cts → NoFailedMessagesError-BjxYoKTR.d.cts} +6 -1
  10. package/dist/PublisherHookErrorPolicy-CjouTcSR.d.cts +8 -0
  11. package/dist/PublisherHookErrorPolicy-DSsCNE6O.d.ts +8 -0
  12. package/dist/RetryPredicate-U7dYnQ4N.d.ts +15 -0
  13. package/dist/RetryPredicate-yT_z9zk1.d.cts +15 -0
  14. package/dist/{Scheduler-oigqNOUJ.d.ts → Scheduler-BW-U5Ccg.d.cts} +1 -1
  15. package/dist/{Scheduler-oigqNOUJ.d.cts → Scheduler-BW-U5Ccg.d.ts} +1 -1
  16. package/dist/ServiceClass-BkEHcXDi.d.cts +72 -0
  17. package/dist/ServiceClass-Bq_fBC5R.d.ts +72 -0
  18. package/dist/{Kernel-BWUOUWWI.d.cts → ShutdownHook-BjbnCKzr.d.cts} +49 -7
  19. package/dist/{Kernel-CUaqHa1s.d.ts → ShutdownHook-CMWLsfu-.d.ts} +49 -7
  20. package/dist/Subscription-4vuAAxax.d.cts +23 -0
  21. package/dist/Subscription-vtF0lEHP.d.ts +23 -0
  22. package/dist/adapters/index.cjs +665 -37
  23. package/dist/adapters/index.cjs.map +1 -1
  24. package/dist/adapters/index.d.cts +15 -13
  25. package/dist/adapters/index.d.ts +15 -13
  26. package/dist/adapters/index.js +659 -37
  27. package/dist/adapters/index.js.map +1 -1
  28. package/dist/adapters/pubsub/amqp/index.cjs +241 -16
  29. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
  30. package/dist/adapters/pubsub/amqp/index.d.cts +16 -8
  31. package/dist/adapters/pubsub/amqp/index.d.ts +16 -8
  32. package/dist/adapters/pubsub/amqp/index.js +241 -16
  33. package/dist/adapters/pubsub/amqp/index.js.map +1 -1
  34. package/dist/adapters/pubsub/in-memory/index.cjs +96 -8
  35. package/dist/adapters/pubsub/in-memory/index.cjs.map +1 -1
  36. package/dist/adapters/pubsub/in-memory/index.d.cts +9 -3
  37. package/dist/adapters/pubsub/in-memory/index.d.ts +9 -3
  38. package/dist/adapters/pubsub/in-memory/index.js +96 -8
  39. package/dist/adapters/pubsub/in-memory/index.js.map +1 -1
  40. package/dist/adapters/pubsub/index.cjs +397 -27
  41. package/dist/adapters/pubsub/index.cjs.map +1 -1
  42. package/dist/adapters/pubsub/index.d.cts +89 -7
  43. package/dist/adapters/pubsub/index.d.ts +89 -7
  44. package/dist/adapters/pubsub/index.js +389 -26
  45. package/dist/adapters/pubsub/index.js.map +1 -1
  46. package/dist/adapters/ui/express/index.cjs +279 -11
  47. package/dist/adapters/ui/express/index.cjs.map +1 -1
  48. package/dist/adapters/ui/express/index.d.cts +127 -12
  49. package/dist/adapters/ui/express/index.d.ts +127 -12
  50. package/dist/adapters/ui/express/index.js +270 -11
  51. package/dist/adapters/ui/express/index.js.map +1 -1
  52. package/dist/adapters/ui/index.cjs +412 -27
  53. package/dist/adapters/ui/index.cjs.map +1 -1
  54. package/dist/adapters/ui/index.d.cts +7 -8
  55. package/dist/adapters/ui/index.d.ts +7 -8
  56. package/dist/adapters/ui/index.js +413 -27
  57. package/dist/adapters/ui/index.js.map +1 -1
  58. package/dist/adapters/ui/routes/index.cjs +136 -9
  59. package/dist/adapters/ui/routes/index.cjs.map +1 -1
  60. package/dist/adapters/ui/routes/index.js +136 -9
  61. package/dist/adapters/ui/routes/index.js.map +1 -1
  62. package/dist/contracts/index.cjs +16 -17
  63. package/dist/contracts/index.cjs.map +1 -1
  64. package/dist/contracts/index.d.cts +10 -2
  65. package/dist/contracts/index.d.ts +10 -2
  66. package/dist/contracts/index.js +16 -17
  67. package/dist/contracts/index.js.map +1 -1
  68. package/dist/contracts/kernel/index.cjs.map +1 -1
  69. package/dist/contracts/kernel/index.d.cts +7 -1
  70. package/dist/contracts/kernel/index.d.ts +7 -1
  71. package/dist/contracts/pubsub/index.cjs.map +1 -1
  72. package/dist/contracts/pubsub/index.d.cts +5 -1
  73. package/dist/contracts/pubsub/index.d.ts +5 -1
  74. package/dist/contracts/ui/index.cjs +16 -17
  75. package/dist/contracts/ui/index.cjs.map +1 -1
  76. package/dist/contracts/ui/index.d.cts +16 -16
  77. package/dist/contracts/ui/index.d.ts +16 -16
  78. package/dist/contracts/ui/index.js +16 -17
  79. package/dist/contracts/ui/index.js.map +1 -1
  80. package/dist/domain/index.cjs.map +1 -1
  81. package/dist/domain/index.d.cts +6 -2
  82. package/dist/domain/index.d.ts +6 -2
  83. package/dist/domain/index.js.map +1 -1
  84. package/dist/index.cjs +152 -26
  85. package/dist/index.cjs.map +1 -1
  86. package/dist/index.d.cts +8 -7
  87. package/dist/index.d.ts +8 -7
  88. package/dist/index.js +152 -26
  89. package/dist/index.js.map +1 -1
  90. package/dist/infrastructure/dependency-injection/index.cjs +119 -3
  91. package/dist/infrastructure/dependency-injection/index.cjs.map +1 -1
  92. package/dist/infrastructure/dependency-injection/index.d.cts +4 -1
  93. package/dist/infrastructure/dependency-injection/index.d.ts +4 -1
  94. package/dist/infrastructure/dependency-injection/index.js +119 -3
  95. package/dist/infrastructure/dependency-injection/index.js.map +1 -1
  96. package/dist/infrastructure/express/index.cjs +279 -11
  97. package/dist/infrastructure/express/index.cjs.map +1 -1
  98. package/dist/infrastructure/express/index.d.cts +7 -8
  99. package/dist/infrastructure/express/index.d.ts +7 -8
  100. package/dist/infrastructure/express/index.js +270 -11
  101. package/dist/infrastructure/express/index.js.map +1 -1
  102. package/dist/infrastructure/scheduler/index.cjs +136 -9
  103. package/dist/infrastructure/scheduler/index.cjs.map +1 -1
  104. package/dist/infrastructure/scheduler/index.d.cts +2 -2
  105. package/dist/infrastructure/scheduler/index.d.ts +2 -2
  106. package/dist/infrastructure/scheduler/index.js +136 -9
  107. package/dist/infrastructure/scheduler/index.js.map +1 -1
  108. package/package.json +89 -10
  109. package/dist/Consumer-CC8ZRCsd.d.cts +0 -17
  110. package/dist/Consumer-CeT0Wbxb.d.ts +0 -17
  111. package/dist/DomainEventConsumer-3WBMSSr2.d.cts +0 -7
  112. package/dist/DomainEventConsumer-B4hkIUmP.d.ts +0 -7
  113. package/dist/DomainEventPublisher-8G0lvmdy.d.cts +0 -7
  114. package/dist/DomainEventPublisher-DhGgM3f2.d.ts +0 -7
  115. package/dist/ServiceClass-BmNw8fJj.d.cts +0 -37
  116. package/dist/ServiceClass-C7NCKdSS.d.ts +0 -37
  117. package/dist/ShutdownHook-BGskq2-q.d.ts +0 -9
  118. package/dist/ShutdownHook-Dib5uNKB.d.cts +0 -9
  119. package/dist/Subscription-Bwkb_did.d.ts +0 -9
  120. package/dist/Subscription-P9WROD_6.d.cts +0 -9
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/adapters/pubsub/in-memory/InMemoryEventBus.ts","../../../../src/adapters/pubsub/in-memory/InMemoryPubSub.ts"],"sourcesContent":["import type {\n DomainEvent,\n HandlerContext,\n MessageHandler,\n} from '../../../contracts/index.js';\n\nexport class InMemoryEventBus {\n private readonly handlers = new Map<\n string,\n MessageHandler<DomainEvent, void>[]\n >();\n\n constructor(private readonly context: HandlerContext) {}\n\n public subscribe<TEvent extends DomainEvent>(\n name: TEvent['name'],\n handler: MessageHandler<TEvent, void>,\n ): void {\n const handlers = this.handlers.get(name) ?? [];\n\n handlers.push(handler as MessageHandler<DomainEvent, void>);\n this.handlers.set(name, handlers);\n }\n\n public async publish<TEvent extends DomainEvent>(\n event: TEvent,\n ): Promise<void> {\n const handlers = this.handlers.get(event.name) ?? [];\n\n for (const handler of handlers) {\n await handler(event, this.context);\n }\n }\n}\n","import type {\n HandlerContext,\n Message,\n MessageHandler,\n Subscription,\n} from '../../../contracts/index.js';\n\nexport class InMemoryPubSub {\n private readonly consumers = new Map<\n string,\n Set<MessageHandler<Message, void>>\n >();\n\n constructor(private readonly context: HandlerContext) {}\n\n public async publish<TMessage extends Message>(\n topic: string,\n message: TMessage,\n ): Promise<void> {\n const consumers = this.consumers.get(topic) ?? new Set();\n\n for (const consumer of consumers) {\n await consumer(message, this.context);\n }\n }\n\n public subscribe<TMessage extends Message>(\n topic: string,\n consumer: MessageHandler<TMessage, void>,\n ): Promise<Subscription> {\n const consumers =\n this.consumers.get(topic) ?? new Set<MessageHandler<Message, void>>();\n const castConsumer = consumer as MessageHandler<Message, void>;\n\n consumers.add(castConsumer);\n this.consumers.set(topic, consumers);\n\n return Promise.resolve({\n close: () => {\n consumers.delete(castConsumer);\n\n return Promise.resolve();\n },\n });\n }\n}\n"],"mappings":";AAMO,IAAM,mBAAN,MAAuB;AAAA,EAM5B,YAA6B,SAAyB;AAAzB;AAAA,EAA0B;AAAA,EAA1B;AAAA,EALZ,WAAW,oBAAI,IAG9B;AAAA,EAIK,UACL,MACA,SACM;AACN,UAAM,WAAW,KAAK,SAAS,IAAI,IAAI,KAAK,CAAC;AAE7C,aAAS,KAAK,OAA4C;AAC1D,SAAK,SAAS,IAAI,MAAM,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAa,QACX,OACe;AACf,UAAM,WAAW,KAAK,SAAS,IAAI,MAAM,IAAI,KAAK,CAAC;AAEnD,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,OAAO,KAAK,OAAO;AAAA,IACnC;AAAA,EACF;AACF;;;AC1BO,IAAM,iBAAN,MAAqB;AAAA,EAM1B,YAA6B,SAAyB;AAAzB;AAAA,EAA0B;AAAA,EAA1B;AAAA,EALZ,YAAY,oBAAI,IAG/B;AAAA,EAIF,MAAa,QACX,OACA,SACe;AACf,UAAM,YAAY,KAAK,UAAU,IAAI,KAAK,KAAK,oBAAI,IAAI;AAEvD,eAAW,YAAY,WAAW;AAChC,YAAM,SAAS,SAAS,KAAK,OAAO;AAAA,IACtC;AAAA,EACF;AAAA,EAEO,UACL,OACA,UACuB;AACvB,UAAM,YACJ,KAAK,UAAU,IAAI,KAAK,KAAK,oBAAI,IAAmC;AACtE,UAAM,eAAe;AAErB,cAAU,IAAI,YAAY;AAC1B,SAAK,UAAU,IAAI,OAAO,SAAS;AAEnC,WAAO,QAAQ,QAAQ;AAAA,MACrB,OAAO,MAAM;AACX,kBAAU,OAAO,YAAY;AAE7B,eAAO,QAAQ,QAAQ;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/adapters/pubsub/DefaultPublisherHookErrorPolicy.ts","../../../../src/adapters/pubsub/PublisherHookPipeline.ts","../../../../src/adapters/pubsub/in-memory/InMemoryEventBus.ts","../../../../src/adapters/pubsub/in-memory/InMemoryPubSub.ts"],"sourcesContent":["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","import type {\n DomainEvent,\n HandlerContext,\n MessageHandler,\n PublisherHook,\n PublisherHookErrorPolicy,\n} from '../../../contracts/index.js';\n\nimport { PublisherHookPipeline } from '../PublisherHookPipeline.js';\n\nexport class InMemoryEventBus {\n private readonly handlers = new Map<\n string,\n MessageHandler<DomainEvent, void>[]\n >();\n\n private readonly publisherHookPipeline: PublisherHookPipeline;\n\n constructor(\n private readonly context: HandlerContext,\n publisherHooks: readonly PublisherHook[] = [],\n publisherHookErrorPolicy?: PublisherHookErrorPolicy,\n ) {\n this.publisherHookPipeline = new PublisherHookPipeline(\n publisherHooks,\n publisherHookErrorPolicy,\n );\n }\n\n public subscribe<TEvent extends DomainEvent>(\n name: TEvent['name'],\n handler: MessageHandler<TEvent, void>,\n ): void {\n const handlers = this.handlers.get(name) ?? [];\n\n handlers.push(handler as MessageHandler<DomainEvent, void>);\n this.handlers.set(name, handlers);\n }\n\n public async publish<TEvent extends DomainEvent>(\n event: TEvent,\n ): Promise<void> {\n const handlers = this.handlers.get(event.name) ?? [];\n\n await this.publisherHookPipeline.run(\n { message: event, metadata: event.metadata ?? {}, topic: event.name },\n async () => {\n for (const handler of handlers) {\n await handler(event, this.context);\n }\n },\n );\n }\n\n public registerPublisherHooks(...hooks: PublisherHook[]): void {\n this.publisherHookPipeline.register(...hooks);\n }\n}\n","import type {\n HandlerContext,\n Message,\n MessageHandler,\n PublisherHook,\n PublisherHookErrorPolicy,\n Subscription,\n} from '../../../contracts/index.js';\n\nimport { PublisherHookPipeline } from '../PublisherHookPipeline.js';\n\nexport class InMemoryPubSub {\n private readonly consumers = new Map<\n string,\n Set<MessageHandler<Message, void>>\n >();\n\n private readonly publisherHookPipeline: PublisherHookPipeline;\n\n constructor(\n private readonly context: HandlerContext,\n publisherHooks: readonly PublisherHook[] = [],\n publisherHookErrorPolicy?: PublisherHookErrorPolicy,\n ) {\n this.publisherHookPipeline = new PublisherHookPipeline(\n publisherHooks,\n publisherHookErrorPolicy,\n );\n }\n\n public async publish<TMessage extends Message>(\n topic: string,\n message: TMessage,\n ): Promise<void> {\n const consumers = this.consumers.get(topic) ?? new Set();\n\n await this.publisherHookPipeline.run(\n { message, metadata: message.metadata ?? {}, topic },\n async () => {\n for (const consumer of consumers) {\n await consumer(message, this.context);\n }\n },\n );\n }\n\n public subscribe<TMessage extends Message>(\n topic: string,\n consumer: MessageHandler<TMessage, void>,\n ): Promise<Subscription> {\n const consumers =\n this.consumers.get(topic) ?? new Set<MessageHandler<Message, void>>();\n const castConsumer = consumer as MessageHandler<Message, void>;\n\n consumers.add(castConsumer);\n this.consumers.set(topic, consumers);\n\n return Promise.resolve({\n close: () => {\n consumers.delete(castConsumer);\n\n return Promise.resolve();\n },\n });\n }\n\n public registerPublisherHooks(...hooks: PublisherHook[]): void {\n this.publisherHookPipeline.register(...hooks);\n }\n}\n"],"mappings":";AAKO,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;;;AClEO,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,YACmB,SACjB,iBAA2C,CAAC,GAC5C,0BACA;AAHiB;AAIjB,SAAK,wBAAwB,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EARmB;AAAA,EARF,WAAW,oBAAI,IAG9B;AAAA,EAEe;AAAA,EAaV,UACL,MACA,SACM;AACN,UAAM,WAAW,KAAK,SAAS,IAAI,IAAI,KAAK,CAAC;AAE7C,aAAS,KAAK,OAA4C;AAC1D,SAAK,SAAS,IAAI,MAAM,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAa,QACX,OACe;AACf,UAAM,WAAW,KAAK,SAAS,IAAI,MAAM,IAAI,KAAK,CAAC;AAEnD,UAAM,KAAK,sBAAsB;AAAA,MAC/B,EAAE,SAAS,OAAO,UAAU,MAAM,YAAY,CAAC,GAAG,OAAO,MAAM,KAAK;AAAA,MACpE,YAAY;AACV,mBAAW,WAAW,UAAU;AAC9B,gBAAM,QAAQ,OAAO,KAAK,OAAO;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,0BAA0B,OAA8B;AAC7D,SAAK,sBAAsB,SAAS,GAAG,KAAK;AAAA,EAC9C;AACF;;;AC9CO,IAAM,iBAAN,MAAqB;AAAA,EAQ1B,YACmB,SACjB,iBAA2C,CAAC,GAC5C,0BACA;AAHiB;AAIjB,SAAK,wBAAwB,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EARmB;AAAA,EARF,YAAY,oBAAI,IAG/B;AAAA,EAEe;AAAA,EAajB,MAAa,QACX,OACA,SACe;AACf,UAAM,YAAY,KAAK,UAAU,IAAI,KAAK,KAAK,oBAAI,IAAI;AAEvD,UAAM,KAAK,sBAAsB;AAAA,MAC/B,EAAE,SAAS,UAAU,QAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,MACnD,YAAY;AACV,mBAAW,YAAY,WAAW;AAChC,gBAAM,SAAS,SAAS,KAAK,OAAO;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,UACL,OACA,UACuB;AACvB,UAAM,YACJ,KAAK,UAAU,IAAI,KAAK,KAAK,oBAAI,IAAmC;AACtE,UAAM,eAAe;AAErB,cAAU,IAAI,YAAY;AAC1B,SAAK,UAAU,IAAI,OAAO,SAAS;AAEnC,WAAO,QAAQ,QAAQ;AAAA,MACrB,OAAO,MAAM;AACX,kBAAU,OAAO,YAAY;AAE7B,eAAO,QAAQ,QAAQ;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,0BAA0B,OAA8B;AAC7D,SAAK,sBAAsB,SAAS,GAAG,KAAK;AAAA,EAC9C;AACF;","names":[]}
@@ -31,10 +31,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var pubsub_exports = {};
32
32
  __export(pubsub_exports, {
33
33
  Consumer: () => Consumer,
34
+ ConsumerMiddlewarePipeline: () => ConsumerMiddlewarePipeline,
35
+ CorrelationConsumerMiddleware: () => CorrelationConsumerMiddleware,
36
+ DefaultPublisherHookErrorPolicy: () => DefaultPublisherHookErrorPolicy,
37
+ IdempotencyConsumerMiddleware: () => IdempotencyConsumerMiddleware,
34
38
  InMemoryEventBus: () => InMemoryEventBus,
39
+ InMemoryIdempotencyStore: () => InMemoryIdempotencyStore,
35
40
  InMemoryPubSub: () => InMemoryPubSub,
36
41
  InvalidDomainEventError: () => InvalidDomainEventError,
37
42
  NoFailedMessagesError: () => NoFailedMessagesError,
43
+ PublisherHookPipeline: () => PublisherHookPipeline,
44
+ RetryConsumerMiddleware: () => RetryConsumerMiddleware,
38
45
  default: () => Consumer_default
39
46
  });
40
47
  module.exports = __toCommonJS(pubsub_exports);
@@ -81,6 +88,7 @@ var DependencyInjection = class _DependencyInjection {
81
88
  autowire;
82
89
  loader;
83
90
  container;
91
+ overrideTokenIds = /* @__PURE__ */ new Map();
84
92
  static configure(options) {
85
93
  _DependencyInjection.configuredInstance = new _DependencyInjection(options);
86
94
  return _DependencyInjection.configuredInstance;
@@ -105,6 +113,16 @@ var DependencyInjection = class _DependencyInjection {
105
113
  getServiceClassName(serviceName) {
106
114
  return typeof serviceName === "function" ? serviceName.name : void 0;
107
115
  }
116
+ getOverrideId(prefix, token) {
117
+ const tokenName = this.getServiceClassName(token) ?? String(token);
118
+ return `ddd-kernel.override.${prefix}.${tokenName}`;
119
+ }
120
+ ensureSyntheticService(id, value) {
121
+ const definition = this.container.register(id);
122
+ definition.public = true;
123
+ definition.synthetic = true;
124
+ this.container.set(id, value);
125
+ }
108
126
  parentMatchesService(parentId, serviceClassName) {
109
127
  if (!parentId) {
110
128
  return false;
@@ -116,6 +134,26 @@ var DependencyInjection = class _DependencyInjection {
116
134
  const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
117
135
  return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);
118
136
  }
137
+ serviceIdReferencesService(serviceId, serviceClassName) {
138
+ const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
139
+ return serviceName.endsWith(`__${serviceClassName}`);
140
+ }
141
+ getReferenceId(value) {
142
+ if (typeof value === "object" && value !== null && "id" in value && typeof value.id === "string") {
143
+ return value.id;
144
+ }
145
+ return void 0;
146
+ }
147
+ getDefinitionArgumentReferences(definition) {
148
+ return [
149
+ ...definition._args ?? [],
150
+ ...definition._appendArgs ?? [],
151
+ ...definition._overrideArgs ?? []
152
+ ].flatMap((argument) => {
153
+ const referenceId = this.getReferenceId(argument);
154
+ return referenceId ? [referenceId] : [];
155
+ });
156
+ }
119
157
  findConcreteChildServiceId(serviceName) {
120
158
  const serviceClassName = this.getServiceClassName(serviceName);
121
159
  if (!serviceClassName) {
@@ -146,6 +184,86 @@ var DependencyInjection = class _DependencyInjection {
146
184
  );
147
185
  return matches[matches.length - 1];
148
186
  }
187
+ findReferencedServiceIds(serviceName) {
188
+ const serviceClassName = this.getServiceClassName(serviceName);
189
+ if (!serviceClassName) {
190
+ return [];
191
+ }
192
+ return [
193
+ ...new Set(
194
+ [...this.definitions.values()].flatMap(
195
+ (definition) => this.getDefinitionArgumentReferences(definition)
196
+ ).filter(
197
+ (id) => this.serviceIdReferencesService(id, serviceClassName)
198
+ )
199
+ )
200
+ ];
201
+ }
202
+ getOverrideTokenIds(token) {
203
+ const tokenIds = [
204
+ this.findRegisteredServiceId(token),
205
+ this.findAliasServiceId(token),
206
+ ...this.findReferencedServiceIds(token)
207
+ ].filter((id) => id !== void 0);
208
+ const existingTokenIds = [...new Set(tokenIds)];
209
+ if (existingTokenIds.length > 0) {
210
+ return existingTokenIds;
211
+ }
212
+ const overrideTokenId = this.getOverrideId("token", token);
213
+ this.ensureSyntheticService(overrideTokenId, void 0);
214
+ return [overrideTokenId];
215
+ }
216
+ getOverrideClassServiceId(ClassDefinition) {
217
+ const registeredServiceId = this.findRegisteredServiceId(ClassDefinition);
218
+ if (registeredServiceId) {
219
+ return registeredServiceId;
220
+ }
221
+ const overrideClassId = this.getOverrideId("class", ClassDefinition);
222
+ this.container.register(overrideClassId, ClassDefinition);
223
+ return overrideClassId;
224
+ }
225
+ applyClassOverride(override) {
226
+ if (!("useClass" in override)) {
227
+ return;
228
+ }
229
+ const tokenIds = this.getOverrideTokenIds(override.token);
230
+ const classId = this.getOverrideClassServiceId(override.useClass);
231
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
232
+ for (const tokenId of tokenIds) {
233
+ this.container.setAlias(tokenId, classId);
234
+ }
235
+ }
236
+ applyFactoryOverride(override) {
237
+ if (!("useFactory" in override)) {
238
+ return;
239
+ }
240
+ const tokenIds = this.getOverrideTokenIds(override.token);
241
+ const factoryId = this.getOverrideId("factory", override.token);
242
+ this.ensureSyntheticService(factoryId, override.useFactory(this));
243
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
244
+ for (const tokenId of tokenIds) {
245
+ this.container.setAlias(tokenId, factoryId);
246
+ }
247
+ }
248
+ applyValueOverride(override) {
249
+ if (!("useValue" in override)) {
250
+ return;
251
+ }
252
+ const tokenIds = this.getOverrideTokenIds(override.token);
253
+ const valueId = this.getOverrideId("value", override.token);
254
+ this.ensureSyntheticService(valueId, override.useValue);
255
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
256
+ for (const tokenId of tokenIds) {
257
+ this.container.setAlias(tokenId, valueId);
258
+ }
259
+ }
260
+ applyOverrides() {
261
+ for (const override of this.options.overrides ?? []) {
262
+ this.applyClassOverride(override);
263
+ this.applyFactoryOverride(override);
264
+ this.applyValueOverride(override);
265
+ }
266
+ }
149
267
  registerParentAliases() {
150
268
  for (const [id, definition] of this.definitions.entries()) {
151
269
  if (definition._abstract === true || !definition._parent) {
@@ -168,17 +286,22 @@ var DependencyInjection = class _DependencyInjection {
168
286
  await this.loader.load(this.options.servicesYamlPath);
169
287
  }
170
288
  this.registerParentAliases();
289
+ this.applyOverrides();
171
290
  await this.container.compile();
172
291
  }
173
292
  getService(serviceName) {
174
- const childServiceId = this.findConcreteChildServiceId(serviceName);
175
- if (childServiceId) {
176
- return this.container.get(childServiceId);
293
+ const overrideTokenId = this.overrideTokenIds.get(serviceName);
294
+ if (overrideTokenId) {
295
+ return this.container.get(overrideTokenId);
177
296
  }
178
297
  const aliasServiceId = this.findAliasServiceId(serviceName);
179
298
  if (aliasServiceId) {
180
299
  return this.container.get(aliasServiceId);
181
300
  }
301
+ const childServiceId = this.findConcreteChildServiceId(serviceName);
302
+ if (childServiceId) {
303
+ return this.container.get(childServiceId);
304
+ }
182
305
  const registeredServiceId = this.findRegisteredServiceId(serviceName);
183
306
  if (registeredServiceId) {
184
307
  return this.container.get(registeredServiceId);
@@ -226,6 +349,9 @@ var Kernel = class _Kernel {
226
349
  static get logger() {
227
350
  return _Kernel.getActiveKernel().logger;
228
351
  }
352
+ static get active() {
353
+ return _Kernel.getActiveKernel();
354
+ }
229
355
  static get rootDirectory() {
230
356
  return process.cwd();
231
357
  }
@@ -294,13 +420,21 @@ var Kernel = class _Kernel {
294
420
  get schedulers() {
295
421
  return this.schedulersList;
296
422
  }
297
- async dependencyInjection() {
298
- this.dependencyInjectionInstance = this.dependencyInjectionInstance ?? DependencyInjection.configure({
299
- containerBuild: process.env.CONTAINER_BUILD === "true",
300
- servicesYamlPath: this.options.servicesYamlPath ?? import_node_path2.default.resolve(_Kernel.configDirectory, "container", "services.yaml"),
301
- sourceDirectory: this.options.sourceDirectory ?? _Kernel.sourceDirectory
302
- });
423
+ getDependencyInjectionOptions(options = {}) {
424
+ return {
425
+ containerBuild: options.containerBuild ?? process.env.CONTAINER_BUILD === "true",
426
+ overrides: options.overrides ?? [],
427
+ servicesYamlPath: options.servicesYamlPath ?? this.options.servicesYamlPath ?? import_node_path2.default.resolve(_Kernel.configDirectory, "container", "services.yaml"),
428
+ sourceDirectory: options.sourceDirectory ?? this.options.sourceDirectory ?? _Kernel.sourceDirectory
429
+ };
430
+ }
431
+ async dependencyInjection(options = {}) {
432
+ _Kernel.state.activeKernel = this;
433
+ this.dependencyInjectionInstance = this.dependencyInjectionInstance ?? DependencyInjection.configure(
434
+ this.getDependencyInjectionOptions(options)
435
+ );
303
436
  await this.dependencyInjectionInstance.compile();
437
+ _Kernel.state.activeKernel = this;
304
438
  }
305
439
  getRoutes() {
306
440
  return this.routes;
@@ -383,21 +517,52 @@ var Kernel = class _Kernel {
383
517
  }
384
518
  };
385
519
 
520
+ // src/adapters/pubsub/ConsumerMiddlewarePipeline.ts
521
+ var ConsumerMiddlewarePipeline = class {
522
+ constructor(middlewares) {
523
+ this.middlewares = middlewares;
524
+ }
525
+ middlewares;
526
+ async run(event, context, handler, index) {
527
+ const middleware = this.middlewares[index];
528
+ if (!middleware) {
529
+ await handler();
530
+ return;
531
+ }
532
+ await middleware.handle(
533
+ event,
534
+ () => this.run(event, context, handler, index + 1),
535
+ context
536
+ );
537
+ }
538
+ async execute(event, context, handler) {
539
+ await this.run(event, context, handler, 0);
540
+ }
541
+ };
542
+
386
543
  // src/adapters/pubsub/Consumer.ts
387
544
  var Consumer = class {
388
545
  constructor(consumer) {
389
546
  this.consumer = consumer;
390
547
  }
391
548
  consumer;
392
- async runMiddleware(event, middlewares, index) {
393
- const middleware = middlewares[index];
394
- if (!middleware) {
395
- await this.handler(event);
396
- return;
397
- }
398
- await middleware.handle(
549
+ async runMiddleware(event, consumerContext) {
550
+ const pipeline = new ConsumerMiddlewarePipeline(Kernel.consumerMiddleware);
551
+ const metadata = consumerContext?.metadata ?? {};
552
+ await pipeline.execute(
399
553
  event,
400
- () => this.runMiddleware(event, middlewares, index + 1)
554
+ {
555
+ causationId: event.getCausationId(),
556
+ correlationId: event.getCorrelationId(),
557
+ eventId: event.eventId,
558
+ eventName: this.eventName,
559
+ exchange: this.exchange,
560
+ kernel: Kernel.active,
561
+ metadata,
562
+ queueName: this.queueName,
563
+ rawMessage: metadata.rawMessage
564
+ },
565
+ () => this.handler(event)
401
566
  );
402
567
  }
403
568
  async init() {
@@ -406,7 +571,7 @@ var Consumer = class {
406
571
  this.eventName,
407
572
  this.domainEvent,
408
573
  this.exchange,
409
- (event) => this.runMiddleware(event, Kernel.consumerMiddleware, 0)
574
+ (event, context) => this.runMiddleware(event, context)
410
575
  );
411
576
  }
412
577
  get(service) {
@@ -415,6 +580,178 @@ var Consumer = class {
415
580
  };
416
581
  var Consumer_default = Consumer;
417
582
 
583
+ // src/adapters/pubsub/CorrelationConsumerMiddleware.ts
584
+ var CorrelationConsumerMiddleware = class {
585
+ constructor(options = {}) {
586
+ this.options = options;
587
+ }
588
+ options;
589
+ async handle(event, next, context) {
590
+ const correlationId = this.options.correlationId?.(event, context) ?? context.correlationId;
591
+ const causationId = this.options.causationId?.(event, context) ?? context.causationId;
592
+ if (correlationId) {
593
+ event.withCorrelationId(correlationId);
594
+ }
595
+ if (causationId) {
596
+ event.withCausationId(causationId);
597
+ }
598
+ await next();
599
+ }
600
+ };
601
+
602
+ // src/adapters/pubsub/DefaultPublisherHookErrorPolicy.ts
603
+ var DefaultPublisherHookErrorPolicy = class {
604
+ handleAfterPublishError(error, context) {
605
+ void error;
606
+ void context;
607
+ }
608
+ shouldFailAfterPublish(error, context) {
609
+ void error;
610
+ void context;
611
+ return false;
612
+ }
613
+ };
614
+
615
+ // src/adapters/pubsub/IdempotencyConsumerMiddleware.ts
616
+ var IdempotencyConsumerMiddleware = class {
617
+ constructor(options) {
618
+ this.options = options;
619
+ }
620
+ options;
621
+ async handleClaimedKey(key, next) {
622
+ const claimed = await this.options.store.claim?.(key);
623
+ if (!claimed) {
624
+ return;
625
+ }
626
+ try {
627
+ await next();
628
+ await (this.options.store.commit?.(key) ?? this.options.store.mark(key));
629
+ } catch (error) {
630
+ await this.options.store.release?.(key);
631
+ throw error;
632
+ }
633
+ }
634
+ async handleLegacyKey(key, next) {
635
+ if (await this.options.store.has(key)) {
636
+ return;
637
+ }
638
+ await next();
639
+ await this.options.store.mark(key);
640
+ }
641
+ async handle(event, next, context) {
642
+ const key = this.options.key?.(event, context) ?? context.eventId;
643
+ if (this.options.store.claim) {
644
+ await this.handleClaimedKey(key, next);
645
+ } else {
646
+ await this.handleLegacyKey(key, next);
647
+ }
648
+ }
649
+ };
650
+
651
+ // src/adapters/pubsub/InMemoryIdempotencyStore.ts
652
+ var InMemoryIdempotencyStore = class {
653
+ claimedKeys = /* @__PURE__ */ new Set();
654
+ handledKeys = /* @__PURE__ */ new Set();
655
+ claim(key) {
656
+ if (this.handledKeys.has(key) || this.claimedKeys.has(key)) {
657
+ return false;
658
+ }
659
+ this.claimedKeys.add(key);
660
+ return true;
661
+ }
662
+ commit(key) {
663
+ this.claimedKeys.delete(key);
664
+ this.handledKeys.add(key);
665
+ }
666
+ release(key) {
667
+ this.claimedKeys.delete(key);
668
+ }
669
+ has(key) {
670
+ return this.handledKeys.has(key);
671
+ }
672
+ mark(key) {
673
+ this.handledKeys.add(key);
674
+ }
675
+ };
676
+
677
+ // src/adapters/pubsub/PublisherHookPipeline.ts
678
+ var PublisherHookPipeline = class {
679
+ constructor(hooks = [], errorPolicy = new DefaultPublisherHookErrorPolicy()) {
680
+ this.errorPolicy = errorPolicy;
681
+ this.hooks.push(...hooks);
682
+ }
683
+ errorPolicy;
684
+ hooks = [];
685
+ async runAfterPublishHooks(context) {
686
+ for (const hook of this.hooks) {
687
+ await this.runAfterPublishHook(hook, context);
688
+ }
689
+ }
690
+ async runAfterPublishHook(hook, context) {
691
+ try {
692
+ await hook.afterPublish?.(context);
693
+ } catch (error) {
694
+ await this.errorPolicy.handleAfterPublishError(error, context);
695
+ if (this.errorPolicy.shouldFailAfterPublish(error, context)) {
696
+ throw error;
697
+ }
698
+ }
699
+ }
700
+ async runBeforePublishHooks(context) {
701
+ for (const hook of this.hooks) {
702
+ await hook.beforePublish?.(context);
703
+ }
704
+ }
705
+ async runPublishErrorHooks(error, context) {
706
+ for (const hook of this.hooks) {
707
+ await hook.onPublishError?.(error, context);
708
+ }
709
+ }
710
+ register(...hooks) {
711
+ this.hooks.push(...hooks);
712
+ }
713
+ async run(context, publish) {
714
+ await this.runBeforePublishHooks(context);
715
+ try {
716
+ const result = await publish();
717
+ await this.runAfterPublishHooks(context);
718
+ return result;
719
+ } catch (error) {
720
+ await this.runPublishErrorHooks(error, context);
721
+ throw error;
722
+ }
723
+ }
724
+ };
725
+
726
+ // src/adapters/pubsub/RetryConsumerMiddleware.ts
727
+ var RetryConsumerMiddleware = class {
728
+ constructor(options) {
729
+ this.options = options;
730
+ }
731
+ options;
732
+ async delay(attempt, error, context) {
733
+ const delayInMilliseconds = typeof this.options.delay === "function" ? await this.options.delay(attempt, error, context) : this.options.delay ?? 0;
734
+ if (delayInMilliseconds > 0) {
735
+ await new Promise((resolve) => setTimeout(resolve, delayInMilliseconds));
736
+ }
737
+ }
738
+ async handle(event, next, context) {
739
+ for (let attempt = 1; attempt <= this.options.maxAttempts; attempt++) {
740
+ try {
741
+ await next();
742
+ return;
743
+ } catch (error) {
744
+ const canRetry = attempt < this.options.maxAttempts && await (this.options.shouldRetry?.(error, attempt, context) ?? true);
745
+ if (!canRetry) {
746
+ throw error;
747
+ }
748
+ await this.options.onRetry?.(error, attempt, context);
749
+ await this.delay(attempt, error, context);
750
+ }
751
+ }
752
+ }
753
+ };
754
+
418
755
  // src/adapters/pubsub/amqp/AmqpMessageBusAdapter.ts
419
756
  var import_amqplib = __toESM(require("amqplib"), 1);
420
757
  var import_node_crypto = require("crypto");
@@ -437,11 +774,16 @@ var NoFailedMessagesError = class extends Error {
437
774
 
438
775
  // src/adapters/pubsub/in-memory/InMemoryEventBus.ts
439
776
  var InMemoryEventBus = class {
440
- constructor(context) {
777
+ constructor(context, publisherHooks = [], publisherHookErrorPolicy) {
441
778
  this.context = context;
779
+ this.publisherHookPipeline = new PublisherHookPipeline(
780
+ publisherHooks,
781
+ publisherHookErrorPolicy
782
+ );
442
783
  }
443
784
  context;
444
785
  handlers = /* @__PURE__ */ new Map();
786
+ publisherHookPipeline;
445
787
  subscribe(name, handler) {
446
788
  const handlers = this.handlers.get(name) ?? [];
447
789
  handlers.push(handler);
@@ -449,24 +791,42 @@ var InMemoryEventBus = class {
449
791
  }
450
792
  async publish(event) {
451
793
  const handlers = this.handlers.get(event.name) ?? [];
452
- for (const handler of handlers) {
453
- await handler(event, this.context);
454
- }
794
+ await this.publisherHookPipeline.run(
795
+ { message: event, metadata: event.metadata ?? {}, topic: event.name },
796
+ async () => {
797
+ for (const handler of handlers) {
798
+ await handler(event, this.context);
799
+ }
800
+ }
801
+ );
802
+ }
803
+ registerPublisherHooks(...hooks) {
804
+ this.publisherHookPipeline.register(...hooks);
455
805
  }
456
806
  };
457
807
 
458
808
  // src/adapters/pubsub/in-memory/InMemoryPubSub.ts
459
809
  var InMemoryPubSub = class {
460
- constructor(context) {
810
+ constructor(context, publisherHooks = [], publisherHookErrorPolicy) {
461
811
  this.context = context;
812
+ this.publisherHookPipeline = new PublisherHookPipeline(
813
+ publisherHooks,
814
+ publisherHookErrorPolicy
815
+ );
462
816
  }
463
817
  context;
464
818
  consumers = /* @__PURE__ */ new Map();
819
+ publisherHookPipeline;
465
820
  async publish(topic, message) {
466
821
  const consumers = this.consumers.get(topic) ?? /* @__PURE__ */ new Set();
467
- for (const consumer of consumers) {
468
- await consumer(message, this.context);
469
- }
822
+ await this.publisherHookPipeline.run(
823
+ { message, metadata: message.metadata ?? {}, topic },
824
+ async () => {
825
+ for (const consumer of consumers) {
826
+ await consumer(message, this.context);
827
+ }
828
+ }
829
+ );
470
830
  }
471
831
  subscribe(topic, consumer) {
472
832
  const consumers = this.consumers.get(topic) ?? /* @__PURE__ */ new Set();
@@ -480,13 +840,23 @@ var InMemoryPubSub = class {
480
840
  }
481
841
  });
482
842
  }
843
+ registerPublisherHooks(...hooks) {
844
+ this.publisherHookPipeline.register(...hooks);
845
+ }
483
846
  };
484
847
  // Annotate the CommonJS export names for ESM import in node:
485
848
  0 && (module.exports = {
486
849
  Consumer,
850
+ ConsumerMiddlewarePipeline,
851
+ CorrelationConsumerMiddleware,
852
+ DefaultPublisherHookErrorPolicy,
853
+ IdempotencyConsumerMiddleware,
487
854
  InMemoryEventBus,
855
+ InMemoryIdempotencyStore,
488
856
  InMemoryPubSub,
489
857
  InvalidDomainEventError,
490
- NoFailedMessagesError
858
+ NoFailedMessagesError,
859
+ PublisherHookPipeline,
860
+ RetryConsumerMiddleware
491
861
  });
492
862
  //# sourceMappingURL=index.cjs.map