@haskou/ddd-kernel 0.1.0 → 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.
- package/README.md +44 -115
- package/dist/DomainEventConsumer-Bg-bOwmh.d.cts +11 -0
- package/dist/DomainEventConsumer-BroJmVty.d.ts +11 -0
- package/dist/DomainMessageBus-3jYk7TPw.d.ts +13 -0
- package/dist/DomainMessageBus-OyliPu3Z.d.cts +13 -0
- package/dist/MessageBus-BtUXnd0Y.d.cts +10 -0
- package/dist/MessageBus-oQ9BnW84.d.ts +10 -0
- package/dist/{NoFailedMessagesError-0YJKRWPF.d.ts → NoFailedMessagesError-BLpGI-G4.d.ts} +6 -1
- package/dist/{NoFailedMessagesError-Kz7CYWpT.d.cts → NoFailedMessagesError-BjxYoKTR.d.cts} +6 -1
- package/dist/PublisherHookErrorPolicy-CjouTcSR.d.cts +8 -0
- package/dist/PublisherHookErrorPolicy-DSsCNE6O.d.ts +8 -0
- package/dist/RetryPredicate-U7dYnQ4N.d.ts +15 -0
- package/dist/RetryPredicate-yT_z9zk1.d.cts +15 -0
- package/dist/{Scheduler-oigqNOUJ.d.ts → Scheduler-BW-U5Ccg.d.cts} +1 -1
- package/dist/{Scheduler-oigqNOUJ.d.cts → Scheduler-BW-U5Ccg.d.ts} +1 -1
- package/dist/ServiceClass-BkEHcXDi.d.cts +72 -0
- package/dist/ServiceClass-Bq_fBC5R.d.ts +72 -0
- package/dist/{Kernel-BWUOUWWI.d.cts → ShutdownHook-BjbnCKzr.d.cts} +49 -7
- package/dist/{Kernel-CUaqHa1s.d.ts → ShutdownHook-CMWLsfu-.d.ts} +49 -7
- package/dist/Subscription-4vuAAxax.d.cts +23 -0
- package/dist/Subscription-vtF0lEHP.d.ts +23 -0
- package/dist/adapters/index.cjs +665 -37
- package/dist/adapters/index.cjs.map +1 -1
- package/dist/adapters/index.d.cts +15 -13
- package/dist/adapters/index.d.ts +15 -13
- package/dist/adapters/index.js +659 -37
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/pubsub/amqp/index.cjs +241 -16
- package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
- package/dist/adapters/pubsub/amqp/index.d.cts +16 -8
- package/dist/adapters/pubsub/amqp/index.d.ts +16 -8
- package/dist/adapters/pubsub/amqp/index.js +241 -16
- package/dist/adapters/pubsub/amqp/index.js.map +1 -1
- package/dist/adapters/pubsub/in-memory/index.cjs +96 -8
- package/dist/adapters/pubsub/in-memory/index.cjs.map +1 -1
- package/dist/adapters/pubsub/in-memory/index.d.cts +9 -3
- package/dist/adapters/pubsub/in-memory/index.d.ts +9 -3
- package/dist/adapters/pubsub/in-memory/index.js +96 -8
- package/dist/adapters/pubsub/in-memory/index.js.map +1 -1
- package/dist/adapters/pubsub/index.cjs +397 -27
- package/dist/adapters/pubsub/index.cjs.map +1 -1
- package/dist/adapters/pubsub/index.d.cts +89 -7
- package/dist/adapters/pubsub/index.d.ts +89 -7
- package/dist/adapters/pubsub/index.js +389 -26
- package/dist/adapters/pubsub/index.js.map +1 -1
- package/dist/adapters/ui/express/index.cjs +279 -11
- package/dist/adapters/ui/express/index.cjs.map +1 -1
- package/dist/adapters/ui/express/index.d.cts +127 -12
- package/dist/adapters/ui/express/index.d.ts +127 -12
- package/dist/adapters/ui/express/index.js +270 -11
- package/dist/adapters/ui/express/index.js.map +1 -1
- package/dist/adapters/ui/index.cjs +412 -27
- package/dist/adapters/ui/index.cjs.map +1 -1
- package/dist/adapters/ui/index.d.cts +7 -8
- package/dist/adapters/ui/index.d.ts +7 -8
- package/dist/adapters/ui/index.js +413 -27
- package/dist/adapters/ui/index.js.map +1 -1
- package/dist/adapters/ui/routes/index.cjs +136 -9
- package/dist/adapters/ui/routes/index.cjs.map +1 -1
- package/dist/adapters/ui/routes/index.js +136 -9
- package/dist/adapters/ui/routes/index.js.map +1 -1
- package/dist/contracts/index.cjs +16 -17
- package/dist/contracts/index.cjs.map +1 -1
- package/dist/contracts/index.d.cts +10 -2
- package/dist/contracts/index.d.ts +10 -2
- package/dist/contracts/index.js +16 -17
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/kernel/index.cjs.map +1 -1
- package/dist/contracts/kernel/index.d.cts +7 -1
- package/dist/contracts/kernel/index.d.ts +7 -1
- package/dist/contracts/pubsub/index.cjs.map +1 -1
- package/dist/contracts/pubsub/index.d.cts +5 -1
- package/dist/contracts/pubsub/index.d.ts +5 -1
- package/dist/contracts/ui/index.cjs +16 -17
- package/dist/contracts/ui/index.cjs.map +1 -1
- package/dist/contracts/ui/index.d.cts +16 -16
- package/dist/contracts/ui/index.d.ts +16 -16
- package/dist/contracts/ui/index.js +16 -17
- package/dist/contracts/ui/index.js.map +1 -1
- package/dist/domain/index.cjs.map +1 -1
- package/dist/domain/index.d.cts +6 -2
- package/dist/domain/index.d.ts +6 -2
- package/dist/domain/index.js.map +1 -1
- package/dist/index.cjs +152 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -7
- package/dist/index.d.ts +8 -7
- package/dist/index.js +152 -26
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/dependency-injection/index.cjs +119 -3
- package/dist/infrastructure/dependency-injection/index.cjs.map +1 -1
- package/dist/infrastructure/dependency-injection/index.d.cts +4 -1
- package/dist/infrastructure/dependency-injection/index.d.ts +4 -1
- package/dist/infrastructure/dependency-injection/index.js +119 -3
- package/dist/infrastructure/dependency-injection/index.js.map +1 -1
- package/dist/infrastructure/express/index.cjs +279 -11
- package/dist/infrastructure/express/index.cjs.map +1 -1
- package/dist/infrastructure/express/index.d.cts +7 -8
- package/dist/infrastructure/express/index.d.ts +7 -8
- package/dist/infrastructure/express/index.js +270 -11
- package/dist/infrastructure/express/index.js.map +1 -1
- package/dist/infrastructure/scheduler/index.cjs +136 -9
- package/dist/infrastructure/scheduler/index.cjs.map +1 -1
- package/dist/infrastructure/scheduler/index.d.cts +2 -2
- package/dist/infrastructure/scheduler/index.d.ts +2 -2
- package/dist/infrastructure/scheduler/index.js +136 -9
- package/dist/infrastructure/scheduler/index.js.map +1 -1
- package/package.json +101 -11
- package/dist/Consumer-CC8ZRCsd.d.cts +0 -17
- package/dist/Consumer-CeT0Wbxb.d.ts +0 -17
- package/dist/DomainEventConsumer-3WBMSSr2.d.cts +0 -7
- package/dist/DomainEventConsumer-B4hkIUmP.d.ts +0 -7
- package/dist/DomainEventPublisher-8G0lvmdy.d.cts +0 -7
- package/dist/DomainEventPublisher-DhGgM3f2.d.ts +0 -7
- package/dist/ServiceClass-BmNw8fJj.d.cts +0 -37
- package/dist/ServiceClass-C7NCKdSS.d.ts +0 -37
- package/dist/ShutdownHook-BGskq2-q.d.ts +0 -9
- package/dist/ShutdownHook-Dib5uNKB.d.cts +0 -9
- package/dist/Subscription-Bwkb_did.d.ts +0 -9
- 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
|
|
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":"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","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
|
|
175
|
-
if (
|
|
176
|
-
return this.container.get(
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
containerBuild: process.env.CONTAINER_BUILD === "true",
|
|
300
|
-
|
|
301
|
-
|
|
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,
|
|
393
|
-
const
|
|
394
|
-
|
|
395
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
453
|
-
|
|
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
|
-
|
|
468
|
-
|
|
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
|