@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,26 @@
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
+ * @lightSyntaxTransform
9
+ * @format
10
+ */
11
+ /// <reference types="node" />
12
+ declare type ReadFileOptions = {
13
+ startSignature?: string;
14
+ endSignature?: string;
15
+ inclusive?: boolean;
16
+ };
17
+ declare type NodeFSError = NodeJS.ErrnoException | null;
18
+ declare class StringLoader {
19
+ processErrorIfNotNull(err: NodeFSError): void;
20
+ readFile(file: string, options?: ReadFileOptions): Promise<string>;
21
+ readFileAndExcludeTypedArray(file: string, fieldsToIgnore: string[]): Promise<string>;
22
+ readFileAndExtractTypedArray(file: string, field: string): Promise<Uint32Array>;
23
+ }
24
+ declare const _default: StringLoader;
25
+ export default _default;
26
+ //# sourceMappingURL=StringLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringLoader.d.ts","sourceRoot":"","sources":["../../src/lib/StringLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;;AAYH,aAAK,eAAe,GAAG;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,aAAK,WAAW,GAAG,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;AAIhD,cAAM,YAAY;IAChB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAY7C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAkFtE,4BAA4B,CAC1B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC;IA8FlB,4BAA4B,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC;CAmHxB;;AAED,wBAAkC"}
@@ -0,0 +1,290 @@
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
+ * @lightSyntaxTransform
9
+ * @format
10
+ */
11
+ 'use strict';
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ const Console_1 = __importDefault(require("./Console"));
17
+ const fs_1 = __importDefault(require("fs"));
18
+ const nums = Object.create(null);
19
+ for (let i = 0; i < 10; i++) {
20
+ nums[`${i}`] = i;
21
+ }
22
+ const EMPTY_UINT32_ARRAY = new Uint32Array(0);
23
+ class StringLoader {
24
+ processErrorIfNotNull(err) {
25
+ if (!err) {
26
+ return;
27
+ }
28
+ Console_1.default.error(err.message);
29
+ throw err;
30
+ }
31
+ // This API reads specified file one chunk at a time,
32
+ // identifies and returns the content that:
33
+ // 1) starts with options.startSignature
34
+ // 2) ends with options.endSignature
35
+ readFile(file, options = {}) {
36
+ const _buffer = Buffer.alloc(1024 * 1024); // 1MB
37
+ const _fd = fs_1.default.openSync(file, 'r');
38
+ const _startSig = options.startSignature;
39
+ const _endSig = options.endSignature;
40
+ const _errHandler = this.processErrorIfNotNull;
41
+ const inclusive = !!options.inclusive;
42
+ let _resolve;
43
+ let _result = '';
44
+ let _begin = false;
45
+ let _end = false;
46
+ let _pos = 0;
47
+ const readCallback = function (err, bytes) {
48
+ _errHandler(err);
49
+ const str = _buffer.slice(0, bytes).toString('UTF-8');
50
+ if (!_begin && !_startSig) {
51
+ // start reserving content if no start signature is specified
52
+ _begin = true;
53
+ }
54
+ _result += str;
55
+ // look for start signature
56
+ if (!_begin && _startSig != null) {
57
+ const idx = _result.indexOf(_startSig);
58
+ if (idx >= 0) {
59
+ _begin = true;
60
+ _result = _result.substring(idx + _startSig.length);
61
+ }
62
+ else if (_result.length > _startSig.length) {
63
+ _result = _result.substring(_result.length - _startSig.length);
64
+ }
65
+ }
66
+ // look for end signature
67
+ if (_begin && _endSig) {
68
+ let searchIdx = Math.max(0, _result.length - str.length - _endSig.length);
69
+ if (_startSig && searchIdx < _startSig.length) {
70
+ searchIdx = _startSig.length;
71
+ }
72
+ const idx = _result.indexOf(_endSig, searchIdx);
73
+ if (idx >= 0) {
74
+ _result = _result.substring(0, idx);
75
+ _end = true;
76
+ }
77
+ }
78
+ if (_end || bytes < _buffer.length) {
79
+ if (!_begin) {
80
+ _result = '';
81
+ }
82
+ if (inclusive && _startSig) {
83
+ _result = _startSig + _result;
84
+ }
85
+ if (inclusive && _endSig && _end) {
86
+ _result += _endSig;
87
+ }
88
+ _resolve(_result);
89
+ fs_1.default.close(_fd, _errHandler);
90
+ }
91
+ else {
92
+ _pos += bytes;
93
+ fs_1.default.read(_fd, _buffer, 0, _buffer.length, _pos, readCallback);
94
+ }
95
+ };
96
+ fs_1.default.read(_fd, _buffer, 0, _buffer.length, _pos, readCallback);
97
+ return new Promise(r => {
98
+ _resolve = r;
99
+ });
100
+ }
101
+ // This API reads the file one chunk at a time,
102
+ // excludes a JSON field that looks like "${fieldsToIgnore}: []"
103
+ // and returns the rest of the file content.
104
+ readFileAndExcludeTypedArray(file, fieldsToIgnore) {
105
+ const _buffer = Buffer.alloc(1024 * 4 * 1024); // 4MB
106
+ const _fd = fs_1.default.openSync(file, 'r');
107
+ const _errHandler = this.processErrorIfNotNull;
108
+ fieldsToIgnore = fieldsToIgnore.map(field => `"${field}":`);
109
+ const _fieldToIgnoreMaxLength = fieldsToIgnore.reduce((max, field) => (max < field.length ? field.length : max), Infinity);
110
+ let _resolve;
111
+ let _result = '';
112
+ let _curFieldToIgnore = null;
113
+ let _pos = 0;
114
+ const readCallback = function (err, bytes) {
115
+ _errHandler(err);
116
+ let str = _buffer.slice(0, bytes).toString('UTF-8');
117
+ // look for end of field
118
+ if (_curFieldToIgnore) {
119
+ const endIdx = str.indexOf(']');
120
+ if (endIdx >= 0) {
121
+ str = str.substring(endIdx - 1);
122
+ _curFieldToIgnore = null;
123
+ }
124
+ else {
125
+ str = '';
126
+ }
127
+ }
128
+ _result += str;
129
+ let searchIdx = -1;
130
+ // look for start of ignored fields
131
+ while (!_curFieldToIgnore && fieldsToIgnore.length > 0) {
132
+ if (searchIdx < 0) {
133
+ searchIdx = _result.length - str.length - _fieldToIgnoreMaxLength;
134
+ searchIdx = Math.max(0, searchIdx);
135
+ }
136
+ const idxs = fieldsToIgnore.map(field => _result.indexOf(field, searchIdx));
137
+ let curMinIndex = Infinity;
138
+ for (let i = 0; i < idxs.length; ++i) {
139
+ if (idxs[i] >= 0 && curMinIndex > idxs[i]) {
140
+ curMinIndex = idxs[i];
141
+ _curFieldToIgnore = fieldsToIgnore[i];
142
+ }
143
+ }
144
+ // if no ignore fields found
145
+ if (!_curFieldToIgnore) {
146
+ break;
147
+ }
148
+ // search for end of the field
149
+ const endIdx = _result.indexOf(']', curMinIndex);
150
+ if (endIdx >= 0) {
151
+ const endOfPrefix = curMinIndex + _curFieldToIgnore.length;
152
+ const prefix = _result.substring(0, endOfPrefix);
153
+ const suffix = _result.substring(endIdx);
154
+ _result = prefix + '[' + suffix;
155
+ searchIdx = endOfPrefix + 2;
156
+ _curFieldToIgnore = null;
157
+ }
158
+ else {
159
+ _result =
160
+ _result.substring(0, curMinIndex + _curFieldToIgnore.length) + '[';
161
+ break;
162
+ }
163
+ }
164
+ if (bytes < _buffer.length) {
165
+ _resolve(_result);
166
+ fs_1.default.close(_fd, _errHandler);
167
+ }
168
+ else {
169
+ _pos += bytes;
170
+ fs_1.default.read(_fd, _buffer, 0, _buffer.length, _pos, readCallback);
171
+ }
172
+ };
173
+ // continue reading the next chunk of data
174
+ fs_1.default.read(_fd, _buffer, 0, _buffer.length, _pos, readCallback);
175
+ return new Promise(r => {
176
+ _resolve = r;
177
+ });
178
+ }
179
+ // This API reads the file one chunk at a time,
180
+ // only extracts a JSON field that looks like ${fieldsToIgnore}: [],
181
+ // converts/returns that field into a typed array.
182
+ readFileAndExtractTypedArray(file, field) {
183
+ const _buffer = Buffer.alloc(16 * 1024 * 1024); // 16MB
184
+ const _fd = fs_1.default.openSync(file, 'r');
185
+ const _errHandler = this.processErrorIfNotNull;
186
+ const _startSig = `"${field}":`;
187
+ const _resultBufSize = 32 * 1024 * 1024;
188
+ const _resultBufs = [new Uint32Array(_resultBufSize)];
189
+ let _i = 0;
190
+ let _j = 0;
191
+ const addToBuffer = (num) => {
192
+ if (_j >= _resultBufs[_i].length) {
193
+ _resultBufs.push(new Uint32Array(_resultBufSize));
194
+ ++_i;
195
+ _j = 0;
196
+ }
197
+ _resultBufs[_i][_j++] = num;
198
+ };
199
+ const consolicateBuffer = () => {
200
+ let n = 0;
201
+ for (let i = 0; i <= _i; ++i) {
202
+ n += i < _i ? _resultBufs[i].length : _j;
203
+ }
204
+ const ret = new Uint32Array(n);
205
+ let k = 0;
206
+ for (let i = 0; i <= _i; ++i) {
207
+ const buf = _resultBufs[i];
208
+ const l = i < _i ? buf.length : _j;
209
+ for (let j = 0; j < l; ++j) {
210
+ ret[k++] = buf[j];
211
+ }
212
+ _resultBufs[i] = EMPTY_UINT32_ARRAY;
213
+ }
214
+ return ret;
215
+ };
216
+ let _strBuf = '';
217
+ let _pos = 0;
218
+ let _begin = false;
219
+ let _end = false;
220
+ let _resolve;
221
+ const readCallback = function (err, bytes) {
222
+ _errHandler(err);
223
+ const buf = bytes === _buffer.byteLength ? _buffer : _buffer.slice(0, bytes);
224
+ const str = buf.toString('UTF-8');
225
+ _strBuf += str;
226
+ // look for start signature
227
+ if (!_begin) {
228
+ const idx = _strBuf.indexOf(_startSig);
229
+ if (idx >= 0) {
230
+ _begin = true;
231
+ _strBuf = _strBuf.substring(idx + _startSig.length);
232
+ }
233
+ else if (_strBuf.length > _startSig.length) {
234
+ _strBuf = _strBuf.substring(_strBuf.length - _startSig.length);
235
+ }
236
+ }
237
+ // start converting to typed array and look for end of field
238
+ if (_begin) {
239
+ let idx = -1;
240
+ let num = 0;
241
+ let beginParseNum = false;
242
+ // eslint-disable-next-line no-constant-condition
243
+ while (true) {
244
+ if (++idx >= _strBuf.length) {
245
+ // rollback the parsing of the last number
246
+ _strBuf = _strBuf.substring(_strBuf.lastIndexOf(',') + 1);
247
+ break;
248
+ }
249
+ const char = _strBuf[idx];
250
+ if (char === '[' || char === ' ' || char === '\n') {
251
+ continue;
252
+ }
253
+ if (char === ']') {
254
+ if (beginParseNum) {
255
+ addToBuffer(num);
256
+ }
257
+ _end = true;
258
+ break;
259
+ }
260
+ else if (char === ',') {
261
+ if (beginParseNum) {
262
+ addToBuffer(num);
263
+ }
264
+ beginParseNum = false;
265
+ num = 0;
266
+ }
267
+ else if ('0' <= char && char <= '9') {
268
+ beginParseNum = true;
269
+ num = 10 * num + nums[char];
270
+ }
271
+ }
272
+ }
273
+ if (_end || bytes < _buffer.length) {
274
+ // consolicate the buffers
275
+ _resolve(consolicateBuffer());
276
+ fs_1.default.close(_fd, _errHandler);
277
+ }
278
+ else {
279
+ _pos += bytes;
280
+ fs_1.default.read(_fd, _buffer, 0, _buffer.length, _pos, readCallback);
281
+ }
282
+ };
283
+ // continue reading the next chunk of data
284
+ fs_1.default.read(_fd, _buffer, 0, _buffer.length, _pos, readCallback);
285
+ return new Promise(r => {
286
+ _resolve = r;
287
+ });
288
+ }
289
+ }
290
+ exports.default = new StringLoader();