@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,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/infrastructure/websocket/index.ts
|
|
21
|
+
var websocket_exports = {};
|
|
22
|
+
__export(websocket_exports, {
|
|
23
|
+
WebSocketEventHub: () => WebSocketEventHub,
|
|
24
|
+
WebSocketRealtimeServer: () => WebSocketRealtimeServer
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(websocket_exports);
|
|
27
|
+
|
|
28
|
+
// src/infrastructure/websocket/WebSocketEventHub.ts
|
|
29
|
+
var WebSocketEventHub = class {
|
|
30
|
+
constructor(recipientResolver, logger) {
|
|
31
|
+
this.recipientResolver = recipientResolver;
|
|
32
|
+
this.logger = logger;
|
|
33
|
+
}
|
|
34
|
+
recipientResolver;
|
|
35
|
+
logger;
|
|
36
|
+
clients = /* @__PURE__ */ new Map();
|
|
37
|
+
send(client, message) {
|
|
38
|
+
if (client.readyState !== client.OPEN) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
client.send(JSON.stringify(message));
|
|
42
|
+
}
|
|
43
|
+
unregister(identity, client) {
|
|
44
|
+
const identityClients = this.clients.get(identity);
|
|
45
|
+
if (!identityClients) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
identityClients.delete(client);
|
|
49
|
+
if (identityClients.size === 0) {
|
|
50
|
+
this.clients.delete(identity);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
register(identity, client) {
|
|
54
|
+
const identityClients = this.clients.get(identity) ?? /* @__PURE__ */ new Set();
|
|
55
|
+
identityClients.add(client);
|
|
56
|
+
this.clients.set(identity, identityClients);
|
|
57
|
+
client.on("close", () => this.unregister(identity, client));
|
|
58
|
+
this.send(client, {
|
|
59
|
+
identityId: String(identity),
|
|
60
|
+
type: "connection_ack"
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
broadcast(event) {
|
|
64
|
+
const recipients = this.recipientResolver?.resolve(event) ?? [];
|
|
65
|
+
const message = {
|
|
66
|
+
event: event.encode(event.decode()),
|
|
67
|
+
type: "domain_event"
|
|
68
|
+
};
|
|
69
|
+
for (const recipient of recipients) {
|
|
70
|
+
this.sendToRecipient(recipient, message);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
broadcastToAll(message) {
|
|
74
|
+
for (const identityClients of this.clients.values()) {
|
|
75
|
+
for (const client of identityClients) {
|
|
76
|
+
this.send(client, message);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
sendToRecipient(recipient, message) {
|
|
81
|
+
const identityClients = this.clients.get(recipient);
|
|
82
|
+
if (!identityClients) {
|
|
83
|
+
this.logger?.debug(`WebSocket recipient "${String(recipient)}" offline.`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
for (const client of identityClients) {
|
|
87
|
+
this.send(client, message);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// src/infrastructure/websocket/WebSocketRealtimeServer.ts
|
|
93
|
+
var import_ws = require("ws");
|
|
94
|
+
var WebSocketRealtimeServer = class {
|
|
95
|
+
constructor(options) {
|
|
96
|
+
this.options = options;
|
|
97
|
+
}
|
|
98
|
+
options;
|
|
99
|
+
server = new import_ws.WebSocketServer({ noServer: true });
|
|
100
|
+
handleUpgrade(request, socket, head, websocketPath) {
|
|
101
|
+
const url = new URL(request.url || "/", "http://localhost");
|
|
102
|
+
if (url.pathname !== websocketPath) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const identity = this.options.authenticator.authenticate(
|
|
107
|
+
request,
|
|
108
|
+
websocketPath
|
|
109
|
+
);
|
|
110
|
+
this.server.handleUpgrade(request, socket, head, (client) => {
|
|
111
|
+
this.options.eventHub.register(identity, client);
|
|
112
|
+
this.server.emit("connection", client, request);
|
|
113
|
+
});
|
|
114
|
+
} catch {
|
|
115
|
+
socket.write("HTTP/1.1 401 Unauthorized\r\n\r\n");
|
|
116
|
+
socket.destroy();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
attach(httpServer) {
|
|
120
|
+
const websocketPath = this.options.websocketPath ?? "/ws";
|
|
121
|
+
httpServer.on("upgrade", (request, socket, head) => {
|
|
122
|
+
this.handleUpgrade(request, socket, head, websocketPath);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
127
|
+
0 && (module.exports = {
|
|
128
|
+
WebSocketEventHub,
|
|
129
|
+
WebSocketRealtimeServer
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infrastructure/websocket/index.ts","../../../src/infrastructure/websocket/WebSocketEventHub.ts","../../../src/infrastructure/websocket/WebSocketRealtimeServer.ts"],"sourcesContent":["export * from './WebSocketClientMessage.js';\nexport * from './WebSocketConnectionAuthenticator.js';\nexport * from './WebSocketEventHub.js';\nexport * from './WebSocketRealtimeMessage.js';\nexport * from './WebSocketRealtimeServer.js';\nexport * from './WebSocketRealtimeServerOptions.js';\nexport * from './WebSocketRecipientResolver.js';\n","import type { WebSocket } from 'ws';\n\nimport type { DomainEvent } from '../../domain/index.js';\nimport type { Log } from '../logs/index.js';\nimport type { WebSocketRealtimeMessage } from './WebSocketRealtimeMessage.js';\nimport type { WebSocketRecipientResolver } from './WebSocketRecipientResolver.js';\n\nexport class WebSocketEventHub<TIdentity = string> {\n private readonly clients = new Map<TIdentity, Set<WebSocket>>();\n\n constructor(\n private readonly recipientResolver?: WebSocketRecipientResolver<TIdentity>,\n private readonly logger?: Log,\n ) {}\n\n private send(client: WebSocket, message: WebSocketRealtimeMessage): void {\n if (client.readyState !== client.OPEN) {\n return;\n }\n\n client.send(JSON.stringify(message));\n }\n\n private unregister(identity: TIdentity, client: WebSocket): void {\n const identityClients = this.clients.get(identity);\n\n if (!identityClients) {\n return;\n }\n\n identityClients.delete(client);\n\n if (identityClients.size === 0) {\n this.clients.delete(identity);\n }\n }\n\n public register(identity: TIdentity, client: WebSocket): void {\n const identityClients = this.clients.get(identity) ?? new Set<WebSocket>();\n\n identityClients.add(client);\n this.clients.set(identity, identityClients);\n client.on('close', () => this.unregister(identity, client));\n\n this.send(client, {\n identityId: String(identity),\n type: 'connection_ack',\n });\n }\n\n public broadcast(event: DomainEvent): void {\n const recipients = this.recipientResolver?.resolve(event) ?? [];\n const message: WebSocketRealtimeMessage = {\n event: event.encode(event.decode()),\n type: 'domain_event',\n };\n\n for (const recipient of recipients) {\n this.sendToRecipient(recipient, message);\n }\n }\n\n public broadcastToAll(message: WebSocketRealtimeMessage): void {\n for (const identityClients of this.clients.values()) {\n for (const client of identityClients) {\n this.send(client, message);\n }\n }\n }\n\n public sendToRecipient(\n recipient: TIdentity,\n message: WebSocketRealtimeMessage,\n ): void {\n const identityClients = this.clients.get(recipient);\n\n if (!identityClients) {\n this.logger?.debug(`WebSocket recipient \"${String(recipient)}\" offline.`);\n\n return;\n }\n\n for (const client of identityClients) {\n this.send(client, message);\n }\n }\n}\n","import type { IncomingMessage, Server as HttpServer } from 'node:http';\nimport type { Duplex } from 'node:stream';\n\nimport { WebSocketServer } from 'ws';\n\nimport type { WebSocketRealtimeServerOptions } from './WebSocketRealtimeServerOptions.js';\n\nexport class WebSocketRealtimeServer<TIdentity = string> {\n private readonly server = new WebSocketServer({ noServer: true });\n\n constructor(\n private readonly options: WebSocketRealtimeServerOptions<TIdentity>,\n ) {}\n\n private handleUpgrade(\n request: IncomingMessage,\n socket: Duplex,\n head: Buffer,\n websocketPath: string,\n ): void {\n const url = new URL(request.url || '/', 'http://localhost');\n\n if (url.pathname !== websocketPath) {\n return;\n }\n\n try {\n const identity = this.options.authenticator.authenticate(\n request,\n websocketPath,\n );\n\n this.server.handleUpgrade(request, socket, head, (client) => {\n this.options.eventHub.register(identity, client);\n this.server.emit('connection', client, request);\n });\n } catch {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n }\n }\n\n public attach(httpServer: HttpServer): void {\n const websocketPath = this.options.websocketPath ?? '/ws';\n\n httpServer.on('upgrade', (request, socket, head) => {\n this.handleUpgrade(request, socket, head, websocketPath);\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { IncomingMessage, Server } from 'node:http';
|
|
2
|
+
import { WebSocket } from 'ws';
|
|
3
|
+
import { D as DomainEvent } from '../../DomainEvent-mXWEtr_J.cjs';
|
|
4
|
+
import { L as Log } from '../../Log-36L3Z84a.cjs';
|
|
5
|
+
|
|
6
|
+
type WebSocketClientMessage = Record<string, unknown> & {
|
|
7
|
+
readonly type?: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
interface WebSocketConnectionAuthenticator<TIdentity = string> {
|
|
11
|
+
authenticate(request: IncomingMessage, websocketPath: string): TIdentity;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type WebSocketRealtimeMessage = {
|
|
15
|
+
readonly identityId: string;
|
|
16
|
+
readonly type: 'connection_ack';
|
|
17
|
+
} | {
|
|
18
|
+
readonly event: unknown;
|
|
19
|
+
readonly type: 'domain_event';
|
|
20
|
+
} | {
|
|
21
|
+
readonly payload: unknown;
|
|
22
|
+
readonly type: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
interface WebSocketRecipientResolver<TIdentity = string> {
|
|
26
|
+
resolve(event: DomainEvent): Iterable<TIdentity>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare class WebSocketEventHub<TIdentity = string> {
|
|
30
|
+
private readonly recipientResolver?;
|
|
31
|
+
private readonly logger?;
|
|
32
|
+
private readonly clients;
|
|
33
|
+
constructor(recipientResolver?: WebSocketRecipientResolver<TIdentity> | undefined, logger?: Log | undefined);
|
|
34
|
+
private send;
|
|
35
|
+
private unregister;
|
|
36
|
+
register(identity: TIdentity, client: WebSocket): void;
|
|
37
|
+
broadcast(event: DomainEvent): void;
|
|
38
|
+
broadcastToAll(message: WebSocketRealtimeMessage): void;
|
|
39
|
+
sendToRecipient(recipient: TIdentity, message: WebSocketRealtimeMessage): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface WebSocketRealtimeServerOptions<TIdentity = string> {
|
|
43
|
+
readonly authenticator: WebSocketConnectionAuthenticator<TIdentity>;
|
|
44
|
+
readonly eventHub: WebSocketEventHub<TIdentity>;
|
|
45
|
+
readonly websocketPath?: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare class WebSocketRealtimeServer<TIdentity = string> {
|
|
49
|
+
private readonly options;
|
|
50
|
+
private readonly server;
|
|
51
|
+
constructor(options: WebSocketRealtimeServerOptions<TIdentity>);
|
|
52
|
+
private handleUpgrade;
|
|
53
|
+
attach(httpServer: Server): void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { type WebSocketClientMessage, type WebSocketConnectionAuthenticator, WebSocketEventHub, type WebSocketRealtimeMessage, WebSocketRealtimeServer, type WebSocketRealtimeServerOptions, type WebSocketRecipientResolver };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { IncomingMessage, Server } from 'node:http';
|
|
2
|
+
import { WebSocket } from 'ws';
|
|
3
|
+
import { D as DomainEvent } from '../../DomainEvent-mXWEtr_J.js';
|
|
4
|
+
import { L as Log } from '../../Log-36L3Z84a.js';
|
|
5
|
+
|
|
6
|
+
type WebSocketClientMessage = Record<string, unknown> & {
|
|
7
|
+
readonly type?: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
interface WebSocketConnectionAuthenticator<TIdentity = string> {
|
|
11
|
+
authenticate(request: IncomingMessage, websocketPath: string): TIdentity;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type WebSocketRealtimeMessage = {
|
|
15
|
+
readonly identityId: string;
|
|
16
|
+
readonly type: 'connection_ack';
|
|
17
|
+
} | {
|
|
18
|
+
readonly event: unknown;
|
|
19
|
+
readonly type: 'domain_event';
|
|
20
|
+
} | {
|
|
21
|
+
readonly payload: unknown;
|
|
22
|
+
readonly type: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
interface WebSocketRecipientResolver<TIdentity = string> {
|
|
26
|
+
resolve(event: DomainEvent): Iterable<TIdentity>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare class WebSocketEventHub<TIdentity = string> {
|
|
30
|
+
private readonly recipientResolver?;
|
|
31
|
+
private readonly logger?;
|
|
32
|
+
private readonly clients;
|
|
33
|
+
constructor(recipientResolver?: WebSocketRecipientResolver<TIdentity> | undefined, logger?: Log | undefined);
|
|
34
|
+
private send;
|
|
35
|
+
private unregister;
|
|
36
|
+
register(identity: TIdentity, client: WebSocket): void;
|
|
37
|
+
broadcast(event: DomainEvent): void;
|
|
38
|
+
broadcastToAll(message: WebSocketRealtimeMessage): void;
|
|
39
|
+
sendToRecipient(recipient: TIdentity, message: WebSocketRealtimeMessage): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface WebSocketRealtimeServerOptions<TIdentity = string> {
|
|
43
|
+
readonly authenticator: WebSocketConnectionAuthenticator<TIdentity>;
|
|
44
|
+
readonly eventHub: WebSocketEventHub<TIdentity>;
|
|
45
|
+
readonly websocketPath?: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare class WebSocketRealtimeServer<TIdentity = string> {
|
|
49
|
+
private readonly options;
|
|
50
|
+
private readonly server;
|
|
51
|
+
constructor(options: WebSocketRealtimeServerOptions<TIdentity>);
|
|
52
|
+
private handleUpgrade;
|
|
53
|
+
attach(httpServer: Server): void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { type WebSocketClientMessage, type WebSocketConnectionAuthenticator, WebSocketEventHub, type WebSocketRealtimeMessage, WebSocketRealtimeServer, type WebSocketRealtimeServerOptions, type WebSocketRecipientResolver };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// src/infrastructure/websocket/WebSocketEventHub.ts
|
|
2
|
+
var WebSocketEventHub = class {
|
|
3
|
+
constructor(recipientResolver, logger) {
|
|
4
|
+
this.recipientResolver = recipientResolver;
|
|
5
|
+
this.logger = logger;
|
|
6
|
+
}
|
|
7
|
+
recipientResolver;
|
|
8
|
+
logger;
|
|
9
|
+
clients = /* @__PURE__ */ new Map();
|
|
10
|
+
send(client, message) {
|
|
11
|
+
if (client.readyState !== client.OPEN) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
client.send(JSON.stringify(message));
|
|
15
|
+
}
|
|
16
|
+
unregister(identity, client) {
|
|
17
|
+
const identityClients = this.clients.get(identity);
|
|
18
|
+
if (!identityClients) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
identityClients.delete(client);
|
|
22
|
+
if (identityClients.size === 0) {
|
|
23
|
+
this.clients.delete(identity);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
register(identity, client) {
|
|
27
|
+
const identityClients = this.clients.get(identity) ?? /* @__PURE__ */ new Set();
|
|
28
|
+
identityClients.add(client);
|
|
29
|
+
this.clients.set(identity, identityClients);
|
|
30
|
+
client.on("close", () => this.unregister(identity, client));
|
|
31
|
+
this.send(client, {
|
|
32
|
+
identityId: String(identity),
|
|
33
|
+
type: "connection_ack"
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
broadcast(event) {
|
|
37
|
+
const recipients = this.recipientResolver?.resolve(event) ?? [];
|
|
38
|
+
const message = {
|
|
39
|
+
event: event.encode(event.decode()),
|
|
40
|
+
type: "domain_event"
|
|
41
|
+
};
|
|
42
|
+
for (const recipient of recipients) {
|
|
43
|
+
this.sendToRecipient(recipient, message);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
broadcastToAll(message) {
|
|
47
|
+
for (const identityClients of this.clients.values()) {
|
|
48
|
+
for (const client of identityClients) {
|
|
49
|
+
this.send(client, message);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
sendToRecipient(recipient, message) {
|
|
54
|
+
const identityClients = this.clients.get(recipient);
|
|
55
|
+
if (!identityClients) {
|
|
56
|
+
this.logger?.debug(`WebSocket recipient "${String(recipient)}" offline.`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const client of identityClients) {
|
|
60
|
+
this.send(client, message);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// src/infrastructure/websocket/WebSocketRealtimeServer.ts
|
|
66
|
+
import { WebSocketServer } from "ws";
|
|
67
|
+
var WebSocketRealtimeServer = class {
|
|
68
|
+
constructor(options) {
|
|
69
|
+
this.options = options;
|
|
70
|
+
}
|
|
71
|
+
options;
|
|
72
|
+
server = new WebSocketServer({ noServer: true });
|
|
73
|
+
handleUpgrade(request, socket, head, websocketPath) {
|
|
74
|
+
const url = new URL(request.url || "/", "http://localhost");
|
|
75
|
+
if (url.pathname !== websocketPath) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const identity = this.options.authenticator.authenticate(
|
|
80
|
+
request,
|
|
81
|
+
websocketPath
|
|
82
|
+
);
|
|
83
|
+
this.server.handleUpgrade(request, socket, head, (client) => {
|
|
84
|
+
this.options.eventHub.register(identity, client);
|
|
85
|
+
this.server.emit("connection", client, request);
|
|
86
|
+
});
|
|
87
|
+
} catch {
|
|
88
|
+
socket.write("HTTP/1.1 401 Unauthorized\r\n\r\n");
|
|
89
|
+
socket.destroy();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
attach(httpServer) {
|
|
93
|
+
const websocketPath = this.options.websocketPath ?? "/ws";
|
|
94
|
+
httpServer.on("upgrade", (request, socket, head) => {
|
|
95
|
+
this.handleUpgrade(request, socket, head, websocketPath);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
export {
|
|
100
|
+
WebSocketEventHub,
|
|
101
|
+
WebSocketRealtimeServer
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infrastructure/websocket/WebSocketEventHub.ts","../../../src/infrastructure/websocket/WebSocketRealtimeServer.ts"],"sourcesContent":["import type { WebSocket } from 'ws';\n\nimport type { DomainEvent } from '../../domain/index.js';\nimport type { Log } from '../logs/index.js';\nimport type { WebSocketRealtimeMessage } from './WebSocketRealtimeMessage.js';\nimport type { WebSocketRecipientResolver } from './WebSocketRecipientResolver.js';\n\nexport class WebSocketEventHub<TIdentity = string> {\n private readonly clients = new Map<TIdentity, Set<WebSocket>>();\n\n constructor(\n private readonly recipientResolver?: WebSocketRecipientResolver<TIdentity>,\n private readonly logger?: Log,\n ) {}\n\n private send(client: WebSocket, message: WebSocketRealtimeMessage): void {\n if (client.readyState !== client.OPEN) {\n return;\n }\n\n client.send(JSON.stringify(message));\n }\n\n private unregister(identity: TIdentity, client: WebSocket): void {\n const identityClients = this.clients.get(identity);\n\n if (!identityClients) {\n return;\n }\n\n identityClients.delete(client);\n\n if (identityClients.size === 0) {\n this.clients.delete(identity);\n }\n }\n\n public register(identity: TIdentity, client: WebSocket): void {\n const identityClients = this.clients.get(identity) ?? new Set<WebSocket>();\n\n identityClients.add(client);\n this.clients.set(identity, identityClients);\n client.on('close', () => this.unregister(identity, client));\n\n this.send(client, {\n identityId: String(identity),\n type: 'connection_ack',\n });\n }\n\n public broadcast(event: DomainEvent): void {\n const recipients = this.recipientResolver?.resolve(event) ?? [];\n const message: WebSocketRealtimeMessage = {\n event: event.encode(event.decode()),\n type: 'domain_event',\n };\n\n for (const recipient of recipients) {\n this.sendToRecipient(recipient, message);\n }\n }\n\n public broadcastToAll(message: WebSocketRealtimeMessage): void {\n for (const identityClients of this.clients.values()) {\n for (const client of identityClients) {\n this.send(client, message);\n }\n }\n }\n\n public sendToRecipient(\n recipient: TIdentity,\n message: WebSocketRealtimeMessage,\n ): void {\n const identityClients = this.clients.get(recipient);\n\n if (!identityClients) {\n this.logger?.debug(`WebSocket recipient \"${String(recipient)}\" offline.`);\n\n return;\n }\n\n for (const client of identityClients) {\n this.send(client, message);\n }\n }\n}\n","import type { IncomingMessage, Server as HttpServer } from 'node:http';\nimport type { Duplex } from 'node:stream';\n\nimport { WebSocketServer } from 'ws';\n\nimport type { WebSocketRealtimeServerOptions } from './WebSocketRealtimeServerOptions.js';\n\nexport class WebSocketRealtimeServer<TIdentity = string> {\n private readonly server = new WebSocketServer({ noServer: true });\n\n constructor(\n private readonly options: WebSocketRealtimeServerOptions<TIdentity>,\n ) {}\n\n private handleUpgrade(\n request: IncomingMessage,\n socket: Duplex,\n head: Buffer,\n websocketPath: string,\n ): void {\n const url = new URL(request.url || '/', 'http://localhost');\n\n if (url.pathname !== websocketPath) {\n return;\n }\n\n try {\n const identity = this.options.authenticator.authenticate(\n request,\n websocketPath,\n );\n\n this.server.handleUpgrade(request, socket, head, (client) => {\n this.options.eventHub.register(identity, client);\n this.server.emit('connection', client, request);\n });\n } catch {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n }\n }\n\n public attach(httpServer: HttpServer): void {\n const websocketPath = this.options.websocketPath ?? '/ws';\n\n httpServer.on('upgrade', (request, socket, head) => {\n this.handleUpgrade(request, socket, head, websocketPath);\n });\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@haskou/ddd-kernel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-agnostic DDD kernel for TypeScript applications and microservices.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./adapters": {
|
|
16
|
+
"types": "./dist/adapters/index.d.ts",
|
|
17
|
+
"import": "./dist/adapters/index.js",
|
|
18
|
+
"require": "./dist/adapters/index.cjs"
|
|
19
|
+
},
|
|
20
|
+
"./adapters/db": {
|
|
21
|
+
"types": "./dist/adapters/db/index.d.ts",
|
|
22
|
+
"import": "./dist/adapters/db/index.js",
|
|
23
|
+
"require": "./dist/adapters/db/index.cjs"
|
|
24
|
+
},
|
|
25
|
+
"./adapters/db/in-memory": {
|
|
26
|
+
"types": "./dist/adapters/db/in-memory/index.d.ts",
|
|
27
|
+
"import": "./dist/adapters/db/in-memory/index.js",
|
|
28
|
+
"require": "./dist/adapters/db/in-memory/index.cjs"
|
|
29
|
+
},
|
|
30
|
+
"./adapters/db/mongo": {
|
|
31
|
+
"types": "./dist/adapters/db/mongo/index.d.ts",
|
|
32
|
+
"import": "./dist/adapters/db/mongo/index.js",
|
|
33
|
+
"require": "./dist/adapters/db/mongo/index.cjs"
|
|
34
|
+
},
|
|
35
|
+
"./adapters/kernel": {
|
|
36
|
+
"types": "./dist/adapters/kernel/index.d.ts",
|
|
37
|
+
"import": "./dist/adapters/kernel/index.js",
|
|
38
|
+
"require": "./dist/adapters/kernel/index.cjs"
|
|
39
|
+
},
|
|
40
|
+
"./adapters/kernel/console": {
|
|
41
|
+
"types": "./dist/adapters/kernel/console/index.d.ts",
|
|
42
|
+
"import": "./dist/adapters/kernel/console/index.js",
|
|
43
|
+
"require": "./dist/adapters/kernel/console/index.cjs"
|
|
44
|
+
},
|
|
45
|
+
"./adapters/pubsub": {
|
|
46
|
+
"types": "./dist/adapters/pubsub/index.d.ts",
|
|
47
|
+
"import": "./dist/adapters/pubsub/index.js",
|
|
48
|
+
"require": "./dist/adapters/pubsub/index.cjs"
|
|
49
|
+
},
|
|
50
|
+
"./adapters/pubsub/amqp": {
|
|
51
|
+
"types": "./dist/adapters/pubsub/amqp/index.d.ts",
|
|
52
|
+
"import": "./dist/adapters/pubsub/amqp/index.js",
|
|
53
|
+
"require": "./dist/adapters/pubsub/amqp/index.cjs"
|
|
54
|
+
},
|
|
55
|
+
"./adapters/pubsub/in-memory": {
|
|
56
|
+
"types": "./dist/adapters/pubsub/in-memory/index.d.ts",
|
|
57
|
+
"import": "./dist/adapters/pubsub/in-memory/index.js",
|
|
58
|
+
"require": "./dist/adapters/pubsub/in-memory/index.cjs"
|
|
59
|
+
},
|
|
60
|
+
"./adapters/ui": {
|
|
61
|
+
"types": "./dist/adapters/ui/index.d.ts",
|
|
62
|
+
"import": "./dist/adapters/ui/index.js",
|
|
63
|
+
"require": "./dist/adapters/ui/index.cjs"
|
|
64
|
+
},
|
|
65
|
+
"./adapters/ui/express": {
|
|
66
|
+
"types": "./dist/adapters/ui/express/index.d.ts",
|
|
67
|
+
"import": "./dist/adapters/ui/express/index.js",
|
|
68
|
+
"require": "./dist/adapters/ui/express/index.cjs"
|
|
69
|
+
},
|
|
70
|
+
"./adapters/ui/routes": {
|
|
71
|
+
"types": "./dist/adapters/ui/routes/index.d.ts",
|
|
72
|
+
"import": "./dist/adapters/ui/routes/index.js",
|
|
73
|
+
"require": "./dist/adapters/ui/routes/index.cjs"
|
|
74
|
+
},
|
|
75
|
+
"./contracts": {
|
|
76
|
+
"types": "./dist/contracts/index.d.ts",
|
|
77
|
+
"import": "./dist/contracts/index.js",
|
|
78
|
+
"require": "./dist/contracts/index.cjs"
|
|
79
|
+
},
|
|
80
|
+
"./contracts/db": {
|
|
81
|
+
"types": "./dist/contracts/db/index.d.ts",
|
|
82
|
+
"import": "./dist/contracts/db/index.js",
|
|
83
|
+
"require": "./dist/contracts/db/index.cjs"
|
|
84
|
+
},
|
|
85
|
+
"./contracts/kernel": {
|
|
86
|
+
"types": "./dist/contracts/kernel/index.d.ts",
|
|
87
|
+
"import": "./dist/contracts/kernel/index.js",
|
|
88
|
+
"require": "./dist/contracts/kernel/index.cjs"
|
|
89
|
+
},
|
|
90
|
+
"./contracts/pubsub": {
|
|
91
|
+
"types": "./dist/contracts/pubsub/index.d.ts",
|
|
92
|
+
"import": "./dist/contracts/pubsub/index.js",
|
|
93
|
+
"require": "./dist/contracts/pubsub/index.cjs"
|
|
94
|
+
},
|
|
95
|
+
"./contracts/ui": {
|
|
96
|
+
"types": "./dist/contracts/ui/index.d.ts",
|
|
97
|
+
"import": "./dist/contracts/ui/index.js",
|
|
98
|
+
"require": "./dist/contracts/ui/index.cjs"
|
|
99
|
+
},
|
|
100
|
+
"./dependency-injection": {
|
|
101
|
+
"types": "./dist/infrastructure/dependency-injection/index.d.ts",
|
|
102
|
+
"import": "./dist/infrastructure/dependency-injection/index.js",
|
|
103
|
+
"require": "./dist/infrastructure/dependency-injection/index.cjs"
|
|
104
|
+
},
|
|
105
|
+
"./domain": {
|
|
106
|
+
"types": "./dist/domain/index.d.ts",
|
|
107
|
+
"import": "./dist/domain/index.js",
|
|
108
|
+
"require": "./dist/domain/index.cjs"
|
|
109
|
+
},
|
|
110
|
+
"./errors": {
|
|
111
|
+
"types": "./dist/errors/index.d.ts",
|
|
112
|
+
"import": "./dist/errors/index.js",
|
|
113
|
+
"require": "./dist/errors/index.cjs"
|
|
114
|
+
},
|
|
115
|
+
"./express": {
|
|
116
|
+
"types": "./dist/adapters/ui/express/index.d.ts",
|
|
117
|
+
"import": "./dist/adapters/ui/express/index.js",
|
|
118
|
+
"require": "./dist/adapters/ui/express/index.cjs"
|
|
119
|
+
},
|
|
120
|
+
"./lifecycle": {
|
|
121
|
+
"types": "./dist/infrastructure/lifecycle/index.d.ts",
|
|
122
|
+
"import": "./dist/infrastructure/lifecycle/index.js",
|
|
123
|
+
"require": "./dist/infrastructure/lifecycle/index.cjs"
|
|
124
|
+
},
|
|
125
|
+
"./logs": {
|
|
126
|
+
"types": "./dist/infrastructure/logs/index.d.ts",
|
|
127
|
+
"import": "./dist/infrastructure/logs/index.js",
|
|
128
|
+
"require": "./dist/infrastructure/logs/index.cjs"
|
|
129
|
+
},
|
|
130
|
+
"./scheduler": {
|
|
131
|
+
"types": "./dist/infrastructure/scheduler/index.d.ts",
|
|
132
|
+
"import": "./dist/infrastructure/scheduler/index.js",
|
|
133
|
+
"require": "./dist/infrastructure/scheduler/index.cjs"
|
|
134
|
+
},
|
|
135
|
+
"./websocket": {
|
|
136
|
+
"types": "./dist/infrastructure/websocket/index.d.ts",
|
|
137
|
+
"import": "./dist/infrastructure/websocket/index.js",
|
|
138
|
+
"require": "./dist/infrastructure/websocket/index.cjs"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"files": [
|
|
142
|
+
"dist",
|
|
143
|
+
"README.md"
|
|
144
|
+
],
|
|
145
|
+
"scripts": {
|
|
146
|
+
"build": "tsup",
|
|
147
|
+
"docs:build": "vitepress build docs",
|
|
148
|
+
"docs:dev": "vitepress dev docs",
|
|
149
|
+
"docs:preview": "vitepress build docs && vitepress preview docs",
|
|
150
|
+
"format": "prettier --write .",
|
|
151
|
+
"format:check": "prettier --check .",
|
|
152
|
+
"lint": "eslint ./src --ext .ts",
|
|
153
|
+
"lint:fix": "eslint ./src --ext .ts --fix",
|
|
154
|
+
"prepack": "yarn build",
|
|
155
|
+
"test": "yarn build && c8 node --test \"tests/**/*.test.mjs\"",
|
|
156
|
+
"build:coverage": "rm -rf dist && tsc -p tsconfig.coverage.json",
|
|
157
|
+
"test:coverage": "yarn build:coverage && c8 --all --src src --include \"src/**/*.ts\" --extension .ts --exclude-after-remap --reporter text --reporter lcov node --test \"tests/**/*.test.mjs\"",
|
|
158
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
159
|
+
},
|
|
160
|
+
"keywords": [
|
|
161
|
+
"ddd",
|
|
162
|
+
"kernel",
|
|
163
|
+
"dependency-injection",
|
|
164
|
+
"microservices"
|
|
165
|
+
],
|
|
166
|
+
"license": "MIT",
|
|
167
|
+
"devDependencies": {
|
|
168
|
+
"@haskou/eslint-config": "^0.1.1",
|
|
169
|
+
"@types/amqplib": "^0.10.8",
|
|
170
|
+
"@types/express": "^5.0.6",
|
|
171
|
+
"@types/fs-extra": "^11.0.4",
|
|
172
|
+
"@types/node": "^26.0.0",
|
|
173
|
+
"@types/ws": "^8.18.1",
|
|
174
|
+
"@typescript-eslint/eslint-plugin": "^7.0.1",
|
|
175
|
+
"@typescript-eslint/parser": "^7.0.1",
|
|
176
|
+
"amqplib": "^2.0.1",
|
|
177
|
+
"c8": "^10.1.3",
|
|
178
|
+
"class-transformer": "^0.5.1",
|
|
179
|
+
"class-validator": "^0.14.3",
|
|
180
|
+
"eslint": "^10.5.0",
|
|
181
|
+
"express": "5.2.1",
|
|
182
|
+
"fs-extra": "11.3.4",
|
|
183
|
+
"mongodb": "^7.3.0",
|
|
184
|
+
"node-cron": "^4.5.0",
|
|
185
|
+
"node-dependency-injection": "3.2.6",
|
|
186
|
+
"prettier": "^3.8.4",
|
|
187
|
+
"reflect-metadata": "^0.2.2",
|
|
188
|
+
"routing-controllers": "^0.11.3",
|
|
189
|
+
"tsup": "^8.5.0",
|
|
190
|
+
"typescript": "^6.0.3",
|
|
191
|
+
"vitepress": "^1.6.4",
|
|
192
|
+
"vue": "^3.5.38",
|
|
193
|
+
"winston": "3.19.0",
|
|
194
|
+
"ws": "^8.21.0"
|
|
195
|
+
},
|
|
196
|
+
"peerDependencies": {
|
|
197
|
+
"amqplib": "^2.0.1",
|
|
198
|
+
"class-transformer": "^0.5.1",
|
|
199
|
+
"class-validator": "^0.14.3",
|
|
200
|
+
"express": "5.2.1",
|
|
201
|
+
"fs-extra": "11.3.4",
|
|
202
|
+
"mongodb": "^7.3.0",
|
|
203
|
+
"node-cron": "^4.5.0",
|
|
204
|
+
"node-dependency-injection": "3.2.6",
|
|
205
|
+
"reflect-metadata": "^0.2.2",
|
|
206
|
+
"routing-controllers": "^0.11.3",
|
|
207
|
+
"winston": "3.19.0",
|
|
208
|
+
"ws": "^8.21.0"
|
|
209
|
+
},
|
|
210
|
+
"peerDependenciesMeta": {
|
|
211
|
+
"amqplib": {
|
|
212
|
+
"optional": true
|
|
213
|
+
},
|
|
214
|
+
"class-transformer": {
|
|
215
|
+
"optional": true
|
|
216
|
+
},
|
|
217
|
+
"class-validator": {
|
|
218
|
+
"optional": true
|
|
219
|
+
},
|
|
220
|
+
"express": {
|
|
221
|
+
"optional": true
|
|
222
|
+
},
|
|
223
|
+
"fs-extra": {
|
|
224
|
+
"optional": true
|
|
225
|
+
},
|
|
226
|
+
"mongodb": {
|
|
227
|
+
"optional": true
|
|
228
|
+
},
|
|
229
|
+
"node-cron": {
|
|
230
|
+
"optional": true
|
|
231
|
+
},
|
|
232
|
+
"node-dependency-injection": {
|
|
233
|
+
"optional": true
|
|
234
|
+
},
|
|
235
|
+
"reflect-metadata": {
|
|
236
|
+
"optional": true
|
|
237
|
+
},
|
|
238
|
+
"routing-controllers": {
|
|
239
|
+
"optional": true
|
|
240
|
+
},
|
|
241
|
+
"winston": {
|
|
242
|
+
"optional": true
|
|
243
|
+
},
|
|
244
|
+
"ws": {
|
|
245
|
+
"optional": true
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|