@push.rocks/smartproxy 21.0.0 → 21.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/changelog.md +18 -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 +55 -0
  17. package/dist_ts/detection/detectors/tls-detector.js +206 -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 +1 -1
  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 +252 -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,206 @@
1
+ /**
2
+ * TLS protocol detector
3
+ */
4
+ import { readUInt16BE, readUInt24BE, BufferAccumulator } from '../utils/buffer-utils.js';
5
+ import { tlsVersionToString } from '../utils/parser-utils.js';
6
+ // Import from protocols
7
+ import { TlsRecordType, TlsHandshakeType, TlsExtensionType } from '../../protocols/tls/index.js';
8
+ // Import TLS utilities for SNI extraction from protocols
9
+ import { SniExtraction } from '../../protocols/tls/sni/sni-extraction.js';
10
+ import { ClientHelloParser } from '../../protocols/tls/sni/client-hello-parser.js';
11
+ /**
12
+ * TLS detector implementation
13
+ */
14
+ export class TlsDetector {
15
+ /**
16
+ * Minimum bytes needed to identify TLS (record header)
17
+ */
18
+ static { this.MIN_TLS_HEADER_SIZE = 5; }
19
+ /**
20
+ * Fragment tracking for incomplete handshakes
21
+ */
22
+ static { this.fragmentedBuffers = new Map(); }
23
+ /**
24
+ * Create connection ID from context
25
+ */
26
+ createConnectionId(context) {
27
+ return `${context.sourceIp || 'unknown'}:${context.sourcePort || 0}->${context.destIp || 'unknown'}:${context.destPort || 0}`;
28
+ }
29
+ /**
30
+ * Detect TLS protocol from buffer
31
+ */
32
+ detect(buffer, options) {
33
+ // Check if buffer is too small
34
+ if (buffer.length < TlsDetector.MIN_TLS_HEADER_SIZE) {
35
+ return null;
36
+ }
37
+ // Check if this is a TLS record
38
+ if (!this.isTlsRecord(buffer)) {
39
+ return null;
40
+ }
41
+ // Extract basic TLS info
42
+ const recordType = buffer[0];
43
+ const tlsMajor = buffer[1];
44
+ const tlsMinor = buffer[2];
45
+ const recordLength = readUInt16BE(buffer, 3);
46
+ // Initialize connection info
47
+ const connectionInfo = {
48
+ protocol: 'tls',
49
+ tlsVersion: tlsVersionToString(tlsMajor, tlsMinor) || undefined
50
+ };
51
+ // If it's a handshake, try to extract more info
52
+ if (recordType === TlsRecordType.HANDSHAKE && buffer.length >= 6) {
53
+ const handshakeType = buffer[5];
54
+ // For ClientHello, extract SNI and other info
55
+ if (handshakeType === TlsHandshakeType.CLIENT_HELLO) {
56
+ // Check if we have the complete handshake
57
+ const totalRecordLength = recordLength + 5; // Including TLS header
58
+ if (buffer.length >= totalRecordLength) {
59
+ // Extract SNI using existing logic
60
+ const sni = SniExtraction.extractSNI(buffer);
61
+ if (sni) {
62
+ connectionInfo.domain = sni;
63
+ connectionInfo.sni = sni;
64
+ }
65
+ // Parse ClientHello for additional info
66
+ const parseResult = ClientHelloParser.parseClientHello(buffer);
67
+ if (parseResult.isValid) {
68
+ // Extract ALPN if present
69
+ const alpnExtension = parseResult.extensions.find(ext => ext.type === TlsExtensionType.APPLICATION_LAYER_PROTOCOL_NEGOTIATION);
70
+ if (alpnExtension) {
71
+ connectionInfo.alpn = this.parseAlpnExtension(alpnExtension.data);
72
+ }
73
+ // Store cipher suites if needed
74
+ if (parseResult.cipherSuites && options?.extractFullHeaders) {
75
+ connectionInfo.cipherSuites = this.parseCipherSuites(parseResult.cipherSuites);
76
+ }
77
+ }
78
+ // Return complete result
79
+ return {
80
+ protocol: 'tls',
81
+ connectionInfo,
82
+ remainingBuffer: buffer.length > totalRecordLength
83
+ ? buffer.subarray(totalRecordLength)
84
+ : undefined,
85
+ isComplete: true
86
+ };
87
+ }
88
+ else {
89
+ // Incomplete handshake
90
+ return {
91
+ protocol: 'tls',
92
+ connectionInfo,
93
+ isComplete: false,
94
+ bytesNeeded: totalRecordLength
95
+ };
96
+ }
97
+ }
98
+ }
99
+ // For other TLS record types, just return basic info
100
+ return {
101
+ protocol: 'tls',
102
+ connectionInfo,
103
+ isComplete: true,
104
+ remainingBuffer: buffer.length > recordLength + 5
105
+ ? buffer.subarray(recordLength + 5)
106
+ : undefined
107
+ };
108
+ }
109
+ /**
110
+ * Check if buffer can be handled by this detector
111
+ */
112
+ canHandle(buffer) {
113
+ return buffer.length >= TlsDetector.MIN_TLS_HEADER_SIZE &&
114
+ this.isTlsRecord(buffer);
115
+ }
116
+ /**
117
+ * Get minimum bytes needed for detection
118
+ */
119
+ getMinimumBytes() {
120
+ return TlsDetector.MIN_TLS_HEADER_SIZE;
121
+ }
122
+ /**
123
+ * Check if buffer contains a valid TLS record
124
+ */
125
+ isTlsRecord(buffer) {
126
+ const recordType = buffer[0];
127
+ // Check for valid record type
128
+ const validTypes = [
129
+ TlsRecordType.CHANGE_CIPHER_SPEC,
130
+ TlsRecordType.ALERT,
131
+ TlsRecordType.HANDSHAKE,
132
+ TlsRecordType.APPLICATION_DATA,
133
+ TlsRecordType.HEARTBEAT
134
+ ];
135
+ if (!validTypes.includes(recordType)) {
136
+ return false;
137
+ }
138
+ // Check TLS version bytes (should be 0x03 0x0X)
139
+ if (buffer[1] !== 0x03) {
140
+ return false;
141
+ }
142
+ // Check record length is reasonable
143
+ const recordLength = readUInt16BE(buffer, 3);
144
+ if (recordLength > 16384) { // Max TLS record size
145
+ return false;
146
+ }
147
+ return true;
148
+ }
149
+ /**
150
+ * Parse ALPN extension data
151
+ */
152
+ parseAlpnExtension(data) {
153
+ const protocols = [];
154
+ if (data.length < 2) {
155
+ return protocols;
156
+ }
157
+ const listLength = readUInt16BE(data, 0);
158
+ let offset = 2;
159
+ while (offset < Math.min(2 + listLength, data.length)) {
160
+ const protoLength = data[offset];
161
+ offset++;
162
+ if (offset + protoLength <= data.length) {
163
+ const protocol = data.subarray(offset, offset + protoLength).toString('ascii');
164
+ protocols.push(protocol);
165
+ offset += protoLength;
166
+ }
167
+ else {
168
+ break;
169
+ }
170
+ }
171
+ return protocols;
172
+ }
173
+ /**
174
+ * Parse cipher suites
175
+ */
176
+ parseCipherSuites(cipherData) {
177
+ const suites = [];
178
+ for (let i = 0; i < cipherData.length - 1; i += 2) {
179
+ const suite = readUInt16BE(cipherData, i);
180
+ suites.push(suite);
181
+ }
182
+ return suites;
183
+ }
184
+ /**
185
+ * Detect with context for fragmented data
186
+ */
187
+ detectWithContext(buffer, context, options) {
188
+ const connectionId = this.createConnectionId(context);
189
+ // Get or create buffer accumulator for this connection
190
+ let accumulator = TlsDetector.fragmentedBuffers.get(connectionId);
191
+ if (!accumulator) {
192
+ accumulator = new BufferAccumulator();
193
+ TlsDetector.fragmentedBuffers.set(connectionId, accumulator);
194
+ }
195
+ // Add new data
196
+ accumulator.append(buffer);
197
+ // Try detection on accumulated data
198
+ const result = this.detect(accumulator.getBuffer(), options);
199
+ // If detection is complete or we have too much data, clean up
200
+ if (result?.isComplete || accumulator.length() > 65536) {
201
+ TlsDetector.fragmentedBuffers.delete(connectionId);
202
+ }
203
+ return result;
204
+ }
205
+ }
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLWRldGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZGV0ZWN0aW9uL2RldGVjdG9ycy90bHMtZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFLSCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlELHdCQUF3QjtBQUN4QixPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFakcseURBQXlEO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUVuRjs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBQ3RCOztPQUVHO2FBQ3FCLHdCQUFtQixHQUFHLENBQUMsQ0FBQztJQUVoRDs7T0FFRzthQUNZLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBRXhFOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsT0FBdUY7UUFDaEgsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDaEksQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQWMsRUFBRSxPQUEyQjtRQUNoRCwrQkFBK0I7UUFDL0IsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELGdD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
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Centralized Protocol Detection Module
3
+ *
4
+ * This module provides unified protocol detection capabilities for
5
+ * both TLS and HTTP protocols, extracting connection information
6
+ * without consuming the data stream.
7
+ */
8
+ export * from './protocol-detector.js';
9
+ export * from './models/detection-types.js';
10
+ export * from './models/interfaces.js';
11
+ export * from './detectors/tls-detector.js';
12
+ export * from './detectors/http-detector.js';
13
+ export * from './detectors/quick-detector.js';
14
+ export * from './detectors/routing-extractor.js';
15
+ export * from './utils/buffer-utils.js';
16
+ export * from './utils/parser-utils.js';
17
+ export * from './utils/fragment-manager.js';
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Centralized Protocol Detection Module
3
+ *
4
+ * This module provides unified protocol detection capabilities for
5
+ * both TLS and HTTP protocols, extracting connection information
6
+ * without consuming the data stream.
7
+ */
8
+ // Main detector
9
+ export * from './protocol-detector.js';
10
+ // Models
11
+ export * from './models/detection-types.js';
12
+ export * from './models/interfaces.js';
13
+ // Individual detectors
14
+ export * from './detectors/tls-detector.js';
15
+ export * from './detectors/http-detector.js';
16
+ export * from './detectors/quick-detector.js';
17
+ export * from './detectors/routing-extractor.js';
18
+ // Utilities
19
+ export * from './utils/buffer-utils.js';
20
+ export * from './utils/parser-utils.js';
21
+ export * from './utils/fragment-manager.js';
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXRlY3Rpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsZ0JBQWdCO0FBQ2hCLGNBQWMsd0JBQXdCLENBQUM7QUFFdkMsU0FBUztBQUNULGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx3QkFBd0IsQ0FBQztBQUV2Qyx1QkFBdUI7QUFDdkIsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxrQ0FBa0MsQ0FBQztBQUVqRCxZQUFZO0FBQ1osY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUMifQ==
@@ -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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