parseTraceFile function
Implementation
Future<Map<String, Object>?> parseTraceFile(String path) async {
return await Isolate.run(() {
final file = File(path);
if (!file.existsSync()) return null;
String content;
if (path.endsWith('.gz')) {
final bytes = file.readAsBytesSync();
// dart:io gzip decoder
final decompressed = gzip.decode(bytes);
content = utf8.decode(decompressed);
} else {
content = file.readAsStringSync();
}
final jsonList = jsonDecode(content) as List<dynamic>;
final events = jsonList
.map((e) => TraceEvent.fromJson(e as Map<String, dynamic>))
.toList();
int baseTime = 0;
if (events.isNotEmpty) {
baseTime = events.map((e) => e.timestamp).reduce(min);
for (var i = 0; i < events.length; i++) {
final ev = events[i];
events[i] = TraceEvent(
name: ev.name,
phase: ev.phase,
category: ev.category,
timestamp: ev.timestamp - baseTime,
tid: ev.tid,
args: ev.args,
);
}
}
final computedSpans = computeSpans(events);
if (computedSpans.isEmpty) return null;
computedSpans.sort((a, b) => a.startUs.compareTo(b.startUs));
final mMinTs = computedSpans.map((s) => s.startUs).reduce(min);
final mMaxTs = computedSpans.map((s) => s.endUs).reduce(max);
return {
'spans': computedSpans,
'minTs': mMinTs,
'maxTs': mMaxTs,
'baseTime': baseTime,
};
});
}