@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,491 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC Server Base Implementation
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for IPC server implementations.
|
|
5
|
+
* Provides common functionality for both Unix Domain Socket and Named Pipe servers.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { setTimeout } from 'timers';
|
|
9
|
+
import { SimpleDisposableBase } from './simple-resource-manager.js';
|
|
10
|
+
import { generateMessageId } from '../shared/ipc.js';
|
|
11
|
+
/**
|
|
12
|
+
* Abstract base class for IPC servers
|
|
13
|
+
*/
|
|
14
|
+
export class IPCServerBase extends SimpleDisposableBase {
|
|
15
|
+
config;
|
|
16
|
+
connections = new Map();
|
|
17
|
+
messageHandlers = new Map();
|
|
18
|
+
isListening = false;
|
|
19
|
+
serverInstance = null;
|
|
20
|
+
eventEmitter = new EventEmitter();
|
|
21
|
+
constructor(config = { path: '' }) {
|
|
22
|
+
super();
|
|
23
|
+
// Set default configuration
|
|
24
|
+
this.config = {
|
|
25
|
+
path: config.path,
|
|
26
|
+
socketPath: config.socketPath || config.path || '',
|
|
27
|
+
namedPipePath: config.namedPipePath || config.path || '',
|
|
28
|
+
cleanupOnStart: config.cleanupOnStart ?? true,
|
|
29
|
+
maxConnections: config.maxConnections || 100,
|
|
30
|
+
connectionTimeout: config.connectionTimeout || 30000,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Start the IPC server
|
|
35
|
+
*/
|
|
36
|
+
async start() {
|
|
37
|
+
this.ensureNotDisposed();
|
|
38
|
+
if (this.isListening) {
|
|
39
|
+
throw new Error('Server is already listening');
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
await this.startServer();
|
|
43
|
+
this.isListening = true;
|
|
44
|
+
this.emit('listening');
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
48
|
+
this.emit('error', errorObj);
|
|
49
|
+
throw errorObj;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Stop the IPC server
|
|
54
|
+
*/
|
|
55
|
+
async stop() {
|
|
56
|
+
this.ensureNotDisposed();
|
|
57
|
+
if (!this.isListening) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
// Close all connections with timeout protection
|
|
62
|
+
const closePromises = Array.from(this.connections.values()).map(async (connection) => {
|
|
63
|
+
try {
|
|
64
|
+
await Promise.race([
|
|
65
|
+
connection.close ? connection.close() : Promise.resolve(),
|
|
66
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Connection close timeout')), 5000)),
|
|
67
|
+
]);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
// Log error but continue with other connections
|
|
71
|
+
this.emit('connectionCloseError', error instanceof Error ? error : new Error(String(error)), connection.id);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
await Promise.all(closePromises);
|
|
75
|
+
this.connections.clear();
|
|
76
|
+
// Stop the server
|
|
77
|
+
await this.stopServer();
|
|
78
|
+
this.isListening = false;
|
|
79
|
+
this.emit('stopped');
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
83
|
+
this.emit('error', errorObj);
|
|
84
|
+
throw errorObj;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Register a message handler for a specific command type
|
|
89
|
+
*/
|
|
90
|
+
registerHandler(commandType, handler) {
|
|
91
|
+
this.messageHandlers.set(commandType, handler);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Unregister a message handler
|
|
95
|
+
*/
|
|
96
|
+
unregisterHandler(commandType) {
|
|
97
|
+
this.messageHandlers.delete(commandType);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get a message handler for a specific command type
|
|
101
|
+
*/
|
|
102
|
+
getHandler(commandType) {
|
|
103
|
+
return this.messageHandlers.get(commandType);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a handler is registered for a command type
|
|
107
|
+
*/
|
|
108
|
+
hasHandler(commandType) {
|
|
109
|
+
return this.messageHandlers.has(commandType);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Clear all message handlers
|
|
113
|
+
*/
|
|
114
|
+
clearHandlers() {
|
|
115
|
+
this.messageHandlers.clear();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get all active connections
|
|
119
|
+
*/
|
|
120
|
+
getConnections() {
|
|
121
|
+
return Array.from(this.connections.values());
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get connection by ID
|
|
125
|
+
*/
|
|
126
|
+
getConnection(id) {
|
|
127
|
+
return this.connections.get(id);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if server is listening
|
|
131
|
+
*/
|
|
132
|
+
isServerListening() {
|
|
133
|
+
return this.isListening;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Broadcast message to all connections
|
|
137
|
+
*/
|
|
138
|
+
async broadcast(message) {
|
|
139
|
+
this.ensureNotDisposed();
|
|
140
|
+
const sendPromises = Array.from(this.connections.values()).map(async (connection) => {
|
|
141
|
+
try {
|
|
142
|
+
await Promise.race([
|
|
143
|
+
connection.send
|
|
144
|
+
? connection.send(message)
|
|
145
|
+
: Promise.reject(new Error('send method not available')),
|
|
146
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Broadcast timeout')), 5000)),
|
|
147
|
+
]);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
this.emit('connectionError', error instanceof Error ? error : new Error(String(error)), connection.id);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
await Promise.all(sendPromises);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Handle incoming message from a connection
|
|
157
|
+
*/
|
|
158
|
+
async handleMessage(data, connection) {
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
160
|
+
let messages = [];
|
|
161
|
+
try {
|
|
162
|
+
// Update last activity
|
|
163
|
+
connection.lastActivity = Date.now();
|
|
164
|
+
// Parse messages from buffer (handle multiple messages)
|
|
165
|
+
messages = this.parseMessages(data);
|
|
166
|
+
for (const messageData of messages) {
|
|
167
|
+
await this.processMessage(messageData, connection);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
this.emit('messageError', error instanceof Error ? error : new Error(String(error)), messages, // The message data that caused the error
|
|
172
|
+
connection.id);
|
|
173
|
+
// Send error response if possible
|
|
174
|
+
try {
|
|
175
|
+
const errorResponse = {
|
|
176
|
+
id: generateMessageId(),
|
|
177
|
+
type: 'error',
|
|
178
|
+
requestId: 'unknown',
|
|
179
|
+
timestamp: Date.now(),
|
|
180
|
+
success: false,
|
|
181
|
+
error: {
|
|
182
|
+
code: 'MESSAGE_PARSE_ERROR',
|
|
183
|
+
message: 'Failed to parse message',
|
|
184
|
+
details: {
|
|
185
|
+
error: error instanceof Error ? error.message : String(error),
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
if (connection.send) {
|
|
190
|
+
await connection.send(errorResponse);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (sendError) {
|
|
194
|
+
this.emit('connectionError', sendError instanceof Error ? sendError : new Error(String(sendError)), connection.id);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Parse multiple JSON messages from buffer
|
|
200
|
+
* Addresses the PoC issue with consecutive message parsing
|
|
201
|
+
*/
|
|
202
|
+
parseMessages(data) {
|
|
203
|
+
const messages = [];
|
|
204
|
+
const text = data.toString('utf8');
|
|
205
|
+
// Split by newlines and filter out empty lines
|
|
206
|
+
const lines = text.split('\n').filter((line) => line.trim());
|
|
207
|
+
for (const line of lines) {
|
|
208
|
+
try {
|
|
209
|
+
const parsed = JSON.parse(line.trim());
|
|
210
|
+
messages.push(parsed);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Try to handle concatenated JSON objects without newlines
|
|
214
|
+
// This addresses the PoC parsing issue
|
|
215
|
+
this.handleConcatenatedJSON(line.trim(), messages);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return messages;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Handle concatenated JSON objects in a single line
|
|
222
|
+
* Uses simplified regex approach consistent with message-protocol.ts
|
|
223
|
+
*/
|
|
224
|
+
handleConcatenatedJSON(text, messages) {
|
|
225
|
+
// Simple approach: match JSON objects with balanced braces
|
|
226
|
+
const jsonRegex = /\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}/g;
|
|
227
|
+
const matches = text.match(jsonRegex) || [];
|
|
228
|
+
for (const match of matches) {
|
|
229
|
+
try {
|
|
230
|
+
const parsed = JSON.parse(match.trim());
|
|
231
|
+
messages.push(parsed);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.warn(`Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`, {
|
|
235
|
+
method: 'parseBuffer',
|
|
236
|
+
input: match.trim().slice(0, 100), // First 100 chars for debugging
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Process a single parsed message
|
|
243
|
+
*/
|
|
244
|
+
async processMessage(messageData, connection) {
|
|
245
|
+
try {
|
|
246
|
+
// Validate message structure
|
|
247
|
+
if (!this.isValidIPCMessage(messageData)) {
|
|
248
|
+
throw new Error('Invalid IPC message structure');
|
|
249
|
+
}
|
|
250
|
+
// Handle ping message specially for heartbeat monitoring (internal message)
|
|
251
|
+
if (messageData.type === 'ping') {
|
|
252
|
+
const pongResponse = {
|
|
253
|
+
id: generateMessageId(),
|
|
254
|
+
type: 'response', // Use existing response type for internal pong
|
|
255
|
+
requestId: messageData.id,
|
|
256
|
+
timestamp: Date.now(),
|
|
257
|
+
success: true,
|
|
258
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
|
+
data: { timestamp: Date.now() },
|
|
260
|
+
};
|
|
261
|
+
if (connection.send) {
|
|
262
|
+
await connection.send(pongResponse);
|
|
263
|
+
}
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const message = messageData;
|
|
267
|
+
const handler = this.messageHandlers.get(message.type);
|
|
268
|
+
if (!handler) {
|
|
269
|
+
throw new Error(`No handler registered for command type: ${message.type}`);
|
|
270
|
+
}
|
|
271
|
+
// Execute handler
|
|
272
|
+
const response = await handler(message, connection);
|
|
273
|
+
// Send response if handler returned one
|
|
274
|
+
if (response) {
|
|
275
|
+
if (connection.send) {
|
|
276
|
+
await connection.send(response);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
// Send error response
|
|
282
|
+
const errorResponse = {
|
|
283
|
+
id: generateMessageId(),
|
|
284
|
+
type: 'error',
|
|
285
|
+
requestId: messageData &&
|
|
286
|
+
typeof messageData === 'object' &&
|
|
287
|
+
'id' in messageData &&
|
|
288
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
289
|
+
typeof messageData.id === 'string'
|
|
290
|
+
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
291
|
+
messageData.id
|
|
292
|
+
: 'unknown',
|
|
293
|
+
success: false,
|
|
294
|
+
error: {
|
|
295
|
+
code: 'COMMAND_EXECUTION_ERROR',
|
|
296
|
+
message: error instanceof Error ? error.message : String(error),
|
|
297
|
+
details: { originalMessage: messageData },
|
|
298
|
+
},
|
|
299
|
+
timestamp: Date.now(),
|
|
300
|
+
};
|
|
301
|
+
try {
|
|
302
|
+
if (connection.send) {
|
|
303
|
+
await connection.send(errorResponse);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (sendError) {
|
|
307
|
+
this.emit('connectionError', sendError instanceof Error ? sendError : new Error(String(sendError)), connection.id);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Validate IPC message structure
|
|
313
|
+
*/
|
|
314
|
+
isValidIPCMessage(obj) {
|
|
315
|
+
// t_wada boundary principle: gracefully handle null/undefined payloads
|
|
316
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
320
|
+
const message = obj;
|
|
321
|
+
// Validate required fields
|
|
322
|
+
if (typeof message.id !== 'string' ||
|
|
323
|
+
typeof message.type !== 'string' ||
|
|
324
|
+
typeof message.timestamp !== 'number') {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
// Accept messages with null/undefined/missing payload for boundary testing
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Handle new connection
|
|
332
|
+
*/
|
|
333
|
+
handleConnection(connection) {
|
|
334
|
+
// Add to connections map (connection limit is checked at server level)
|
|
335
|
+
// console.error(`[DEBUG-CONNECTION-LIMIT] Adding connection ${connection.id} to map, new size will be: ${this.connections.size + 1}`);
|
|
336
|
+
this.connections.set(connection.id, connection);
|
|
337
|
+
this.emit('connection', connection);
|
|
338
|
+
// Set up connection event handlers
|
|
339
|
+
this.setupConnectionHandlers(connection);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Set up event handlers for a connection
|
|
343
|
+
*/
|
|
344
|
+
setupConnectionHandlers(connection) {
|
|
345
|
+
// Remove connection when it closes
|
|
346
|
+
const cleanup = () => {
|
|
347
|
+
this.connections.delete(connection.id);
|
|
348
|
+
this.emit('disconnection', connection.id);
|
|
349
|
+
};
|
|
350
|
+
// Track event listeners for proper cleanup
|
|
351
|
+
if (typeof connection.on === 'function') {
|
|
352
|
+
this.addEventListener(
|
|
353
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
354
|
+
connection, 'close', cleanup);
|
|
355
|
+
this.addEventListener(
|
|
356
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
357
|
+
connection, 'error', (error) => {
|
|
358
|
+
this.emit('connectionError', error, connection.id);
|
|
359
|
+
cleanup();
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Set up connection events for socket-based connections
|
|
365
|
+
* Common logic for Unix Socket and Named Pipe connections
|
|
366
|
+
*/
|
|
367
|
+
setupConnectionEvents(connection) {
|
|
368
|
+
// Set up connection data handler
|
|
369
|
+
if (connection.on) {
|
|
370
|
+
connection.on('data', (data) => {
|
|
371
|
+
this.handleMessage(data, connection);
|
|
372
|
+
});
|
|
373
|
+
// Clean up connection when it's disposed
|
|
374
|
+
connection.on('close', () => {
|
|
375
|
+
// Connection cleanup is handled in base class
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
// Handle the new connection
|
|
379
|
+
this.handleConnection(connection);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Set up common server events for net.Server instances
|
|
383
|
+
* Common logic for Unix Socket and Named Pipe servers
|
|
384
|
+
*/
|
|
385
|
+
setupCommonServerEvents(server) {
|
|
386
|
+
server.on('error', (error) => {
|
|
387
|
+
this.emit('error', error);
|
|
388
|
+
});
|
|
389
|
+
server.on('listening', () => {
|
|
390
|
+
this.emit('listening');
|
|
391
|
+
});
|
|
392
|
+
server.on('close', () => {
|
|
393
|
+
this.emit('close');
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Implement disposal core for DisposableBase
|
|
398
|
+
*/
|
|
399
|
+
disposeCore() {
|
|
400
|
+
// Stop the server if still running (non-blocking)
|
|
401
|
+
if (this.isListening) {
|
|
402
|
+
try {
|
|
403
|
+
this.stop().catch(() => {
|
|
404
|
+
/* ignore */
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
catch {
|
|
408
|
+
// Ignore errors during disposal
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// Force close any remaining connections (non-blocking)
|
|
412
|
+
const connectionsArray = Array.from(this.connections.values());
|
|
413
|
+
for (const connection of connectionsArray) {
|
|
414
|
+
try {
|
|
415
|
+
if (connection.close) {
|
|
416
|
+
const closePromise = connection.close();
|
|
417
|
+
if (closePromise && typeof closePromise.catch === 'function') {
|
|
418
|
+
closePromise.catch(() => {
|
|
419
|
+
/* ignore */
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
// Ignore errors during disposal
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
this.connections.clear();
|
|
429
|
+
// Clear message handlers
|
|
430
|
+
this.messageHandlers.clear();
|
|
431
|
+
// Clear event listeners
|
|
432
|
+
this.eventEmitter.removeAllListeners();
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Get current resource usage statistics
|
|
436
|
+
*/
|
|
437
|
+
getResourceStats() {
|
|
438
|
+
const resourceCount = this.resources.getResourceCount();
|
|
439
|
+
return {
|
|
440
|
+
activeConnections: this.connections.size,
|
|
441
|
+
messageHandlers: this.messageHandlers.size,
|
|
442
|
+
eventListeners: resourceCount.listeners,
|
|
443
|
+
totalResources: resourceCount.timeouts +
|
|
444
|
+
resourceCount.intervals +
|
|
445
|
+
resourceCount.listeners,
|
|
446
|
+
isListening: this.isListening,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* TypedEventEmitter implementation methods
|
|
451
|
+
*/
|
|
452
|
+
on(event, listener) {
|
|
453
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
454
|
+
this.eventEmitter.on(event, listener);
|
|
455
|
+
return this;
|
|
456
|
+
}
|
|
457
|
+
once(event, listener) {
|
|
458
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
459
|
+
this.eventEmitter.once(event, listener);
|
|
460
|
+
return this;
|
|
461
|
+
}
|
|
462
|
+
emit(event, ...args) {
|
|
463
|
+
return this.eventEmitter.emit(event, ...args);
|
|
464
|
+
}
|
|
465
|
+
removeListener(event, listener) {
|
|
466
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
467
|
+
this.eventEmitter.removeListener(event, listener);
|
|
468
|
+
return this;
|
|
469
|
+
}
|
|
470
|
+
off(event, listener) {
|
|
471
|
+
return this.removeListener(event, listener);
|
|
472
|
+
}
|
|
473
|
+
removeAllListeners(event) {
|
|
474
|
+
this.eventEmitter.removeAllListeners(event);
|
|
475
|
+
return this;
|
|
476
|
+
}
|
|
477
|
+
setMaxListeners(n) {
|
|
478
|
+
this.eventEmitter.setMaxListeners(n);
|
|
479
|
+
return this;
|
|
480
|
+
}
|
|
481
|
+
getMaxListeners() {
|
|
482
|
+
return this.eventEmitter.getMaxListeners();
|
|
483
|
+
}
|
|
484
|
+
listeners(event) {
|
|
485
|
+
return this.eventEmitter.listeners(event);
|
|
486
|
+
}
|
|
487
|
+
listenerCount(event) {
|
|
488
|
+
return this.eventEmitter.listenerCount(event);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=ipc-server-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-server-base.js","sourceRoot":"","sources":["../../../src/daemon/ipc-server-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC Message Protocol Implementation
|
|
3
|
+
*
|
|
4
|
+
* Handles serialization, deserialization, and proper parsing of IPC messages.
|
|
5
|
+
* Addresses the PoC issue with consecutive message parsing by implementing
|
|
6
|
+
* proper message framing and delimiter handling.
|
|
7
|
+
*/
|
|
8
|
+
import type { IPCMessage } from '../shared/ipc.js';
|
|
9
|
+
import { IDisposable } from './resource-manager.js';
|
|
10
|
+
/**
|
|
11
|
+
* Message delimiter used to separate messages in the stream
|
|
12
|
+
*/
|
|
13
|
+
export declare const MESSAGE_DELIMITER = "\n";
|
|
14
|
+
/**
|
|
15
|
+
* Maximum message size in bytes (1MB)
|
|
16
|
+
*/
|
|
17
|
+
export declare const MAX_MESSAGE_SIZE: number;
|
|
18
|
+
/**
|
|
19
|
+
* Message buffer for handling partial messages
|
|
20
|
+
*/
|
|
21
|
+
export declare class MessageBuffer implements IDisposable {
|
|
22
|
+
private buffer;
|
|
23
|
+
private readonly delimiter;
|
|
24
|
+
private readonly maxSize;
|
|
25
|
+
constructor(delimiter?: string, maxSize?: number);
|
|
26
|
+
/**
|
|
27
|
+
* Add data to the buffer and extract complete messages
|
|
28
|
+
*/
|
|
29
|
+
push(data: Buffer | string): IPCMessage[];
|
|
30
|
+
/**
|
|
31
|
+
* Extract messages using delimiter-based framing
|
|
32
|
+
*/
|
|
33
|
+
private extractDelimitedMessages;
|
|
34
|
+
/**
|
|
35
|
+
* Parse a single message from text
|
|
36
|
+
*/
|
|
37
|
+
private parseMessage;
|
|
38
|
+
/**
|
|
39
|
+
* Handle concatenated JSON objects in a single string
|
|
40
|
+
* This addresses the PoC issue with consecutive message parsing
|
|
41
|
+
*/
|
|
42
|
+
private parseConcatenatedJSON;
|
|
43
|
+
/**
|
|
44
|
+
* Validate IPC message structure
|
|
45
|
+
*/
|
|
46
|
+
private isValidIPCMessage;
|
|
47
|
+
/**
|
|
48
|
+
* Get current buffer size
|
|
49
|
+
*/
|
|
50
|
+
getBufferSize(): number;
|
|
51
|
+
/**
|
|
52
|
+
* Clear the buffer
|
|
53
|
+
*/
|
|
54
|
+
clear(): void;
|
|
55
|
+
/**
|
|
56
|
+
* Dispose resources
|
|
57
|
+
*/
|
|
58
|
+
dispose(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Check if disposed
|
|
61
|
+
*/
|
|
62
|
+
isDisposed(): boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Message serializer for encoding IPC messages
|
|
66
|
+
*/
|
|
67
|
+
export declare class MessageSerializer {
|
|
68
|
+
private readonly delimiter;
|
|
69
|
+
constructor(delimiter?: string);
|
|
70
|
+
/**
|
|
71
|
+
* Serialize message to buffer
|
|
72
|
+
*/
|
|
73
|
+
serialize(message: IPCMessage): Buffer;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Message deserializer using MessageBuffer
|
|
77
|
+
*/
|
|
78
|
+
export declare class MessageDeserializer extends MessageBuffer {
|
|
79
|
+
constructor(delimiter?: string, maxSize?: number);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Complete message protocol handler
|
|
83
|
+
*/
|
|
84
|
+
export declare class MessageProtocol implements IDisposable {
|
|
85
|
+
private readonly serializer;
|
|
86
|
+
private readonly deserializer;
|
|
87
|
+
constructor(delimiter?: string, maxSize?: number);
|
|
88
|
+
/**
|
|
89
|
+
* Encode a message to buffer
|
|
90
|
+
*/
|
|
91
|
+
encode(message: IPCMessage): Buffer;
|
|
92
|
+
/**
|
|
93
|
+
* Decode data and extract messages
|
|
94
|
+
*/
|
|
95
|
+
decode(data: Buffer | string): IPCMessage[];
|
|
96
|
+
/**
|
|
97
|
+
* Get current buffer size
|
|
98
|
+
*/
|
|
99
|
+
getBufferSize(): number;
|
|
100
|
+
/**
|
|
101
|
+
* Clear the decode buffer
|
|
102
|
+
*/
|
|
103
|
+
clearBuffer(): void;
|
|
104
|
+
/**
|
|
105
|
+
* Dispose resources
|
|
106
|
+
*/
|
|
107
|
+
dispose(): void;
|
|
108
|
+
/**
|
|
109
|
+
* Check if disposed
|
|
110
|
+
*/
|
|
111
|
+
isDisposed(): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Get resource stats
|
|
114
|
+
*/
|
|
115
|
+
getResourceStats(): {
|
|
116
|
+
bufferSize: number;
|
|
117
|
+
isDisposed: boolean;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create a message protocol instance
|
|
122
|
+
*/
|
|
123
|
+
export declare function createMessageProtocol(delimiter?: string, maxSize?: number): MessageProtocol;
|
|
124
|
+
/**
|
|
125
|
+
* Utility function to validate message size
|
|
126
|
+
*/
|
|
127
|
+
export declare function validateMessageSize(message: IPCMessage, maxSize?: number): boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Utility function to estimate message size
|
|
130
|
+
*/
|
|
131
|
+
export declare function estimateMessageSize(message: IPCMessage): number;
|
|
132
|
+
//# sourceMappingURL=message-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-protocol.d.ts","sourceRoot":"","sources":["../../../src/daemon/message-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAc,CAAC;AAE5C;;GAEG;AACH,qBAAa,aAAc,YAAW,WAAW;IAC/C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,SAAS,SAAoB,EAAE,OAAO,SAAmB;IAKrE;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,EAAE;IAkBzC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAsBhC;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,SAAoB;IAIzC;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;CASvC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;gBACxC,SAAS,SAAoB,EAAE,OAAO,SAAmB;CAGtE;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAEvC,SAAS,SAAoB,EAAE,OAAO,SAAmB;IAKrE;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAInC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,EAAE;IAI3C;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,gBAAgB,IAAI;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB;CAMF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,SAAoB,EAC7B,OAAO,SAAmB,GACzB,eAAe,CAEjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,UAAU,EACnB,OAAO,SAAmB,GACzB,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAM/D"}
|