blob: d7c741296acf7e7f02afad0748afa29d794c92fb [file] [log] [blame]
// Copyright (c) 2025, 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 'package:dwds/src/connections/app_connection.dart';
import 'package:dwds/src/debugging/inspector.dart';
import 'package:dwds/src/debugging/libraries.dart';
import 'package:dwds/src/services/web_socket_proxy_service.dart';
import 'package:dwds/src/utilities/shared.dart';
import 'package:vm_service/vm_service.dart';
/// Provides information about the currently loaded program.
class WebSocketAppInspector extends AppInspector {
WebSocketAppInspector._(
super.appConnection,
super.isolate,
super.root,
this._service,
);
static Future<WebSocketAppInspector> create(
WebSocketProxyService service,
AppConnection appConnection,
String root,
) async {
final id = createId();
final time = DateTime.now().millisecondsSinceEpoch;
final name = 'main()';
final isolate = Isolate(
id: id,
number: id,
name: name,
startTime: time,
runnable: true,
pauseOnExit: false,
livePorts: 0,
libraries: [],
breakpoints: [],
isSystemIsolate: false,
isolateFlags: [],
);
final inspector = WebSocketAppInspector._(
appConnection,
isolate,
root,
service,
);
await inspector.initialize();
return inspector;
}
@override
late final libraryHelper = LibraryHelper(this);
final WebSocketProxyService _service;
/// Invokes the `getExtensionRpcs` service extension, which returns the list
/// of registered extensions.
///
/// Combines this with the RPCs registered in the [isolate]. Use this over
/// [Isolate.extensionRPCs] as this computes a live set.
///
/// Updates [Isolate.extensionRPCs] to this set.
@override
Future<Set<String>> getExtensionRpcs() async {
final response = await _service.callServiceExtension('getExtensionRpcs');
final extensionRpcs = (response.json!['rpcs'] as List)
.cast<String>()
.toSet();
isolate.extensionRPCs = List.of(extensionRpcs);
return extensionRpcs;
}
}