@push.rocks/smartproxy 19.5.4 → 19.5.5
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/dist_ts/core/utils/async-utils.d.ts +81 -0
- package/dist_ts/core/utils/async-utils.js +216 -0
- package/dist_ts/core/utils/binary-heap.d.ts +73 -0
- package/dist_ts/core/utils/binary-heap.js +193 -0
- package/dist_ts/core/utils/enhanced-connection-pool.d.ts +110 -0
- package/dist_ts/core/utils/enhanced-connection-pool.js +320 -0
- package/dist_ts/core/utils/fs-utils.d.ts +144 -0
- package/dist_ts/core/utils/fs-utils.js +252 -0
- package/dist_ts/core/utils/index.d.ts +5 -2
- package/dist_ts/core/utils/index.js +6 -3
- package/dist_ts/core/utils/lifecycle-component.d.ts +59 -0
- package/dist_ts/core/utils/lifecycle-component.js +195 -0
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +15 -0
- package/dist_ts/proxies/http-proxy/certificate-manager.js +49 -2
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +10 -0
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +53 -43
- package/dist_ts/proxies/smart-proxy/cert-store.js +22 -20
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +37 -7
- package/dist_ts/proxies/smart-proxy/connection-manager.js +257 -180
- package/package.json +2 -2
- package/readme.hints.md +96 -1
- package/readme.plan.md +1135 -221
- package/readme.problems.md +167 -83
- package/ts/core/utils/async-utils.ts +275 -0
- package/ts/core/utils/binary-heap.ts +225 -0
- package/ts/core/utils/enhanced-connection-pool.ts +420 -0
- package/ts/core/utils/fs-utils.ts +270 -0
- package/ts/core/utils/index.ts +5 -2
- package/ts/core/utils/lifecycle-component.ts +231 -0
- package/ts/plugins.ts +2 -1
- package/ts/proxies/http-proxy/certificate-manager.ts +52 -1
- package/ts/proxies/nftables-proxy/nftables-proxy.ts +64 -79
- package/ts/proxies/smart-proxy/cert-store.ts +26 -20
- package/ts/proxies/smart-proxy/connection-manager.ts +291 -189
- package/readme.plan2.md +0 -764
- package/ts/common/eventUtils.ts +0 -34
- package/ts/common/types.ts +0 -91
- package/ts/core/utils/event-system.ts +0 -376
- package/ts/core/utils/event-utils.ts +0 -25
|
@@ -0,0 +1,252 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2ZzLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsTUFBTSxPQUFPLGVBQWU7SUFDMUI7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVk7UUFDOUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFlO1FBQ3BDLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQWdCLEVBQUUsV0FBMkIsTUFBTTtRQUN2RSxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFnQjtRQUMxQyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsV0FBMkIsTUFBTTtRQUN0RiwwQkFBMEI7UUFDMUIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBZ0IsRUFBRSxJQUFZO1FBQ3pELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQjtRQUNsQyxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELG9DQUFvQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFlO1FBQ3BDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBVSxRQUFnQjtRQUM3QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFnQixFQUFFLElBQVMsRUFBRSxNQUFNLEdBQUcsSUFBSTtRQUMvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWMsRUFBRSxXQUFtQjtRQUN2RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWMsRUFBRSxXQUFtQjtRQUN2RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBZ0I7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBZTtRQUNwQyxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQWU7UUFDNUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFdBQXFCLEVBQUU7UUFDdEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU1QyxJQUFJLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEQsQ0FBQztpQkFBTSxJQUFJLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsT0FBMkQ7UUFDbkcsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxPQUE0RDtRQUNyRyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBZ0I7UUFDdEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBWTtRQUNuQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBWTtRQUM5QixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxDQUFDO0lBQ2xDLENBQUM7Q0FDRiJ9
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core utility functions
|
|
3
3
|
*/
|
|
4
|
-
export * from './event-utils.js';
|
|
5
4
|
export * from './validation-utils.js';
|
|
6
5
|
export * from './ip-utils.js';
|
|
7
6
|
export * from './template-utils.js';
|
|
@@ -9,6 +8,10 @@ export * from './route-manager.js';
|
|
|
9
8
|
export * from './route-utils.js';
|
|
10
9
|
export * from './security-utils.js';
|
|
11
10
|
export * from './shared-security-manager.js';
|
|
12
|
-
export * from './event-system.js';
|
|
13
11
|
export * from './websocket-utils.js';
|
|
14
12
|
export * from './logger.js';
|
|
13
|
+
export * from './async-utils.js';
|
|
14
|
+
export * from './fs-utils.js';
|
|
15
|
+
export * from './lifecycle-component.js';
|
|
16
|
+
export * from './binary-heap.js';
|
|
17
|
+
export * from './enhanced-connection-pool.js';
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core utility functions
|
|
3
3
|
*/
|
|
4
|
-
export * from './event-utils.js';
|
|
5
4
|
export * from './validation-utils.js';
|
|
6
5
|
export * from './ip-utils.js';
|
|
7
6
|
export * from './template-utils.js';
|
|
@@ -9,7 +8,11 @@ export * from './route-manager.js';
|
|
|
9
8
|
export * from './route-utils.js';
|
|
10
9
|
export * from './security-utils.js';
|
|
11
10
|
export * from './shared-security-manager.js';
|
|
12
|
-
export * from './event-system.js';
|
|
13
11
|
export * from './websocket-utils.js';
|
|
14
12
|
export * from './logger.js';
|
|
15
|
-
|
|
13
|
+
export * from './async-utils.js';
|
|
14
|
+
export * from './fs-utils.js';
|
|
15
|
+
export * from './lifecycle-component.js';
|
|
16
|
+
export * from './binary-heap.js';
|
|
17
|
+
export * from './enhanced-connection-pool.js';
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLCtCQUErQixDQUFDIn0=
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
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 class LifecycleComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.timers = new Set();
|
|
8
|
+
this.intervals = new Set();
|
|
9
|
+
this.listeners = [];
|
|
10
|
+
this.childComponents = new Set();
|
|
11
|
+
this.isShuttingDown = false;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create a managed setTimeout that will be automatically cleaned up
|
|
15
|
+
*/
|
|
16
|
+
setTimeout(handler, timeout) {
|
|
17
|
+
if (this.isShuttingDown) {
|
|
18
|
+
// Return a dummy timer if shutting down
|
|
19
|
+
return setTimeout(() => { }, 0);
|
|
20
|
+
}
|
|
21
|
+
const wrappedHandler = () => {
|
|
22
|
+
this.timers.delete(timer);
|
|
23
|
+
if (!this.isShuttingDown) {
|
|
24
|
+
handler();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const timer = setTimeout(wrappedHandler, timeout);
|
|
28
|
+
this.timers.add(timer);
|
|
29
|
+
return timer;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a managed setInterval that will be automatically cleaned up
|
|
33
|
+
*/
|
|
34
|
+
setInterval(handler, interval) {
|
|
35
|
+
if (this.isShuttingDown) {
|
|
36
|
+
// Return a dummy timer if shutting down
|
|
37
|
+
return setInterval(() => { }, interval);
|
|
38
|
+
}
|
|
39
|
+
const wrappedHandler = () => {
|
|
40
|
+
if (!this.isShuttingDown) {
|
|
41
|
+
handler();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const timer = setInterval(wrappedHandler, interval);
|
|
45
|
+
this.intervals.add(timer);
|
|
46
|
+
// Allow process to exit even with timer
|
|
47
|
+
if (typeof timer.unref === 'function') {
|
|
48
|
+
timer.unref();
|
|
49
|
+
}
|
|
50
|
+
return timer;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clear a managed timeout
|
|
54
|
+
*/
|
|
55
|
+
clearTimeout(timer) {
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
this.timers.delete(timer);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Clear a managed interval
|
|
61
|
+
*/
|
|
62
|
+
clearInterval(timer) {
|
|
63
|
+
clearInterval(timer);
|
|
64
|
+
this.intervals.delete(timer);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Add a managed event listener that will be automatically removed on cleanup
|
|
68
|
+
*/
|
|
69
|
+
addEventListener(target, event, handler, options) {
|
|
70
|
+
if (this.isShuttingDown) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// For 'once' listeners, we need to wrap the handler to remove it from our tracking
|
|
74
|
+
let actualHandler = handler;
|
|
75
|
+
if (options?.once) {
|
|
76
|
+
actualHandler = (...args) => {
|
|
77
|
+
// Call the original handler
|
|
78
|
+
handler(...args);
|
|
79
|
+
// Remove from our internal tracking
|
|
80
|
+
const index = this.listeners.findIndex(l => l.target === target && l.event === event && l.handler === handler);
|
|
81
|
+
if (index !== -1) {
|
|
82
|
+
this.listeners.splice(index, 1);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Support both EventEmitter and DOM-style event targets
|
|
87
|
+
if (typeof target.on === 'function') {
|
|
88
|
+
if (options?.once) {
|
|
89
|
+
target.once(event, actualHandler);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
target.on(event, actualHandler);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (typeof target.addEventListener === 'function') {
|
|
96
|
+
target.addEventListener(event, actualHandler, options);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw new Error('Target must support on() or addEventListener()');
|
|
100
|
+
}
|
|
101
|
+
// Store the original handler in our tracking (not the wrapped one)
|
|
102
|
+
this.listeners.push({
|
|
103
|
+
target,
|
|
104
|
+
event,
|
|
105
|
+
handler,
|
|
106
|
+
once: options?.once
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Remove a specific event listener
|
|
111
|
+
*/
|
|
112
|
+
removeEventListener(target, event, handler) {
|
|
113
|
+
// Remove from target
|
|
114
|
+
if (typeof target.removeListener === 'function') {
|
|
115
|
+
target.removeListener(event, handler);
|
|
116
|
+
}
|
|
117
|
+
else if (typeof target.removeEventListener === 'function') {
|
|
118
|
+
target.removeEventListener(event, handler);
|
|
119
|
+
}
|
|
120
|
+
// Remove from our tracking
|
|
121
|
+
const index = this.listeners.findIndex(l => l.target === target && l.event === event && l.handler === handler);
|
|
122
|
+
if (index !== -1) {
|
|
123
|
+
this.listeners.splice(index, 1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Register a child component that should be cleaned up when this component is cleaned up
|
|
128
|
+
*/
|
|
129
|
+
registerChildComponent(component) {
|
|
130
|
+
this.childComponents.add(component);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Unregister a child component
|
|
134
|
+
*/
|
|
135
|
+
unregisterChildComponent(component) {
|
|
136
|
+
this.childComponents.delete(component);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Override this method to implement component-specific cleanup logic
|
|
140
|
+
*/
|
|
141
|
+
async onCleanup() {
|
|
142
|
+
// Override in subclasses
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Clean up all managed resources
|
|
146
|
+
*/
|
|
147
|
+
async cleanup() {
|
|
148
|
+
// Return existing cleanup promise if already cleaning up
|
|
149
|
+
if (this.cleanupPromise) {
|
|
150
|
+
return this.cleanupPromise;
|
|
151
|
+
}
|
|
152
|
+
this.cleanupPromise = this.performCleanup();
|
|
153
|
+
return this.cleanupPromise;
|
|
154
|
+
}
|
|
155
|
+
async performCleanup() {
|
|
156
|
+
this.isShuttingDown = true;
|
|
157
|
+
// First, clean up child components
|
|
158
|
+
const childCleanupPromises = [];
|
|
159
|
+
for (const child of this.childComponents) {
|
|
160
|
+
childCleanupPromises.push(child.cleanup());
|
|
161
|
+
}
|
|
162
|
+
await Promise.all(childCleanupPromises);
|
|
163
|
+
this.childComponents.clear();
|
|
164
|
+
// Clear all timers
|
|
165
|
+
for (const timer of this.timers) {
|
|
166
|
+
clearTimeout(timer);
|
|
167
|
+
}
|
|
168
|
+
this.timers.clear();
|
|
169
|
+
// Clear all intervals
|
|
170
|
+
for (const timer of this.intervals) {
|
|
171
|
+
clearInterval(timer);
|
|
172
|
+
}
|
|
173
|
+
this.intervals.clear();
|
|
174
|
+
// Remove all event listeners
|
|
175
|
+
for (const { target, event, handler } of this.listeners) {
|
|
176
|
+
// All listeners need to be removed, including 'once' listeners that might not have fired
|
|
177
|
+
if (typeof target.removeListener === 'function') {
|
|
178
|
+
target.removeListener(event, handler);
|
|
179
|
+
}
|
|
180
|
+
else if (typeof target.removeEventListener === 'function') {
|
|
181
|
+
target.removeEventListener(event, handler);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
this.listeners = [];
|
|
185
|
+
// Call subclass cleanup
|
|
186
|
+
await this.onCleanup();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if the component is shutting down
|
|
190
|
+
*/
|
|
191
|
+
isShuttingDownState() {
|
|
192
|
+
return this.isShuttingDown;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvcmUvdXRpbHMvbGlmZWN5Y2xlLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLE9BQWdCLGtCQUFrQjtJQUF4QztRQUNVLFdBQU0sR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QyxjQUFTLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDM0MsY0FBUyxHQUtaLEVBQUUsQ0FBQztRQUNBLG9CQUFlLEdBQTRCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbkQsbUJBQWMsR0FBRyxLQUFLLENBQUM7SUF3Tm5DLENBQUM7SUFyTkM7O09BRUc7SUFDTyxVQUFVLENBQUMsT0FBaUIsRUFBRSxPQUFlO1FBQ3JELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLHdDQUF3QztZQUN4QyxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ08sV0FBVyxDQUFDLE9BQWlCLEVBQUUsUUFBZ0I7UUFDdkQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsd0NBQXdDO1lBQ3hDLE9BQU8sV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUIsd0NBQXdDO1FBQ3hDLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDTyxZQUFZLENBQUMsS0FBcUI7UUFDMUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNPLGFBQWEsQ0FBQyxLQUFxQjtRQUMzQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ08sZ0JBQWdCLENBQ3hCLE1BQVcsRUFDWCxLQUFhLEVBQ2IsT0FBaUIsRUFDakIsT0FBNEI7UUFFNUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFFRCxtRkFBbUY7UUFDbkYsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBQzVCLElBQUksT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2xCLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUU7Z0JBQ2pDLDRCQUE0QjtnQkFDNUIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBRWpCLG9DQUFvQztnQkFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQ3ZFLENBQUM7Z0JBQ0YsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1FBQ0osQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxJQUFJLE9BQU8sTUFBTSxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxJQUFJLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDcEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2xCLE1BQU07WUFDTixLQUFLO1lBQ0wsT0FBTztZQUNQLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSTtTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxtQkFBbUIsQ0FBQyxNQUFXLEVBQUUsS0FBYSxFQUFFLE9BQWlCO1FBQ3pFLHFCQUFxQjtRQUNyQixJQUFJLE9BQU8sTUFBTSxDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNoRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxtQkFBbUIsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM1RCxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQ3ZFLENBQUM7UUFDRixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ08sc0JBQXNCLENBQUMsU0FBNkI7UUFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ08sd0JBQXdCLENBQUMsU0FBNkI7UUFDOUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLFNBQVM7UUFDdkIseUJBQXlCO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLHlEQUF5RDtRQUN6RCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFM0IsbUNBQW1DO1FBQ25DLE1BQU0sb0JBQW9CLEdBQW9CLEVBQUUsQ0FBQztRQUNqRCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFN0IsbUJBQW1CO1FBQ25CLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVwQixzQkFBc0I7UUFDdEIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXZCLDZCQUE2QjtRQUM3QixLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4RCx5RkFBeUY7WUFDekYsSUFBSSxPQUFPLE1BQU0sQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLENBQUM7aUJBQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxtQkFBbUIsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDNUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXBCLHdCQUF3QjtRQUN4QixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDTyxtQkFBbUI7UUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7Q0FDRiJ9
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -3,10 +3,11 @@ import * as fs from 'fs';
|
|
|
3
3
|
import * as http from 'http';
|
|
4
4
|
import * as https from 'https';
|
|
5
5
|
import * as net from 'net';
|
|
6
|
+
import * as path from 'path';
|
|
6
7
|
import * as tls from 'tls';
|
|
7
8
|
import * as url from 'url';
|
|
8
9
|
import * as http2 from 'http2';
|
|
9
|
-
export { EventEmitter, fs, http, https, net, tls, url, http2 };
|
|
10
|
+
export { EventEmitter, fs, http, https, net, path, tls, url, http2 };
|
|
10
11
|
import * as tsclass from '@tsclass/tsclass';
|
|
11
12
|
export { tsclass };
|
|
12
13
|
import * as lik from '@push.rocks/lik';
|
package/dist_ts/plugins.js
CHANGED
|
@@ -4,10 +4,11 @@ import * as fs from 'fs';
|
|
|
4
4
|
import * as http from 'http';
|
|
5
5
|
import * as https from 'https';
|
|
6
6
|
import * as net from 'net';
|
|
7
|
+
import * as path from 'path';
|
|
7
8
|
import * as tls from 'tls';
|
|
8
9
|
import * as url from 'url';
|
|
9
10
|
import * as http2 from 'http2';
|
|
10
|
-
export { EventEmitter, fs, http, https, net, tls, url, http2 };
|
|
11
|
+
export { EventEmitter, fs, http, https, net, path, tls, url, http2 };
|
|
11
12
|
// tsclass scope
|
|
12
13
|
import * as tsclass from '@tsclass/tsclass';
|
|
13
14
|
export { tsclass };
|
|
@@ -32,4 +33,4 @@ import * as ws from 'ws';
|
|
|
32
33
|
import wsDefault from 'ws';
|
|
33
34
|
import { minimatch } from 'minimatch';
|
|
34
35
|
export { prettyMs, ws, wsDefault, minimatch };
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFFckUsZ0JBQWdCO0FBQ2hCLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBRW5CLGtCQUFrQjtBQUNsQixPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLG9EQUFvRCxDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxpQkFBaUIsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyx3QkFBd0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLHdCQUF3QixFQUN4QixVQUFVLEdBQ1gsQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFDO0FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=
|
|
@@ -14,11 +14,26 @@ export declare class CertificateManager {
|
|
|
14
14
|
private certificateStoreDir;
|
|
15
15
|
private logger;
|
|
16
16
|
private httpsServer;
|
|
17
|
+
private initialized;
|
|
17
18
|
constructor(options: IHttpProxyOptions);
|
|
19
|
+
/**
|
|
20
|
+
* Synchronous initialization for backward compatibility
|
|
21
|
+
* @deprecated This uses sync filesystem operations which block the event loop
|
|
22
|
+
*/
|
|
23
|
+
private initializeSync;
|
|
24
|
+
/**
|
|
25
|
+
* Async initialization - preferred method
|
|
26
|
+
*/
|
|
27
|
+
initialize(): Promise<void>;
|
|
18
28
|
/**
|
|
19
29
|
* Loads default certificates from the filesystem
|
|
30
|
+
* @deprecated This uses sync filesystem operations which block the event loop
|
|
20
31
|
*/
|
|
21
32
|
loadDefaultCertificates(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Loads default certificates from the filesystem asynchronously
|
|
35
|
+
*/
|
|
36
|
+
loadDefaultCertificatesAsync(): Promise<void>;
|
|
22
37
|
/**
|
|
23
38
|
* Generates self-signed certificates as fallback
|
|
24
39
|
*/
|