@push.rocks/smartproxy 21.0.0 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/changelog.md +9 -0
  2. package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
  3. package/dist_ts/core/utils/proxy-protocol.js +13 -97
  4. package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
  5. package/dist_ts/core/utils/websocket-utils.js +10 -66
  6. package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
  7. package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
  8. package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
  9. package/dist_ts/detection/detectors/http-detector.js +89 -0
  10. package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
  11. package/dist_ts/detection/detectors/quick-detector.js +131 -0
  12. package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
  13. package/dist_ts/detection/detectors/routing-extractor.js +122 -0
  14. package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
  15. package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
  16. package/dist_ts/detection/detectors/tls-detector.d.ts +33 -0
  17. package/dist_ts/detection/detectors/tls-detector.js +106 -0
  18. package/dist_ts/detection/index.d.ts +17 -0
  19. package/dist_ts/detection/index.js +22 -0
  20. package/dist_ts/detection/models/detection-types.d.ts +87 -0
  21. package/dist_ts/detection/models/detection-types.js +5 -0
  22. package/dist_ts/detection/models/interfaces.d.ts +97 -0
  23. package/dist_ts/detection/models/interfaces.js +5 -0
  24. package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
  25. package/dist_ts/detection/protocol-detector-v2.js +116 -0
  26. package/dist_ts/detection/protocol-detector.d.ts +74 -0
  27. package/dist_ts/detection/protocol-detector.js +173 -0
  28. package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
  29. package/dist_ts/detection/utils/buffer-utils.js +127 -0
  30. package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
  31. package/dist_ts/detection/utils/fragment-manager.js +53 -0
  32. package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
  33. package/dist_ts/detection/utils/parser-utils.js +63 -0
  34. package/dist_ts/index.d.ts +2 -0
  35. package/dist_ts/index.js +3 -1
  36. package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
  37. package/dist_ts/protocols/common/fragment-handler.js +117 -0
  38. package/dist_ts/protocols/common/index.d.ts +7 -0
  39. package/dist_ts/protocols/common/index.js +8 -0
  40. package/dist_ts/protocols/common/types.d.ts +68 -0
  41. package/dist_ts/protocols/common/types.js +7 -0
  42. package/dist_ts/protocols/http/constants.d.ts +119 -0
  43. package/dist_ts/protocols/http/constants.js +200 -0
  44. package/dist_ts/protocols/http/index.d.ts +7 -0
  45. package/dist_ts/protocols/http/index.js +8 -0
  46. package/dist_ts/protocols/http/parser.d.ts +58 -0
  47. package/dist_ts/protocols/http/parser.js +184 -0
  48. package/dist_ts/protocols/http/types.d.ts +62 -0
  49. package/dist_ts/protocols/http/types.js +5 -0
  50. package/dist_ts/protocols/index.d.ts +11 -0
  51. package/dist_ts/protocols/index.js +12 -0
  52. package/dist_ts/protocols/proxy/index.d.ts +6 -0
  53. package/dist_ts/protocols/proxy/index.js +7 -0
  54. package/dist_ts/protocols/proxy/parser.d.ts +44 -0
  55. package/dist_ts/protocols/proxy/parser.js +153 -0
  56. package/dist_ts/protocols/proxy/types.d.ts +47 -0
  57. package/dist_ts/protocols/proxy/types.js +6 -0
  58. package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
  59. package/dist_ts/protocols/tls/alerts/index.js +5 -0
  60. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
  61. package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
  62. package/dist_ts/protocols/tls/constants.d.ts +122 -0
  63. package/dist_ts/protocols/tls/constants.js +135 -0
  64. package/dist_ts/protocols/tls/index.d.ts +12 -0
  65. package/dist_ts/protocols/tls/index.js +27 -0
  66. package/dist_ts/protocols/tls/parser.d.ts +53 -0
  67. package/dist_ts/protocols/tls/parser.js +294 -0
  68. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
  69. package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
  70. package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
  71. package/dist_ts/protocols/tls/sni/index.js +6 -0
  72. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
  73. package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
  74. package/dist_ts/protocols/tls/types.d.ts +65 -0
  75. package/dist_ts/protocols/tls/types.js +5 -0
  76. package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
  77. package/dist_ts/protocols/tls/utils/index.js +5 -0
  78. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
  79. package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
  80. package/dist_ts/protocols/websocket/constants.d.ts +55 -0
  81. package/dist_ts/protocols/websocket/constants.js +58 -0
  82. package/dist_ts/protocols/websocket/index.d.ts +7 -0
  83. package/dist_ts/protocols/websocket/index.js +8 -0
  84. package/dist_ts/protocols/websocket/types.d.ts +47 -0
  85. package/dist_ts/protocols/websocket/types.js +5 -0
  86. package/dist_ts/protocols/websocket/utils.d.ts +25 -0
  87. package/dist_ts/protocols/websocket/utils.js +103 -0
  88. package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
  89. package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
  90. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
  91. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
  92. package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
  93. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +2 -0
  94. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +61 -52
  95. package/dist_ts/tls/index.d.ts +5 -7
  96. package/dist_ts/tls/index.js +8 -11
  97. package/dist_ts/tls/sni/client-hello-parser.js +3 -2
  98. package/dist_ts/tls/sni/sni-handler.js +4 -4
  99. package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
  100. package/dist_ts/tls/utils/tls-utils.js +4 -116
  101. package/package.json +17 -8
  102. package/readme.plan.md +0 -0
  103. package/ts/core/utils/proxy-protocol.ts +14 -131
  104. package/ts/core/utils/websocket-utils.ts +12 -60
  105. package/ts/detection/detectors/http-detector.ts +114 -0
  106. package/ts/detection/detectors/quick-detector.ts +148 -0
  107. package/ts/detection/detectors/routing-extractor.ts +147 -0
  108. package/ts/detection/detectors/tls-detector.ts +120 -0
  109. package/ts/detection/index.ts +25 -0
  110. package/ts/detection/models/detection-types.ts +102 -0
  111. package/ts/detection/models/interfaces.ts +115 -0
  112. package/ts/detection/protocol-detector.ts +230 -0
  113. package/ts/detection/utils/buffer-utils.ts +141 -0
  114. package/ts/detection/utils/fragment-manager.ts +64 -0
  115. package/ts/detection/utils/parser-utils.ts +77 -0
  116. package/ts/index.ts +3 -1
  117. package/ts/protocols/common/fragment-handler.ts +163 -0
  118. package/ts/protocols/common/index.ts +8 -0
  119. package/ts/protocols/common/types.ts +76 -0
  120. package/ts/protocols/http/constants.ts +219 -0
  121. package/ts/protocols/http/index.ts +8 -0
  122. package/ts/protocols/http/parser.ts +219 -0
  123. package/ts/protocols/http/types.ts +70 -0
  124. package/ts/protocols/index.ts +12 -0
  125. package/ts/protocols/proxy/index.ts +7 -0
  126. package/ts/protocols/proxy/parser.ts +183 -0
  127. package/ts/protocols/proxy/types.ts +53 -0
  128. package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
  129. package/ts/protocols/tls/index.ts +37 -0
  130. package/ts/protocols/tls/sni/index.ts +6 -0
  131. package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
  132. package/ts/protocols/websocket/constants.ts +60 -0
  133. package/ts/protocols/websocket/index.ts +8 -0
  134. package/ts/protocols/websocket/types.ts +53 -0
  135. package/ts/protocols/websocket/utils.ts +98 -0
  136. package/ts/proxies/http-proxy/models/http-types.ts +29 -46
  137. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -0
  138. package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
  139. package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
  140. package/ts/proxies/smart-proxy/utils/route-helpers.ts +72 -56
  141. package/ts/tls/index.ts +8 -12
  142. package/ts/tls/sni/sni-handler.ts +3 -3
  143. /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
  144. /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
  145. /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
  146. /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
@@ -0,0 +1,294 @@
1
+ /**
2
+ * TLS Protocol Parser
3
+ * Generic TLS parsing utilities separated from implementation logic
4
+ */
5
+ import { Buffer } from 'buffer';
6
+ import { TlsRecordType, TlsHandshakeType, TlsExtensionType } from './constants.js';
7
+ /**
8
+ * TLS protocol parser utilities
9
+ */
10
+ export class TlsParser {
11
+ /**
12
+ * Checks if a buffer contains a TLS handshake record
13
+ */
14
+ static isTlsHandshake(buffer) {
15
+ return buffer.length > 0 && buffer[0] === TlsRecordType.HANDSHAKE;
16
+ }
17
+ /**
18
+ * Checks if a buffer contains a TLS ClientHello message
19
+ */
20
+ static isClientHello(buffer) {
21
+ // Minimum ClientHello size (TLS record header + handshake header)
22
+ if (buffer.length < 9) {
23
+ return false;
24
+ }
25
+ // Check record type (must be TLS_HANDSHAKE_RECORD_TYPE)
26
+ if (buffer[0] !== TlsRecordType.HANDSHAKE) {
27
+ return false;
28
+ }
29
+ // Check handshake type at byte 5 (must be CLIENT_HELLO)
30
+ return buffer[5] === TlsHandshakeType.CLIENT_HELLO;
31
+ }
32
+ /**
33
+ * Gets the record length from a TLS record header
34
+ */
35
+ static getTlsRecordLength(buffer) {
36
+ if (buffer.length < 5) {
37
+ return -1;
38
+ }
39
+ // Bytes 3-4 contain the record length (big-endian)
40
+ return (buffer[3] << 8) + buffer[4];
41
+ }
42
+ /**
43
+ * Parses a TLS ClientHello message and extracts all components
44
+ */
45
+ static parseClientHello(buffer) {
46
+ const result = {
47
+ isValid: false,
48
+ hasSessionId: false,
49
+ extensions: [],
50
+ hasSessionTicket: false,
51
+ hasPsk: false,
52
+ hasEarlyData: false
53
+ };
54
+ try {
55
+ // Check basic validity
56
+ if (buffer.length < 5) {
57
+ result.error = 'Buffer too small for TLS record header';
58
+ return result;
59
+ }
60
+ // Check record type (must be HANDSHAKE)
61
+ if (buffer[0] !== TlsRecordType.HANDSHAKE) {
62
+ result.error = `Not a TLS handshake record: ${buffer[0]}`;
63
+ return result;
64
+ }
65
+ // Get TLS version from record header
66
+ const majorVersion = buffer[1];
67
+ const minorVersion = buffer[2];
68
+ result.version = [majorVersion, minorVersion];
69
+ // Parse record length (bytes 3-4, big-endian)
70
+ const recordLength = (buffer[3] << 8) + buffer[4];
71
+ // Validate record length against buffer size
72
+ if (buffer.length < recordLength + 5) {
73
+ result.error = 'Buffer smaller than expected record length';
74
+ return result;
75
+ }
76
+ // Start of handshake message in the buffer
77
+ let pos = 5;
78
+ // Check handshake type (must be CLIENT_HELLO)
79
+ if (buffer[pos] !== TlsHandshakeType.CLIENT_HELLO) {
80
+ result.error = `Not a ClientHello message: ${buffer[pos]}`;
81
+ return result;
82
+ }
83
+ // Skip handshake type (1 byte)
84
+ pos += 1;
85
+ // Parse handshake length (3 bytes, big-endian)
86
+ const handshakeLength = (buffer[pos] << 16) + (buffer[pos + 1] << 8) + buffer[pos + 2];
87
+ // Skip handshake length (3 bytes)
88
+ pos += 3;
89
+ // Skip client version (2 bytes)
90
+ pos += 2;
91
+ // Extract client random (32 bytes)
92
+ if (pos + 32 > buffer.length) {
93
+ result.error = 'Buffer too small for client random';
94
+ return result;
95
+ }
96
+ result.random = buffer.slice(pos, pos + 32);
97
+ // Skip client random (32 bytes)
98
+ pos += 32;
99
+ // Parse session ID
100
+ if (pos + 1 > buffer.length) {
101
+ result.error = 'Buffer too small for session ID length';
102
+ return result;
103
+ }
104
+ const sessionIdLength = buffer[pos];
105
+ pos += 1;
106
+ result.hasSessionId = sessionIdLength > 0;
107
+ if (sessionIdLength > 0) {
108
+ if (pos + sessionIdLength > buffer.length) {
109
+ result.error = 'Buffer too small for session ID';
110
+ return result;
111
+ }
112
+ result.sessionId = buffer.slice(pos, pos + sessionIdLength);
113
+ }
114
+ // Skip session ID
115
+ pos += sessionIdLength;
116
+ // Check if we have enough bytes left for cipher suites
117
+ if (pos + 2 > buffer.length) {
118
+ result.error = 'Buffer too small for cipher suites length';
119
+ return result;
120
+ }
121
+ // Parse cipher suites length (2 bytes, big-endian)
122
+ const cipherSuitesLength = (buffer[pos] << 8) + buffer[pos + 1];
123
+ pos += 2;
124
+ // Extract cipher suites
125
+ if (pos + cipherSuitesLength > buffer.length) {
126
+ result.error = 'Buffer too small for cipher suites';
127
+ return result;
128
+ }
129
+ result.cipherSuites = buffer.slice(pos, pos + cipherSuitesLength);
130
+ // Skip cipher suites
131
+ pos += cipherSuitesLength;
132
+ // Check if we have enough bytes left for compression methods
133
+ if (pos + 1 > buffer.length) {
134
+ result.error = 'Buffer too small for compression methods length';
135
+ return result;
136
+ }
137
+ // Parse compression methods length (1 byte)
138
+ const compressionMethodsLength = buffer[pos];
139
+ pos += 1;
140
+ // Extract compression methods
141
+ if (pos + compressionMethodsLength > buffer.length) {
142
+ result.error = 'Buffer too small for compression methods';
143
+ return result;
144
+ }
145
+ result.compressionMethods = buffer.slice(pos, pos + compressionMethodsLength);
146
+ // Skip compression methods
147
+ pos += compressionMethodsLength;
148
+ // Check if we have enough bytes for extensions length
149
+ if (pos + 2 > buffer.length) {
150
+ // No extensions present - this is valid for older TLS versions
151
+ result.isValid = true;
152
+ return result;
153
+ }
154
+ // Parse extensions length (2 bytes, big-endian)
155
+ const extensionsLength = (buffer[pos] << 8) + buffer[pos + 1];
156
+ pos += 2;
157
+ // Extensions end position
158
+ const extensionsEnd = pos + extensionsLength;
159
+ // Check if extensions length is valid
160
+ if (extensionsEnd > buffer.length) {
161
+ result.error = 'Extensions length exceeds buffer size';
162
+ return result;
163
+ }
164
+ // Iterate through extensions
165
+ const serverNames = [];
166
+ while (pos + 4 <= extensionsEnd) {
167
+ // Parse extension type (2 bytes, big-endian)
168
+ const extensionType = (buffer[pos] << 8) + buffer[pos + 1];
169
+ pos += 2;
170
+ // Parse extension length (2 bytes, big-endian)
171
+ const extensionLength = (buffer[pos] << 8) + buffer[pos + 1];
172
+ pos += 2;
173
+ // Extract extension data
174
+ if (pos + extensionLength > extensionsEnd) {
175
+ result.error = `Extension ${extensionType} data exceeds bounds`;
176
+ return result;
177
+ }
178
+ const extensionData = buffer.slice(pos, pos + extensionLength);
179
+ // Record all extensions
180
+ result.extensions.push({
181
+ type: extensionType,
182
+ data: extensionData
183
+ });
184
+ // Track specific extension types
185
+ if (extensionType === TlsExtensionType.SERVER_NAME) {
186
+ // Server Name Indication (SNI)
187
+ const sniNames = this.parseServerNameExtension(extensionData);
188
+ serverNames.push(...sniNames);
189
+ }
190
+ else if (extensionType === TlsExtensionType.SESSION_TICKET) {
191
+ // Session ticket
192
+ result.hasSessionTicket = true;
193
+ }
194
+ else if (extensionType === TlsExtensionType.PRE_SHARED_KEY) {
195
+ // TLS 1.3 PSK
196
+ result.hasPsk = true;
197
+ }
198
+ else if (extensionType === TlsExtensionType.EARLY_DATA) {
199
+ // TLS 1.3 Early Data (0-RTT)
200
+ result.hasEarlyData = true;
201
+ }
202
+ // Move to next extension
203
+ pos += extensionLength;
204
+ }
205
+ // Store any server names found
206
+ if (serverNames.length > 0) {
207
+ result.serverNameList = serverNames;
208
+ }
209
+ // Mark as valid if we get here
210
+ result.isValid = true;
211
+ return result;
212
+ }
213
+ catch (error) {
214
+ const errorMessage = error instanceof Error ? error.message : String(error);
215
+ result.error = errorMessage;
216
+ return result;
217
+ }
218
+ }
219
+ /**
220
+ * Parses the server name extension data and extracts hostnames
221
+ */
222
+ static parseServerNameExtension(data) {
223
+ const serverNames = [];
224
+ try {
225
+ // Need at least 2 bytes for server name list length
226
+ if (data.length < 2) {
227
+ return serverNames;
228
+ }
229
+ // Parse server name list length (2 bytes)
230
+ const listLength = (data[0] << 8) + data[1];
231
+ // Skip to first name entry
232
+ let pos = 2;
233
+ // End of list
234
+ const listEnd = pos + listLength;
235
+ // Validate length
236
+ if (listEnd > data.length) {
237
+ return serverNames;
238
+ }
239
+ // Process all name entries
240
+ while (pos + 3 <= listEnd) {
241
+ // Name type (1 byte)
242
+ const nameType = data[pos];
243
+ pos += 1;
244
+ // For hostname, type must be 0
245
+ if (nameType !== 0) {
246
+ // Skip this entry
247
+ if (pos + 2 <= listEnd) {
248
+ const nameLength = (data[pos] << 8) + data[pos + 1];
249
+ pos += 2 + nameLength;
250
+ continue;
251
+ }
252
+ else {
253
+ return serverNames;
254
+ }
255
+ }
256
+ // Parse hostname length (2 bytes)
257
+ if (pos + 2 > listEnd) {
258
+ return serverNames;
259
+ }
260
+ const nameLength = (data[pos] << 8) + data[pos + 1];
261
+ pos += 2;
262
+ // Extract hostname
263
+ if (pos + nameLength > listEnd) {
264
+ return serverNames;
265
+ }
266
+ // Extract the hostname as UTF-8
267
+ try {
268
+ const hostname = data.slice(pos, pos + nameLength).toString('utf8');
269
+ serverNames.push(hostname);
270
+ }
271
+ catch (err) {
272
+ // Ignore invalid hostnames
273
+ }
274
+ // Move to next entry
275
+ pos += nameLength;
276
+ }
277
+ return serverNames;
278
+ }
279
+ catch (error) {
280
+ return serverNames;
281
+ }
282
+ }
283
+ /**
284
+ * Extract SNI (Server Name Indication) from ClientHello
285
+ */
286
+ static extractSNI(buffer) {
287
+ const parseResult = this.parseClientHello(buffer);
288
+ if (!parseResult.isValid || !parseResult.serverNameList || parseResult.serverNameList.length === 0) {
289
+ return null;
290
+ }
291
+ return parseResult.serverNameList[0];
292
+ }
293
+ }
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvcHJvdG9jb2xzL3Rscy9wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFzQm5GOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFDcEI7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQWM7UUFDbEMsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDakMsa0VBQWtFO1FBQ2xFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQWM7UUFDdEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDWixDQUFDO1FBRUQsbURBQW1EO1FBQ25ELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFD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
@@ -0,0 +1,100 @@
1
+ import { Buffer } from 'buffer';
2
+ /**
3
+ * Interface for logging functions used by the parser
4
+ */
5
+ export type LoggerFunction = (message: string) => void;
6
+ /**
7
+ * Result of a session resumption check
8
+ */
9
+ export interface SessionResumptionResult {
10
+ isResumption: boolean;
11
+ hasSNI: boolean;
12
+ }
13
+ /**
14
+ * Information about parsed TLS extensions
15
+ */
16
+ export interface ExtensionInfo {
17
+ type: number;
18
+ length: number;
19
+ data: Buffer;
20
+ }
21
+ /**
22
+ * Result of a ClientHello parse operation
23
+ */
24
+ export interface ClientHelloParseResult {
25
+ isValid: boolean;
26
+ version?: [number, number];
27
+ random?: Buffer;
28
+ sessionId?: Buffer;
29
+ hasSessionId: boolean;
30
+ cipherSuites?: Buffer;
31
+ compressionMethods?: Buffer;
32
+ extensions: ExtensionInfo[];
33
+ serverNameList?: string[];
34
+ hasSessionTicket: boolean;
35
+ hasPsk: boolean;
36
+ hasEarlyData: boolean;
37
+ error?: string;
38
+ }
39
+ /**
40
+ * Fragment tracking information
41
+ */
42
+ export interface FragmentTrackingInfo {
43
+ buffer: Buffer;
44
+ timestamp: number;
45
+ connectionId: string;
46
+ }
47
+ /**
48
+ * Class for parsing TLS ClientHello messages
49
+ */
50
+ export declare class ClientHelloParser {
51
+ private static fragmentedBuffers;
52
+ private static fragmentTimeout;
53
+ /**
54
+ * Clean up expired fragments
55
+ */
56
+ private static cleanupExpiredFragments;
57
+ /**
58
+ * Handles potential fragmented ClientHello messages by buffering and reassembling
59
+ * TLS record fragments that might span multiple TCP packets.
60
+ *
61
+ * @param buffer The current buffer fragment
62
+ * @param connectionId Unique identifier for the connection
63
+ * @param logger Optional logging function
64
+ * @returns A complete buffer if reassembly is successful, or undefined if more fragments are needed
65
+ */
66
+ static handleFragmentedClientHello(buffer: Buffer, connectionId: string, logger?: LoggerFunction): Buffer | undefined;
67
+ /**
68
+ * Parses a TLS ClientHello message and extracts all components
69
+ *
70
+ * @param buffer The buffer containing the ClientHello message
71
+ * @param logger Optional logging function
72
+ * @returns Parsed ClientHello or undefined if parsing failed
73
+ */
74
+ static parseClientHello(buffer: Buffer, logger?: LoggerFunction): ClientHelloParseResult;
75
+ /**
76
+ * Parses the server name extension data and extracts hostnames
77
+ *
78
+ * @param data Extension data buffer
79
+ * @param serverNames Array to populate with found server names
80
+ * @param logger Optional logging function
81
+ * @returns true if parsing succeeded
82
+ */
83
+ private static parseServerNameExtension;
84
+ /**
85
+ * Determines if a ClientHello contains session resumption indicators
86
+ *
87
+ * @param buffer The ClientHello buffer
88
+ * @param logger Optional logging function
89
+ * @returns Session resumption result
90
+ */
91
+ static hasSessionResumption(buffer: Buffer, logger?: LoggerFunction): SessionResumptionResult;
92
+ /**
93
+ * Checks if a ClientHello appears to be from a tab reactivation
94
+ *
95
+ * @param buffer The ClientHello buffer
96
+ * @param logger Optional logging function
97
+ * @returns true if it appears to be a tab reactivation
98
+ */
99
+ static isTabReactivationHandshake(buffer: Buffer, logger?: LoggerFunction): boolean;
100
+ }