@j3r3mcdev/oast-server 1.1.0 → 1.1.1

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 (187) hide show
  1. package/.github/workflows/ci.yml +29 -29
  2. package/.github/workflows/publish.yml +31 -31
  3. package/README.md +192 -192
  4. package/dist/listeners/ssrf/__tests__/ssrf.listener.test.js +16 -4
  5. package/jest.config.js +14 -14
  6. package/package.json +45 -45
  7. package/sadmin list shadows +9 -9
  8. package/src/api/controllers/__tests__/tasks.controller.test.ts +74 -74
  9. package/src/api/controllers/events.controller.ts +10 -10
  10. package/src/api/controllers/health.controller.ts +7 -7
  11. package/src/api/controllers/tasks.controller.ts +41 -41
  12. package/src/api/dto/__tests__/create-task.dto.test.ts +41 -41
  13. package/src/api/dto/__tests__/filter-tasks.dto.test.ts +35 -35
  14. package/src/api/dto/create-task.dto.ts +33 -33
  15. package/src/api/dto/filter-tasks.dto.ts +33 -33
  16. package/src/api/services/__tests__/events.service.test.ts +41 -41
  17. package/src/api/services/__tests__/tasks.service.test.ts +41 -41
  18. package/src/api/services/events.service.ts +17 -17
  19. package/src/api/services/tasks.service.ts +79 -79
  20. package/src/api/sse/events.stream.ts +90 -90
  21. package/src/core/__tests__/core-router.test.ts +30 -30
  22. package/src/core/__tests__/core-server.test.ts +44 -44
  23. package/src/core/__tests__/event.normalizer.test.ts +56 -56
  24. package/src/core/__tests__/event.router.test.ts +89 -89
  25. package/src/core/__tests__/logger.test.ts +32 -32
  26. package/src/core/__tests__/storage-manager.test.ts +74 -74
  27. package/src/core/event.normalizer.ts +147 -147
  28. package/src/core/event.router.ts +13 -13
  29. package/src/core/http/__tests__/adapter-node.test.ts +52 -52
  30. package/src/core/http/__tests__/body-parser-multipart.test.ts +41 -41
  31. package/src/core/http/__tests__/body-parser-raw.test.ts +28 -28
  32. package/src/core/http/__tests__/body-parser-text.test.ts +28 -28
  33. package/src/core/http/__tests__/compile-path.test.ts +39 -39
  34. package/src/core/http/__tests__/middleware-pipeline.test.ts +51 -51
  35. package/src/core/http/__tests__/request.test.ts +34 -34
  36. package/src/core/http/__tests__/response.test.ts +35 -35
  37. package/src/core/http/__tests__/router-match.test.ts +171 -171
  38. package/src/core/http/adapter-node.ts +51 -51
  39. package/src/core/http/buildRequest.ts +18 -18
  40. package/src/core/http/compile-path.ts +32 -32
  41. package/src/core/http/errors.ts +37 -37
  42. package/src/core/http/http-server.ts +52 -52
  43. package/src/core/http/middleware.ts +160 -160
  44. package/src/core/http/request.ts +55 -55
  45. package/src/core/http/response.ts +93 -93
  46. package/src/core/http/router.ts +138 -138
  47. package/src/core/id-generator.ts +8 -8
  48. package/src/core/logger.ts +113 -113
  49. package/src/core/router.ts +44 -44
  50. package/src/core/server.ts +85 -85
  51. package/src/core/storage.ts +64 -64
  52. package/src/index.ts +89 -89
  53. package/src/listeners/api/__tests__/api.controller.test.ts +116 -116
  54. package/src/listeners/api/__tests__/api.extractor.test.ts +46 -46
  55. package/src/listeners/api/__tests__/api.listener.test.ts +82 -82
  56. package/src/listeners/api/__tests__/api.routes.test.ts +155 -155
  57. package/src/listeners/api/__tests__/api.sse.test.ts +105 -105
  58. package/src/listeners/api/api.controllers.ts +67 -67
  59. package/src/listeners/api/api.extractor.ts +43 -43
  60. package/src/listeners/api/api.listener.ts +50 -50
  61. package/src/listeners/api/api.routes.ts +76 -76
  62. package/src/listeners/api/api.sse.ts +38 -38
  63. package/src/listeners/dns/__tests__/dns.test.ts +118 -118
  64. package/src/listeners/dns/dns.extractor.ts +14 -14
  65. package/src/listeners/dns/dns.listener.ts +61 -61
  66. package/src/listeners/http/__tests__/http.extractor.test.ts +59 -59
  67. package/src/listeners/http/__tests__/http.listener.test.ts +133 -133
  68. package/src/listeners/http/http.extractor.ts +15 -15
  69. package/src/listeners/http/http.listener.ts +110 -110
  70. package/src/listeners/listener.interface.ts +4 -4
  71. package/src/listeners/smtp/__tests__/smtp.extractor.test.ts +69 -69
  72. package/src/listeners/smtp/__tests__/smtp.listener.test.ts +150 -150
  73. package/src/listeners/smtp/smtp.extractor.ts +18 -18
  74. package/src/listeners/smtp/smtp.listener.ts +60 -60
  75. package/src/listeners/ssrf/__tests__/ssrf.extractor.test.ts +41 -41
  76. package/src/listeners/ssrf/__tests__/ssrf.listener.test.ts +87 -87
  77. package/src/listeners/ssrf/ssrf.extractor.ts +14 -14
  78. package/src/listeners/ssrf/ssrf.listener.ts +37 -37
  79. package/src/listeners/tcp/tcp.extractor.ts +16 -16
  80. package/src/listeners/tcp/tcp.listener.ts +61 -61
  81. package/src/listeners/webhook/__tests__/webhook.extractor.test.ts +35 -35
  82. package/src/listeners/webhook/__tests__/webhook.listener.test.ts +122 -122
  83. package/src/listeners/webhook/webhook.extractor.ts +12 -12
  84. package/src/listeners/webhook/webhook.listener.ts +58 -58
  85. package/src/listeners/websocket/__tests__/websocket.extractor.test.ts +33 -33
  86. package/src/listeners/websocket/__tests__/websocket.listener.test.ts +90 -90
  87. package/src/listeners/websocket/websocket.extractor.ts +11 -11
  88. package/src/listeners/websocket/websocket.listener.ts +40 -40
  89. package/src/storage-adapters/adapters/__tests__/memory.storage.test.ts +75 -75
  90. package/src/storage-adapters/adapters/memory.storage.ts +64 -64
  91. package/src/storage-adapters/storage.interface.ts +26 -26
  92. package/src/types/event.types.ts +147 -147
  93. package/tsconfig.json +21 -21
  94. package/dist/api/controllers/__tests__/tasks.controller.test.d.ts +0 -1
  95. package/dist/api/controllers/events.controller.d.ts +0 -6
  96. package/dist/api/controllers/health.controller.d.ts +0 -4
  97. package/dist/api/controllers/index.d.ts +0 -0
  98. package/dist/api/controllers/tasks.controller.d.ts +0 -40
  99. package/dist/api/dto/__tests__/create-task.dto.test.d.ts +0 -1
  100. package/dist/api/dto/__tests__/filter-tasks.dto.test.d.ts +0 -1
  101. package/dist/api/dto/create-task.dto.d.ts +0 -9
  102. package/dist/api/dto/filter-tasks.dto.d.ts +0 -8
  103. package/dist/api/services/__tests__/events.service.test.d.ts +0 -1
  104. package/dist/api/services/__tests__/tasks.service.test.d.ts +0 -1
  105. package/dist/api/services/events.service.d.ts +0 -8
  106. package/dist/api/services/tasks.service.d.ts +0 -22
  107. package/dist/api/sse/events.stream.d.ts +0 -25
  108. package/dist/config/constants.d.ts +0 -0
  109. package/dist/config/env.d.ts +0 -0
  110. package/dist/core/__tests__/core-router.test.d.ts +0 -1
  111. package/dist/core/__tests__/core-server.test.d.ts +0 -1
  112. package/dist/core/__tests__/event.normalizer.test.d.ts +0 -1
  113. package/dist/core/__tests__/event.router.test.d.ts +0 -1
  114. package/dist/core/__tests__/logger.test.d.ts +0 -1
  115. package/dist/core/__tests__/storage-manager.test.d.ts +0 -1
  116. package/dist/core/event.normalizer.d.ts +0 -10
  117. package/dist/core/event.router.d.ts +0 -7
  118. package/dist/core/http/__tests__/adapter-node.test.d.ts +0 -1
  119. package/dist/core/http/__tests__/body-parser-multipart.test.d.ts +0 -1
  120. package/dist/core/http/__tests__/body-parser-raw.test.d.ts +0 -1
  121. package/dist/core/http/__tests__/body-parser-text.test.d.ts +0 -1
  122. package/dist/core/http/__tests__/compile-path.test.d.ts +0 -1
  123. package/dist/core/http/__tests__/middleware-pipeline.test.d.ts +0 -1
  124. package/dist/core/http/__tests__/request.test.d.ts +0 -1
  125. package/dist/core/http/__tests__/response.test.d.ts +0 -1
  126. package/dist/core/http/__tests__/router-match.test.d.ts +0 -1
  127. package/dist/core/http/adapter-node.d.ts +0 -8
  128. package/dist/core/http/buildRequest.d.ts +0 -2
  129. package/dist/core/http/compile-path.d.ts +0 -13
  130. package/dist/core/http/errors.d.ts +0 -9
  131. package/dist/core/http/http-server.d.ts +0 -7
  132. package/dist/core/http/index.d.ts +0 -0
  133. package/dist/core/http/main.d.ts +0 -0
  134. package/dist/core/http/middleware.d.ts +0 -12
  135. package/dist/core/http/request.d.ts +0 -35
  136. package/dist/core/http/response.d.ts +0 -17
  137. package/dist/core/http/router.d.ts +0 -28
  138. package/dist/core/http/utils.d.ts +0 -0
  139. package/dist/core/id-generator.d.ts +0 -3
  140. package/dist/core/logger.d.ts +0 -29
  141. package/dist/core/router.d.ts +0 -16
  142. package/dist/core/server.d.ts +0 -25
  143. package/dist/core/storage.d.ts +0 -24
  144. package/dist/index.d.ts +0 -1
  145. package/dist/listeners/api/__tests__/api.controller.test.d.ts +0 -1
  146. package/dist/listeners/api/__tests__/api.extractor.test.d.ts +0 -1
  147. package/dist/listeners/api/__tests__/api.listener.test.d.ts +0 -1
  148. package/dist/listeners/api/__tests__/api.routes.test.d.ts +0 -1
  149. package/dist/listeners/api/__tests__/api.sse.test.d.ts +0 -1
  150. package/dist/listeners/api/api.controllers.d.ts +0 -9
  151. package/dist/listeners/api/api.extractor.d.ts +0 -5
  152. package/dist/listeners/api/api.listener.d.ts +0 -17
  153. package/dist/listeners/api/api.routes.d.ts +0 -5
  154. package/dist/listeners/api/api.sse.d.ts +0 -10
  155. package/dist/listeners/dns/__tests__/dns.test.d.ts +0 -1
  156. package/dist/listeners/dns/dns.extractor.d.ts +0 -8
  157. package/dist/listeners/dns/dns.listener.d.ts +0 -15
  158. package/dist/listeners/http/__tests__/http.extractor.test.d.ts +0 -1
  159. package/dist/listeners/http/__tests__/http.listener.test.d.ts +0 -1
  160. package/dist/listeners/http/http.extractor.d.ts +0 -11
  161. package/dist/listeners/http/http.listener.d.ts +0 -17
  162. package/dist/listeners/listener.interface.d.ts +0 -4
  163. package/dist/listeners/smtp/__tests__/smtp.extractor.test.d.ts +0 -1
  164. package/dist/listeners/smtp/__tests__/smtp.listener.test.d.ts +0 -1
  165. package/dist/listeners/smtp/smtp.extractor.d.ts +0 -12
  166. package/dist/listeners/smtp/smtp.listener.d.ts +0 -13
  167. package/dist/listeners/ssrf/__tests__/ssrf.extractor.test.d.ts +0 -1
  168. package/dist/listeners/ssrf/__tests__/ssrf.listener.test.d.ts +0 -1
  169. package/dist/listeners/ssrf/ssrf.extractor.d.ts +0 -10
  170. package/dist/listeners/ssrf/ssrf.listener.d.ts +0 -8
  171. package/dist/listeners/tcp/tcp.extractor.d.ts +0 -4
  172. package/dist/listeners/tcp/tcp.listener.d.ts +0 -18
  173. package/dist/listeners/webhook/__tests__/webhook.extractor.test.d.ts +0 -1
  174. package/dist/listeners/webhook/__tests__/webhook.listener.test.d.ts +0 -1
  175. package/dist/listeners/webhook/webhook.extractor.d.ts +0 -8
  176. package/dist/listeners/webhook/webhook.listener.d.ts +0 -8
  177. package/dist/listeners/websocket/__tests__/websocket.extractor.test.d.ts +0 -1
  178. package/dist/listeners/websocket/__tests__/websocket.listener.test.d.ts +0 -1
  179. package/dist/listeners/websocket/websocket.extractor.d.ts +0 -10
  180. package/dist/listeners/websocket/websocket.listener.d.ts +0 -8
  181. package/dist/storage-adapters/adapters/__tests__/memory.storage.test.d.ts +0 -1
  182. package/dist/storage-adapters/adapters/memory.storage.d.ts +0 -21
  183. package/dist/storage-adapters/adapters/redis.storage.d.ts +0 -0
  184. package/dist/storage-adapters/adapters/sqlite.storage.d.ts +0 -0
  185. package/dist/storage-adapters/storage.interface.d.ts +0 -18
  186. package/dist/types/event.types.d.ts +0 -118
  187. package/dist/utils/token.d.ts +0 -0
@@ -1,85 +1,85 @@
1
- import { Logger } from "./logger";
2
- import { CoreRouter } from "./router";
3
- import { StorageManager } from "./storage";
4
- import { Listener } from "../listeners/listener.interface";
5
- export interface CoreServerOptions {
6
- logger?: Logger;
7
- storage?: StorageManager;
8
- listeners?: Listener[];
9
- }
10
-
11
- export class CoreServer {
12
- private logger: Logger;
13
- private storage: StorageManager;
14
- private router: CoreRouter;
15
- private listeners: Listener[];
16
-
17
- constructor(options: CoreServerOptions = {}) {
18
- this.logger = options.logger ?? new Logger({ context: "CoreServer" });
19
- this.storage =
20
- options.storage ?? new StorageManager({ logger: this.logger });
21
- this.router = new CoreRouter(this.storage, { logger: this.logger });
22
- this.listeners = options.listeners ?? [];
23
- }
24
-
25
- getRouter() {
26
- return this.router;
27
- }
28
-
29
- getStorage() {
30
- return this.storage;
31
- }
32
-
33
- async start(): Promise<void> {
34
- this.logger.info("Starting OAST server...");
35
-
36
- // Démarrage des listeners
37
- for (const listener of this.listeners) {
38
- try {
39
- await listener.start();
40
- this.logger.info(`Listener started`, {
41
- listener: listener.constructor.name,
42
- });
43
- } catch (err: any) {
44
- this.logger.error("Listener failed to start", {
45
- listener: listener.constructor.name,
46
- error: err.message,
47
- });
48
- }
49
- }
50
-
51
- this.logger.info("OAST server started");
52
- }
53
-
54
- async stop(): Promise<void> {
55
- this.logger.info("Stopping OAST server...");
56
-
57
- for (const listener of this.listeners) {
58
- try {
59
- await listener.stop();
60
- this.logger.info(`Listener stopped`, {
61
- listener: listener.constructor.name,
62
- });
63
- } catch (err: any) {
64
- this.logger.error("Listener failed to stop", {
65
- listener: listener.constructor.name,
66
- error: err.message,
67
- });
68
- }
69
- }
70
-
71
- this.logger.info("OAST server stopped");
72
- }
73
-
74
- /**
75
- * Méthode appelée par CoreRouter après chaque event normalisé.
76
- * Permet de diffuser l’event aux listeners SSE (ApiListener).
77
- */
78
- broadcast(event: any) {
79
- for (const listener of this.listeners) {
80
- if (typeof (listener as any).broadcastEvent === "function") {
81
- (listener as any).broadcastEvent(event);
82
- }
83
- }
84
- }
85
- }
1
+ import { Logger } from "./logger";
2
+ import { CoreRouter } from "./router";
3
+ import { StorageManager } from "./storage";
4
+ import { Listener } from "../listeners/listener.interface";
5
+ export interface CoreServerOptions {
6
+ logger?: Logger;
7
+ storage?: StorageManager;
8
+ listeners?: Listener[];
9
+ }
10
+
11
+ export class CoreServer {
12
+ private logger: Logger;
13
+ private storage: StorageManager;
14
+ private router: CoreRouter;
15
+ private listeners: Listener[];
16
+
17
+ constructor(options: CoreServerOptions = {}) {
18
+ this.logger = options.logger ?? new Logger({ context: "CoreServer" });
19
+ this.storage =
20
+ options.storage ?? new StorageManager({ logger: this.logger });
21
+ this.router = new CoreRouter(this.storage, { logger: this.logger });
22
+ this.listeners = options.listeners ?? [];
23
+ }
24
+
25
+ getRouter() {
26
+ return this.router;
27
+ }
28
+
29
+ getStorage() {
30
+ return this.storage;
31
+ }
32
+
33
+ async start(): Promise<void> {
34
+ this.logger.info("Starting OAST server...");
35
+
36
+ // Démarrage des listeners
37
+ for (const listener of this.listeners) {
38
+ try {
39
+ await listener.start();
40
+ this.logger.info(`Listener started`, {
41
+ listener: listener.constructor.name,
42
+ });
43
+ } catch (err: any) {
44
+ this.logger.error("Listener failed to start", {
45
+ listener: listener.constructor.name,
46
+ error: err.message,
47
+ });
48
+ }
49
+ }
50
+
51
+ this.logger.info("OAST server started");
52
+ }
53
+
54
+ async stop(): Promise<void> {
55
+ this.logger.info("Stopping OAST server...");
56
+
57
+ for (const listener of this.listeners) {
58
+ try {
59
+ await listener.stop();
60
+ this.logger.info(`Listener stopped`, {
61
+ listener: listener.constructor.name,
62
+ });
63
+ } catch (err: any) {
64
+ this.logger.error("Listener failed to stop", {
65
+ listener: listener.constructor.name,
66
+ error: err.message,
67
+ });
68
+ }
69
+ }
70
+
71
+ this.logger.info("OAST server stopped");
72
+ }
73
+
74
+ /**
75
+ * Méthode appelée par CoreRouter après chaque event normalisé.
76
+ * Permet de diffuser l’event aux listeners SSE (ApiListener).
77
+ */
78
+ broadcast(event: any) {
79
+ for (const listener of this.listeners) {
80
+ if (typeof (listener as any).broadcastEvent === "function") {
81
+ (listener as any).broadcastEvent(event);
82
+ }
83
+ }
84
+ }
85
+ }
@@ -1,64 +1,64 @@
1
- import { Storage } from "../storage-adapters/storage.interface";
2
- import { AnyNormalizedEvent } from "../types/event.types";
3
- import { Logger } from "./logger";
4
-
5
- export class StorageManager implements Storage {
6
- private events: AnyNormalizedEvent[] = [];
7
- private logger: Logger;
8
-
9
- constructor(options: { logger?: Logger } = {}) {
10
- this.logger = options.logger ?? new Logger({ context: "StorageManager" });
11
- }
12
-
13
- async save(event: AnyNormalizedEvent): Promise<void> {
14
- this.events.push(event);
15
- }
16
-
17
- async getEvent(id: string): Promise<AnyNormalizedEvent | null> {
18
- return this.events.find((e) => e.id === id) ?? null;
19
- }
20
-
21
- async listEvents(params: {
22
- type?: string;
23
- page?: number;
24
- limit?: number;
25
- }): Promise<AnyNormalizedEvent[]> {
26
- const { type, page = 1, limit = 50 } = params;
27
-
28
- let filtered = this.events;
29
- if (type) filtered = filtered.filter((e) => e.type === type);
30
-
31
- const start = (page - 1) * limit;
32
- return filtered.slice(start, start + limit);
33
- }
34
-
35
- async getAll(): Promise<AnyNormalizedEvent[]> {
36
- return this.events;
37
- }
38
-
39
- async deleteEvent(id: string): Promise<boolean> {
40
- const before = this.events.length;
41
- this.events = this.events.filter((e) => e.id !== id);
42
- return this.events.length !== before;
43
- }
44
-
45
- async clearEvents(): Promise<void> {
46
- this.events = [];
47
- }
48
-
49
- async getStats(): Promise<{
50
- total: number;
51
- byType: Record<string, number>;
52
- }> {
53
- const byType: Record<string, number> = {};
54
-
55
- for (const e of this.events) {
56
- byType[e.type] = (byType[e.type] ?? 0) + 1;
57
- }
58
-
59
- return {
60
- total: this.events.length,
61
- byType,
62
- };
63
- }
64
- }
1
+ import { Storage } from "../storage-adapters/storage.interface";
2
+ import { AnyNormalizedEvent } from "../types/event.types";
3
+ import { Logger } from "./logger";
4
+
5
+ export class StorageManager implements Storage {
6
+ private events: AnyNormalizedEvent[] = [];
7
+ private logger: Logger;
8
+
9
+ constructor(options: { logger?: Logger } = {}) {
10
+ this.logger = options.logger ?? new Logger({ context: "StorageManager" });
11
+ }
12
+
13
+ async save(event: AnyNormalizedEvent): Promise<void> {
14
+ this.events.push(event);
15
+ }
16
+
17
+ async getEvent(id: string): Promise<AnyNormalizedEvent | null> {
18
+ return this.events.find((e) => e.id === id) ?? null;
19
+ }
20
+
21
+ async listEvents(params: {
22
+ type?: string;
23
+ page?: number;
24
+ limit?: number;
25
+ }): Promise<AnyNormalizedEvent[]> {
26
+ const { type, page = 1, limit = 50 } = params;
27
+
28
+ let filtered = this.events;
29
+ if (type) filtered = filtered.filter((e) => e.type === type);
30
+
31
+ const start = (page - 1) * limit;
32
+ return filtered.slice(start, start + limit);
33
+ }
34
+
35
+ async getAll(): Promise<AnyNormalizedEvent[]> {
36
+ return this.events;
37
+ }
38
+
39
+ async deleteEvent(id: string): Promise<boolean> {
40
+ const before = this.events.length;
41
+ this.events = this.events.filter((e) => e.id !== id);
42
+ return this.events.length !== before;
43
+ }
44
+
45
+ async clearEvents(): Promise<void> {
46
+ this.events = [];
47
+ }
48
+
49
+ async getStats(): Promise<{
50
+ total: number;
51
+ byType: Record<string, number>;
52
+ }> {
53
+ const byType: Record<string, number> = {};
54
+
55
+ for (const e of this.events) {
56
+ byType[e.type] = (byType[e.type] ?? 0) + 1;
57
+ }
58
+
59
+ return {
60
+ total: this.events.length,
61
+ byType,
62
+ };
63
+ }
64
+ }
package/src/index.ts CHANGED
@@ -1,89 +1,89 @@
1
- import { Logger } from "./core/logger";
2
- import { StorageManager } from "./core/storage";
3
- import { CoreRouter } from "./core/router";
4
- import { CoreServer } from "./core/server";
5
-
6
- // Listeners
7
- import { ApiListener } from "./listeners/api/api.listener";
8
- import { HttpListener } from "./listeners/http/http.listener";
9
- import { DnsListener } from "./listeners/dns/dns.listener";
10
- import { SmtpListener } from "./listeners/smtp/smtp.listener";
11
- import { TcpListener } from "./listeners/tcp/tcp.listener";
12
-
13
- async function main() {
14
- const logger = new Logger({ context: "Bootstrap" });
15
-
16
- // Core components
17
- const storage = new StorageManager({
18
- logger: logger.withContext("Storage"),
19
- });
20
-
21
- const router = new CoreRouter(storage, {
22
- logger: logger.withContext("CoreRouter"),
23
- });
24
-
25
- // ---------------------------
26
- // LISTENERS
27
- // ---------------------------
28
-
29
- // API → (router, storage, options)
30
- const apiListener = new ApiListener(storage, {
31
- port: 3100,
32
- logger: logger.withContext("ApiListener"),
33
- });
34
-
35
- // HTTP → (router, options)
36
- const httpListener = new HttpListener(router, {
37
- port: 8080,
38
- logger: logger.withContext("HttpListener"),
39
- });
40
-
41
- // DNS → (router, options)
42
- const dnsListener = new DnsListener(router, {
43
- server: {} as any,
44
- logger: logger.withContext("DnsListener"),
45
- });
46
-
47
- const smtpListener = new SmtpListener(router, {
48
- server: {} as any,
49
- logger: logger.withContext("SmtpListener"),
50
- });
51
-
52
- // TCP → (router, storage, options)
53
- const tcpListener = new TcpListener(router, storage, {
54
- port: 9000,
55
- logger: logger.withContext("TcpListener"),
56
- });
57
-
58
- // ---------------------------
59
- // CORE SERVER
60
- // ---------------------------
61
- const server = new CoreServer({
62
- logger: logger.withContext("CoreServer"),
63
- storage,
64
- listeners: [
65
- apiListener,
66
- httpListener,
67
- dnsListener,
68
- smtpListener,
69
- tcpListener,
70
- ],
71
- });
72
-
73
- await server.start();
74
-
75
- // Graceful shutdown
76
- const shutdown = async () => {
77
- logger.warn("Received shutdown signal, stopping server...");
78
- await server.stop();
79
- process.exit(0);
80
- };
81
-
82
- process.on("SIGINT", shutdown);
83
- process.on("SIGTERM", shutdown);
84
- }
85
-
86
- main().catch((err) => {
87
- console.error("Fatal error in bootstrap:", err);
88
- process.exit(1);
89
- });
1
+ import { Logger } from "./core/logger";
2
+ import { StorageManager } from "./core/storage";
3
+ import { CoreRouter } from "./core/router";
4
+ import { CoreServer } from "./core/server";
5
+
6
+ // Listeners
7
+ import { ApiListener } from "./listeners/api/api.listener";
8
+ import { HttpListener } from "./listeners/http/http.listener";
9
+ import { DnsListener } from "./listeners/dns/dns.listener";
10
+ import { SmtpListener } from "./listeners/smtp/smtp.listener";
11
+ import { TcpListener } from "./listeners/tcp/tcp.listener";
12
+
13
+ async function main() {
14
+ const logger = new Logger({ context: "Bootstrap" });
15
+
16
+ // Core components
17
+ const storage = new StorageManager({
18
+ logger: logger.withContext("Storage"),
19
+ });
20
+
21
+ const router = new CoreRouter(storage, {
22
+ logger: logger.withContext("CoreRouter"),
23
+ });
24
+
25
+ // ---------------------------
26
+ // LISTENERS
27
+ // ---------------------------
28
+
29
+ // API → (router, storage, options)
30
+ const apiListener = new ApiListener(storage, {
31
+ port: 3100,
32
+ logger: logger.withContext("ApiListener"),
33
+ });
34
+
35
+ // HTTP → (router, options)
36
+ const httpListener = new HttpListener(router, {
37
+ port: 8080,
38
+ logger: logger.withContext("HttpListener"),
39
+ });
40
+
41
+ // DNS → (router, options)
42
+ const dnsListener = new DnsListener(router, {
43
+ server: {} as any,
44
+ logger: logger.withContext("DnsListener"),
45
+ });
46
+
47
+ const smtpListener = new SmtpListener(router, {
48
+ server: {} as any,
49
+ logger: logger.withContext("SmtpListener"),
50
+ });
51
+
52
+ // TCP → (router, storage, options)
53
+ const tcpListener = new TcpListener(router, storage, {
54
+ port: 9000,
55
+ logger: logger.withContext("TcpListener"),
56
+ });
57
+
58
+ // ---------------------------
59
+ // CORE SERVER
60
+ // ---------------------------
61
+ const server = new CoreServer({
62
+ logger: logger.withContext("CoreServer"),
63
+ storage,
64
+ listeners: [
65
+ apiListener,
66
+ httpListener,
67
+ dnsListener,
68
+ smtpListener,
69
+ tcpListener,
70
+ ],
71
+ });
72
+
73
+ await server.start();
74
+
75
+ // Graceful shutdown
76
+ const shutdown = async () => {
77
+ logger.warn("Received shutdown signal, stopping server...");
78
+ await server.stop();
79
+ process.exit(0);
80
+ };
81
+
82
+ process.on("SIGINT", shutdown);
83
+ process.on("SIGTERM", shutdown);
84
+ }
85
+
86
+ main().catch((err) => {
87
+ console.error("Fatal error in bootstrap:", err);
88
+ process.exit(1);
89
+ });