@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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +143 -0
  3. package/dist/Constructor-fyZLLIh8.d.cts +5 -0
  4. package/dist/Constructor-fyZLLIh8.d.ts +5 -0
  5. package/dist/Consumer-CC8ZRCsd.d.cts +17 -0
  6. package/dist/Consumer-CeT0Wbxb.d.ts +17 -0
  7. package/dist/DomainEvent-mXWEtr_J.d.cts +26 -0
  8. package/dist/DomainEvent-mXWEtr_J.d.ts +26 -0
  9. package/dist/DomainEventConsumer-3WBMSSr2.d.cts +7 -0
  10. package/dist/DomainEventConsumer-B4hkIUmP.d.ts +7 -0
  11. package/dist/DomainEventPublisher-8G0lvmdy.d.cts +7 -0
  12. package/dist/DomainEventPublisher-DhGgM3f2.d.ts +7 -0
  13. package/dist/HandlerContext-DUUExVo3.d.ts +20 -0
  14. package/dist/HandlerContext-Lm89pSeG.d.cts +20 -0
  15. package/dist/Kernel-BWUOUWWI.d.cts +70 -0
  16. package/dist/Kernel-CUaqHa1s.d.ts +70 -0
  17. package/dist/KernelLogger-BESOFrpW.d.cts +8 -0
  18. package/dist/KernelLogger-BESOFrpW.d.ts +8 -0
  19. package/dist/Log-36L3Z84a.d.cts +8 -0
  20. package/dist/Log-36L3Z84a.d.ts +8 -0
  21. package/dist/NoFailedMessagesError-0YJKRWPF.d.ts +45 -0
  22. package/dist/NoFailedMessagesError-Kz7CYWpT.d.cts +45 -0
  23. package/dist/Repository-D9CuAyCV.d.cts +7 -0
  24. package/dist/Repository-D9CuAyCV.d.ts +7 -0
  25. package/dist/Scheduler-oigqNOUJ.d.cts +27 -0
  26. package/dist/Scheduler-oigqNOUJ.d.ts +27 -0
  27. package/dist/ServiceClass-BmNw8fJj.d.cts +37 -0
  28. package/dist/ServiceClass-C7NCKdSS.d.ts +37 -0
  29. package/dist/ServiceResolver-D2Jz-l_Z.d.cts +5 -0
  30. package/dist/ServiceResolver-D2Jz-l_Z.d.ts +5 -0
  31. package/dist/ShutdownHook-BGskq2-q.d.ts +9 -0
  32. package/dist/ShutdownHook-Dib5uNKB.d.cts +9 -0
  33. package/dist/Subscription-Bwkb_did.d.ts +9 -0
  34. package/dist/Subscription-P9WROD_6.d.cts +9 -0
  35. package/dist/adapters/db/in-memory/index.cjs +46 -0
  36. package/dist/adapters/db/in-memory/index.cjs.map +1 -0
  37. package/dist/adapters/db/in-memory/index.d.cts +12 -0
  38. package/dist/adapters/db/in-memory/index.d.ts +12 -0
  39. package/dist/adapters/db/in-memory/index.js +19 -0
  40. package/dist/adapters/db/in-memory/index.js.map +1 -0
  41. package/dist/adapters/db/index.cjs +80 -0
  42. package/dist/adapters/db/index.cjs.map +1 -0
  43. package/dist/adapters/db/index.d.cts +4 -0
  44. package/dist/adapters/db/index.d.ts +4 -0
  45. package/dist/adapters/db/index.js +52 -0
  46. package/dist/adapters/db/index.js.map +1 -0
  47. package/dist/adapters/db/mongo/index.cjs +62 -0
  48. package/dist/adapters/db/mongo/index.cjs.map +1 -0
  49. package/dist/adapters/db/mongo/index.d.cts +22 -0
  50. package/dist/adapters/db/mongo/index.d.ts +22 -0
  51. package/dist/adapters/db/mongo/index.js +35 -0
  52. package/dist/adapters/db/mongo/index.js.map +1 -0
  53. package/dist/adapters/index.cjs +651 -0
  54. package/dist/adapters/index.cjs.map +1 -0
  55. package/dist/adapters/index.d.cts +26 -0
  56. package/dist/adapters/index.d.ts +26 -0
  57. package/dist/adapters/index.js +609 -0
  58. package/dist/adapters/index.js.map +1 -0
  59. package/dist/adapters/kernel/console/index.cjs +46 -0
  60. package/dist/adapters/kernel/console/index.cjs.map +1 -0
  61. package/dist/adapters/kernel/console/index.d.cts +10 -0
  62. package/dist/adapters/kernel/console/index.d.ts +10 -0
  63. package/dist/adapters/kernel/console/index.js +19 -0
  64. package/dist/adapters/kernel/console/index.js.map +1 -0
  65. package/dist/adapters/kernel/index.cjs +46 -0
  66. package/dist/adapters/kernel/index.cjs.map +1 -0
  67. package/dist/adapters/kernel/index.d.cts +2 -0
  68. package/dist/adapters/kernel/index.d.ts +2 -0
  69. package/dist/adapters/kernel/index.js +19 -0
  70. package/dist/adapters/kernel/index.js.map +1 -0
  71. package/dist/adapters/pubsub/amqp/index.cjs +724 -0
  72. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -0
  73. package/dist/adapters/pubsub/amqp/index.d.cts +42 -0
  74. package/dist/adapters/pubsub/amqp/index.d.ts +42 -0
  75. package/dist/adapters/pubsub/amqp/index.js +691 -0
  76. package/dist/adapters/pubsub/amqp/index.js.map +1 -0
  77. package/dist/adapters/pubsub/in-memory/index.cjs +79 -0
  78. package/dist/adapters/pubsub/in-memory/index.cjs.map +1 -0
  79. package/dist/adapters/pubsub/in-memory/index.d.cts +21 -0
  80. package/dist/adapters/pubsub/in-memory/index.d.ts +21 -0
  81. package/dist/adapters/pubsub/in-memory/index.js +51 -0
  82. package/dist/adapters/pubsub/in-memory/index.js.map +1 -0
  83. package/dist/adapters/pubsub/index.cjs +492 -0
  84. package/dist/adapters/pubsub/index.cjs.map +1 -0
  85. package/dist/adapters/pubsub/index.d.cts +11 -0
  86. package/dist/adapters/pubsub/index.d.ts +11 -0
  87. package/dist/adapters/pubsub/index.js +456 -0
  88. package/dist/adapters/pubsub/index.js.map +1 -0
  89. package/dist/adapters/ui/express/index.cjs +126 -0
  90. package/dist/adapters/ui/express/index.cjs.map +1 -0
  91. package/dist/adapters/ui/express/index.d.cts +49 -0
  92. package/dist/adapters/ui/express/index.d.ts +49 -0
  93. package/dist/adapters/ui/express/index.js +98 -0
  94. package/dist/adapters/ui/express/index.js.map +1 -0
  95. package/dist/adapters/ui/index.cjs +489 -0
  96. package/dist/adapters/ui/index.cjs.map +1 -0
  97. package/dist/adapters/ui/index.d.cts +14 -0
  98. package/dist/adapters/ui/index.d.ts +14 -0
  99. package/dist/adapters/ui/index.js +455 -0
  100. package/dist/adapters/ui/index.js.map +1 -0
  101. package/dist/adapters/ui/routes/index.cjs +393 -0
  102. package/dist/adapters/ui/routes/index.cjs.map +1 -0
  103. package/dist/adapters/ui/routes/index.d.cts +5 -0
  104. package/dist/adapters/ui/routes/index.d.ts +5 -0
  105. package/dist/adapters/ui/routes/index.js +361 -0
  106. package/dist/adapters/ui/routes/index.js.map +1 -0
  107. package/dist/contracts/db/index.cjs +19 -0
  108. package/dist/contracts/db/index.cjs.map +1 -0
  109. package/dist/contracts/db/index.d.cts +7 -0
  110. package/dist/contracts/db/index.d.ts +7 -0
  111. package/dist/contracts/db/index.js +1 -0
  112. package/dist/contracts/db/index.js.map +1 -0
  113. package/dist/contracts/index.cjs +49 -0
  114. package/dist/contracts/index.cjs.map +1 -0
  115. package/dist/contracts/index.d.cts +11 -0
  116. package/dist/contracts/index.d.ts +11 -0
  117. package/dist/contracts/index.js +22 -0
  118. package/dist/contracts/index.js.map +1 -0
  119. package/dist/contracts/kernel/index.cjs +19 -0
  120. package/dist/contracts/kernel/index.cjs.map +1 -0
  121. package/dist/contracts/kernel/index.d.cts +9 -0
  122. package/dist/contracts/kernel/index.d.ts +9 -0
  123. package/dist/contracts/kernel/index.js +1 -0
  124. package/dist/contracts/kernel/index.js.map +1 -0
  125. package/dist/contracts/pubsub/index.cjs +19 -0
  126. package/dist/contracts/pubsub/index.cjs.map +1 -0
  127. package/dist/contracts/pubsub/index.d.cts +26 -0
  128. package/dist/contracts/pubsub/index.d.ts +26 -0
  129. package/dist/contracts/pubsub/index.js +1 -0
  130. package/dist/contracts/pubsub/index.js.map +1 -0
  131. package/dist/contracts/ui/index.cjs +49 -0
  132. package/dist/contracts/ui/index.cjs.map +1 -0
  133. package/dist/contracts/ui/index.d.cts +29 -0
  134. package/dist/contracts/ui/index.d.ts +29 -0
  135. package/dist/contracts/ui/index.js +22 -0
  136. package/dist/contracts/ui/index.js.map +1 -0
  137. package/dist/domain/index.cjs +121 -0
  138. package/dist/domain/index.cjs.map +1 -0
  139. package/dist/domain/index.d.cts +26 -0
  140. package/dist/domain/index.d.ts +26 -0
  141. package/dist/domain/index.js +89 -0
  142. package/dist/domain/index.js.map +1 -0
  143. package/dist/errors/index.cjs +58 -0
  144. package/dist/errors/index.cjs.map +1 -0
  145. package/dist/errors/index.d.cts +13 -0
  146. package/dist/errors/index.d.ts +13 -0
  147. package/dist/errors/index.js +29 -0
  148. package/dist/errors/index.js.map +1 -0
  149. package/dist/index.cjs +442 -0
  150. package/dist/index.cjs.map +1 -0
  151. package/dist/index.d.cts +19 -0
  152. package/dist/index.d.ts +19 -0
  153. package/dist/index.js +405 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/infrastructure/dependency-injection/index.cjs +169 -0
  156. package/dist/infrastructure/dependency-injection/index.cjs.map +1 -0
  157. package/dist/infrastructure/dependency-injection/index.d.cts +30 -0
  158. package/dist/infrastructure/dependency-injection/index.d.ts +30 -0
  159. package/dist/infrastructure/dependency-injection/index.js +137 -0
  160. package/dist/infrastructure/dependency-injection/index.js.map +1 -0
  161. package/dist/infrastructure/express/index.cjs +126 -0
  162. package/dist/infrastructure/express/index.cjs.map +1 -0
  163. package/dist/infrastructure/express/index.d.cts +14 -0
  164. package/dist/infrastructure/express/index.d.ts +14 -0
  165. package/dist/infrastructure/express/index.js +98 -0
  166. package/dist/infrastructure/express/index.js.map +1 -0
  167. package/dist/infrastructure/lifecycle/index.cjs +19 -0
  168. package/dist/infrastructure/lifecycle/index.cjs.map +1 -0
  169. package/dist/infrastructure/lifecycle/index.d.cts +9 -0
  170. package/dist/infrastructure/lifecycle/index.d.ts +9 -0
  171. package/dist/infrastructure/lifecycle/index.js +1 -0
  172. package/dist/infrastructure/lifecycle/index.js.map +1 -0
  173. package/dist/infrastructure/logs/index.cjs +144 -0
  174. package/dist/infrastructure/logs/index.cjs.map +1 -0
  175. package/dist/infrastructure/logs/index.d.cts +30 -0
  176. package/dist/infrastructure/logs/index.d.ts +30 -0
  177. package/dist/infrastructure/logs/index.js +107 -0
  178. package/dist/infrastructure/logs/index.js.map +1 -0
  179. package/dist/infrastructure/scheduler/index.cjs +461 -0
  180. package/dist/infrastructure/scheduler/index.cjs.map +1 -0
  181. package/dist/infrastructure/scheduler/index.d.cts +17 -0
  182. package/dist/infrastructure/scheduler/index.d.ts +17 -0
  183. package/dist/infrastructure/scheduler/index.js +426 -0
  184. package/dist/infrastructure/scheduler/index.js.map +1 -0
  185. package/dist/infrastructure/websocket/index.cjs +131 -0
  186. package/dist/infrastructure/websocket/index.cjs.map +1 -0
  187. package/dist/infrastructure/websocket/index.d.cts +56 -0
  188. package/dist/infrastructure/websocket/index.d.ts +56 -0
  189. package/dist/infrastructure/websocket/index.js +103 -0
  190. package/dist/infrastructure/websocket/index.js.map +1 -0
  191. 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":";AAOO,IAAM,oBAAN,MAA4C;AAAA,EAGjD,YACmB,mBACA,QACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAJF,UAAU,oBAAI,IAA+B;AAAA,EAOtD,KAAK,QAAmB,SAAyC;AACvE,QAAI,OAAO,eAAe,OAAO,MAAM;AACrC;AAAA,IACF;AAEA,WAAO,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EACrC;AAAA,EAEQ,WAAW,UAAqB,QAAyB;AAC/D,UAAM,kBAAkB,KAAK,QAAQ,IAAI,QAAQ;AAEjD,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AAEA,oBAAgB,OAAO,MAAM;AAE7B,QAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAK,QAAQ,OAAO,QAAQ;AAAA,IAC9B;AAAA,EACF;AAAA,EAEO,SAAS,UAAqB,QAAyB;AAC5D,UAAM,kBAAkB,KAAK,QAAQ,IAAI,QAAQ,KAAK,oBAAI,IAAe;AAEzE,oBAAgB,IAAI,MAAM;AAC1B,SAAK,QAAQ,IAAI,UAAU,eAAe;AAC1C,WAAO,GAAG,SAAS,MAAM,KAAK,WAAW,UAAU,MAAM,CAAC;AAE1D,SAAK,KAAK,QAAQ;AAAA,MAChB,YAAY,OAAO,QAAQ;AAAA,MAC3B,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEO,UAAU,OAA0B;AACzC,UAAM,aAAa,KAAK,mBAAmB,QAAQ,KAAK,KAAK,CAAC;AAC9D,UAAM,UAAoC;AAAA,MACxC,OAAO,MAAM,OAAO,MAAM,OAAO,CAAC;AAAA,MAClC,MAAM;AAAA,IACR;AAEA,eAAW,aAAa,YAAY;AAClC,WAAK,gBAAgB,WAAW,OAAO;AAAA,IACzC;AAAA,EACF;AAAA,EAEO,eAAe,SAAyC;AAC7D,eAAW,mBAAmB,KAAK,QAAQ,OAAO,GAAG;AACnD,iBAAW,UAAU,iBAAiB;AACpC,aAAK,KAAK,QAAQ,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEO,gBACL,WACA,SACM;AACN,UAAM,kBAAkB,KAAK,QAAQ,IAAI,SAAS;AAElD,QAAI,CAAC,iBAAiB;AACpB,WAAK,QAAQ,MAAM,wBAAwB,OAAO,SAAS,CAAC,YAAY;AAExE;AAAA,IACF;AAEA,eAAW,UAAU,iBAAiB;AACpC,WAAK,KAAK,QAAQ,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;;;ACnFA,SAAS,uBAAuB;AAIzB,IAAM,0BAAN,MAAkD;AAAA,EAGvD,YACmB,SACjB;AADiB;AAAA,EAChB;AAAA,EADgB;AAAA,EAHF,SAAS,IAAI,gBAAgB,EAAE,UAAU,KAAK,CAAC;AAAA,EAMxD,cACN,SACA,QACA,MACA,eACM;AACN,UAAM,MAAM,IAAI,IAAI,QAAQ,OAAO,KAAK,kBAAkB;AAE1D,QAAI,IAAI,aAAa,eAAe;AAClC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,KAAK,QAAQ,cAAc;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAEA,WAAK,OAAO,cAAc,SAAS,QAAQ,MAAM,CAAC,WAAW;AAC3D,aAAK,QAAQ,SAAS,SAAS,UAAU,MAAM;AAC/C,aAAK,OAAO,KAAK,cAAc,QAAQ,OAAO;AAAA,MAChD,CAAC;AAAA,IACH,QAAQ;AACN,aAAO,MAAM,mCAAmC;AAChD,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAEO,OAAO,YAA8B;AAC1C,UAAM,gBAAgB,KAAK,QAAQ,iBAAiB;AAEpD,eAAW,GAAG,WAAW,CAAC,SAAS,QAAQ,SAAS;AAClD,WAAK,cAAc,SAAS,QAAQ,MAAM,aAAa;AAAA,IACzD,CAAC;AAAA,EACH;AACF;","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
+ }