@j3r3mcdev/oast-server 1.1.1 → 1.1.3
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/.github/workflows/ci.yml +29 -29
- package/.github/workflows/publish.yml +31 -31
- package/README.md +192 -192
- package/dist/api/controllers/__tests__/tasks.controller.test.d.ts +1 -0
- package/dist/api/controllers/events.controller.d.ts +6 -0
- package/dist/api/controllers/health.controller.d.ts +4 -0
- package/dist/api/controllers/index.d.ts +0 -0
- package/dist/api/controllers/tasks.controller.d.ts +40 -0
- package/dist/api/dto/__tests__/create-task.dto.test.d.ts +1 -0
- package/dist/api/dto/__tests__/filter-tasks.dto.test.d.ts +1 -0
- package/dist/api/dto/create-task.dto.d.ts +9 -0
- package/dist/api/dto/filter-tasks.dto.d.ts +8 -0
- package/dist/api/services/__tests__/events.service.test.d.ts +1 -0
- package/dist/api/services/__tests__/tasks.service.test.d.ts +1 -0
- package/dist/api/services/events.service.d.ts +8 -0
- package/dist/api/services/tasks.service.d.ts +22 -0
- package/dist/api/sse/events.stream.d.ts +25 -0
- package/dist/bootstrap.d.ts +1 -0
- package/dist/bootstrap.js +76 -0
- package/dist/config/constants.d.ts +0 -0
- package/dist/config/env.d.ts +0 -0
- package/dist/core/__tests__/core-router.test.d.ts +1 -0
- package/dist/core/__tests__/core-server.test.d.ts +1 -0
- package/dist/core/__tests__/event.normalizer.test.d.ts +1 -0
- package/dist/core/__tests__/event.router.test.d.ts +1 -0
- package/dist/core/__tests__/logger.test.d.ts +1 -0
- package/dist/core/__tests__/storage-manager.test.d.ts +1 -0
- package/dist/core/event.normalizer.d.ts +10 -0
- package/dist/core/event.router.d.ts +7 -0
- package/dist/core/http/__tests__/adapter-node.test.d.ts +1 -0
- package/dist/core/http/__tests__/body-parser-multipart.test.d.ts +1 -0
- package/dist/core/http/__tests__/body-parser-raw.test.d.ts +1 -0
- package/dist/core/http/__tests__/body-parser-text.test.d.ts +1 -0
- package/dist/core/http/__tests__/compile-path.test.d.ts +1 -0
- package/dist/core/http/__tests__/middleware-pipeline.test.d.ts +1 -0
- package/dist/core/http/__tests__/request.test.d.ts +1 -0
- package/dist/core/http/__tests__/response.test.d.ts +1 -0
- package/dist/core/http/__tests__/router-match.test.d.ts +1 -0
- package/dist/core/http/adapter-node.d.ts +8 -0
- package/dist/core/http/buildRequest.d.ts +2 -0
- package/dist/core/http/compile-path.d.ts +13 -0
- package/dist/core/http/errors.d.ts +9 -0
- package/dist/core/http/http-server.d.ts +7 -0
- package/dist/core/http/index.d.ts +0 -0
- package/dist/core/http/main.d.ts +0 -0
- package/dist/core/http/middleware.d.ts +12 -0
- package/dist/core/http/request.d.ts +35 -0
- package/dist/core/http/response.d.ts +17 -0
- package/dist/core/http/router.d.ts +28 -0
- package/dist/core/http/utils.d.ts +0 -0
- package/dist/core/id-generator.d.ts +3 -0
- package/dist/core/logger.d.ts +29 -0
- package/dist/core/router.d.ts +16 -0
- package/dist/core/server.d.ts +25 -0
- package/dist/core/storage.d.ts +24 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +19 -74
- package/dist/listeners/api/__tests__/api.controller.test.d.ts +1 -0
- package/dist/listeners/api/__tests__/api.extractor.test.d.ts +1 -0
- package/dist/listeners/api/__tests__/api.listener.test.d.ts +1 -0
- package/dist/listeners/api/__tests__/api.routes.test.d.ts +1 -0
- package/dist/listeners/api/__tests__/api.sse.test.d.ts +1 -0
- package/dist/listeners/api/api.controllers.d.ts +9 -0
- package/dist/listeners/api/api.extractor.d.ts +5 -0
- package/dist/listeners/api/api.listener.d.ts +17 -0
- package/dist/listeners/api/api.routes.d.ts +5 -0
- package/dist/listeners/api/api.sse.d.ts +10 -0
- package/dist/listeners/dns/__tests__/dns.test.d.ts +1 -0
- package/dist/listeners/dns/dns.extractor.d.ts +8 -0
- package/dist/listeners/dns/dns.listener.d.ts +15 -0
- package/dist/listeners/http/__tests__/http.extractor.test.d.ts +1 -0
- package/dist/listeners/http/__tests__/http.listener.test.d.ts +1 -0
- package/dist/listeners/http/http.extractor.d.ts +11 -0
- package/dist/listeners/http/http.listener.d.ts +17 -0
- package/dist/listeners/listener.interface.d.ts +4 -0
- package/dist/listeners/smtp/__tests__/smtp.extractor.test.d.ts +1 -0
- package/dist/listeners/smtp/__tests__/smtp.listener.test.d.ts +1 -0
- package/dist/listeners/smtp/smtp.extractor.d.ts +12 -0
- package/dist/listeners/smtp/smtp.listener.d.ts +13 -0
- package/dist/listeners/ssrf/__tests__/ssrf.extractor.test.d.ts +1 -0
- package/dist/listeners/ssrf/__tests__/ssrf.listener.test.d.ts +1 -0
- package/dist/listeners/ssrf/__tests__/ssrf.listener.test.js +4 -16
- package/dist/listeners/ssrf/ssrf.extractor.d.ts +10 -0
- package/dist/listeners/ssrf/ssrf.listener.d.ts +8 -0
- package/dist/listeners/tcp/tcp.extractor.d.ts +4 -0
- package/dist/listeners/tcp/tcp.listener.d.ts +18 -0
- package/dist/listeners/webhook/__tests__/webhook.extractor.test.d.ts +1 -0
- package/dist/listeners/webhook/__tests__/webhook.listener.test.d.ts +1 -0
- package/dist/listeners/webhook/webhook.extractor.d.ts +8 -0
- package/dist/listeners/webhook/webhook.listener.d.ts +8 -0
- package/dist/listeners/websocket/__tests__/websocket.extractor.test.d.ts +1 -0
- package/dist/listeners/websocket/__tests__/websocket.listener.test.d.ts +1 -0
- package/dist/listeners/websocket/websocket.extractor.d.ts +10 -0
- package/dist/listeners/websocket/websocket.listener.d.ts +8 -0
- package/dist/storage-adapters/adapters/__tests__/memory.storage.test.d.ts +1 -0
- package/dist/storage-adapters/adapters/memory.storage.d.ts +21 -0
- package/dist/storage-adapters/adapters/redis.storage.d.ts +0 -0
- package/dist/storage-adapters/adapters/sqlite.storage.d.ts +0 -0
- package/dist/storage-adapters/storage.interface.d.ts +18 -0
- package/dist/types/event.types.d.ts +118 -0
- package/dist/utils/token.d.ts +0 -0
- package/jest.config.js +14 -14
- package/package.json +45 -45
- package/sadmin list shadows +9 -9
- package/src/api/controllers/__tests__/tasks.controller.test.ts +74 -74
- package/src/api/controllers/events.controller.ts +10 -10
- package/src/api/controllers/health.controller.ts +7 -7
- package/src/api/controllers/tasks.controller.ts +41 -41
- package/src/api/dto/__tests__/create-task.dto.test.ts +41 -41
- package/src/api/dto/__tests__/filter-tasks.dto.test.ts +35 -35
- package/src/api/dto/create-task.dto.ts +33 -33
- package/src/api/dto/filter-tasks.dto.ts +33 -33
- package/src/api/services/__tests__/events.service.test.ts +41 -41
- package/src/api/services/__tests__/tasks.service.test.ts +41 -41
- package/src/api/services/events.service.ts +17 -17
- package/src/api/services/tasks.service.ts +79 -79
- package/src/api/sse/events.stream.ts +90 -90
- package/src/bootstrap.ts +89 -0
- package/src/core/__tests__/core-router.test.ts +30 -30
- package/src/core/__tests__/core-server.test.ts +44 -44
- package/src/core/__tests__/event.normalizer.test.ts +56 -56
- package/src/core/__tests__/event.router.test.ts +89 -89
- package/src/core/__tests__/logger.test.ts +32 -32
- package/src/core/__tests__/storage-manager.test.ts +74 -74
- package/src/core/event.normalizer.ts +147 -147
- package/src/core/event.router.ts +13 -13
- package/src/core/http/__tests__/adapter-node.test.ts +52 -52
- package/src/core/http/__tests__/body-parser-multipart.test.ts +41 -41
- package/src/core/http/__tests__/body-parser-raw.test.ts +28 -28
- package/src/core/http/__tests__/body-parser-text.test.ts +28 -28
- package/src/core/http/__tests__/compile-path.test.ts +39 -39
- package/src/core/http/__tests__/middleware-pipeline.test.ts +51 -51
- package/src/core/http/__tests__/request.test.ts +34 -34
- package/src/core/http/__tests__/response.test.ts +35 -35
- package/src/core/http/__tests__/router-match.test.ts +171 -171
- package/src/core/http/adapter-node.ts +51 -51
- package/src/core/http/buildRequest.ts +18 -18
- package/src/core/http/compile-path.ts +32 -32
- package/src/core/http/errors.ts +37 -37
- package/src/core/http/http-server.ts +52 -52
- package/src/core/http/middleware.ts +160 -160
- package/src/core/http/request.ts +55 -55
- package/src/core/http/response.ts +93 -93
- package/src/core/http/router.ts +138 -138
- package/src/core/id-generator.ts +8 -8
- package/src/core/logger.ts +113 -113
- package/src/core/router.ts +44 -44
- package/src/core/server.ts +85 -85
- package/src/core/storage.ts +64 -64
- package/src/index.ts +10 -89
- package/src/listeners/api/__tests__/api.controller.test.ts +116 -116
- package/src/listeners/api/__tests__/api.extractor.test.ts +46 -46
- package/src/listeners/api/__tests__/api.listener.test.ts +82 -82
- package/src/listeners/api/__tests__/api.routes.test.ts +155 -155
- package/src/listeners/api/__tests__/api.sse.test.ts +105 -105
- package/src/listeners/api/api.controllers.ts +67 -67
- package/src/listeners/api/api.extractor.ts +43 -43
- package/src/listeners/api/api.listener.ts +50 -50
- package/src/listeners/api/api.routes.ts +76 -76
- package/src/listeners/api/api.sse.ts +38 -38
- package/src/listeners/dns/__tests__/dns.test.ts +118 -118
- package/src/listeners/dns/dns.extractor.ts +14 -14
- package/src/listeners/dns/dns.listener.ts +61 -61
- package/src/listeners/http/__tests__/http.extractor.test.ts +59 -59
- package/src/listeners/http/__tests__/http.listener.test.ts +133 -133
- package/src/listeners/http/http.extractor.ts +15 -15
- package/src/listeners/http/http.listener.ts +110 -110
- package/src/listeners/listener.interface.ts +4 -4
- package/src/listeners/smtp/__tests__/smtp.extractor.test.ts +69 -69
- package/src/listeners/smtp/__tests__/smtp.listener.test.ts +150 -150
- package/src/listeners/smtp/smtp.extractor.ts +18 -18
- package/src/listeners/smtp/smtp.listener.ts +60 -60
- package/src/listeners/ssrf/__tests__/ssrf.extractor.test.ts +41 -41
- package/src/listeners/ssrf/__tests__/ssrf.listener.test.ts +87 -87
- package/src/listeners/ssrf/ssrf.extractor.ts +14 -14
- package/src/listeners/ssrf/ssrf.listener.ts +37 -37
- package/src/listeners/tcp/tcp.extractor.ts +16 -16
- package/src/listeners/tcp/tcp.listener.ts +61 -61
- package/src/listeners/webhook/__tests__/webhook.extractor.test.ts +35 -35
- package/src/listeners/webhook/__tests__/webhook.listener.test.ts +122 -122
- package/src/listeners/webhook/webhook.extractor.ts +12 -12
- package/src/listeners/webhook/webhook.listener.ts +58 -58
- package/src/listeners/websocket/__tests__/websocket.extractor.test.ts +33 -33
- package/src/listeners/websocket/__tests__/websocket.listener.test.ts +90 -90
- package/src/listeners/websocket/websocket.extractor.ts +11 -11
- package/src/listeners/websocket/websocket.listener.ts +40 -40
- package/src/storage-adapters/adapters/__tests__/memory.storage.test.ts +75 -75
- package/src/storage-adapters/adapters/memory.storage.ts +64 -64
- package/src/storage-adapters/storage.interface.ts +26 -26
- package/src/types/event.types.ts +147 -147
- package/tsconfig.json +21 -21
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const logger_1 = require("./core/logger");
|
|
4
|
+
const storage_1 = require("./core/storage");
|
|
5
|
+
const router_1 = require("./core/router");
|
|
6
|
+
const server_1 = require("./core/server");
|
|
7
|
+
// Listeners
|
|
8
|
+
const api_listener_1 = require("./listeners/api/api.listener");
|
|
9
|
+
const http_listener_1 = require("./listeners/http/http.listener");
|
|
10
|
+
const dns_listener_1 = require("./listeners/dns/dns.listener");
|
|
11
|
+
const smtp_listener_1 = require("./listeners/smtp/smtp.listener");
|
|
12
|
+
const tcp_listener_1 = require("./listeners/tcp/tcp.listener");
|
|
13
|
+
async function main() {
|
|
14
|
+
const logger = new logger_1.Logger({ context: "Bootstrap" });
|
|
15
|
+
// Core components
|
|
16
|
+
const storage = new storage_1.StorageManager({
|
|
17
|
+
logger: logger.withContext("Storage"),
|
|
18
|
+
});
|
|
19
|
+
const router = new router_1.CoreRouter(storage, {
|
|
20
|
+
logger: logger.withContext("CoreRouter"),
|
|
21
|
+
});
|
|
22
|
+
// ---------------------------
|
|
23
|
+
// LISTENERS
|
|
24
|
+
// ---------------------------
|
|
25
|
+
// API → (router, storage, options)
|
|
26
|
+
const apiListener = new api_listener_1.ApiListener(storage, {
|
|
27
|
+
port: 3100,
|
|
28
|
+
logger: logger.withContext("ApiListener"),
|
|
29
|
+
});
|
|
30
|
+
// HTTP → (router, options)
|
|
31
|
+
const httpListener = new http_listener_1.HttpListener(router, {
|
|
32
|
+
port: 8080,
|
|
33
|
+
logger: logger.withContext("HttpListener"),
|
|
34
|
+
});
|
|
35
|
+
// DNS → (router, options)
|
|
36
|
+
const dnsListener = new dns_listener_1.DnsListener(router, {
|
|
37
|
+
server: {},
|
|
38
|
+
logger: logger.withContext("DnsListener"),
|
|
39
|
+
});
|
|
40
|
+
const smtpListener = new smtp_listener_1.SmtpListener(router, {
|
|
41
|
+
server: {},
|
|
42
|
+
logger: logger.withContext("SmtpListener"),
|
|
43
|
+
});
|
|
44
|
+
// TCP → (router, storage, options)
|
|
45
|
+
const tcpListener = new tcp_listener_1.TcpListener(router, storage, {
|
|
46
|
+
port: 9000,
|
|
47
|
+
logger: logger.withContext("TcpListener"),
|
|
48
|
+
});
|
|
49
|
+
// ---------------------------
|
|
50
|
+
// CORE SERVER
|
|
51
|
+
// ---------------------------
|
|
52
|
+
const server = new server_1.CoreServer({
|
|
53
|
+
logger: logger.withContext("CoreServer"),
|
|
54
|
+
storage,
|
|
55
|
+
listeners: [
|
|
56
|
+
apiListener,
|
|
57
|
+
httpListener,
|
|
58
|
+
dnsListener,
|
|
59
|
+
smtpListener,
|
|
60
|
+
tcpListener,
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
await server.start();
|
|
64
|
+
// Graceful shutdown
|
|
65
|
+
const shutdown = async () => {
|
|
66
|
+
logger.warn("Received shutdown signal, stopping server...");
|
|
67
|
+
await server.stop();
|
|
68
|
+
process.exit(0);
|
|
69
|
+
};
|
|
70
|
+
process.on("SIGINT", shutdown);
|
|
71
|
+
process.on("SIGTERM", shutdown);
|
|
72
|
+
}
|
|
73
|
+
main().catch((err) => {
|
|
74
|
+
console.error("Fatal error in bootstrap:", err);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
});
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RawEvent, RawDnsEvent, RawSmtpEvent, RawTcpEvent, RawSsrfEvent, NormalizedHttpEvent, NormalizedDnsEvent, NormalizedSmtpEvent, NormalizedTcpEvent, NormalizedSsrfEvent, NormalizedWebhookEvent, RawWebhookEvent, NormalizedWebSocketEvent, RawWebSocketEvent } from "../types/event.types";
|
|
2
|
+
export declare class EventNormalizer {
|
|
3
|
+
static normalizeDns(event: RawDnsEvent): NormalizedDnsEvent;
|
|
4
|
+
static normalizeHttp(event: RawEvent): NormalizedHttpEvent;
|
|
5
|
+
static normalizeSmtp(event: RawSmtpEvent): NormalizedSmtpEvent;
|
|
6
|
+
static normalizeTcp(event: RawTcpEvent): NormalizedTcpEvent;
|
|
7
|
+
static normalizeSsrf(raw: RawSsrfEvent): NormalizedSsrfEvent;
|
|
8
|
+
static normalizeWebhook(raw: RawWebhookEvent): NormalizedWebhookEvent;
|
|
9
|
+
static normalizeWebSocket(raw: RawWebSocketEvent): NormalizedWebSocketEvent;
|
|
10
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Storage } from "../storage-adapters/storage.interface";
|
|
2
|
+
import { RawEvent, NormalizedHttpEvent } from "../types/event.types";
|
|
3
|
+
export declare class EventRouter {
|
|
4
|
+
private storage;
|
|
5
|
+
constructor(storage: Storage);
|
|
6
|
+
handleHttp(event: RawEvent): Promise<NormalizedHttpEvent>;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MiddlewarePipeline } from "./middleware";
|
|
2
|
+
import { Router } from "./router";
|
|
3
|
+
export declare class NodeAdapter {
|
|
4
|
+
private router;
|
|
5
|
+
private pipeline;
|
|
6
|
+
constructor(router: Router, pipeline: MiddlewarePipeline);
|
|
7
|
+
handle(req: any, res: any): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class HttpError extends Error {
|
|
2
|
+
readonly status: number;
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly details?: any;
|
|
5
|
+
constructor(status: number, code: string, message: string, details?: any);
|
|
6
|
+
}
|
|
7
|
+
export declare class ErrorHandler {
|
|
8
|
+
static handle(err: unknown, res: any): void;
|
|
9
|
+
}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Request } from "./request";
|
|
2
|
+
import { Response } from "./response";
|
|
3
|
+
export type Middleware = (req: Request, res: Response, next: () => Promise<void>) => Promise<void> | void;
|
|
4
|
+
export declare class MiddlewarePipeline {
|
|
5
|
+
private middlewares;
|
|
6
|
+
use(mw: Middleware): this;
|
|
7
|
+
run(req: Request, res: Response): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare function bodyParserJson(req: Request, res: Response): Promise<void>;
|
|
10
|
+
export declare function bodyParserRaw(req: Request, res: Response): Promise<void>;
|
|
11
|
+
export declare function bodyParserText(req: Request, res: Response): Promise<void>;
|
|
12
|
+
export declare function bodyParserMultipart(req: Request, res: Response): Promise<void>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface RequestContext {
|
|
2
|
+
[key: string]: any;
|
|
3
|
+
}
|
|
4
|
+
export declare class Request {
|
|
5
|
+
readonly method: string;
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly headers: Record<string, string>;
|
|
8
|
+
readonly query: Record<string, string | string[]>;
|
|
9
|
+
readonly params: Record<string, string>;
|
|
10
|
+
body: any;
|
|
11
|
+
bodyRaw?: Buffer;
|
|
12
|
+
bodyText?: string;
|
|
13
|
+
files?: Array<{
|
|
14
|
+
fieldname: string;
|
|
15
|
+
filename: string;
|
|
16
|
+
contentType: string;
|
|
17
|
+
data: Buffer;
|
|
18
|
+
}>;
|
|
19
|
+
form?: Record<string, string>;
|
|
20
|
+
readonly ip: string;
|
|
21
|
+
readonly raw: any;
|
|
22
|
+
readonly context: RequestContext;
|
|
23
|
+
constructor(options: {
|
|
24
|
+
method: string;
|
|
25
|
+
path: string;
|
|
26
|
+
headers: Record<string, string>;
|
|
27
|
+
query?: Record<string, string | string[]>;
|
|
28
|
+
params?: Record<string, string>;
|
|
29
|
+
body?: any;
|
|
30
|
+
ip?: string;
|
|
31
|
+
raw?: any;
|
|
32
|
+
context?: RequestContext;
|
|
33
|
+
});
|
|
34
|
+
header(name: string): string | undefined;
|
|
35
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class Response {
|
|
2
|
+
private _status;
|
|
3
|
+
private _headers;
|
|
4
|
+
private _sent;
|
|
5
|
+
private _raw;
|
|
6
|
+
constructor(raw: any);
|
|
7
|
+
status(code: number): this;
|
|
8
|
+
header(name: string, value: string): this;
|
|
9
|
+
json(data: any): void;
|
|
10
|
+
text(data: string): void;
|
|
11
|
+
send(data: any): void;
|
|
12
|
+
stream(readable: NodeJS.ReadableStream): void;
|
|
13
|
+
sse(): void;
|
|
14
|
+
write(data: string): void;
|
|
15
|
+
end(): void;
|
|
16
|
+
private ensureNotSent;
|
|
17
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Middleware } from "./middleware";
|
|
2
|
+
export declare class Router {
|
|
3
|
+
private routes;
|
|
4
|
+
/**
|
|
5
|
+
* Enregistre une route avec middlewares optionnels :
|
|
6
|
+
* router.get("/x", mw1, mw2, handler)
|
|
7
|
+
*/
|
|
8
|
+
register(method: string, path: string, ...middlewaresAndHandler: any[]): void;
|
|
9
|
+
/**
|
|
10
|
+
* Trouve la route et extrait les params
|
|
11
|
+
*/
|
|
12
|
+
match(method: string, urlPath: string): {
|
|
13
|
+
handler: Function;
|
|
14
|
+
middlewares: Middleware[];
|
|
15
|
+
params: Record<string, string>;
|
|
16
|
+
} | null;
|
|
17
|
+
/**
|
|
18
|
+
* Ton moteur de matching existant — inchangé
|
|
19
|
+
*/
|
|
20
|
+
private matchSegments;
|
|
21
|
+
get(path: string, ...middlewaresAndHandler: any[]): void;
|
|
22
|
+
post(path: string, ...middlewaresAndHandler: any[]): void;
|
|
23
|
+
put(path: string, ...middlewaresAndHandler: any[]): void;
|
|
24
|
+
delete(path: string, ...middlewaresAndHandler: any[]): void;
|
|
25
|
+
patch(path: string, ...middlewaresAndHandler: any[]): void;
|
|
26
|
+
options(path: string, ...middlewaresAndHandler: any[]): void;
|
|
27
|
+
head(path: string, ...middlewaresAndHandler: any[]): void;
|
|
28
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type LogLevel = "debug" | "info" | "warn" | "error" | "fatal";
|
|
2
|
+
export interface LoggerOptions {
|
|
3
|
+
level?: LogLevel;
|
|
4
|
+
context?: string;
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
hooks?: Array<(entry: LogEntry) => void>;
|
|
7
|
+
}
|
|
8
|
+
export interface LogEntry {
|
|
9
|
+
timestamp: string;
|
|
10
|
+
level: LogLevel;
|
|
11
|
+
message: string;
|
|
12
|
+
context?: string;
|
|
13
|
+
data?: any;
|
|
14
|
+
}
|
|
15
|
+
export declare class Logger {
|
|
16
|
+
private level;
|
|
17
|
+
private context?;
|
|
18
|
+
private enabled;
|
|
19
|
+
private hooks;
|
|
20
|
+
constructor(options?: LoggerOptions);
|
|
21
|
+
private shouldLog;
|
|
22
|
+
private emit;
|
|
23
|
+
debug(msg: string, data?: any): void;
|
|
24
|
+
info(msg: string, data?: any): void;
|
|
25
|
+
warn(msg: string, data?: any): void;
|
|
26
|
+
error(msg: string, data?: any): void;
|
|
27
|
+
fatal(msg: string, data?: any): void;
|
|
28
|
+
withContext(context: string): Logger;
|
|
29
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Storage } from "../storage-adapters/storage.interface";
|
|
2
|
+
import { Logger } from "./logger";
|
|
3
|
+
import { AnyNormalizedEvent } from "../types/event.types";
|
|
4
|
+
export type RouterHook = (event: AnyNormalizedEvent) => void | Promise<void>;
|
|
5
|
+
export interface RouterOptions {
|
|
6
|
+
logger?: Logger;
|
|
7
|
+
hooks?: RouterHook[];
|
|
8
|
+
}
|
|
9
|
+
export declare class CoreRouter {
|
|
10
|
+
private storage;
|
|
11
|
+
private logger;
|
|
12
|
+
private hooks;
|
|
13
|
+
constructor(storage: Storage, options?: RouterOptions);
|
|
14
|
+
dispatch(event: AnyNormalizedEvent): Promise<void>;
|
|
15
|
+
addHook(hook: RouterHook): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
export declare class CoreServer {
|
|
11
|
+
private logger;
|
|
12
|
+
private storage;
|
|
13
|
+
private router;
|
|
14
|
+
private listeners;
|
|
15
|
+
constructor(options?: CoreServerOptions);
|
|
16
|
+
getRouter(): CoreRouter;
|
|
17
|
+
getStorage(): StorageManager;
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Méthode appelée par CoreRouter après chaque event normalisé.
|
|
22
|
+
* Permet de diffuser l’event aux listeners SSE (ApiListener).
|
|
23
|
+
*/
|
|
24
|
+
broadcast(event: any): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Storage } from "../storage-adapters/storage.interface";
|
|
2
|
+
import { AnyNormalizedEvent } from "../types/event.types";
|
|
3
|
+
import { Logger } from "./logger";
|
|
4
|
+
export declare class StorageManager implements Storage {
|
|
5
|
+
private events;
|
|
6
|
+
private logger;
|
|
7
|
+
constructor(options?: {
|
|
8
|
+
logger?: Logger;
|
|
9
|
+
});
|
|
10
|
+
save(event: AnyNormalizedEvent): Promise<void>;
|
|
11
|
+
getEvent(id: string): Promise<AnyNormalizedEvent | null>;
|
|
12
|
+
listEvents(params: {
|
|
13
|
+
type?: string;
|
|
14
|
+
page?: number;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}): Promise<AnyNormalizedEvent[]>;
|
|
17
|
+
getAll(): Promise<AnyNormalizedEvent[]>;
|
|
18
|
+
deleteEvent(id: string): Promise<boolean>;
|
|
19
|
+
clearEvents(): Promise<void>;
|
|
20
|
+
getStats(): Promise<{
|
|
21
|
+
total: number;
|
|
22
|
+
byType: Record<string, number>;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { ApiListener } from "./listeners/api/api.listener";
|
|
2
|
+
export { HttpListener } from "./listeners/http/http.listener";
|
|
3
|
+
export { DnsListener } from "./listeners/dns/dns.listener";
|
|
4
|
+
export { SmtpListener } from "./listeners/smtp/smtp.listener";
|
|
5
|
+
export { TcpListener } from "./listeners/tcp/tcp.listener";
|
|
6
|
+
export { CoreServer } from "./core/server";
|
|
7
|
+
export { CoreRouter } from "./core/router";
|
|
8
|
+
export { StorageManager } from "./core/storage";
|
|
9
|
+
export { Logger } from "./core/logger";
|
package/dist/index.js
CHANGED
|
@@ -1,76 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// ---------------------------
|
|
23
|
-
// LISTENERS
|
|
24
|
-
// ---------------------------
|
|
25
|
-
// API → (router, storage, options)
|
|
26
|
-
const apiListener = new api_listener_1.ApiListener(storage, {
|
|
27
|
-
port: 3100,
|
|
28
|
-
logger: logger.withContext("ApiListener"),
|
|
29
|
-
});
|
|
30
|
-
// HTTP → (router, options)
|
|
31
|
-
const httpListener = new http_listener_1.HttpListener(router, {
|
|
32
|
-
port: 8080,
|
|
33
|
-
logger: logger.withContext("HttpListener"),
|
|
34
|
-
});
|
|
35
|
-
// DNS → (router, options)
|
|
36
|
-
const dnsListener = new dns_listener_1.DnsListener(router, {
|
|
37
|
-
server: {},
|
|
38
|
-
logger: logger.withContext("DnsListener"),
|
|
39
|
-
});
|
|
40
|
-
const smtpListener = new smtp_listener_1.SmtpListener(router, {
|
|
41
|
-
server: {},
|
|
42
|
-
logger: logger.withContext("SmtpListener"),
|
|
43
|
-
});
|
|
44
|
-
// TCP → (router, storage, options)
|
|
45
|
-
const tcpListener = new tcp_listener_1.TcpListener(router, storage, {
|
|
46
|
-
port: 9000,
|
|
47
|
-
logger: logger.withContext("TcpListener"),
|
|
48
|
-
});
|
|
49
|
-
// ---------------------------
|
|
50
|
-
// CORE SERVER
|
|
51
|
-
// ---------------------------
|
|
52
|
-
const server = new server_1.CoreServer({
|
|
53
|
-
logger: logger.withContext("CoreServer"),
|
|
54
|
-
storage,
|
|
55
|
-
listeners: [
|
|
56
|
-
apiListener,
|
|
57
|
-
httpListener,
|
|
58
|
-
dnsListener,
|
|
59
|
-
smtpListener,
|
|
60
|
-
tcpListener,
|
|
61
|
-
],
|
|
62
|
-
});
|
|
63
|
-
await server.start();
|
|
64
|
-
// Graceful shutdown
|
|
65
|
-
const shutdown = async () => {
|
|
66
|
-
logger.warn("Received shutdown signal, stopping server...");
|
|
67
|
-
await server.stop();
|
|
68
|
-
process.exit(0);
|
|
69
|
-
};
|
|
70
|
-
process.on("SIGINT", shutdown);
|
|
71
|
-
process.on("SIGTERM", shutdown);
|
|
72
|
-
}
|
|
73
|
-
main().catch((err) => {
|
|
74
|
-
console.error("Fatal error in bootstrap:", err);
|
|
75
|
-
process.exit(1);
|
|
76
|
-
});
|
|
3
|
+
exports.Logger = exports.StorageManager = exports.CoreRouter = exports.CoreServer = exports.TcpListener = exports.SmtpListener = exports.DnsListener = exports.HttpListener = exports.ApiListener = void 0;
|
|
4
|
+
var api_listener_1 = require("./listeners/api/api.listener");
|
|
5
|
+
Object.defineProperty(exports, "ApiListener", { enumerable: true, get: function () { return api_listener_1.ApiListener; } });
|
|
6
|
+
var http_listener_1 = require("./listeners/http/http.listener");
|
|
7
|
+
Object.defineProperty(exports, "HttpListener", { enumerable: true, get: function () { return http_listener_1.HttpListener; } });
|
|
8
|
+
var dns_listener_1 = require("./listeners/dns/dns.listener");
|
|
9
|
+
Object.defineProperty(exports, "DnsListener", { enumerable: true, get: function () { return dns_listener_1.DnsListener; } });
|
|
10
|
+
var smtp_listener_1 = require("./listeners/smtp/smtp.listener");
|
|
11
|
+
Object.defineProperty(exports, "SmtpListener", { enumerable: true, get: function () { return smtp_listener_1.SmtpListener; } });
|
|
12
|
+
var tcp_listener_1 = require("./listeners/tcp/tcp.listener");
|
|
13
|
+
Object.defineProperty(exports, "TcpListener", { enumerable: true, get: function () { return tcp_listener_1.TcpListener; } });
|
|
14
|
+
var server_1 = require("./core/server");
|
|
15
|
+
Object.defineProperty(exports, "CoreServer", { enumerable: true, get: function () { return server_1.CoreServer; } });
|
|
16
|
+
var router_1 = require("./core/router");
|
|
17
|
+
Object.defineProperty(exports, "CoreRouter", { enumerable: true, get: function () { return router_1.CoreRouter; } });
|
|
18
|
+
var storage_1 = require("./core/storage");
|
|
19
|
+
Object.defineProperty(exports, "StorageManager", { enumerable: true, get: function () { return storage_1.StorageManager; } });
|
|
20
|
+
var logger_1 = require("./core/logger");
|
|
21
|
+
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ServerResponse } from "http";
|
|
2
|
+
import { StorageManager } from "../../core/storage";
|
|
3
|
+
export declare class ApiController {
|
|
4
|
+
static listEvents(url: URL, res: ServerResponse, storage: StorageManager): Promise<void>;
|
|
5
|
+
static getEvent(id: string, res: ServerResponse, storage: StorageManager): Promise<void>;
|
|
6
|
+
static deleteAll(res: ServerResponse, storage: StorageManager): Promise<void>;
|
|
7
|
+
static deleteOne(id: string, res: ServerResponse, storage: StorageManager): Promise<void>;
|
|
8
|
+
static stats(res: ServerResponse, storage: StorageManager): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Logger } from "../../core/logger";
|
|
2
|
+
import { StorageManager } from "../../core/storage";
|
|
3
|
+
export interface ApiListenerOptions {
|
|
4
|
+
port: number;
|
|
5
|
+
logger?: Logger;
|
|
6
|
+
}
|
|
7
|
+
export declare class ApiListener {
|
|
8
|
+
private storage;
|
|
9
|
+
private options;
|
|
10
|
+
private logger;
|
|
11
|
+
private server;
|
|
12
|
+
private sse;
|
|
13
|
+
constructor(storage: StorageManager, options: ApiListenerOptions);
|
|
14
|
+
start(): Promise<void>;
|
|
15
|
+
stop(): Promise<void>;
|
|
16
|
+
broadcastEvent(event: any): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { IncomingMessage, ServerResponse } from "http";
|
|
2
|
+
import { Logger } from "../../core/logger";
|
|
3
|
+
import { StorageManager } from "../../core/storage";
|
|
4
|
+
import { ApiSse } from "./api.sse";
|
|
5
|
+
export declare function handleApiRequest(req: IncomingMessage, res: ServerResponse, storage: StorageManager, sse: ApiSse, logger: Logger): Promise<void>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ServerResponse } from "http";
|
|
2
|
+
import { Logger } from "../../core/logger";
|
|
3
|
+
export declare class ApiSse {
|
|
4
|
+
private logger;
|
|
5
|
+
private clients;
|
|
6
|
+
constructor(logger: Logger);
|
|
7
|
+
handle(res: ServerResponse): void;
|
|
8
|
+
broadcast(event: any): void;
|
|
9
|
+
closeAll(): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Logger } from "../../core/logger";
|
|
2
|
+
import { CoreRouter } from "../../core/router";
|
|
3
|
+
export interface DnsListenerOptions {
|
|
4
|
+
server: any;
|
|
5
|
+
logger?: Logger;
|
|
6
|
+
}
|
|
7
|
+
export declare class DnsListener {
|
|
8
|
+
private router;
|
|
9
|
+
private options;
|
|
10
|
+
private logger;
|
|
11
|
+
constructor(router: CoreRouter, options: DnsListenerOptions);
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
private handleQuery;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|