@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.
- package/changelog.md +18 -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 +55 -0
- package/dist_ts/detection/detectors/tls-detector.js +206 -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 +1 -1
- 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 +252 -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
|
@@ -1,113 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* TLS record types as defined in various RFCs
|
|
3
|
-
*/
|
|
4
|
-
export declare enum TlsRecordType {
|
|
5
|
-
CHANGE_CIPHER_SPEC = 20,
|
|
6
|
-
ALERT = 21,
|
|
7
|
-
HANDSHAKE = 22,
|
|
8
|
-
APPLICATION_DATA = 23,
|
|
9
|
-
HEARTBEAT = 24
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* TLS handshake message types
|
|
13
|
-
*/
|
|
14
|
-
export declare enum TlsHandshakeType {
|
|
15
|
-
HELLO_REQUEST = 0,
|
|
16
|
-
CLIENT_HELLO = 1,
|
|
17
|
-
SERVER_HELLO = 2,
|
|
18
|
-
NEW_SESSION_TICKET = 4,
|
|
19
|
-
ENCRYPTED_EXTENSIONS = 8,// TLS 1.3
|
|
20
|
-
CERTIFICATE = 11,
|
|
21
|
-
SERVER_KEY_EXCHANGE = 12,
|
|
22
|
-
CERTIFICATE_REQUEST = 13,
|
|
23
|
-
SERVER_HELLO_DONE = 14,
|
|
24
|
-
CERTIFICATE_VERIFY = 15,
|
|
25
|
-
CLIENT_KEY_EXCHANGE = 16,
|
|
26
|
-
FINISHED = 20
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* TLS extension types
|
|
30
|
-
*/
|
|
31
|
-
export declare enum TlsExtensionType {
|
|
32
|
-
SERVER_NAME = 0,// SNI
|
|
33
|
-
MAX_FRAGMENT_LENGTH = 1,
|
|
34
|
-
CLIENT_CERTIFICATE_URL = 2,
|
|
35
|
-
TRUSTED_CA_KEYS = 3,
|
|
36
|
-
TRUNCATED_HMAC = 4,
|
|
37
|
-
STATUS_REQUEST = 5,// OCSP
|
|
38
|
-
SUPPORTED_GROUPS = 10,// Previously named "elliptic_curves"
|
|
39
|
-
EC_POINT_FORMATS = 11,
|
|
40
|
-
SIGNATURE_ALGORITHMS = 13,
|
|
41
|
-
APPLICATION_LAYER_PROTOCOL_NEGOTIATION = 16,// ALPN
|
|
42
|
-
SIGNED_CERTIFICATE_TIMESTAMP = 18,// Certificate Transparency
|
|
43
|
-
PADDING = 21,
|
|
44
|
-
SESSION_TICKET = 35,
|
|
45
|
-
PRE_SHARED_KEY = 41,// TLS 1.3
|
|
46
|
-
EARLY_DATA = 42,// TLS 1.3 0-RTT
|
|
47
|
-
SUPPORTED_VERSIONS = 43,// TLS 1.3
|
|
48
|
-
COOKIE = 44,// TLS 1.3
|
|
49
|
-
PSK_KEY_EXCHANGE_MODES = 45,// TLS 1.3
|
|
50
|
-
CERTIFICATE_AUTHORITIES = 47,// TLS 1.3
|
|
51
|
-
POST_HANDSHAKE_AUTH = 49,// TLS 1.3
|
|
52
|
-
SIGNATURE_ALGORITHMS_CERT = 50,// TLS 1.3
|
|
53
|
-
KEY_SHARE = 51
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* TLS alert levels
|
|
57
|
-
*/
|
|
58
|
-
export declare enum TlsAlertLevel {
|
|
59
|
-
WARNING = 1,
|
|
60
|
-
FATAL = 2
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* TLS alert description codes
|
|
64
|
-
*/
|
|
65
|
-
export declare enum TlsAlertDescription {
|
|
66
|
-
CLOSE_NOTIFY = 0,
|
|
67
|
-
UNEXPECTED_MESSAGE = 10,
|
|
68
|
-
BAD_RECORD_MAC = 20,
|
|
69
|
-
DECRYPTION_FAILED = 21,// TLS 1.0 only
|
|
70
|
-
RECORD_OVERFLOW = 22,
|
|
71
|
-
DECOMPRESSION_FAILURE = 30,// TLS 1.2 and below
|
|
72
|
-
HANDSHAKE_FAILURE = 40,
|
|
73
|
-
NO_CERTIFICATE = 41,// SSLv3 only
|
|
74
|
-
BAD_CERTIFICATE = 42,
|
|
75
|
-
UNSUPPORTED_CERTIFICATE = 43,
|
|
76
|
-
CERTIFICATE_REVOKED = 44,
|
|
77
|
-
CERTIFICATE_EXPIRED = 45,
|
|
78
|
-
CERTIFICATE_UNKNOWN = 46,
|
|
79
|
-
ILLEGAL_PARAMETER = 47,
|
|
80
|
-
UNKNOWN_CA = 48,
|
|
81
|
-
ACCESS_DENIED = 49,
|
|
82
|
-
DECODE_ERROR = 50,
|
|
83
|
-
DECRYPT_ERROR = 51,
|
|
84
|
-
EXPORT_RESTRICTION = 60,// TLS 1.0 only
|
|
85
|
-
PROTOCOL_VERSION = 70,
|
|
86
|
-
INSUFFICIENT_SECURITY = 71,
|
|
87
|
-
INTERNAL_ERROR = 80,
|
|
88
|
-
INAPPROPRIATE_FALLBACK = 86,
|
|
89
|
-
USER_CANCELED = 90,
|
|
90
|
-
NO_RENEGOTIATION = 100,// TLS 1.2 and below
|
|
91
|
-
MISSING_EXTENSION = 109,// TLS 1.3
|
|
92
|
-
UNSUPPORTED_EXTENSION = 110,// TLS 1.3
|
|
93
|
-
CERTIFICATE_REQUIRED = 111,// TLS 1.3
|
|
94
|
-
UNRECOGNIZED_NAME = 112,
|
|
95
|
-
BAD_CERTIFICATE_STATUS_RESPONSE = 113,
|
|
96
|
-
BAD_CERTIFICATE_HASH_VALUE = 114,// TLS 1.2 and below
|
|
97
|
-
UNKNOWN_PSK_IDENTITY = 115,
|
|
98
|
-
CERTIFICATE_REQUIRED_1_3 = 116,// TLS 1.3
|
|
99
|
-
NO_APPLICATION_PROTOCOL = 120
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* TLS version codes (major.minor)
|
|
103
|
-
*/
|
|
104
|
-
export declare const TlsVersion: {
|
|
105
|
-
SSL3: number[];
|
|
106
|
-
TLS1_0: number[];
|
|
107
|
-
TLS1_1: number[];
|
|
108
|
-
TLS1_2: number[];
|
|
109
|
-
TLS1_3: number[];
|
|
110
|
-
};
|
|
1
|
+
export { TlsRecordType, TlsHandshakeType, TlsExtensionType, TlsAlertLevel, TlsAlertDescription, TlsVersion } from '../../protocols/tls/index.js';
|
|
111
2
|
/**
|
|
112
3
|
* Utility functions for TLS protocol operations
|
|
113
4
|
*/
|
|
@@ -1,119 +1,7 @@
|
|
|
1
1
|
import * as plugins from '../../plugins.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export var TlsRecordType;
|
|
6
|
-
(function (TlsRecordType) {
|
|
7
|
-
TlsRecordType[TlsRecordType["CHANGE_CIPHER_SPEC"] = 20] = "CHANGE_CIPHER_SPEC";
|
|
8
|
-
TlsRecordType[TlsRecordType["ALERT"] = 21] = "ALERT";
|
|
9
|
-
TlsRecordType[TlsRecordType["HANDSHAKE"] = 22] = "HANDSHAKE";
|
|
10
|
-
TlsRecordType[TlsRecordType["APPLICATION_DATA"] = 23] = "APPLICATION_DATA";
|
|
11
|
-
TlsRecordType[TlsRecordType["HEARTBEAT"] = 24] = "HEARTBEAT";
|
|
12
|
-
})(TlsRecordType || (TlsRecordType = {}));
|
|
13
|
-
/**
|
|
14
|
-
* TLS handshake message types
|
|
15
|
-
*/
|
|
16
|
-
export var TlsHandshakeType;
|
|
17
|
-
(function (TlsHandshakeType) {
|
|
18
|
-
TlsHandshakeType[TlsHandshakeType["HELLO_REQUEST"] = 0] = "HELLO_REQUEST";
|
|
19
|
-
TlsHandshakeType[TlsHandshakeType["CLIENT_HELLO"] = 1] = "CLIENT_HELLO";
|
|
20
|
-
TlsHandshakeType[TlsHandshakeType["SERVER_HELLO"] = 2] = "SERVER_HELLO";
|
|
21
|
-
TlsHandshakeType[TlsHandshakeType["NEW_SESSION_TICKET"] = 4] = "NEW_SESSION_TICKET";
|
|
22
|
-
TlsHandshakeType[TlsHandshakeType["ENCRYPTED_EXTENSIONS"] = 8] = "ENCRYPTED_EXTENSIONS";
|
|
23
|
-
TlsHandshakeType[TlsHandshakeType["CERTIFICATE"] = 11] = "CERTIFICATE";
|
|
24
|
-
TlsHandshakeType[TlsHandshakeType["SERVER_KEY_EXCHANGE"] = 12] = "SERVER_KEY_EXCHANGE";
|
|
25
|
-
TlsHandshakeType[TlsHandshakeType["CERTIFICATE_REQUEST"] = 13] = "CERTIFICATE_REQUEST";
|
|
26
|
-
TlsHandshakeType[TlsHandshakeType["SERVER_HELLO_DONE"] = 14] = "SERVER_HELLO_DONE";
|
|
27
|
-
TlsHandshakeType[TlsHandshakeType["CERTIFICATE_VERIFY"] = 15] = "CERTIFICATE_VERIFY";
|
|
28
|
-
TlsHandshakeType[TlsHandshakeType["CLIENT_KEY_EXCHANGE"] = 16] = "CLIENT_KEY_EXCHANGE";
|
|
29
|
-
TlsHandshakeType[TlsHandshakeType["FINISHED"] = 20] = "FINISHED";
|
|
30
|
-
})(TlsHandshakeType || (TlsHandshakeType = {}));
|
|
31
|
-
/**
|
|
32
|
-
* TLS extension types
|
|
33
|
-
*/
|
|
34
|
-
export var TlsExtensionType;
|
|
35
|
-
(function (TlsExtensionType) {
|
|
36
|
-
TlsExtensionType[TlsExtensionType["SERVER_NAME"] = 0] = "SERVER_NAME";
|
|
37
|
-
TlsExtensionType[TlsExtensionType["MAX_FRAGMENT_LENGTH"] = 1] = "MAX_FRAGMENT_LENGTH";
|
|
38
|
-
TlsExtensionType[TlsExtensionType["CLIENT_CERTIFICATE_URL"] = 2] = "CLIENT_CERTIFICATE_URL";
|
|
39
|
-
TlsExtensionType[TlsExtensionType["TRUSTED_CA_KEYS"] = 3] = "TRUSTED_CA_KEYS";
|
|
40
|
-
TlsExtensionType[TlsExtensionType["TRUNCATED_HMAC"] = 4] = "TRUNCATED_HMAC";
|
|
41
|
-
TlsExtensionType[TlsExtensionType["STATUS_REQUEST"] = 5] = "STATUS_REQUEST";
|
|
42
|
-
TlsExtensionType[TlsExtensionType["SUPPORTED_GROUPS"] = 10] = "SUPPORTED_GROUPS";
|
|
43
|
-
TlsExtensionType[TlsExtensionType["EC_POINT_FORMATS"] = 11] = "EC_POINT_FORMATS";
|
|
44
|
-
TlsExtensionType[TlsExtensionType["SIGNATURE_ALGORITHMS"] = 13] = "SIGNATURE_ALGORITHMS";
|
|
45
|
-
TlsExtensionType[TlsExtensionType["APPLICATION_LAYER_PROTOCOL_NEGOTIATION"] = 16] = "APPLICATION_LAYER_PROTOCOL_NEGOTIATION";
|
|
46
|
-
TlsExtensionType[TlsExtensionType["SIGNED_CERTIFICATE_TIMESTAMP"] = 18] = "SIGNED_CERTIFICATE_TIMESTAMP";
|
|
47
|
-
TlsExtensionType[TlsExtensionType["PADDING"] = 21] = "PADDING";
|
|
48
|
-
TlsExtensionType[TlsExtensionType["SESSION_TICKET"] = 35] = "SESSION_TICKET";
|
|
49
|
-
TlsExtensionType[TlsExtensionType["PRE_SHARED_KEY"] = 41] = "PRE_SHARED_KEY";
|
|
50
|
-
TlsExtensionType[TlsExtensionType["EARLY_DATA"] = 42] = "EARLY_DATA";
|
|
51
|
-
TlsExtensionType[TlsExtensionType["SUPPORTED_VERSIONS"] = 43] = "SUPPORTED_VERSIONS";
|
|
52
|
-
TlsExtensionType[TlsExtensionType["COOKIE"] = 44] = "COOKIE";
|
|
53
|
-
TlsExtensionType[TlsExtensionType["PSK_KEY_EXCHANGE_MODES"] = 45] = "PSK_KEY_EXCHANGE_MODES";
|
|
54
|
-
TlsExtensionType[TlsExtensionType["CERTIFICATE_AUTHORITIES"] = 47] = "CERTIFICATE_AUTHORITIES";
|
|
55
|
-
TlsExtensionType[TlsExtensionType["POST_HANDSHAKE_AUTH"] = 49] = "POST_HANDSHAKE_AUTH";
|
|
56
|
-
TlsExtensionType[TlsExtensionType["SIGNATURE_ALGORITHMS_CERT"] = 50] = "SIGNATURE_ALGORITHMS_CERT";
|
|
57
|
-
TlsExtensionType[TlsExtensionType["KEY_SHARE"] = 51] = "KEY_SHARE";
|
|
58
|
-
})(TlsExtensionType || (TlsExtensionType = {}));
|
|
59
|
-
/**
|
|
60
|
-
* TLS alert levels
|
|
61
|
-
*/
|
|
62
|
-
export var TlsAlertLevel;
|
|
63
|
-
(function (TlsAlertLevel) {
|
|
64
|
-
TlsAlertLevel[TlsAlertLevel["WARNING"] = 1] = "WARNING";
|
|
65
|
-
TlsAlertLevel[TlsAlertLevel["FATAL"] = 2] = "FATAL";
|
|
66
|
-
})(TlsAlertLevel || (TlsAlertLevel = {}));
|
|
67
|
-
/**
|
|
68
|
-
* TLS alert description codes
|
|
69
|
-
*/
|
|
70
|
-
export var TlsAlertDescription;
|
|
71
|
-
(function (TlsAlertDescription) {
|
|
72
|
-
TlsAlertDescription[TlsAlertDescription["CLOSE_NOTIFY"] = 0] = "CLOSE_NOTIFY";
|
|
73
|
-
TlsAlertDescription[TlsAlertDescription["UNEXPECTED_MESSAGE"] = 10] = "UNEXPECTED_MESSAGE";
|
|
74
|
-
TlsAlertDescription[TlsAlertDescription["BAD_RECORD_MAC"] = 20] = "BAD_RECORD_MAC";
|
|
75
|
-
TlsAlertDescription[TlsAlertDescription["DECRYPTION_FAILED"] = 21] = "DECRYPTION_FAILED";
|
|
76
|
-
TlsAlertDescription[TlsAlertDescription["RECORD_OVERFLOW"] = 22] = "RECORD_OVERFLOW";
|
|
77
|
-
TlsAlertDescription[TlsAlertDescription["DECOMPRESSION_FAILURE"] = 30] = "DECOMPRESSION_FAILURE";
|
|
78
|
-
TlsAlertDescription[TlsAlertDescription["HANDSHAKE_FAILURE"] = 40] = "HANDSHAKE_FAILURE";
|
|
79
|
-
TlsAlertDescription[TlsAlertDescription["NO_CERTIFICATE"] = 41] = "NO_CERTIFICATE";
|
|
80
|
-
TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE"] = 42] = "BAD_CERTIFICATE";
|
|
81
|
-
TlsAlertDescription[TlsAlertDescription["UNSUPPORTED_CERTIFICATE"] = 43] = "UNSUPPORTED_CERTIFICATE";
|
|
82
|
-
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REVOKED"] = 44] = "CERTIFICATE_REVOKED";
|
|
83
|
-
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_EXPIRED"] = 45] = "CERTIFICATE_EXPIRED";
|
|
84
|
-
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_UNKNOWN"] = 46] = "CERTIFICATE_UNKNOWN";
|
|
85
|
-
TlsAlertDescription[TlsAlertDescription["ILLEGAL_PARAMETER"] = 47] = "ILLEGAL_PARAMETER";
|
|
86
|
-
TlsAlertDescription[TlsAlertDescription["UNKNOWN_CA"] = 48] = "UNKNOWN_CA";
|
|
87
|
-
TlsAlertDescription[TlsAlertDescription["ACCESS_DENIED"] = 49] = "ACCESS_DENIED";
|
|
88
|
-
TlsAlertDescription[TlsAlertDescription["DECODE_ERROR"] = 50] = "DECODE_ERROR";
|
|
89
|
-
TlsAlertDescription[TlsAlertDescription["DECRYPT_ERROR"] = 51] = "DECRYPT_ERROR";
|
|
90
|
-
TlsAlertDescription[TlsAlertDescription["EXPORT_RESTRICTION"] = 60] = "EXPORT_RESTRICTION";
|
|
91
|
-
TlsAlertDescription[TlsAlertDescription["PROTOCOL_VERSION"] = 70] = "PROTOCOL_VERSION";
|
|
92
|
-
TlsAlertDescription[TlsAlertDescription["INSUFFICIENT_SECURITY"] = 71] = "INSUFFICIENT_SECURITY";
|
|
93
|
-
TlsAlertDescription[TlsAlertDescription["INTERNAL_ERROR"] = 80] = "INTERNAL_ERROR";
|
|
94
|
-
TlsAlertDescription[TlsAlertDescription["INAPPROPRIATE_FALLBACK"] = 86] = "INAPPROPRIATE_FALLBACK";
|
|
95
|
-
TlsAlertDescription[TlsAlertDescription["USER_CANCELED"] = 90] = "USER_CANCELED";
|
|
96
|
-
TlsAlertDescription[TlsAlertDescription["NO_RENEGOTIATION"] = 100] = "NO_RENEGOTIATION";
|
|
97
|
-
TlsAlertDescription[TlsAlertDescription["MISSING_EXTENSION"] = 109] = "MISSING_EXTENSION";
|
|
98
|
-
TlsAlertDescription[TlsAlertDescription["UNSUPPORTED_EXTENSION"] = 110] = "UNSUPPORTED_EXTENSION";
|
|
99
|
-
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REQUIRED"] = 111] = "CERTIFICATE_REQUIRED";
|
|
100
|
-
TlsAlertDescription[TlsAlertDescription["UNRECOGNIZED_NAME"] = 112] = "UNRECOGNIZED_NAME";
|
|
101
|
-
TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE_STATUS_RESPONSE"] = 113] = "BAD_CERTIFICATE_STATUS_RESPONSE";
|
|
102
|
-
TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE_HASH_VALUE"] = 114] = "BAD_CERTIFICATE_HASH_VALUE";
|
|
103
|
-
TlsAlertDescription[TlsAlertDescription["UNKNOWN_PSK_IDENTITY"] = 115] = "UNKNOWN_PSK_IDENTITY";
|
|
104
|
-
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REQUIRED_1_3"] = 116] = "CERTIFICATE_REQUIRED_1_3";
|
|
105
|
-
TlsAlertDescription[TlsAlertDescription["NO_APPLICATION_PROTOCOL"] = 120] = "NO_APPLICATION_PROTOCOL";
|
|
106
|
-
})(TlsAlertDescription || (TlsAlertDescription = {}));
|
|
107
|
-
/**
|
|
108
|
-
* TLS version codes (major.minor)
|
|
109
|
-
*/
|
|
110
|
-
export const TlsVersion = {
|
|
111
|
-
SSL3: [0x03, 0x00],
|
|
112
|
-
TLS1_0: [0x03, 0x01],
|
|
113
|
-
TLS1_1: [0x03, 0x02],
|
|
114
|
-
TLS1_2: [0x03, 0x03],
|
|
115
|
-
TLS1_3: [0x03, 0x04],
|
|
116
|
-
};
|
|
2
|
+
import { TlsRecordType, TlsHandshakeType } from '../../protocols/tls/index.js';
|
|
3
|
+
// Re-export from protocols for backward compatibility
|
|
4
|
+
export { TlsRecordType, TlsHandshakeType, TlsExtensionType, TlsAlertLevel, TlsAlertDescription, TlsVersion } from '../../protocols/tls/index.js';
|
|
117
5
|
/**
|
|
118
6
|
* Utility functions for TLS protocol operations
|
|
119
7
|
*/
|
|
@@ -184,4 +72,4 @@ export class TlsUtils {
|
|
|
184
72
|
return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
|
|
185
73
|
}
|
|
186
74
|
}
|
|
187
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvdGxzL3V0aWxzL3Rscy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxzREFBc0Q7QUFDdEQsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsVUFBVSxFQUNYLE1BQU0sOEJBQThCLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNuQjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFjO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBYztRQUMvQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWM7UUFDckMsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLEtBQUssQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBYztRQUN4QyxrRUFBa0U7UUFDbEUsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsK0RBQStEO1FBQy9ELHdEQUF3RDtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBYztRQUM3QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUM7UUFFRCxtREFBbUQ7UUFDbkQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxjQUtoQztRQUNDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxjQUFjLENBQUM7UUFDbEUsT0FBTyxHQUFHLFFBQVEsSUFBSSxVQUFVLElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQzNELENBQUM7Q0FDRiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartproxy",
|
|
3
|
-
"version": "21.
|
|
3
|
+
"version": "21.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
package/readme.plan.md
CHANGED
|
Binary file
|
|
@@ -1,161 +1,44 @@
|
|
|
1
1
|
import * as plugins from '../../plugins.js';
|
|
2
2
|
import { logger } from './logger.js';
|
|
3
|
+
import { ProxyProtocolParser as ProtocolParser, type IProxyInfo, type IProxyParseResult } from '../../protocols/proxy/index.js';
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
7
|
-
export interface IProxyInfo {
|
|
8
|
-
protocol: 'TCP4' | 'TCP6' | 'UNKNOWN';
|
|
9
|
-
sourceIP: string;
|
|
10
|
-
sourcePort: number;
|
|
11
|
-
destinationIP: string;
|
|
12
|
-
destinationPort: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Interface for parse result including remaining data
|
|
17
|
-
*/
|
|
18
|
-
export interface IProxyParseResult {
|
|
19
|
-
proxyInfo: IProxyInfo | null;
|
|
20
|
-
remainingData: Buffer;
|
|
21
|
-
}
|
|
5
|
+
// Re-export types from protocols for backward compatibility
|
|
6
|
+
export type { IProxyInfo, IProxyParseResult } from '../../protocols/proxy/index.js';
|
|
22
7
|
|
|
23
8
|
/**
|
|
24
9
|
* Parser for PROXY protocol v1 (text format)
|
|
25
10
|
* Spec: https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt
|
|
11
|
+
*
|
|
12
|
+
* This class now delegates to the protocol parser but adds
|
|
13
|
+
* smartproxy-specific features like socket reading and logging
|
|
26
14
|
*/
|
|
27
15
|
export class ProxyProtocolParser {
|
|
28
|
-
static readonly PROXY_V1_SIGNATURE =
|
|
29
|
-
static readonly MAX_HEADER_LENGTH =
|
|
30
|
-
static readonly HEADER_TERMINATOR =
|
|
16
|
+
static readonly PROXY_V1_SIGNATURE = ProtocolParser.PROXY_V1_SIGNATURE;
|
|
17
|
+
static readonly MAX_HEADER_LENGTH = ProtocolParser.MAX_HEADER_LENGTH;
|
|
18
|
+
static readonly HEADER_TERMINATOR = ProtocolParser.HEADER_TERMINATOR;
|
|
31
19
|
|
|
32
20
|
/**
|
|
33
21
|
* Parse PROXY protocol v1 header from buffer
|
|
34
22
|
* Returns proxy info and remaining data after header
|
|
35
23
|
*/
|
|
36
24
|
static parse(data: Buffer): IProxyParseResult {
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
proxyInfo: null,
|
|
41
|
-
remainingData: data
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Find header terminator
|
|
46
|
-
const headerEndIndex = data.indexOf(this.HEADER_TERMINATOR);
|
|
47
|
-
if (headerEndIndex === -1) {
|
|
48
|
-
// Header incomplete, need more data
|
|
49
|
-
if (data.length > this.MAX_HEADER_LENGTH) {
|
|
50
|
-
// Header too long, invalid
|
|
51
|
-
throw new Error('PROXY protocol header exceeds maximum length');
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
proxyInfo: null,
|
|
55
|
-
remainingData: data
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Extract header line
|
|
60
|
-
const headerLine = data.toString('ascii', 0, headerEndIndex);
|
|
61
|
-
const remainingData = data.slice(headerEndIndex + 2); // Skip \r\n
|
|
62
|
-
|
|
63
|
-
// Parse header
|
|
64
|
-
const parts = headerLine.split(' ');
|
|
65
|
-
|
|
66
|
-
if (parts.length < 2) {
|
|
67
|
-
throw new Error(`Invalid PROXY protocol header format: ${headerLine}`);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const [signature, protocol] = parts;
|
|
71
|
-
|
|
72
|
-
// Validate protocol
|
|
73
|
-
if (!['TCP4', 'TCP6', 'UNKNOWN'].includes(protocol)) {
|
|
74
|
-
throw new Error(`Invalid PROXY protocol: ${protocol}`);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// For UNKNOWN protocol, ignore addresses
|
|
78
|
-
if (protocol === 'UNKNOWN') {
|
|
79
|
-
return {
|
|
80
|
-
proxyInfo: {
|
|
81
|
-
protocol: 'UNKNOWN',
|
|
82
|
-
sourceIP: '',
|
|
83
|
-
sourcePort: 0,
|
|
84
|
-
destinationIP: '',
|
|
85
|
-
destinationPort: 0
|
|
86
|
-
},
|
|
87
|
-
remainingData
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// For TCP4/TCP6, we need all 6 parts
|
|
92
|
-
if (parts.length !== 6) {
|
|
93
|
-
throw new Error(`Invalid PROXY protocol header format: ${headerLine}`);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const [, , srcIP, dstIP, srcPort, dstPort] = parts;
|
|
97
|
-
|
|
98
|
-
// Validate and parse ports
|
|
99
|
-
const sourcePort = parseInt(srcPort, 10);
|
|
100
|
-
const destinationPort = parseInt(dstPort, 10);
|
|
101
|
-
|
|
102
|
-
if (isNaN(sourcePort) || sourcePort < 0 || sourcePort > 65535) {
|
|
103
|
-
throw new Error(`Invalid source port: ${srcPort}`);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (isNaN(destinationPort) || destinationPort < 0 || destinationPort > 65535) {
|
|
107
|
-
throw new Error(`Invalid destination port: ${dstPort}`);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Validate IP addresses
|
|
111
|
-
const protocolType = protocol as 'TCP4' | 'TCP6' | 'UNKNOWN';
|
|
112
|
-
if (!this.isValidIP(srcIP, protocolType)) {
|
|
113
|
-
throw new Error(`Invalid source IP for ${protocol}: ${srcIP}`);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (!this.isValidIP(dstIP, protocolType)) {
|
|
117
|
-
throw new Error(`Invalid destination IP for ${protocol}: ${dstIP}`);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
proxyInfo: {
|
|
122
|
-
protocol: protocol as 'TCP4' | 'TCP6',
|
|
123
|
-
sourceIP: srcIP,
|
|
124
|
-
sourcePort,
|
|
125
|
-
destinationIP: dstIP,
|
|
126
|
-
destinationPort
|
|
127
|
-
},
|
|
128
|
-
remainingData
|
|
129
|
-
};
|
|
25
|
+
// Delegate to protocol parser
|
|
26
|
+
return ProtocolParser.parse(data);
|
|
130
27
|
}
|
|
131
28
|
|
|
132
29
|
/**
|
|
133
30
|
* Generate PROXY protocol v1 header
|
|
134
31
|
*/
|
|
135
32
|
static generate(info: IProxyInfo): Buffer {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const header = `PROXY ${info.protocol} ${info.sourceIP} ${info.destinationIP} ${info.sourcePort} ${info.destinationPort}\r\n`;
|
|
141
|
-
|
|
142
|
-
if (header.length > this.MAX_HEADER_LENGTH) {
|
|
143
|
-
throw new Error('Generated PROXY protocol header exceeds maximum length');
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return Buffer.from(header, 'ascii');
|
|
33
|
+
// Delegate to protocol parser
|
|
34
|
+
return ProtocolParser.generate(info);
|
|
147
35
|
}
|
|
148
36
|
|
|
149
37
|
/**
|
|
150
38
|
* Validate IP address format
|
|
151
39
|
*/
|
|
152
40
|
private static isValidIP(ip: string, protocol: 'TCP4' | 'TCP6' | 'UNKNOWN'): boolean {
|
|
153
|
-
|
|
154
|
-
return plugins.net.isIPv4(ip);
|
|
155
|
-
} else if (protocol === 'TCP6') {
|
|
156
|
-
return plugins.net.isIPv6(ip);
|
|
157
|
-
}
|
|
158
|
-
return false;
|
|
41
|
+
return ProtocolParser.isValidIP(ip, protocol);
|
|
159
42
|
}
|
|
160
43
|
|
|
161
44
|
/**
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WebSocket utility functions
|
|
3
|
+
*
|
|
4
|
+
* This module provides smartproxy-specific WebSocket utilities
|
|
5
|
+
* and re-exports protocol utilities from the protocols module
|
|
3
6
|
*/
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*/
|
|
9
|
-
export type RawData = Buffer | ArrayBuffer | Buffer[] | any;
|
|
8
|
+
// Import and re-export from protocols
|
|
9
|
+
import { getMessageSize as protocolGetMessageSize, toBuffer as protocolToBuffer } from '../../protocols/websocket/index.js';
|
|
10
|
+
export type { RawData } from '../../protocols/websocket/index.js';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Get the length of a WebSocket message regardless of its type
|
|
@@ -15,35 +16,9 @@ export type RawData = Buffer | ArrayBuffer | Buffer[] | any;
|
|
|
15
16
|
* @param data - The data message from WebSocket (could be any RawData type)
|
|
16
17
|
* @returns The length of the data in bytes
|
|
17
18
|
*/
|
|
18
|
-
export function getMessageSize(data: RawData): number {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return Buffer.from(data, 'utf8').length;
|
|
22
|
-
} else if (data instanceof Buffer) {
|
|
23
|
-
// For Node.js Buffer
|
|
24
|
-
return data.length;
|
|
25
|
-
} else if (data instanceof ArrayBuffer) {
|
|
26
|
-
// For ArrayBuffer
|
|
27
|
-
return data.byteLength;
|
|
28
|
-
} else if (Array.isArray(data)) {
|
|
29
|
-
// For array of buffers, sum their lengths
|
|
30
|
-
return data.reduce((sum, chunk) => {
|
|
31
|
-
if (chunk instanceof Buffer) {
|
|
32
|
-
return sum + chunk.length;
|
|
33
|
-
} else if (chunk instanceof ArrayBuffer) {
|
|
34
|
-
return sum + chunk.byteLength;
|
|
35
|
-
}
|
|
36
|
-
return sum;
|
|
37
|
-
}, 0);
|
|
38
|
-
} else {
|
|
39
|
-
// For other types, try to determine the size or return 0
|
|
40
|
-
try {
|
|
41
|
-
return Buffer.from(data).length;
|
|
42
|
-
} catch (e) {
|
|
43
|
-
console.warn('Could not determine message size', e);
|
|
44
|
-
return 0;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
19
|
+
export function getMessageSize(data: import('../../protocols/websocket/index.js').RawData): number {
|
|
20
|
+
// Delegate to protocol implementation
|
|
21
|
+
return protocolGetMessageSize(data);
|
|
47
22
|
}
|
|
48
23
|
|
|
49
24
|
/**
|
|
@@ -52,30 +27,7 @@ export function getMessageSize(data: RawData): number {
|
|
|
52
27
|
* @param data - The data message from WebSocket (could be any RawData type)
|
|
53
28
|
* @returns A Buffer containing the data
|
|
54
29
|
*/
|
|
55
|
-
export function toBuffer(data: RawData): Buffer {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
} else if (data instanceof Buffer) {
|
|
59
|
-
return data;
|
|
60
|
-
} else if (data instanceof ArrayBuffer) {
|
|
61
|
-
return Buffer.from(data);
|
|
62
|
-
} else if (Array.isArray(data)) {
|
|
63
|
-
// For array of buffers, concatenate them
|
|
64
|
-
return Buffer.concat(data.map(chunk => {
|
|
65
|
-
if (chunk instanceof Buffer) {
|
|
66
|
-
return chunk;
|
|
67
|
-
} else if (chunk instanceof ArrayBuffer) {
|
|
68
|
-
return Buffer.from(chunk);
|
|
69
|
-
}
|
|
70
|
-
return Buffer.from(chunk);
|
|
71
|
-
}));
|
|
72
|
-
} else {
|
|
73
|
-
// For other types, try to convert to Buffer or return empty Buffer
|
|
74
|
-
try {
|
|
75
|
-
return Buffer.from(data);
|
|
76
|
-
} catch (e) {
|
|
77
|
-
console.warn('Could not convert message to Buffer', e);
|
|
78
|
-
return Buffer.alloc(0);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
30
|
+
export function toBuffer(data: import('../../protocols/websocket/index.js').RawData): Buffer {
|
|
31
|
+
// Delegate to protocol implementation
|
|
32
|
+
return protocolToBuffer(data);
|
|
81
33
|
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Protocol Detector
|
|
3
|
+
*
|
|
4
|
+
* Simplified HTTP detection using the new architecture
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { IProtocolDetector } from '../models/interfaces.js';
|
|
8
|
+
import type { IDetectionResult, IDetectionOptions } from '../models/detection-types.js';
|
|
9
|
+
import type { IProtocolDetectionResult, IConnectionContext } from '../../protocols/common/types.js';
|
|
10
|
+
import type { THttpMethod } from '../../protocols/http/index.js';
|
|
11
|
+
import { QuickProtocolDetector } from './quick-detector.js';
|
|
12
|
+
import { RoutingExtractor } from './routing-extractor.js';
|
|
13
|
+
import { DetectionFragmentManager } from '../utils/fragment-manager.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Simplified HTTP detector
|
|
17
|
+
*/
|
|
18
|
+
export class HttpDetector implements IProtocolDetector {
|
|
19
|
+
private quickDetector = new QuickProtocolDetector();
|
|
20
|
+
private fragmentManager: DetectionFragmentManager;
|
|
21
|
+
|
|
22
|
+
constructor(fragmentManager?: DetectionFragmentManager) {
|
|
23
|
+
this.fragmentManager = fragmentManager || new DetectionFragmentManager();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Check if buffer can be handled by this detector
|
|
28
|
+
*/
|
|
29
|
+
canHandle(buffer: Buffer): boolean {
|
|
30
|
+
const result = this.quickDetector.quickDetect(buffer);
|
|
31
|
+
return result.protocol === 'http' && result.confidence > 50;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get minimum bytes needed for detection
|
|
36
|
+
*/
|
|
37
|
+
getMinimumBytes(): number {
|
|
38
|
+
return 4; // "GET " minimum
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Detect HTTP protocol from buffer
|
|
43
|
+
*/
|
|
44
|
+
detect(buffer: Buffer, options?: IDetectionOptions): IDetectionResult | null {
|
|
45
|
+
// Quick detection first
|
|
46
|
+
const quickResult = this.quickDetector.quickDetect(buffer);
|
|
47
|
+
|
|
48
|
+
if (quickResult.protocol !== 'http' || quickResult.confidence < 50) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Extract routing information
|
|
53
|
+
const routing = RoutingExtractor.extract(buffer, 'http');
|
|
54
|
+
|
|
55
|
+
// If we don't need full headers, we can return early
|
|
56
|
+
if (quickResult.confidence >= 95 && !options?.extractFullHeaders) {
|
|
57
|
+
return {
|
|
58
|
+
protocol: 'http',
|
|
59
|
+
connectionInfo: {
|
|
60
|
+
protocol: 'http',
|
|
61
|
+
method: quickResult.metadata?.method as THttpMethod,
|
|
62
|
+
domain: routing?.domain,
|
|
63
|
+
path: routing?.path
|
|
64
|
+
},
|
|
65
|
+
isComplete: true
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Check if we have complete headers
|
|
70
|
+
const headersEnd = buffer.indexOf('\r\n\r\n');
|
|
71
|
+
const isComplete = headersEnd !== -1;
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
protocol: 'http',
|
|
75
|
+
connectionInfo: {
|
|
76
|
+
protocol: 'http',
|
|
77
|
+
domain: routing?.domain,
|
|
78
|
+
path: routing?.path,
|
|
79
|
+
method: quickResult.metadata?.method as THttpMethod
|
|
80
|
+
},
|
|
81
|
+
isComplete,
|
|
82
|
+
bytesNeeded: isComplete ? undefined : buffer.length + 512 // Need more for headers
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Handle fragmented detection
|
|
88
|
+
*/
|
|
89
|
+
detectWithContext(
|
|
90
|
+
buffer: Buffer,
|
|
91
|
+
context: IConnectionContext,
|
|
92
|
+
options?: IDetectionOptions
|
|
93
|
+
): IDetectionResult | null {
|
|
94
|
+
const handler = this.fragmentManager.getHandler('http');
|
|
95
|
+
const connectionId = DetectionFragmentManager.createConnectionId(context);
|
|
96
|
+
|
|
97
|
+
// Add fragment
|
|
98
|
+
const result = handler.addFragment(connectionId, buffer);
|
|
99
|
+
|
|
100
|
+
if (result.error) {
|
|
101
|
+
handler.complete(connectionId);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Try detection on accumulated buffer
|
|
106
|
+
const detectResult = this.detect(result.buffer!, options);
|
|
107
|
+
|
|
108
|
+
if (detectResult && detectResult.isComplete) {
|
|
109
|
+
handler.complete(connectionId);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return detectResult;
|
|
113
|
+
}
|
|
114
|
+
}
|