@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.
- package/changelog.md +9 -0
- package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
- package/dist_ts/core/utils/proxy-protocol.js +13 -97
- package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
- package/dist_ts/core/utils/websocket-utils.js +10 -66
- package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
- package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
- package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
- package/dist_ts/detection/detectors/http-detector.js +89 -0
- package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
- package/dist_ts/detection/detectors/quick-detector.js +131 -0
- package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
- package/dist_ts/detection/detectors/routing-extractor.js +122 -0
- package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
- package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
- package/dist_ts/detection/detectors/tls-detector.d.ts +33 -0
- package/dist_ts/detection/detectors/tls-detector.js +106 -0
- package/dist_ts/detection/index.d.ts +17 -0
- package/dist_ts/detection/index.js +22 -0
- package/dist_ts/detection/models/detection-types.d.ts +87 -0
- package/dist_ts/detection/models/detection-types.js +5 -0
- package/dist_ts/detection/models/interfaces.d.ts +97 -0
- package/dist_ts/detection/models/interfaces.js +5 -0
- package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
- package/dist_ts/detection/protocol-detector-v2.js +116 -0
- package/dist_ts/detection/protocol-detector.d.ts +74 -0
- package/dist_ts/detection/protocol-detector.js +173 -0
- package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
- package/dist_ts/detection/utils/buffer-utils.js +127 -0
- package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
- package/dist_ts/detection/utils/fragment-manager.js +53 -0
- package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
- package/dist_ts/detection/utils/parser-utils.js +63 -0
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
- package/dist_ts/protocols/common/fragment-handler.js +117 -0
- package/dist_ts/protocols/common/index.d.ts +7 -0
- package/dist_ts/protocols/common/index.js +8 -0
- package/dist_ts/protocols/common/types.d.ts +68 -0
- package/dist_ts/protocols/common/types.js +7 -0
- package/dist_ts/protocols/http/constants.d.ts +119 -0
- package/dist_ts/protocols/http/constants.js +200 -0
- package/dist_ts/protocols/http/index.d.ts +7 -0
- package/dist_ts/protocols/http/index.js +8 -0
- package/dist_ts/protocols/http/parser.d.ts +58 -0
- package/dist_ts/protocols/http/parser.js +184 -0
- package/dist_ts/protocols/http/types.d.ts +62 -0
- package/dist_ts/protocols/http/types.js +5 -0
- package/dist_ts/protocols/index.d.ts +11 -0
- package/dist_ts/protocols/index.js +12 -0
- package/dist_ts/protocols/proxy/index.d.ts +6 -0
- package/dist_ts/protocols/proxy/index.js +7 -0
- package/dist_ts/protocols/proxy/parser.d.ts +44 -0
- package/dist_ts/protocols/proxy/parser.js +153 -0
- package/dist_ts/protocols/proxy/types.d.ts +47 -0
- package/dist_ts/protocols/proxy/types.js +6 -0
- package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
- package/dist_ts/protocols/tls/alerts/index.js +5 -0
- package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
- package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
- package/dist_ts/protocols/tls/constants.d.ts +122 -0
- package/dist_ts/protocols/tls/constants.js +135 -0
- package/dist_ts/protocols/tls/index.d.ts +12 -0
- package/dist_ts/protocols/tls/index.js +27 -0
- package/dist_ts/protocols/tls/parser.d.ts +53 -0
- package/dist_ts/protocols/tls/parser.js +294 -0
- package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
- package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
- package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
- package/dist_ts/protocols/tls/sni/index.js +6 -0
- package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
- package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
- package/dist_ts/protocols/tls/types.d.ts +65 -0
- package/dist_ts/protocols/tls/types.js +5 -0
- package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
- package/dist_ts/protocols/tls/utils/index.js +5 -0
- package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
- package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
- package/dist_ts/protocols/websocket/constants.d.ts +55 -0
- package/dist_ts/protocols/websocket/constants.js +58 -0
- package/dist_ts/protocols/websocket/index.d.ts +7 -0
- package/dist_ts/protocols/websocket/index.js +8 -0
- package/dist_ts/protocols/websocket/types.d.ts +47 -0
- package/dist_ts/protocols/websocket/types.js +5 -0
- package/dist_ts/protocols/websocket/utils.d.ts +25 -0
- package/dist_ts/protocols/websocket/utils.js +103 -0
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
- package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
- package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +2 -0
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +61 -52
- package/dist_ts/tls/index.d.ts +5 -7
- package/dist_ts/tls/index.js +8 -11
- package/dist_ts/tls/sni/client-hello-parser.js +3 -2
- package/dist_ts/tls/sni/sni-handler.js +4 -4
- package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
- package/dist_ts/tls/utils/tls-utils.js +4 -116
- package/package.json +17 -8
- package/readme.plan.md +0 -0
- package/ts/core/utils/proxy-protocol.ts +14 -131
- package/ts/core/utils/websocket-utils.ts +12 -60
- package/ts/detection/detectors/http-detector.ts +114 -0
- package/ts/detection/detectors/quick-detector.ts +148 -0
- package/ts/detection/detectors/routing-extractor.ts +147 -0
- package/ts/detection/detectors/tls-detector.ts +120 -0
- package/ts/detection/index.ts +25 -0
- package/ts/detection/models/detection-types.ts +102 -0
- package/ts/detection/models/interfaces.ts +115 -0
- package/ts/detection/protocol-detector.ts +230 -0
- package/ts/detection/utils/buffer-utils.ts +141 -0
- package/ts/detection/utils/fragment-manager.ts +64 -0
- package/ts/detection/utils/parser-utils.ts +77 -0
- package/ts/index.ts +3 -1
- package/ts/protocols/common/fragment-handler.ts +163 -0
- package/ts/protocols/common/index.ts +8 -0
- package/ts/protocols/common/types.ts +76 -0
- package/ts/protocols/http/constants.ts +219 -0
- package/ts/protocols/http/index.ts +8 -0
- package/ts/protocols/http/parser.ts +219 -0
- package/ts/protocols/http/types.ts +70 -0
- package/ts/protocols/index.ts +12 -0
- package/ts/protocols/proxy/index.ts +7 -0
- package/ts/protocols/proxy/parser.ts +183 -0
- package/ts/protocols/proxy/types.ts +53 -0
- package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
- package/ts/protocols/tls/index.ts +37 -0
- package/ts/protocols/tls/sni/index.ts +6 -0
- package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
- package/ts/protocols/websocket/constants.ts +60 -0
- package/ts/protocols/websocket/index.ts +8 -0
- package/ts/protocols/websocket/types.ts +53 -0
- package/ts/protocols/websocket/utils.ts +98 -0
- package/ts/proxies/http-proxy/models/http-types.ts +29 -46
- package/ts/proxies/smart-proxy/models/interfaces.ts +7 -0
- package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
- package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
- package/ts/proxies/smart-proxy/utils/route-helpers.ts +72 -56
- package/ts/tls/index.ts +8 -12
- package/ts/tls/sni/sni-handler.ts +3 -3
- /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
- /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
- /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
- /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;
|