| // 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; | |
| } |