@push.rocks/smartproxy 25.17.9 → 26.0.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 (179) hide show
  1. package/changelog.md +16 -0
  2. package/dist_rust/rustproxy_linux_amd64 +0 -0
  3. package/dist_rust/rustproxy_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +2 -2
  5. package/dist_ts/core/index.d.ts +0 -1
  6. package/dist_ts/core/index.js +1 -2
  7. package/dist_ts/core/models/index.d.ts +0 -1
  8. package/dist_ts/core/models/index.js +1 -2
  9. package/dist_ts/core/utils/index.d.ts +0 -12
  10. package/dist_ts/core/utils/index.js +1 -13
  11. package/dist_ts/index.d.ts +0 -3
  12. package/dist_ts/index.js +2 -7
  13. package/dist_ts/protocols/http/index.d.ts +0 -1
  14. package/dist_ts/protocols/http/index.js +1 -2
  15. package/dist_ts/protocols/index.d.ts +0 -7
  16. package/dist_ts/protocols/index.js +1 -8
  17. package/dist_ts/proxies/smart-proxy/socket-handler-server.js +6 -1
  18. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.d.ts +0 -7
  19. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +50 -51
  20. package/dist_ts/routing/index.d.ts +0 -1
  21. package/dist_ts/routing/index.js +1 -3
  22. package/package.json +1 -1
  23. package/ts/00_commitinfo_data.ts +1 -1
  24. package/ts/core/index.ts +0 -1
  25. package/ts/core/models/index.ts +0 -1
  26. package/ts/core/utils/index.ts +0 -12
  27. package/ts/index.ts +1 -7
  28. package/ts/protocols/http/index.ts +1 -2
  29. package/ts/protocols/index.ts +0 -7
  30. package/ts/proxies/smart-proxy/socket-handler-server.ts +6 -0
  31. package/ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.ts +60 -59
  32. package/ts/routing/index.ts +0 -3
  33. package/dist_ts/core/events/index.d.ts +0 -4
  34. package/dist_ts/core/events/index.js +0 -5
  35. package/dist_ts/core/models/socket-augmentation.d.ts +0 -15
  36. package/dist_ts/core/models/socket-augmentation.js +0 -18
  37. package/dist_ts/core/utils/async-utils.d.ts +0 -81
  38. package/dist_ts/core/utils/async-utils.js +0 -216
  39. package/dist_ts/core/utils/binary-heap.d.ts +0 -73
  40. package/dist_ts/core/utils/binary-heap.js +0 -193
  41. package/dist_ts/core/utils/enhanced-connection-pool.d.ts +0 -110
  42. package/dist_ts/core/utils/enhanced-connection-pool.js +0 -325
  43. package/dist_ts/core/utils/fs-utils.d.ts +0 -144
  44. package/dist_ts/core/utils/fs-utils.js +0 -252
  45. package/dist_ts/core/utils/ip-utils.d.ts +0 -69
  46. package/dist_ts/core/utils/ip-utils.js +0 -270
  47. package/dist_ts/core/utils/lifecycle-component.d.ts +0 -59
  48. package/dist_ts/core/utils/lifecycle-component.js +0 -211
  49. package/dist_ts/core/utils/log-deduplicator.d.ts +0 -39
  50. package/dist_ts/core/utils/log-deduplicator.js +0 -305
  51. package/dist_ts/core/utils/security-utils.d.ts +0 -111
  52. package/dist_ts/core/utils/security-utils.js +0 -212
  53. package/dist_ts/core/utils/shared-security-manager.d.ts +0 -128
  54. package/dist_ts/core/utils/shared-security-manager.js +0 -362
  55. package/dist_ts/core/utils/socket-utils.d.ts +0 -63
  56. package/dist_ts/core/utils/socket-utils.js +0 -249
  57. package/dist_ts/core/utils/template-utils.d.ts +0 -37
  58. package/dist_ts/core/utils/template-utils.js +0 -104
  59. package/dist_ts/core/utils/validation-utils.d.ts +0 -61
  60. package/dist_ts/core/utils/validation-utils.js +0 -149
  61. package/dist_ts/core/utils/websocket-utils.d.ts +0 -22
  62. package/dist_ts/core/utils/websocket-utils.js +0 -30
  63. package/dist_ts/detection/detectors/http-detector.d.ts +0 -33
  64. package/dist_ts/detection/detectors/http-detector.js +0 -101
  65. package/dist_ts/detection/detectors/quick-detector.d.ts +0 -28
  66. package/dist_ts/detection/detectors/quick-detector.js +0 -131
  67. package/dist_ts/detection/detectors/routing-extractor.d.ts +0 -28
  68. package/dist_ts/detection/detectors/routing-extractor.js +0 -122
  69. package/dist_ts/detection/detectors/tls-detector.d.ts +0 -47
  70. package/dist_ts/detection/detectors/tls-detector.js +0 -183
  71. package/dist_ts/detection/index.d.ts +0 -17
  72. package/dist_ts/detection/index.js +0 -22
  73. package/dist_ts/detection/models/detection-types.d.ts +0 -87
  74. package/dist_ts/detection/models/detection-types.js +0 -5
  75. package/dist_ts/detection/models/interfaces.d.ts +0 -97
  76. package/dist_ts/detection/models/interfaces.js +0 -5
  77. package/dist_ts/detection/protocol-detector.d.ts +0 -79
  78. package/dist_ts/detection/protocol-detector.js +0 -253
  79. package/dist_ts/detection/utils/buffer-utils.d.ts +0 -61
  80. package/dist_ts/detection/utils/buffer-utils.js +0 -127
  81. package/dist_ts/detection/utils/fragment-manager.d.ts +0 -31
  82. package/dist_ts/detection/utils/fragment-manager.js +0 -53
  83. package/dist_ts/detection/utils/parser-utils.d.ts +0 -42
  84. package/dist_ts/detection/utils/parser-utils.js +0 -63
  85. package/dist_ts/protocols/common/fragment-handler.d.ts +0 -73
  86. package/dist_ts/protocols/common/fragment-handler.js +0 -121
  87. package/dist_ts/protocols/common/index.d.ts +0 -7
  88. package/dist_ts/protocols/common/index.js +0 -8
  89. package/dist_ts/protocols/common/types.d.ts +0 -68
  90. package/dist_ts/protocols/common/types.js +0 -7
  91. package/dist_ts/protocols/http/parser.d.ts +0 -58
  92. package/dist_ts/protocols/http/parser.js +0 -184
  93. package/dist_ts/protocols/proxy/index.d.ts +0 -5
  94. package/dist_ts/protocols/proxy/index.js +0 -6
  95. package/dist_ts/protocols/proxy/types.d.ts +0 -47
  96. package/dist_ts/protocols/proxy/types.js +0 -6
  97. package/dist_ts/protocols/tls/alerts/index.d.ts +0 -4
  98. package/dist_ts/protocols/tls/alerts/index.js +0 -5
  99. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +0 -150
  100. package/dist_ts/protocols/tls/alerts/tls-alert.js +0 -226
  101. package/dist_ts/protocols/tls/index.d.ts +0 -12
  102. package/dist_ts/protocols/tls/index.js +0 -27
  103. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +0 -100
  104. package/dist_ts/protocols/tls/sni/client-hello-parser.js +0 -463
  105. package/dist_ts/protocols/tls/sni/index.d.ts +0 -5
  106. package/dist_ts/protocols/tls/sni/index.js +0 -6
  107. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +0 -58
  108. package/dist_ts/protocols/tls/sni/sni-extraction.js +0 -275
  109. package/dist_ts/protocols/tls/utils/index.d.ts +0 -4
  110. package/dist_ts/protocols/tls/utils/index.js +0 -5
  111. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +0 -158
  112. package/dist_ts/protocols/tls/utils/tls-utils.js +0 -187
  113. package/dist_ts/protocols/websocket/constants.d.ts +0 -55
  114. package/dist_ts/protocols/websocket/constants.js +0 -58
  115. package/dist_ts/protocols/websocket/index.d.ts +0 -7
  116. package/dist_ts/protocols/websocket/index.js +0 -8
  117. package/dist_ts/protocols/websocket/types.d.ts +0 -47
  118. package/dist_ts/protocols/websocket/types.js +0 -5
  119. package/dist_ts/protocols/websocket/utils.d.ts +0 -25
  120. package/dist_ts/protocols/websocket/utils.js +0 -103
  121. package/dist_ts/routing/router/http-router.d.ts +0 -89
  122. package/dist_ts/routing/router/http-router.js +0 -205
  123. package/dist_ts/routing/router/index.d.ts +0 -5
  124. package/dist_ts/routing/router/index.js +0 -6
  125. package/dist_ts/tls/index.d.ts +0 -16
  126. package/dist_ts/tls/index.js +0 -24
  127. package/dist_ts/tls/sni/index.d.ts +0 -4
  128. package/dist_ts/tls/sni/index.js +0 -5
  129. package/dist_ts/tls/sni/sni-handler.d.ts +0 -154
  130. package/dist_ts/tls/sni/sni-handler.js +0 -191
  131. package/ts/core/events/index.ts +0 -3
  132. package/ts/core/models/socket-augmentation.ts +0 -38
  133. package/ts/core/utils/async-utils.ts +0 -275
  134. package/ts/core/utils/binary-heap.ts +0 -225
  135. package/ts/core/utils/enhanced-connection-pool.ts +0 -425
  136. package/ts/core/utils/fs-utils.ts +0 -270
  137. package/ts/core/utils/ip-utils.ts +0 -303
  138. package/ts/core/utils/lifecycle-component.ts +0 -251
  139. package/ts/core/utils/log-deduplicator.ts +0 -370
  140. package/ts/core/utils/security-utils.ts +0 -305
  141. package/ts/core/utils/shared-security-manager.ts +0 -470
  142. package/ts/core/utils/socket-utils.ts +0 -322
  143. package/ts/core/utils/template-utils.ts +0 -124
  144. package/ts/core/utils/validation-utils.ts +0 -177
  145. package/ts/core/utils/websocket-utils.ts +0 -33
  146. package/ts/detection/detectors/http-detector.ts +0 -127
  147. package/ts/detection/detectors/quick-detector.ts +0 -148
  148. package/ts/detection/detectors/routing-extractor.ts +0 -147
  149. package/ts/detection/detectors/tls-detector.ts +0 -223
  150. package/ts/detection/index.ts +0 -25
  151. package/ts/detection/models/detection-types.ts +0 -102
  152. package/ts/detection/models/interfaces.ts +0 -115
  153. package/ts/detection/protocol-detector.ts +0 -319
  154. package/ts/detection/utils/buffer-utils.ts +0 -141
  155. package/ts/detection/utils/fragment-manager.ts +0 -64
  156. package/ts/detection/utils/parser-utils.ts +0 -77
  157. package/ts/protocols/common/fragment-handler.ts +0 -167
  158. package/ts/protocols/common/index.ts +0 -8
  159. package/ts/protocols/common/types.ts +0 -76
  160. package/ts/protocols/http/parser.ts +0 -219
  161. package/ts/protocols/proxy/index.ts +0 -6
  162. package/ts/protocols/proxy/types.ts +0 -53
  163. package/ts/protocols/tls/alerts/index.ts +0 -3
  164. package/ts/protocols/tls/alerts/tls-alert.ts +0 -259
  165. package/ts/protocols/tls/index.ts +0 -37
  166. package/ts/protocols/tls/sni/client-hello-parser.ts +0 -629
  167. package/ts/protocols/tls/sni/index.ts +0 -6
  168. package/ts/protocols/tls/sni/sni-extraction.ts +0 -353
  169. package/ts/protocols/tls/utils/index.ts +0 -3
  170. package/ts/protocols/tls/utils/tls-utils.ts +0 -201
  171. package/ts/protocols/websocket/constants.ts +0 -60
  172. package/ts/protocols/websocket/index.ts +0 -8
  173. package/ts/protocols/websocket/types.ts +0 -53
  174. package/ts/protocols/websocket/utils.ts +0 -98
  175. package/ts/routing/router/http-router.ts +0 -266
  176. package/ts/routing/router/index.ts +0 -7
  177. package/ts/tls/index.ts +0 -29
  178. package/ts/tls/sni/index.ts +0 -3
  179. package/ts/tls/sni/sni-handler.ts +0 -264
@@ -1,253 +0,0 @@
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.connectionProtocols = new Map();
15
- this.fragmentManager = new DetectionFragmentManager();
16
- this.tlsDetector = new TlsDetector();
17
- this.httpDetector = new HttpDetector(this.fragmentManager);
18
- }
19
- static getInstance() {
20
- if (!this.instance) {
21
- this.instance = new ProtocolDetector();
22
- }
23
- return this.instance;
24
- }
25
- /**
26
- * Detect protocol from buffer data
27
- */
28
- static async detect(buffer, options) {
29
- return this.getInstance().detectInstance(buffer, options);
30
- }
31
- async detectInstance(buffer, options) {
32
- // Quick sanity check
33
- if (!buffer || buffer.length === 0) {
34
- return {
35
- protocol: 'unknown',
36
- connectionInfo: { protocol: 'unknown' },
37
- isComplete: true
38
- };
39
- }
40
- // Try TLS detection first (more specific)
41
- if (this.tlsDetector.canHandle(buffer)) {
42
- const tlsResult = this.tlsDetector.detect(buffer, options);
43
- if (tlsResult) {
44
- return tlsResult;
45
- }
46
- }
47
- // Try HTTP detection
48
- if (this.httpDetector.canHandle(buffer)) {
49
- const httpResult = this.httpDetector.detect(buffer, options);
50
- if (httpResult) {
51
- return httpResult;
52
- }
53
- }
54
- // Neither TLS nor HTTP
55
- return {
56
- protocol: 'unknown',
57
- connectionInfo: { protocol: 'unknown' },
58
- isComplete: true
59
- };
60
- }
61
- /**
62
- * Detect protocol with connection tracking for fragmented data
63
- * @deprecated Use detectWithContext instead
64
- */
65
- static async detectWithConnectionTracking(buffer, connectionId, options) {
66
- // Convert connection ID to context
67
- const context = {
68
- id: connectionId,
69
- sourceIp: 'unknown',
70
- sourcePort: 0,
71
- destIp: 'unknown',
72
- destPort: 0,
73
- timestamp: Date.now()
74
- };
75
- return this.getInstance().detectWithContextInstance(buffer, context, options);
76
- }
77
- /**
78
- * Detect protocol with connection context for fragmented data
79
- */
80
- static async detectWithContext(buffer, context, options) {
81
- return this.getInstance().detectWithContextInstance(buffer, context, options);
82
- }
83
- async detectWithContextInstance(buffer, context, options) {
84
- // Quick sanity check
85
- if (!buffer || buffer.length === 0) {
86
- return {
87
- protocol: 'unknown',
88
- connectionInfo: { protocol: 'unknown' },
89
- isComplete: true
90
- };
91
- }
92
- const connectionId = DetectionFragmentManager.createConnectionId(context);
93
- // Check if we already know the protocol for this connection
94
- const knownEntry = this.connectionProtocols.get(connectionId);
95
- const knownProtocol = knownEntry?.protocol;
96
- if (knownProtocol === 'http') {
97
- const result = this.httpDetector.detectWithContext(buffer, context, options);
98
- if (result) {
99
- if (result.isComplete) {
100
- this.connectionProtocols.delete(connectionId);
101
- }
102
- return result;
103
- }
104
- }
105
- else if (knownProtocol === 'tls') {
106
- // Handle TLS with fragment accumulation
107
- const handler = this.fragmentManager.getHandler('tls');
108
- const fragmentResult = handler.addFragment(connectionId, buffer);
109
- if (fragmentResult.error) {
110
- handler.complete(connectionId);
111
- this.connectionProtocols.delete(connectionId);
112
- return {
113
- protocol: 'unknown',
114
- connectionInfo: { protocol: 'unknown' },
115
- isComplete: true
116
- };
117
- }
118
- const result = this.tlsDetector.detect(fragmentResult.buffer, options);
119
- if (result) {
120
- if (result.isComplete) {
121
- handler.complete(connectionId);
122
- this.connectionProtocols.delete(connectionId);
123
- }
124
- return result;
125
- }
126
- }
127
- // If we don't know the protocol yet, try to detect it
128
- if (!knownProtocol) {
129
- // First peek to determine protocol type
130
- if (this.tlsDetector.canHandle(buffer)) {
131
- this.connectionProtocols.set(connectionId, { protocol: 'tls', createdAt: Date.now() });
132
- // Handle TLS with fragment accumulation
133
- const handler = this.fragmentManager.getHandler('tls');
134
- const fragmentResult = handler.addFragment(connectionId, buffer);
135
- if (fragmentResult.error) {
136
- handler.complete(connectionId);
137
- this.connectionProtocols.delete(connectionId);
138
- return {
139
- protocol: 'unknown',
140
- connectionInfo: { protocol: 'unknown' },
141
- isComplete: true
142
- };
143
- }
144
- const result = this.tlsDetector.detect(fragmentResult.buffer, options);
145
- if (result) {
146
- if (result.isComplete) {
147
- handler.complete(connectionId);
148
- this.connectionProtocols.delete(connectionId);
149
- }
150
- return result;
151
- }
152
- }
153
- if (this.httpDetector.canHandle(buffer)) {
154
- this.connectionProtocols.set(connectionId, { protocol: 'http', createdAt: Date.now() });
155
- const result = this.httpDetector.detectWithContext(buffer, context, options);
156
- if (result) {
157
- if (result.isComplete) {
158
- this.connectionProtocols.delete(connectionId);
159
- }
160
- return result;
161
- }
162
- }
163
- }
164
- // Can't determine protocol
165
- return {
166
- protocol: 'unknown',
167
- connectionInfo: { protocol: 'unknown' },
168
- isComplete: false,
169
- bytesNeeded: Math.max(this.tlsDetector.getMinimumBytes(), this.httpDetector.getMinimumBytes())
170
- };
171
- }
172
- /**
173
- * Clean up resources
174
- */
175
- static cleanup() {
176
- this.getInstance().cleanupInstance();
177
- }
178
- cleanupInstance() {
179
- this.fragmentManager.cleanup();
180
- // Remove stale connectionProtocols entries (abandoned handshakes, port scanners)
181
- const maxAge = 30_000; // 30 seconds
182
- const now = Date.now();
183
- for (const [id, entry] of this.connectionProtocols) {
184
- if (now - entry.createdAt > maxAge) {
185
- this.connectionProtocols.delete(id);
186
- }
187
- }
188
- }
189
- /**
190
- * Destroy detector instance
191
- */
192
- static destroy() {
193
- this.getInstance().destroyInstance();
194
- this.instance = null;
195
- }
196
- destroyInstance() {
197
- this.fragmentManager.destroy();
198
- this.connectionProtocols.clear();
199
- }
200
- /**
201
- * Clean up old connection tracking entries
202
- *
203
- * @param _maxAge Maximum age in milliseconds (default: 30 seconds)
204
- */
205
- static cleanupConnections(_maxAge = 30000) {
206
- this.getInstance().cleanupInstance();
207
- }
208
- /**
209
- * Clean up fragments for a specific connection
210
- */
211
- static cleanupConnection(context) {
212
- const instance = this.getInstance();
213
- const connectionId = DetectionFragmentManager.createConnectionId(context);
214
- // Clean up both TLS and HTTP fragments for this connection
215
- instance.fragmentManager.getHandler('tls').complete(connectionId);
216
- instance.fragmentManager.getHandler('http').complete(connectionId);
217
- // Remove from connection protocols tracking
218
- instance.connectionProtocols.delete(connectionId);
219
- }
220
- /**
221
- * Extract domain from connection info
222
- */
223
- static extractDomain(connectionInfo) {
224
- return connectionInfo.domain || connectionInfo.sni || connectionInfo.host;
225
- }
226
- /**
227
- * Create a connection ID from connection parameters
228
- * @deprecated Use createConnectionContext instead
229
- */
230
- static createConnectionId(params) {
231
- // If socketId is provided, use it
232
- if (params.socketId) {
233
- return params.socketId;
234
- }
235
- // Otherwise create from connection tuple
236
- const { sourceIp = 'unknown', sourcePort = 0, destIp = 'unknown', destPort = 0 } = params;
237
- return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
238
- }
239
- /**
240
- * Create a connection context from parameters
241
- */
242
- static createConnectionContext(params) {
243
- return {
244
- id: params.socketId,
245
- sourceIp: params.sourceIp || 'unknown',
246
- sourcePort: params.sourcePort || 0,
247
- destIp: params.destIp || 'unknown',
248
- destPort: params.destPort || 0,
249
- timestamp: Date.now()
250
- };
251
- }
252
- }
253
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wtZGV0ZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXRlY3Rpb24vcHJvdG9jb2wtZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBTzNCO1FBRlEsd0JBQW1CLEdBQWlFLElBQUksR0FBRyxFQUFFLENBQUM7UUFHcEcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLE9BQTJCO1FBQzdELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBYyxFQUFFLE9BQTJCO1FBQ3RFLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTztnQkFDTCxRQUFRLEVBQUUsU0FBUztnQkFDbkIsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtnQkFDdkMsVUFBVSxFQUFFLElBQUk7YUFDakIsQ0FBQztRQUNKLENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMzRCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixPQUFPO1lBQ0wsUUFBUSxFQUFFLFNBQVM7WUFDbkIsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtZQUN2QyxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQ3ZDLE1BQWMsRUFDZCxZQUFvQixFQUNwQixPQUEyQjtRQUUzQixtQ0FBbUM7UUFDbkMsTUFBTSxPQUFPLEdBQXVCO1lBQ2xDLEVBQUUsRUFBRSxZQUFZO1lBQ2hCLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFVBQVUsRUFBRSxDQUFDO1lBQ2IsTUFBTSxFQUFFLFNBQVM7WUFDakIsUUFBUSxFQUFFLENBQUM7WUFDWCxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUN0QixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUM1QixNQUFjLEVBQ2QsT0FBMkIsRUFDM0IsT0FBMkI7UUFFM0IsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8sS0FBSyxDQUFDLHlCQUF5QixDQUNyQyxNQUFjLEVBQ2QsT0FBMkIsRUFDM0IsT0FBMkI7UUFFM0IscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO2dCQUNMLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO2dCQUN2QyxVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFFLDREQUE0RDtRQUM1RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlELE1BQU0sYUFBYSxHQUFHLFVBQVUsRUFBRSxRQUFRLENBQUM7UUFFM0MsSUFBSSxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdFLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2hELENBQUM7Z0JBQ0QsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLGFBQWEsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQyx3Q0FBd0M7WUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFakUsSUFBSSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlDLE9BQU87b0JBQ0wsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7b0JBQ3ZDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEUsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztnQkFDRCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsd0NBQXdDO1lBQ3hDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN2Rix3Q0FBd0M7Z0JBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFakUsSUFBSSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzlDLE9BQU87d0JBQ0wsUUFBUSxFQUFFLFNBQVM7d0JBQ25CLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7d0JBQ3ZDLFVBQVUsRUFBRSxJQUFJO3FCQUNqQixDQUFDO2dCQUNKLENBQUM7Z0JBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDaEQsQ0FBQztvQkFDRCxPQUFPLE1BQU0sQ0FBQztnQkFDaEIsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDeEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM3RSxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNYLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUN0QixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNoRCxDQUFDO29CQUNELE9BQU8sTUFBTSxDQUFDO2dCQUNoQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsT0FBTztZQUNMLFFBQVEsRUFBRSxTQUFTO1lBQ25CLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7WUFDdkMsVUFBVSxFQUFFLEtBQUs7WUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEVBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQ3BDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPO1FBQ1osSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0IsaUZBQWlGO1FBQ2pGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLGFBQWE7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNuRCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE9BQU87UUFDWixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFXLENBQUM7SUFDOUIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBa0IsS0FBSztRQUMvQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQTJCO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFlBQVksR0FBRyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxRSwyREFBMkQ7UUFDM0QsUUFBUSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLFFBQVEsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVuRSw0Q0FBNEM7UUFDNUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLGNBQW1CO1FBQ3RDLE9BQU8sY0FBYyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQU16QjtRQUNDLGtDQUFrQztRQUNsQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDekIsQ0FBQztRQUVELHlDQUF5QztRQUN6QyxNQUFNLEVBQUUsUUFBUSxHQUFHLFNBQVMsRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUMxRixPQUFPLEdBQUcsUUFBUSxJQUFJLFVBQVUsSUFBSSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE1BTTlCO1FBQ0MsT0FBTztZQUNMLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxTQUFTO1lBQ3RDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUM7WUFDbEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksU0FBUztZQUNsQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDO1lBQzlCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQ3RCLENBQUM7SUFDSixDQUFDO0NBQ0YifQ==
@@ -1,61 +0,0 @@
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;
@@ -1,127 +0,0 @@
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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
@@ -1,31 +0,0 @@
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
- }
@@ -1,53 +0,0 @@
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
@@ -1,42 +0,0 @@
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;
@@ -1,63 +0,0 @@
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=