syntropylog 0.9.10 → 0.9.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/core/LifecycleManager.js +48 -58
- package/dist/core/LifecycleManager.js.map +1 -1
- package/dist/index.cjs +357 -313
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.mjs +357 -313
- package/dist/index.mjs.map +1 -1
- package/dist/logger/Logger.js +1 -1
- package/dist/logger/Logger.js.map +1 -1
- package/dist/logger/LoggerFactory.js +102 -81
- package/dist/logger/LoggerFactory.js.map +1 -1
- package/dist/logger/transports/ColorfulConsoleTransport.js +83 -79
- package/dist/logger/transports/ColorfulConsoleTransport.js.map +1 -1
- package/dist/logger/transports/PrettyConsoleTransport.js +31 -26
- package/dist/logger/transports/PrettyConsoleTransport.js.map +1 -1
- package/dist/masking/MaskingEngine.js +27 -6
- package/dist/masking/MaskingEngine.js.map +1 -1
- package/dist/redis/RedisConnectionManager.js +53 -57
- package/dist/redis/RedisConnectionManager.js.map +1 -1
- package/dist/redis/index.js +6 -0
- package/dist/redis/index.js.map +1 -0
- package/dist/sanitization/SanitizationEngine.js +2 -2
- package/dist/sanitization/SanitizationEngine.js.map +1 -1
- package/dist/serialization/SerializationPipeline.js +10 -3
- package/dist/serialization/SerializationPipeline.js.map +1 -1
- package/dist/testing/BeaconRedisMock.js +116 -82
- package/dist/testing/BeaconRedisMock.js.map +1 -1
- package/dist/testing/index.cjs +21494 -67
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.ts +3 -4
- package/dist/testing/index.mjs +21494 -67
- package/dist/testing/index.mjs.map +1 -1
- package/dist/testing/magic-string.es-Bf6eKFmE.js +2005 -0
- package/dist/testing/magic-string.es-Bf6eKFmE.js.map +1 -0
- package/dist/testing/magic-string.es-Dl5DFuGU.js +2001 -0
- package/dist/testing/magic-string.es-Dl5DFuGU.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/core/LifecycleManager.d.ts +9 -1
- package/dist/types/logger/LoggerFactory.d.ts +8 -5
- package/dist/types/logger/transports/ColorfulConsoleTransport.d.ts +17 -0
- package/dist/types/logger/transports/PrettyConsoleTransport.d.ts +11 -0
- package/dist/types/masking/MaskingEngine.d.ts +2 -1
- package/dist/types/redis/RedisConnectionManager.d.ts +2 -6
- package/dist/types/redis/index.d.ts +5 -0
- package/dist/types/sanitization/SanitizationEngine.d.ts +1 -1
- package/dist/types/testing/BeaconRedisMock.d.ts +3 -3
- package/dist/types/utils/createFailingClient.d.ts +1 -0
- package/dist/utils/createFailingClient.js +16 -13
- package/dist/utils/createFailingClient.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.9.11
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fix memory leak in LoggerFactory, improve process management in LifecycleManager, and fix zombie timers in SerializationPipeline. Refactor core components to use pure functions.
|
|
8
|
+
- Security: Patched a potential ReDoS vulnerability in `MaskingEngine` by enforcing a timeout on regex execution using `regex-test`. Masking operations are now asynchronous to support this safety mechanism.
|
|
9
|
+
- MaskingEngine: Circular reference protection during recursive masking (WeakSet); cleanup of `regex-test` worker on `shutdown()` to avoid process leaks.
|
|
10
|
+
- Build: Rollup type declarations bundle now treats Node.js builtins (`child_process`, etc.) as external, eliminating "Unresolved dependencies" warnings.
|
|
11
|
+
- Types: Extended `declarations.d.ts` for `regex-test` with `test()` and `cleanWorker()` for correct typing and lint compliance.
|
|
12
|
+
|
|
3
13
|
## 0.9.10
|
|
4
14
|
|
|
5
15
|
### Patch Changes
|
|
@@ -7,6 +7,32 @@ import { sanitizeConfig } from '../utils/sanitizeConfig';
|
|
|
7
7
|
import { SerializationManager } from '../serialization/SerializationManager';
|
|
8
8
|
import { MaskingEngine } from '../masking/MaskingEngine';
|
|
9
9
|
import { errorToJsonValue } from '../types';
|
|
10
|
+
// Pure helper function for process termination
|
|
11
|
+
const terminateProcess = async (childProcess, logger) => {
|
|
12
|
+
if (!childProcess.connected && childProcess.exitCode !== null) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const pid = childProcess.pid;
|
|
16
|
+
logger?.debug(`Sending SIGTERM to process ${pid}...`);
|
|
17
|
+
childProcess.kill('SIGTERM');
|
|
18
|
+
// Wait up to 5 seconds for graceful exit
|
|
19
|
+
const gracefulExit = new Promise((resolve) => {
|
|
20
|
+
const onExit = () => {
|
|
21
|
+
resolve();
|
|
22
|
+
childProcess.removeListener('exit', onExit);
|
|
23
|
+
};
|
|
24
|
+
childProcess.on('exit', onExit);
|
|
25
|
+
});
|
|
26
|
+
const timeout = new Promise((resolve) => setTimeout(resolve, 5000));
|
|
27
|
+
await Promise.race([gracefulExit, timeout]);
|
|
28
|
+
if (childProcess.exitCode === null) {
|
|
29
|
+
logger?.warn(`Process ${pid} did not exit after SIGTERM, sending SIGKILL...`);
|
|
30
|
+
childProcess.kill('SIGKILL');
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
logger?.debug(`Process ${pid} exited gracefully`);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
10
36
|
export class LifecycleManager extends EventEmitter {
|
|
11
37
|
state = 'NOT_INITIALIZED';
|
|
12
38
|
config;
|
|
@@ -17,6 +43,7 @@ export class LifecycleManager extends EventEmitter {
|
|
|
17
43
|
maskingEngine;
|
|
18
44
|
logger = null;
|
|
19
45
|
syntropyFacade;
|
|
46
|
+
trackedProcesses = new Set();
|
|
20
47
|
constructor(syntropyFacade) {
|
|
21
48
|
super();
|
|
22
49
|
this.syntropyFacade = syntropyFacade;
|
|
@@ -115,70 +142,33 @@ export class LifecycleManager extends EventEmitter {
|
|
|
115
142
|
});
|
|
116
143
|
}
|
|
117
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Registers a child process to be managed by the LifecycleManager.
|
|
147
|
+
* Managed processes will be gracefully terminated during shutdown.
|
|
148
|
+
* @param childProcess The child process to track
|
|
149
|
+
*/
|
|
150
|
+
registerChildProcess(childProcess) {
|
|
151
|
+
this.trackedProcesses.add(childProcess);
|
|
152
|
+
// Auto-remove if it exits on its own
|
|
153
|
+
childProcess.on('exit', () => {
|
|
154
|
+
this.trackedProcesses.delete(childProcess);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
118
157
|
/**
|
|
119
158
|
* Terminates external processes that might keep the Node.js process active.
|
|
120
|
-
*
|
|
159
|
+
* Uses a graceful shutdown strategy (SIGTERM -> wait -> SIGKILL).
|
|
121
160
|
*/
|
|
122
161
|
async terminateExternalProcesses() {
|
|
123
162
|
try {
|
|
124
|
-
this.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
this.logger?.debug(`Total active handles: ${activeHandles.length}`);
|
|
128
|
-
// Filter child processes that need to be terminated
|
|
129
|
-
const childProcesses = activeHandles.filter((handle) => {
|
|
130
|
-
const h = handle;
|
|
131
|
-
const isChildProcess = h.constructor?.name === 'ChildProcess';
|
|
132
|
-
const isConnected = h.connected;
|
|
133
|
-
const hasRegexTest = h.spawnargs?.some((arg) => arg.includes('regex-test'));
|
|
134
|
-
this.logger?.debug(`Handle: ${h.constructor?.name}, connected: ${isConnected}, hasRegexTest: ${hasRegexTest}`);
|
|
135
|
-
return Boolean(isChildProcess && isConnected && hasRegexTest);
|
|
136
|
-
});
|
|
137
|
-
this.logger?.info(`Found ${childProcesses.length} regex-test processes to terminate`);
|
|
138
|
-
if (childProcesses.length > 0) {
|
|
139
|
-
this.logger?.info(`Terminating ${childProcesses.length} external processes...`);
|
|
140
|
-
// Terminate each child process directly with SIGKILL for maximum effectiveness
|
|
141
|
-
for (const childProcess of childProcesses) {
|
|
142
|
-
try {
|
|
143
|
-
this.logger?.debug(`Terminating process ${childProcess.pid} with SIGKILL...`);
|
|
144
|
-
childProcess.kill('SIGKILL');
|
|
145
|
-
this.logger?.debug(`Process ${childProcess.pid} terminated with SIGKILL`);
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
this.logger?.warn(`Error terminating process ${childProcess.pid}:`, { error: errorToJsonValue(error) });
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
// Wait a bit for processes to terminate
|
|
152
|
-
this.logger?.debug('Waiting 200ms for processes to terminate...');
|
|
153
|
-
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
154
|
-
// Check if processes are still active
|
|
155
|
-
const remainingHandles = process._getActiveHandles?.() ?? [];
|
|
156
|
-
const remainingChildProcesses = remainingHandles.filter((handle) => {
|
|
157
|
-
const h = handle;
|
|
158
|
-
return (h.constructor?.name === 'ChildProcess' &&
|
|
159
|
-
h.connected &&
|
|
160
|
-
h.spawnargs?.some((arg) => arg.includes('regex-test')));
|
|
161
|
-
});
|
|
162
|
-
if (remainingChildProcesses.length > 0) {
|
|
163
|
-
this.logger?.warn(`${remainingChildProcesses.length} regex-test processes still active after SIGKILL`);
|
|
164
|
-
// Try to disconnect the processes
|
|
165
|
-
for (const childProcess of remainingChildProcesses) {
|
|
166
|
-
try {
|
|
167
|
-
childProcess.disconnect();
|
|
168
|
-
this.logger?.debug(`Process ${childProcess.pid} disconnected`);
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
this.logger?.warn(`Error disconnecting process ${childProcess.pid}:`, { error: errorToJsonValue(error) });
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
this.logger?.info('✅ All regex-test processes terminated successfully');
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
this.logger?.info('No regex-test processes found to terminate');
|
|
163
|
+
if (this.trackedProcesses.size === 0) {
|
|
164
|
+
this.logger?.info('No tracked external processes to terminate');
|
|
165
|
+
return;
|
|
181
166
|
}
|
|
167
|
+
this.logger?.info(`Terminating ${this.trackedProcesses.size} external processes...`);
|
|
168
|
+
const terminationPromises = Array.from(this.trackedProcesses).map((childProcess) => terminateProcess(childProcess, this.logger));
|
|
169
|
+
await Promise.allSettled(terminationPromises);
|
|
170
|
+
this.trackedProcesses.clear();
|
|
171
|
+
this.logger?.info('✅ All external processes terminated');
|
|
182
172
|
}
|
|
183
173
|
catch (error) {
|
|
184
174
|
this.logger?.warn('Error terminating external processes:', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LifecycleManager.js","sourceRoot":"","sources":["../../src/core/LifecycleManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAmB,MAAM,YAAY,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAU5C,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IACxC,KAAK,GAAqB,iBAAiB,CAAC;IAC7C,MAAM,CAAgC;IACtC,cAAc,CAA8B;IAC5C,aAAa,CAA4B;IACzC,YAAY,CAA2B;IACvC,oBAAoB,CAAuB;IAC3C,aAAa,CAAgB;IAC5B,MAAM,GAAmB,IAAI,CAAC;IAC9B,cAAc,CAAc;
|
|
1
|
+
{"version":3,"file":"LifecycleManager.js","sourceRoot":"","sources":["../../src/core/LifecycleManager.ts"],"names":[],"mappings":"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"}
|