@masuidrive/procman 0.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/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/src/cli/commands/clear-log.d.ts +10 -0
- package/dist/src/cli/commands/clear-log.d.ts.map +1 -0
- package/dist/src/cli/commands/clear-log.js +77 -0
- package/dist/src/cli/commands/clear-log.js.map +1 -0
- package/dist/src/cli/commands/exit.d.ts +10 -0
- package/dist/src/cli/commands/exit.d.ts.map +1 -0
- package/dist/src/cli/commands/exit.js +65 -0
- package/dist/src/cli/commands/exit.js.map +1 -0
- package/dist/src/cli/commands/help.d.ts +10 -0
- package/dist/src/cli/commands/help.d.ts.map +1 -0
- package/dist/src/cli/commands/help.js +340 -0
- package/dist/src/cli/commands/help.js.map +1 -0
- package/dist/src/cli/commands/list.d.ts +11 -0
- package/dist/src/cli/commands/list.d.ts.map +1 -0
- package/dist/src/cli/commands/list.js +130 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/load.d.ts +11 -0
- package/dist/src/cli/commands/load.d.ts.map +1 -0
- package/dist/src/cli/commands/load.js +250 -0
- package/dist/src/cli/commands/load.js.map +1 -0
- package/dist/src/cli/commands/log.d.ts +18 -0
- package/dist/src/cli/commands/log.d.ts.map +1 -0
- package/dist/src/cli/commands/log.js +282 -0
- package/dist/src/cli/commands/log.js.map +1 -0
- package/dist/src/cli/commands/restart.d.ts +11 -0
- package/dist/src/cli/commands/restart.d.ts.map +1 -0
- package/dist/src/cli/commands/restart.js +99 -0
- package/dist/src/cli/commands/restart.js.map +1 -0
- package/dist/src/cli/commands/start.d.ts +11 -0
- package/dist/src/cli/commands/start.d.ts.map +1 -0
- package/dist/src/cli/commands/start.js +105 -0
- package/dist/src/cli/commands/start.js.map +1 -0
- package/dist/src/cli/commands/stop.d.ts +12 -0
- package/dist/src/cli/commands/stop.d.ts.map +1 -0
- package/dist/src/cli/commands/stop.js +105 -0
- package/dist/src/cli/commands/stop.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +28 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/parser.d.ts +14 -0
- package/dist/src/cli/parser.d.ts.map +1 -0
- package/dist/src/cli/parser.js +131 -0
- package/dist/src/cli/parser.js.map +1 -0
- package/dist/src/cli/signal-handler.d.ts +51 -0
- package/dist/src/cli/signal-handler.d.ts.map +1 -0
- package/dist/src/cli/signal-handler.js +129 -0
- package/dist/src/cli/signal-handler.js.map +1 -0
- package/dist/src/cli/utils/error-handler.d.ts +39 -0
- package/dist/src/cli/utils/error-handler.d.ts.map +1 -0
- package/dist/src/cli/utils/error-handler.js +200 -0
- package/dist/src/cli/utils/error-handler.js.map +1 -0
- package/dist/src/cli/utils/error-utils.d.ts +16 -0
- package/dist/src/cli/utils/error-utils.d.ts.map +1 -0
- package/dist/src/cli/utils/error-utils.js +48 -0
- package/dist/src/cli/utils/error-utils.js.map +1 -0
- package/dist/src/cli/utils/ipc-client.d.ts +80 -0
- package/dist/src/cli/utils/ipc-client.d.ts.map +1 -0
- package/dist/src/cli/utils/ipc-client.js +275 -0
- package/dist/src/cli/utils/ipc-client.js.map +1 -0
- package/dist/src/config/config-loader.d.ts +74 -0
- package/dist/src/config/config-loader.d.ts.map +1 -0
- package/dist/src/config/config-loader.js +229 -0
- package/dist/src/config/config-loader.js.map +1 -0
- package/dist/src/config/config-normalizer.d.ts +135 -0
- package/dist/src/config/config-normalizer.d.ts.map +1 -0
- package/dist/src/config/config-normalizer.js +309 -0
- package/dist/src/config/config-normalizer.js.map +1 -0
- package/dist/src/config/config-reporter.d.ts +183 -0
- package/dist/src/config/config-reporter.d.ts.map +1 -0
- package/dist/src/config/config-reporter.js +311 -0
- package/dist/src/config/config-reporter.js.map +1 -0
- package/dist/src/config/config-validator.d.ts +163 -0
- package/dist/src/config/config-validator.d.ts.map +1 -0
- package/dist/src/config/config-validator.js +489 -0
- package/dist/src/config/config-validator.js.map +1 -0
- package/dist/src/config/config-watcher.d.ts +161 -0
- package/dist/src/config/config-watcher.d.ts.map +1 -0
- package/dist/src/config/config-watcher.js +245 -0
- package/dist/src/config/config-watcher.js.map +1 -0
- package/dist/src/config/index.d.ts +36 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +41 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/secure-config-loader.d.ts +77 -0
- package/dist/src/config/secure-config-loader.d.ts.map +1 -0
- package/dist/src/config/secure-config-loader.js +326 -0
- package/dist/src/config/secure-config-loader.js.map +1 -0
- package/dist/src/daemon/base-socket-connection.d.ts +66 -0
- package/dist/src/daemon/base-socket-connection.d.ts.map +1 -0
- package/dist/src/daemon/base-socket-connection.js +192 -0
- package/dist/src/daemon/base-socket-connection.js.map +1 -0
- package/dist/src/daemon/component-manager.d.ts +180 -0
- package/dist/src/daemon/component-manager.d.ts.map +1 -0
- package/dist/src/daemon/component-manager.js +794 -0
- package/dist/src/daemon/component-manager.js.map +1 -0
- package/dist/src/daemon/crash-recovery.d.ts +71 -0
- package/dist/src/daemon/crash-recovery.d.ts.map +1 -0
- package/dist/src/daemon/crash-recovery.js +282 -0
- package/dist/src/daemon/crash-recovery.js.map +1 -0
- package/dist/src/daemon/daemon-main.d.ts +18 -0
- package/dist/src/daemon/daemon-main.d.ts.map +1 -0
- package/dist/src/daemon/daemon-main.js +160 -0
- package/dist/src/daemon/daemon-main.js.map +1 -0
- package/dist/src/daemon/daemon-state-manager.d.ts +111 -0
- package/dist/src/daemon/daemon-state-manager.d.ts.map +1 -0
- package/dist/src/daemon/daemon-state-manager.js +194 -0
- package/dist/src/daemon/daemon-state-manager.js.map +1 -0
- package/dist/src/daemon/data-directory.d.ts +51 -0
- package/dist/src/daemon/data-directory.d.ts.map +1 -0
- package/dist/src/daemon/data-directory.js +136 -0
- package/dist/src/daemon/data-directory.js.map +1 -0
- package/dist/src/daemon/index.d.ts +20 -0
- package/dist/src/daemon/index.d.ts.map +1 -0
- package/dist/src/daemon/index.js +24 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/ipc-client-base.d.ts +153 -0
- package/dist/src/daemon/ipc-client-base.d.ts.map +1 -0
- package/dist/src/daemon/ipc-client-base.js +476 -0
- package/dist/src/daemon/ipc-client-base.js.map +1 -0
- package/dist/src/daemon/ipc-command-handler.d.ts +107 -0
- package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -0
- package/dist/src/daemon/ipc-command-handler.js +483 -0
- package/dist/src/daemon/ipc-command-handler.js.map +1 -0
- package/dist/src/daemon/ipc-factory.d.ts +92 -0
- package/dist/src/daemon/ipc-factory.d.ts.map +1 -0
- package/dist/src/daemon/ipc-factory.js +210 -0
- package/dist/src/daemon/ipc-factory.js.map +1 -0
- package/dist/src/daemon/ipc-server-base.d.ts +158 -0
- package/dist/src/daemon/ipc-server-base.d.ts.map +1 -0
- package/dist/src/daemon/ipc-server-base.js +491 -0
- package/dist/src/daemon/ipc-server-base.js.map +1 -0
- package/dist/src/daemon/message-protocol.d.ts +132 -0
- package/dist/src/daemon/message-protocol.d.ts.map +1 -0
- package/dist/src/daemon/message-protocol.js +252 -0
- package/dist/src/daemon/message-protocol.js.map +1 -0
- package/dist/src/daemon/named-pipe-client.d.ts +61 -0
- package/dist/src/daemon/named-pipe-client.d.ts.map +1 -0
- package/dist/src/daemon/named-pipe-client.js +221 -0
- package/dist/src/daemon/named-pipe-client.js.map +1 -0
- package/dist/src/daemon/named-pipe-server.d.ts +40 -0
- package/dist/src/daemon/named-pipe-server.d.ts.map +1 -0
- package/dist/src/daemon/named-pipe-server.js +102 -0
- package/dist/src/daemon/named-pipe-server.js.map +1 -0
- package/dist/src/daemon/orphan-detector.d.ts +66 -0
- package/dist/src/daemon/orphan-detector.d.ts.map +1 -0
- package/dist/src/daemon/orphan-detector.js +208 -0
- package/dist/src/daemon/orphan-detector.js.map +1 -0
- package/dist/src/daemon/pid-manager.d.ts +49 -0
- package/dist/src/daemon/pid-manager.d.ts.map +1 -0
- package/dist/src/daemon/pid-manager.js +110 -0
- package/dist/src/daemon/pid-manager.js.map +1 -0
- package/dist/src/daemon/procman-daemon.d.ts +188 -0
- package/dist/src/daemon/procman-daemon.d.ts.map +1 -0
- package/dist/src/daemon/procman-daemon.js +802 -0
- package/dist/src/daemon/procman-daemon.js.map +1 -0
- package/dist/src/daemon/reconnection-system.d.ts +113 -0
- package/dist/src/daemon/reconnection-system.d.ts.map +1 -0
- package/dist/src/daemon/reconnection-system.js +223 -0
- package/dist/src/daemon/reconnection-system.js.map +1 -0
- package/dist/src/daemon/resource-manager.d.ts +204 -0
- package/dist/src/daemon/resource-manager.d.ts.map +1 -0
- package/dist/src/daemon/resource-manager.js +423 -0
- package/dist/src/daemon/resource-manager.js.map +1 -0
- package/dist/src/daemon/signal-handler.d.ts +58 -0
- package/dist/src/daemon/signal-handler.d.ts.map +1 -0
- package/dist/src/daemon/signal-handler.js +142 -0
- package/dist/src/daemon/signal-handler.js.map +1 -0
- package/dist/src/daemon/simple-resource-manager.d.ts +95 -0
- package/dist/src/daemon/simple-resource-manager.d.ts.map +1 -0
- package/dist/src/daemon/simple-resource-manager.js +180 -0
- package/dist/src/daemon/simple-resource-manager.js.map +1 -0
- package/dist/src/daemon/unix-socket-client.d.ts +69 -0
- package/dist/src/daemon/unix-socket-client.d.ts.map +1 -0
- package/dist/src/daemon/unix-socket-client.js +313 -0
- package/dist/src/daemon/unix-socket-client.js.map +1 -0
- package/dist/src/daemon/unix-socket-server.d.ts +61 -0
- package/dist/src/daemon/unix-socket-server.d.ts.map +1 -0
- package/dist/src/daemon/unix-socket-server.js +262 -0
- package/dist/src/daemon/unix-socket-server.js.map +1 -0
- package/dist/src/daemon/zombie-reaper.d.ts +83 -0
- package/dist/src/daemon/zombie-reaper.d.ts.map +1 -0
- package/dist/src/daemon/zombie-reaper.js +278 -0
- package/dist/src/daemon/zombie-reaper.js.map +1 -0
- package/dist/src/process-manager/index.d.ts +13 -0
- package/dist/src/process-manager/index.d.ts.map +1 -0
- package/dist/src/process-manager/index.js +11 -0
- package/dist/src/process-manager/index.js.map +1 -0
- package/dist/src/process-manager/interfaces/index.d.ts +31 -0
- package/dist/src/process-manager/interfaces/index.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/index.js +14 -0
- package/dist/src/process-manager/interfaces/index.js.map +1 -0
- package/dist/src/process-manager/interfaces/process-group.d.ts +200 -0
- package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/process-group.js +10 -0
- package/dist/src/process-manager/interfaces/process-group.js.map +1 -0
- package/dist/src/process-manager/interfaces/process-lifecycle.d.ts +97 -0
- package/dist/src/process-manager/interfaces/process-lifecycle.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/process-lifecycle.js +10 -0
- package/dist/src/process-manager/interfaces/process-lifecycle.js.map +1 -0
- package/dist/src/process-manager/interfaces/process-monitor.d.ts +118 -0
- package/dist/src/process-manager/interfaces/process-monitor.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/process-monitor.js +10 -0
- package/dist/src/process-manager/interfaces/process-monitor.js.map +1 -0
- package/dist/src/process-manager/interfaces/process-persistence.d.ts +125 -0
- package/dist/src/process-manager/interfaces/process-persistence.d.ts.map +1 -0
- package/dist/src/process-manager/interfaces/process-persistence.js +10 -0
- package/dist/src/process-manager/interfaces/process-persistence.js.map +1 -0
- package/dist/src/process-manager/managed-process-info.d.ts +307 -0
- package/dist/src/process-manager/managed-process-info.d.ts.map +1 -0
- package/dist/src/process-manager/managed-process-info.js +650 -0
- package/dist/src/process-manager/managed-process-info.js.map +1 -0
- package/dist/src/process-manager/process-group-manager.d.ts +103 -0
- package/dist/src/process-manager/process-group-manager.d.ts.map +1 -0
- package/dist/src/process-manager/process-group-manager.js +400 -0
- package/dist/src/process-manager/process-group-manager.js.map +1 -0
- package/dist/src/process-manager/process-lifecycle-manager.d.ts +68 -0
- package/dist/src/process-manager/process-lifecycle-manager.d.ts.map +1 -0
- package/dist/src/process-manager/process-lifecycle-manager.js +372 -0
- package/dist/src/process-manager/process-lifecycle-manager.js.map +1 -0
- package/dist/src/process-manager/process-manager.d.ts +296 -0
- package/dist/src/process-manager/process-manager.d.ts.map +1 -0
- package/dist/src/process-manager/process-manager.js +659 -0
- package/dist/src/process-manager/process-manager.js.map +1 -0
- package/dist/src/process-manager/process-monitor.d.ts +95 -0
- package/dist/src/process-manager/process-monitor.d.ts.map +1 -0
- package/dist/src/process-manager/process-monitor.js +357 -0
- package/dist/src/process-manager/process-monitor.js.map +1 -0
- package/dist/src/process-manager/process-persistence.d.ts +68 -0
- package/dist/src/process-manager/process-persistence.d.ts.map +1 -0
- package/dist/src/process-manager/process-persistence.js +364 -0
- package/dist/src/process-manager/process-persistence.js.map +1 -0
- package/dist/src/process-manager/utils/mutex.d.ts +82 -0
- package/dist/src/process-manager/utils/mutex.d.ts.map +1 -0
- package/dist/src/process-manager/utils/mutex.js +172 -0
- package/dist/src/process-manager/utils/mutex.js.map +1 -0
- package/dist/src/services/index.d.ts +8 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +8 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/log-manager-config.d.ts +65 -0
- package/dist/src/services/log-manager-config.d.ts.map +1 -0
- package/dist/src/services/log-manager-config.js +145 -0
- package/dist/src/services/log-manager-config.js.map +1 -0
- package/dist/src/services/log-manager-factory.d.ts +134 -0
- package/dist/src/services/log-manager-factory.d.ts.map +1 -0
- package/dist/src/services/log-manager-factory.js +203 -0
- package/dist/src/services/log-manager-factory.js.map +1 -0
- package/dist/src/services/log-manager.d.ts +170 -0
- package/dist/src/services/log-manager.d.ts.map +1 -0
- package/dist/src/services/log-manager.js +1199 -0
- package/dist/src/services/log-manager.js.map +1 -0
- package/dist/src/services/log-path-validator.d.ts +121 -0
- package/dist/src/services/log-path-validator.d.ts.map +1 -0
- package/dist/src/services/log-path-validator.js +302 -0
- package/dist/src/services/log-path-validator.js.map +1 -0
- package/dist/src/services/process-log-integration.d.ts +62 -0
- package/dist/src/services/process-log-integration.d.ts.map +1 -0
- package/dist/src/services/process-log-integration.js +157 -0
- package/dist/src/services/process-log-integration.js.map +1 -0
- package/dist/src/shared/config.d.ts +67 -0
- package/dist/src/shared/config.d.ts.map +1 -0
- package/dist/src/shared/config.js +92 -0
- package/dist/src/shared/config.js.map +1 -0
- package/dist/src/shared/constants-streaming.d.ts +39 -0
- package/dist/src/shared/constants-streaming.d.ts.map +1 -0
- package/dist/src/shared/constants-streaming.js +39 -0
- package/dist/src/shared/constants-streaming.js.map +1 -0
- package/dist/src/shared/constants.d.ts +60 -0
- package/dist/src/shared/constants.d.ts.map +1 -0
- package/dist/src/shared/constants.js +71 -0
- package/dist/src/shared/constants.js.map +1 -0
- package/dist/src/shared/errors.d.ts +70 -0
- package/dist/src/shared/errors.d.ts.map +1 -0
- package/dist/src/shared/errors.js +101 -0
- package/dist/src/shared/errors.js.map +1 -0
- package/dist/src/shared/index.d.ts +14 -0
- package/dist/src/shared/index.d.ts.map +1 -0
- package/dist/src/shared/index.js +22 -0
- package/dist/src/shared/index.js.map +1 -0
- package/dist/src/shared/ipc.d.ts +402 -0
- package/dist/src/shared/ipc.d.ts.map +1 -0
- package/dist/src/shared/ipc.js +85 -0
- package/dist/src/shared/ipc.js.map +1 -0
- package/dist/src/shared/logger.d.ts +38 -0
- package/dist/src/shared/logger.d.ts.map +1 -0
- package/dist/src/shared/logger.js +139 -0
- package/dist/src/shared/logger.js.map +1 -0
- package/dist/src/shared/logs.d.ts +53 -0
- package/dist/src/shared/logs.d.ts.map +1 -0
- package/dist/src/shared/logs.js +26 -0
- package/dist/src/shared/logs.js.map +1 -0
- package/dist/src/shared/process.d.ts +102 -0
- package/dist/src/shared/process.d.ts.map +1 -0
- package/dist/src/shared/process.js +55 -0
- package/dist/src/shared/process.js.map +1 -0
- package/dist/src/shared/types.d.ts +15 -0
- package/dist/src/shared/types.d.ts.map +1 -0
- package/dist/src/shared/types.js +8 -0
- package/dist/src/shared/types.js.map +1 -0
- package/dist/src/types/index.d.ts +19 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +5 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/event-cleanup.d.ts +30 -0
- package/dist/src/utils/event-cleanup.d.ts.map +1 -0
- package/dist/src/utils/event-cleanup.js +32 -0
- package/dist/src/utils/event-cleanup.js.map +1 -0
- package/dist/src/utils/memory/memory-monitor.d.ts +126 -0
- package/dist/src/utils/memory/memory-monitor.d.ts.map +1 -0
- package/dist/src/utils/memory/memory-monitor.js +246 -0
- package/dist/src/utils/memory/memory-monitor.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Provides safer alternatives to using require() for loading configuration files.
|
|
5
|
+
* Implements multiple security modes including sandboxed execution and template-based configs.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as vm from 'vm';
|
|
10
|
+
import { createError } from '../shared/errors.js';
|
|
11
|
+
import { ConfigLoader } from './config-loader.js';
|
|
12
|
+
export var ConfigSecurityMode;
|
|
13
|
+
(function (ConfigSecurityMode) {
|
|
14
|
+
ConfigSecurityMode["LEGACY"] = "legacy";
|
|
15
|
+
ConfigSecurityMode["HYBRID"] = "hybrid";
|
|
16
|
+
ConfigSecurityMode["TEMPLATE"] = "template";
|
|
17
|
+
ConfigSecurityMode["ISOLATED"] = "isolated";
|
|
18
|
+
})(ConfigSecurityMode || (ConfigSecurityMode = {}));
|
|
19
|
+
/**
|
|
20
|
+
* Enhanced ConfigLoader with security modes
|
|
21
|
+
*/
|
|
22
|
+
export class SecureConfigLoader extends ConfigLoader {
|
|
23
|
+
securityMode;
|
|
24
|
+
allowedModules;
|
|
25
|
+
sandboxTimeout;
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
super(options);
|
|
28
|
+
this.securityMode = options.securityMode || ConfigSecurityMode.LEGACY;
|
|
29
|
+
this.allowedModules = new Set(options.allowedModules || ['path', 'os', 'url']);
|
|
30
|
+
this.sandboxTimeout = options.sandboxTimeout || 1000;
|
|
31
|
+
}
|
|
32
|
+
async load(filePath) {
|
|
33
|
+
switch (this.securityMode) {
|
|
34
|
+
case ConfigSecurityMode.LEGACY:
|
|
35
|
+
console.warn('⚠️ WARNING: Using legacy require() mode to load configuration.\n' +
|
|
36
|
+
' This allows arbitrary code execution. Consider using HYBRID mode.\n' +
|
|
37
|
+
' See: https://github.com/yourusername/procman/docs/config-security');
|
|
38
|
+
return super.load(filePath);
|
|
39
|
+
case ConfigSecurityMode.HYBRID:
|
|
40
|
+
return this.loadWithHybridSandbox(filePath);
|
|
41
|
+
case ConfigSecurityMode.TEMPLATE:
|
|
42
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
43
|
+
message: 'Template mode not yet implemented',
|
|
44
|
+
details: { mode: this.securityMode },
|
|
45
|
+
});
|
|
46
|
+
case ConfigSecurityMode.ISOLATED:
|
|
47
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
48
|
+
message: 'Isolated mode not yet implemented. Install isolated-vm package.',
|
|
49
|
+
details: { mode: this.securityMode },
|
|
50
|
+
});
|
|
51
|
+
default:
|
|
52
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
53
|
+
message: `Unknown security mode: ${this.securityMode}`,
|
|
54
|
+
details: { mode: this.securityMode },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Load configuration using VM sandbox with restricted context
|
|
60
|
+
*/
|
|
61
|
+
async loadWithHybridSandbox(filePath) {
|
|
62
|
+
const absolutePath = path.resolve(filePath);
|
|
63
|
+
// Validate file exists and is readable
|
|
64
|
+
await this.validateFilePathSecure(filePath);
|
|
65
|
+
const content = await fs.promises.readFile(absolutePath, 'utf-8');
|
|
66
|
+
// Quick check for obvious dangerous patterns
|
|
67
|
+
this.performBasicSecurityCheck(content, absolutePath);
|
|
68
|
+
// Create sandbox context
|
|
69
|
+
const sandbox = this.createSandboxContext(absolutePath);
|
|
70
|
+
try {
|
|
71
|
+
// Compile and run script in sandbox
|
|
72
|
+
const script = new vm.Script(content, {
|
|
73
|
+
filename: path.basename(absolutePath),
|
|
74
|
+
// @ts-expect-error - displayErrors exists but not in types
|
|
75
|
+
displayErrors: true,
|
|
76
|
+
});
|
|
77
|
+
const context = vm.createContext(sandbox);
|
|
78
|
+
script.runInContext(context, { timeout: this.sandboxTimeout });
|
|
79
|
+
// Extract configuration from sandbox
|
|
80
|
+
const config = sandbox.module.exports;
|
|
81
|
+
// Validate the configuration
|
|
82
|
+
this.validator.validateConfig(config);
|
|
83
|
+
return config;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof Error && error.message.includes('timed out')) {
|
|
87
|
+
throw createError('CONFIG_PARSE_ERROR', {
|
|
88
|
+
message: `Configuration script execution timed out after ${this.sandboxTimeout}ms`,
|
|
89
|
+
cause: error,
|
|
90
|
+
details: { filePath: absolutePath, timeout: this.sandboxTimeout },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
throw createError('CONFIG_PARSE_ERROR', {
|
|
94
|
+
message: `Failed to execute configuration in sandbox: ${error instanceof Error ? error.message : String(error)}`,
|
|
95
|
+
cause: error instanceof Error ? error : undefined,
|
|
96
|
+
details: { filePath: absolutePath },
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Basic security check for dangerous patterns
|
|
102
|
+
*/
|
|
103
|
+
performBasicSecurityCheck(content, filePath) {
|
|
104
|
+
const dangerousPatterns = [
|
|
105
|
+
/child_process/,
|
|
106
|
+
/exec\s*\(/,
|
|
107
|
+
/spawn\s*\(/,
|
|
108
|
+
/eval\s*\(/,
|
|
109
|
+
/Function\s*\(/,
|
|
110
|
+
/\.constructor\s*\(/,
|
|
111
|
+
/__proto__/,
|
|
112
|
+
/process\.exit/,
|
|
113
|
+
/process\.kill/,
|
|
114
|
+
/fs\.(unlink|rmdir|rm)/,
|
|
115
|
+
];
|
|
116
|
+
for (const pattern of dangerousPatterns) {
|
|
117
|
+
if (pattern.test(content)) {
|
|
118
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
119
|
+
message: `Configuration contains potentially dangerous pattern: ${pattern}`,
|
|
120
|
+
details: {
|
|
121
|
+
filePath,
|
|
122
|
+
pattern: pattern.toString(),
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Check for require() of non-allowed modules
|
|
128
|
+
const requirePattern = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
|
|
129
|
+
let match;
|
|
130
|
+
while ((match = requirePattern.exec(content)) !== null) {
|
|
131
|
+
const moduleName = match[1];
|
|
132
|
+
if (!this.allowedModules.has(moduleName) &&
|
|
133
|
+
!moduleName.startsWith('./') &&
|
|
134
|
+
!moduleName.startsWith('../')) {
|
|
135
|
+
throw createError('CONFIG_SECURITY_ERROR', {
|
|
136
|
+
message: `Configuration attempts to require disallowed module: ${moduleName}`,
|
|
137
|
+
details: {
|
|
138
|
+
filePath,
|
|
139
|
+
module: moduleName,
|
|
140
|
+
allowedModules: Array.from(this.allowedModules),
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create sandboxed context for VM execution
|
|
148
|
+
*/
|
|
149
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
150
|
+
createSandboxContext(filePath) {
|
|
151
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
152
|
+
const sandbox = {
|
|
153
|
+
// Basic module structure
|
|
154
|
+
module: { exports: {} },
|
|
155
|
+
exports: {},
|
|
156
|
+
// Limited console (no access to real console)
|
|
157
|
+
console: {
|
|
158
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
159
|
+
log: (..._args) => {
|
|
160
|
+
/* silent */
|
|
161
|
+
},
|
|
162
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
163
|
+
error: (..._args) => {
|
|
164
|
+
/* silent */
|
|
165
|
+
},
|
|
166
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
167
|
+
warn: (..._args) => {
|
|
168
|
+
/* silent */
|
|
169
|
+
},
|
|
170
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
171
|
+
info: (..._args) => {
|
|
172
|
+
/* silent */
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
// Limited process object
|
|
176
|
+
process: {
|
|
177
|
+
env: { ...process.env },
|
|
178
|
+
platform: process.platform,
|
|
179
|
+
arch: process.arch,
|
|
180
|
+
version: process.version,
|
|
181
|
+
versions: process.versions,
|
|
182
|
+
cwd: () => path.dirname(filePath),
|
|
183
|
+
},
|
|
184
|
+
// Paths relative to config file
|
|
185
|
+
__filename: filePath,
|
|
186
|
+
__dirname: path.dirname(filePath),
|
|
187
|
+
// Controlled require function
|
|
188
|
+
require: (id) => {
|
|
189
|
+
if (!this.allowedModules.has(id)) {
|
|
190
|
+
throw new Error(`Module '${id}' is not allowed in sandboxed configuration`);
|
|
191
|
+
}
|
|
192
|
+
// Limited module access
|
|
193
|
+
switch (id) {
|
|
194
|
+
case 'path':
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
196
|
+
return require('path');
|
|
197
|
+
case 'os':
|
|
198
|
+
return {
|
|
199
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
200
|
+
cpus: require('os').cpus,
|
|
201
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
202
|
+
platform: require('os').platform,
|
|
203
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
204
|
+
arch: require('os').arch,
|
|
205
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
206
|
+
hostname: require('os').hostname,
|
|
207
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
208
|
+
homedir: require('os').homedir,
|
|
209
|
+
};
|
|
210
|
+
case 'url':
|
|
211
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
212
|
+
return require('url');
|
|
213
|
+
default:
|
|
214
|
+
throw new Error(`Module '${id}' is not available in sandboxed configuration`);
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
// No access to global object properties
|
|
218
|
+
global: undefined,
|
|
219
|
+
setTimeout: undefined,
|
|
220
|
+
setInterval: undefined,
|
|
221
|
+
setImmediate: undefined,
|
|
222
|
+
Buffer: undefined,
|
|
223
|
+
};
|
|
224
|
+
return sandbox;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get current security mode
|
|
228
|
+
*/
|
|
229
|
+
getSecurityMode() {
|
|
230
|
+
return this.securityMode;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Set security mode (use with caution)
|
|
234
|
+
*/
|
|
235
|
+
setSecurityMode(mode) {
|
|
236
|
+
this.securityMode = mode;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get allowed modules for sandbox
|
|
240
|
+
*/
|
|
241
|
+
getAllowedModules() {
|
|
242
|
+
return Array.from(this.allowedModules);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Add allowed module for sandbox
|
|
246
|
+
*/
|
|
247
|
+
addAllowedModule(moduleName) {
|
|
248
|
+
this.allowedModules.add(moduleName);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Remove allowed module from sandbox
|
|
252
|
+
*/
|
|
253
|
+
removeAllowedModule(moduleName) {
|
|
254
|
+
this.allowedModules.delete(moduleName);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Validate file path exists and is readable
|
|
258
|
+
*/
|
|
259
|
+
async validateFilePathSecure(filePath) {
|
|
260
|
+
const absolutePath = path.resolve(filePath);
|
|
261
|
+
if (path.extname(absolutePath) !== '.js') {
|
|
262
|
+
throw createError('CONFIG_VALIDATION_ERROR', {
|
|
263
|
+
message: 'Configuration file must have .js extension',
|
|
264
|
+
details: { filePath: absolutePath },
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
await fs.promises.access(absolutePath, fs.constants.F_OK);
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
throw createError('CONFIG_FILE_NOT_FOUND', {
|
|
272
|
+
message: `Configuration file not found: ${absolutePath}`,
|
|
273
|
+
details: { filePath: absolutePath },
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
await fs.promises.access(absolutePath, fs.constants.R_OK);
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
throw createError('PERMISSION_DENIED', {
|
|
281
|
+
message: `Cannot read configuration file: ${absolutePath}`,
|
|
282
|
+
cause: error instanceof Error ? error : undefined,
|
|
283
|
+
details: { filePath: absolutePath },
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
return absolutePath;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Validate that a configuration file is safe to load
|
|
290
|
+
*/
|
|
291
|
+
async validateConfigSecurity(filePath) {
|
|
292
|
+
const issues = [];
|
|
293
|
+
try {
|
|
294
|
+
const content = await fs.promises.readFile(filePath, 'utf-8');
|
|
295
|
+
// Check for dangerous patterns
|
|
296
|
+
try {
|
|
297
|
+
this.performBasicSecurityCheck(content, filePath);
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
if (error instanceof Error) {
|
|
301
|
+
issues.push(error.message);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Additional checks can be added here
|
|
305
|
+
return {
|
|
306
|
+
safe: issues.length === 0,
|
|
307
|
+
issues,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
return {
|
|
312
|
+
safe: false,
|
|
313
|
+
issues: [
|
|
314
|
+
`Failed to read file: ${error instanceof Error ? error.message : String(error)}`,
|
|
315
|
+
],
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Create a secure configuration loader instance
|
|
322
|
+
*/
|
|
323
|
+
export function createSecureConfigLoader(options) {
|
|
324
|
+
return new SecureConfigLoader(options);
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=secure-config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-config-loader.js","sourceRoot":"","sources":["../../../src/config/secure-config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Socket Connection Implementation
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for socket connection implementations.
|
|
5
|
+
* Eliminates code duplication between UnixSocketConnection and NamedPipeConnection.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import * as net from 'net';
|
|
9
|
+
import type { IPCConnection, IPCMessage } from '../shared/ipc.js';
|
|
10
|
+
import { MessageProtocol } from './message-protocol.js';
|
|
11
|
+
import { IDisposable } from './resource-manager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Base socket connection class implementing common functionality
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class BaseSocketConnection extends EventEmitter implements IPCConnection, IDisposable {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
status: 'connected' | 'disconnected' | 'connecting' | 'error';
|
|
18
|
+
readonly connectedAt: number;
|
|
19
|
+
lastActivity: number;
|
|
20
|
+
protected readonly socket: net.Socket;
|
|
21
|
+
protected readonly protocol: MessageProtocol;
|
|
22
|
+
private disposed;
|
|
23
|
+
private readonly cleanup;
|
|
24
|
+
constructor(socket: net.Socket);
|
|
25
|
+
/**
|
|
26
|
+
* Private method to register and track listeners
|
|
27
|
+
*/
|
|
28
|
+
private registerListener;
|
|
29
|
+
/**
|
|
30
|
+
* Dispose resources
|
|
31
|
+
*/
|
|
32
|
+
dispose(): Promise<void>;
|
|
33
|
+
isDisposed(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get statistics about listener management
|
|
36
|
+
*/
|
|
37
|
+
getListenerStats(): {
|
|
38
|
+
managedListeners: number;
|
|
39
|
+
ownListeners: number;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Send message to this connection
|
|
43
|
+
*/
|
|
44
|
+
send(message: IPCMessage): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Close the connection
|
|
47
|
+
*/
|
|
48
|
+
close(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Force destroy the connection immediately (synchronous)
|
|
51
|
+
*/
|
|
52
|
+
destroy(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Check if connection is alive
|
|
55
|
+
*/
|
|
56
|
+
isAlive(): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Write buffer to socket
|
|
59
|
+
*/
|
|
60
|
+
private writeToSocket;
|
|
61
|
+
/**
|
|
62
|
+
* Set up socket event handlers
|
|
63
|
+
*/
|
|
64
|
+
private setupSocketHandlers;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=base-socket-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-socket-connection.d.ts","sourceRoot":"","sources":["../../../src/daemon/base-socket-connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD;;GAEG;AACH,8BAAsB,oBACpB,SAAQ,YACR,YAAW,aAAa,EAAE,WAAW;IAErC,SAAgB,EAAE,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,OAAO,CACtD;IACd,SAAgB,WAAW,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IAE5B,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAExC,MAAM,EAAE,GAAG,CAAC,MAAM;IAc9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACI,gBAAgB,IAAI;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;KACtB;IAcD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CA+B5B"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Socket Connection Implementation
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for socket connection implementations.
|
|
5
|
+
* Eliminates code duplication between UnixSocketConnection and NamedPipeConnection.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { setTimeout, clearTimeout } from 'timers';
|
|
9
|
+
import { generateMessageId } from '../shared/ipc.js';
|
|
10
|
+
import { MessageProtocol } from './message-protocol.js';
|
|
11
|
+
import { EventCleanupHelper } from '../utils/event-cleanup.js';
|
|
12
|
+
/**
|
|
13
|
+
* Base socket connection class implementing common functionality
|
|
14
|
+
*/
|
|
15
|
+
export class BaseSocketConnection extends EventEmitter {
|
|
16
|
+
id;
|
|
17
|
+
status = 'connected';
|
|
18
|
+
connectedAt;
|
|
19
|
+
lastActivity;
|
|
20
|
+
socket;
|
|
21
|
+
protocol;
|
|
22
|
+
disposed = false;
|
|
23
|
+
// Use EventCleanupHelper for listener tracking
|
|
24
|
+
cleanup = new EventCleanupHelper();
|
|
25
|
+
constructor(socket) {
|
|
26
|
+
super();
|
|
27
|
+
this.id = generateMessageId();
|
|
28
|
+
this.socket = socket;
|
|
29
|
+
this.connectedAt = Date.now();
|
|
30
|
+
this.lastActivity = Date.now();
|
|
31
|
+
this.protocol = new MessageProtocol();
|
|
32
|
+
// No initialization needed for EventCleanupHelper
|
|
33
|
+
this.setupSocketHandlers();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Private method to register and track listeners
|
|
37
|
+
*/
|
|
38
|
+
registerListener(emitter, event, listener) {
|
|
39
|
+
this.cleanup.track(emitter, event, listener);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Dispose resources
|
|
43
|
+
*/
|
|
44
|
+
async dispose() {
|
|
45
|
+
if (this.disposed) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.disposed = true;
|
|
49
|
+
// Clean up all tracked listeners
|
|
50
|
+
await this.cleanup.dispose();
|
|
51
|
+
// Remove all our own event listeners
|
|
52
|
+
this.removeAllListeners();
|
|
53
|
+
// Destroy socket if not already destroyed
|
|
54
|
+
if (!this.socket.destroyed) {
|
|
55
|
+
this.socket.destroy();
|
|
56
|
+
}
|
|
57
|
+
// Listeners cleaned up by EventCleanupHelper
|
|
58
|
+
}
|
|
59
|
+
isDisposed() {
|
|
60
|
+
return this.disposed;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get statistics about listener management
|
|
64
|
+
*/
|
|
65
|
+
getListenerStats() {
|
|
66
|
+
const ownEvents = this.eventNames();
|
|
67
|
+
let ownListenersCount = 0;
|
|
68
|
+
for (const event of ownEvents) {
|
|
69
|
+
ownListenersCount += this.listenerCount(event);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
managedListeners: this.cleanup.getListenerCount(),
|
|
73
|
+
ownListeners: ownListenersCount,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Send message to this connection
|
|
78
|
+
*/
|
|
79
|
+
async send(message) {
|
|
80
|
+
if (this.status !== 'connected') {
|
|
81
|
+
throw new Error('Connection is not active');
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const buffer = this.protocol.encode(message);
|
|
85
|
+
await this.writeToSocket(buffer);
|
|
86
|
+
this.lastActivity = Date.now();
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
this.status = 'error';
|
|
90
|
+
this.emit('error', error);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Close the connection
|
|
96
|
+
*/
|
|
97
|
+
async close() {
|
|
98
|
+
if (this.status === 'disconnected') {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.status = 'disconnected';
|
|
102
|
+
return new Promise((resolve) => {
|
|
103
|
+
// Set a timeout to prevent hanging
|
|
104
|
+
const timeout = setTimeout(() => {
|
|
105
|
+
if (!this.socket.destroyed) {
|
|
106
|
+
this.socket.destroy();
|
|
107
|
+
}
|
|
108
|
+
this.dispose();
|
|
109
|
+
resolve();
|
|
110
|
+
}, 2000);
|
|
111
|
+
this.socket.once('close', () => {
|
|
112
|
+
clearTimeout(timeout);
|
|
113
|
+
this.emit('close');
|
|
114
|
+
this.dispose();
|
|
115
|
+
resolve();
|
|
116
|
+
});
|
|
117
|
+
// Try graceful close first
|
|
118
|
+
if (!this.socket.destroyed) {
|
|
119
|
+
this.socket.end();
|
|
120
|
+
// Force close after a short delay if not closed gracefully
|
|
121
|
+
setTimeout(() => {
|
|
122
|
+
if (!this.socket.destroyed) {
|
|
123
|
+
this.socket.destroy();
|
|
124
|
+
}
|
|
125
|
+
}, 1000);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Force destroy the connection immediately (synchronous)
|
|
131
|
+
*/
|
|
132
|
+
destroy() {
|
|
133
|
+
this.status = 'disconnected';
|
|
134
|
+
if (!this.socket.destroyed) {
|
|
135
|
+
this.socket.destroy();
|
|
136
|
+
}
|
|
137
|
+
this.dispose();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check if connection is alive
|
|
141
|
+
*/
|
|
142
|
+
isAlive() {
|
|
143
|
+
return this.status === 'connected' && !this.socket.destroyed;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Write buffer to socket
|
|
147
|
+
*/
|
|
148
|
+
writeToSocket(buffer) {
|
|
149
|
+
return new Promise((resolve, reject) => {
|
|
150
|
+
this.socket.write(buffer, (error) => {
|
|
151
|
+
if (error) {
|
|
152
|
+
reject(error);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
resolve();
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Set up socket event handlers
|
|
162
|
+
*/
|
|
163
|
+
setupSocketHandlers() {
|
|
164
|
+
const dataHandler = (data) => {
|
|
165
|
+
try {
|
|
166
|
+
this.lastActivity = Date.now();
|
|
167
|
+
this.emit('data', data);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
this.emit('error', error);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
const errorHandler = (error) => {
|
|
174
|
+
this.status = 'error';
|
|
175
|
+
this.emit('error', error);
|
|
176
|
+
};
|
|
177
|
+
const closeHandler = () => {
|
|
178
|
+
this.status = 'disconnected';
|
|
179
|
+
this.emit('close');
|
|
180
|
+
};
|
|
181
|
+
const endHandler = () => {
|
|
182
|
+
this.status = 'disconnected';
|
|
183
|
+
this.emit('end');
|
|
184
|
+
};
|
|
185
|
+
// Register and track event listeners with EventCleanupHelper
|
|
186
|
+
this.registerListener(this.socket, 'data', dataHandler);
|
|
187
|
+
this.registerListener(this.socket, 'error', errorHandler);
|
|
188
|
+
this.registerListener(this.socket, 'close', closeHandler);
|
|
189
|
+
this.registerListener(this.socket, 'end', endHandler);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=base-socket-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-socket-connection.js","sourceRoot":"","sources":["../../../src/daemon/base-socket-connection.ts"],"names":[],"mappings":"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"}
|