// Copyright (c) 2019, 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 'package:dwds/src/services/app_debug_services.dart'; import 'package:dwds/src/services/chrome/chrome_proxy_service.dart'; import 'package:vm_service/vm_service.dart'; /// A debug connection between the application in the browser and DWDS. /// /// Supports debugging your running application through the Dart VM Service /// Protocol. class DebugConnection { final AppDebugServices _appDebugServices; final _onDoneCompleter = Completer(); /// Null until [close] is called. /// /// All subsequent calls to [close] will return this future. Future? _closed; DebugConnection(this._appDebugServices) { // Only setup Chrome-specific close handling if we have a ChromeProxyService final proxyService = _appDebugServices.proxyService; if (proxyService is ChromeProxyService) { proxyService.remoteDebugger.onClose.first.then((_) => close()); } } /// The port of the host Dart VM Service. int get port => _appDebugServices.debugService.port; /// The endpoint of the Dart VM Service. String get uri => _appDebugServices.debugService.uri; /// The endpoint of the Dart Development Service (DDS). String? get ddsUri => _appDebugServices.ddsUri?.toString(); /// The endpoint of the Dart DevTools instance. String? get devToolsUri => _appDebugServices.devToolsUri?.toString(); /// The endpoint of the Dart Tooling Daemon (DTD). String? get dtdUri => _appDebugServices.dtdUri?.toString(); /// A client of the Dart VM Service with DWDS specific extensions. VmService get vmService => _appDebugServices.dwdsVmClient.client; Future close() => _closed ??= () async { final proxyService = _appDebugServices.proxyService; if (proxyService is ChromeProxyService) { await proxyService.remoteDebugger.close(); } await _appDebugServices.close(); _onDoneCompleter.complete(); }(); Future get onDone => _onDoneCompleter.future; } /// [ChromeProxyService] of a [DebugConnection] for internal use only. ChromeProxyService fetchChromeProxyService(DebugConnection debugConnection) { final service = debugConnection._appDebugServices.proxyService; if (service is ChromeProxyService) { return service; } throw StateError('ChromeProxyService not available in this debug connection'); }