@push.rocks/smartproxy 25.17.10 → 26.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.
- package/changelog.md +15 -0
- package/dist_rust/rustproxy_linux_amd64 +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/core/index.d.ts +0 -1
- package/dist_ts/core/index.js +1 -2
- package/dist_ts/core/models/index.d.ts +0 -1
- package/dist_ts/core/models/index.js +1 -2
- package/dist_ts/core/utils/index.d.ts +0 -12
- package/dist_ts/core/utils/index.js +1 -13
- package/dist_ts/index.d.ts +0 -3
- package/dist_ts/index.js +2 -7
- package/dist_ts/protocols/http/index.d.ts +0 -1
- package/dist_ts/protocols/http/index.js +1 -2
- package/dist_ts/protocols/index.d.ts +0 -7
- package/dist_ts/protocols/index.js +1 -8
- package/dist_ts/proxies/smart-proxy/models/metrics-types.d.ts +20 -0
- package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.d.ts +2 -1
- package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.js +4 -1
- package/dist_ts/proxies/smart-proxy/socket-handler-server.js +6 -1
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.d.ts +0 -7
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +50 -51
- package/dist_ts/routing/index.d.ts +0 -1
- package/dist_ts/routing/index.js +1 -3
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/index.ts +0 -1
- package/ts/core/models/index.ts +0 -1
- package/ts/core/utils/index.ts +0 -12
- package/ts/index.ts +1 -7
- package/ts/protocols/http/index.ts +1 -2
- package/ts/protocols/index.ts +0 -7
- package/ts/proxies/smart-proxy/models/metrics-types.ts +21 -0
- package/ts/proxies/smart-proxy/rust-metrics-adapter.ts +4 -1
- package/ts/proxies/smart-proxy/socket-handler-server.ts +6 -0
- package/ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.ts +60 -59
- package/ts/routing/index.ts +0 -3
- package/dist_ts/core/events/index.d.ts +0 -4
- package/dist_ts/core/events/index.js +0 -5
- package/dist_ts/core/models/socket-augmentation.d.ts +0 -15
- package/dist_ts/core/models/socket-augmentation.js +0 -18
- package/dist_ts/core/utils/async-utils.d.ts +0 -81
- package/dist_ts/core/utils/async-utils.js +0 -216
- package/dist_ts/core/utils/binary-heap.d.ts +0 -73
- package/dist_ts/core/utils/binary-heap.js +0 -193
- package/dist_ts/core/utils/enhanced-connection-pool.d.ts +0 -110
- package/dist_ts/core/utils/enhanced-connection-pool.js +0 -325
- package/dist_ts/core/utils/fs-utils.d.ts +0 -144
- package/dist_ts/core/utils/fs-utils.js +0 -252
- package/dist_ts/core/utils/ip-utils.d.ts +0 -69
- package/dist_ts/core/utils/ip-utils.js +0 -270
- package/dist_ts/core/utils/lifecycle-component.d.ts +0 -59
- package/dist_ts/core/utils/lifecycle-component.js +0 -211
- package/dist_ts/core/utils/log-deduplicator.d.ts +0 -39
- package/dist_ts/core/utils/log-deduplicator.js +0 -305
- package/dist_ts/core/utils/security-utils.d.ts +0 -111
- package/dist_ts/core/utils/security-utils.js +0 -212
- package/dist_ts/core/utils/shared-security-manager.d.ts +0 -128
- package/dist_ts/core/utils/shared-security-manager.js +0 -362
- package/dist_ts/core/utils/socket-utils.d.ts +0 -63
- package/dist_ts/core/utils/socket-utils.js +0 -249
- package/dist_ts/core/utils/template-utils.d.ts +0 -37
- package/dist_ts/core/utils/template-utils.js +0 -104
- package/dist_ts/core/utils/validation-utils.d.ts +0 -61
- package/dist_ts/core/utils/validation-utils.js +0 -149
- package/dist_ts/core/utils/websocket-utils.d.ts +0 -22
- package/dist_ts/core/utils/websocket-utils.js +0 -30
- package/dist_ts/detection/detectors/http-detector.d.ts +0 -33
- package/dist_ts/detection/detectors/http-detector.js +0 -101
- package/dist_ts/detection/detectors/quick-detector.d.ts +0 -28
- package/dist_ts/detection/detectors/quick-detector.js +0 -131
- package/dist_ts/detection/detectors/routing-extractor.d.ts +0 -28
- package/dist_ts/detection/detectors/routing-extractor.js +0 -122
- package/dist_ts/detection/detectors/tls-detector.d.ts +0 -47
- package/dist_ts/detection/detectors/tls-detector.js +0 -183
- package/dist_ts/detection/index.d.ts +0 -17
- package/dist_ts/detection/index.js +0 -22
- package/dist_ts/detection/models/detection-types.d.ts +0 -87
- package/dist_ts/detection/models/detection-types.js +0 -5
- package/dist_ts/detection/models/interfaces.d.ts +0 -97
- package/dist_ts/detection/models/interfaces.js +0 -5
- package/dist_ts/detection/protocol-detector.d.ts +0 -79
- package/dist_ts/detection/protocol-detector.js +0 -253
- package/dist_ts/detection/utils/buffer-utils.d.ts +0 -61
- package/dist_ts/detection/utils/buffer-utils.js +0 -127
- package/dist_ts/detection/utils/fragment-manager.d.ts +0 -31
- package/dist_ts/detection/utils/fragment-manager.js +0 -53
- package/dist_ts/detection/utils/parser-utils.d.ts +0 -42
- package/dist_ts/detection/utils/parser-utils.js +0 -63
- package/dist_ts/protocols/common/fragment-handler.d.ts +0 -73
- package/dist_ts/protocols/common/fragment-handler.js +0 -121
- package/dist_ts/protocols/common/index.d.ts +0 -7
- package/dist_ts/protocols/common/index.js +0 -8
- package/dist_ts/protocols/common/types.d.ts +0 -68
- package/dist_ts/protocols/common/types.js +0 -7
- package/dist_ts/protocols/http/parser.d.ts +0 -58
- package/dist_ts/protocols/http/parser.js +0 -184
- package/dist_ts/protocols/proxy/index.d.ts +0 -5
- package/dist_ts/protocols/proxy/index.js +0 -6
- package/dist_ts/protocols/proxy/types.d.ts +0 -47
- package/dist_ts/protocols/proxy/types.js +0 -6
- package/dist_ts/protocols/tls/alerts/index.d.ts +0 -4
- package/dist_ts/protocols/tls/alerts/index.js +0 -5
- package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +0 -150
- package/dist_ts/protocols/tls/alerts/tls-alert.js +0 -226
- package/dist_ts/protocols/tls/index.d.ts +0 -12
- package/dist_ts/protocols/tls/index.js +0 -27
- package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +0 -100
- package/dist_ts/protocols/tls/sni/client-hello-parser.js +0 -463
- package/dist_ts/protocols/tls/sni/index.d.ts +0 -5
- package/dist_ts/protocols/tls/sni/index.js +0 -6
- package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +0 -58
- package/dist_ts/protocols/tls/sni/sni-extraction.js +0 -275
- package/dist_ts/protocols/tls/utils/index.d.ts +0 -4
- package/dist_ts/protocols/tls/utils/index.js +0 -5
- package/dist_ts/protocols/tls/utils/tls-utils.d.ts +0 -158
- package/dist_ts/protocols/tls/utils/tls-utils.js +0 -187
- package/dist_ts/protocols/websocket/constants.d.ts +0 -55
- package/dist_ts/protocols/websocket/constants.js +0 -58
- package/dist_ts/protocols/websocket/index.d.ts +0 -7
- package/dist_ts/protocols/websocket/index.js +0 -8
- package/dist_ts/protocols/websocket/types.d.ts +0 -47
- package/dist_ts/protocols/websocket/types.js +0 -5
- package/dist_ts/protocols/websocket/utils.d.ts +0 -25
- package/dist_ts/protocols/websocket/utils.js +0 -103
- package/dist_ts/routing/router/http-router.d.ts +0 -89
- package/dist_ts/routing/router/http-router.js +0 -205
- package/dist_ts/routing/router/index.d.ts +0 -5
- package/dist_ts/routing/router/index.js +0 -6
- package/dist_ts/tls/index.d.ts +0 -16
- package/dist_ts/tls/index.js +0 -24
- package/dist_ts/tls/sni/index.d.ts +0 -4
- package/dist_ts/tls/sni/index.js +0 -5
- package/dist_ts/tls/sni/sni-handler.d.ts +0 -154
- package/dist_ts/tls/sni/sni-handler.js +0 -191
- package/ts/core/events/index.ts +0 -3
- package/ts/core/models/socket-augmentation.ts +0 -38
- package/ts/core/utils/async-utils.ts +0 -275
- package/ts/core/utils/binary-heap.ts +0 -225
- package/ts/core/utils/enhanced-connection-pool.ts +0 -425
- package/ts/core/utils/fs-utils.ts +0 -270
- package/ts/core/utils/ip-utils.ts +0 -303
- package/ts/core/utils/lifecycle-component.ts +0 -251
- package/ts/core/utils/log-deduplicator.ts +0 -370
- package/ts/core/utils/security-utils.ts +0 -305
- package/ts/core/utils/shared-security-manager.ts +0 -470
- package/ts/core/utils/socket-utils.ts +0 -322
- package/ts/core/utils/template-utils.ts +0 -124
- package/ts/core/utils/validation-utils.ts +0 -177
- package/ts/core/utils/websocket-utils.ts +0 -33
- package/ts/detection/detectors/http-detector.ts +0 -127
- package/ts/detection/detectors/quick-detector.ts +0 -148
- package/ts/detection/detectors/routing-extractor.ts +0 -147
- package/ts/detection/detectors/tls-detector.ts +0 -223
- package/ts/detection/index.ts +0 -25
- package/ts/detection/models/detection-types.ts +0 -102
- package/ts/detection/models/interfaces.ts +0 -115
- package/ts/detection/protocol-detector.ts +0 -319
- package/ts/detection/utils/buffer-utils.ts +0 -141
- package/ts/detection/utils/fragment-manager.ts +0 -64
- package/ts/detection/utils/parser-utils.ts +0 -77
- package/ts/protocols/common/fragment-handler.ts +0 -167
- package/ts/protocols/common/index.ts +0 -8
- package/ts/protocols/common/types.ts +0 -76
- package/ts/protocols/http/parser.ts +0 -219
- package/ts/protocols/proxy/index.ts +0 -6
- package/ts/protocols/proxy/types.ts +0 -53
- package/ts/protocols/tls/alerts/index.ts +0 -3
- package/ts/protocols/tls/alerts/tls-alert.ts +0 -259
- package/ts/protocols/tls/index.ts +0 -37
- package/ts/protocols/tls/sni/client-hello-parser.ts +0 -629
- package/ts/protocols/tls/sni/index.ts +0 -6
- package/ts/protocols/tls/sni/sni-extraction.ts +0 -353
- package/ts/protocols/tls/utils/index.ts +0 -3
- package/ts/protocols/tls/utils/tls-utils.ts +0 -201
- package/ts/protocols/websocket/constants.ts +0 -60
- package/ts/protocols/websocket/index.ts +0 -8
- package/ts/protocols/websocket/types.ts +0 -53
- package/ts/protocols/websocket/utils.ts +0 -98
- package/ts/routing/router/http-router.ts +0 -266
- package/ts/routing/router/index.ts +0 -7
- package/ts/tls/index.ts +0 -29
- package/ts/tls/sni/index.ts +0 -3
- package/ts/tls/sni/sni-handler.ts +0 -264
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket utility functions
|
|
3
|
-
*
|
|
4
|
-
* This module provides smartproxy-specific WebSocket utilities
|
|
5
|
-
* and re-exports protocol utilities from the protocols module
|
|
6
|
-
*/
|
|
7
|
-
// Import and re-export from protocols
|
|
8
|
-
import { getMessageSize as protocolGetMessageSize, toBuffer as protocolToBuffer } from '../../protocols/websocket/index.js';
|
|
9
|
-
/**
|
|
10
|
-
* Get the length of a WebSocket message regardless of its type
|
|
11
|
-
* (handles all possible WebSocket message data types)
|
|
12
|
-
*
|
|
13
|
-
* @param data - The data message from WebSocket (could be any RawData type)
|
|
14
|
-
* @returns The length of the data in bytes
|
|
15
|
-
*/
|
|
16
|
-
export function getMessageSize(data) {
|
|
17
|
-
// Delegate to protocol implementation
|
|
18
|
-
return protocolGetMessageSize(data);
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Convert any raw WebSocket data to Buffer for consistent handling
|
|
22
|
-
*
|
|
23
|
-
* @param data - The data message from WebSocket (could be any RawData type)
|
|
24
|
-
* @returns A Buffer containing the data
|
|
25
|
-
*/
|
|
26
|
-
export function toBuffer(data) {
|
|
27
|
-
// Delegate to protocol implementation
|
|
28
|
-
return protocolToBuffer(data);
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY29yZS91dGlscy93ZWJzb2NrZXQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxzQ0FBc0M7QUFDdEMsT0FBTyxFQUFFLGNBQWMsSUFBSSxzQkFBc0IsRUFBRSxRQUFRLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUc1SDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLElBQTBEO0lBQ3ZGLHNDQUFzQztJQUN0QyxPQUFPLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBMEQ7SUFDakYsc0NBQXNDO0lBQ3RDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQyJ9
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP Protocol Detector
|
|
3
|
-
*
|
|
4
|
-
* Simplified HTTP detection using the new architecture
|
|
5
|
-
*/
|
|
6
|
-
import type { IProtocolDetector } from '../models/interfaces.js';
|
|
7
|
-
import type { IDetectionResult, IDetectionOptions } from '../models/detection-types.js';
|
|
8
|
-
import type { IConnectionContext } from '../../protocols/common/types.js';
|
|
9
|
-
import { DetectionFragmentManager } from '../utils/fragment-manager.js';
|
|
10
|
-
/**
|
|
11
|
-
* Simplified HTTP detector
|
|
12
|
-
*/
|
|
13
|
-
export declare class HttpDetector implements IProtocolDetector {
|
|
14
|
-
private quickDetector;
|
|
15
|
-
private fragmentManager;
|
|
16
|
-
constructor(fragmentManager?: DetectionFragmentManager);
|
|
17
|
-
/**
|
|
18
|
-
* Check if buffer can be handled by this detector
|
|
19
|
-
*/
|
|
20
|
-
canHandle(buffer: Buffer): boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Get minimum bytes needed for detection
|
|
23
|
-
*/
|
|
24
|
-
getMinimumBytes(): number;
|
|
25
|
-
/**
|
|
26
|
-
* Detect HTTP protocol from buffer
|
|
27
|
-
*/
|
|
28
|
-
detect(buffer: Buffer, options?: IDetectionOptions): IDetectionResult | null;
|
|
29
|
-
/**
|
|
30
|
-
* Handle fragmented detection
|
|
31
|
-
*/
|
|
32
|
-
detectWithContext(buffer: Buffer, context: IConnectionContext, options?: IDetectionOptions): IDetectionResult | null;
|
|
33
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP Protocol Detector
|
|
3
|
-
*
|
|
4
|
-
* Simplified HTTP detection using the new architecture
|
|
5
|
-
*/
|
|
6
|
-
import { QuickProtocolDetector } from './quick-detector.js';
|
|
7
|
-
import { RoutingExtractor } from './routing-extractor.js';
|
|
8
|
-
import { DetectionFragmentManager } from '../utils/fragment-manager.js';
|
|
9
|
-
import { HttpParser } from '../../protocols/http/parser.js';
|
|
10
|
-
/**
|
|
11
|
-
* Simplified HTTP detector
|
|
12
|
-
*/
|
|
13
|
-
export class HttpDetector {
|
|
14
|
-
constructor(fragmentManager) {
|
|
15
|
-
this.quickDetector = new QuickProtocolDetector();
|
|
16
|
-
this.fragmentManager = fragmentManager || new DetectionFragmentManager();
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Check if buffer can be handled by this detector
|
|
20
|
-
*/
|
|
21
|
-
canHandle(buffer) {
|
|
22
|
-
const result = this.quickDetector.quickDetect(buffer);
|
|
23
|
-
return result.protocol === 'http' && result.confidence > 50;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Get minimum bytes needed for detection
|
|
27
|
-
*/
|
|
28
|
-
getMinimumBytes() {
|
|
29
|
-
return 4; // "GET " minimum
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Detect HTTP protocol from buffer
|
|
33
|
-
*/
|
|
34
|
-
detect(buffer, options) {
|
|
35
|
-
// Quick detection first
|
|
36
|
-
const quickResult = this.quickDetector.quickDetect(buffer);
|
|
37
|
-
if (quickResult.protocol !== 'http' || quickResult.confidence < 50) {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
// Check if we have complete headers first
|
|
41
|
-
const headersEnd = buffer.indexOf('\r\n\r\n');
|
|
42
|
-
const isComplete = headersEnd !== -1;
|
|
43
|
-
// Extract routing information
|
|
44
|
-
const routing = RoutingExtractor.extract(buffer, 'http');
|
|
45
|
-
// Extract headers if requested and we have complete headers
|
|
46
|
-
let headers;
|
|
47
|
-
if (options?.extractFullHeaders && isComplete) {
|
|
48
|
-
const headerSection = buffer.slice(0, headersEnd).toString();
|
|
49
|
-
const lines = headerSection.split('\r\n');
|
|
50
|
-
if (lines.length > 1) {
|
|
51
|
-
// Skip the request line and parse headers
|
|
52
|
-
headers = HttpParser.parseHeaders(lines.slice(1));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
// If we don't need full headers and we have complete headers, we can return early
|
|
56
|
-
if (quickResult.confidence >= 95 && !options?.extractFullHeaders && isComplete) {
|
|
57
|
-
return {
|
|
58
|
-
protocol: 'http',
|
|
59
|
-
connectionInfo: {
|
|
60
|
-
protocol: 'http',
|
|
61
|
-
method: quickResult.metadata?.method,
|
|
62
|
-
domain: routing?.domain,
|
|
63
|
-
path: routing?.path
|
|
64
|
-
},
|
|
65
|
-
isComplete: true
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
protocol: 'http',
|
|
70
|
-
connectionInfo: {
|
|
71
|
-
protocol: 'http',
|
|
72
|
-
domain: routing?.domain,
|
|
73
|
-
path: routing?.path,
|
|
74
|
-
method: quickResult.metadata?.method,
|
|
75
|
-
headers: headers
|
|
76
|
-
},
|
|
77
|
-
isComplete,
|
|
78
|
-
bytesNeeded: isComplete ? undefined : buffer.length + 512 // Need more for headers
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Handle fragmented detection
|
|
83
|
-
*/
|
|
84
|
-
detectWithContext(buffer, context, options) {
|
|
85
|
-
const handler = this.fragmentManager.getHandler('http');
|
|
86
|
-
const connectionId = DetectionFragmentManager.createConnectionId(context);
|
|
87
|
-
// Add fragment
|
|
88
|
-
const result = handler.addFragment(connectionId, buffer);
|
|
89
|
-
if (result.error) {
|
|
90
|
-
handler.complete(connectionId);
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
// Try detection on accumulated buffer
|
|
94
|
-
const detectResult = this.detect(result.buffer, options);
|
|
95
|
-
if (detectResult && detectResult.isComplete) {
|
|
96
|
-
handler.complete(connectionId);
|
|
97
|
-
}
|
|
98
|
-
return detectResult;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1kZXRlY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2RldGVjdGlvbi9kZXRlY3RvcnMvaHR0cC1kZXRlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBTUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFJdkIsWUFBWSxlQUEwQztRQUg5QyxrQkFBYSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUlsRCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsSUFBSSxJQUFJLHdCQUF3QixFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLE1BQWM7UUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQWMsRUFBRSxPQUEyQjtRQUNoRCx3QkFBd0I7UUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0QsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxXQUFXLENB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
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Quick Protocol Detector
|
|
3
|
-
*
|
|
4
|
-
* Lightweight protocol identification based on minimal bytes
|
|
5
|
-
* No parsing, just identification
|
|
6
|
-
*/
|
|
7
|
-
import type { IProtocolDetector, IProtocolDetectionResult } from '../../protocols/common/types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Quick protocol detector for fast identification
|
|
10
|
-
*/
|
|
11
|
-
export declare class QuickProtocolDetector implements IProtocolDetector {
|
|
12
|
-
/**
|
|
13
|
-
* Check if this detector can handle the data
|
|
14
|
-
*/
|
|
15
|
-
canHandle(data: Buffer): boolean;
|
|
16
|
-
/**
|
|
17
|
-
* Perform quick detection based on first few bytes
|
|
18
|
-
*/
|
|
19
|
-
quickDetect(data: Buffer): IProtocolDetectionResult;
|
|
20
|
-
/**
|
|
21
|
-
* Check if data looks like TLS
|
|
22
|
-
*/
|
|
23
|
-
private checkTls;
|
|
24
|
-
/**
|
|
25
|
-
* Check if data looks like HTTP
|
|
26
|
-
*/
|
|
27
|
-
private checkHttp;
|
|
28
|
-
}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Quick Protocol Detector
|
|
3
|
-
*
|
|
4
|
-
* Lightweight protocol identification based on minimal bytes
|
|
5
|
-
* No parsing, just identification
|
|
6
|
-
*/
|
|
7
|
-
import { TlsRecordType } from '../../protocols/tls/index.js';
|
|
8
|
-
import { HttpParser } from '../../protocols/http/index.js';
|
|
9
|
-
/**
|
|
10
|
-
* Quick protocol detector for fast identification
|
|
11
|
-
*/
|
|
12
|
-
export class QuickProtocolDetector {
|
|
13
|
-
/**
|
|
14
|
-
* Check if this detector can handle the data
|
|
15
|
-
*/
|
|
16
|
-
canHandle(data) {
|
|
17
|
-
return data.length >= 1;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Perform quick detection based on first few bytes
|
|
21
|
-
*/
|
|
22
|
-
quickDetect(data) {
|
|
23
|
-
if (data.length === 0) {
|
|
24
|
-
return {
|
|
25
|
-
protocol: 'unknown',
|
|
26
|
-
confidence: 0,
|
|
27
|
-
requiresMoreData: true
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
// Check for TLS
|
|
31
|
-
const tlsResult = this.checkTls(data);
|
|
32
|
-
if (tlsResult.confidence > 80) {
|
|
33
|
-
return tlsResult;
|
|
34
|
-
}
|
|
35
|
-
// Check for HTTP
|
|
36
|
-
const httpResult = this.checkHttp(data);
|
|
37
|
-
if (httpResult.confidence > 80) {
|
|
38
|
-
return httpResult;
|
|
39
|
-
}
|
|
40
|
-
// Need more data or unknown
|
|
41
|
-
return {
|
|
42
|
-
protocol: 'unknown',
|
|
43
|
-
confidence: 0,
|
|
44
|
-
requiresMoreData: data.length < 20
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Check if data looks like TLS
|
|
49
|
-
*/
|
|
50
|
-
checkTls(data) {
|
|
51
|
-
if (data.length < 3) {
|
|
52
|
-
return {
|
|
53
|
-
protocol: 'tls',
|
|
54
|
-
confidence: 0,
|
|
55
|
-
requiresMoreData: true
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
const firstByte = data[0];
|
|
59
|
-
const secondByte = data[1];
|
|
60
|
-
// Check for valid TLS record type
|
|
61
|
-
const validRecordTypes = [
|
|
62
|
-
TlsRecordType.CHANGE_CIPHER_SPEC,
|
|
63
|
-
TlsRecordType.ALERT,
|
|
64
|
-
TlsRecordType.HANDSHAKE,
|
|
65
|
-
TlsRecordType.APPLICATION_DATA,
|
|
66
|
-
TlsRecordType.HEARTBEAT
|
|
67
|
-
];
|
|
68
|
-
if (!validRecordTypes.includes(firstByte)) {
|
|
69
|
-
return {
|
|
70
|
-
protocol: 'tls',
|
|
71
|
-
confidence: 0
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
// Check TLS version byte (0x03 for all TLS/SSL versions)
|
|
75
|
-
if (secondByte !== 0x03) {
|
|
76
|
-
return {
|
|
77
|
-
protocol: 'tls',
|
|
78
|
-
confidence: 0
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
// High confidence it's TLS
|
|
82
|
-
return {
|
|
83
|
-
protocol: 'tls',
|
|
84
|
-
confidence: 95,
|
|
85
|
-
metadata: {
|
|
86
|
-
recordType: firstByte
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Check if data looks like HTTP
|
|
92
|
-
*/
|
|
93
|
-
checkHttp(data) {
|
|
94
|
-
if (data.length < 3) {
|
|
95
|
-
return {
|
|
96
|
-
protocol: 'http',
|
|
97
|
-
confidence: 0,
|
|
98
|
-
requiresMoreData: true
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
// Quick check for HTTP methods
|
|
102
|
-
const start = data.subarray(0, Math.min(10, data.length)).toString('ascii');
|
|
103
|
-
// Check common HTTP methods
|
|
104
|
-
const httpMethods = ['GET ', 'POST ', 'PUT ', 'DELETE ', 'HEAD ', 'OPTIONS', 'PATCH ', 'CONNECT', 'TRACE '];
|
|
105
|
-
for (const method of httpMethods) {
|
|
106
|
-
if (start.startsWith(method)) {
|
|
107
|
-
return {
|
|
108
|
-
protocol: 'http',
|
|
109
|
-
confidence: 95,
|
|
110
|
-
metadata: {
|
|
111
|
-
method: method.trim()
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// Check if it might be HTTP but need more data
|
|
117
|
-
if (HttpParser.isPrintableAscii(data, Math.min(20, data.length))) {
|
|
118
|
-
// Could be HTTP, but not sure
|
|
119
|
-
return {
|
|
120
|
-
protocol: 'http',
|
|
121
|
-
confidence: 30,
|
|
122
|
-
requiresMoreData: data.length < 20
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
return {
|
|
126
|
-
protocol: 'http',
|
|
127
|
-
confidence: 0
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2stZGV0ZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9kZXRlY3Rpb24vZGV0ZWN0b3JzL3F1aWNrLWRldGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRDs7R0FFRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFDaEM7O09BRUc7SUFDSCxTQUFTLENBQUMsSUFBWTtRQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxJQUFZO1FBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPO2dCQUNMLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixVQUFVLEVBQUUsQ0FBQztnQkFDYixnQkFBZ0IsRUFBRSxJQUFJO2FBQ3ZCLENBQUM7UUFDSixDQUFDO1FBRUQsZ0JBQWdCO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxTQUFTLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzlCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxpQkFBaUI7UUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDL0IsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixPQUFPO1lBQ0wsUUFBUSxFQUFFLFNBQVM7WUFDbkIsVUFBVSxFQUFFLENBQUM7WUFDYixnQkFB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
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Routing Information Extractor
|
|
3
|
-
*
|
|
4
|
-
* Extracts minimal routing information from protocols
|
|
5
|
-
* without full parsing
|
|
6
|
-
*/
|
|
7
|
-
import type { IRoutingInfo, IConnectionContext, TProtocolType } from '../../protocols/common/types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Extracts routing information from protocol data
|
|
10
|
-
*/
|
|
11
|
-
export declare class RoutingExtractor {
|
|
12
|
-
/**
|
|
13
|
-
* Extract routing info based on protocol type
|
|
14
|
-
*/
|
|
15
|
-
static extract(data: Buffer, protocol: TProtocolType, context?: IConnectionContext): IRoutingInfo | null;
|
|
16
|
-
/**
|
|
17
|
-
* Extract routing from TLS ClientHello (SNI)
|
|
18
|
-
*/
|
|
19
|
-
private static extractTlsRouting;
|
|
20
|
-
/**
|
|
21
|
-
* Extract routing from HTTP headers (Host header)
|
|
22
|
-
*/
|
|
23
|
-
private static extractHttpRouting;
|
|
24
|
-
/**
|
|
25
|
-
* Try to extract domain from any protocol
|
|
26
|
-
*/
|
|
27
|
-
static extractDomain(data: Buffer, hint?: TProtocolType): string | null;
|
|
28
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Routing Information Extractor
|
|
3
|
-
*
|
|
4
|
-
* Extracts minimal routing information from protocols
|
|
5
|
-
* without full parsing
|
|
6
|
-
*/
|
|
7
|
-
import { SniExtraction } from '../../protocols/tls/sni/sni-extraction.js';
|
|
8
|
-
import { HttpParser } from '../../protocols/http/index.js';
|
|
9
|
-
/**
|
|
10
|
-
* Extracts routing information from protocol data
|
|
11
|
-
*/
|
|
12
|
-
export class RoutingExtractor {
|
|
13
|
-
/**
|
|
14
|
-
* Extract routing info based on protocol type
|
|
15
|
-
*/
|
|
16
|
-
static extract(data, protocol, context) {
|
|
17
|
-
switch (protocol) {
|
|
18
|
-
case 'tls':
|
|
19
|
-
case 'https':
|
|
20
|
-
return this.extractTlsRouting(data, context);
|
|
21
|
-
case 'http':
|
|
22
|
-
return this.extractHttpRouting(data);
|
|
23
|
-
default:
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Extract routing from TLS ClientHello (SNI)
|
|
29
|
-
*/
|
|
30
|
-
static extractTlsRouting(data, context) {
|
|
31
|
-
try {
|
|
32
|
-
// Quick SNI extraction without full parsing
|
|
33
|
-
const sni = SniExtraction.extractSNI(data);
|
|
34
|
-
if (sni) {
|
|
35
|
-
return {
|
|
36
|
-
domain: sni,
|
|
37
|
-
protocol: 'tls',
|
|
38
|
-
port: 443 // Default HTTPS port
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
// Extraction failed, return null
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Extract routing from HTTP headers (Host header)
|
|
50
|
-
*/
|
|
51
|
-
static extractHttpRouting(data) {
|
|
52
|
-
try {
|
|
53
|
-
// Look for first line
|
|
54
|
-
const firstLineEnd = data.indexOf('\n');
|
|
55
|
-
if (firstLineEnd === -1) {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
// Parse request line
|
|
59
|
-
const firstLine = data.subarray(0, firstLineEnd).toString('ascii').trim();
|
|
60
|
-
const requestLine = HttpParser.parseRequestLine(firstLine);
|
|
61
|
-
if (!requestLine) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
// Look for Host header
|
|
65
|
-
let pos = firstLineEnd + 1;
|
|
66
|
-
const maxSearch = Math.min(data.length, 4096); // Don't search too far
|
|
67
|
-
while (pos < maxSearch) {
|
|
68
|
-
const lineEnd = data.indexOf('\n', pos);
|
|
69
|
-
if (lineEnd === -1)
|
|
70
|
-
break;
|
|
71
|
-
const line = data.subarray(pos, lineEnd).toString('ascii').trim();
|
|
72
|
-
// Empty line means end of headers
|
|
73
|
-
if (line.length === 0)
|
|
74
|
-
break;
|
|
75
|
-
// Check for Host header
|
|
76
|
-
if (line.toLowerCase().startsWith('host:')) {
|
|
77
|
-
const hostValue = line.substring(5).trim();
|
|
78
|
-
const domain = HttpParser.extractDomainFromHost(hostValue);
|
|
79
|
-
return {
|
|
80
|
-
domain,
|
|
81
|
-
path: requestLine.path,
|
|
82
|
-
protocol: 'http',
|
|
83
|
-
port: 80 // Default HTTP port
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
pos = lineEnd + 1;
|
|
87
|
-
}
|
|
88
|
-
// No Host header found, but we have the path
|
|
89
|
-
return {
|
|
90
|
-
path: requestLine.path,
|
|
91
|
-
protocol: 'http',
|
|
92
|
-
port: 80
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
// Extraction failed
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Try to extract domain from any protocol
|
|
102
|
-
*/
|
|
103
|
-
static extractDomain(data, hint) {
|
|
104
|
-
// If we have a hint, use it
|
|
105
|
-
if (hint) {
|
|
106
|
-
const routing = this.extract(data, hint);
|
|
107
|
-
return routing?.domain || null;
|
|
108
|
-
}
|
|
109
|
-
// Try TLS first (more specific)
|
|
110
|
-
const tlsRouting = this.extractTlsRouting(data);
|
|
111
|
-
if (tlsRouting?.domain) {
|
|
112
|
-
return tlsRouting.domain;
|
|
113
|
-
}
|
|
114
|
-
// Try HTTP
|
|
115
|
-
const httpRouting = this.extractHttpRouting(data);
|
|
116
|
-
if (httpRouting?.domain) {
|
|
117
|
-
return httpRouting.domain;
|
|
118
|
-
}
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy1leHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9kZXRlY3Rpb24vZGV0ZWN0b3JzL3JvdXRpbmctZXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRDs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0I7O09BRUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUNaLElBQVksRUFDWixRQUF1QixFQUN2QixPQUE0QjtRQUU1QixRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUUvQyxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdkM7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDOUIsSUFBWSxFQUNaLE9BQTRCO1FBRTVCLElBQUksQ0FBQztZQUNILDRDQUE0QztZQUM1QyxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTNDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsT0FBTztvQkFDTCxNQUFNLEVBQUUsR0FBRztvQkFDWCxRQUFRLEVBQUUsS0FBSztvQkFDZixJQUFJLEVBQUUsR0FBRyxDQUFFLHFCQUFxQjtpQkFDakMsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFB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
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TLS protocol detector
|
|
3
|
-
*/
|
|
4
|
-
import type { IProtocolDetector } from '../models/interfaces.js';
|
|
5
|
-
import type { IDetectionResult, IDetectionOptions } from '../models/detection-types.js';
|
|
6
|
-
/**
|
|
7
|
-
* TLS detector implementation
|
|
8
|
-
*/
|
|
9
|
-
export declare class TlsDetector implements IProtocolDetector {
|
|
10
|
-
/**
|
|
11
|
-
* Minimum bytes needed to identify TLS (record header)
|
|
12
|
-
*/
|
|
13
|
-
private static readonly MIN_TLS_HEADER_SIZE;
|
|
14
|
-
/**
|
|
15
|
-
* Detect TLS protocol from buffer
|
|
16
|
-
*/
|
|
17
|
-
detect(buffer: Buffer, options?: IDetectionOptions): IDetectionResult | null;
|
|
18
|
-
/**
|
|
19
|
-
* Check if buffer can be handled by this detector
|
|
20
|
-
*/
|
|
21
|
-
canHandle(buffer: Buffer): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Get minimum bytes needed for detection
|
|
24
|
-
*/
|
|
25
|
-
getMinimumBytes(): number;
|
|
26
|
-
/**
|
|
27
|
-
* Check if buffer contains a valid TLS record
|
|
28
|
-
*/
|
|
29
|
-
private isTlsRecord;
|
|
30
|
-
/**
|
|
31
|
-
* Parse ALPN extension data
|
|
32
|
-
*/
|
|
33
|
-
private parseAlpnExtension;
|
|
34
|
-
/**
|
|
35
|
-
* Parse cipher suites
|
|
36
|
-
*/
|
|
37
|
-
private parseCipherSuites;
|
|
38
|
-
/**
|
|
39
|
-
* Detect with context for fragmented data
|
|
40
|
-
*/
|
|
41
|
-
detectWithContext(buffer: Buffer, _context: {
|
|
42
|
-
sourceIp?: string;
|
|
43
|
-
sourcePort?: number;
|
|
44
|
-
destIp?: string;
|
|
45
|
-
destPort?: number;
|
|
46
|
-
}, options?: IDetectionOptions): IDetectionResult | null;
|
|
47
|
-
}
|