@push.rocks/smartproxy 20.0.1 → 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 (164) hide show
  1. package/changelog.md +26 -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 -1
  35. package/dist_ts/index.js +3 -2
  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/models/route-types.js +1 -1
  92. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
  93. package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
  94. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +1 -2
  95. package/dist_ts/proxies/smart-proxy/utils/index.js +3 -4
  96. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +112 -8
  97. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +231 -76
  98. package/dist_ts/tls/index.d.ts +5 -7
  99. package/dist_ts/tls/index.js +8 -11
  100. package/dist_ts/tls/sni/client-hello-parser.js +3 -2
  101. package/dist_ts/tls/sni/sni-handler.js +4 -4
  102. package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
  103. package/dist_ts/tls/utils/tls-utils.js +4 -116
  104. package/package.json +17 -8
  105. package/readme.md +471 -2345
  106. package/readme.plan.md +0 -0
  107. package/ts/core/utils/proxy-protocol.ts +14 -131
  108. package/ts/core/utils/websocket-utils.ts +12 -60
  109. package/ts/detection/detectors/http-detector.ts +114 -0
  110. package/ts/detection/detectors/quick-detector.ts +148 -0
  111. package/ts/detection/detectors/routing-extractor.ts +147 -0
  112. package/ts/detection/detectors/tls-detector.ts +120 -0
  113. package/ts/detection/index.ts +25 -0
  114. package/ts/detection/models/detection-types.ts +102 -0
  115. package/ts/detection/models/interfaces.ts +115 -0
  116. package/ts/detection/protocol-detector.ts +230 -0
  117. package/ts/detection/utils/buffer-utils.ts +141 -0
  118. package/ts/detection/utils/fragment-manager.ts +64 -0
  119. package/ts/detection/utils/parser-utils.ts +77 -0
  120. package/ts/index.ts +3 -2
  121. package/ts/protocols/common/fragment-handler.ts +163 -0
  122. package/ts/protocols/common/index.ts +8 -0
  123. package/ts/protocols/common/types.ts +76 -0
  124. package/ts/protocols/http/constants.ts +219 -0
  125. package/ts/protocols/http/index.ts +8 -0
  126. package/ts/protocols/http/parser.ts +219 -0
  127. package/ts/protocols/http/types.ts +70 -0
  128. package/ts/protocols/index.ts +12 -0
  129. package/ts/protocols/proxy/index.ts +7 -0
  130. package/ts/protocols/proxy/parser.ts +183 -0
  131. package/ts/protocols/proxy/types.ts +53 -0
  132. package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
  133. package/ts/protocols/tls/index.ts +37 -0
  134. package/ts/protocols/tls/sni/index.ts +6 -0
  135. package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
  136. package/ts/protocols/websocket/constants.ts +60 -0
  137. package/ts/protocols/websocket/index.ts +8 -0
  138. package/ts/protocols/websocket/types.ts +53 -0
  139. package/ts/protocols/websocket/utils.ts +98 -0
  140. package/ts/proxies/http-proxy/models/http-types.ts +29 -46
  141. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -1
  142. package/ts/proxies/smart-proxy/models/route-types.ts +0 -1
  143. package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
  144. package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
  145. package/ts/proxies/smart-proxy/utils/index.ts +2 -13
  146. package/ts/proxies/smart-proxy/utils/route-helpers.ts +323 -86
  147. package/ts/tls/index.ts +8 -12
  148. package/ts/tls/sni/sni-handler.ts +3 -3
  149. package/ts/forwarding/config/forwarding-types.ts +0 -76
  150. package/ts/forwarding/config/index.ts +0 -26
  151. package/ts/forwarding/factory/forwarding-factory.ts +0 -189
  152. package/ts/forwarding/factory/index.ts +0 -5
  153. package/ts/forwarding/handlers/base-handler.ts +0 -155
  154. package/ts/forwarding/handlers/http-handler.ts +0 -163
  155. package/ts/forwarding/handlers/https-passthrough-handler.ts +0 -185
  156. package/ts/forwarding/handlers/https-terminate-to-http-handler.ts +0 -312
  157. package/ts/forwarding/handlers/https-terminate-to-https-handler.ts +0 -297
  158. package/ts/forwarding/handlers/index.ts +0 -9
  159. package/ts/forwarding/index.ts +0 -35
  160. package/ts/proxies/smart-proxy/utils/route-patterns.ts +0 -403
  161. /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
  162. /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
  163. /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
  164. /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Type definitions for protocol detection
3
+ */
4
+ /**
5
+ * Supported protocol types that can be detected
6
+ */
7
+ export type TProtocolType = 'tls' | 'http' | 'unknown';
8
+ /**
9
+ * HTTP method types
10
+ */
11
+ export type THttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | 'CONNECT' | 'TRACE';
12
+ /**
13
+ * TLS version identifiers
14
+ */
15
+ export type TTlsVersion = 'SSLv3' | 'TLSv1.0' | 'TLSv1.1' | 'TLSv1.2' | 'TLSv1.3';
16
+ /**
17
+ * Connection information extracted from protocol detection
18
+ */
19
+ export interface IConnectionInfo {
20
+ /**
21
+ * The detected protocol type
22
+ */
23
+ protocol: TProtocolType;
24
+ /**
25
+ * Domain/hostname extracted from the connection
26
+ * - For TLS: from SNI extension
27
+ * - For HTTP: from Host header
28
+ */
29
+ domain?: string;
30
+ /**
31
+ * HTTP-specific fields
32
+ */
33
+ method?: THttpMethod;
34
+ path?: string;
35
+ httpVersion?: string;
36
+ headers?: Record<string, string>;
37
+ /**
38
+ * TLS-specific fields
39
+ */
40
+ tlsVersion?: TTlsVersion;
41
+ sni?: string;
42
+ alpn?: string[];
43
+ cipherSuites?: number[];
44
+ }
45
+ /**
46
+ * Result of protocol detection
47
+ */
48
+ export interface IDetectionResult {
49
+ /**
50
+ * The detected protocol type
51
+ */
52
+ protocol: TProtocolType;
53
+ /**
54
+ * Extracted connection information
55
+ */
56
+ connectionInfo: IConnectionInfo;
57
+ /**
58
+ * Any remaining buffer data after detection headers
59
+ * This can be used to continue processing the stream
60
+ */
61
+ remainingBuffer?: Buffer;
62
+ /**
63
+ * Whether the detection is complete or needs more data
64
+ */
65
+ isComplete: boolean;
66
+ /**
67
+ * Minimum bytes needed for complete detection (if incomplete)
68
+ */
69
+ bytesNeeded?: number;
70
+ }
71
+ /**
72
+ * Options for protocol detection
73
+ */
74
+ export interface IDetectionOptions {
75
+ /**
76
+ * Maximum bytes to buffer for detection (default: 8192)
77
+ */
78
+ maxBufferSize?: number;
79
+ /**
80
+ * Timeout for detection in milliseconds (default: 5000)
81
+ */
82
+ timeout?: number;
83
+ /**
84
+ * Whether to extract full headers or just essential info
85
+ */
86
+ extractFullHeaders?: boolean;
87
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Type definitions for protocol detection
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0aW9uLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZGV0ZWN0aW9uL21vZGVscy9kZXRlY3Rpb24tdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUcifQ==
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Interface definitions for protocol detection components
3
+ */
4
+ import type { IDetectionResult, IDetectionOptions } from './detection-types.js';
5
+ /**
6
+ * Interface for protocol detectors
7
+ */
8
+ export interface IProtocolDetector {
9
+ /**
10
+ * Detect protocol from buffer data
11
+ * @param buffer The buffer to analyze
12
+ * @param options Detection options
13
+ * @returns Detection result or null if protocol cannot be determined
14
+ */
15
+ detect(buffer: Buffer, options?: IDetectionOptions): IDetectionResult | null;
16
+ /**
17
+ * Check if buffer potentially contains this protocol
18
+ * @param buffer The buffer to check
19
+ * @returns True if buffer might contain this protocol
20
+ */
21
+ canHandle(buffer: Buffer): boolean;
22
+ /**
23
+ * Get the minimum bytes needed for detection
24
+ */
25
+ getMinimumBytes(): number;
26
+ }
27
+ /**
28
+ * Interface for connection tracking during fragmented detection
29
+ */
30
+ export interface IConnectionTracker {
31
+ /**
32
+ * Connection identifier
33
+ */
34
+ id: string;
35
+ /**
36
+ * Accumulated buffer data
37
+ */
38
+ buffer: Buffer;
39
+ /**
40
+ * Timestamp of first data
41
+ */
42
+ startTime: number;
43
+ /**
44
+ * Current detection state
45
+ */
46
+ state: 'detecting' | 'complete' | 'failed';
47
+ /**
48
+ * Partial detection result (if any)
49
+ */
50
+ partialResult?: Partial<IDetectionResult>;
51
+ }
52
+ /**
53
+ * Interface for buffer accumulator (handles fragmented data)
54
+ */
55
+ export interface IBufferAccumulator {
56
+ /**
57
+ * Add data to accumulator
58
+ */
59
+ append(data: Buffer): void;
60
+ /**
61
+ * Get accumulated buffer
62
+ */
63
+ getBuffer(): Buffer;
64
+ /**
65
+ * Get buffer length
66
+ */
67
+ length(): number;
68
+ /**
69
+ * Clear accumulated data
70
+ */
71
+ clear(): void;
72
+ /**
73
+ * Check if accumulator has enough data
74
+ */
75
+ hasMinimumBytes(minBytes: number): boolean;
76
+ }
77
+ /**
78
+ * Detection events
79
+ */
80
+ export interface IDetectionEvents {
81
+ /**
82
+ * Emitted when protocol is successfully detected
83
+ */
84
+ detected: (result: IDetectionResult) => void;
85
+ /**
86
+ * Emitted when detection fails
87
+ */
88
+ failed: (error: Error) => void;
89
+ /**
90
+ * Emitted when detection times out
91
+ */
92
+ timeout: () => void;
93
+ /**
94
+ * Emitted when more data is needed
95
+ */
96
+ needMoreData: (bytesNeeded: number) => void;
97
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Interface definitions for protocol detection components
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2RldGVjdGlvbi9tb2RlbHMvaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRyJ9
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Protocol Detector V2
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 - V2
10
+ */
11
+ export declare class ProtocolDetectorV2 {
12
+ private fragmentManager;
13
+ private tlsDetector;
14
+ private httpDetector;
15
+ constructor();
16
+ /**
17
+ * Detect protocol from buffer data
18
+ */
19
+ detect(buffer: Buffer, options?: IDetectionOptions): Promise<IDetectionResult>;
20
+ /**
21
+ * Detect protocol with connection context for fragmented data
22
+ */
23
+ detectWithContext(buffer: Buffer, context: IConnectionContext, options?: IDetectionOptions): Promise<IDetectionResult>;
24
+ /**
25
+ * Clean up resources
26
+ */
27
+ cleanup(): void;
28
+ /**
29
+ * Destroy detector instance
30
+ */
31
+ destroy(): void;
32
+ /**
33
+ * Extract domain from connection info
34
+ */
35
+ static extractDomain(connectionInfo: any): string | undefined;
36
+ /**
37
+ * Create a connection context from parameters
38
+ */
39
+ static createConnectionContext(params: {
40
+ sourceIp?: string;
41
+ sourcePort?: number;
42
+ destIp?: string;
43
+ destPort?: number;
44
+ socketId?: string;
45
+ }): IConnectionContext;
46
+ }
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Protocol Detector V2
3
+ *
4
+ * Simplified protocol detection using the new architecture
5
+ */
6
+ import { TlsDetectorV2 } from './detectors/tls-detector-v2.js';
7
+ import { HttpDetectorV2 } from './detectors/http-detector-v2.js';
8
+ import { DetectionFragmentManager } from './utils/fragment-manager.js';
9
+ /**
10
+ * Main protocol detector class - V2
11
+ */
12
+ export class ProtocolDetectorV2 {
13
+ constructor() {
14
+ this.fragmentManager = new DetectionFragmentManager();
15
+ this.tlsDetector = new TlsDetectorV2(this.fragmentManager);
16
+ this.httpDetector = new HttpDetectorV2(this.fragmentManager);
17
+ }
18
+ /**
19
+ * Detect protocol from buffer data
20
+ */
21
+ async detect(buffer, options) {
22
+ // Quick sanity check
23
+ if (!buffer || buffer.length === 0) {
24
+ return {
25
+ protocol: 'unknown',
26
+ connectionInfo: { protocol: 'unknown' },
27
+ isComplete: true
28
+ };
29
+ }
30
+ // Try TLS detection first (more specific)
31
+ if (this.tlsDetector.canHandle(buffer)) {
32
+ const tlsResult = this.tlsDetector.detect(buffer, options);
33
+ if (tlsResult) {
34
+ return tlsResult;
35
+ }
36
+ }
37
+ // Try HTTP detection
38
+ if (this.httpDetector.canHandle(buffer)) {
39
+ const httpResult = this.httpDetector.detect(buffer, options);
40
+ if (httpResult) {
41
+ return httpResult;
42
+ }
43
+ }
44
+ // Neither TLS nor HTTP
45
+ return {
46
+ protocol: 'unknown',
47
+ connectionInfo: { protocol: 'unknown' },
48
+ isComplete: true
49
+ };
50
+ }
51
+ /**
52
+ * Detect protocol with connection context for fragmented data
53
+ */
54
+ async detectWithContext(buffer, context, options) {
55
+ // Quick sanity check
56
+ if (!buffer || buffer.length === 0) {
57
+ return {
58
+ protocol: 'unknown',
59
+ connectionInfo: { protocol: 'unknown' },
60
+ isComplete: true
61
+ };
62
+ }
63
+ // First peek to determine protocol type
64
+ if (this.tlsDetector.canHandle(buffer)) {
65
+ const result = this.tlsDetector.detectWithContext(buffer, context, options);
66
+ if (result) {
67
+ return result;
68
+ }
69
+ }
70
+ if (this.httpDetector.canHandle(buffer)) {
71
+ const result = this.httpDetector.detectWithContext(buffer, context, options);
72
+ if (result) {
73
+ return result;
74
+ }
75
+ }
76
+ // Can't determine protocol
77
+ return {
78
+ protocol: 'unknown',
79
+ connectionInfo: { protocol: 'unknown' },
80
+ isComplete: false,
81
+ bytesNeeded: Math.max(this.tlsDetector.getMinimumBytes(), this.httpDetector.getMinimumBytes())
82
+ };
83
+ }
84
+ /**
85
+ * Clean up resources
86
+ */
87
+ cleanup() {
88
+ this.fragmentManager.cleanup();
89
+ }
90
+ /**
91
+ * Destroy detector instance
92
+ */
93
+ destroy() {
94
+ this.fragmentManager.destroy();
95
+ }
96
+ /**
97
+ * Extract domain from connection info
98
+ */
99
+ static extractDomain(connectionInfo) {
100
+ return connectionInfo.domain || connectionInfo.sni || connectionInfo.host;
101
+ }
102
+ /**
103
+ * Create a connection context from parameters
104
+ */
105
+ static createConnectionContext(params) {
106
+ return {
107
+ id: params.socketId,
108
+ sourceIp: params.sourceIp || 'unknown',
109
+ sourcePort: params.sourcePort || 0,
110
+ destIp: params.destIp || 'unknown',
111
+ destPort: params.destPort || 0,
112
+ timestamp: Date.now()
113
+ };
114
+ }
115
+ }
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wtZGV0ZWN0b3ItdjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXRlY3Rpb24vcHJvdG9jb2wtZGV0ZWN0b3ItdjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUlILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBSzdCO1FBQ0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFjLEVBQUUsT0FBMkI7UUFDdEQscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO2dCQUNMLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO2dCQUN2QyxVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDO1FBQ0osQ0FBQztRQUVELDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FB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
@@ -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(this.fragmentManager);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wtZGV0ZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXRlY3Rpb24vcHJvdG9jb2wtZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCO1FBQ0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFjLEVBQUUsT0FBMkI7UUFDN0QsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFjLEVBQUUsT0FBMkI7UUFDdEUscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxD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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;