@push.rocks/smartproxy 25.17.10 → 26.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/changelog.md +15 -0
  2. package/dist_rust/rustproxy_linux_amd64 +0 -0
  3. package/dist_rust/rustproxy_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +2 -2
  5. package/dist_ts/core/index.d.ts +0 -1
  6. package/dist_ts/core/index.js +1 -2
  7. package/dist_ts/core/models/index.d.ts +0 -1
  8. package/dist_ts/core/models/index.js +1 -2
  9. package/dist_ts/core/utils/index.d.ts +0 -12
  10. package/dist_ts/core/utils/index.js +1 -13
  11. package/dist_ts/index.d.ts +0 -3
  12. package/dist_ts/index.js +2 -7
  13. package/dist_ts/protocols/http/index.d.ts +0 -1
  14. package/dist_ts/protocols/http/index.js +1 -2
  15. package/dist_ts/protocols/index.d.ts +0 -7
  16. package/dist_ts/protocols/index.js +1 -8
  17. package/dist_ts/proxies/smart-proxy/models/metrics-types.d.ts +20 -0
  18. package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.d.ts +2 -1
  19. package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.js +4 -1
  20. package/dist_ts/proxies/smart-proxy/socket-handler-server.js +6 -1
  21. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.d.ts +0 -7
  22. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +50 -51
  23. package/dist_ts/routing/index.d.ts +0 -1
  24. package/dist_ts/routing/index.js +1 -3
  25. package/package.json +1 -1
  26. package/ts/00_commitinfo_data.ts +1 -1
  27. package/ts/core/index.ts +0 -1
  28. package/ts/core/models/index.ts +0 -1
  29. package/ts/core/utils/index.ts +0 -12
  30. package/ts/index.ts +1 -7
  31. package/ts/protocols/http/index.ts +1 -2
  32. package/ts/protocols/index.ts +0 -7
  33. package/ts/proxies/smart-proxy/models/metrics-types.ts +21 -0
  34. package/ts/proxies/smart-proxy/rust-metrics-adapter.ts +4 -1
  35. package/ts/proxies/smart-proxy/socket-handler-server.ts +6 -0
  36. package/ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.ts +60 -59
  37. package/ts/routing/index.ts +0 -3
  38. package/dist_ts/core/events/index.d.ts +0 -4
  39. package/dist_ts/core/events/index.js +0 -5
  40. package/dist_ts/core/models/socket-augmentation.d.ts +0 -15
  41. package/dist_ts/core/models/socket-augmentation.js +0 -18
  42. package/dist_ts/core/utils/async-utils.d.ts +0 -81
  43. package/dist_ts/core/utils/async-utils.js +0 -216
  44. package/dist_ts/core/utils/binary-heap.d.ts +0 -73
  45. package/dist_ts/core/utils/binary-heap.js +0 -193
  46. package/dist_ts/core/utils/enhanced-connection-pool.d.ts +0 -110
  47. package/dist_ts/core/utils/enhanced-connection-pool.js +0 -325
  48. package/dist_ts/core/utils/fs-utils.d.ts +0 -144
  49. package/dist_ts/core/utils/fs-utils.js +0 -252
  50. package/dist_ts/core/utils/ip-utils.d.ts +0 -69
  51. package/dist_ts/core/utils/ip-utils.js +0 -270
  52. package/dist_ts/core/utils/lifecycle-component.d.ts +0 -59
  53. package/dist_ts/core/utils/lifecycle-component.js +0 -211
  54. package/dist_ts/core/utils/log-deduplicator.d.ts +0 -39
  55. package/dist_ts/core/utils/log-deduplicator.js +0 -305
  56. package/dist_ts/core/utils/security-utils.d.ts +0 -111
  57. package/dist_ts/core/utils/security-utils.js +0 -212
  58. package/dist_ts/core/utils/shared-security-manager.d.ts +0 -128
  59. package/dist_ts/core/utils/shared-security-manager.js +0 -362
  60. package/dist_ts/core/utils/socket-utils.d.ts +0 -63
  61. package/dist_ts/core/utils/socket-utils.js +0 -249
  62. package/dist_ts/core/utils/template-utils.d.ts +0 -37
  63. package/dist_ts/core/utils/template-utils.js +0 -104
  64. package/dist_ts/core/utils/validation-utils.d.ts +0 -61
  65. package/dist_ts/core/utils/validation-utils.js +0 -149
  66. package/dist_ts/core/utils/websocket-utils.d.ts +0 -22
  67. package/dist_ts/core/utils/websocket-utils.js +0 -30
  68. package/dist_ts/detection/detectors/http-detector.d.ts +0 -33
  69. package/dist_ts/detection/detectors/http-detector.js +0 -101
  70. package/dist_ts/detection/detectors/quick-detector.d.ts +0 -28
  71. package/dist_ts/detection/detectors/quick-detector.js +0 -131
  72. package/dist_ts/detection/detectors/routing-extractor.d.ts +0 -28
  73. package/dist_ts/detection/detectors/routing-extractor.js +0 -122
  74. package/dist_ts/detection/detectors/tls-detector.d.ts +0 -47
  75. package/dist_ts/detection/detectors/tls-detector.js +0 -183
  76. package/dist_ts/detection/index.d.ts +0 -17
  77. package/dist_ts/detection/index.js +0 -22
  78. package/dist_ts/detection/models/detection-types.d.ts +0 -87
  79. package/dist_ts/detection/models/detection-types.js +0 -5
  80. package/dist_ts/detection/models/interfaces.d.ts +0 -97
  81. package/dist_ts/detection/models/interfaces.js +0 -5
  82. package/dist_ts/detection/protocol-detector.d.ts +0 -79
  83. package/dist_ts/detection/protocol-detector.js +0 -253
  84. package/dist_ts/detection/utils/buffer-utils.d.ts +0 -61
  85. package/dist_ts/detection/utils/buffer-utils.js +0 -127
  86. package/dist_ts/detection/utils/fragment-manager.d.ts +0 -31
  87. package/dist_ts/detection/utils/fragment-manager.js +0 -53
  88. package/dist_ts/detection/utils/parser-utils.d.ts +0 -42
  89. package/dist_ts/detection/utils/parser-utils.js +0 -63
  90. package/dist_ts/protocols/common/fragment-handler.d.ts +0 -73
  91. package/dist_ts/protocols/common/fragment-handler.js +0 -121
  92. package/dist_ts/protocols/common/index.d.ts +0 -7
  93. package/dist_ts/protocols/common/index.js +0 -8
  94. package/dist_ts/protocols/common/types.d.ts +0 -68
  95. package/dist_ts/protocols/common/types.js +0 -7
  96. package/dist_ts/protocols/http/parser.d.ts +0 -58
  97. package/dist_ts/protocols/http/parser.js +0 -184
  98. package/dist_ts/protocols/proxy/index.d.ts +0 -5
  99. package/dist_ts/protocols/proxy/index.js +0 -6
  100. package/dist_ts/protocols/proxy/types.d.ts +0 -47
  101. package/dist_ts/protocols/proxy/types.js +0 -6
  102. package/dist_ts/protocols/tls/alerts/index.d.ts +0 -4
  103. package/dist_ts/protocols/tls/alerts/index.js +0 -5
  104. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +0 -150
  105. package/dist_ts/protocols/tls/alerts/tls-alert.js +0 -226
  106. package/dist_ts/protocols/tls/index.d.ts +0 -12
  107. package/dist_ts/protocols/tls/index.js +0 -27
  108. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +0 -100
  109. package/dist_ts/protocols/tls/sni/client-hello-parser.js +0 -463
  110. package/dist_ts/protocols/tls/sni/index.d.ts +0 -5
  111. package/dist_ts/protocols/tls/sni/index.js +0 -6
  112. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +0 -58
  113. package/dist_ts/protocols/tls/sni/sni-extraction.js +0 -275
  114. package/dist_ts/protocols/tls/utils/index.d.ts +0 -4
  115. package/dist_ts/protocols/tls/utils/index.js +0 -5
  116. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +0 -158
  117. package/dist_ts/protocols/tls/utils/tls-utils.js +0 -187
  118. package/dist_ts/protocols/websocket/constants.d.ts +0 -55
  119. package/dist_ts/protocols/websocket/constants.js +0 -58
  120. package/dist_ts/protocols/websocket/index.d.ts +0 -7
  121. package/dist_ts/protocols/websocket/index.js +0 -8
  122. package/dist_ts/protocols/websocket/types.d.ts +0 -47
  123. package/dist_ts/protocols/websocket/types.js +0 -5
  124. package/dist_ts/protocols/websocket/utils.d.ts +0 -25
  125. package/dist_ts/protocols/websocket/utils.js +0 -103
  126. package/dist_ts/routing/router/http-router.d.ts +0 -89
  127. package/dist_ts/routing/router/http-router.js +0 -205
  128. package/dist_ts/routing/router/index.d.ts +0 -5
  129. package/dist_ts/routing/router/index.js +0 -6
  130. package/dist_ts/tls/index.d.ts +0 -16
  131. package/dist_ts/tls/index.js +0 -24
  132. package/dist_ts/tls/sni/index.d.ts +0 -4
  133. package/dist_ts/tls/sni/index.js +0 -5
  134. package/dist_ts/tls/sni/sni-handler.d.ts +0 -154
  135. package/dist_ts/tls/sni/sni-handler.js +0 -191
  136. package/ts/core/events/index.ts +0 -3
  137. package/ts/core/models/socket-augmentation.ts +0 -38
  138. package/ts/core/utils/async-utils.ts +0 -275
  139. package/ts/core/utils/binary-heap.ts +0 -225
  140. package/ts/core/utils/enhanced-connection-pool.ts +0 -425
  141. package/ts/core/utils/fs-utils.ts +0 -270
  142. package/ts/core/utils/ip-utils.ts +0 -303
  143. package/ts/core/utils/lifecycle-component.ts +0 -251
  144. package/ts/core/utils/log-deduplicator.ts +0 -370
  145. package/ts/core/utils/security-utils.ts +0 -305
  146. package/ts/core/utils/shared-security-manager.ts +0 -470
  147. package/ts/core/utils/socket-utils.ts +0 -322
  148. package/ts/core/utils/template-utils.ts +0 -124
  149. package/ts/core/utils/validation-utils.ts +0 -177
  150. package/ts/core/utils/websocket-utils.ts +0 -33
  151. package/ts/detection/detectors/http-detector.ts +0 -127
  152. package/ts/detection/detectors/quick-detector.ts +0 -148
  153. package/ts/detection/detectors/routing-extractor.ts +0 -147
  154. package/ts/detection/detectors/tls-detector.ts +0 -223
  155. package/ts/detection/index.ts +0 -25
  156. package/ts/detection/models/detection-types.ts +0 -102
  157. package/ts/detection/models/interfaces.ts +0 -115
  158. package/ts/detection/protocol-detector.ts +0 -319
  159. package/ts/detection/utils/buffer-utils.ts +0 -141
  160. package/ts/detection/utils/fragment-manager.ts +0 -64
  161. package/ts/detection/utils/parser-utils.ts +0 -77
  162. package/ts/protocols/common/fragment-handler.ts +0 -167
  163. package/ts/protocols/common/index.ts +0 -8
  164. package/ts/protocols/common/types.ts +0 -76
  165. package/ts/protocols/http/parser.ts +0 -219
  166. package/ts/protocols/proxy/index.ts +0 -6
  167. package/ts/protocols/proxy/types.ts +0 -53
  168. package/ts/protocols/tls/alerts/index.ts +0 -3
  169. package/ts/protocols/tls/alerts/tls-alert.ts +0 -259
  170. package/ts/protocols/tls/index.ts +0 -37
  171. package/ts/protocols/tls/sni/client-hello-parser.ts +0 -629
  172. package/ts/protocols/tls/sni/index.ts +0 -6
  173. package/ts/protocols/tls/sni/sni-extraction.ts +0 -353
  174. package/ts/protocols/tls/utils/index.ts +0 -3
  175. package/ts/protocols/tls/utils/tls-utils.ts +0 -201
  176. package/ts/protocols/websocket/constants.ts +0 -60
  177. package/ts/protocols/websocket/index.ts +0 -8
  178. package/ts/protocols/websocket/types.ts +0 -53
  179. package/ts/protocols/websocket/utils.ts +0 -98
  180. package/ts/routing/router/http-router.ts +0 -266
  181. package/ts/routing/router/index.ts +0 -7
  182. package/ts/tls/index.ts +0 -29
  183. package/ts/tls/sni/index.ts +0 -3
  184. package/ts/tls/sni/sni-handler.ts +0 -264
@@ -1,252 +0,0 @@
1
- /**
2
- * Async filesystem utilities for SmartProxy
3
- * Provides non-blocking alternatives to synchronous filesystem operations
4
- */
5
- import * as plugins from '../../plugins.js';
6
- export class AsyncFileSystem {
7
- /**
8
- * Check if a file or directory exists
9
- * @param path - Path to check
10
- * @returns Promise resolving to true if exists, false otherwise
11
- */
12
- static async exists(path) {
13
- try {
14
- await plugins.fs.promises.access(path);
15
- return true;
16
- }
17
- catch {
18
- return false;
19
- }
20
- }
21
- /**
22
- * Ensure a directory exists, creating it if necessary
23
- * @param dirPath - Directory path to ensure
24
- * @returns Promise that resolves when directory is ensured
25
- */
26
- static async ensureDir(dirPath) {
27
- await plugins.fs.promises.mkdir(dirPath, { recursive: true });
28
- }
29
- /**
30
- * Read a file as string
31
- * @param filePath - Path to the file
32
- * @param encoding - File encoding (default: utf8)
33
- * @returns Promise resolving to file contents
34
- */
35
- static async readFile(filePath, encoding = 'utf8') {
36
- return plugins.fs.promises.readFile(filePath, encoding);
37
- }
38
- /**
39
- * Read a file as buffer
40
- * @param filePath - Path to the file
41
- * @returns Promise resolving to file buffer
42
- */
43
- static async readFileBuffer(filePath) {
44
- return plugins.fs.promises.readFile(filePath);
45
- }
46
- /**
47
- * Write string data to a file
48
- * @param filePath - Path to the file
49
- * @param data - String data to write
50
- * @param encoding - File encoding (default: utf8)
51
- * @returns Promise that resolves when file is written
52
- */
53
- static async writeFile(filePath, data, encoding = 'utf8') {
54
- // Ensure directory exists
55
- const dir = plugins.path.dirname(filePath);
56
- await this.ensureDir(dir);
57
- await plugins.fs.promises.writeFile(filePath, data, encoding);
58
- }
59
- /**
60
- * Write buffer data to a file
61
- * @param filePath - Path to the file
62
- * @param data - Buffer data to write
63
- * @returns Promise that resolves when file is written
64
- */
65
- static async writeFileBuffer(filePath, data) {
66
- const dir = plugins.path.dirname(filePath);
67
- await this.ensureDir(dir);
68
- await plugins.fs.promises.writeFile(filePath, data);
69
- }
70
- /**
71
- * Remove a file
72
- * @param filePath - Path to the file
73
- * @returns Promise that resolves when file is removed
74
- */
75
- static async remove(filePath) {
76
- try {
77
- await plugins.fs.promises.unlink(filePath);
78
- }
79
- catch (error) {
80
- if (error.code !== 'ENOENT') {
81
- throw error;
82
- }
83
- // File doesn't exist, which is fine
84
- }
85
- }
86
- /**
87
- * Remove a directory and all its contents
88
- * @param dirPath - Path to the directory
89
- * @returns Promise that resolves when directory is removed
90
- */
91
- static async removeDir(dirPath) {
92
- try {
93
- await plugins.fs.promises.rm(dirPath, { recursive: true, force: true });
94
- }
95
- catch (error) {
96
- if (error.code !== 'ENOENT') {
97
- throw error;
98
- }
99
- }
100
- }
101
- /**
102
- * Read JSON from a file
103
- * @param filePath - Path to the JSON file
104
- * @returns Promise resolving to parsed JSON
105
- */
106
- static async readJSON(filePath) {
107
- const content = await this.readFile(filePath);
108
- return JSON.parse(content);
109
- }
110
- /**
111
- * Write JSON to a file
112
- * @param filePath - Path to the file
113
- * @param data - Data to write as JSON
114
- * @param pretty - Whether to pretty-print JSON (default: true)
115
- * @returns Promise that resolves when file is written
116
- */
117
- static async writeJSON(filePath, data, pretty = true) {
118
- const jsonString = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
119
- await this.writeFile(filePath, jsonString);
120
- }
121
- /**
122
- * Copy a file from source to destination
123
- * @param source - Source file path
124
- * @param destination - Destination file path
125
- * @returns Promise that resolves when file is copied
126
- */
127
- static async copyFile(source, destination) {
128
- const destDir = plugins.path.dirname(destination);
129
- await this.ensureDir(destDir);
130
- await plugins.fs.promises.copyFile(source, destination);
131
- }
132
- /**
133
- * Move/rename a file
134
- * @param source - Source file path
135
- * @param destination - Destination file path
136
- * @returns Promise that resolves when file is moved
137
- */
138
- static async moveFile(source, destination) {
139
- const destDir = plugins.path.dirname(destination);
140
- await this.ensureDir(destDir);
141
- await plugins.fs.promises.rename(source, destination);
142
- }
143
- /**
144
- * Get file stats
145
- * @param filePath - Path to the file
146
- * @returns Promise resolving to file stats or null if doesn't exist
147
- */
148
- static async getStats(filePath) {
149
- try {
150
- return await plugins.fs.promises.stat(filePath);
151
- }
152
- catch (error) {
153
- if (error.code === 'ENOENT') {
154
- return null;
155
- }
156
- throw error;
157
- }
158
- }
159
- /**
160
- * List files in a directory
161
- * @param dirPath - Directory path
162
- * @returns Promise resolving to array of filenames
163
- */
164
- static async listFiles(dirPath) {
165
- try {
166
- return await plugins.fs.promises.readdir(dirPath);
167
- }
168
- catch (error) {
169
- if (error.code === 'ENOENT') {
170
- return [];
171
- }
172
- throw error;
173
- }
174
- }
175
- /**
176
- * List files in a directory with full paths
177
- * @param dirPath - Directory path
178
- * @returns Promise resolving to array of full file paths
179
- */
180
- static async listFilesFullPath(dirPath) {
181
- const files = await this.listFiles(dirPath);
182
- return files.map(file => plugins.path.join(dirPath, file));
183
- }
184
- /**
185
- * Recursively list all files in a directory
186
- * @param dirPath - Directory path
187
- * @param fileList - Accumulator for file list (used internally)
188
- * @returns Promise resolving to array of all file paths
189
- */
190
- static async listFilesRecursive(dirPath, fileList = []) {
191
- const files = await this.listFiles(dirPath);
192
- for (const file of files) {
193
- const filePath = plugins.path.join(dirPath, file);
194
- const stats = await this.getStats(filePath);
195
- if (stats?.isDirectory()) {
196
- await this.listFilesRecursive(filePath, fileList);
197
- }
198
- else if (stats?.isFile()) {
199
- fileList.push(filePath);
200
- }
201
- }
202
- return fileList;
203
- }
204
- /**
205
- * Create a read stream for a file
206
- * @param filePath - Path to the file
207
- * @param options - Stream options
208
- * @returns Read stream
209
- */
210
- static createReadStream(filePath, options) {
211
- return plugins.fs.createReadStream(filePath, options);
212
- }
213
- /**
214
- * Create a write stream for a file
215
- * @param filePath - Path to the file
216
- * @param options - Stream options
217
- * @returns Write stream
218
- */
219
- static createWriteStream(filePath, options) {
220
- return plugins.fs.createWriteStream(filePath, options);
221
- }
222
- /**
223
- * Ensure a file exists, creating an empty file if necessary
224
- * @param filePath - Path to the file
225
- * @returns Promise that resolves when file is ensured
226
- */
227
- static async ensureFile(filePath) {
228
- const exists = await this.exists(filePath);
229
- if (!exists) {
230
- await this.writeFile(filePath, '');
231
- }
232
- }
233
- /**
234
- * Check if a path is a directory
235
- * @param path - Path to check
236
- * @returns Promise resolving to true if directory, false otherwise
237
- */
238
- static async isDirectory(path) {
239
- const stats = await this.getStats(path);
240
- return stats?.isDirectory() ?? false;
241
- }
242
- /**
243
- * Check if a path is a file
244
- * @param path - Path to check
245
- * @returns Promise resolving to true if file, false otherwise
246
- */
247
- static async isFile(path) {
248
- const stats = await this.getStats(path);
249
- return stats?.isFile() ?? false;
250
- }
251
- }
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2ZzLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsTUFBTSxPQUFPLGVBQWU7SUFDMUI7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVk7UUFDOUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFlO1FBQ3BDLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQWdCLEVBQUUsV0FBMkIsTUFBTTtRQUN2RSxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFnQjtRQUMxQyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FB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
@@ -1,69 +0,0 @@
1
- /**
2
- * Utility class for IP address operations
3
- */
4
- export declare class IpUtils {
5
- /**
6
- * Check if the IP matches any of the glob patterns
7
- *
8
- * This method checks IP addresses against glob patterns and handles IPv4/IPv6 normalization.
9
- * It's used to implement IP filtering based on security configurations.
10
- *
11
- * @param ip - The IP address to check
12
- * @param patterns - Array of glob patterns
13
- * @returns true if IP matches any pattern, false otherwise
14
- */
15
- static isGlobIPMatch(ip: string, patterns: string[]): boolean;
16
- /**
17
- * Normalize IP addresses for consistent comparison
18
- *
19
- * @param ip The IP address to normalize
20
- * @returns Array of normalized IP forms
21
- */
22
- static normalizeIP(ip: string): string[];
23
- /**
24
- * Check if an IP is authorized using security rules
25
- *
26
- * @param ip - The IP address to check
27
- * @param allowedIPs - Array of allowed IP patterns
28
- * @param blockedIPs - Array of blocked IP patterns
29
- * @returns true if IP is authorized, false if blocked
30
- */
31
- static isIPAuthorized(ip: string, allowedIPs?: string[], blockedIPs?: string[]): boolean;
32
- /**
33
- * Check if an IP address is a private network address
34
- *
35
- * @param ip The IP address to check
36
- * @returns true if the IP is a private network address, false otherwise
37
- */
38
- static isPrivateIP(ip: string): boolean;
39
- /**
40
- * Check if an IP address is a public network address
41
- *
42
- * @param ip The IP address to check
43
- * @returns true if the IP is a public network address, false otherwise
44
- */
45
- static isPublicIP(ip: string): boolean;
46
- /**
47
- * Check if an IP matches a CIDR notation
48
- *
49
- * @param ip The IP address to check
50
- * @param cidr The CIDR notation (e.g., "192.168.1.0/24")
51
- * @returns true if IP is within the CIDR range
52
- */
53
- private static matchCIDR;
54
- /**
55
- * Check if an IP matches a range notation
56
- *
57
- * @param ip The IP address to check
58
- * @param range The range notation (e.g., "192.168.1.1-192.168.1.100")
59
- * @returns true if IP is within the range
60
- */
61
- private static matchIPRange;
62
- /**
63
- * Convert a subnet CIDR to an IP range for filtering
64
- *
65
- * @param cidr The CIDR notation (e.g., "192.168.1.0/24")
66
- * @returns Array of glob patterns that match the CIDR range
67
- */
68
- static cidrToGlobPatterns(cidr: string): string[];
69
- }
@@ -1,270 +0,0 @@
1
- import * as plugins from '../../plugins.js';
2
- /**
3
- * Utility class for IP address operations
4
- */
5
- export class IpUtils {
6
- /**
7
- * Check if the IP matches any of the glob patterns
8
- *
9
- * This method checks IP addresses against glob patterns and handles IPv4/IPv6 normalization.
10
- * It's used to implement IP filtering based on security configurations.
11
- *
12
- * @param ip - The IP address to check
13
- * @param patterns - Array of glob patterns
14
- * @returns true if IP matches any pattern, false otherwise
15
- */
16
- static isGlobIPMatch(ip, patterns) {
17
- if (!ip || !patterns || patterns.length === 0)
18
- return false;
19
- // Normalize the IP being checked
20
- const normalizedIPVariants = this.normalizeIP(ip);
21
- if (normalizedIPVariants.length === 0)
22
- return false;
23
- // Check each pattern
24
- for (const pattern of patterns) {
25
- // Handle CIDR notation
26
- if (pattern.includes('/')) {
27
- if (this.matchCIDR(ip, pattern)) {
28
- return true;
29
- }
30
- continue;
31
- }
32
- // Handle range notation
33
- if (pattern.includes('-') && !pattern.includes('*')) {
34
- if (this.matchIPRange(ip, pattern)) {
35
- return true;
36
- }
37
- continue;
38
- }
39
- // Expand shorthand patterns for glob matching
40
- let expandedPattern = pattern;
41
- if (pattern.includes('*') && !pattern.includes(':')) {
42
- const parts = pattern.split('.');
43
- while (parts.length < 4) {
44
- parts.push('*');
45
- }
46
- expandedPattern = parts.join('.');
47
- }
48
- // Normalize and check with minimatch
49
- const normalizedPatterns = this.normalizeIP(expandedPattern);
50
- for (const ipVariant of normalizedIPVariants) {
51
- for (const normalizedPattern of normalizedPatterns) {
52
- if (plugins.minimatch(ipVariant, normalizedPattern)) {
53
- return true;
54
- }
55
- }
56
- }
57
- }
58
- return false;
59
- }
60
- /**
61
- * Normalize IP addresses for consistent comparison
62
- *
63
- * @param ip The IP address to normalize
64
- * @returns Array of normalized IP forms
65
- */
66
- static normalizeIP(ip) {
67
- if (!ip)
68
- return [];
69
- // Handle IPv4-mapped IPv6 addresses (::ffff:127.0.0.1)
70
- if (ip.startsWith('::ffff:')) {
71
- const ipv4 = ip.slice(7);
72
- return [ip, ipv4];
73
- }
74
- // Handle IPv4 addresses by also checking IPv4-mapped form
75
- if (/^\d{1,3}(\.\d{1,3}){3}$/.test(ip)) {
76
- return [ip, `::ffff:${ip}`];
77
- }
78
- return [ip];
79
- }
80
- /**
81
- * Check if an IP is authorized using security rules
82
- *
83
- * @param ip - The IP address to check
84
- * @param allowedIPs - Array of allowed IP patterns
85
- * @param blockedIPs - Array of blocked IP patterns
86
- * @returns true if IP is authorized, false if blocked
87
- */
88
- static isIPAuthorized(ip, allowedIPs = [], blockedIPs = []) {
89
- // Skip IP validation if no rules are defined
90
- if (!ip || (allowedIPs.length === 0 && blockedIPs.length === 0)) {
91
- return true;
92
- }
93
- // First check if IP is blocked - blocked IPs take precedence
94
- if (blockedIPs.length > 0 && this.isGlobIPMatch(ip, blockedIPs)) {
95
- return false;
96
- }
97
- // Then check if IP is allowed (if no allowed IPs are specified, all non-blocked IPs are allowed)
98
- return allowedIPs.length === 0 || this.isGlobIPMatch(ip, allowedIPs);
99
- }
100
- /**
101
- * Check if an IP address is a private network address
102
- *
103
- * @param ip The IP address to check
104
- * @returns true if the IP is a private network address, false otherwise
105
- */
106
- static isPrivateIP(ip) {
107
- if (!ip)
108
- return false;
109
- // Handle IPv4-mapped IPv6 addresses
110
- if (ip.startsWith('::ffff:')) {
111
- ip = ip.slice(7);
112
- }
113
- // Check IPv4 private ranges
114
- if (/^\d{1,3}(\.\d{1,3}){3}$/.test(ip)) {
115
- const parts = ip.split('.').map(Number);
116
- // Check common private ranges
117
- // 10.0.0.0/8
118
- if (parts[0] === 10)
119
- return true;
120
- // 172.16.0.0/12
121
- if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
122
- return true;
123
- // 192.168.0.0/16
124
- if (parts[0] === 192 && parts[1] === 168)
125
- return true;
126
- // 127.0.0.0/8 (localhost)
127
- if (parts[0] === 127)
128
- return true;
129
- return false;
130
- }
131
- // IPv6 local addresses
132
- return ip === '::1' || ip.startsWith('fc00:') || ip.startsWith('fd00:') || ip.startsWith('fe80:');
133
- }
134
- /**
135
- * Check if an IP address is a public network address
136
- *
137
- * @param ip The IP address to check
138
- * @returns true if the IP is a public network address, false otherwise
139
- */
140
- static isPublicIP(ip) {
141
- return !this.isPrivateIP(ip);
142
- }
143
- /**
144
- * Check if an IP matches a CIDR notation
145
- *
146
- * @param ip The IP address to check
147
- * @param cidr The CIDR notation (e.g., "192.168.1.0/24")
148
- * @returns true if IP is within the CIDR range
149
- */
150
- static matchCIDR(ip, cidr) {
151
- if (!cidr.includes('/'))
152
- return false;
153
- const [networkAddr, prefixStr] = cidr.split('/');
154
- const prefix = parseInt(prefixStr, 10);
155
- // Handle IPv4-mapped IPv6 in the IP being checked
156
- let checkIP = ip;
157
- if (checkIP.startsWith('::ffff:')) {
158
- checkIP = checkIP.slice(7);
159
- }
160
- // Handle IPv6 CIDR
161
- if (networkAddr.includes(':')) {
162
- // TODO: Implement IPv6 CIDR matching
163
- return false;
164
- }
165
- // IPv4 CIDR matching
166
- if (!/^\d{1,3}(\.\d{1,3}){3}$/.test(checkIP))
167
- return false;
168
- if (!/^\d{1,3}(\.\d{1,3}){3}$/.test(networkAddr))
169
- return false;
170
- if (isNaN(prefix) || prefix < 0 || prefix > 32)
171
- return false;
172
- const ipParts = checkIP.split('.').map(Number);
173
- const netParts = networkAddr.split('.').map(Number);
174
- // Validate IP parts
175
- for (const part of [...ipParts, ...netParts]) {
176
- if (part < 0 || part > 255)
177
- return false;
178
- }
179
- // Convert to 32-bit integers
180
- const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
181
- const netNum = (netParts[0] << 24) | (netParts[1] << 16) | (netParts[2] << 8) | netParts[3];
182
- // Create mask
183
- const mask = (-1 << (32 - prefix)) >>> 0;
184
- // Check if IP is in network range
185
- return (ipNum & mask) === (netNum & mask);
186
- }
187
- /**
188
- * Check if an IP matches a range notation
189
- *
190
- * @param ip The IP address to check
191
- * @param range The range notation (e.g., "192.168.1.1-192.168.1.100")
192
- * @returns true if IP is within the range
193
- */
194
- static matchIPRange(ip, range) {
195
- if (!range.includes('-'))
196
- return false;
197
- const [startIP, endIP] = range.split('-').map(s => s.trim());
198
- // Handle IPv4-mapped IPv6 in the IP being checked
199
- let checkIP = ip;
200
- if (checkIP.startsWith('::ffff:')) {
201
- checkIP = checkIP.slice(7);
202
- }
203
- // Only handle IPv4 for now
204
- if (!/^\d{1,3}(\.\d{1,3}){3}$/.test(checkIP))
205
- return false;
206
- if (!/^\d{1,3}(\.\d{1,3}){3}$/.test(startIP))
207
- return false;
208
- if (!/^\d{1,3}(\.\d{1,3}){3}$/.test(endIP))
209
- return false;
210
- const ipParts = checkIP.split('.').map(Number);
211
- const startParts = startIP.split('.').map(Number);
212
- const endParts = endIP.split('.').map(Number);
213
- // Validate parts
214
- for (const part of [...ipParts, ...startParts, ...endParts]) {
215
- if (part < 0 || part > 255)
216
- return false;
217
- }
218
- // Convert to 32-bit integers for comparison
219
- const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
220
- const startNum = (startParts[0] << 24) | (startParts[1] << 16) | (startParts[2] << 8) | startParts[3];
221
- const endNum = (endParts[0] << 24) | (endParts[1] << 16) | (endParts[2] << 8) | endParts[3];
222
- // Convert to unsigned for proper comparison
223
- const ipUnsigned = ipNum >>> 0;
224
- const startUnsigned = startNum >>> 0;
225
- const endUnsigned = endNum >>> 0;
226
- return ipUnsigned >= startUnsigned && ipUnsigned <= endUnsigned;
227
- }
228
- /**
229
- * Convert a subnet CIDR to an IP range for filtering
230
- *
231
- * @param cidr The CIDR notation (e.g., "192.168.1.0/24")
232
- * @returns Array of glob patterns that match the CIDR range
233
- */
234
- static cidrToGlobPatterns(cidr) {
235
- if (!cidr || !cidr.includes('/'))
236
- return [];
237
- const [ipPart, prefixPart] = cidr.split('/');
238
- const prefix = parseInt(prefixPart, 10);
239
- if (isNaN(prefix) || prefix < 0 || prefix > 32)
240
- return [];
241
- // For IPv4 only for now
242
- if (!/^\d{1,3}(\.\d{1,3}){3}$/.test(ipPart))
243
- return [];
244
- const ipParts = ipPart.split('.').map(Number);
245
- const fullMask = Math.pow(2, 32 - prefix) - 1;
246
- // Convert IP to a numeric value
247
- const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
248
- // Calculate network address (IP & ~fullMask)
249
- const networkNum = ipNum & ~fullMask;
250
- // For large ranges, return wildcard patterns
251
- if (prefix <= 8) {
252
- return [`${(networkNum >>> 24) & 255}.*.*.*`];
253
- }
254
- else if (prefix <= 16) {
255
- return [`${(networkNum >>> 24) & 255}.${(networkNum >>> 16) & 255}.*.*`];
256
- }
257
- else if (prefix <= 24) {
258
- return [`${(networkNum >>> 24) & 255}.${(networkNum >>> 16) & 255}.${(networkNum >>> 8) & 255}.*`];
259
- }
260
- // For small ranges, create individual IP patterns
261
- const patterns = [];
262
- const maxAddresses = Math.min(256, Math.pow(2, 32 - prefix));
263
- for (let i = 0; i < maxAddresses; i++) {
264
- const currentIpNum = networkNum + i;
265
- patterns.push(`${(currentIpNum >>> 24) & 255}.${(currentIpNum >>> 16) & 255}.${(currentIpNum >>> 8) & 255}.${currentIpNum & 255}`);
266
- }
267
- return patterns;
268
- }
269
- }
270
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXAtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2lwLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sT0FBTztJQUNsQjs7Ozs7Ozs7O09BU0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQVUsRUFBRSxRQUFrQjtRQUN4RCxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTVELGlDQUFpQztRQUNqQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXBELHFCQUFxQjtRQUNyQixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLHVCQUF1QjtZQUN2QixJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNoQyxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUNELFNBQVM7WUFDWCxDQUFDO1lBRUQsd0JBQXdCO1lBQ3hCLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNuQyxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dC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
@@ -1,59 +0,0 @@
1
- /**
2
- * Base class for components that need proper resource lifecycle management
3
- * Provides automatic cleanup of timers and event listeners to prevent memory leaks
4
- */
5
- export declare abstract class LifecycleComponent {
6
- private timers;
7
- private intervals;
8
- private listeners;
9
- private childComponents;
10
- protected isShuttingDown: boolean;
11
- private cleanupPromise?;
12
- /**
13
- * Create a managed setTimeout that will be automatically cleaned up
14
- */
15
- protected setTimeout(handler: Function, timeout: number): NodeJS.Timeout;
16
- /**
17
- * Create a managed setInterval that will be automatically cleaned up
18
- */
19
- protected setInterval(handler: Function, interval: number): NodeJS.Timeout;
20
- /**
21
- * Clear a managed timeout
22
- */
23
- protected clearTimeout(timer: NodeJS.Timeout): void;
24
- /**
25
- * Clear a managed interval
26
- */
27
- protected clearInterval(timer: NodeJS.Timeout): void;
28
- /**
29
- * Add a managed event listener that will be automatically removed on cleanup
30
- */
31
- protected addEventListener(target: any, event: string, handler: Function, options?: {
32
- once?: boolean;
33
- }): void;
34
- /**
35
- * Remove a specific event listener
36
- */
37
- protected removeEventListener(target: any, event: string, handler: Function): void;
38
- /**
39
- * Register a child component that should be cleaned up when this component is cleaned up
40
- */
41
- protected registerChildComponent(component: LifecycleComponent): void;
42
- /**
43
- * Unregister a child component
44
- */
45
- protected unregisterChildComponent(component: LifecycleComponent): void;
46
- /**
47
- * Override this method to implement component-specific cleanup logic
48
- */
49
- protected onCleanup(): Promise<void>;
50
- /**
51
- * Clean up all managed resources
52
- */
53
- cleanup(): Promise<void>;
54
- private performCleanup;
55
- /**
56
- * Check if the component is shutting down
57
- */
58
- protected isShuttingDownState(): boolean;
59
- }