@push.rocks/smartproxy 21.0.0 → 21.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.
- package/changelog.md +18 -0
- package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
- package/dist_ts/core/utils/proxy-protocol.js +13 -97
- package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
- package/dist_ts/core/utils/websocket-utils.js +10 -66
- package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
- package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
- package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
- package/dist_ts/detection/detectors/http-detector.js +89 -0
- package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
- package/dist_ts/detection/detectors/quick-detector.js +131 -0
- package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
- package/dist_ts/detection/detectors/routing-extractor.js +122 -0
- package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
- package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
- package/dist_ts/detection/detectors/tls-detector.d.ts +55 -0
- package/dist_ts/detection/detectors/tls-detector.js +206 -0
- package/dist_ts/detection/index.d.ts +17 -0
- package/dist_ts/detection/index.js +22 -0
- package/dist_ts/detection/models/detection-types.d.ts +87 -0
- package/dist_ts/detection/models/detection-types.js +5 -0
- package/dist_ts/detection/models/interfaces.d.ts +97 -0
- package/dist_ts/detection/models/interfaces.js +5 -0
- package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
- package/dist_ts/detection/protocol-detector-v2.js +116 -0
- package/dist_ts/detection/protocol-detector.d.ts +74 -0
- package/dist_ts/detection/protocol-detector.js +173 -0
- package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
- package/dist_ts/detection/utils/buffer-utils.js +127 -0
- package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
- package/dist_ts/detection/utils/fragment-manager.js +53 -0
- package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
- package/dist_ts/detection/utils/parser-utils.js +63 -0
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
- package/dist_ts/protocols/common/fragment-handler.js +117 -0
- package/dist_ts/protocols/common/index.d.ts +7 -0
- package/dist_ts/protocols/common/index.js +8 -0
- package/dist_ts/protocols/common/types.d.ts +68 -0
- package/dist_ts/protocols/common/types.js +7 -0
- package/dist_ts/protocols/http/constants.d.ts +119 -0
- package/dist_ts/protocols/http/constants.js +200 -0
- package/dist_ts/protocols/http/index.d.ts +7 -0
- package/dist_ts/protocols/http/index.js +8 -0
- package/dist_ts/protocols/http/parser.d.ts +58 -0
- package/dist_ts/protocols/http/parser.js +184 -0
- package/dist_ts/protocols/http/types.d.ts +62 -0
- package/dist_ts/protocols/http/types.js +5 -0
- package/dist_ts/protocols/index.d.ts +11 -0
- package/dist_ts/protocols/index.js +12 -0
- package/dist_ts/protocols/proxy/index.d.ts +6 -0
- package/dist_ts/protocols/proxy/index.js +7 -0
- package/dist_ts/protocols/proxy/parser.d.ts +44 -0
- package/dist_ts/protocols/proxy/parser.js +153 -0
- package/dist_ts/protocols/proxy/types.d.ts +47 -0
- package/dist_ts/protocols/proxy/types.js +6 -0
- package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
- package/dist_ts/protocols/tls/alerts/index.js +5 -0
- package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
- package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
- package/dist_ts/protocols/tls/constants.d.ts +122 -0
- package/dist_ts/protocols/tls/constants.js +135 -0
- package/dist_ts/protocols/tls/index.d.ts +12 -0
- package/dist_ts/protocols/tls/index.js +27 -0
- package/dist_ts/protocols/tls/parser.d.ts +53 -0
- package/dist_ts/protocols/tls/parser.js +294 -0
- package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
- package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
- package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
- package/dist_ts/protocols/tls/sni/index.js +6 -0
- package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
- package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
- package/dist_ts/protocols/tls/types.d.ts +65 -0
- package/dist_ts/protocols/tls/types.js +5 -0
- package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
- package/dist_ts/protocols/tls/utils/index.js +5 -0
- package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
- package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
- package/dist_ts/protocols/websocket/constants.d.ts +55 -0
- package/dist_ts/protocols/websocket/constants.js +58 -0
- package/dist_ts/protocols/websocket/index.d.ts +7 -0
- package/dist_ts/protocols/websocket/index.js +8 -0
- package/dist_ts/protocols/websocket/types.d.ts +47 -0
- package/dist_ts/protocols/websocket/types.js +5 -0
- package/dist_ts/protocols/websocket/utils.d.ts +25 -0
- package/dist_ts/protocols/websocket/utils.js +103 -0
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
- package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
- package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +2 -0
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +61 -52
- package/dist_ts/tls/index.d.ts +5 -7
- package/dist_ts/tls/index.js +8 -11
- package/dist_ts/tls/sni/client-hello-parser.js +3 -2
- package/dist_ts/tls/sni/sni-handler.js +4 -4
- package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
- package/dist_ts/tls/utils/tls-utils.js +4 -116
- package/package.json +1 -1
- package/readme.plan.md +0 -0
- package/ts/core/utils/proxy-protocol.ts +14 -131
- package/ts/core/utils/websocket-utils.ts +12 -60
- package/ts/detection/detectors/http-detector.ts +114 -0
- package/ts/detection/detectors/quick-detector.ts +148 -0
- package/ts/detection/detectors/routing-extractor.ts +147 -0
- package/ts/detection/detectors/tls-detector.ts +252 -0
- package/ts/detection/index.ts +25 -0
- package/ts/detection/models/detection-types.ts +102 -0
- package/ts/detection/models/interfaces.ts +115 -0
- package/ts/detection/protocol-detector.ts +230 -0
- package/ts/detection/utils/buffer-utils.ts +141 -0
- package/ts/detection/utils/fragment-manager.ts +64 -0
- package/ts/detection/utils/parser-utils.ts +77 -0
- package/ts/index.ts +3 -1
- package/ts/protocols/common/fragment-handler.ts +163 -0
- package/ts/protocols/common/index.ts +8 -0
- package/ts/protocols/common/types.ts +76 -0
- package/ts/protocols/http/constants.ts +219 -0
- package/ts/protocols/http/index.ts +8 -0
- package/ts/protocols/http/parser.ts +219 -0
- package/ts/protocols/http/types.ts +70 -0
- package/ts/protocols/index.ts +12 -0
- package/ts/protocols/proxy/index.ts +7 -0
- package/ts/protocols/proxy/parser.ts +183 -0
- package/ts/protocols/proxy/types.ts +53 -0
- package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
- package/ts/protocols/tls/index.ts +37 -0
- package/ts/protocols/tls/sni/index.ts +6 -0
- package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
- package/ts/protocols/websocket/constants.ts +60 -0
- package/ts/protocols/websocket/index.ts +8 -0
- package/ts/protocols/websocket/types.ts +53 -0
- package/ts/protocols/websocket/utils.ts +98 -0
- package/ts/proxies/http-proxy/models/http-types.ts +29 -46
- package/ts/proxies/smart-proxy/models/interfaces.ts +7 -0
- package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
- package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
- package/ts/proxies/smart-proxy/utils/route-helpers.ts +72 -56
- package/ts/tls/index.ts +8 -12
- package/ts/tls/sni/sni-handler.ts +3 -3
- /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
- /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
- /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
- /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol Detector
|
|
3
|
+
*
|
|
4
|
+
* Simplified protocol detection using the new architecture
|
|
5
|
+
*/
|
|
6
|
+
import type { IDetectionResult, IDetectionOptions } from './models/detection-types.js';
|
|
7
|
+
import type { IConnectionContext } from '../protocols/common/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Main protocol detector class
|
|
10
|
+
*/
|
|
11
|
+
export declare class ProtocolDetector {
|
|
12
|
+
private static instance;
|
|
13
|
+
private fragmentManager;
|
|
14
|
+
private tlsDetector;
|
|
15
|
+
private httpDetector;
|
|
16
|
+
constructor();
|
|
17
|
+
private static getInstance;
|
|
18
|
+
/**
|
|
19
|
+
* Detect protocol from buffer data
|
|
20
|
+
*/
|
|
21
|
+
static detect(buffer: Buffer, options?: IDetectionOptions): Promise<IDetectionResult>;
|
|
22
|
+
private detectInstance;
|
|
23
|
+
/**
|
|
24
|
+
* Detect protocol with connection tracking for fragmented data
|
|
25
|
+
* @deprecated Use detectWithContext instead
|
|
26
|
+
*/
|
|
27
|
+
static detectWithConnectionTracking(buffer: Buffer, connectionId: string, options?: IDetectionOptions): Promise<IDetectionResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Detect protocol with connection context for fragmented data
|
|
30
|
+
*/
|
|
31
|
+
static detectWithContext(buffer: Buffer, context: IConnectionContext, options?: IDetectionOptions): Promise<IDetectionResult>;
|
|
32
|
+
private detectWithContextInstance;
|
|
33
|
+
/**
|
|
34
|
+
* Clean up resources
|
|
35
|
+
*/
|
|
36
|
+
static cleanup(): void;
|
|
37
|
+
private cleanupInstance;
|
|
38
|
+
/**
|
|
39
|
+
* Destroy detector instance
|
|
40
|
+
*/
|
|
41
|
+
static destroy(): void;
|
|
42
|
+
private destroyInstance;
|
|
43
|
+
/**
|
|
44
|
+
* Clean up old connection tracking entries
|
|
45
|
+
*
|
|
46
|
+
* @param maxAge Maximum age in milliseconds (default: 30 seconds)
|
|
47
|
+
*/
|
|
48
|
+
static cleanupConnections(maxAge?: number): void;
|
|
49
|
+
/**
|
|
50
|
+
* Extract domain from connection info
|
|
51
|
+
*/
|
|
52
|
+
static extractDomain(connectionInfo: any): string | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Create a connection ID from connection parameters
|
|
55
|
+
* @deprecated Use createConnectionContext instead
|
|
56
|
+
*/
|
|
57
|
+
static createConnectionId(params: {
|
|
58
|
+
sourceIp?: string;
|
|
59
|
+
sourcePort?: number;
|
|
60
|
+
destIp?: string;
|
|
61
|
+
destPort?: number;
|
|
62
|
+
socketId?: string;
|
|
63
|
+
}): string;
|
|
64
|
+
/**
|
|
65
|
+
* Create a connection context from parameters
|
|
66
|
+
*/
|
|
67
|
+
static createConnectionContext(params: {
|
|
68
|
+
sourceIp?: string;
|
|
69
|
+
sourcePort?: number;
|
|
70
|
+
destIp?: string;
|
|
71
|
+
destPort?: number;
|
|
72
|
+
socketId?: string;
|
|
73
|
+
}): IConnectionContext;
|
|
74
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol Detector
|
|
3
|
+
*
|
|
4
|
+
* Simplified protocol detection using the new architecture
|
|
5
|
+
*/
|
|
6
|
+
import { TlsDetector } from './detectors/tls-detector.js';
|
|
7
|
+
import { HttpDetector } from './detectors/http-detector.js';
|
|
8
|
+
import { DetectionFragmentManager } from './utils/fragment-manager.js';
|
|
9
|
+
/**
|
|
10
|
+
* Main protocol detector class
|
|
11
|
+
*/
|
|
12
|
+
export class ProtocolDetector {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.fragmentManager = new DetectionFragmentManager();
|
|
15
|
+
this.tlsDetector = new TlsDetector();
|
|
16
|
+
this.httpDetector = new HttpDetector(this.fragmentManager);
|
|
17
|
+
}
|
|
18
|
+
static getInstance() {
|
|
19
|
+
if (!this.instance) {
|
|
20
|
+
this.instance = new ProtocolDetector();
|
|
21
|
+
}
|
|
22
|
+
return this.instance;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Detect protocol from buffer data
|
|
26
|
+
*/
|
|
27
|
+
static async detect(buffer, options) {
|
|
28
|
+
return this.getInstance().detectInstance(buffer, options);
|
|
29
|
+
}
|
|
30
|
+
async detectInstance(buffer, options) {
|
|
31
|
+
// Quick sanity check
|
|
32
|
+
if (!buffer || buffer.length === 0) {
|
|
33
|
+
return {
|
|
34
|
+
protocol: 'unknown',
|
|
35
|
+
connectionInfo: { protocol: 'unknown' },
|
|
36
|
+
isComplete: true
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Try TLS detection first (more specific)
|
|
40
|
+
if (this.tlsDetector.canHandle(buffer)) {
|
|
41
|
+
const tlsResult = this.tlsDetector.detect(buffer, options);
|
|
42
|
+
if (tlsResult) {
|
|
43
|
+
return tlsResult;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Try HTTP detection
|
|
47
|
+
if (this.httpDetector.canHandle(buffer)) {
|
|
48
|
+
const httpResult = this.httpDetector.detect(buffer, options);
|
|
49
|
+
if (httpResult) {
|
|
50
|
+
return httpResult;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Neither TLS nor HTTP
|
|
54
|
+
return {
|
|
55
|
+
protocol: 'unknown',
|
|
56
|
+
connectionInfo: { protocol: 'unknown' },
|
|
57
|
+
isComplete: true
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Detect protocol with connection tracking for fragmented data
|
|
62
|
+
* @deprecated Use detectWithContext instead
|
|
63
|
+
*/
|
|
64
|
+
static async detectWithConnectionTracking(buffer, connectionId, options) {
|
|
65
|
+
// Convert connection ID to context
|
|
66
|
+
const context = {
|
|
67
|
+
id: connectionId,
|
|
68
|
+
sourceIp: 'unknown',
|
|
69
|
+
sourcePort: 0,
|
|
70
|
+
destIp: 'unknown',
|
|
71
|
+
destPort: 0,
|
|
72
|
+
timestamp: Date.now()
|
|
73
|
+
};
|
|
74
|
+
return this.getInstance().detectWithContextInstance(buffer, context, options);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Detect protocol with connection context for fragmented data
|
|
78
|
+
*/
|
|
79
|
+
static async detectWithContext(buffer, context, options) {
|
|
80
|
+
return this.getInstance().detectWithContextInstance(buffer, context, options);
|
|
81
|
+
}
|
|
82
|
+
async detectWithContextInstance(buffer, context, options) {
|
|
83
|
+
// Quick sanity check
|
|
84
|
+
if (!buffer || buffer.length === 0) {
|
|
85
|
+
return {
|
|
86
|
+
protocol: 'unknown',
|
|
87
|
+
connectionInfo: { protocol: 'unknown' },
|
|
88
|
+
isComplete: true
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// First peek to determine protocol type
|
|
92
|
+
if (this.tlsDetector.canHandle(buffer)) {
|
|
93
|
+
const result = this.tlsDetector.detectWithContext(buffer, context, options);
|
|
94
|
+
if (result) {
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (this.httpDetector.canHandle(buffer)) {
|
|
99
|
+
const result = this.httpDetector.detectWithContext(buffer, context, options);
|
|
100
|
+
if (result) {
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Can't determine protocol
|
|
105
|
+
return {
|
|
106
|
+
protocol: 'unknown',
|
|
107
|
+
connectionInfo: { protocol: 'unknown' },
|
|
108
|
+
isComplete: false,
|
|
109
|
+
bytesNeeded: Math.max(this.tlsDetector.getMinimumBytes(), this.httpDetector.getMinimumBytes())
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Clean up resources
|
|
114
|
+
*/
|
|
115
|
+
static cleanup() {
|
|
116
|
+
this.getInstance().cleanupInstance();
|
|
117
|
+
}
|
|
118
|
+
cleanupInstance() {
|
|
119
|
+
this.fragmentManager.cleanup();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Destroy detector instance
|
|
123
|
+
*/
|
|
124
|
+
static destroy() {
|
|
125
|
+
this.getInstance().destroyInstance();
|
|
126
|
+
this.instance = null;
|
|
127
|
+
}
|
|
128
|
+
destroyInstance() {
|
|
129
|
+
this.fragmentManager.destroy();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Clean up old connection tracking entries
|
|
133
|
+
*
|
|
134
|
+
* @param maxAge Maximum age in milliseconds (default: 30 seconds)
|
|
135
|
+
*/
|
|
136
|
+
static cleanupConnections(maxAge = 30000) {
|
|
137
|
+
// Cleanup is now handled internally by the fragment manager
|
|
138
|
+
this.getInstance().fragmentManager.cleanup();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Extract domain from connection info
|
|
142
|
+
*/
|
|
143
|
+
static extractDomain(connectionInfo) {
|
|
144
|
+
return connectionInfo.domain || connectionInfo.sni || connectionInfo.host;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create a connection ID from connection parameters
|
|
148
|
+
* @deprecated Use createConnectionContext instead
|
|
149
|
+
*/
|
|
150
|
+
static createConnectionId(params) {
|
|
151
|
+
// If socketId is provided, use it
|
|
152
|
+
if (params.socketId) {
|
|
153
|
+
return params.socketId;
|
|
154
|
+
}
|
|
155
|
+
// Otherwise create from connection tuple
|
|
156
|
+
const { sourceIp = 'unknown', sourcePort = 0, destIp = 'unknown', destPort = 0 } = params;
|
|
157
|
+
return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create a connection context from parameters
|
|
161
|
+
*/
|
|
162
|
+
static createConnectionContext(params) {
|
|
163
|
+
return {
|
|
164
|
+
id: params.socketId,
|
|
165
|
+
sourceIp: params.sourceIp || 'unknown',
|
|
166
|
+
sourcePort: params.sourcePort || 0,
|
|
167
|
+
destIp: params.destIp || 'unknown',
|
|
168
|
+
destPort: params.destPort || 0,
|
|
169
|
+
timestamp: Date.now()
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wtZGV0ZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXRlY3Rpb24vcHJvdG9jb2wtZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCO1FBQ0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLE9BQTJCO1FBQzdELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBYyxFQUFFLE9BQTJCO1FBQ3RFLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxF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
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffer manipulation utilities for protocol detection
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* BufferAccumulator class for handling fragmented data
|
|
6
|
+
*/
|
|
7
|
+
export declare class BufferAccumulator {
|
|
8
|
+
private chunks;
|
|
9
|
+
private totalLength;
|
|
10
|
+
/**
|
|
11
|
+
* Append data to the accumulator
|
|
12
|
+
*/
|
|
13
|
+
append(data: Buffer): void;
|
|
14
|
+
/**
|
|
15
|
+
* Get the accumulated buffer
|
|
16
|
+
*/
|
|
17
|
+
getBuffer(): Buffer;
|
|
18
|
+
/**
|
|
19
|
+
* Get current buffer length
|
|
20
|
+
*/
|
|
21
|
+
length(): number;
|
|
22
|
+
/**
|
|
23
|
+
* Clear all accumulated data
|
|
24
|
+
*/
|
|
25
|
+
clear(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Check if accumulator has minimum bytes
|
|
28
|
+
*/
|
|
29
|
+
hasMinimumBytes(minBytes: number): boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read a big-endian 16-bit integer from buffer
|
|
33
|
+
*/
|
|
34
|
+
export declare function readUInt16BE(buffer: Buffer, offset: number): number;
|
|
35
|
+
/**
|
|
36
|
+
* Read a big-endian 24-bit integer from buffer
|
|
37
|
+
*/
|
|
38
|
+
export declare function readUInt24BE(buffer: Buffer, offset: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* Find a byte sequence in a buffer
|
|
41
|
+
*/
|
|
42
|
+
export declare function findSequence(buffer: Buffer, sequence: Buffer, startOffset?: number): number;
|
|
43
|
+
/**
|
|
44
|
+
* Extract a line from buffer (up to CRLF or LF)
|
|
45
|
+
*/
|
|
46
|
+
export declare function extractLine(buffer: Buffer, startOffset?: number): {
|
|
47
|
+
line: string;
|
|
48
|
+
nextOffset: number;
|
|
49
|
+
} | null;
|
|
50
|
+
/**
|
|
51
|
+
* Check if buffer starts with a string (case-insensitive)
|
|
52
|
+
*/
|
|
53
|
+
export declare function startsWithString(buffer: Buffer, str: string, offset?: number): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Safe buffer slice that doesn't throw on out-of-bounds
|
|
56
|
+
*/
|
|
57
|
+
export declare function safeSlice(buffer: Buffer, start: number, end?: number): Buffer;
|
|
58
|
+
/**
|
|
59
|
+
* Check if buffer contains printable ASCII
|
|
60
|
+
*/
|
|
61
|
+
export declare function isPrintableAscii(buffer: Buffer, length?: number): boolean;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffer manipulation utilities for protocol detection
|
|
3
|
+
*/
|
|
4
|
+
// Import from protocols
|
|
5
|
+
import { HttpParser } from '../../protocols/http/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* BufferAccumulator class for handling fragmented data
|
|
8
|
+
*/
|
|
9
|
+
export class BufferAccumulator {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.chunks = [];
|
|
12
|
+
this.totalLength = 0;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Append data to the accumulator
|
|
16
|
+
*/
|
|
17
|
+
append(data) {
|
|
18
|
+
this.chunks.push(data);
|
|
19
|
+
this.totalLength += data.length;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get the accumulated buffer
|
|
23
|
+
*/
|
|
24
|
+
getBuffer() {
|
|
25
|
+
if (this.chunks.length === 0) {
|
|
26
|
+
return Buffer.alloc(0);
|
|
27
|
+
}
|
|
28
|
+
if (this.chunks.length === 1) {
|
|
29
|
+
return this.chunks[0];
|
|
30
|
+
}
|
|
31
|
+
return Buffer.concat(this.chunks, this.totalLength);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get current buffer length
|
|
35
|
+
*/
|
|
36
|
+
length() {
|
|
37
|
+
return this.totalLength;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Clear all accumulated data
|
|
41
|
+
*/
|
|
42
|
+
clear() {
|
|
43
|
+
this.chunks = [];
|
|
44
|
+
this.totalLength = 0;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if accumulator has minimum bytes
|
|
48
|
+
*/
|
|
49
|
+
hasMinimumBytes(minBytes) {
|
|
50
|
+
return this.totalLength >= minBytes;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Read a big-endian 16-bit integer from buffer
|
|
55
|
+
*/
|
|
56
|
+
export function readUInt16BE(buffer, offset) {
|
|
57
|
+
if (offset + 2 > buffer.length) {
|
|
58
|
+
throw new Error('Buffer too short for UInt16BE read');
|
|
59
|
+
}
|
|
60
|
+
return (buffer[offset] << 8) | buffer[offset + 1];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Read a big-endian 24-bit integer from buffer
|
|
64
|
+
*/
|
|
65
|
+
export function readUInt24BE(buffer, offset) {
|
|
66
|
+
if (offset + 3 > buffer.length) {
|
|
67
|
+
throw new Error('Buffer too short for UInt24BE read');
|
|
68
|
+
}
|
|
69
|
+
return (buffer[offset] << 16) | (buffer[offset + 1] << 8) | buffer[offset + 2];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Find a byte sequence in a buffer
|
|
73
|
+
*/
|
|
74
|
+
export function findSequence(buffer, sequence, startOffset = 0) {
|
|
75
|
+
if (sequence.length === 0) {
|
|
76
|
+
return startOffset;
|
|
77
|
+
}
|
|
78
|
+
const searchLength = buffer.length - sequence.length + 1;
|
|
79
|
+
for (let i = startOffset; i < searchLength; i++) {
|
|
80
|
+
let found = true;
|
|
81
|
+
for (let j = 0; j < sequence.length; j++) {
|
|
82
|
+
if (buffer[i + j] !== sequence[j]) {
|
|
83
|
+
found = false;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (found) {
|
|
88
|
+
return i;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return -1;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Extract a line from buffer (up to CRLF or LF)
|
|
95
|
+
*/
|
|
96
|
+
export function extractLine(buffer, startOffset = 0) {
|
|
97
|
+
// Delegate to protocol parser
|
|
98
|
+
return HttpParser.extractLine(buffer, startOffset);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if buffer starts with a string (case-insensitive)
|
|
102
|
+
*/
|
|
103
|
+
export function startsWithString(buffer, str, offset = 0) {
|
|
104
|
+
if (offset + str.length > buffer.length) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
const bufferStr = buffer.slice(offset, offset + str.length).toString('utf8');
|
|
108
|
+
return bufferStr.toLowerCase() === str.toLowerCase();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Safe buffer slice that doesn't throw on out-of-bounds
|
|
112
|
+
*/
|
|
113
|
+
export function safeSlice(buffer, start, end) {
|
|
114
|
+
const safeStart = Math.max(0, Math.min(start, buffer.length));
|
|
115
|
+
const safeEnd = end === undefined
|
|
116
|
+
? buffer.length
|
|
117
|
+
: Math.max(safeStart, Math.min(end, buffer.length));
|
|
118
|
+
return buffer.slice(safeStart, safeEnd);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if buffer contains printable ASCII
|
|
122
|
+
*/
|
|
123
|
+
export function isPrintableAscii(buffer, length) {
|
|
124
|
+
// Delegate to protocol parser
|
|
125
|
+
return HttpParser.isPrintableAscii(buffer, length);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZGV0ZWN0aW9uL3V0aWxzL2J1ZmZlci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILHdCQUF3QjtBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQTlCO1FBQ1UsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQTRDMUIsQ0FBQztJQTFDQzs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFZO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIs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
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fragment Manager for Detection Module
|
|
3
|
+
*
|
|
4
|
+
* Manages fragmented protocol data using the shared fragment handler
|
|
5
|
+
*/
|
|
6
|
+
import { FragmentHandler } from '../../protocols/common/fragment-handler.js';
|
|
7
|
+
import type { IConnectionContext } from '../../protocols/common/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Detection-specific fragment manager
|
|
10
|
+
*/
|
|
11
|
+
export declare class DetectionFragmentManager {
|
|
12
|
+
private tlsFragments;
|
|
13
|
+
private httpFragments;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Get fragment handler for protocol type
|
|
17
|
+
*/
|
|
18
|
+
getHandler(protocol: 'tls' | 'http'): FragmentHandler;
|
|
19
|
+
/**
|
|
20
|
+
* Create connection ID from context
|
|
21
|
+
*/
|
|
22
|
+
static createConnectionId(context: IConnectionContext): string;
|
|
23
|
+
/**
|
|
24
|
+
* Clean up all handlers
|
|
25
|
+
*/
|
|
26
|
+
cleanup(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Destroy all handlers
|
|
29
|
+
*/
|
|
30
|
+
destroy(): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fragment Manager for Detection Module
|
|
3
|
+
*
|
|
4
|
+
* Manages fragmented protocol data using the shared fragment handler
|
|
5
|
+
*/
|
|
6
|
+
import { FragmentHandler } from '../../protocols/common/fragment-handler.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detection-specific fragment manager
|
|
9
|
+
*/
|
|
10
|
+
export class DetectionFragmentManager {
|
|
11
|
+
constructor() {
|
|
12
|
+
// Configure fragment handlers with appropriate limits
|
|
13
|
+
const tlsOptions = {
|
|
14
|
+
maxBufferSize: 16384, // TLS record max size
|
|
15
|
+
timeout: 5000,
|
|
16
|
+
cleanupInterval: 30000
|
|
17
|
+
};
|
|
18
|
+
const httpOptions = {
|
|
19
|
+
maxBufferSize: 8192, // HTTP header reasonable limit
|
|
20
|
+
timeout: 5000,
|
|
21
|
+
cleanupInterval: 30000
|
|
22
|
+
};
|
|
23
|
+
this.tlsFragments = new FragmentHandler(tlsOptions);
|
|
24
|
+
this.httpFragments = new FragmentHandler(httpOptions);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get fragment handler for protocol type
|
|
28
|
+
*/
|
|
29
|
+
getHandler(protocol) {
|
|
30
|
+
return protocol === 'tls' ? this.tlsFragments : this.httpFragments;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create connection ID from context
|
|
34
|
+
*/
|
|
35
|
+
static createConnectionId(context) {
|
|
36
|
+
return context.id || `${context.sourceIp}:${context.sourcePort}-${context.destIp}:${context.destPort}`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Clean up all handlers
|
|
40
|
+
*/
|
|
41
|
+
cleanup() {
|
|
42
|
+
this.tlsFragments.cleanup();
|
|
43
|
+
this.httpFragments.cleanup();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Destroy all handlers
|
|
47
|
+
*/
|
|
48
|
+
destroy() {
|
|
49
|
+
this.tlsFragments.destroy();
|
|
50
|
+
this.httpFragments.destroy();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhZ21lbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2RldGVjdGlvbi91dGlscy9mcmFnbWVudC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUF5QixNQUFNLDRDQUE0QyxDQUFDO0FBR3BHOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3QjtJQUluQztRQUNFLHNEQUFzRDtRQUN0RCxNQUFNLFVBQVUsR0FBcUI7WUFDbkMsYUFBYSxFQUFFLEtBQUssRUFBRyxzQkFBc0I7WUFDN0MsT0FBTyxFQUFFLElBQUk7WUFDYixlQUFlLEVBQUUsS0FBSztTQUN2QixDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQXFCO1lBQ3BDLGFBQWEsRUFBRSxJQUFJLEVBQUksK0JBQStCO1lBQ3RELE9BQU8sRUFBRSxJQUFJO1lBQ2IsZUFBZSxFQUFFLEtBQUs7U0FDdkIsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsUUFBd0I7UUFDakMsT0FBTyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUEyQjtRQUNuRCxPQUFPLE9BQU8sQ0FBQyxFQUFFLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekcsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser utilities for protocol detection
|
|
3
|
+
* Now delegates to protocol modules for actual parsing
|
|
4
|
+
*/
|
|
5
|
+
import type { THttpMethod, TTlsVersion } from '../models/detection-types.js';
|
|
6
|
+
import { HTTP_METHODS, HTTP_VERSIONS } from '../../protocols/http/index.js';
|
|
7
|
+
export { HTTP_METHODS, HTTP_VERSIONS };
|
|
8
|
+
/**
|
|
9
|
+
* Parse HTTP request line
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseHttpRequestLine(line: string): {
|
|
12
|
+
method: THttpMethod;
|
|
13
|
+
path: string;
|
|
14
|
+
version: string;
|
|
15
|
+
} | null;
|
|
16
|
+
/**
|
|
17
|
+
* Parse HTTP header line
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseHttpHeader(line: string): {
|
|
20
|
+
name: string;
|
|
21
|
+
value: string;
|
|
22
|
+
} | null;
|
|
23
|
+
/**
|
|
24
|
+
* Parse HTTP headers from lines
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseHttpHeaders(lines: string[]): Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* Convert TLS version bytes to version string
|
|
29
|
+
*/
|
|
30
|
+
export declare function tlsVersionToString(major: number, minor: number): TTlsVersion | null;
|
|
31
|
+
/**
|
|
32
|
+
* Extract domain from Host header value
|
|
33
|
+
*/
|
|
34
|
+
export declare function extractDomainFromHost(hostHeader: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Validate domain name
|
|
37
|
+
*/
|
|
38
|
+
export declare function isValidDomain(domain: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Check if string is a valid HTTP method
|
|
41
|
+
*/
|
|
42
|
+
export declare function isHttpMethod(str: string): str is THttpMethod;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser utilities for protocol detection
|
|
3
|
+
* Now delegates to protocol modules for actual parsing
|
|
4
|
+
*/
|
|
5
|
+
import { HttpParser, HTTP_METHODS, HTTP_VERSIONS } from '../../protocols/http/index.js';
|
|
6
|
+
import { tlsVersionToString as protocolTlsVersionToString } from '../../protocols/tls/index.js';
|
|
7
|
+
// Re-export constants for backward compatibility
|
|
8
|
+
export { HTTP_METHODS, HTTP_VERSIONS };
|
|
9
|
+
/**
|
|
10
|
+
* Parse HTTP request line
|
|
11
|
+
*/
|
|
12
|
+
export function parseHttpRequestLine(line) {
|
|
13
|
+
// Delegate to protocol parser
|
|
14
|
+
const result = HttpParser.parseRequestLine(line);
|
|
15
|
+
return result ? {
|
|
16
|
+
method: result.method,
|
|
17
|
+
path: result.path,
|
|
18
|
+
version: result.version
|
|
19
|
+
} : null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse HTTP header line
|
|
23
|
+
*/
|
|
24
|
+
export function parseHttpHeader(line) {
|
|
25
|
+
// Delegate to protocol parser
|
|
26
|
+
return HttpParser.parseHeaderLine(line);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse HTTP headers from lines
|
|
30
|
+
*/
|
|
31
|
+
export function parseHttpHeaders(lines) {
|
|
32
|
+
// Delegate to protocol parser
|
|
33
|
+
return HttpParser.parseHeaders(lines);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Convert TLS version bytes to version string
|
|
37
|
+
*/
|
|
38
|
+
export function tlsVersionToString(major, minor) {
|
|
39
|
+
// Delegate to protocol parser
|
|
40
|
+
return protocolTlsVersionToString(major, minor);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Extract domain from Host header value
|
|
44
|
+
*/
|
|
45
|
+
export function extractDomainFromHost(hostHeader) {
|
|
46
|
+
// Delegate to protocol parser
|
|
47
|
+
return HttpParser.extractDomainFromHost(hostHeader);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate domain name
|
|
51
|
+
*/
|
|
52
|
+
export function isValidDomain(domain) {
|
|
53
|
+
// Delegate to protocol parser
|
|
54
|
+
return HttpParser.isValidDomain(domain);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if string is a valid HTTP method
|
|
58
|
+
*/
|
|
59
|
+
export function isHttpMethod(str) {
|
|
60
|
+
// Delegate to protocol parser
|
|
61
|
+
return HttpParser.isHttpMethod(str) && str !== undefined;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZGV0ZWN0aW9uL3V0aWxzL3BhcnNlci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFHSCxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLElBQUksMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVoRyxpREFBaUQ7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBSy9DLDhCQUE4QjtJQUM5QixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFxQjtRQUNwQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO0tBQ3hCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNYLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWTtJQUMxQyw4QkFBOEI7SUFDOUIsT0FBTyxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFlO0lBQzlDLDhCQUE4QjtJQUM5QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQzdELDhCQUE4QjtJQUM5QixPQUFPLDBCQUEwQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQWdCLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFVBQWtCO0lBQ3RELDhCQUE4QjtJQUM5QixPQUFPLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQWM7SUFDMUMsOEJBQThCO0lBQzlCLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVc7SUFDdEMsOEJBQThCO0lBQzlCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSyxHQUFtQixLQUFLLFNBQVMsQ0FBQztBQUM1RSxDQUFDIn0=
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -16,3 +16,5 @@ export * from './core/models/common-types.js';
|
|
|
16
16
|
export type { IAcmeOptions } from './proxies/smart-proxy/models/interfaces.js';
|
|
17
17
|
export * as tls from './tls/index.js';
|
|
18
18
|
export * as routing from './routing/index.js';
|
|
19
|
+
export * as detection from './detection/index.js';
|
|
20
|
+
export * as protocols from './protocols/index.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -21,4 +21,6 @@ export * from './core/models/common-types.js';
|
|
|
21
21
|
// Certificate module has been removed - use SmartCertManager instead
|
|
22
22
|
export * as tls from './tls/index.js';
|
|
23
23
|
export * as routing from './routing/index.js';
|
|
24
|
-
|
|
24
|
+
export * as detection from './detection/index.js';
|
|
25
|
+
export * as protocols from './protocols/index.js';
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILHlCQUF5QjtBQUN6QixjQUFjLG1DQUFtQyxDQUFDO0FBRWxELDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdoSSxPQUFPLEVBQUUsa0JBQWtCLElBQUkscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5Rix5RUFBeUU7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2TCxPQUFPLEVBQUUsa0JBQWtCLElBQUksWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFJckYsY0FBYyxzQ0FBc0MsQ0FBQztBQUVyRCxrRUFBa0U7QUFDbEUsb0NBQW9DO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxrRUFBa0U7QUFDbEUscUVBQXFFO0FBRXJFLDJCQUEyQjtBQUMzQixjQUFjLCtCQUErQixDQUFDO0FBSzlDLHVDQUF1QztBQUN2QyxxRUFBcUU7QUFDckUsT0FBTyxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQkFBc0IsQ0FBQyJ9
|