parseTraceFile function

Future<Map<String, Object>?> parseTraceFile(
  1. String path
)

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,
    };
  });
}