@push.rocks/smartproxy 20.0.1 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/changelog.md +26 -0
  2. package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
  3. package/dist_ts/core/utils/proxy-protocol.js +13 -97
  4. package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
  5. package/dist_ts/core/utils/websocket-utils.js +10 -66
  6. package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
  7. package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
  8. package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
  9. package/dist_ts/detection/detectors/http-detector.js +89 -0
  10. package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
  11. package/dist_ts/detection/detectors/quick-detector.js +131 -0
  12. package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
  13. package/dist_ts/detection/detectors/routing-extractor.js +122 -0
  14. package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
  15. package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
  16. package/dist_ts/detection/detectors/tls-detector.d.ts +33 -0
  17. package/dist_ts/detection/detectors/tls-detector.js +106 -0
  18. package/dist_ts/detection/index.d.ts +17 -0
  19. package/dist_ts/detection/index.js +22 -0
  20. package/dist_ts/detection/models/detection-types.d.ts +87 -0
  21. package/dist_ts/detection/models/detection-types.js +5 -0
  22. package/dist_ts/detection/models/interfaces.d.ts +97 -0
  23. package/dist_ts/detection/models/interfaces.js +5 -0
  24. package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
  25. package/dist_ts/detection/protocol-detector-v2.js +116 -0
  26. package/dist_ts/detection/protocol-detector.d.ts +74 -0
  27. package/dist_ts/detection/protocol-detector.js +173 -0
  28. package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
  29. package/dist_ts/detection/utils/buffer-utils.js +127 -0
  30. package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
  31. package/dist_ts/detection/utils/fragment-manager.js +53 -0
  32. package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
  33. package/dist_ts/detection/utils/parser-utils.js +63 -0
  34. package/dist_ts/index.d.ts +2 -1
  35. package/dist_ts/index.js +3 -2
  36. package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
  37. package/dist_ts/protocols/common/fragment-handler.js +117 -0
  38. package/dist_ts/protocols/common/index.d.ts +7 -0
  39. package/dist_ts/protocols/common/index.js +8 -0
  40. package/dist_ts/protocols/common/types.d.ts +68 -0
  41. package/dist_ts/protocols/common/types.js +7 -0
  42. package/dist_ts/protocols/http/constants.d.ts +119 -0
  43. package/dist_ts/protocols/http/constants.js +200 -0
  44. package/dist_ts/protocols/http/index.d.ts +7 -0
  45. package/dist_ts/protocols/http/index.js +8 -0
  46. package/dist_ts/protocols/http/parser.d.ts +58 -0
  47. package/dist_ts/protocols/http/parser.js +184 -0
  48. package/dist_ts/protocols/http/types.d.ts +62 -0
  49. package/dist_ts/protocols/http/types.js +5 -0
  50. package/dist_ts/protocols/index.d.ts +11 -0
  51. package/dist_ts/protocols/index.js +12 -0
  52. package/dist_ts/protocols/proxy/index.d.ts +6 -0
  53. package/dist_ts/protocols/proxy/index.js +7 -0
  54. package/dist_ts/protocols/proxy/parser.d.ts +44 -0
  55. package/dist_ts/protocols/proxy/parser.js +153 -0
  56. package/dist_ts/protocols/proxy/types.d.ts +47 -0
  57. package/dist_ts/protocols/proxy/types.js +6 -0
  58. package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
  59. package/dist_ts/protocols/tls/alerts/index.js +5 -0
  60. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
  61. package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
  62. package/dist_ts/protocols/tls/constants.d.ts +122 -0
  63. package/dist_ts/protocols/tls/constants.js +135 -0
  64. package/dist_ts/protocols/tls/index.d.ts +12 -0
  65. package/dist_ts/protocols/tls/index.js +27 -0
  66. package/dist_ts/protocols/tls/parser.d.ts +53 -0
  67. package/dist_ts/protocols/tls/parser.js +294 -0
  68. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
  69. package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
  70. package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
  71. package/dist_ts/protocols/tls/sni/index.js +6 -0
  72. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
  73. package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
  74. package/dist_ts/protocols/tls/types.d.ts +65 -0
  75. package/dist_ts/protocols/tls/types.js +5 -0
  76. package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
  77. package/dist_ts/protocols/tls/utils/index.js +5 -0
  78. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
  79. package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
  80. package/dist_ts/protocols/websocket/constants.d.ts +55 -0
  81. package/dist_ts/protocols/websocket/constants.js +58 -0
  82. package/dist_ts/protocols/websocket/index.d.ts +7 -0
  83. package/dist_ts/protocols/websocket/index.js +8 -0
  84. package/dist_ts/protocols/websocket/types.d.ts +47 -0
  85. package/dist_ts/protocols/websocket/types.js +5 -0
  86. package/dist_ts/protocols/websocket/utils.d.ts +25 -0
  87. package/dist_ts/protocols/websocket/utils.js +103 -0
  88. package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
  89. package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
  90. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
  91. package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
  92. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
  93. package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
  94. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +1 -2
  95. package/dist_ts/proxies/smart-proxy/utils/index.js +3 -4
  96. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +112 -8
  97. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +231 -76
  98. package/dist_ts/tls/index.d.ts +5 -7
  99. package/dist_ts/tls/index.js +8 -11
  100. package/dist_ts/tls/sni/client-hello-parser.js +3 -2
  101. package/dist_ts/tls/sni/sni-handler.js +4 -4
  102. package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
  103. package/dist_ts/tls/utils/tls-utils.js +4 -116
  104. package/package.json +17 -8
  105. package/readme.md +471 -2345
  106. package/readme.plan.md +0 -0
  107. package/ts/core/utils/proxy-protocol.ts +14 -131
  108. package/ts/core/utils/websocket-utils.ts +12 -60
  109. package/ts/detection/detectors/http-detector.ts +114 -0
  110. package/ts/detection/detectors/quick-detector.ts +148 -0
  111. package/ts/detection/detectors/routing-extractor.ts +147 -0
  112. package/ts/detection/detectors/tls-detector.ts +120 -0
  113. package/ts/detection/index.ts +25 -0
  114. package/ts/detection/models/detection-types.ts +102 -0
  115. package/ts/detection/models/interfaces.ts +115 -0
  116. package/ts/detection/protocol-detector.ts +230 -0
  117. package/ts/detection/utils/buffer-utils.ts +141 -0
  118. package/ts/detection/utils/fragment-manager.ts +64 -0
  119. package/ts/detection/utils/parser-utils.ts +77 -0
  120. package/ts/index.ts +3 -2
  121. package/ts/protocols/common/fragment-handler.ts +163 -0
  122. package/ts/protocols/common/index.ts +8 -0
  123. package/ts/protocols/common/types.ts +76 -0
  124. package/ts/protocols/http/constants.ts +219 -0
  125. package/ts/protocols/http/index.ts +8 -0
  126. package/ts/protocols/http/parser.ts +219 -0
  127. package/ts/protocols/http/types.ts +70 -0
  128. package/ts/protocols/index.ts +12 -0
  129. package/ts/protocols/proxy/index.ts +7 -0
  130. package/ts/protocols/proxy/parser.ts +183 -0
  131. package/ts/protocols/proxy/types.ts +53 -0
  132. package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
  133. package/ts/protocols/tls/index.ts +37 -0
  134. package/ts/protocols/tls/sni/index.ts +6 -0
  135. package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
  136. package/ts/protocols/websocket/constants.ts +60 -0
  137. package/ts/protocols/websocket/index.ts +8 -0
  138. package/ts/protocols/websocket/types.ts +53 -0
  139. package/ts/protocols/websocket/utils.ts +98 -0
  140. package/ts/proxies/http-proxy/models/http-types.ts +29 -46
  141. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -1
  142. package/ts/proxies/smart-proxy/models/route-types.ts +0 -1
  143. package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
  144. package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
  145. package/ts/proxies/smart-proxy/utils/index.ts +2 -13
  146. package/ts/proxies/smart-proxy/utils/route-helpers.ts +323 -86
  147. package/ts/tls/index.ts +8 -12
  148. package/ts/tls/sni/sni-handler.ts +3 -3
  149. package/ts/forwarding/config/forwarding-types.ts +0 -76
  150. package/ts/forwarding/config/index.ts +0 -26
  151. package/ts/forwarding/factory/forwarding-factory.ts +0 -189
  152. package/ts/forwarding/factory/index.ts +0 -5
  153. package/ts/forwarding/handlers/base-handler.ts +0 -155
  154. package/ts/forwarding/handlers/http-handler.ts +0 -163
  155. package/ts/forwarding/handlers/https-passthrough-handler.ts +0 -185
  156. package/ts/forwarding/handlers/https-terminate-to-http-handler.ts +0 -312
  157. package/ts/forwarding/handlers/https-terminate-to-https-handler.ts +0 -297
  158. package/ts/forwarding/handlers/index.ts +0 -9
  159. package/ts/forwarding/index.ts +0 -35
  160. package/ts/proxies/smart-proxy/utils/route-patterns.ts +0 -403
  161. /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
  162. /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
  163. /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
  164. /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
@@ -0,0 +1,187 @@
1
+ import * as plugins from '../../../plugins.js';
2
+ /**
3
+ * TLS record types as defined in various RFCs
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
+ };
117
+ /**
118
+ * Utility functions for TLS protocol operations
119
+ */
120
+ export class TlsUtils {
121
+ /**
122
+ * Checks if a buffer contains a TLS handshake record
123
+ * @param buffer The buffer to check
124
+ * @returns true if the buffer starts with a TLS handshake record
125
+ */
126
+ static isTlsHandshake(buffer) {
127
+ return buffer.length > 0 && buffer[0] === TlsRecordType.HANDSHAKE;
128
+ }
129
+ /**
130
+ * Checks if a buffer contains TLS application data
131
+ * @param buffer The buffer to check
132
+ * @returns true if the buffer starts with a TLS application data record
133
+ */
134
+ static isTlsApplicationData(buffer) {
135
+ return buffer.length > 0 && buffer[0] === TlsRecordType.APPLICATION_DATA;
136
+ }
137
+ /**
138
+ * Checks if a buffer contains a TLS alert record
139
+ * @param buffer The buffer to check
140
+ * @returns true if the buffer starts with a TLS alert record
141
+ */
142
+ static isTlsAlert(buffer) {
143
+ return buffer.length > 0 && buffer[0] === TlsRecordType.ALERT;
144
+ }
145
+ /**
146
+ * Checks if a buffer contains a TLS ClientHello message
147
+ * @param buffer The buffer to check
148
+ * @returns true if the buffer appears to be a ClientHello message
149
+ */
150
+ static isClientHello(buffer) {
151
+ // Minimum ClientHello size (TLS record header + handshake header)
152
+ if (buffer.length < 9) {
153
+ return false;
154
+ }
155
+ // Check record type (must be TLS_HANDSHAKE_RECORD_TYPE)
156
+ if (buffer[0] !== TlsRecordType.HANDSHAKE) {
157
+ return false;
158
+ }
159
+ // Skip version and length in TLS record header (5 bytes total)
160
+ // Check handshake type at byte 5 (must be CLIENT_HELLO)
161
+ return buffer[5] === TlsHandshakeType.CLIENT_HELLO;
162
+ }
163
+ /**
164
+ * Gets the record length from a TLS record header
165
+ * @param buffer Buffer containing a TLS record
166
+ * @returns The record length if the buffer is valid, -1 otherwise
167
+ */
168
+ static getTlsRecordLength(buffer) {
169
+ if (buffer.length < 5) {
170
+ return -1;
171
+ }
172
+ // Bytes 3-4 contain the record length (big-endian)
173
+ return (buffer[3] << 8) + buffer[4];
174
+ }
175
+ /**
176
+ * Creates a connection ID based on source/destination information
177
+ * Used to track fragmented ClientHello messages across multiple packets
178
+ *
179
+ * @param connectionInfo Object containing connection identifiers
180
+ * @returns A string ID for the connection
181
+ */
182
+ static createConnectionId(connectionInfo) {
183
+ const { sourceIp, sourcePort, destIp, destPort } = connectionInfo;
184
+ return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
185
+ }
186
+ }
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvcHJvdG9jb2xzL3Rscy91dGlscy90bHMtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGFBTVg7QUFORCxXQUFZLGFBQWE7SUFDdkIsOEVBQXVCLENBQUE7SUFDdkIsb0RBQVUsQ0FBQTtJQUNWLDREQUFjLENBQUE7SUFDZCwwRUFBcUIsQ0FBQTtJQUNyQiw0REFBYyxDQUFBO0FBQ2hCLENBQUMsRUFOVyxhQUFhLEtBQWIsYUFBYSxRQU14QjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksZ0JBYVg7QUFiRCxXQUFZLGdCQUFnQjtJQUMxQix5RUFBaUIsQ0FBQTtJQUNqQix1RUFBZ0IsQ0FBQTtJQUNoQix1RUFBZ0IsQ0FBQTtJQUNoQixtRkFBc0IsQ0FBQTtJQUN0Qix1RkFBd0IsQ0FBQTtJQUN4QixzRUFBZ0IsQ0FBQTtJQUNoQixzRkFBd0IsQ0FBQTtJQUN4QixzRkFBd0IsQ0FBQTtJQUN4QixrRkFBc0IsQ0FBQTtJQUN0QixvRkFBdUIsQ0FBQTtJQUN2QixzRkFBd0IsQ0FBQTtJQUN4QixnRUFBYSxDQUFBO0FBQ2YsQ0FBQyxFQWJXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFhM0I7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGdCQXVCWDtBQXZCRCxXQUFZLGdCQUFnQjtJQUMxQixxRUFBZSxDQUFBO0lBQ2YscUZBQXVCLENBQUE7SUFDdkIsMkZBQTBCLENBQUE7SUFDMUIsNkVBQW1CLENBQUE7SUFDbkIsMkVBQWtCLENBQUE7SUFDbEIsMkVBQWtCLENBQUE7SUFDbEIsZ0ZBQXFCLENBQUE7SUFDckIsZ0ZBQXFCLENBQUE7SUFDckIsd0ZBQXlCLENBQUE7SUFDekIsNEhBQTJDLENBQUE7SUFDM0Msd0dB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
@@ -0,0 +1,55 @@
1
+ /**
2
+ * WebSocket Protocol Constants
3
+ * Based on RFC 6455
4
+ */
5
+ /**
6
+ * WebSocket opcode types
7
+ */
8
+ export declare enum WebSocketOpcode {
9
+ CONTINUATION = 0,
10
+ TEXT = 1,
11
+ BINARY = 2,
12
+ CLOSE = 8,
13
+ PING = 9,
14
+ PONG = 10
15
+ }
16
+ /**
17
+ * WebSocket close codes
18
+ */
19
+ export declare enum WebSocketCloseCode {
20
+ NORMAL_CLOSURE = 1000,
21
+ GOING_AWAY = 1001,
22
+ PROTOCOL_ERROR = 1002,
23
+ UNSUPPORTED_DATA = 1003,
24
+ NO_STATUS_RECEIVED = 1005,
25
+ ABNORMAL_CLOSURE = 1006,
26
+ INVALID_FRAME_PAYLOAD_DATA = 1007,
27
+ POLICY_VIOLATION = 1008,
28
+ MESSAGE_TOO_BIG = 1009,
29
+ MISSING_EXTENSION = 1010,
30
+ INTERNAL_ERROR = 1011,
31
+ SERVICE_RESTART = 1012,
32
+ TRY_AGAIN_LATER = 1013,
33
+ BAD_GATEWAY = 1014,
34
+ TLS_HANDSHAKE = 1015
35
+ }
36
+ /**
37
+ * WebSocket protocol version
38
+ */
39
+ export declare const WEBSOCKET_VERSION = 13;
40
+ /**
41
+ * WebSocket magic string for handshake
42
+ */
43
+ export declare const WEBSOCKET_MAGIC_STRING = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
44
+ /**
45
+ * WebSocket headers
46
+ */
47
+ export declare const WEBSOCKET_HEADERS: {
48
+ readonly UPGRADE: "upgrade";
49
+ readonly CONNECTION: "connection";
50
+ readonly SEC_WEBSOCKET_KEY: "sec-websocket-key";
51
+ readonly SEC_WEBSOCKET_VERSION: "sec-websocket-version";
52
+ readonly SEC_WEBSOCKET_ACCEPT: "sec-websocket-accept";
53
+ readonly SEC_WEBSOCKET_PROTOCOL: "sec-websocket-protocol";
54
+ readonly SEC_WEBSOCKET_EXTENSIONS: "sec-websocket-extensions";
55
+ };
@@ -0,0 +1,58 @@
1
+ /**
2
+ * WebSocket Protocol Constants
3
+ * Based on RFC 6455
4
+ */
5
+ /**
6
+ * WebSocket opcode types
7
+ */
8
+ export var WebSocketOpcode;
9
+ (function (WebSocketOpcode) {
10
+ WebSocketOpcode[WebSocketOpcode["CONTINUATION"] = 0] = "CONTINUATION";
11
+ WebSocketOpcode[WebSocketOpcode["TEXT"] = 1] = "TEXT";
12
+ WebSocketOpcode[WebSocketOpcode["BINARY"] = 2] = "BINARY";
13
+ WebSocketOpcode[WebSocketOpcode["CLOSE"] = 8] = "CLOSE";
14
+ WebSocketOpcode[WebSocketOpcode["PING"] = 9] = "PING";
15
+ WebSocketOpcode[WebSocketOpcode["PONG"] = 10] = "PONG";
16
+ })(WebSocketOpcode || (WebSocketOpcode = {}));
17
+ /**
18
+ * WebSocket close codes
19
+ */
20
+ export var WebSocketCloseCode;
21
+ (function (WebSocketCloseCode) {
22
+ WebSocketCloseCode[WebSocketCloseCode["NORMAL_CLOSURE"] = 1000] = "NORMAL_CLOSURE";
23
+ WebSocketCloseCode[WebSocketCloseCode["GOING_AWAY"] = 1001] = "GOING_AWAY";
24
+ WebSocketCloseCode[WebSocketCloseCode["PROTOCOL_ERROR"] = 1002] = "PROTOCOL_ERROR";
25
+ WebSocketCloseCode[WebSocketCloseCode["UNSUPPORTED_DATA"] = 1003] = "UNSUPPORTED_DATA";
26
+ WebSocketCloseCode[WebSocketCloseCode["NO_STATUS_RECEIVED"] = 1005] = "NO_STATUS_RECEIVED";
27
+ WebSocketCloseCode[WebSocketCloseCode["ABNORMAL_CLOSURE"] = 1006] = "ABNORMAL_CLOSURE";
28
+ WebSocketCloseCode[WebSocketCloseCode["INVALID_FRAME_PAYLOAD_DATA"] = 1007] = "INVALID_FRAME_PAYLOAD_DATA";
29
+ WebSocketCloseCode[WebSocketCloseCode["POLICY_VIOLATION"] = 1008] = "POLICY_VIOLATION";
30
+ WebSocketCloseCode[WebSocketCloseCode["MESSAGE_TOO_BIG"] = 1009] = "MESSAGE_TOO_BIG";
31
+ WebSocketCloseCode[WebSocketCloseCode["MISSING_EXTENSION"] = 1010] = "MISSING_EXTENSION";
32
+ WebSocketCloseCode[WebSocketCloseCode["INTERNAL_ERROR"] = 1011] = "INTERNAL_ERROR";
33
+ WebSocketCloseCode[WebSocketCloseCode["SERVICE_RESTART"] = 1012] = "SERVICE_RESTART";
34
+ WebSocketCloseCode[WebSocketCloseCode["TRY_AGAIN_LATER"] = 1013] = "TRY_AGAIN_LATER";
35
+ WebSocketCloseCode[WebSocketCloseCode["BAD_GATEWAY"] = 1014] = "BAD_GATEWAY";
36
+ WebSocketCloseCode[WebSocketCloseCode["TLS_HANDSHAKE"] = 1015] = "TLS_HANDSHAKE";
37
+ })(WebSocketCloseCode || (WebSocketCloseCode = {}));
38
+ /**
39
+ * WebSocket protocol version
40
+ */
41
+ export const WEBSOCKET_VERSION = 13;
42
+ /**
43
+ * WebSocket magic string for handshake
44
+ */
45
+ export const WEBSOCKET_MAGIC_STRING = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
46
+ /**
47
+ * WebSocket headers
48
+ */
49
+ export const WEBSOCKET_HEADERS = {
50
+ UPGRADE: 'upgrade',
51
+ CONNECTION: 'connection',
52
+ SEC_WEBSOCKET_KEY: 'sec-websocket-key',
53
+ SEC_WEBSOCKET_VERSION: 'sec-websocket-version',
54
+ SEC_WEBSOCKET_ACCEPT: 'sec-websocket-accept',
55
+ SEC_WEBSOCKET_PROTOCOL: 'sec-websocket-protocol',
56
+ SEC_WEBSOCKET_EXTENSIONS: 'sec-websocket-extensions',
57
+ };
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvcHJvdG9jb2xzL3dlYnNvY2tldC9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxlQU9YO0FBUEQsV0FBWSxlQUFlO0lBQ3pCLHFFQUFrQixDQUFBO0lBQ2xCLHFEQUFVLENBQUE7SUFDVix5REFBWSxDQUFBO0lBQ1osdURBQVcsQ0FBQTtJQUNYLHFEQUFVLENBQUE7SUFDVixzREFBVSxDQUFBO0FBQ1osQ0FBQyxFQVBXLGVBQWUsS0FBZixlQUFlLFFBTzFCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxrQkFnQlg7QUFoQkQsV0FBWSxrQkFBa0I7SUFDNUIsa0ZBQXFCLENBQUE7SUFDckIsMEVBQWlCLENBQUE7SUFDakIsa0ZBQXFCLENBQUE7SUFDckIsc0ZBQXVCLENBQUE7SUFDdkIsMEZBQXlCLENBQUE7SUFDekIsc0ZBQXVCLENBQUE7SUFDdkIsMEdBQWlDLENBQUE7SUFDakMsc0ZBQXVCLENBQUE7SUFDdkIsb0ZBQXNCLENBQUE7SUFDdEIsd0ZBQXdCLENBQUE7SUFDeEIsa0ZBQXFCLENBQUE7SUFDckIsb0ZBQXNCLENBQUE7SUFDdEIsb0ZBQXNCLENBQUE7SUFDdEIsNEVBQWtCLENBQUE7SUFDbEIsZ0ZBQW9CLENBQUE7QUFDdEIsQ0FBQyxFQWhCVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBZ0I3QjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBRXBDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsc0NBQXNDLENBQUM7QUFFN0U7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixPQUFPLEVBQUUsU0FBUztJQUNsQixVQUFVLEVBQUUsWUFBWTtJQUN4QixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMscUJBQXFCLEVBQUUsdUJBQXVCO0lBQzlDLG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxzQkFBc0IsRUFBRSx3QkFBd0I7SUFDaEQsd0JBQXdCLEVBQUUsMEJBQTBCO0NBQzVDLENBQUMifQ==
@@ -0,0 +1,7 @@
1
+ /**
2
+ * WebSocket Protocol Module
3
+ * WebSocket protocol utilities and constants
4
+ */
5
+ export * from './constants.js';
6
+ export * from './types.js';
7
+ export * from './utils.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * WebSocket Protocol Module
3
+ * WebSocket protocol utilities and constants
4
+ */
5
+ export * from './constants.js';
6
+ export * from './types.js';
7
+ export * from './utils.js';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm90b2NvbHMvd2Vic29ja2V0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxZQUFZLENBQUMifQ==
@@ -0,0 +1,47 @@
1
+ /**
2
+ * WebSocket Protocol Type Definitions
3
+ */
4
+ import type { WebSocketOpcode, WebSocketCloseCode } from './constants.js';
5
+ /**
6
+ * WebSocket frame header
7
+ */
8
+ export interface IWebSocketFrameHeader {
9
+ fin: boolean;
10
+ rsv1: boolean;
11
+ rsv2: boolean;
12
+ rsv3: boolean;
13
+ opcode: WebSocketOpcode;
14
+ masked: boolean;
15
+ payloadLength: number;
16
+ maskingKey?: Buffer;
17
+ }
18
+ /**
19
+ * WebSocket frame
20
+ */
21
+ export interface IWebSocketFrame {
22
+ header: IWebSocketFrameHeader;
23
+ payload: Buffer;
24
+ }
25
+ /**
26
+ * WebSocket close frame payload
27
+ */
28
+ export interface IWebSocketClosePayload {
29
+ code: WebSocketCloseCode;
30
+ reason?: string;
31
+ }
32
+ /**
33
+ * WebSocket handshake request headers
34
+ */
35
+ export interface IWebSocketHandshakeHeaders {
36
+ upgrade: string;
37
+ connection: string;
38
+ 'sec-websocket-key': string;
39
+ 'sec-websocket-version': string;
40
+ 'sec-websocket-protocol'?: string;
41
+ 'sec-websocket-extensions'?: string;
42
+ [key: string]: string | undefined;
43
+ }
44
+ /**
45
+ * Type for WebSocket raw data (matching ws library)
46
+ */
47
+ export type RawData = Buffer | ArrayBuffer | Buffer[] | any;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * WebSocket Protocol Type Definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm90b2NvbHMvd2Vic29ja2V0L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHIn0=
@@ -0,0 +1,25 @@
1
+ /**
2
+ * WebSocket Protocol Utilities
3
+ */
4
+ import type { RawData } from './types.js';
5
+ /**
6
+ * Get the length of a WebSocket message regardless of its type
7
+ * (handles all possible WebSocket message data types)
8
+ */
9
+ export declare function getMessageSize(data: RawData): number;
10
+ /**
11
+ * Convert any raw WebSocket data to Buffer for consistent handling
12
+ */
13
+ export declare function toBuffer(data: RawData): Buffer;
14
+ /**
15
+ * Generate WebSocket accept key from client key
16
+ */
17
+ export declare function generateAcceptKey(clientKey: string): string;
18
+ /**
19
+ * Validate WebSocket upgrade request
20
+ */
21
+ export declare function isWebSocketUpgrade(headers: Record<string, string>): boolean;
22
+ /**
23
+ * Generate random WebSocket key for client handshake
24
+ */
25
+ export declare function generateWebSocketKey(): string;
@@ -0,0 +1,103 @@
1
+ /**
2
+ * WebSocket Protocol Utilities
3
+ */
4
+ import * as crypto from 'crypto';
5
+ import { WEBSOCKET_MAGIC_STRING } from './constants.js';
6
+ /**
7
+ * Get the length of a WebSocket message regardless of its type
8
+ * (handles all possible WebSocket message data types)
9
+ */
10
+ export function getMessageSize(data) {
11
+ if (typeof data === 'string') {
12
+ // For string data, get the byte length
13
+ return Buffer.from(data, 'utf8').length;
14
+ }
15
+ else if (data instanceof Buffer) {
16
+ // For Node.js Buffer
17
+ return data.length;
18
+ }
19
+ else if (data instanceof ArrayBuffer) {
20
+ // For ArrayBuffer
21
+ return data.byteLength;
22
+ }
23
+ else if (Array.isArray(data)) {
24
+ // For array of buffers, sum their lengths
25
+ return data.reduce((sum, chunk) => {
26
+ if (chunk instanceof Buffer) {
27
+ return sum + chunk.length;
28
+ }
29
+ else if (chunk instanceof ArrayBuffer) {
30
+ return sum + chunk.byteLength;
31
+ }
32
+ return sum;
33
+ }, 0);
34
+ }
35
+ else {
36
+ // For other types, try to determine the size or return 0
37
+ try {
38
+ return Buffer.from(data).length;
39
+ }
40
+ catch (e) {
41
+ return 0;
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * Convert any raw WebSocket data to Buffer for consistent handling
47
+ */
48
+ export function toBuffer(data) {
49
+ if (typeof data === 'string') {
50
+ return Buffer.from(data, 'utf8');
51
+ }
52
+ else if (data instanceof Buffer) {
53
+ return data;
54
+ }
55
+ else if (data instanceof ArrayBuffer) {
56
+ return Buffer.from(data);
57
+ }
58
+ else if (Array.isArray(data)) {
59
+ // For array of buffers, concatenate them
60
+ return Buffer.concat(data.map(chunk => {
61
+ if (chunk instanceof Buffer) {
62
+ return chunk;
63
+ }
64
+ else if (chunk instanceof ArrayBuffer) {
65
+ return Buffer.from(chunk);
66
+ }
67
+ return Buffer.from(chunk);
68
+ }));
69
+ }
70
+ else {
71
+ // For other types, try to convert to Buffer or return empty Buffer
72
+ try {
73
+ return Buffer.from(data);
74
+ }
75
+ catch (e) {
76
+ return Buffer.alloc(0);
77
+ }
78
+ }
79
+ }
80
+ /**
81
+ * Generate WebSocket accept key from client key
82
+ */
83
+ export function generateAcceptKey(clientKey) {
84
+ const hash = crypto.createHash('sha1');
85
+ hash.update(clientKey + WEBSOCKET_MAGIC_STRING);
86
+ return hash.digest('base64');
87
+ }
88
+ /**
89
+ * Validate WebSocket upgrade request
90
+ */
91
+ export function isWebSocketUpgrade(headers) {
92
+ const upgrade = headers['upgrade'];
93
+ const connection = headers['connection'];
94
+ return upgrade?.toLowerCase() === 'websocket' &&
95
+ connection?.toLowerCase().includes('upgrade');
96
+ }
97
+ /**
98
+ * Generate random WebSocket key for client handshake
99
+ */
100
+ export function generateWebSocketKey() {
101
+ return crypto.randomBytes(16).toString('base64');
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm90b2NvbHMvd2Vic29ja2V0L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFhO0lBQzFDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsdUNBQXVDO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFDLENBQUM7U0FBTSxJQUFJLElBQUksWUFBWSxNQUFNLEVBQUUsQ0FBQztRQUNsQyxxQkFBcUI7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7U0FBTSxJQUFJLElBQUksWUFBWSxXQUFXLEVBQUUsQ0FBQztRQUN2QyxrQkFBa0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvQiwwQ0FBMEM7UUFDMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hDLElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixPQUFPLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLENBQUM7aUJBQU0sSUFBSSxLQUFLLFlBQVksV0FBVyxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FB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
@@ -1,4 +1,5 @@
1
1
  import * as plugins from '../../../plugins.js';
2
+ import { HttpStatus as ProtocolHttpStatus } from '../../../protocols/http/index.js';
2
3
  /**
3
4
  * HTTP-specific event types
4
5
  */
@@ -8,34 +9,31 @@ export declare enum HttpEvents {
8
9
  REQUEST_HANDLED = "request-handled",
9
10
  REQUEST_ERROR = "request-error"
10
11
  }
11
- /**
12
- * HTTP status codes as an enum for better type safety
13
- */
14
- export declare enum HttpStatus {
15
- OK = 200,
16
- MOVED_PERMANENTLY = 301,
17
- FOUND = 302,
18
- TEMPORARY_REDIRECT = 307,
19
- PERMANENT_REDIRECT = 308,
20
- BAD_REQUEST = 400,
21
- UNAUTHORIZED = 401,
22
- FORBIDDEN = 403,
23
- NOT_FOUND = 404,
24
- METHOD_NOT_ALLOWED = 405,
25
- REQUEST_TIMEOUT = 408,
26
- TOO_MANY_REQUESTS = 429,
27
- INTERNAL_SERVER_ERROR = 500,
28
- NOT_IMPLEMENTED = 501,
29
- BAD_GATEWAY = 502,
30
- SERVICE_UNAVAILABLE = 503,
31
- GATEWAY_TIMEOUT = 504
32
- }
12
+ export declare const HttpStatus: {
13
+ readonly OK: ProtocolHttpStatus.OK;
14
+ readonly MOVED_PERMANENTLY: ProtocolHttpStatus.MOVED_PERMANENTLY;
15
+ readonly FOUND: ProtocolHttpStatus.FOUND;
16
+ readonly TEMPORARY_REDIRECT: ProtocolHttpStatus.TEMPORARY_REDIRECT;
17
+ readonly PERMANENT_REDIRECT: ProtocolHttpStatus.PERMANENT_REDIRECT;
18
+ readonly BAD_REQUEST: ProtocolHttpStatus.BAD_REQUEST;
19
+ readonly UNAUTHORIZED: ProtocolHttpStatus.UNAUTHORIZED;
20
+ readonly FORBIDDEN: ProtocolHttpStatus.FORBIDDEN;
21
+ readonly NOT_FOUND: ProtocolHttpStatus.NOT_FOUND;
22
+ readonly METHOD_NOT_ALLOWED: ProtocolHttpStatus.METHOD_NOT_ALLOWED;
23
+ readonly REQUEST_TIMEOUT: ProtocolHttpStatus.REQUEST_TIMEOUT;
24
+ readonly TOO_MANY_REQUESTS: ProtocolHttpStatus.TOO_MANY_REQUESTS;
25
+ readonly INTERNAL_SERVER_ERROR: ProtocolHttpStatus.INTERNAL_SERVER_ERROR;
26
+ readonly NOT_IMPLEMENTED: ProtocolHttpStatus.NOT_IMPLEMENTED;
27
+ readonly BAD_GATEWAY: ProtocolHttpStatus.BAD_GATEWAY;
28
+ readonly SERVICE_UNAVAILABLE: ProtocolHttpStatus.SERVICE_UNAVAILABLE;
29
+ readonly GATEWAY_TIMEOUT: ProtocolHttpStatus.GATEWAY_TIMEOUT;
30
+ };
33
31
  /**
34
32
  * Base error class for HTTP-related errors
35
33
  */
36
34
  export declare class HttpError extends Error {
37
- readonly statusCode: HttpStatus;
38
- constructor(message: string, statusCode?: HttpStatus);
35
+ readonly statusCode: number;
36
+ constructor(message: string, statusCode?: number);
39
37
  }
40
38
  /**
41
39
  * Error related to certificate operations
@@ -50,7 +48,7 @@ export declare class CertificateError extends HttpError {
50
48
  */
51
49
  export declare class ServerError extends HttpError {
52
50
  readonly code?: string;
53
- constructor(message: string, code?: string, statusCode?: HttpStatus);
51
+ constructor(message: string, code?: string, statusCode?: number);
54
52
  }
55
53
  /**
56
54
  * Error for bad requests
@@ -70,7 +68,7 @@ export declare class NotFoundError extends HttpError {
70
68
  export interface IRedirectConfig {
71
69
  source: string;
72
70
  destination: string;
73
- type: HttpStatus;
71
+ type: number;
74
72
  preserveQuery?: boolean;
75
73
  }
76
74
  /**
@@ -92,7 +90,7 @@ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' |
92
90
  /**
93
91
  * Helper function to get HTTP status text
94
92
  */
95
- export declare function getStatusText(status: HttpStatus): string;
93
+ export declare function getStatusText(status: number): string;
96
94
  export interface IDomainOptions {
97
95
  domainName: string;
98
96
  sslRedirect: boolean;