@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.
- package/changelog.md +15 -0
- package/dist_rust/rustproxy_linux_amd64 +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/core/index.d.ts +0 -1
- package/dist_ts/core/index.js +1 -2
- package/dist_ts/core/models/index.d.ts +0 -1
- package/dist_ts/core/models/index.js +1 -2
- package/dist_ts/core/utils/index.d.ts +0 -12
- package/dist_ts/core/utils/index.js +1 -13
- package/dist_ts/index.d.ts +0 -3
- package/dist_ts/index.js +2 -7
- package/dist_ts/protocols/http/index.d.ts +0 -1
- package/dist_ts/protocols/http/index.js +1 -2
- package/dist_ts/protocols/index.d.ts +0 -7
- package/dist_ts/protocols/index.js +1 -8
- package/dist_ts/proxies/smart-proxy/models/metrics-types.d.ts +20 -0
- package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.d.ts +2 -1
- package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.js +4 -1
- package/dist_ts/proxies/smart-proxy/socket-handler-server.js +6 -1
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.d.ts +0 -7
- package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +50 -51
- package/dist_ts/routing/index.d.ts +0 -1
- package/dist_ts/routing/index.js +1 -3
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/index.ts +0 -1
- package/ts/core/models/index.ts +0 -1
- package/ts/core/utils/index.ts +0 -12
- package/ts/index.ts +1 -7
- package/ts/protocols/http/index.ts +1 -2
- package/ts/protocols/index.ts +0 -7
- package/ts/proxies/smart-proxy/models/metrics-types.ts +21 -0
- package/ts/proxies/smart-proxy/rust-metrics-adapter.ts +4 -1
- package/ts/proxies/smart-proxy/socket-handler-server.ts +6 -0
- package/ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.ts +60 -59
- package/ts/routing/index.ts +0 -3
- package/dist_ts/core/events/index.d.ts +0 -4
- package/dist_ts/core/events/index.js +0 -5
- package/dist_ts/core/models/socket-augmentation.d.ts +0 -15
- package/dist_ts/core/models/socket-augmentation.js +0 -18
- package/dist_ts/core/utils/async-utils.d.ts +0 -81
- package/dist_ts/core/utils/async-utils.js +0 -216
- package/dist_ts/core/utils/binary-heap.d.ts +0 -73
- package/dist_ts/core/utils/binary-heap.js +0 -193
- package/dist_ts/core/utils/enhanced-connection-pool.d.ts +0 -110
- package/dist_ts/core/utils/enhanced-connection-pool.js +0 -325
- package/dist_ts/core/utils/fs-utils.d.ts +0 -144
- package/dist_ts/core/utils/fs-utils.js +0 -252
- package/dist_ts/core/utils/ip-utils.d.ts +0 -69
- package/dist_ts/core/utils/ip-utils.js +0 -270
- package/dist_ts/core/utils/lifecycle-component.d.ts +0 -59
- package/dist_ts/core/utils/lifecycle-component.js +0 -211
- package/dist_ts/core/utils/log-deduplicator.d.ts +0 -39
- package/dist_ts/core/utils/log-deduplicator.js +0 -305
- package/dist_ts/core/utils/security-utils.d.ts +0 -111
- package/dist_ts/core/utils/security-utils.js +0 -212
- package/dist_ts/core/utils/shared-security-manager.d.ts +0 -128
- package/dist_ts/core/utils/shared-security-manager.js +0 -362
- package/dist_ts/core/utils/socket-utils.d.ts +0 -63
- package/dist_ts/core/utils/socket-utils.js +0 -249
- package/dist_ts/core/utils/template-utils.d.ts +0 -37
- package/dist_ts/core/utils/template-utils.js +0 -104
- package/dist_ts/core/utils/validation-utils.d.ts +0 -61
- package/dist_ts/core/utils/validation-utils.js +0 -149
- package/dist_ts/core/utils/websocket-utils.d.ts +0 -22
- package/dist_ts/core/utils/websocket-utils.js +0 -30
- package/dist_ts/detection/detectors/http-detector.d.ts +0 -33
- package/dist_ts/detection/detectors/http-detector.js +0 -101
- package/dist_ts/detection/detectors/quick-detector.d.ts +0 -28
- package/dist_ts/detection/detectors/quick-detector.js +0 -131
- package/dist_ts/detection/detectors/routing-extractor.d.ts +0 -28
- package/dist_ts/detection/detectors/routing-extractor.js +0 -122
- package/dist_ts/detection/detectors/tls-detector.d.ts +0 -47
- package/dist_ts/detection/detectors/tls-detector.js +0 -183
- package/dist_ts/detection/index.d.ts +0 -17
- package/dist_ts/detection/index.js +0 -22
- package/dist_ts/detection/models/detection-types.d.ts +0 -87
- package/dist_ts/detection/models/detection-types.js +0 -5
- package/dist_ts/detection/models/interfaces.d.ts +0 -97
- package/dist_ts/detection/models/interfaces.js +0 -5
- package/dist_ts/detection/protocol-detector.d.ts +0 -79
- package/dist_ts/detection/protocol-detector.js +0 -253
- package/dist_ts/detection/utils/buffer-utils.d.ts +0 -61
- package/dist_ts/detection/utils/buffer-utils.js +0 -127
- package/dist_ts/detection/utils/fragment-manager.d.ts +0 -31
- package/dist_ts/detection/utils/fragment-manager.js +0 -53
- package/dist_ts/detection/utils/parser-utils.d.ts +0 -42
- package/dist_ts/detection/utils/parser-utils.js +0 -63
- package/dist_ts/protocols/common/fragment-handler.d.ts +0 -73
- package/dist_ts/protocols/common/fragment-handler.js +0 -121
- package/dist_ts/protocols/common/index.d.ts +0 -7
- package/dist_ts/protocols/common/index.js +0 -8
- package/dist_ts/protocols/common/types.d.ts +0 -68
- package/dist_ts/protocols/common/types.js +0 -7
- package/dist_ts/protocols/http/parser.d.ts +0 -58
- package/dist_ts/protocols/http/parser.js +0 -184
- package/dist_ts/protocols/proxy/index.d.ts +0 -5
- package/dist_ts/protocols/proxy/index.js +0 -6
- package/dist_ts/protocols/proxy/types.d.ts +0 -47
- package/dist_ts/protocols/proxy/types.js +0 -6
- package/dist_ts/protocols/tls/alerts/index.d.ts +0 -4
- package/dist_ts/protocols/tls/alerts/index.js +0 -5
- package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +0 -150
- package/dist_ts/protocols/tls/alerts/tls-alert.js +0 -226
- package/dist_ts/protocols/tls/index.d.ts +0 -12
- package/dist_ts/protocols/tls/index.js +0 -27
- package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +0 -100
- package/dist_ts/protocols/tls/sni/client-hello-parser.js +0 -463
- package/dist_ts/protocols/tls/sni/index.d.ts +0 -5
- package/dist_ts/protocols/tls/sni/index.js +0 -6
- package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +0 -58
- package/dist_ts/protocols/tls/sni/sni-extraction.js +0 -275
- package/dist_ts/protocols/tls/utils/index.d.ts +0 -4
- package/dist_ts/protocols/tls/utils/index.js +0 -5
- package/dist_ts/protocols/tls/utils/tls-utils.d.ts +0 -158
- package/dist_ts/protocols/tls/utils/tls-utils.js +0 -187
- package/dist_ts/protocols/websocket/constants.d.ts +0 -55
- package/dist_ts/protocols/websocket/constants.js +0 -58
- package/dist_ts/protocols/websocket/index.d.ts +0 -7
- package/dist_ts/protocols/websocket/index.js +0 -8
- package/dist_ts/protocols/websocket/types.d.ts +0 -47
- package/dist_ts/protocols/websocket/types.js +0 -5
- package/dist_ts/protocols/websocket/utils.d.ts +0 -25
- package/dist_ts/protocols/websocket/utils.js +0 -103
- package/dist_ts/routing/router/http-router.d.ts +0 -89
- package/dist_ts/routing/router/http-router.js +0 -205
- package/dist_ts/routing/router/index.d.ts +0 -5
- package/dist_ts/routing/router/index.js +0 -6
- package/dist_ts/tls/index.d.ts +0 -16
- package/dist_ts/tls/index.js +0 -24
- package/dist_ts/tls/sni/index.d.ts +0 -4
- package/dist_ts/tls/sni/index.js +0 -5
- package/dist_ts/tls/sni/sni-handler.d.ts +0 -154
- package/dist_ts/tls/sni/sni-handler.js +0 -191
- package/ts/core/events/index.ts +0 -3
- package/ts/core/models/socket-augmentation.ts +0 -38
- package/ts/core/utils/async-utils.ts +0 -275
- package/ts/core/utils/binary-heap.ts +0 -225
- package/ts/core/utils/enhanced-connection-pool.ts +0 -425
- package/ts/core/utils/fs-utils.ts +0 -270
- package/ts/core/utils/ip-utils.ts +0 -303
- package/ts/core/utils/lifecycle-component.ts +0 -251
- package/ts/core/utils/log-deduplicator.ts +0 -370
- package/ts/core/utils/security-utils.ts +0 -305
- package/ts/core/utils/shared-security-manager.ts +0 -470
- package/ts/core/utils/socket-utils.ts +0 -322
- package/ts/core/utils/template-utils.ts +0 -124
- package/ts/core/utils/validation-utils.ts +0 -177
- package/ts/core/utils/websocket-utils.ts +0 -33
- package/ts/detection/detectors/http-detector.ts +0 -127
- package/ts/detection/detectors/quick-detector.ts +0 -148
- package/ts/detection/detectors/routing-extractor.ts +0 -147
- package/ts/detection/detectors/tls-detector.ts +0 -223
- package/ts/detection/index.ts +0 -25
- package/ts/detection/models/detection-types.ts +0 -102
- package/ts/detection/models/interfaces.ts +0 -115
- package/ts/detection/protocol-detector.ts +0 -319
- package/ts/detection/utils/buffer-utils.ts +0 -141
- package/ts/detection/utils/fragment-manager.ts +0 -64
- package/ts/detection/utils/parser-utils.ts +0 -77
- package/ts/protocols/common/fragment-handler.ts +0 -167
- package/ts/protocols/common/index.ts +0 -8
- package/ts/protocols/common/types.ts +0 -76
- package/ts/protocols/http/parser.ts +0 -219
- package/ts/protocols/proxy/index.ts +0 -6
- package/ts/protocols/proxy/types.ts +0 -53
- package/ts/protocols/tls/alerts/index.ts +0 -3
- package/ts/protocols/tls/alerts/tls-alert.ts +0 -259
- package/ts/protocols/tls/index.ts +0 -37
- package/ts/protocols/tls/sni/client-hello-parser.ts +0 -629
- package/ts/protocols/tls/sni/index.ts +0 -6
- package/ts/protocols/tls/sni/sni-extraction.ts +0 -353
- package/ts/protocols/tls/utils/index.ts +0 -3
- package/ts/protocols/tls/utils/tls-utils.ts +0 -201
- package/ts/protocols/websocket/constants.ts +0 -60
- package/ts/protocols/websocket/index.ts +0 -8
- package/ts/protocols/websocket/types.ts +0 -53
- package/ts/protocols/websocket/utils.ts +0 -98
- package/ts/routing/router/http-router.ts +0 -266
- package/ts/routing/router/index.ts +0 -7
- package/ts/tls/index.ts +0 -29
- package/ts/tls/sni/index.ts +0 -3
- 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
|
-
}
|