@push.rocks/smartproxy 25.17.10 → 26.0.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 (179) hide show
  1. package/changelog.md +8 -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/socket-handler-server.js +6 -1
  18. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.d.ts +0 -7
  19. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +50 -51
  20. package/dist_ts/routing/index.d.ts +0 -1
  21. package/dist_ts/routing/index.js +1 -3
  22. package/package.json +1 -1
  23. package/ts/00_commitinfo_data.ts +1 -1
  24. package/ts/core/index.ts +0 -1
  25. package/ts/core/models/index.ts +0 -1
  26. package/ts/core/utils/index.ts +0 -12
  27. package/ts/index.ts +1 -7
  28. package/ts/protocols/http/index.ts +1 -2
  29. package/ts/protocols/index.ts +0 -7
  30. package/ts/proxies/smart-proxy/socket-handler-server.ts +6 -0
  31. package/ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.ts +60 -59
  32. package/ts/routing/index.ts +0 -3
  33. package/dist_ts/core/events/index.d.ts +0 -4
  34. package/dist_ts/core/events/index.js +0 -5
  35. package/dist_ts/core/models/socket-augmentation.d.ts +0 -15
  36. package/dist_ts/core/models/socket-augmentation.js +0 -18
  37. package/dist_ts/core/utils/async-utils.d.ts +0 -81
  38. package/dist_ts/core/utils/async-utils.js +0 -216
  39. package/dist_ts/core/utils/binary-heap.d.ts +0 -73
  40. package/dist_ts/core/utils/binary-heap.js +0 -193
  41. package/dist_ts/core/utils/enhanced-connection-pool.d.ts +0 -110
  42. package/dist_ts/core/utils/enhanced-connection-pool.js +0 -325
  43. package/dist_ts/core/utils/fs-utils.d.ts +0 -144
  44. package/dist_ts/core/utils/fs-utils.js +0 -252
  45. package/dist_ts/core/utils/ip-utils.d.ts +0 -69
  46. package/dist_ts/core/utils/ip-utils.js +0 -270
  47. package/dist_ts/core/utils/lifecycle-component.d.ts +0 -59
  48. package/dist_ts/core/utils/lifecycle-component.js +0 -211
  49. package/dist_ts/core/utils/log-deduplicator.d.ts +0 -39
  50. package/dist_ts/core/utils/log-deduplicator.js +0 -305
  51. package/dist_ts/core/utils/security-utils.d.ts +0 -111
  52. package/dist_ts/core/utils/security-utils.js +0 -212
  53. package/dist_ts/core/utils/shared-security-manager.d.ts +0 -128
  54. package/dist_ts/core/utils/shared-security-manager.js +0 -362
  55. package/dist_ts/core/utils/socket-utils.d.ts +0 -63
  56. package/dist_ts/core/utils/socket-utils.js +0 -249
  57. package/dist_ts/core/utils/template-utils.d.ts +0 -37
  58. package/dist_ts/core/utils/template-utils.js +0 -104
  59. package/dist_ts/core/utils/validation-utils.d.ts +0 -61
  60. package/dist_ts/core/utils/validation-utils.js +0 -149
  61. package/dist_ts/core/utils/websocket-utils.d.ts +0 -22
  62. package/dist_ts/core/utils/websocket-utils.js +0 -30
  63. package/dist_ts/detection/detectors/http-detector.d.ts +0 -33
  64. package/dist_ts/detection/detectors/http-detector.js +0 -101
  65. package/dist_ts/detection/detectors/quick-detector.d.ts +0 -28
  66. package/dist_ts/detection/detectors/quick-detector.js +0 -131
  67. package/dist_ts/detection/detectors/routing-extractor.d.ts +0 -28
  68. package/dist_ts/detection/detectors/routing-extractor.js +0 -122
  69. package/dist_ts/detection/detectors/tls-detector.d.ts +0 -47
  70. package/dist_ts/detection/detectors/tls-detector.js +0 -183
  71. package/dist_ts/detection/index.d.ts +0 -17
  72. package/dist_ts/detection/index.js +0 -22
  73. package/dist_ts/detection/models/detection-types.d.ts +0 -87
  74. package/dist_ts/detection/models/detection-types.js +0 -5
  75. package/dist_ts/detection/models/interfaces.d.ts +0 -97
  76. package/dist_ts/detection/models/interfaces.js +0 -5
  77. package/dist_ts/detection/protocol-detector.d.ts +0 -79
  78. package/dist_ts/detection/protocol-detector.js +0 -253
  79. package/dist_ts/detection/utils/buffer-utils.d.ts +0 -61
  80. package/dist_ts/detection/utils/buffer-utils.js +0 -127
  81. package/dist_ts/detection/utils/fragment-manager.d.ts +0 -31
  82. package/dist_ts/detection/utils/fragment-manager.js +0 -53
  83. package/dist_ts/detection/utils/parser-utils.d.ts +0 -42
  84. package/dist_ts/detection/utils/parser-utils.js +0 -63
  85. package/dist_ts/protocols/common/fragment-handler.d.ts +0 -73
  86. package/dist_ts/protocols/common/fragment-handler.js +0 -121
  87. package/dist_ts/protocols/common/index.d.ts +0 -7
  88. package/dist_ts/protocols/common/index.js +0 -8
  89. package/dist_ts/protocols/common/types.d.ts +0 -68
  90. package/dist_ts/protocols/common/types.js +0 -7
  91. package/dist_ts/protocols/http/parser.d.ts +0 -58
  92. package/dist_ts/protocols/http/parser.js +0 -184
  93. package/dist_ts/protocols/proxy/index.d.ts +0 -5
  94. package/dist_ts/protocols/proxy/index.js +0 -6
  95. package/dist_ts/protocols/proxy/types.d.ts +0 -47
  96. package/dist_ts/protocols/proxy/types.js +0 -6
  97. package/dist_ts/protocols/tls/alerts/index.d.ts +0 -4
  98. package/dist_ts/protocols/tls/alerts/index.js +0 -5
  99. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +0 -150
  100. package/dist_ts/protocols/tls/alerts/tls-alert.js +0 -226
  101. package/dist_ts/protocols/tls/index.d.ts +0 -12
  102. package/dist_ts/protocols/tls/index.js +0 -27
  103. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +0 -100
  104. package/dist_ts/protocols/tls/sni/client-hello-parser.js +0 -463
  105. package/dist_ts/protocols/tls/sni/index.d.ts +0 -5
  106. package/dist_ts/protocols/tls/sni/index.js +0 -6
  107. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +0 -58
  108. package/dist_ts/protocols/tls/sni/sni-extraction.js +0 -275
  109. package/dist_ts/protocols/tls/utils/index.d.ts +0 -4
  110. package/dist_ts/protocols/tls/utils/index.js +0 -5
  111. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +0 -158
  112. package/dist_ts/protocols/tls/utils/tls-utils.js +0 -187
  113. package/dist_ts/protocols/websocket/constants.d.ts +0 -55
  114. package/dist_ts/protocols/websocket/constants.js +0 -58
  115. package/dist_ts/protocols/websocket/index.d.ts +0 -7
  116. package/dist_ts/protocols/websocket/index.js +0 -8
  117. package/dist_ts/protocols/websocket/types.d.ts +0 -47
  118. package/dist_ts/protocols/websocket/types.js +0 -5
  119. package/dist_ts/protocols/websocket/utils.d.ts +0 -25
  120. package/dist_ts/protocols/websocket/utils.js +0 -103
  121. package/dist_ts/routing/router/http-router.d.ts +0 -89
  122. package/dist_ts/routing/router/http-router.js +0 -205
  123. package/dist_ts/routing/router/index.d.ts +0 -5
  124. package/dist_ts/routing/router/index.js +0 -6
  125. package/dist_ts/tls/index.d.ts +0 -16
  126. package/dist_ts/tls/index.js +0 -24
  127. package/dist_ts/tls/sni/index.d.ts +0 -4
  128. package/dist_ts/tls/sni/index.js +0 -5
  129. package/dist_ts/tls/sni/sni-handler.d.ts +0 -154
  130. package/dist_ts/tls/sni/sni-handler.js +0 -191
  131. package/ts/core/events/index.ts +0 -3
  132. package/ts/core/models/socket-augmentation.ts +0 -38
  133. package/ts/core/utils/async-utils.ts +0 -275
  134. package/ts/core/utils/binary-heap.ts +0 -225
  135. package/ts/core/utils/enhanced-connection-pool.ts +0 -425
  136. package/ts/core/utils/fs-utils.ts +0 -270
  137. package/ts/core/utils/ip-utils.ts +0 -303
  138. package/ts/core/utils/lifecycle-component.ts +0 -251
  139. package/ts/core/utils/log-deduplicator.ts +0 -370
  140. package/ts/core/utils/security-utils.ts +0 -305
  141. package/ts/core/utils/shared-security-manager.ts +0 -470
  142. package/ts/core/utils/socket-utils.ts +0 -322
  143. package/ts/core/utils/template-utils.ts +0 -124
  144. package/ts/core/utils/validation-utils.ts +0 -177
  145. package/ts/core/utils/websocket-utils.ts +0 -33
  146. package/ts/detection/detectors/http-detector.ts +0 -127
  147. package/ts/detection/detectors/quick-detector.ts +0 -148
  148. package/ts/detection/detectors/routing-extractor.ts +0 -147
  149. package/ts/detection/detectors/tls-detector.ts +0 -223
  150. package/ts/detection/index.ts +0 -25
  151. package/ts/detection/models/detection-types.ts +0 -102
  152. package/ts/detection/models/interfaces.ts +0 -115
  153. package/ts/detection/protocol-detector.ts +0 -319
  154. package/ts/detection/utils/buffer-utils.ts +0 -141
  155. package/ts/detection/utils/fragment-manager.ts +0 -64
  156. package/ts/detection/utils/parser-utils.ts +0 -77
  157. package/ts/protocols/common/fragment-handler.ts +0 -167
  158. package/ts/protocols/common/index.ts +0 -8
  159. package/ts/protocols/common/types.ts +0 -76
  160. package/ts/protocols/http/parser.ts +0 -219
  161. package/ts/protocols/proxy/index.ts +0 -6
  162. package/ts/protocols/proxy/types.ts +0 -53
  163. package/ts/protocols/tls/alerts/index.ts +0 -3
  164. package/ts/protocols/tls/alerts/tls-alert.ts +0 -259
  165. package/ts/protocols/tls/index.ts +0 -37
  166. package/ts/protocols/tls/sni/client-hello-parser.ts +0 -629
  167. package/ts/protocols/tls/sni/index.ts +0 -6
  168. package/ts/protocols/tls/sni/sni-extraction.ts +0 -353
  169. package/ts/protocols/tls/utils/index.ts +0 -3
  170. package/ts/protocols/tls/utils/tls-utils.ts +0 -201
  171. package/ts/protocols/websocket/constants.ts +0 -60
  172. package/ts/protocols/websocket/index.ts +0 -8
  173. package/ts/protocols/websocket/types.ts +0 -53
  174. package/ts/protocols/websocket/utils.ts +0 -98
  175. package/ts/routing/router/http-router.ts +0 -266
  176. package/ts/routing/router/index.ts +0 -7
  177. package/ts/tls/index.ts +0 -29
  178. package/ts/tls/sni/index.ts +0 -3
  179. 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
- }