| Index: sdk/lib/developer/service.dart
 | 
| diff --git a/sdk/lib/developer/service.dart b/sdk/lib/developer/service.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..2934afe41f09ee5c592eafbc60cee3e87181e8eb
 | 
| --- /dev/null
 | 
| +++ b/sdk/lib/developer/service.dart
 | 
| @@ -0,0 +1,81 @@
 | 
| +// Copyright (c) 2016, 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.
 | 
| +
 | 
| +part of dart.developer;
 | 
| +
 | 
| +/// Information about the service protocol.
 | 
| +class ServiceProtocolInfo {
 | 
| +  /// The major version of the protocol. If the running Dart environment does
 | 
| +  /// not support the service protocol, this is 0.
 | 
| +  final int majorVersion = _getServiceMajorVersion();
 | 
| +  /// The minor version of the protocol. If the running Dart environment does
 | 
| +  /// not support the service protocol, this is 0.
 | 
| +  final int minorVersion = _getServiceMinorVersion();
 | 
| +  /// The Uri to access the service. If the web server is not running, this
 | 
| +  /// will be null.
 | 
| +  final Uri serverUri;
 | 
| +
 | 
| +  ServiceProtocolInfo(this.serverUri);
 | 
| +
 | 
| +  String toString() {
 | 
| +    if (serverUri != null) {
 | 
| +      return 'Dart VM Service Protocol v$majorVersion.$minorVersion '
 | 
| +             'listening on $serverUri';
 | 
| +    } else {
 | 
| +      return 'Dart VM Service Protocol v$majorVersion.$minorVersion';
 | 
| +    }
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +/// Access information about the service protocol and control the web server.
 | 
| +class Service {
 | 
| +  /// Get information about the service protocol.
 | 
| +  static Future<ServiceProtocolInfo> getInfo() async {
 | 
| +    // Port to receive response from service isolate.
 | 
| +    final RawReceivePort receivePort = new RawReceivePort();
 | 
| +    final Completer<Uri> uriCompleter = new Completer<Uri>();
 | 
| +    receivePort.handler = (Uri uri) => uriCompleter.complete(uri);
 | 
| +    // Request the information from the service isolate.
 | 
| +    _getServerInfo(receivePort.sendPort);
 | 
| +    // Await the response from the service isolate.
 | 
| +    Uri uri = await uriCompleter.future;
 | 
| +    // Close the port.
 | 
| +    receivePort.close();
 | 
| +    return new ServiceProtocolInfo(uri);
 | 
| +  }
 | 
| +
 | 
| +  /// Control the web server that the service protocol is accessed through.
 | 
| +  static Future<ServiceProtocolInfo> controlWebServer(
 | 
| +      {bool enable: false}) async {
 | 
| +    if (enable is! bool) {
 | 
| +      throw new ArgumentError.value(enable,
 | 
| +                                    'enable',
 | 
| +                                    'Must be a bool');
 | 
| +    }
 | 
| +    // Port to receive response from service isolate.
 | 
| +    final RawReceivePort receivePort = new RawReceivePort();
 | 
| +    final Completer<Uri> uriCompleter = new Completer<Uri>();
 | 
| +    receivePort.handler = (Uri uri) => uriCompleter.complete(uri);
 | 
| +    // Request the information from the service isolate.
 | 
| +    _webServerControl(receivePort.sendPort, enable);
 | 
| +    // Await the response from the service isolate.
 | 
| +    Uri uri = await uriCompleter.future;
 | 
| +    // Close the port.
 | 
| +    receivePort.close();
 | 
| +    return new ServiceProtocolInfo(uri);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +/// [sp] will receive a Uri or null.
 | 
| +external void _getServerInfo(SendPort sp);
 | 
| +
 | 
| +/// [sp] will receive a Uri or null.
 | 
| +external void _webServerControl(SendPort sp, bool enable);
 | 
| +
 | 
| +/// Returns the major version of the service protocol.
 | 
| +external int _getServiceMajorVersion();
 | 
| +
 | 
| +/// Returns the minor version of the service protocol.
 | 
| +external int _getServiceMinorVersion();
 | 
| +
 | 
| 
 |