@push.rocks/smartproxy 21.0.0 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/changelog.md +9 -0
  2. package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
  3. package/dist_ts/core/utils/proxy-protocol.js +13 -97
  4. package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
  5. package/dist_ts/core/utils/websocket-utils.js +10 -66
  6. package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
  7. package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
  8. package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
  9. package/dist_ts/detection/detectors/http-detector.js +89 -0
  10. package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
  11. package/dist_ts/detection/detectors/quick-detector.js +131 -0
  12. package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
  13. package/dist_ts/detection/detectors/routing-extractor.js +122 -0
  14. package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
  15. package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
  16. package/dist_ts/detection/detectors/tls-detector.d.ts +33 -0
  17. package/dist_ts/detection/detectors/tls-detector.js +106 -0
  18. package/dist_ts/detection/index.d.ts +17 -0
  19. package/dist_ts/detection/index.js +22 -0
  20. package/dist_ts/detection/models/detection-types.d.ts +87 -0
  21. package/dist_ts/detection/models/detection-types.js +5 -0
  22. package/dist_ts/detection/models/interfaces.d.ts +97 -0
  23. package/dist_ts/detection/models/interfaces.js +5 -0
  24. package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
  25. package/dist_ts/detection/protocol-detector-v2.js +116 -0
  26. package/dist_ts/detection/protocol-detector.d.ts +74 -0
  27. package/dist_ts/detection/protocol-detector.js +173 -0
  28. package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
  29. package/dist_ts/detection/utils/buffer-utils.js +127 -0
  30. package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
  31. package/dist_ts/detection/utils/fragment-manager.js +53 -0
  32. package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
  33. package/dist_ts/detection/utils/parser-utils.js +63 -0
  34. package/dist_ts/index.d.ts +2 -0
  35. package/dist_ts/index.js +3 -1
  36. package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
  37. package/dist_ts/protocols/common/fragment-handler.js +117 -0
  38. package/dist_ts/protocols/common/index.d.ts +7 -0
  39. package/dist_ts/protocols/common/index.js +8 -0
  40. package/dist_ts/protocols/common/types.d.ts +68 -0
  41. package/dist_ts/protocols/common/types.js +7 -0
  42. package/dist_ts/protocols/http/constants.d.ts +119 -0
  43. package/dist_ts/protocols/http/constants.js +200 -0
  44. package/dist_ts/protocols/http/index.d.ts +7 -0
  45. package/dist_ts/protocols/http/index.js +8 -0
  46. package/dist_ts/protocols/http/parser.d.ts +58 -0
  47. package/dist_ts/protocols/http/parser.js +184 -0
  48. package/dist_ts/protocols/http/types.d.ts +62 -0
  49. package/dist_ts/protocols/http/types.js +5 -0
  50. package/dist_ts/protocols/index.d.ts +11 -0
  51. package/dist_ts/protocols/index.js +12 -0
  52. package/dist_ts/protocols/proxy/index.d.ts +6 -0
  53. package/dist_ts/protocols/proxy/index.js +7 -0
  54. package/dist_ts/protocols/proxy/parser.d.ts +44 -0
  55. package/dist_ts/protocols/proxy/parser.js +153 -0
  56. package/dist_ts/protocols/proxy/types.d.ts +47 -0
  57. package/dist_ts/protocols/proxy/types.js +6 -0
  58. package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
  59. package/dist_ts/protocols/tls/alerts/index.js +5 -0
  60. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
  61. package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
  62. package/dist_ts/protocols/tls/constants.d.ts +122 -0
  63. package/dist_ts/protocols/tls/constants.js +135 -0
  64. package/dist_ts/protocols/tls/index.d.ts +12 -0
  65. package/dist_ts/protocols/tls/index.js +27 -0
  66. package/dist_ts/protocols/tls/parser.d.ts +53 -0
  67. package/dist_ts/protocols/tls/parser.js +294 -0
  68. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
  69. package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
  70. package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
  71. package/dist_ts/protocols/tls/sni/index.js +6 -0
  72. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
  73. package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
  74. package/dist_ts/protocols/tls/types.d.ts +65 -0
  75. package/dist_ts/protocols/tls/types.js +5 -0
  76. package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
  77. package/dist_ts/protocols/tls/utils/index.js +5 -0
  78. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
  79. package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
  80. package/dist_ts/protocols/websocket/constants.d.ts +55 -0
  81. package/dist_ts/protocols/websocket/constants.js +58 -0
  82. package/dist_ts/protocols/websocket/index.d.ts +7 -0
  83. package/dist_ts/protocols/websocket/index.js +8 -0
  84. package/dist_ts/protocols/websocket/types.d.ts +47 -0
  85. package/dist_ts/protocols/websocket/types.js +5 -0
  86. package/dist_ts/protocols/websocket/utils.d.ts +25 -0
  87. package/dist_ts/protocols/websocket/utils.js +103 -0
  88. package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
  89. package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
  90. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
  91. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
  92. package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
  93. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +2 -0
  94. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +61 -52
  95. package/dist_ts/tls/index.d.ts +5 -7
  96. package/dist_ts/tls/index.js +8 -11
  97. package/dist_ts/tls/sni/client-hello-parser.js +3 -2
  98. package/dist_ts/tls/sni/sni-handler.js +4 -4
  99. package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
  100. package/dist_ts/tls/utils/tls-utils.js +4 -116
  101. package/package.json +17 -8
  102. package/readme.plan.md +0 -0
  103. package/ts/core/utils/proxy-protocol.ts +14 -131
  104. package/ts/core/utils/websocket-utils.ts +12 -60
  105. package/ts/detection/detectors/http-detector.ts +114 -0
  106. package/ts/detection/detectors/quick-detector.ts +148 -0
  107. package/ts/detection/detectors/routing-extractor.ts +147 -0
  108. package/ts/detection/detectors/tls-detector.ts +120 -0
  109. package/ts/detection/index.ts +25 -0
  110. package/ts/detection/models/detection-types.ts +102 -0
  111. package/ts/detection/models/interfaces.ts +115 -0
  112. package/ts/detection/protocol-detector.ts +230 -0
  113. package/ts/detection/utils/buffer-utils.ts +141 -0
  114. package/ts/detection/utils/fragment-manager.ts +64 -0
  115. package/ts/detection/utils/parser-utils.ts +77 -0
  116. package/ts/index.ts +3 -1
  117. package/ts/protocols/common/fragment-handler.ts +163 -0
  118. package/ts/protocols/common/index.ts +8 -0
  119. package/ts/protocols/common/types.ts +76 -0
  120. package/ts/protocols/http/constants.ts +219 -0
  121. package/ts/protocols/http/index.ts +8 -0
  122. package/ts/protocols/http/parser.ts +219 -0
  123. package/ts/protocols/http/types.ts +70 -0
  124. package/ts/protocols/index.ts +12 -0
  125. package/ts/protocols/proxy/index.ts +7 -0
  126. package/ts/protocols/proxy/parser.ts +183 -0
  127. package/ts/protocols/proxy/types.ts +53 -0
  128. package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
  129. package/ts/protocols/tls/index.ts +37 -0
  130. package/ts/protocols/tls/sni/index.ts +6 -0
  131. package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
  132. package/ts/protocols/websocket/constants.ts +60 -0
  133. package/ts/protocols/websocket/index.ts +8 -0
  134. package/ts/protocols/websocket/types.ts +53 -0
  135. package/ts/protocols/websocket/utils.ts +98 -0
  136. package/ts/proxies/http-proxy/models/http-types.ts +29 -46
  137. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -0
  138. package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
  139. package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
  140. package/ts/proxies/smart-proxy/utils/route-helpers.ts +72 -56
  141. package/ts/tls/index.ts +8 -12
  142. package/ts/tls/sni/sni-handler.ts +3 -3
  143. /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
  144. /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
  145. /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
  146. /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Interface definitions for protocol detection components
3
+ */
4
+
5
+ import type { IDetectionResult, IDetectionOptions } from './detection-types.js';
6
+
7
+ /**
8
+ * Interface for protocol detectors
9
+ */
10
+ export interface IProtocolDetector {
11
+ /**
12
+ * Detect protocol from buffer data
13
+ * @param buffer The buffer to analyze
14
+ * @param options Detection options
15
+ * @returns Detection result or null if protocol cannot be determined
16
+ */
17
+ detect(buffer: Buffer, options?: IDetectionOptions): IDetectionResult | null;
18
+
19
+ /**
20
+ * Check if buffer potentially contains this protocol
21
+ * @param buffer The buffer to check
22
+ * @returns True if buffer might contain this protocol
23
+ */
24
+ canHandle(buffer: Buffer): boolean;
25
+
26
+ /**
27
+ * Get the minimum bytes needed for detection
28
+ */
29
+ getMinimumBytes(): number;
30
+ }
31
+
32
+ /**
33
+ * Interface for connection tracking during fragmented detection
34
+ */
35
+ export interface IConnectionTracker {
36
+ /**
37
+ * Connection identifier
38
+ */
39
+ id: string;
40
+
41
+ /**
42
+ * Accumulated buffer data
43
+ */
44
+ buffer: Buffer;
45
+
46
+ /**
47
+ * Timestamp of first data
48
+ */
49
+ startTime: number;
50
+
51
+ /**
52
+ * Current detection state
53
+ */
54
+ state: 'detecting' | 'complete' | 'failed';
55
+
56
+ /**
57
+ * Partial detection result (if any)
58
+ */
59
+ partialResult?: Partial<IDetectionResult>;
60
+ }
61
+
62
+ /**
63
+ * Interface for buffer accumulator (handles fragmented data)
64
+ */
65
+ export interface IBufferAccumulator {
66
+ /**
67
+ * Add data to accumulator
68
+ */
69
+ append(data: Buffer): void;
70
+
71
+ /**
72
+ * Get accumulated buffer
73
+ */
74
+ getBuffer(): Buffer;
75
+
76
+ /**
77
+ * Get buffer length
78
+ */
79
+ length(): number;
80
+
81
+ /**
82
+ * Clear accumulated data
83
+ */
84
+ clear(): void;
85
+
86
+ /**
87
+ * Check if accumulator has enough data
88
+ */
89
+ hasMinimumBytes(minBytes: number): boolean;
90
+ }
91
+
92
+ /**
93
+ * Detection events
94
+ */
95
+ export interface IDetectionEvents {
96
+ /**
97
+ * Emitted when protocol is successfully detected
98
+ */
99
+ detected: (result: IDetectionResult) => void;
100
+
101
+ /**
102
+ * Emitted when detection fails
103
+ */
104
+ failed: (error: Error) => void;
105
+
106
+ /**
107
+ * Emitted when detection times out
108
+ */
109
+ timeout: () => void;
110
+
111
+ /**
112
+ * Emitted when more data is needed
113
+ */
114
+ needMoreData: (bytesNeeded: number) => void;
115
+ }
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Protocol Detector
3
+ *
4
+ * Simplified protocol detection using the new architecture
5
+ */
6
+
7
+ import type { IDetectionResult, IDetectionOptions } from './models/detection-types.js';
8
+ import type { IConnectionContext } from '../protocols/common/types.js';
9
+ import { TlsDetector } from './detectors/tls-detector.js';
10
+ import { HttpDetector } from './detectors/http-detector.js';
11
+ import { DetectionFragmentManager } from './utils/fragment-manager.js';
12
+
13
+ /**
14
+ * Main protocol detector class
15
+ */
16
+ export class ProtocolDetector {
17
+ private static instance: ProtocolDetector;
18
+ private fragmentManager: DetectionFragmentManager;
19
+ private tlsDetector: TlsDetector;
20
+ private httpDetector: HttpDetector;
21
+
22
+ constructor() {
23
+ this.fragmentManager = new DetectionFragmentManager();
24
+ this.tlsDetector = new TlsDetector(this.fragmentManager);
25
+ this.httpDetector = new HttpDetector(this.fragmentManager);
26
+ }
27
+
28
+ private static getInstance(): ProtocolDetector {
29
+ if (!this.instance) {
30
+ this.instance = new ProtocolDetector();
31
+ }
32
+ return this.instance;
33
+ }
34
+
35
+ /**
36
+ * Detect protocol from buffer data
37
+ */
38
+ static async detect(buffer: Buffer, options?: IDetectionOptions): Promise<IDetectionResult> {
39
+ return this.getInstance().detectInstance(buffer, options);
40
+ }
41
+
42
+ private async detectInstance(buffer: Buffer, options?: IDetectionOptions): Promise<IDetectionResult> {
43
+ // Quick sanity check
44
+ if (!buffer || buffer.length === 0) {
45
+ return {
46
+ protocol: 'unknown',
47
+ connectionInfo: { protocol: 'unknown' },
48
+ isComplete: true
49
+ };
50
+ }
51
+
52
+ // Try TLS detection first (more specific)
53
+ if (this.tlsDetector.canHandle(buffer)) {
54
+ const tlsResult = this.tlsDetector.detect(buffer, options);
55
+ if (tlsResult) {
56
+ return tlsResult;
57
+ }
58
+ }
59
+
60
+ // Try HTTP detection
61
+ if (this.httpDetector.canHandle(buffer)) {
62
+ const httpResult = this.httpDetector.detect(buffer, options);
63
+ if (httpResult) {
64
+ return httpResult;
65
+ }
66
+ }
67
+
68
+ // Neither TLS nor HTTP
69
+ return {
70
+ protocol: 'unknown',
71
+ connectionInfo: { protocol: 'unknown' },
72
+ isComplete: true
73
+ };
74
+ }
75
+
76
+ /**
77
+ * Detect protocol with connection tracking for fragmented data
78
+ * @deprecated Use detectWithContext instead
79
+ */
80
+ static async detectWithConnectionTracking(
81
+ buffer: Buffer,
82
+ connectionId: string,
83
+ options?: IDetectionOptions
84
+ ): Promise<IDetectionResult> {
85
+ // Convert connection ID to context
86
+ const context: IConnectionContext = {
87
+ id: connectionId,
88
+ sourceIp: 'unknown',
89
+ sourcePort: 0,
90
+ destIp: 'unknown',
91
+ destPort: 0,
92
+ timestamp: Date.now()
93
+ };
94
+
95
+ return this.getInstance().detectWithContextInstance(buffer, context, options);
96
+ }
97
+
98
+ /**
99
+ * Detect protocol with connection context for fragmented data
100
+ */
101
+ static async detectWithContext(
102
+ buffer: Buffer,
103
+ context: IConnectionContext,
104
+ options?: IDetectionOptions
105
+ ): Promise<IDetectionResult> {
106
+ return this.getInstance().detectWithContextInstance(buffer, context, options);
107
+ }
108
+
109
+ private async detectWithContextInstance(
110
+ buffer: Buffer,
111
+ context: IConnectionContext,
112
+ options?: IDetectionOptions
113
+ ): Promise<IDetectionResult> {
114
+ // Quick sanity check
115
+ if (!buffer || buffer.length === 0) {
116
+ return {
117
+ protocol: 'unknown',
118
+ connectionInfo: { protocol: 'unknown' },
119
+ isComplete: true
120
+ };
121
+ }
122
+
123
+ // First peek to determine protocol type
124
+ if (this.tlsDetector.canHandle(buffer)) {
125
+ const result = this.tlsDetector.detectWithContext(buffer, context, options);
126
+ if (result) {
127
+ return result;
128
+ }
129
+ }
130
+
131
+ if (this.httpDetector.canHandle(buffer)) {
132
+ const result = this.httpDetector.detectWithContext(buffer, context, options);
133
+ if (result) {
134
+ return result;
135
+ }
136
+ }
137
+
138
+ // Can't determine protocol
139
+ return {
140
+ protocol: 'unknown',
141
+ connectionInfo: { protocol: 'unknown' },
142
+ isComplete: false,
143
+ bytesNeeded: Math.max(
144
+ this.tlsDetector.getMinimumBytes(),
145
+ this.httpDetector.getMinimumBytes()
146
+ )
147
+ };
148
+ }
149
+
150
+ /**
151
+ * Clean up resources
152
+ */
153
+ static cleanup(): void {
154
+ this.getInstance().cleanupInstance();
155
+ }
156
+
157
+ private cleanupInstance(): void {
158
+ this.fragmentManager.cleanup();
159
+ }
160
+
161
+ /**
162
+ * Destroy detector instance
163
+ */
164
+ static destroy(): void {
165
+ this.getInstance().destroyInstance();
166
+ this.instance = null as any;
167
+ }
168
+
169
+ private destroyInstance(): void {
170
+ this.fragmentManager.destroy();
171
+ }
172
+
173
+ /**
174
+ * Clean up old connection tracking entries
175
+ *
176
+ * @param maxAge Maximum age in milliseconds (default: 30 seconds)
177
+ */
178
+ static cleanupConnections(maxAge: number = 30000): void {
179
+ // Cleanup is now handled internally by the fragment manager
180
+ this.getInstance().fragmentManager.cleanup();
181
+ }
182
+
183
+ /**
184
+ * Extract domain from connection info
185
+ */
186
+ static extractDomain(connectionInfo: any): string | undefined {
187
+ return connectionInfo.domain || connectionInfo.sni || connectionInfo.host;
188
+ }
189
+
190
+ /**
191
+ * Create a connection ID from connection parameters
192
+ * @deprecated Use createConnectionContext instead
193
+ */
194
+ static createConnectionId(params: {
195
+ sourceIp?: string;
196
+ sourcePort?: number;
197
+ destIp?: string;
198
+ destPort?: number;
199
+ socketId?: string;
200
+ }): string {
201
+ // If socketId is provided, use it
202
+ if (params.socketId) {
203
+ return params.socketId;
204
+ }
205
+
206
+ // Otherwise create from connection tuple
207
+ const { sourceIp = 'unknown', sourcePort = 0, destIp = 'unknown', destPort = 0 } = params;
208
+ return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
209
+ }
210
+
211
+ /**
212
+ * Create a connection context from parameters
213
+ */
214
+ static createConnectionContext(params: {
215
+ sourceIp?: string;
216
+ sourcePort?: number;
217
+ destIp?: string;
218
+ destPort?: number;
219
+ socketId?: string;
220
+ }): IConnectionContext {
221
+ return {
222
+ id: params.socketId,
223
+ sourceIp: params.sourceIp || 'unknown',
224
+ sourcePort: params.sourcePort || 0,
225
+ destIp: params.destIp || 'unknown',
226
+ destPort: params.destPort || 0,
227
+ timestamp: Date.now()
228
+ };
229
+ }
230
+ }
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Buffer manipulation utilities for protocol detection
3
+ */
4
+
5
+ // Import from protocols
6
+ import { HttpParser } from '../../protocols/http/index.js';
7
+
8
+ /**
9
+ * BufferAccumulator class for handling fragmented data
10
+ */
11
+ export class BufferAccumulator {
12
+ private chunks: Buffer[] = [];
13
+ private totalLength = 0;
14
+
15
+ /**
16
+ * Append data to the accumulator
17
+ */
18
+ append(data: Buffer): void {
19
+ this.chunks.push(data);
20
+ this.totalLength += data.length;
21
+ }
22
+
23
+ /**
24
+ * Get the accumulated buffer
25
+ */
26
+ getBuffer(): Buffer {
27
+ if (this.chunks.length === 0) {
28
+ return Buffer.alloc(0);
29
+ }
30
+ if (this.chunks.length === 1) {
31
+ return this.chunks[0];
32
+ }
33
+ return Buffer.concat(this.chunks, this.totalLength);
34
+ }
35
+
36
+ /**
37
+ * Get current buffer length
38
+ */
39
+ length(): number {
40
+ return this.totalLength;
41
+ }
42
+
43
+ /**
44
+ * Clear all accumulated data
45
+ */
46
+ clear(): void {
47
+ this.chunks = [];
48
+ this.totalLength = 0;
49
+ }
50
+
51
+ /**
52
+ * Check if accumulator has minimum bytes
53
+ */
54
+ hasMinimumBytes(minBytes: number): boolean {
55
+ return this.totalLength >= minBytes;
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Read a big-endian 16-bit integer from buffer
61
+ */
62
+ export function readUInt16BE(buffer: Buffer, offset: number): number {
63
+ if (offset + 2 > buffer.length) {
64
+ throw new Error('Buffer too short for UInt16BE read');
65
+ }
66
+ return (buffer[offset] << 8) | buffer[offset + 1];
67
+ }
68
+
69
+ /**
70
+ * Read a big-endian 24-bit integer from buffer
71
+ */
72
+ export function readUInt24BE(buffer: Buffer, offset: number): number {
73
+ if (offset + 3 > buffer.length) {
74
+ throw new Error('Buffer too short for UInt24BE read');
75
+ }
76
+ return (buffer[offset] << 16) | (buffer[offset + 1] << 8) | buffer[offset + 2];
77
+ }
78
+
79
+ /**
80
+ * Find a byte sequence in a buffer
81
+ */
82
+ export function findSequence(buffer: Buffer, sequence: Buffer, startOffset = 0): number {
83
+ if (sequence.length === 0) {
84
+ return startOffset;
85
+ }
86
+
87
+ const searchLength = buffer.length - sequence.length + 1;
88
+ for (let i = startOffset; i < searchLength; i++) {
89
+ let found = true;
90
+ for (let j = 0; j < sequence.length; j++) {
91
+ if (buffer[i + j] !== sequence[j]) {
92
+ found = false;
93
+ break;
94
+ }
95
+ }
96
+ if (found) {
97
+ return i;
98
+ }
99
+ }
100
+ return -1;
101
+ }
102
+
103
+ /**
104
+ * Extract a line from buffer (up to CRLF or LF)
105
+ */
106
+ export function extractLine(buffer: Buffer, startOffset = 0): { line: string; nextOffset: number } | null {
107
+ // Delegate to protocol parser
108
+ return HttpParser.extractLine(buffer, startOffset);
109
+ }
110
+
111
+ /**
112
+ * Check if buffer starts with a string (case-insensitive)
113
+ */
114
+ export function startsWithString(buffer: Buffer, str: string, offset = 0): boolean {
115
+ if (offset + str.length > buffer.length) {
116
+ return false;
117
+ }
118
+
119
+ const bufferStr = buffer.slice(offset, offset + str.length).toString('utf8');
120
+ return bufferStr.toLowerCase() === str.toLowerCase();
121
+ }
122
+
123
+ /**
124
+ * Safe buffer slice that doesn't throw on out-of-bounds
125
+ */
126
+ export function safeSlice(buffer: Buffer, start: number, end?: number): Buffer {
127
+ const safeStart = Math.max(0, Math.min(start, buffer.length));
128
+ const safeEnd = end === undefined
129
+ ? buffer.length
130
+ : Math.max(safeStart, Math.min(end, buffer.length));
131
+
132
+ return buffer.slice(safeStart, safeEnd);
133
+ }
134
+
135
+ /**
136
+ * Check if buffer contains printable ASCII
137
+ */
138
+ export function isPrintableAscii(buffer: Buffer, length?: number): boolean {
139
+ // Delegate to protocol parser
140
+ return HttpParser.isPrintableAscii(buffer, length);
141
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Fragment Manager for Detection Module
3
+ *
4
+ * Manages fragmented protocol data using the shared fragment handler
5
+ */
6
+
7
+ import { FragmentHandler, type IFragmentOptions } from '../../protocols/common/fragment-handler.js';
8
+ import type { IConnectionContext } from '../../protocols/common/types.js';
9
+
10
+ /**
11
+ * Detection-specific fragment manager
12
+ */
13
+ export class DetectionFragmentManager {
14
+ private tlsFragments: FragmentHandler;
15
+ private httpFragments: FragmentHandler;
16
+
17
+ constructor() {
18
+ // Configure fragment handlers with appropriate limits
19
+ const tlsOptions: IFragmentOptions = {
20
+ maxBufferSize: 16384, // TLS record max size
21
+ timeout: 5000,
22
+ cleanupInterval: 30000
23
+ };
24
+
25
+ const httpOptions: IFragmentOptions = {
26
+ maxBufferSize: 8192, // HTTP header reasonable limit
27
+ timeout: 5000,
28
+ cleanupInterval: 30000
29
+ };
30
+
31
+ this.tlsFragments = new FragmentHandler(tlsOptions);
32
+ this.httpFragments = new FragmentHandler(httpOptions);
33
+ }
34
+
35
+ /**
36
+ * Get fragment handler for protocol type
37
+ */
38
+ getHandler(protocol: 'tls' | 'http'): FragmentHandler {
39
+ return protocol === 'tls' ? this.tlsFragments : this.httpFragments;
40
+ }
41
+
42
+ /**
43
+ * Create connection ID from context
44
+ */
45
+ static createConnectionId(context: IConnectionContext): string {
46
+ return context.id || `${context.sourceIp}:${context.sourcePort}-${context.destIp}:${context.destPort}`;
47
+ }
48
+
49
+ /**
50
+ * Clean up all handlers
51
+ */
52
+ cleanup(): void {
53
+ this.tlsFragments.cleanup();
54
+ this.httpFragments.cleanup();
55
+ }
56
+
57
+ /**
58
+ * Destroy all handlers
59
+ */
60
+ destroy(): void {
61
+ this.tlsFragments.destroy();
62
+ this.httpFragments.destroy();
63
+ }
64
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Parser utilities for protocol detection
3
+ * Now delegates to protocol modules for actual parsing
4
+ */
5
+
6
+ import type { THttpMethod, TTlsVersion } from '../models/detection-types.js';
7
+ import { HttpParser, HTTP_METHODS, HTTP_VERSIONS } from '../../protocols/http/index.js';
8
+ import { tlsVersionToString as protocolTlsVersionToString } from '../../protocols/tls/index.js';
9
+
10
+ // Re-export constants for backward compatibility
11
+ export { HTTP_METHODS, HTTP_VERSIONS };
12
+
13
+ /**
14
+ * Parse HTTP request line
15
+ */
16
+ export function parseHttpRequestLine(line: string): {
17
+ method: THttpMethod;
18
+ path: string;
19
+ version: string;
20
+ } | null {
21
+ // Delegate to protocol parser
22
+ const result = HttpParser.parseRequestLine(line);
23
+ return result ? {
24
+ method: result.method as THttpMethod,
25
+ path: result.path,
26
+ version: result.version
27
+ } : null;
28
+ }
29
+
30
+ /**
31
+ * Parse HTTP header line
32
+ */
33
+ export function parseHttpHeader(line: string): { name: string; value: string } | null {
34
+ // Delegate to protocol parser
35
+ return HttpParser.parseHeaderLine(line);
36
+ }
37
+
38
+ /**
39
+ * Parse HTTP headers from lines
40
+ */
41
+ export function parseHttpHeaders(lines: string[]): Record<string, string> {
42
+ // Delegate to protocol parser
43
+ return HttpParser.parseHeaders(lines);
44
+ }
45
+
46
+ /**
47
+ * Convert TLS version bytes to version string
48
+ */
49
+ export function tlsVersionToString(major: number, minor: number): TTlsVersion | null {
50
+ // Delegate to protocol parser
51
+ return protocolTlsVersionToString(major, minor) as TTlsVersion;
52
+ }
53
+
54
+ /**
55
+ * Extract domain from Host header value
56
+ */
57
+ export function extractDomainFromHost(hostHeader: string): string {
58
+ // Delegate to protocol parser
59
+ return HttpParser.extractDomainFromHost(hostHeader);
60
+ }
61
+
62
+ /**
63
+ * Validate domain name
64
+ */
65
+ export function isValidDomain(domain: string): boolean {
66
+ // Delegate to protocol parser
67
+ return HttpParser.isValidDomain(domain);
68
+ }
69
+
70
+ /**
71
+ * Check if string is a valid HTTP method
72
+ */
73
+ export function isHttpMethod(str: string): str is THttpMethod {
74
+ // Delegate to protocol parser
75
+ return HttpParser.isHttpMethod(str) && (str as THttpMethod) !== undefined;
76
+ }
77
+
package/ts/index.ts CHANGED
@@ -34,4 +34,6 @@ export type { IAcmeOptions } from './proxies/smart-proxy/models/interfaces.js';
34
34
  // Modular exports for new architecture
35
35
  // Certificate module has been removed - use SmartCertManager instead
36
36
  export * as tls from './tls/index.js';
37
- export * as routing from './routing/index.js';
37
+ export * as routing from './routing/index.js';
38
+ export * as detection from './detection/index.js';
39
+ export * as protocols from './protocols/index.js';