blob: 0140aec3ba7d67941120a1caf755f481001197a4 [file] [log] [blame] [edit]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:typed_data';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service/vm_service_io.dart';
Future<List<ByteData>> loadFromUri(Uri uri) async {
final Uri wsUri;
if (uri.isScheme("ws")) {
wsUri = uri;
} else {
if (uri.path.isEmpty || uri.path == "/") {
uri = uri.replace(path: "/ws");
} else if (uri.path.endsWith("/")) {
uri = uri.replace(path: "${uri.path}ws");
} else {
uri = uri.replace(path: "${uri.path}/ws");
}
wsUri = uri.replace(scheme: 'ws');
}
final service = await vmServiceConnectUri(wsUri.toString());
try {
final r = await _getHeapsnapshot(service);
return r;
} finally {
await service.dispose();
}
}
Future<List<ByteData>> _getHeapsnapshot(VmService service) async {
final vm = await service.getVM();
final vmIsolates = vm.isolates!;
if (vmIsolates.isEmpty) {
throw 'Could not find first isolate (expected it to be running already)';
}
final isolateRef = vmIsolates.first;
await service.streamListen(EventStreams.kHeapSnapshot);
final chunks = <ByteData>[];
final done = Completer();
late StreamSubscription streamSubscription;
streamSubscription = service.onHeapSnapshotEvent.listen((e) async {
chunks.add(e.data!);
if (e.last!) {
await service.streamCancel(EventStreams.kHeapSnapshot);
await streamSubscription.cancel();
done.complete();
}
});
await service.requestHeapSnapshot(isolateRef.id!);
await done.future;
return chunks;
}