@memlab/core 1.0.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.
Files changed (130) hide show
  1. package/README.md +11 -0
  2. package/dist/__tests__/parser/HeapParser.test.d.ts +11 -0
  3. package/dist/__tests__/parser/HeapParser.test.d.ts.map +1 -0
  4. package/dist/__tests__/parser/HeapParser.test.js +54 -0
  5. package/dist/__tests__/parser/NodeHeap.test.d.ts +11 -0
  6. package/dist/__tests__/parser/NodeHeap.test.d.ts.map +1 -0
  7. package/dist/__tests__/parser/NodeHeap.test.js +96 -0
  8. package/dist/__tests__/parser/StringNode.test.d.ts +11 -0
  9. package/dist/__tests__/parser/StringNode.test.d.ts.map +1 -0
  10. package/dist/__tests__/parser/StringNode.test.js +61 -0
  11. package/dist/__tests__/parser/traverse/HeapNodeTraverse.test.d.ts +16 -0
  12. package/dist/__tests__/parser/traverse/HeapNodeTraverse.test.d.ts.map +1 -0
  13. package/dist/__tests__/parser/traverse/HeapNodeTraverse.test.js +140 -0
  14. package/dist/__tests__/utils/utils.test.d.ts +11 -0
  15. package/dist/__tests__/utils/utils.test.d.ts.map +1 -0
  16. package/dist/__tests__/utils/utils.test.js +81 -0
  17. package/dist/index.d.ts +29 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +62 -0
  20. package/dist/lib/BaseOption.d.ts +31 -0
  21. package/dist/lib/BaseOption.d.ts.map +1 -0
  22. package/dist/lib/BaseOption.js +109 -0
  23. package/dist/lib/BrowserInfo.d.ts +33 -0
  24. package/dist/lib/BrowserInfo.d.ts.map +1 -0
  25. package/dist/lib/BrowserInfo.js +117 -0
  26. package/dist/lib/Config.d.ts +203 -0
  27. package/dist/lib/Config.d.ts.map +1 -0
  28. package/dist/lib/Config.js +427 -0
  29. package/dist/lib/Console.d.ts +67 -0
  30. package/dist/lib/Console.d.ts.map +1 -0
  31. package/dist/lib/Console.js +344 -0
  32. package/dist/lib/Constant.d.ts +38 -0
  33. package/dist/lib/Constant.d.ts.map +1 -0
  34. package/dist/lib/Constant.js +58 -0
  35. package/dist/lib/FileManager.d.ts +69 -0
  36. package/dist/lib/FileManager.d.ts.map +1 -0
  37. package/dist/lib/FileManager.js +309 -0
  38. package/dist/lib/HeapAnalyzer.d.ts +51 -0
  39. package/dist/lib/HeapAnalyzer.d.ts.map +1 -0
  40. package/dist/lib/HeapAnalyzer.js +719 -0
  41. package/dist/lib/HeapParser.d.ts +19 -0
  42. package/dist/lib/HeapParser.d.ts.map +1 -0
  43. package/dist/lib/HeapParser.js +128 -0
  44. package/dist/lib/InternalValueSetter.d.ts +14 -0
  45. package/dist/lib/InternalValueSetter.d.ts.map +1 -0
  46. package/dist/lib/InternalValueSetter.js +43 -0
  47. package/dist/lib/NodeHeap.d.ts +16 -0
  48. package/dist/lib/NodeHeap.d.ts.map +1 -0
  49. package/dist/lib/NodeHeap.js +62 -0
  50. package/dist/lib/ProcessManager.d.ts +25 -0
  51. package/dist/lib/ProcessManager.d.ts.map +1 -0
  52. package/dist/lib/ProcessManager.js +67 -0
  53. package/dist/lib/Serializer.d.ts +49 -0
  54. package/dist/lib/Serializer.d.ts.map +1 -0
  55. package/dist/lib/Serializer.js +702 -0
  56. package/dist/lib/StringLoader.d.ts +26 -0
  57. package/dist/lib/StringLoader.d.ts.map +1 -0
  58. package/dist/lib/StringLoader.js +290 -0
  59. package/dist/lib/Types.d.ts +432 -0
  60. package/dist/lib/Types.d.ts.map +1 -0
  61. package/dist/lib/Types.js +11 -0
  62. package/dist/lib/Utils.d.ts +223 -0
  63. package/dist/lib/Utils.d.ts.map +1 -0
  64. package/dist/lib/Utils.js +1736 -0
  65. package/dist/lib/heap-data/HeapEdge.d.ts +27 -0
  66. package/dist/lib/heap-data/HeapEdge.d.ts.map +1 -0
  67. package/dist/lib/heap-data/HeapEdge.js +75 -0
  68. package/dist/lib/heap-data/HeapLocation.d.ts +22 -0
  69. package/dist/lib/heap-data/HeapLocation.d.ts.map +1 -0
  70. package/dist/lib/heap-data/HeapLocation.js +40 -0
  71. package/dist/lib/heap-data/HeapNode.d.ts +55 -0
  72. package/dist/lib/heap-data/HeapNode.d.ts.map +1 -0
  73. package/dist/lib/heap-data/HeapNode.js +344 -0
  74. package/dist/lib/heap-data/HeapSnapshot.d.ts +85 -0
  75. package/dist/lib/heap-data/HeapSnapshot.d.ts.map +1 -0
  76. package/dist/lib/heap-data/HeapSnapshot.js +462 -0
  77. package/dist/lib/heap-data/HeapStringNode.d.ts +18 -0
  78. package/dist/lib/heap-data/HeapStringNode.d.ts.map +1 -0
  79. package/dist/lib/heap-data/HeapStringNode.js +43 -0
  80. package/dist/lib/heap-data/HeapUtils.d.ts +17 -0
  81. package/dist/lib/heap-data/HeapUtils.d.ts.map +1 -0
  82. package/dist/lib/heap-data/HeapUtils.js +25 -0
  83. package/dist/logger/LeakClusterLogger.d.ts +40 -0
  84. package/dist/logger/LeakClusterLogger.d.ts.map +1 -0
  85. package/dist/logger/LeakClusterLogger.js +228 -0
  86. package/dist/logger/LeakTraceDetailsLogger.d.ts +19 -0
  87. package/dist/logger/LeakTraceDetailsLogger.d.ts.map +1 -0
  88. package/dist/logger/LeakTraceDetailsLogger.js +50 -0
  89. package/dist/modes/BaseMode.d.ts +30 -0
  90. package/dist/modes/BaseMode.d.ts.map +1 -0
  91. package/dist/modes/BaseMode.js +95 -0
  92. package/dist/modes/InteractionTestMode.d.ts +23 -0
  93. package/dist/modes/InteractionTestMode.d.ts.map +1 -0
  94. package/dist/modes/InteractionTestMode.js +46 -0
  95. package/dist/modes/MeasureMode.d.ts +23 -0
  96. package/dist/modes/MeasureMode.d.ts.map +1 -0
  97. package/dist/modes/MeasureMode.js +58 -0
  98. package/dist/modes/RunningModes.d.ts +15 -0
  99. package/dist/modes/RunningModes.d.ts.map +1 -0
  100. package/dist/modes/RunningModes.js +40 -0
  101. package/dist/paths/TraceFinder.d.ts +31 -0
  102. package/dist/paths/TraceFinder.d.ts.map +1 -0
  103. package/dist/paths/TraceFinder.js +537 -0
  104. package/dist/trace-cluster/ClusterUtils.d.ts +14 -0
  105. package/dist/trace-cluster/ClusterUtils.d.ts.map +1 -0
  106. package/dist/trace-cluster/ClusterUtils.js +17 -0
  107. package/dist/trace-cluster/ClusterUtilsHelper.d.ts +38 -0
  108. package/dist/trace-cluster/ClusterUtilsHelper.d.ts.map +1 -0
  109. package/dist/trace-cluster/ClusterUtilsHelper.js +373 -0
  110. package/dist/trace-cluster/ClusteringHeuristics.d.ts +22 -0
  111. package/dist/trace-cluster/ClusteringHeuristics.d.ts.map +1 -0
  112. package/dist/trace-cluster/ClusteringHeuristics.js +23 -0
  113. package/dist/trace-cluster/EvalutationMetric.d.ts +22 -0
  114. package/dist/trace-cluster/EvalutationMetric.d.ts.map +1 -0
  115. package/dist/trace-cluster/EvalutationMetric.js +158 -0
  116. package/dist/trace-cluster/TraceBucket.d.ts +36 -0
  117. package/dist/trace-cluster/TraceBucket.d.ts.map +1 -0
  118. package/dist/trace-cluster/TraceBucket.js +238 -0
  119. package/dist/trace-cluster/TraceElement.d.ts +71 -0
  120. package/dist/trace-cluster/TraceElement.d.ts.map +1 -0
  121. package/dist/trace-cluster/TraceElement.js +182 -0
  122. package/dist/trace-cluster/strategies/TraceAsClusterStrategy.d.ts +15 -0
  123. package/dist/trace-cluster/strategies/TraceAsClusterStrategy.d.ts.map +1 -0
  124. package/dist/trace-cluster/strategies/TraceAsClusterStrategy.js +37 -0
  125. package/dist/trace-cluster/strategies/TraceSimilarityStrategy.d.ts +15 -0
  126. package/dist/trace-cluster/strategies/TraceSimilarityStrategy.d.ts.map +1 -0
  127. package/dist/trace-cluster/strategies/TraceSimilarityStrategy.js +60 -0
  128. package/package.json +60 -0
  129. package/static/run-meta.json +10 -0
  130. package/static/visit-order.json +27 -0
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ *
8
+ * @emails oncall+ws_labs
9
+ * @format
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.FileManager = void 0;
16
+ const minimist_1 = __importDefault(require("minimist"));
17
+ const fs_extra_1 = __importDefault(require("fs-extra"));
18
+ const os_1 = __importDefault(require("os"));
19
+ const path_1 = __importDefault(require("path"));
20
+ const Console_1 = __importDefault(require("./Console"));
21
+ const Constant_1 = __importDefault(require("./Constant"));
22
+ const Utils_1 = __importDefault(require("./Utils"));
23
+ function joinAndProcessDir(options, ...args) {
24
+ const filepath = path_1.default.join(...args);
25
+ if (!fs_extra_1.default.existsSync(filepath)) {
26
+ try {
27
+ fs_extra_1.default.mkdirSync(filepath);
28
+ }
29
+ catch (ex) {
30
+ const err = Utils_1.default.getError(ex);
31
+ if (!err.message.includes('already exists')) {
32
+ Utils_1.default.haltOrThrow(err);
33
+ }
34
+ }
35
+ }
36
+ return filepath;
37
+ }
38
+ class FileManager {
39
+ getDefaultWorkDir() {
40
+ return path_1.default.join(this.getTmpDir(), 'memlab');
41
+ }
42
+ generateTmpHeapDir() {
43
+ const dirPath = path_1.default.join(this.getTmpDir(), Utils_1.default.getUniqueID());
44
+ fs_extra_1.default.mkdirSync(dirPath);
45
+ return dirPath;
46
+ }
47
+ getWorkDir(options = {}) {
48
+ // workDir options supercedes all the other options
49
+ if (options.workDir) {
50
+ return path_1.default.resolve(options.workDir);
51
+ }
52
+ // transcient options supercedes other the CLI options
53
+ if (options.transcient) {
54
+ const idx = ++FileManager.transcientInstanceIdx;
55
+ const instanceId = `${process.pid}-${Date.now()}-${idx}`;
56
+ const workDir = path_1.default.join(this.getTmpDir(), `memlab-${instanceId}`);
57
+ return path_1.default.resolve(workDir);
58
+ }
59
+ // workDir from the CLI options
60
+ const argv = (0, minimist_1.default)(process.argv.slice(2));
61
+ const workDir = argv['work-dir'] || this.getDefaultWorkDir();
62
+ return path_1.default.resolve(workDir);
63
+ }
64
+ getChromeBinaryZipFile() {
65
+ return path_1.default.join(this.getDefaultWorkDir(), 'chrome.tar.gz');
66
+ }
67
+ getChromeBinaryTimeStampFile() {
68
+ return path_1.default.join(this.getChromeBinaryDir(), 'memlab-success');
69
+ }
70
+ getChromeBinaryDir() {
71
+ return path_1.default.join(this.getDefaultWorkDir(), 'chrome');
72
+ }
73
+ clearUserDataDir(options) {
74
+ const userDataDir = this.getUserDataDir(options);
75
+ this.rmDir(userDataDir);
76
+ }
77
+ getDataBaseDir(options) {
78
+ return path_1.default.join(this.getWorkDir(options), 'data');
79
+ }
80
+ getCodeDataDir() {
81
+ return path_1.default.join(this.getCoreProjectBaseDir(), 'static');
82
+ }
83
+ getClusterSampleDataDir() {
84
+ return path_1.default.join(this.getCodeDataDir(), 'cluster');
85
+ }
86
+ getUserDataDir(options) {
87
+ return path_1.default.join(this.getDataBaseDir(options), 'profile');
88
+ }
89
+ getCurDataDir(options) {
90
+ return path_1.default.join(this.getDataBaseDir(options), 'cur');
91
+ }
92
+ getPersistDataDir(options) {
93
+ return path_1.default.join(this.getDataBaseDir(options), 'persist');
94
+ }
95
+ getLoggerOutDir(options = {}) {
96
+ return path_1.default.join(this.getDataBaseDir(options), 'logger');
97
+ }
98
+ // all trace clusters generated from the current run
99
+ getTraceClustersDir(options = {}) {
100
+ return path_1.default.join(this.getLoggerOutDir(options), 'trace-clusters');
101
+ }
102
+ // stores JSON file (with heap object and reference details for visualization)
103
+ // of all trace clusters (each cluster has a representative trace)
104
+ getTraceJSONDir(options = {}) {
105
+ return path_1.default.join(this.getLoggerOutDir(options), 'trace-jsons');
106
+ }
107
+ getUnclassifiedTraceClusterDir(options = {}) {
108
+ return path_1.default.join(this.getLoggerOutDir(options), 'unclassified-clusters');
109
+ }
110
+ getUniqueTraceClusterDir(options = {}) {
111
+ return path_1.default.join(this.getLoggerOutDir(options), 'unique-trace-clusters');
112
+ }
113
+ getNewUniqueTraceClusterDir(options = {}) {
114
+ return path_1.default.join(this.getUniqueTraceClusterDir(options), 'add');
115
+ }
116
+ getStaleUniqueTraceClusterDir(options = {}) {
117
+ return path_1.default.join(this.getUniqueTraceClusterDir(options), 'delete');
118
+ }
119
+ getAllClusterSummaryFile(options = {}) {
120
+ return path_1.default.join(this.getUniqueTraceClusterDir(options), 'unique-clusters-summary.txt');
121
+ }
122
+ getExistingUniqueTraceClusterDir(options = {}) {
123
+ return path_1.default.join(this.getUniqueTraceClusterDir(options), 'existing');
124
+ }
125
+ getAllFilesInDir(dir) {
126
+ const files = fs_extra_1.default.readdirSync(dir);
127
+ return files.map((file) => path_1.default.join(dir, file));
128
+ }
129
+ getDataOutDir(options = {}) {
130
+ return path_1.default.join(this.getDataBaseDir(options), 'out');
131
+ }
132
+ getCoreProjectBaseDir() {
133
+ return path_1.default.join(__dirname, '..', '..');
134
+ }
135
+ getReportOutDir(options = {}) {
136
+ return path_1.default.join(this.getPersistDataDir(options), 'reports');
137
+ }
138
+ getPreviewReportDir(options = {}) {
139
+ return path_1.default.join(this.getPersistDataDir(options), 'report-preview');
140
+ }
141
+ getLeakSummaryFile(options = {}) {
142
+ return path_1.default.join(this.getDataOutDir(options), 'leaks.txt');
143
+ }
144
+ getInputDataDir() {
145
+ return path_1.default.join(this.getDefaultWorkDir(), 'input');
146
+ }
147
+ getAllFilesInSubDirs(dir) {
148
+ let ret = [];
149
+ if (!fs_extra_1.default.existsSync(dir)) {
150
+ return ret;
151
+ }
152
+ const files = fs_extra_1.default.readdirSync(dir);
153
+ for (const file of files) {
154
+ const p = path_1.default.join(dir, file);
155
+ if (fs_extra_1.default.lstatSync(p).isDirectory()) {
156
+ ret = ret.concat(this.getAllFilesInSubDirs(p));
157
+ }
158
+ else {
159
+ ret.push(p);
160
+ }
161
+ }
162
+ return ret;
163
+ }
164
+ getTmpDir() {
165
+ return os_1.default.tmpdir();
166
+ }
167
+ rmDir(dir) {
168
+ if (fs_extra_1.default.existsSync(dir)) {
169
+ fs_extra_1.default.removeSync(dir);
170
+ }
171
+ }
172
+ getExperimentsDir() {
173
+ return path_1.default.join(this.getTmpDir(), 'memlab-experiments');
174
+ }
175
+ initExperimentDir(experimentId) {
176
+ const expsDir = joinAndProcessDir({}, this.getExperimentsDir());
177
+ const expDir = joinAndProcessDir({}, expsDir, `exp-${experimentId}`);
178
+ const controlWorkDir = joinAndProcessDir({}, expDir, 'control');
179
+ const testWorkDir = joinAndProcessDir({}, expDir, 'test');
180
+ return { controlWorkDir, testWorkDir };
181
+ }
182
+ getAndInitTSCompileIntermediateDir() {
183
+ const dir = path_1.default.join(this.getTmpDir(), 'memlab-code');
184
+ this.rmDir(dir);
185
+ fs_extra_1.default.mkdirSync(dir);
186
+ return dir;
187
+ }
188
+ clearDataDirs(options = {}) {
189
+ const curDataDir = this.getCurDataDir(options);
190
+ if (!fs_extra_1.default.existsSync(curDataDir)) {
191
+ return;
192
+ }
193
+ const dataSuffix = ['.heapsnapshot', '.json', '.png'];
194
+ const files = fs_extra_1.default.readdirSync(curDataDir);
195
+ for (const file of files) {
196
+ inner: for (const suffix of dataSuffix) {
197
+ if (file.endsWith(suffix)) {
198
+ const filepath = path_1.default.join(curDataDir, file);
199
+ fs_extra_1.default.unlinkSync(filepath);
200
+ break inner;
201
+ }
202
+ }
203
+ }
204
+ }
205
+ emptyDirIfExists(dir) {
206
+ if (this.isDirectory(dir)) {
207
+ fs_extra_1.default.emptyDirSync(dir);
208
+ }
209
+ }
210
+ emptyTraceLogDataDir(options = {}) {
211
+ // all leak trace clusters
212
+ this.emptyDirIfExists(this.getTraceClustersDir(options));
213
+ // all JSON files for trace visualization
214
+ this.emptyDirIfExists(this.getTraceJSONDir(options));
215
+ // all unclassified clusters
216
+ this.emptyDirIfExists(this.getUnclassifiedTraceClusterDir(options));
217
+ // all unique cluster info
218
+ this.emptyDirIfExists(this.getUniqueTraceClusterDir(options));
219
+ }
220
+ resetBrowserDir() {
221
+ try {
222
+ const browserDir = this.getChromeBinaryDir();
223
+ const browserBinary = this.getChromeBinaryZipFile();
224
+ if (fs_extra_1.default.existsSync(browserBinary)) {
225
+ fs_extra_1.default.unlinkSync(browserBinary);
226
+ }
227
+ this.rmDir(browserDir);
228
+ joinAndProcessDir({}, browserDir);
229
+ }
230
+ catch (e) {
231
+ Console_1.default.error(Utils_1.default.getError(e).message);
232
+ }
233
+ }
234
+ isDirectory(file) {
235
+ const stats = fs_extra_1.default.statSync(file);
236
+ return stats.isDirectory();
237
+ }
238
+ iterateAllFiles(dir, callback) {
239
+ if (!this.isDirectory(dir)) {
240
+ callback(dir);
241
+ return;
242
+ }
243
+ const files = fs_extra_1.default.readdirSync(dir);
244
+ files.forEach((file) => {
245
+ const filepath = path_1.default.join(dir, file);
246
+ this.iterateAllFiles(filepath, callback);
247
+ });
248
+ }
249
+ rmWorkDir(options = {}) {
250
+ try {
251
+ this.rmDir(this.getWorkDir(options));
252
+ }
253
+ catch (e) {
254
+ Console_1.default.error(Utils_1.default.getError(e).message);
255
+ }
256
+ }
257
+ isWithinInternalDirectory(filePath) {
258
+ const sep = path_1.default.sep;
259
+ const internalDir = Constant_1.default.internalDir;
260
+ return filePath.includes(`${sep}${internalDir}${sep}`);
261
+ }
262
+ initDirs(config, options = {}) {
263
+ config.monoRepoDir = Constant_1.default.monoRepoDir;
264
+ // make sure getWorkDir is called first before
265
+ // any other get file or get dir calls
266
+ const workDir = this.getWorkDir(options);
267
+ joinAndProcessDir(options, workDir);
268
+ options = Object.assign(Object.assign({}, options), { workDir });
269
+ config.dataBaseDir = joinAndProcessDir(options, this.getDataBaseDir(options));
270
+ config.browserDir = joinAndProcessDir(options, this.getChromeBinaryDir());
271
+ config.userDataDir = joinAndProcessDir(options, this.getUserDataDir(options));
272
+ const outDir = joinAndProcessDir(options, this.getDataOutDir(options));
273
+ config.curDataDir = joinAndProcessDir(options, this.getCurDataDir(options));
274
+ config.dataBuilderDataDir = joinAndProcessDir(options, config.dataBaseDir, 'dataBuilder');
275
+ config.persistentDataDir = joinAndProcessDir(options, this.getPersistDataDir(options));
276
+ config.consoleLogFile = path_1.default.join(config.curDataDir, 'console-log.txt');
277
+ config.runMetaFile = path_1.default.join(config.curDataDir, 'run-meta.json');
278
+ config.snapshotSequenceFile = path_1.default.join(config.curDataDir, 'snap-seq.json');
279
+ config.browserInfoSummary = path_1.default.join(config.curDataDir, 'browser-info.txt');
280
+ config.exploreResultFile = this.getLeakSummaryFile(options);
281
+ config.singleReportSummary = path_1.default.join(outDir, 'report.txt');
282
+ config.unboundObjectCSV = path_1.default.join(outDir, 'unbound-object.csv');
283
+ config.inputDataDir = joinAndProcessDir(options, this.getInputDataDir());
284
+ config.reportOutDir = joinAndProcessDir(options, this.getReportOutDir(options));
285
+ config.previewReportDir = joinAndProcessDir(options, this.getPreviewReportDir(options));
286
+ config.viewJsonFile = path_1.default.join(config.reportOutDir, 'js', 'gc-path.js');
287
+ config.cookieSettingFile = path_1.default.join(config.persistentDataDir, 'cookie-setting.json');
288
+ config.traceClusterFile = path_1.default.join(config.persistentDataDir, 'trace-cluster.json');
289
+ const loggerOutDir = joinAndProcessDir(options, this.getLoggerOutDir(options));
290
+ // trace cluster meta info
291
+ config.traceClusterOutDir = joinAndProcessDir(options, this.getTraceClustersDir(options));
292
+ // detailed trace json files for visualization
293
+ config.traceJsonOutDir = joinAndProcessDir(options, this.getTraceJSONDir(options));
294
+ config.metricsOutDir = joinAndProcessDir(options, loggerOutDir, 'metrics');
295
+ config.reportScreenshotFile = path_1.default.join(outDir, 'report.png');
296
+ const codeDataDir = this.getCodeDataDir();
297
+ config.externalRunMetaFile = path_1.default.join(codeDataDir, 'run-meta.json');
298
+ config.externalSnapshotVisitOrderFile = path_1.default.join(codeDataDir, 'visit-order.json');
299
+ joinAndProcessDir(options, this.getUniqueTraceClusterDir(options));
300
+ config.newUniqueClusterDir = joinAndProcessDir(options, this.getNewUniqueTraceClusterDir(options));
301
+ config.staleUniqueClusterDir = joinAndProcessDir(options, this.getStaleUniqueTraceClusterDir(options));
302
+ config.currentUniqueClusterDir = joinAndProcessDir(options, this.getExistingUniqueTraceClusterDir(options));
303
+ config.unclassifiedClusterDir = joinAndProcessDir(options, this.getUnclassifiedTraceClusterDir(options));
304
+ config.allClusterSummaryFile = this.getAllClusterSummaryFile(options);
305
+ }
306
+ }
307
+ exports.FileManager = FileManager;
308
+ FileManager.transcientInstanceIdx = 0;
309
+ exports.default = new FileManager();
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @emails oncall+ws_labs
8
+ * @format
9
+ */
10
+ import type { E2EStepInfo, HeapNodeIdSet, IHeapNode, IHeapSnapshot, IMemoryAnalystOptions, IMemoryAnalystSnapshotDiff, LeakTracePathItem, Optional, IOveralLeakInfo, TraceCluster } from './Types';
11
+ import TraceFinder from '../paths/TraceFinder';
12
+ declare class MemoryAnalyst {
13
+ checkLeak(): Promise<void>;
14
+ checkUnbound(options?: IMemoryAnalystOptions): Promise<void>;
15
+ breakDownMemoryByShapes(options?: {
16
+ file?: string;
17
+ }): Promise<void>;
18
+ detectUnboundGrowth(options?: IMemoryAnalystOptions): Promise<void>;
19
+ detectMemoryLeaks(): Promise<void>;
20
+ visualizeMemoryUsage(options?: IMemoryAnalystOptions): void;
21
+ focus(options?: {
22
+ file?: string;
23
+ }): Promise<void>;
24
+ shouldLoadCompleteSnapshot(tabsOrder: E2EStepInfo[], tab: E2EStepInfo): boolean;
25
+ diffSnapshots(loadAll?: boolean): Promise<IMemoryAnalystSnapshotDiff>;
26
+ private calculateRetainedSizes;
27
+ preparePathFinder(snapshot: IHeapSnapshot): TraceFinder;
28
+ private dumpPageInteractionSummary;
29
+ private dumpLeakSummaryToConsole;
30
+ private checkDetachedFiberNode;
31
+ private isTrivialNode;
32
+ private filterLeakedObjects;
33
+ aggregateDominatorMetrics(ids: HeapNodeIdSet, snapshot: IHeapSnapshot, checkNodeCb: (node: IHeapNode) => boolean, nodeMetricsCb: (node: IHeapNode) => number): number;
34
+ private getOverallHeapInfo;
35
+ getRetainedSize(node: IHeapNode): number;
36
+ getOverallLeakInfo(leakedNodeIds: HeapNodeIdSet, snapshot: IHeapSnapshot): Optional<IOveralLeakInfo>;
37
+ private printHeapInfo;
38
+ private breakDownSnapshotByShapes;
39
+ private isTrivialEdgeForBreakDown;
40
+ private breakDownByReferrers;
41
+ searchLeakedTraces(leakedNodeIds: HeapNodeIdSet, snapshot: IHeapSnapshot): Promise<{
42
+ paths: LeakTracePathItem[];
43
+ }>;
44
+ serializeClusterUpdate(clusters: TraceCluster[], options?: {
45
+ reclusterOnly?: boolean;
46
+ }): Promise<void>;
47
+ dumpPathByNodeId(leakedIdSet: HeapNodeIdSet, snapshot: IHeapSnapshot, nodeIdsInSnapshots: Array<HeapNodeIdSet>, id: number, pathLoaderFile: string, summaryFile: string): void;
48
+ }
49
+ declare const _default: MemoryAnalyst;
50
+ export default _default;
51
+ //# sourceMappingURL=HeapAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeapAnalyzer.d.ts","sourceRoot":"","sources":["../../src/lib/HeapAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EAEb,SAAS,EACT,aAAa,EAGb,qBAAqB,EACrB,0BAA0B,EAE1B,iBAAiB,EAEjB,QAAQ,EACR,eAAe,EACf,YAAY,EACb,MAAM,SAAS,CAAC;AAOjB,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAO/C,cAAM,aAAa;IACX,SAAS;IAMT,YAAY,CAAC,OAAO,GAAE,qBAA0B;IAMhD,uBAAuB,CAAC,OAAO,GAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAM;IAgBrD,mBAAmB,CAAC,OAAO,GAAE,qBAA0B;IA8IvD,iBAAiB;IAgBvB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B;IAqDlD,KAAK,CAAC,OAAO,GAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAM;IA0BzC,0BAA0B,CACxB,SAAS,EAAE,WAAW,EAAE,EACxB,GAAG,EAAE,WAAW,GACf,OAAO;IAUJ,aAAa,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA8FzE,OAAO,CAAC,sBAAsB;IAO9B,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW;IAavD,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,wBAAwB;IA6ChC,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,mBAAmB;IA8C3B,yBAAyB,CACvB,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,EACzC,aAAa,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM;IAc5C,OAAO,CAAC,kBAAkB;IA4C1B,eAAe,CAAC,IAAI,EAAE,SAAS;IAI/B,kBAAkB,CAChB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,aAAa,GACtB,QAAQ,CAAC,eAAe,CAAC;IA4B5B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,yBAAyB;IAoEjC,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,oBAAoB;IAoDtB,kBAAkB,CACtB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,aAAa;;;IA4FnB,sBAAsB,CAC1B,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,GAAE;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAM;IAqBzC,gBAAgB,CACd,WAAW,EAAE,aAAa,EAC1B,QAAQ,EAAE,aAAa,EACvB,kBAAkB,EAAE,KAAK,CAAC,aAAa,CAAC,EACxC,EAAE,EAAE,MAAM,EACV,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM;CAsCtB;;AAED,wBAAmC"}