tywrap 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 +319 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +263 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +41 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +234 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/analyzer.d.ts +63 -0
- package/dist/core/analyzer.d.ts.map +1 -0
- package/dist/core/analyzer.js +676 -0
- package/dist/core/analyzer.js.map +1 -0
- package/dist/core/discovery.d.ts +85 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +344 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/generator.d.ts +37 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +368 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/mapper.d.ts +40 -0
- package/dist/core/mapper.d.ts.map +1 -0
- package/dist/core/mapper.js +401 -0
- package/dist/core/mapper.js.map +1 -0
- package/dist/core/validation.d.ts +79 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +486 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/base.d.ts +12 -0
- package/dist/runtime/base.d.ts.map +1 -0
- package/dist/runtime/base.js +6 -0
- package/dist/runtime/base.js.map +1 -0
- package/dist/runtime/errors.d.ts +17 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +21 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/http.d.ts +22 -0
- package/dist/runtime/http.d.ts.map +1 -0
- package/dist/runtime/http.js +79 -0
- package/dist/runtime/http.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +17 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/node.d.ts +48 -0
- package/dist/runtime/node.d.ts.map +1 -0
- package/dist/runtime/node.js +328 -0
- package/dist/runtime/node.js.map +1 -0
- package/dist/runtime/optimized-node.d.ts +131 -0
- package/dist/runtime/optimized-node.d.ts.map +1 -0
- package/dist/runtime/optimized-node.js +622 -0
- package/dist/runtime/optimized-node.js.map +1 -0
- package/dist/runtime/protocol.d.ts +3 -0
- package/dist/runtime/protocol.d.ts.map +1 -0
- package/dist/runtime/protocol.js +3 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/runtime/pyodide.d.ts +27 -0
- package/dist/runtime/pyodide.d.ts.map +1 -0
- package/dist/runtime/pyodide.js +191 -0
- package/dist/runtime/pyodide.js.map +1 -0
- package/dist/tools/python_suite.js +173 -0
- package/dist/tools/python_suite.js.map +1 -0
- package/dist/types/index.d.ts +299 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/tywrap.d.ts +29 -0
- package/dist/tywrap.d.ts.map +1 -0
- package/dist/tywrap.js +589 -0
- package/dist/tywrap.js.map +1 -0
- package/dist/utils/bundle-optimizer.d.ts +182 -0
- package/dist/utils/bundle-optimizer.d.ts.map +1 -0
- package/dist/utils/bundle-optimizer.js +680 -0
- package/dist/utils/bundle-optimizer.js.map +1 -0
- package/dist/utils/cache.d.ts +149 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +492 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/codec.d.ts +94 -0
- package/dist/utils/codec.d.ts.map +1 -0
- package/dist/utils/codec.js +150 -0
- package/dist/utils/codec.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +140 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory-profiler.d.ts +123 -0
- package/dist/utils/memory-profiler.d.ts.map +1 -0
- package/dist/utils/memory-profiler.js +426 -0
- package/dist/utils/memory-profiler.js.map +1 -0
- package/dist/utils/parallel-processor.d.ts +146 -0
- package/dist/utils/parallel-processor.d.ts.map +1 -0
- package/dist/utils/parallel-processor.js +636 -0
- package/dist/utils/parallel-processor.js.map +1 -0
- package/dist/utils/python.d.ts +8 -0
- package/dist/utils/python.d.ts.map +1 -0
- package/dist/utils/python.js +56 -0
- package/dist/utils/python.js.map +1 -0
- package/dist/utils/runtime.d.ts +153 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/utils/runtime.js +519 -0
- package/dist/utils/runtime.js.map +1 -0
- package/package.json +136 -0
- package/runtime/python_bridge.py +476 -0
- package/src/cli.ts +331 -0
- package/src/config/index.ts +289 -0
- package/src/core/analyzer.ts +788 -0
- package/src/core/discovery.ts +415 -0
- package/src/core/generator.ts +447 -0
- package/src/core/mapper.ts +504 -0
- package/src/core/validation.ts +693 -0
- package/src/index.ts +83 -0
- package/src/runtime/base.ts +32 -0
- package/src/runtime/errors.ts +19 -0
- package/src/runtime/http.ts +132 -0
- package/src/runtime/index.ts +24 -0
- package/src/runtime/node.ts +431 -0
- package/src/runtime/optimized-node.ts +838 -0
- package/src/runtime/protocol.ts +2 -0
- package/src/runtime/pyodide.ts +228 -0
- package/src/types/global.d.ts +60 -0
- package/src/types/index.ts +410 -0
- package/src/tywrap.ts +669 -0
- package/src/utils/bundle-optimizer.ts +876 -0
- package/src/utils/cache.ts +634 -0
- package/src/utils/codec.ts +275 -0
- package/src/utils/logger.ts +201 -0
- package/src/utils/memory-profiler.ts +582 -0
- package/src/utils/parallel-processor.ts +879 -0
- package/src/utils/python.ts +79 -0
- package/src/utils/runtime.ts +616 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Profiler and Leak Detection for tywrap
|
|
3
|
+
* Comprehensive memory monitoring and analysis tools
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { writeFileSync } from 'fs';
|
|
7
|
+
import { getComponentLogger } from './logger.js';
|
|
8
|
+
const log = getComponentLogger('MemoryProfiler');
|
|
9
|
+
export class MemoryProfiler extends EventEmitter {
|
|
10
|
+
snapshots = [];
|
|
11
|
+
operationMetrics = new Map();
|
|
12
|
+
monitoring = false;
|
|
13
|
+
monitoringInterval;
|
|
14
|
+
baselineSnapshot;
|
|
15
|
+
gcCount = 0;
|
|
16
|
+
options;
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
super();
|
|
19
|
+
this.options = {
|
|
20
|
+
snapshotInterval: 5000, // 5 seconds
|
|
21
|
+
maxSnapshots: 100,
|
|
22
|
+
leakThreshold: 1024 * 1024, // 1MB per second
|
|
23
|
+
enableGCTracking: true,
|
|
24
|
+
...options,
|
|
25
|
+
};
|
|
26
|
+
if (this.options.enableGCTracking) {
|
|
27
|
+
this.setupGCTracking();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
logInfo(message) {
|
|
31
|
+
process.stdout.write(`${message}\n`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Start memory monitoring
|
|
35
|
+
*/
|
|
36
|
+
startMonitoring() {
|
|
37
|
+
if (this.monitoring) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.monitoring = true;
|
|
41
|
+
this.baselineSnapshot = this.takeSnapshot('monitoring_start');
|
|
42
|
+
this.monitoringInterval = setInterval(() => {
|
|
43
|
+
const snapshot = this.takeSnapshot('periodic');
|
|
44
|
+
this.emit('snapshot', snapshot);
|
|
45
|
+
// Check for immediate leak concerns
|
|
46
|
+
const analysis = this.analyzeLeaks();
|
|
47
|
+
if (analysis.detected && analysis.severity === 'critical') {
|
|
48
|
+
this.emit('critical_leak', analysis);
|
|
49
|
+
}
|
|
50
|
+
}, this.options.snapshotInterval);
|
|
51
|
+
this.logInfo('Memory monitoring started');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Stop memory monitoring
|
|
55
|
+
*/
|
|
56
|
+
stopMonitoring() {
|
|
57
|
+
if (!this.monitoring) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.monitoring = false;
|
|
61
|
+
if (this.monitoringInterval) {
|
|
62
|
+
clearInterval(this.monitoringInterval);
|
|
63
|
+
this.monitoringInterval = undefined;
|
|
64
|
+
}
|
|
65
|
+
this.takeSnapshot('monitoring_stop');
|
|
66
|
+
this.emit('monitoring_stopped', this.generateReport());
|
|
67
|
+
this.logInfo('Memory monitoring stopped');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Take a memory snapshot
|
|
71
|
+
*/
|
|
72
|
+
takeSnapshot(operation, metadata) {
|
|
73
|
+
const memUsage = process.memoryUsage();
|
|
74
|
+
const snapshot = {
|
|
75
|
+
timestamp: Date.now(),
|
|
76
|
+
heapUsed: memUsage.heapUsed,
|
|
77
|
+
heapTotal: memUsage.heapTotal,
|
|
78
|
+
external: memUsage.external,
|
|
79
|
+
rss: memUsage.rss,
|
|
80
|
+
arrayBuffers: memUsage.arrayBuffers,
|
|
81
|
+
gcCount: this.gcCount,
|
|
82
|
+
operation,
|
|
83
|
+
metadata,
|
|
84
|
+
};
|
|
85
|
+
this.snapshots.push(snapshot);
|
|
86
|
+
// Keep only recent snapshots
|
|
87
|
+
if (this.snapshots.length > this.options.maxSnapshots) {
|
|
88
|
+
this.snapshots.shift();
|
|
89
|
+
}
|
|
90
|
+
return snapshot;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Profile a specific operation
|
|
94
|
+
*/
|
|
95
|
+
async profileOperation(operationName, operation, metadata) {
|
|
96
|
+
// Force garbage collection if available
|
|
97
|
+
if (global.gc) {
|
|
98
|
+
global.gc();
|
|
99
|
+
await this.sleep(100); // Let GC settle
|
|
100
|
+
}
|
|
101
|
+
const beforeSnapshot = this.takeSnapshot(`${operationName}_start`, metadata);
|
|
102
|
+
const startTime = performance.now();
|
|
103
|
+
try {
|
|
104
|
+
const result = await operation();
|
|
105
|
+
const endTime = performance.now();
|
|
106
|
+
// Force GC again to get accurate measurement
|
|
107
|
+
if (global.gc) {
|
|
108
|
+
global.gc();
|
|
109
|
+
await this.sleep(100);
|
|
110
|
+
}
|
|
111
|
+
const afterSnapshot = this.takeSnapshot(`${operationName}_end`, metadata);
|
|
112
|
+
const memoryDelta = afterSnapshot.heapUsed - beforeSnapshot.heapUsed;
|
|
113
|
+
const duration = endTime - startTime;
|
|
114
|
+
// Update operation metrics
|
|
115
|
+
const existing = this.operationMetrics.get(operationName) ?? {
|
|
116
|
+
count: 0,
|
|
117
|
+
averageMemoryDelta: 0,
|
|
118
|
+
maxMemoryDelta: 0,
|
|
119
|
+
totalMemoryAllocated: 0,
|
|
120
|
+
};
|
|
121
|
+
existing.count++;
|
|
122
|
+
existing.totalMemoryAllocated += Math.max(0, memoryDelta);
|
|
123
|
+
existing.maxMemoryDelta = Math.max(existing.maxMemoryDelta, memoryDelta);
|
|
124
|
+
existing.averageMemoryDelta = existing.totalMemoryAllocated / existing.count;
|
|
125
|
+
this.operationMetrics.set(operationName, existing);
|
|
126
|
+
this.logInfo(`${operationName}: ${duration.toFixed(2)}ms, ${this.formatBytes(memoryDelta)} memory delta`);
|
|
127
|
+
return { result, memoryDelta, duration };
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
this.takeSnapshot(`${operationName}_error`, { ...metadata, error: String(error) });
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Analyze potential memory leaks
|
|
136
|
+
*/
|
|
137
|
+
analyzeLeaks() {
|
|
138
|
+
if (this.snapshots.length < 3) {
|
|
139
|
+
return {
|
|
140
|
+
detected: false,
|
|
141
|
+
severity: 'low',
|
|
142
|
+
growthRate: 0,
|
|
143
|
+
suspiciousOperations: [],
|
|
144
|
+
recommendations: [],
|
|
145
|
+
snapshots: this.snapshots,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const recentSnapshots = this.snapshots.slice(-10); // Last 10 snapshots
|
|
149
|
+
const lastSnapshot = recentSnapshots[recentSnapshots.length - 1];
|
|
150
|
+
const firstSnapshot = recentSnapshots[0];
|
|
151
|
+
if (!lastSnapshot || !firstSnapshot) {
|
|
152
|
+
return {
|
|
153
|
+
detected: false,
|
|
154
|
+
severity: 'low',
|
|
155
|
+
growthRate: 0,
|
|
156
|
+
suspiciousOperations: [],
|
|
157
|
+
recommendations: [],
|
|
158
|
+
snapshots: this.snapshots,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const timeSpan = lastSnapshot.timestamp - firstSnapshot.timestamp;
|
|
162
|
+
if (timeSpan === 0) {
|
|
163
|
+
return {
|
|
164
|
+
detected: false,
|
|
165
|
+
severity: 'low',
|
|
166
|
+
growthRate: 0,
|
|
167
|
+
suspiciousOperations: [],
|
|
168
|
+
recommendations: [],
|
|
169
|
+
snapshots: this.snapshots,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const memoryGrowth = lastSnapshot.heapUsed - firstSnapshot.heapUsed;
|
|
173
|
+
const growthRate = (memoryGrowth / timeSpan) * 1000; // bytes per second
|
|
174
|
+
// Detect leak severity
|
|
175
|
+
let detected = false;
|
|
176
|
+
let severity = 'low';
|
|
177
|
+
if (growthRate > this.options.leakThreshold) {
|
|
178
|
+
detected = true;
|
|
179
|
+
if (growthRate > this.options.leakThreshold * 5) {
|
|
180
|
+
severity = 'critical';
|
|
181
|
+
}
|
|
182
|
+
else if (growthRate > this.options.leakThreshold * 3) {
|
|
183
|
+
severity = 'high';
|
|
184
|
+
}
|
|
185
|
+
else if (growthRate > this.options.leakThreshold * 1.5) {
|
|
186
|
+
severity = 'medium';
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Find suspicious operations
|
|
190
|
+
const suspiciousOperations = this.identifySuspiciousOperations();
|
|
191
|
+
// Generate recommendations
|
|
192
|
+
const recommendations = this.generateRecommendations(growthRate, suspiciousOperations);
|
|
193
|
+
return {
|
|
194
|
+
detected,
|
|
195
|
+
severity,
|
|
196
|
+
growthRate,
|
|
197
|
+
suspiciousOperations,
|
|
198
|
+
recommendations,
|
|
199
|
+
snapshots: recentSnapshots,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Identify operations that may be causing memory leaks
|
|
204
|
+
*/
|
|
205
|
+
identifySuspiciousOperations() {
|
|
206
|
+
const suspicious = [];
|
|
207
|
+
for (const [operation, metrics] of this.operationMetrics) {
|
|
208
|
+
// High average memory usage
|
|
209
|
+
if (metrics.averageMemoryDelta > 10 * 1024 * 1024) {
|
|
210
|
+
// 10MB average
|
|
211
|
+
suspicious.push(`${operation}: High average memory usage (${this.formatBytes(metrics.averageMemoryDelta)})`);
|
|
212
|
+
}
|
|
213
|
+
// Memory growth without proper cleanup
|
|
214
|
+
if (metrics.count > 5 && metrics.averageMemoryDelta > 1024 * 1024) {
|
|
215
|
+
// 1MB average over 5 calls
|
|
216
|
+
suspicious.push(`${operation}: Potential memory accumulation`);
|
|
217
|
+
}
|
|
218
|
+
// Very large single allocation
|
|
219
|
+
if (metrics.maxMemoryDelta > 50 * 1024 * 1024) {
|
|
220
|
+
// 50MB single allocation
|
|
221
|
+
suspicious.push(`${operation}: Very large memory allocation (${this.formatBytes(metrics.maxMemoryDelta)})`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return suspicious;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Generate recommendations based on analysis
|
|
228
|
+
*/
|
|
229
|
+
generateRecommendations(growthRate, suspiciousOperations) {
|
|
230
|
+
const recommendations = [];
|
|
231
|
+
if (growthRate > this.options.leakThreshold) {
|
|
232
|
+
recommendations.push('Memory leak detected - investigate resource cleanup in your code');
|
|
233
|
+
if (suspiciousOperations.length > 0) {
|
|
234
|
+
recommendations.push(`Focus on these operations: ${suspiciousOperations.slice(0, 3).join(', ')}`);
|
|
235
|
+
}
|
|
236
|
+
if (growthRate > this.options.leakThreshold * 5) {
|
|
237
|
+
recommendations.push('CRITICAL: Memory growing very rapidly - immediate action required');
|
|
238
|
+
recommendations.push('Consider restarting the process if growth continues');
|
|
239
|
+
}
|
|
240
|
+
recommendations.push('Enable garbage collection with --expose-gc for better measurements');
|
|
241
|
+
recommendations.push('Review cache expiration policies');
|
|
242
|
+
recommendations.push('Check for retained references to large objects');
|
|
243
|
+
recommendations.push('Monitor subprocess memory usage in Python bridge');
|
|
244
|
+
}
|
|
245
|
+
// General performance recommendations
|
|
246
|
+
if (this.operationMetrics.size > 0) {
|
|
247
|
+
const avgMemoryPerOp = Array.from(this.operationMetrics.values()).reduce((sum, m) => sum + m.averageMemoryDelta, 0) / this.operationMetrics.size;
|
|
248
|
+
if (avgMemoryPerOp > 5 * 1024 * 1024) {
|
|
249
|
+
// 5MB average
|
|
250
|
+
recommendations.push('Consider optimizing data structures for lower memory usage');
|
|
251
|
+
recommendations.push('Implement streaming for large data processing');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return recommendations;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Generate comprehensive memory report
|
|
258
|
+
*/
|
|
259
|
+
generateReport() {
|
|
260
|
+
if (this.snapshots.length === 0) {
|
|
261
|
+
throw new Error('No memory snapshots available for report');
|
|
262
|
+
}
|
|
263
|
+
const firstSnapshot = this.snapshots[0];
|
|
264
|
+
const lastSnapshot = this.snapshots[this.snapshots.length - 1];
|
|
265
|
+
if (!firstSnapshot || !lastSnapshot) {
|
|
266
|
+
throw new Error('Invalid snapshot data for report generation');
|
|
267
|
+
}
|
|
268
|
+
const duration = lastSnapshot.timestamp - firstSnapshot.timestamp;
|
|
269
|
+
const heapValues = this.snapshots.map(s => s.heapUsed);
|
|
270
|
+
const peakMemory = Math.max(...heapValues);
|
|
271
|
+
const averageMemory = heapValues.reduce((sum, val) => sum + val, 0) / heapValues.length;
|
|
272
|
+
const memoryGrowth = lastSnapshot.heapUsed - firstSnapshot.heapUsed;
|
|
273
|
+
// Calculate GC efficiency
|
|
274
|
+
const gcEvents = this.snapshots.filter((s, i) => {
|
|
275
|
+
const prevSnapshot = this.snapshots[i - 1];
|
|
276
|
+
return i > 0 && prevSnapshot && s.gcCount > prevSnapshot.gcCount;
|
|
277
|
+
});
|
|
278
|
+
const gcEfficiency = gcEvents.length > 0
|
|
279
|
+
? gcEvents.reduce((sum, s) => {
|
|
280
|
+
const prev = this.snapshots[this.snapshots.indexOf(s) - 1];
|
|
281
|
+
const memoryReclaimed = prev ? prev.heapUsed - s.heapUsed : 0;
|
|
282
|
+
return sum + Math.max(0, memoryReclaimed);
|
|
283
|
+
}, 0) / gcEvents.length
|
|
284
|
+
: 0;
|
|
285
|
+
const summary = {
|
|
286
|
+
duration,
|
|
287
|
+
totalOperations: Array.from(this.operationMetrics.values()).reduce((sum, m) => sum + m.count, 0),
|
|
288
|
+
peakMemory,
|
|
289
|
+
averageMemory,
|
|
290
|
+
memoryGrowth,
|
|
291
|
+
gcEfficiency,
|
|
292
|
+
};
|
|
293
|
+
const leakAnalysis = this.analyzeLeaks();
|
|
294
|
+
// Generate overall recommendations
|
|
295
|
+
const recommendations = [];
|
|
296
|
+
if (summary.peakMemory > 500 * 1024 * 1024) {
|
|
297
|
+
// 500MB peak
|
|
298
|
+
recommendations.push('High peak memory usage detected - consider memory optimization strategies');
|
|
299
|
+
}
|
|
300
|
+
if (summary.memoryGrowth > 100 * 1024 * 1024) {
|
|
301
|
+
// 100MB growth
|
|
302
|
+
recommendations.push('Significant memory growth over session - review for potential leaks');
|
|
303
|
+
}
|
|
304
|
+
if (summary.gcEfficiency < 1024 * 1024) {
|
|
305
|
+
// Less than 1MB reclaimed per GC
|
|
306
|
+
recommendations.push('Low GC efficiency - may indicate memory fragmentation or retained references');
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
summary,
|
|
310
|
+
leakAnalysis,
|
|
311
|
+
operationMetrics: this.operationMetrics,
|
|
312
|
+
recommendations: [...recommendations, ...leakAnalysis.recommendations],
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Save memory report to file
|
|
317
|
+
*/
|
|
318
|
+
saveReport(filePath) {
|
|
319
|
+
const report = this.generateReport();
|
|
320
|
+
const reportData = {
|
|
321
|
+
timestamp: new Date().toISOString(),
|
|
322
|
+
report,
|
|
323
|
+
snapshots: this.snapshots,
|
|
324
|
+
};
|
|
325
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- caller controls report path
|
|
326
|
+
writeFileSync(filePath, JSON.stringify(reportData, null, 2));
|
|
327
|
+
this.logInfo(`Memory report saved to ${filePath}`);
|
|
328
|
+
return report;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Setup garbage collection tracking
|
|
332
|
+
*/
|
|
333
|
+
setupGCTracking() {
|
|
334
|
+
if (typeof global.gc !== 'function') {
|
|
335
|
+
log.warn('GC tracking unavailable - run with --expose-gc for better memory analysis');
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
// Hook into GC events if available
|
|
339
|
+
try {
|
|
340
|
+
if (process.versions.node >= '14.0.0') {
|
|
341
|
+
const perfHooks = require('perf_hooks');
|
|
342
|
+
const obs = new perfHooks.PerformanceObserver((list) => {
|
|
343
|
+
const entries = list.getEntries();
|
|
344
|
+
entries.forEach(entry => {
|
|
345
|
+
if (entry.entryType === 'gc') {
|
|
346
|
+
this.gcCount++;
|
|
347
|
+
this.emit('gc', {
|
|
348
|
+
type: entry.kind,
|
|
349
|
+
duration: entry.duration,
|
|
350
|
+
timestamp: Date.now(),
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
obs.observe({ entryTypes: ['gc'] });
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
log.warn('Advanced GC tracking unavailable', { error: String(error) });
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Format bytes for human readable output
|
|
364
|
+
*/
|
|
365
|
+
formatBytes(bytes) {
|
|
366
|
+
if (bytes === 0) {
|
|
367
|
+
return '0 B';
|
|
368
|
+
}
|
|
369
|
+
const k = 1024;
|
|
370
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
371
|
+
const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));
|
|
372
|
+
const size = bytes / Math.pow(k, i);
|
|
373
|
+
const sign = bytes < 0 ? '-' : '+';
|
|
374
|
+
const sizeLabel = i === 0 ? sizes[0] : i === 1 ? sizes[1] : i === 2 ? sizes[2] : sizes[3];
|
|
375
|
+
return `${sign}${size.toFixed(1)} ${sizeLabel}`;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Utility sleep function
|
|
379
|
+
*/
|
|
380
|
+
sleep(ms) {
|
|
381
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Clear all collected data
|
|
385
|
+
*/
|
|
386
|
+
clear() {
|
|
387
|
+
this.snapshots.length = 0;
|
|
388
|
+
this.operationMetrics.clear();
|
|
389
|
+
this.gcCount = 0;
|
|
390
|
+
this.baselineSnapshot = undefined;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Get current memory usage
|
|
394
|
+
*/
|
|
395
|
+
getCurrentMemoryUsage() {
|
|
396
|
+
return this.takeSnapshot('current');
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Check if profiler has snapshots
|
|
400
|
+
*/
|
|
401
|
+
hasSnapshots() {
|
|
402
|
+
return this.snapshots.length > 0;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Dispose profiler
|
|
406
|
+
*/
|
|
407
|
+
dispose() {
|
|
408
|
+
this.stopMonitoring();
|
|
409
|
+
this.clear();
|
|
410
|
+
this.removeAllListeners();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Export singleton instance for global use
|
|
414
|
+
export const globalMemoryProfiler = new MemoryProfiler();
|
|
415
|
+
// Automatic profiling for process exit
|
|
416
|
+
process.on('exit', () => {
|
|
417
|
+
if (globalMemoryProfiler.hasSnapshots()) {
|
|
418
|
+
try {
|
|
419
|
+
globalMemoryProfiler.saveReport('memory-profile-exit.json');
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
log.error('Failed to save exit memory report', { error: String(error) });
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
//# sourceMappingURL=memory-profiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-profiler.js","sourceRoot":"","sources":["../../src/utils/memory-profiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Processing System for tywrap
|
|
3
|
+
* High-performance parallel processing for large Python codebases
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import type { AnalysisResult, PythonModule, GeneratedCode } from '../types/index.js';
|
|
7
|
+
export interface ParallelTask<Data = unknown> {
|
|
8
|
+
id: string;
|
|
9
|
+
type: 'analyze' | 'generate' | 'validate' | 'custom';
|
|
10
|
+
data: Data;
|
|
11
|
+
options?: Record<string, unknown>;
|
|
12
|
+
priority?: number;
|
|
13
|
+
timeout?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ParallelResult<T = unknown> {
|
|
16
|
+
taskId: string;
|
|
17
|
+
success: boolean;
|
|
18
|
+
result?: T;
|
|
19
|
+
error?: string;
|
|
20
|
+
duration: number;
|
|
21
|
+
memoryUsage?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface WorkerStats {
|
|
24
|
+
workerId: string;
|
|
25
|
+
tasksCompleted: number;
|
|
26
|
+
totalTime: number;
|
|
27
|
+
averageTime: number;
|
|
28
|
+
errorCount: number;
|
|
29
|
+
memoryPeak: number;
|
|
30
|
+
isActive: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface ParallelProcessorOptions {
|
|
33
|
+
maxWorkers?: number;
|
|
34
|
+
taskTimeout?: number;
|
|
35
|
+
retryAttempts?: number;
|
|
36
|
+
enableMemoryMonitoring?: boolean;
|
|
37
|
+
enableCaching?: boolean;
|
|
38
|
+
workerScript?: string;
|
|
39
|
+
batchSize?: number;
|
|
40
|
+
loadBalancing?: 'round-robin' | 'least-loaded' | 'weighted';
|
|
41
|
+
debug?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface ParallelProcessorStats {
|
|
44
|
+
activeWorkers: number;
|
|
45
|
+
totalWorkers: number;
|
|
46
|
+
tasksCompleted: number;
|
|
47
|
+
totalErrors: number;
|
|
48
|
+
averageTaskTime: number;
|
|
49
|
+
queueLength: number;
|
|
50
|
+
activeTasks: number;
|
|
51
|
+
workerStats: WorkerStats[];
|
|
52
|
+
}
|
|
53
|
+
export declare class ParallelProcessor extends EventEmitter {
|
|
54
|
+
private workers;
|
|
55
|
+
private workerStats;
|
|
56
|
+
private taskQueue;
|
|
57
|
+
private activeTasks;
|
|
58
|
+
private pendingResults;
|
|
59
|
+
private roundRobinIndex;
|
|
60
|
+
private options;
|
|
61
|
+
private disposed;
|
|
62
|
+
private debug;
|
|
63
|
+
constructor(options?: ParallelProcessorOptions);
|
|
64
|
+
private debugLog;
|
|
65
|
+
/**
|
|
66
|
+
* Initialize worker pool
|
|
67
|
+
*/
|
|
68
|
+
init(): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Process Python module analysis in parallel
|
|
71
|
+
*/
|
|
72
|
+
analyzeModulesParallel(sources: Array<{
|
|
73
|
+
name: string;
|
|
74
|
+
content: string;
|
|
75
|
+
path?: string;
|
|
76
|
+
}>, options?: {
|
|
77
|
+
chunkSize?: number;
|
|
78
|
+
}): Promise<Array<ParallelResult<AnalysisResult>>>;
|
|
79
|
+
/**
|
|
80
|
+
* Generate TypeScript wrappers in parallel
|
|
81
|
+
*/
|
|
82
|
+
generateWrappersParallel(modules: Array<{
|
|
83
|
+
name: string;
|
|
84
|
+
module: PythonModule;
|
|
85
|
+
options?: Record<string, unknown>;
|
|
86
|
+
}>, options?: {
|
|
87
|
+
chunkSize?: number;
|
|
88
|
+
}): Promise<Array<ParallelResult<GeneratedCode>>>;
|
|
89
|
+
/**
|
|
90
|
+
* Execute tasks in parallel with load balancing
|
|
91
|
+
*/
|
|
92
|
+
executeTasks<Data, Result>(tasks: ParallelTask<Data>[]): Promise<Array<ParallelResult<Result>>>;
|
|
93
|
+
/**
|
|
94
|
+
* Execute single task
|
|
95
|
+
*/
|
|
96
|
+
private executeTask;
|
|
97
|
+
/**
|
|
98
|
+
* Select optimal worker using load balancing strategy
|
|
99
|
+
*/
|
|
100
|
+
private selectOptimalWorker;
|
|
101
|
+
/**
|
|
102
|
+
* Send task to specific worker
|
|
103
|
+
*/
|
|
104
|
+
private sendTaskToWorker;
|
|
105
|
+
/**
|
|
106
|
+
* Spawn new worker
|
|
107
|
+
*/
|
|
108
|
+
private spawnWorker;
|
|
109
|
+
/**
|
|
110
|
+
* Handle message from worker
|
|
111
|
+
*/
|
|
112
|
+
private handleWorkerMessage;
|
|
113
|
+
/**
|
|
114
|
+
* Handle worker error
|
|
115
|
+
*/
|
|
116
|
+
private handleWorkerError;
|
|
117
|
+
/**
|
|
118
|
+
* Handle worker exit
|
|
119
|
+
*/
|
|
120
|
+
private handleWorkerExit;
|
|
121
|
+
/**
|
|
122
|
+
* Process task queue
|
|
123
|
+
*/
|
|
124
|
+
private processQueue;
|
|
125
|
+
/**
|
|
126
|
+
* Get worker statistics
|
|
127
|
+
*/
|
|
128
|
+
getWorkerStats(): WorkerStats[];
|
|
129
|
+
/**
|
|
130
|
+
* Get overall processing statistics
|
|
131
|
+
*/
|
|
132
|
+
getStats(): ParallelProcessorStats;
|
|
133
|
+
/**
|
|
134
|
+
* Utility methods
|
|
135
|
+
*/
|
|
136
|
+
private chunkArray;
|
|
137
|
+
private getWorkerId;
|
|
138
|
+
private sleep;
|
|
139
|
+
/**
|
|
140
|
+
* Gracefully dispose all workers
|
|
141
|
+
*/
|
|
142
|
+
dispose(): Promise<void>;
|
|
143
|
+
setDebug(debug: boolean): void;
|
|
144
|
+
}
|
|
145
|
+
export declare const globalParallelProcessor: ParallelProcessor;
|
|
146
|
+
//# sourceMappingURL=parallel-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-processor.d.ts","sourceRoot":"","sources":["../../src/utils/parallel-processor.ts"],"names":[],"mappings":"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"}
|