@push.rocks/smartproxy 19.5.3 → 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.
Files changed (42) hide show
  1. package/dist_ts/core/utils/async-utils.d.ts +81 -0
  2. package/dist_ts/core/utils/async-utils.js +216 -0
  3. package/dist_ts/core/utils/binary-heap.d.ts +73 -0
  4. package/dist_ts/core/utils/binary-heap.js +193 -0
  5. package/dist_ts/core/utils/enhanced-connection-pool.d.ts +110 -0
  6. package/dist_ts/core/utils/enhanced-connection-pool.js +320 -0
  7. package/dist_ts/core/utils/fs-utils.d.ts +144 -0
  8. package/dist_ts/core/utils/fs-utils.js +252 -0
  9. package/dist_ts/core/utils/index.d.ts +5 -2
  10. package/dist_ts/core/utils/index.js +6 -3
  11. package/dist_ts/core/utils/lifecycle-component.d.ts +59 -0
  12. package/dist_ts/core/utils/lifecycle-component.js +195 -0
  13. package/dist_ts/plugins.d.ts +2 -1
  14. package/dist_ts/plugins.js +3 -2
  15. package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +15 -0
  16. package/dist_ts/proxies/http-proxy/certificate-manager.js +49 -2
  17. package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +10 -0
  18. package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +53 -43
  19. package/dist_ts/proxies/smart-proxy/cert-store.js +22 -20
  20. package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +37 -7
  21. package/dist_ts/proxies/smart-proxy/connection-manager.js +257 -180
  22. package/package.json +2 -2
  23. package/readme.hints.md +96 -1
  24. package/readme.md +515 -301
  25. package/readme.plan.md +1135 -221
  26. package/readme.problems.md +167 -83
  27. package/ts/core/utils/async-utils.ts +275 -0
  28. package/ts/core/utils/binary-heap.ts +225 -0
  29. package/ts/core/utils/enhanced-connection-pool.ts +420 -0
  30. package/ts/core/utils/fs-utils.ts +270 -0
  31. package/ts/core/utils/index.ts +5 -2
  32. package/ts/core/utils/lifecycle-component.ts +231 -0
  33. package/ts/plugins.ts +2 -1
  34. package/ts/proxies/http-proxy/certificate-manager.ts +52 -1
  35. package/ts/proxies/nftables-proxy/nftables-proxy.ts +64 -79
  36. package/ts/proxies/smart-proxy/cert-store.ts +26 -20
  37. package/ts/proxies/smart-proxy/connection-manager.ts +291 -189
  38. package/readme.plan2.md +0 -764
  39. package/ts/common/eventUtils.ts +0 -34
  40. package/ts/common/types.ts +0 -91
  41. package/ts/core/utils/event-system.ts +0 -376
  42. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2ZzLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsTUFBTSxPQUFPLGVBQWU7SUFDMUI7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVk7UUFDOUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFlO1FBQ3BDLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQWdCLEVBQUUsV0FBMkIsTUFBTTtRQUN2RSxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFnQjtRQUMxQyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FB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
@@ -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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxhQUFhLENBQUMifQ==
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvcmUvdXRpbHMvbGlmZWN5Y2xlLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLE9BQWdCLGtCQUFrQjtJQUF4QztRQUNVLFdBQU0sR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QyxjQUFTLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDM0MsY0FBUyxHQUtaLEVBQUUsQ0FBQztRQUNBLG9CQUFlLEdBQTRCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbkQsbUJBQWMsR0FBRyxLQUFLLENBQUM7SUF3Tm5DLENBQUM7SUFyTkM7O09BRUc7SUFDTyxVQUFVLENBQUMsT0FBaUIsRUFBRSxPQUFlO1FBQ3JELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLHdDQUF3QztZQUN4QyxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ08sV0FBVyxDQUFDLE9BQWlCLEVBQUUsUUFBZ0I7UUFDdkQsSUFBSSxJQUFJLENBQUMsY0FBYyxF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
@@ -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';
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUUvRCxnQkFBZ0I7QUFDaEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFFbkIsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sb0RBQW9ELENBQUM7QUFDdkYsT0FBTyxLQUFLLGlCQUFpQixNQUFNLGlEQUFpRCxDQUFDO0FBQ3JGLE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLHdCQUF3QixNQUFNLHdDQUF3QyxDQUFDO0FBQ25GLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUNMLEdBQUcsRUFDSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixXQUFXLEVBQ1gsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1Isd0JBQXdCLEVBQ3hCLFVBQVUsR0FDWCxDQUFDO0FBRUYsb0JBQW9CO0FBQ3BCLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLFNBQVMsTUFBTSxJQUFJLENBQUM7QUFDM0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMifQ==
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
  */