@haskou/ddd-kernel 0.1.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/LICENSE +21 -0
- package/README.md +143 -0
- package/dist/Constructor-fyZLLIh8.d.cts +5 -0
- package/dist/Constructor-fyZLLIh8.d.ts +5 -0
- package/dist/Consumer-CC8ZRCsd.d.cts +17 -0
- package/dist/Consumer-CeT0Wbxb.d.ts +17 -0
- package/dist/DomainEvent-mXWEtr_J.d.cts +26 -0
- package/dist/DomainEvent-mXWEtr_J.d.ts +26 -0
- package/dist/DomainEventConsumer-3WBMSSr2.d.cts +7 -0
- package/dist/DomainEventConsumer-B4hkIUmP.d.ts +7 -0
- package/dist/DomainEventPublisher-8G0lvmdy.d.cts +7 -0
- package/dist/DomainEventPublisher-DhGgM3f2.d.ts +7 -0
- package/dist/HandlerContext-DUUExVo3.d.ts +20 -0
- package/dist/HandlerContext-Lm89pSeG.d.cts +20 -0
- package/dist/Kernel-BWUOUWWI.d.cts +70 -0
- package/dist/Kernel-CUaqHa1s.d.ts +70 -0
- package/dist/KernelLogger-BESOFrpW.d.cts +8 -0
- package/dist/KernelLogger-BESOFrpW.d.ts +8 -0
- package/dist/Log-36L3Z84a.d.cts +8 -0
- package/dist/Log-36L3Z84a.d.ts +8 -0
- package/dist/NoFailedMessagesError-0YJKRWPF.d.ts +45 -0
- package/dist/NoFailedMessagesError-Kz7CYWpT.d.cts +45 -0
- package/dist/Repository-D9CuAyCV.d.cts +7 -0
- package/dist/Repository-D9CuAyCV.d.ts +7 -0
- package/dist/Scheduler-oigqNOUJ.d.cts +27 -0
- package/dist/Scheduler-oigqNOUJ.d.ts +27 -0
- package/dist/ServiceClass-BmNw8fJj.d.cts +37 -0
- package/dist/ServiceClass-C7NCKdSS.d.ts +37 -0
- package/dist/ServiceResolver-D2Jz-l_Z.d.cts +5 -0
- package/dist/ServiceResolver-D2Jz-l_Z.d.ts +5 -0
- package/dist/ShutdownHook-BGskq2-q.d.ts +9 -0
- package/dist/ShutdownHook-Dib5uNKB.d.cts +9 -0
- package/dist/Subscription-Bwkb_did.d.ts +9 -0
- package/dist/Subscription-P9WROD_6.d.cts +9 -0
- package/dist/adapters/db/in-memory/index.cjs +46 -0
- package/dist/adapters/db/in-memory/index.cjs.map +1 -0
- package/dist/adapters/db/in-memory/index.d.cts +12 -0
- package/dist/adapters/db/in-memory/index.d.ts +12 -0
- package/dist/adapters/db/in-memory/index.js +19 -0
- package/dist/adapters/db/in-memory/index.js.map +1 -0
- package/dist/adapters/db/index.cjs +80 -0
- package/dist/adapters/db/index.cjs.map +1 -0
- package/dist/adapters/db/index.d.cts +4 -0
- package/dist/adapters/db/index.d.ts +4 -0
- package/dist/adapters/db/index.js +52 -0
- package/dist/adapters/db/index.js.map +1 -0
- package/dist/adapters/db/mongo/index.cjs +62 -0
- package/dist/adapters/db/mongo/index.cjs.map +1 -0
- package/dist/adapters/db/mongo/index.d.cts +22 -0
- package/dist/adapters/db/mongo/index.d.ts +22 -0
- package/dist/adapters/db/mongo/index.js +35 -0
- package/dist/adapters/db/mongo/index.js.map +1 -0
- package/dist/adapters/index.cjs +651 -0
- package/dist/adapters/index.cjs.map +1 -0
- package/dist/adapters/index.d.cts +26 -0
- package/dist/adapters/index.d.ts +26 -0
- package/dist/adapters/index.js +609 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/kernel/console/index.cjs +46 -0
- package/dist/adapters/kernel/console/index.cjs.map +1 -0
- package/dist/adapters/kernel/console/index.d.cts +10 -0
- package/dist/adapters/kernel/console/index.d.ts +10 -0
- package/dist/adapters/kernel/console/index.js +19 -0
- package/dist/adapters/kernel/console/index.js.map +1 -0
- package/dist/adapters/kernel/index.cjs +46 -0
- package/dist/adapters/kernel/index.cjs.map +1 -0
- package/dist/adapters/kernel/index.d.cts +2 -0
- package/dist/adapters/kernel/index.d.ts +2 -0
- package/dist/adapters/kernel/index.js +19 -0
- package/dist/adapters/kernel/index.js.map +1 -0
- package/dist/adapters/pubsub/amqp/index.cjs +724 -0
- package/dist/adapters/pubsub/amqp/index.cjs.map +1 -0
- package/dist/adapters/pubsub/amqp/index.d.cts +42 -0
- package/dist/adapters/pubsub/amqp/index.d.ts +42 -0
- package/dist/adapters/pubsub/amqp/index.js +691 -0
- package/dist/adapters/pubsub/amqp/index.js.map +1 -0
- package/dist/adapters/pubsub/in-memory/index.cjs +79 -0
- package/dist/adapters/pubsub/in-memory/index.cjs.map +1 -0
- package/dist/adapters/pubsub/in-memory/index.d.cts +21 -0
- package/dist/adapters/pubsub/in-memory/index.d.ts +21 -0
- package/dist/adapters/pubsub/in-memory/index.js +51 -0
- package/dist/adapters/pubsub/in-memory/index.js.map +1 -0
- package/dist/adapters/pubsub/index.cjs +492 -0
- package/dist/adapters/pubsub/index.cjs.map +1 -0
- package/dist/adapters/pubsub/index.d.cts +11 -0
- package/dist/adapters/pubsub/index.d.ts +11 -0
- package/dist/adapters/pubsub/index.js +456 -0
- package/dist/adapters/pubsub/index.js.map +1 -0
- package/dist/adapters/ui/express/index.cjs +126 -0
- package/dist/adapters/ui/express/index.cjs.map +1 -0
- package/dist/adapters/ui/express/index.d.cts +49 -0
- package/dist/adapters/ui/express/index.d.ts +49 -0
- package/dist/adapters/ui/express/index.js +98 -0
- package/dist/adapters/ui/express/index.js.map +1 -0
- package/dist/adapters/ui/index.cjs +489 -0
- package/dist/adapters/ui/index.cjs.map +1 -0
- package/dist/adapters/ui/index.d.cts +14 -0
- package/dist/adapters/ui/index.d.ts +14 -0
- package/dist/adapters/ui/index.js +455 -0
- package/dist/adapters/ui/index.js.map +1 -0
- package/dist/adapters/ui/routes/index.cjs +393 -0
- package/dist/adapters/ui/routes/index.cjs.map +1 -0
- package/dist/adapters/ui/routes/index.d.cts +5 -0
- package/dist/adapters/ui/routes/index.d.ts +5 -0
- package/dist/adapters/ui/routes/index.js +361 -0
- package/dist/adapters/ui/routes/index.js.map +1 -0
- package/dist/contracts/db/index.cjs +19 -0
- package/dist/contracts/db/index.cjs.map +1 -0
- package/dist/contracts/db/index.d.cts +7 -0
- package/dist/contracts/db/index.d.ts +7 -0
- package/dist/contracts/db/index.js +1 -0
- package/dist/contracts/db/index.js.map +1 -0
- package/dist/contracts/index.cjs +49 -0
- package/dist/contracts/index.cjs.map +1 -0
- package/dist/contracts/index.d.cts +11 -0
- package/dist/contracts/index.d.ts +11 -0
- package/dist/contracts/index.js +22 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/kernel/index.cjs +19 -0
- package/dist/contracts/kernel/index.cjs.map +1 -0
- package/dist/contracts/kernel/index.d.cts +9 -0
- package/dist/contracts/kernel/index.d.ts +9 -0
- package/dist/contracts/kernel/index.js +1 -0
- package/dist/contracts/kernel/index.js.map +1 -0
- package/dist/contracts/pubsub/index.cjs +19 -0
- package/dist/contracts/pubsub/index.cjs.map +1 -0
- package/dist/contracts/pubsub/index.d.cts +26 -0
- package/dist/contracts/pubsub/index.d.ts +26 -0
- package/dist/contracts/pubsub/index.js +1 -0
- package/dist/contracts/pubsub/index.js.map +1 -0
- package/dist/contracts/ui/index.cjs +49 -0
- package/dist/contracts/ui/index.cjs.map +1 -0
- package/dist/contracts/ui/index.d.cts +29 -0
- package/dist/contracts/ui/index.d.ts +29 -0
- package/dist/contracts/ui/index.js +22 -0
- package/dist/contracts/ui/index.js.map +1 -0
- package/dist/domain/index.cjs +121 -0
- package/dist/domain/index.cjs.map +1 -0
- package/dist/domain/index.d.cts +26 -0
- package/dist/domain/index.d.ts +26 -0
- package/dist/domain/index.js +89 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/errors/index.cjs +58 -0
- package/dist/errors/index.cjs.map +1 -0
- package/dist/errors/index.d.cts +13 -0
- package/dist/errors/index.d.ts +13 -0
- package/dist/errors/index.js +29 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.cjs +442 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +405 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/dependency-injection/index.cjs +169 -0
- package/dist/infrastructure/dependency-injection/index.cjs.map +1 -0
- package/dist/infrastructure/dependency-injection/index.d.cts +30 -0
- package/dist/infrastructure/dependency-injection/index.d.ts +30 -0
- package/dist/infrastructure/dependency-injection/index.js +137 -0
- package/dist/infrastructure/dependency-injection/index.js.map +1 -0
- package/dist/infrastructure/express/index.cjs +126 -0
- package/dist/infrastructure/express/index.cjs.map +1 -0
- package/dist/infrastructure/express/index.d.cts +14 -0
- package/dist/infrastructure/express/index.d.ts +14 -0
- package/dist/infrastructure/express/index.js +98 -0
- package/dist/infrastructure/express/index.js.map +1 -0
- package/dist/infrastructure/lifecycle/index.cjs +19 -0
- package/dist/infrastructure/lifecycle/index.cjs.map +1 -0
- package/dist/infrastructure/lifecycle/index.d.cts +9 -0
- package/dist/infrastructure/lifecycle/index.d.ts +9 -0
- package/dist/infrastructure/lifecycle/index.js +1 -0
- package/dist/infrastructure/lifecycle/index.js.map +1 -0
- package/dist/infrastructure/logs/index.cjs +144 -0
- package/dist/infrastructure/logs/index.cjs.map +1 -0
- package/dist/infrastructure/logs/index.d.cts +30 -0
- package/dist/infrastructure/logs/index.d.ts +30 -0
- package/dist/infrastructure/logs/index.js +107 -0
- package/dist/infrastructure/logs/index.js.map +1 -0
- package/dist/infrastructure/scheduler/index.cjs +461 -0
- package/dist/infrastructure/scheduler/index.cjs.map +1 -0
- package/dist/infrastructure/scheduler/index.d.cts +17 -0
- package/dist/infrastructure/scheduler/index.d.ts +17 -0
- package/dist/infrastructure/scheduler/index.js +426 -0
- package/dist/infrastructure/scheduler/index.js.map +1 -0
- package/dist/infrastructure/websocket/index.cjs +131 -0
- package/dist/infrastructure/websocket/index.cjs.map +1 -0
- package/dist/infrastructure/websocket/index.d.cts +56 -0
- package/dist/infrastructure/websocket/index.d.ts +56 -0
- package/dist/infrastructure/websocket/index.js +103 -0
- package/dist/infrastructure/websocket/index.js.map +1 -0
- package/package.json +248 -0
|
@@ -0,0 +1,651 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/adapters/index.ts
|
|
31
|
+
var adapters_exports = {};
|
|
32
|
+
__export(adapters_exports, {
|
|
33
|
+
ConsoleKernelLogger: () => ConsoleKernelLogger,
|
|
34
|
+
Consumer: () => Consumer,
|
|
35
|
+
ExpressKernelServer: () => ExpressKernelServer,
|
|
36
|
+
InMemoryEventBus: () => InMemoryEventBus,
|
|
37
|
+
InMemoryPubSub: () => InMemoryPubSub,
|
|
38
|
+
InMemoryRepository: () => InMemoryRepository,
|
|
39
|
+
InvalidDomainEventError: () => InvalidDomainEventError,
|
|
40
|
+
MongoRepository: () => MongoRepository,
|
|
41
|
+
NoFailedMessagesError: () => NoFailedMessagesError,
|
|
42
|
+
Route: () => Route,
|
|
43
|
+
RoutePrefix: () => RoutePrefix
|
|
44
|
+
});
|
|
45
|
+
module.exports = __toCommonJS(adapters_exports);
|
|
46
|
+
|
|
47
|
+
// src/adapters/db/in-memory/InMemoryRepository.ts
|
|
48
|
+
var InMemoryRepository = class {
|
|
49
|
+
entities = /* @__PURE__ */ new Map();
|
|
50
|
+
findById(id) {
|
|
51
|
+
return Promise.resolve(this.entities.get(id) ?? null);
|
|
52
|
+
}
|
|
53
|
+
save(entity) {
|
|
54
|
+
this.entities.set(entity.id, entity);
|
|
55
|
+
return Promise.resolve();
|
|
56
|
+
}
|
|
57
|
+
delete(id) {
|
|
58
|
+
this.entities.delete(id);
|
|
59
|
+
return Promise.resolve();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// src/adapters/db/mongo/MongoRepository.ts
|
|
64
|
+
var MongoRepository = class {
|
|
65
|
+
constructor(collection, mapper) {
|
|
66
|
+
this.collection = collection;
|
|
67
|
+
this.mapper = mapper;
|
|
68
|
+
}
|
|
69
|
+
collection;
|
|
70
|
+
mapper;
|
|
71
|
+
async findById(id) {
|
|
72
|
+
const document = await this.collection.findOne({
|
|
73
|
+
id
|
|
74
|
+
});
|
|
75
|
+
if (!document) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return this.mapper.toEntity(document);
|
|
79
|
+
}
|
|
80
|
+
async save(entity) {
|
|
81
|
+
const document = this.mapper.toDocument(entity);
|
|
82
|
+
await this.collection.updateOne(
|
|
83
|
+
{ id: document.id },
|
|
84
|
+
{ $set: document },
|
|
85
|
+
{ upsert: true }
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
async delete(id) {
|
|
89
|
+
await this.collection.deleteOne({
|
|
90
|
+
id
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// src/adapters/kernel/console/ConsoleKernelLogger.ts
|
|
96
|
+
var ConsoleKernelLogger = class {
|
|
97
|
+
debug(message) {
|
|
98
|
+
console.debug(message);
|
|
99
|
+
}
|
|
100
|
+
error(message) {
|
|
101
|
+
console.error(message);
|
|
102
|
+
}
|
|
103
|
+
info(message) {
|
|
104
|
+
console.info(message);
|
|
105
|
+
}
|
|
106
|
+
warn(message) {
|
|
107
|
+
console.warn(message);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// src/Kernel.ts
|
|
112
|
+
var import_node_path2 = __toESM(require("path"), 1);
|
|
113
|
+
|
|
114
|
+
// src/infrastructure/dependency-injection/DependencyInjection.ts
|
|
115
|
+
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
116
|
+
var import_node_dependency_injection = require("node-dependency-injection");
|
|
117
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
118
|
+
var DependencyInjection = class _DependencyInjection {
|
|
119
|
+
constructor(options = {
|
|
120
|
+
containerBuild: process.env.CONTAINER_BUILD === "true",
|
|
121
|
+
servicesYamlPath: import_node_path.default.resolve(
|
|
122
|
+
process.cwd(),
|
|
123
|
+
"config",
|
|
124
|
+
"container",
|
|
125
|
+
"services.yaml"
|
|
126
|
+
),
|
|
127
|
+
sourceDirectory: import_node_path.default.resolve(process.cwd(), "src")
|
|
128
|
+
}) {
|
|
129
|
+
this.options = options;
|
|
130
|
+
this.container = new import_node_dependency_injection.ContainerBuilder(false, this.options.sourceDirectory);
|
|
131
|
+
}
|
|
132
|
+
options;
|
|
133
|
+
static configuredInstance;
|
|
134
|
+
autowire;
|
|
135
|
+
loader;
|
|
136
|
+
container;
|
|
137
|
+
static configure(options) {
|
|
138
|
+
_DependencyInjection.configuredInstance = new _DependencyInjection(options);
|
|
139
|
+
return _DependencyInjection.configuredInstance;
|
|
140
|
+
}
|
|
141
|
+
static get instance() {
|
|
142
|
+
if (!_DependencyInjection.configuredInstance) {
|
|
143
|
+
throw new Error("DependencyInjection has not been configured.");
|
|
144
|
+
}
|
|
145
|
+
return _DependencyInjection.configuredInstance;
|
|
146
|
+
}
|
|
147
|
+
get definitions() {
|
|
148
|
+
const container = this.container;
|
|
149
|
+
return container._definitions || /* @__PURE__ */ new Map();
|
|
150
|
+
}
|
|
151
|
+
get aliases() {
|
|
152
|
+
const container = this.container;
|
|
153
|
+
return container._alias || /* @__PURE__ */ new Map();
|
|
154
|
+
}
|
|
155
|
+
async ensureFolderExists(filePath) {
|
|
156
|
+
await import_fs_extra.default.mkdir(import_node_path.default.dirname(filePath), { recursive: true });
|
|
157
|
+
}
|
|
158
|
+
getServiceClassName(serviceName) {
|
|
159
|
+
return typeof serviceName === "function" ? serviceName.name : void 0;
|
|
160
|
+
}
|
|
161
|
+
parentMatchesService(parentId, serviceClassName) {
|
|
162
|
+
if (!parentId) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
const parentName = Buffer.from(parentId, "base64").toString("utf8");
|
|
166
|
+
return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);
|
|
167
|
+
}
|
|
168
|
+
serviceIdMatchesService(serviceId, serviceClassName) {
|
|
169
|
+
const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
|
|
170
|
+
return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);
|
|
171
|
+
}
|
|
172
|
+
findConcreteChildServiceId(serviceName) {
|
|
173
|
+
const serviceClassName = this.getServiceClassName(serviceName);
|
|
174
|
+
if (!serviceClassName) {
|
|
175
|
+
return void 0;
|
|
176
|
+
}
|
|
177
|
+
const matches = [...this.definitions.entries()].filter(([, definition]) => definition._abstract !== true).filter(
|
|
178
|
+
([, definition]) => this.parentMatchesService(definition._parent, serviceClassName)
|
|
179
|
+
).map(([id]) => id);
|
|
180
|
+
return matches[matches.length - 1];
|
|
181
|
+
}
|
|
182
|
+
findRegisteredServiceId(serviceName) {
|
|
183
|
+
const serviceClassName = this.getServiceClassName(serviceName);
|
|
184
|
+
if (!serviceClassName) {
|
|
185
|
+
return void 0;
|
|
186
|
+
}
|
|
187
|
+
const matches = [...this.definitions.keys()].filter(
|
|
188
|
+
(id) => this.serviceIdMatchesService(id, serviceClassName)
|
|
189
|
+
);
|
|
190
|
+
return matches[matches.length - 1];
|
|
191
|
+
}
|
|
192
|
+
findAliasServiceId(serviceName) {
|
|
193
|
+
const serviceClassName = this.getServiceClassName(serviceName);
|
|
194
|
+
if (!serviceClassName) {
|
|
195
|
+
return void 0;
|
|
196
|
+
}
|
|
197
|
+
const matches = [...this.aliases.keys()].filter(
|
|
198
|
+
(id) => this.serviceIdMatchesService(id, serviceClassName)
|
|
199
|
+
);
|
|
200
|
+
return matches[matches.length - 1];
|
|
201
|
+
}
|
|
202
|
+
registerParentAliases() {
|
|
203
|
+
for (const [id, definition] of this.definitions.entries()) {
|
|
204
|
+
if (definition._abstract === true || !definition._parent) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
this.container.setAlias(definition._parent, id);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async compile() {
|
|
211
|
+
if (this.options.containerBuild) {
|
|
212
|
+
await this.ensureFolderExists(this.options.servicesYamlPath);
|
|
213
|
+
this.autowire = new import_node_dependency_injection.Autowire(this.container);
|
|
214
|
+
this.autowire.serviceFile = new import_node_dependency_injection.ServiceFile(
|
|
215
|
+
this.options.servicesYamlPath,
|
|
216
|
+
false
|
|
217
|
+
);
|
|
218
|
+
await this.autowire.process();
|
|
219
|
+
} else {
|
|
220
|
+
this.loader = new import_node_dependency_injection.YamlFileLoader(this.container);
|
|
221
|
+
await this.loader.load(this.options.servicesYamlPath);
|
|
222
|
+
}
|
|
223
|
+
this.registerParentAliases();
|
|
224
|
+
await this.container.compile();
|
|
225
|
+
}
|
|
226
|
+
getService(serviceName) {
|
|
227
|
+
const childServiceId = this.findConcreteChildServiceId(serviceName);
|
|
228
|
+
if (childServiceId) {
|
|
229
|
+
return this.container.get(childServiceId);
|
|
230
|
+
}
|
|
231
|
+
const aliasServiceId = this.findAliasServiceId(serviceName);
|
|
232
|
+
if (aliasServiceId) {
|
|
233
|
+
return this.container.get(aliasServiceId);
|
|
234
|
+
}
|
|
235
|
+
const registeredServiceId = this.findRegisteredServiceId(serviceName);
|
|
236
|
+
if (registeredServiceId) {
|
|
237
|
+
return this.container.get(registeredServiceId);
|
|
238
|
+
}
|
|
239
|
+
return this.container.get(serviceName);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// src/Kernel.ts
|
|
244
|
+
var Kernel = class _Kernel {
|
|
245
|
+
constructor(options = {}) {
|
|
246
|
+
this.options = options;
|
|
247
|
+
this.loggerInstance = options.logger ?? new ConsoleKernelLogger();
|
|
248
|
+
this.dependencyInjectionInstance = options.di;
|
|
249
|
+
_Kernel.state.activeKernel = this;
|
|
250
|
+
}
|
|
251
|
+
options;
|
|
252
|
+
static stateKey = /* @__PURE__ */ Symbol.for(
|
|
253
|
+
"@haskou/ddd-kernel/kernel-state"
|
|
254
|
+
);
|
|
255
|
+
consumerMiddlewares = [];
|
|
256
|
+
consumersList = [];
|
|
257
|
+
loggerInstance;
|
|
258
|
+
routesList = [];
|
|
259
|
+
schedulersList = [];
|
|
260
|
+
shutdownHooks = [];
|
|
261
|
+
dependencyInjectionInstance;
|
|
262
|
+
static get state() {
|
|
263
|
+
const stateContainer = globalThis;
|
|
264
|
+
stateContainer[_Kernel.stateKey] = stateContainer[_Kernel.stateKey] ?? {};
|
|
265
|
+
return stateContainer[_Kernel.stateKey];
|
|
266
|
+
}
|
|
267
|
+
static get configDirectory() {
|
|
268
|
+
return import_node_path2.default.resolve(_Kernel.rootDirectory, "config");
|
|
269
|
+
}
|
|
270
|
+
static get consumers() {
|
|
271
|
+
return _Kernel.getActiveKernel().consumers;
|
|
272
|
+
}
|
|
273
|
+
static get consumerMiddleware() {
|
|
274
|
+
return _Kernel.getActiveKernel().consumerMiddleware;
|
|
275
|
+
}
|
|
276
|
+
static get di() {
|
|
277
|
+
return _Kernel.getActiveKernel().di;
|
|
278
|
+
}
|
|
279
|
+
static get logger() {
|
|
280
|
+
return _Kernel.getActiveKernel().logger;
|
|
281
|
+
}
|
|
282
|
+
static get rootDirectory() {
|
|
283
|
+
return process.cwd();
|
|
284
|
+
}
|
|
285
|
+
static get routes() {
|
|
286
|
+
return _Kernel.getActiveKernel().routes;
|
|
287
|
+
}
|
|
288
|
+
static get schedulers() {
|
|
289
|
+
return _Kernel.getActiveKernel().schedulers;
|
|
290
|
+
}
|
|
291
|
+
static get sourceDirectory() {
|
|
292
|
+
return import_node_path2.default.resolve(_Kernel.rootDirectory, "src");
|
|
293
|
+
}
|
|
294
|
+
static getActiveKernel() {
|
|
295
|
+
if (!_Kernel.state.activeKernel) {
|
|
296
|
+
_Kernel.state.activeKernel = new _Kernel();
|
|
297
|
+
}
|
|
298
|
+
return _Kernel.state.activeKernel;
|
|
299
|
+
}
|
|
300
|
+
async closeCandidate(candidate) {
|
|
301
|
+
if (candidate.shutdown) {
|
|
302
|
+
await candidate.shutdown();
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (candidate.close) {
|
|
306
|
+
await candidate.close();
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (candidate.stop) {
|
|
310
|
+
await candidate.stop();
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (candidate.flush) {
|
|
314
|
+
await candidate.flush();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
getConsumerFromClass(ClassDefinition) {
|
|
318
|
+
return this.di.getService(ClassDefinition);
|
|
319
|
+
}
|
|
320
|
+
getInitializerFromClass(ClassDefinition) {
|
|
321
|
+
return this.di.getService(ClassDefinition);
|
|
322
|
+
}
|
|
323
|
+
getRuntimeFromClass(ClassDefinition) {
|
|
324
|
+
return this.di.getService(ClassDefinition);
|
|
325
|
+
}
|
|
326
|
+
getSchedulerFromClass(ClassDefinition) {
|
|
327
|
+
return this.di.getService(ClassDefinition);
|
|
328
|
+
}
|
|
329
|
+
get consumers() {
|
|
330
|
+
return this.consumersList;
|
|
331
|
+
}
|
|
332
|
+
get consumerMiddleware() {
|
|
333
|
+
return this.consumerMiddlewares;
|
|
334
|
+
}
|
|
335
|
+
get di() {
|
|
336
|
+
if (!this.dependencyInjectionInstance) {
|
|
337
|
+
throw new Error("Kernel dependency injection has not been initialized.");
|
|
338
|
+
}
|
|
339
|
+
return this.dependencyInjectionInstance;
|
|
340
|
+
}
|
|
341
|
+
get logger() {
|
|
342
|
+
return this.loggerInstance;
|
|
343
|
+
}
|
|
344
|
+
get routes() {
|
|
345
|
+
return this.routesList;
|
|
346
|
+
}
|
|
347
|
+
get schedulers() {
|
|
348
|
+
return this.schedulersList;
|
|
349
|
+
}
|
|
350
|
+
async dependencyInjection() {
|
|
351
|
+
this.dependencyInjectionInstance = this.dependencyInjectionInstance ?? DependencyInjection.configure({
|
|
352
|
+
containerBuild: process.env.CONTAINER_BUILD === "true",
|
|
353
|
+
servicesYamlPath: this.options.servicesYamlPath ?? import_node_path2.default.resolve(_Kernel.configDirectory, "container", "services.yaml"),
|
|
354
|
+
sourceDirectory: this.options.sourceDirectory ?? _Kernel.sourceDirectory
|
|
355
|
+
});
|
|
356
|
+
await this.dependencyInjectionInstance.compile();
|
|
357
|
+
}
|
|
358
|
+
getRoutes() {
|
|
359
|
+
return this.routes;
|
|
360
|
+
}
|
|
361
|
+
registerConsumerMiddleware(...middlewares) {
|
|
362
|
+
this.consumerMiddlewares.push(...middlewares);
|
|
363
|
+
}
|
|
364
|
+
registerConsumers(...ClassDefinitions) {
|
|
365
|
+
for (const ClassDefinition of ClassDefinitions) {
|
|
366
|
+
this.consumersList.push(this.getConsumerFromClass(ClassDefinition));
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
registerConsumerInstances(...consumers) {
|
|
370
|
+
this.consumersList.push(...consumers);
|
|
371
|
+
}
|
|
372
|
+
registerRoutes(...ClassDefinitions) {
|
|
373
|
+
this.routesList.push(...ClassDefinitions);
|
|
374
|
+
}
|
|
375
|
+
registerSchedulers(...ClassDefinitions) {
|
|
376
|
+
for (const ClassDefinition of ClassDefinitions) {
|
|
377
|
+
this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
registerSchedulerInstances(...schedulers) {
|
|
381
|
+
this.schedulersList.push(...schedulers);
|
|
382
|
+
}
|
|
383
|
+
registerShutdownHook(hook) {
|
|
384
|
+
this.shutdownHooks.push(hook);
|
|
385
|
+
}
|
|
386
|
+
removeConsumers() {
|
|
387
|
+
this.consumersList.length = 0;
|
|
388
|
+
}
|
|
389
|
+
removeRoutes() {
|
|
390
|
+
this.routesList.length = 0;
|
|
391
|
+
}
|
|
392
|
+
removeSchedulers() {
|
|
393
|
+
this.schedulersList.length = 0;
|
|
394
|
+
}
|
|
395
|
+
async runConsumers() {
|
|
396
|
+
for (const consumer of this.consumersList) {
|
|
397
|
+
await consumer.init();
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
async runInitializers(...ClassDefinitions) {
|
|
401
|
+
for (const ClassDefinition of ClassDefinitions) {
|
|
402
|
+
await this.getInitializerFromClass(ClassDefinition).ensure();
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
async runRuntimes(...ClassDefinitions) {
|
|
406
|
+
for (const ClassDefinition of ClassDefinitions) {
|
|
407
|
+
const runtime = this.getRuntimeFromClass(ClassDefinition);
|
|
408
|
+
await runtime.run();
|
|
409
|
+
this.registerShutdownHook(
|
|
410
|
+
() => this.closeCandidate(runtime)
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
async runSchedulerNowAndSchedule(ClassDefinition) {
|
|
415
|
+
const scheduler = this.getSchedulerFromClass(ClassDefinition);
|
|
416
|
+
await scheduler.runOnce();
|
|
417
|
+
await scheduler.init();
|
|
418
|
+
this.schedulersList.push(scheduler);
|
|
419
|
+
}
|
|
420
|
+
async runSchedulers() {
|
|
421
|
+
for (const scheduler of this.schedulersList) {
|
|
422
|
+
await scheduler.init();
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
async shutdown() {
|
|
426
|
+
for (const consumer of [...this.consumersList].reverse()) {
|
|
427
|
+
await this.closeCandidate(consumer);
|
|
428
|
+
}
|
|
429
|
+
for (const scheduler of [...this.schedulersList].reverse()) {
|
|
430
|
+
await this.closeCandidate(scheduler);
|
|
431
|
+
}
|
|
432
|
+
for (const hook of [...this.shutdownHooks].reverse()) {
|
|
433
|
+
await hook();
|
|
434
|
+
}
|
|
435
|
+
await this.closeCandidate(this.loggerInstance);
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
// src/adapters/pubsub/Consumer.ts
|
|
440
|
+
var Consumer = class {
|
|
441
|
+
constructor(consumer) {
|
|
442
|
+
this.consumer = consumer;
|
|
443
|
+
}
|
|
444
|
+
consumer;
|
|
445
|
+
async runMiddleware(event, middlewares, index) {
|
|
446
|
+
const middleware = middlewares[index];
|
|
447
|
+
if (!middleware) {
|
|
448
|
+
await this.handler(event);
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
await middleware.handle(
|
|
452
|
+
event,
|
|
453
|
+
() => this.runMiddleware(event, middlewares, index + 1)
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
async init() {
|
|
457
|
+
await this.consumer.consume(
|
|
458
|
+
this.queueName,
|
|
459
|
+
this.eventName,
|
|
460
|
+
this.domainEvent,
|
|
461
|
+
this.exchange,
|
|
462
|
+
(event) => this.runMiddleware(event, Kernel.consumerMiddleware, 0)
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
get(service) {
|
|
466
|
+
return Kernel.di.getService(service);
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
// src/adapters/pubsub/amqp/AmqpMessageBusAdapter.ts
|
|
471
|
+
var import_amqplib = __toESM(require("amqplib"), 1);
|
|
472
|
+
var import_node_crypto = require("crypto");
|
|
473
|
+
|
|
474
|
+
// src/adapters/pubsub/amqp/InvalidDomainEventError.ts
|
|
475
|
+
var InvalidDomainEventError = class extends Error {
|
|
476
|
+
constructor(message) {
|
|
477
|
+
super(`Invalid domain event: ${message}`);
|
|
478
|
+
this.name = "InvalidDomainEventError";
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
// src/adapters/pubsub/amqp/NoFailedMessagesError.ts
|
|
483
|
+
var NoFailedMessagesError = class extends Error {
|
|
484
|
+
constructor(queueName) {
|
|
485
|
+
super(`No failed messages found in "${queueName}".`);
|
|
486
|
+
this.name = "NoFailedMessagesError";
|
|
487
|
+
}
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
// src/adapters/pubsub/in-memory/InMemoryEventBus.ts
|
|
491
|
+
var InMemoryEventBus = class {
|
|
492
|
+
constructor(context) {
|
|
493
|
+
this.context = context;
|
|
494
|
+
}
|
|
495
|
+
context;
|
|
496
|
+
handlers = /* @__PURE__ */ new Map();
|
|
497
|
+
subscribe(name, handler) {
|
|
498
|
+
const handlers = this.handlers.get(name) ?? [];
|
|
499
|
+
handlers.push(handler);
|
|
500
|
+
this.handlers.set(name, handlers);
|
|
501
|
+
}
|
|
502
|
+
async publish(event) {
|
|
503
|
+
const handlers = this.handlers.get(event.name) ?? [];
|
|
504
|
+
for (const handler of handlers) {
|
|
505
|
+
await handler(event, this.context);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
// src/adapters/pubsub/in-memory/InMemoryPubSub.ts
|
|
511
|
+
var InMemoryPubSub = class {
|
|
512
|
+
constructor(context) {
|
|
513
|
+
this.context = context;
|
|
514
|
+
}
|
|
515
|
+
context;
|
|
516
|
+
consumers = /* @__PURE__ */ new Map();
|
|
517
|
+
async publish(topic, message) {
|
|
518
|
+
const consumers = this.consumers.get(topic) ?? /* @__PURE__ */ new Set();
|
|
519
|
+
for (const consumer of consumers) {
|
|
520
|
+
await consumer(message, this.context);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
subscribe(topic, consumer) {
|
|
524
|
+
const consumers = this.consumers.get(topic) ?? /* @__PURE__ */ new Set();
|
|
525
|
+
const castConsumer = consumer;
|
|
526
|
+
consumers.add(castConsumer);
|
|
527
|
+
this.consumers.set(topic, consumers);
|
|
528
|
+
return Promise.resolve({
|
|
529
|
+
close: () => {
|
|
530
|
+
consumers.delete(castConsumer);
|
|
531
|
+
return Promise.resolve();
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
|
|
537
|
+
// src/adapters/ui/express/ExpressKernelServer.ts
|
|
538
|
+
var import_routing_controllers = require("routing-controllers");
|
|
539
|
+
var ExpressKernelServer = class {
|
|
540
|
+
constructor(options) {
|
|
541
|
+
this.options = options;
|
|
542
|
+
}
|
|
543
|
+
options;
|
|
544
|
+
appInstance;
|
|
545
|
+
serverInstance;
|
|
546
|
+
registerErrorHandlers(app) {
|
|
547
|
+
const handlers = this.options.errorHandlers ?? [this.defaultErrorHandler()];
|
|
548
|
+
for (const handler of handlers) {
|
|
549
|
+
app.use(handler);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
defaultErrorHandler() {
|
|
553
|
+
return (error, request, response) => {
|
|
554
|
+
void request;
|
|
555
|
+
response.status(500).json({
|
|
556
|
+
error: error instanceof Error ? error.message : String(error)
|
|
557
|
+
});
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
get app() {
|
|
561
|
+
if (!this.appInstance) {
|
|
562
|
+
throw new Error("HTTP server is not running.");
|
|
563
|
+
}
|
|
564
|
+
return this.appInstance;
|
|
565
|
+
}
|
|
566
|
+
get server() {
|
|
567
|
+
if (!this.serverInstance) {
|
|
568
|
+
throw new Error("HTTP server is not running.");
|
|
569
|
+
}
|
|
570
|
+
return this.serverInstance;
|
|
571
|
+
}
|
|
572
|
+
close() {
|
|
573
|
+
if (!this.serverInstance) {
|
|
574
|
+
return Promise.resolve();
|
|
575
|
+
}
|
|
576
|
+
return new Promise((resolve, reject) => {
|
|
577
|
+
this.serverInstance?.close((error) => {
|
|
578
|
+
if (error) {
|
|
579
|
+
reject(error);
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
this.serverInstance = void 0;
|
|
583
|
+
this.appInstance = void 0;
|
|
584
|
+
resolve();
|
|
585
|
+
});
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
run() {
|
|
589
|
+
const app = (0, import_routing_controllers.createExpressServer)({
|
|
590
|
+
controllers: this.options.kernel.getRoutes(),
|
|
591
|
+
routePrefix: this.options.routePrefix
|
|
592
|
+
});
|
|
593
|
+
for (const middleware of this.options.middlewares ?? []) {
|
|
594
|
+
app.use(middleware);
|
|
595
|
+
}
|
|
596
|
+
this.registerErrorHandlers(app);
|
|
597
|
+
this.appInstance = app;
|
|
598
|
+
return new Promise((resolve) => {
|
|
599
|
+
this.serverInstance = app.listen(this.options.port ?? 3e3, () => {
|
|
600
|
+
resolve();
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
// src/adapters/ui/express/RoutePrefix.ts
|
|
607
|
+
var RoutePrefix = class _RoutePrefix {
|
|
608
|
+
value;
|
|
609
|
+
static fromEnvironment(value) {
|
|
610
|
+
return new _RoutePrefix(value);
|
|
611
|
+
}
|
|
612
|
+
constructor(value) {
|
|
613
|
+
if (!value || value === "/") {
|
|
614
|
+
this.value = "";
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
const normalizedPrefix = value.trim().replace(/^\/+/, "").replace(/\/+$/, "");
|
|
618
|
+
this.value = normalizedPrefix ? `/${normalizedPrefix}` : "";
|
|
619
|
+
}
|
|
620
|
+
includes(requestPath) {
|
|
621
|
+
return this.value.length > 0 && (requestPath === this.value || requestPath.startsWith(`${this.value}/`));
|
|
622
|
+
}
|
|
623
|
+
isEmpty() {
|
|
624
|
+
return this.value.length === 0;
|
|
625
|
+
}
|
|
626
|
+
toString() {
|
|
627
|
+
return this.value;
|
|
628
|
+
}
|
|
629
|
+
};
|
|
630
|
+
|
|
631
|
+
// src/adapters/ui/routes/Route.ts
|
|
632
|
+
var Route = class {
|
|
633
|
+
get(service) {
|
|
634
|
+
return Kernel.di.getService(service);
|
|
635
|
+
}
|
|
636
|
+
};
|
|
637
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
638
|
+
0 && (module.exports = {
|
|
639
|
+
ConsoleKernelLogger,
|
|
640
|
+
Consumer,
|
|
641
|
+
ExpressKernelServer,
|
|
642
|
+
InMemoryEventBus,
|
|
643
|
+
InMemoryPubSub,
|
|
644
|
+
InMemoryRepository,
|
|
645
|
+
InvalidDomainEventError,
|
|
646
|
+
MongoRepository,
|
|
647
|
+
NoFailedMessagesError,
|
|
648
|
+
Route,
|
|
649
|
+
RoutePrefix
|
|
650
|
+
});
|
|
651
|
+
//# sourceMappingURL=index.cjs.map
|