diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json index 8839a05b8d3..e059e45ed0a 100644 --- a/.dart_tool/package_config.json +++ b/.dart_tool/package_config.json @@ -258,6 +258,12 @@ "packageUri": "lib/", "languageVersion": "2.13" }, + { + "name": "dds_service_extensions", + "rootUri": "../pkg/dds_service_extensions", + "packageUri": "lib/", + "languageVersion": "2.13" + }, { "name": "dev_compiler", "rootUri": "../pkg/dev_compiler", diff --git a/.packages b/.packages index f5ea5bc5faa..e8855d6415a 100644 --- a/.packages +++ b/.packages @@ -38,6 +38,7 @@ dart_style:third_party/pkg_tested/dart_style/lib dartdev:pkg/dartdev/lib dartdoc:third_party/pkg/dartdoc/lib dds:pkg/dds/lib +dds_service_extensions:pkg/dds_service_extensions/lib dev_compiler:pkg/dev_compiler/lib devtools_server:third_party/devtools/devtools_server/lib devtools_shared:third_party/devtools/devtools_shared/lib diff --git a/pkg/dds/lib/vm_service_extensions.dart b/pkg/dds/lib/vm_service_extensions.dart index 536fa5768f1..7c9a031c6a4 100644 --- a/pkg/dds/lib/vm_service_extensions.dart +++ b/pkg/dds/lib/vm_service_extensions.dart @@ -2,275 +2,7 @@ // 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:collection'; +@Deprecated("Use 'package:dds_service_extensions' instead") +library vm_service_extensions; -import 'package:async/async.dart'; -import 'package:pedantic/pedantic.dart'; -import 'package:vm_service/src/vm_service.dart'; - -extension DdsExtension on VmService { - static bool _factoriesRegistered = false; - static Version? _ddsVersion; - - /// The [getDartDevelopmentServiceVersion] RPC is used to determine what version of - /// the Dart Development Service Protocol is served by a DDS instance. - /// - /// The result of this call is cached for subsequent invocations. - Future getDartDevelopmentServiceVersion() async { - if (_ddsVersion == null) { - _ddsVersion = await _callHelper( - 'getDartDevelopmentServiceVersion', - ); - } - return _ddsVersion!; - } - - /// The [getCachedCpuSamples] RPC is used to retrieve a cache of CPU samples - /// collected under a [UserTag] with name `userTag`. - Future getCachedCpuSamples( - String isolateId, String userTag) async { - if (!(await _versionCheck(1, 3))) { - throw UnimplementedError('getCachedCpuSamples requires DDS version 1.3'); - } - return _callHelper('getCachedCpuSamples', args: { - 'isolateId': isolateId, - 'userTag': userTag, - }); - } - - /// The [getAvailableCachedCpuSamples] RPC is used to determine which caches of CPU samples - /// are available. Caches are associated with individual [UserTag] names and are specified - /// when DDS is started via the `cachedUserTags` parameter. - Future getAvailableCachedCpuSamples() async { - if (!(await _versionCheck(1, 3))) { - throw UnimplementedError( - 'getAvailableCachedCpuSamples requires DDS version 1.3', - ); - } - return _callHelper( - 'getAvailableCachedCpuSamples', - ); - } - - /// Retrieve the event history for `stream`. - /// - /// If `stream` does not have event history collected, a parameter error is - /// returned. - Future getStreamHistory(String stream) async { - if (!(await _versionCheck(1, 2))) { - throw UnimplementedError('getStreamHistory requires DDS version 1.2'); - } - return _callHelper('getStreamHistory', args: { - 'stream': stream, - }); - } - - /// Returns the stream for a given stream id which includes historical - /// events. - /// - /// If `stream` does not have event history collected, a parameter error is - /// sent over the returned [Stream]. - Stream onEventWithHistory(String stream) { - late StreamController controller; - late StreamQueue streamEvents; - - controller = StreamController(onListen: () async { - streamEvents = StreamQueue(onEvent(stream)); - final history = (await getStreamHistory(stream)).history; - Event? firstStreamEvent; - unawaited(streamEvents.peek.then((e) { - firstStreamEvent = e; - })); - for (final event in history) { - if (firstStreamEvent != null && - event.timestamp! > firstStreamEvent!.timestamp!) { - break; - } - controller.sink.add(event); - } - unawaited(controller.sink.addStream(streamEvents.rest)); - }, onCancel: () { - try { - streamEvents.cancel(); - } on StateError { - // Underlying stream may have already been cancelled. - } - }); - - return controller.stream; - } - - /// Returns a new [Stream] of `Logging` events which outputs - /// historical events before streaming real-time events. - /// - /// Note: unlike [onLoggingEvent], the returned stream is a single - /// subscription stream and a new stream is created for each invocation of - /// this getter. - Stream get onLoggingEventWithHistory => onEventWithHistory('Logging'); - - /// Returns a new [Stream] of `Stdout` events which outputs - /// historical events before streaming real-time events. - /// - /// Note: unlike [onStdoutEvent], the returned stream is a single - /// subscription stream and a new stream is created for each invocation of - /// this getter. - Stream get onStdoutEventWithHistory => onEventWithHistory('Stdout'); - - /// Returns a new [Stream] of `Stderr` events which outputs - /// historical events before streaming real-time events. - /// - /// Note: unlike [onStderrEvent], the returned stream is a single - /// subscription stream and a new stream is created for each invocation of - /// this getter. - Stream get onStderrEventWithHistory => onEventWithHistory('Stderr'); - - /// Returns a new [Stream] of `Extension` events which outputs - /// historical events before streaming real-time events. - /// - /// Note: unlike [onExtensionEvent], the returned stream is a single - /// subscription stream and a new stream is created for each invocation of - /// this getter. - Stream get onExtensionEventWithHistory => - onEventWithHistory('Extension'); - - Future _versionCheck(int major, int minor) async { - if (_ddsVersion == null) { - _ddsVersion = await getDartDevelopmentServiceVersion(); - } - return ((_ddsVersion!.major == major && _ddsVersion!.minor! >= minor) || - (_ddsVersion!.major! > major)); - } - - Future _callHelper(String method, - {String? isolateId, Map args = const {}}) { - if (!_factoriesRegistered) { - _registerFactories(); - } - return callMethod( - method, - args: { - if (isolateId != null) 'isolateId': isolateId, - ...args, - }, - ).then((e) => e as T); - } - - static void _registerFactories() { - addTypeFactory('StreamHistory', StreamHistory.parse); - addTypeFactory( - 'AvailableCachedCpuSamples', - AvailableCachedCpuSamples.parse, - ); - addTypeFactory('CachedCpuSamples', CachedCpuSamples.parse); - _factoriesRegistered = true; - } -} - -/// A collection of historical [Event]s from some stream. -class StreamHistory extends Response { - static StreamHistory? parse(Map? json) => - json == null ? null : StreamHistory._fromJson(json); - - StreamHistory({required List history}) : _history = history; - - StreamHistory._fromJson(Map json) - : _history = json['history'] - .map( - (e) => Event.parse(e), - ) - .toList() - .cast() { - this.json = json; - } - - @override - String get type => 'StreamHistory'; - - /// Historical [Event]s for a stream. - List get history => UnmodifiableListView(_history); - final List _history; -} - -/// An extension of [CpuSamples] which represents a set of cached samples, -/// associated with a particular [UserTag] name. -class CachedCpuSamples extends CpuSamples { - static CachedCpuSamples? parse(Map? json) => - json == null ? null : CachedCpuSamples._fromJson(json); - - CachedCpuSamples({ - required this.userTag, - this.truncated, - required int? samplePeriod, - required int? maxStackDepth, - required int? sampleCount, - required int? timeSpan, - required int? timeOriginMicros, - required int? timeExtentMicros, - required int? pid, - required List? functions, - required List? samples, - }) : super( - samplePeriod: samplePeriod, - maxStackDepth: maxStackDepth, - sampleCount: sampleCount, - timeSpan: timeSpan, - timeOriginMicros: timeOriginMicros, - timeExtentMicros: timeExtentMicros, - pid: pid, - functions: functions, - samples: samples, - ); - - CachedCpuSamples._fromJson(Map json) - : userTag = json['userTag']!, - truncated = json['truncated'], - super( - samplePeriod: json['samplePeriod'] ?? -1, - maxStackDepth: json['maxStackDepth'] ?? -1, - sampleCount: json['sampleCount'] ?? -1, - timeSpan: json['timeSpan'] ?? -1, - timeOriginMicros: json['timeOriginMicros'] ?? -1, - timeExtentMicros: json['timeExtentMicros'] ?? -1, - pid: json['pid'] ?? -1, - functions: List.from( - createServiceObject(json['functions'], const ['ProfileFunction']) - as List? ?? - [], - ), - samples: List.from( - createServiceObject(json['samples'], const ['CpuSample']) - as List? ?? - [], - ), - ); - - @override - String get type => 'CachedCpuSamples'; - - /// The name of the [UserTag] associated with this cache of [CpuSamples]. - final String userTag; - - /// Provided if the CPU sample cache has filled and older samples have been - /// dropped. - final bool? truncated; -} - -/// A collection of [UserTag] names associated with caches of CPU samples. -class AvailableCachedCpuSamples extends Response { - static AvailableCachedCpuSamples? parse(Map? json) => - json == null ? null : AvailableCachedCpuSamples._fromJson(json); - - AvailableCachedCpuSamples({ - required this.cacheNames, - }); - - AvailableCachedCpuSamples._fromJson(Map json) - : cacheNames = List.from(json['cacheNames']); - - @override - String get type => 'AvailableCachedUserTagCpuSamples'; - - /// A [List] of [UserTag] names associated with CPU sample caches. - final List cacheNames; -} +export 'package:dds_service_extensions/dds_service_extensions.dart'; diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml index 39e58b57e5c..92adad137d7 100644 --- a/pkg/dds/pubspec.yaml +++ b/pkg/dds/pubspec.yaml @@ -13,6 +13,7 @@ environment: dependencies: async: ^2.4.1 collection: ^1.15.0 + dds_service_extensions: ^1.3.0 devtools_shared: ^2.3.0 json_rpc_2: ^3.0.0 meta: ^1.1.8 diff --git a/pkg/dds/test/get_cached_cpu_samples_test.dart b/pkg/dds/test/get_cached_cpu_samples_test.dart index ae25095d567..57ce1bcd406 100644 --- a/pkg/dds/test/get_cached_cpu_samples_test.dart +++ b/pkg/dds/test/get_cached_cpu_samples_test.dart @@ -7,7 +7,7 @@ import 'dart:io'; import 'package:dds/dds.dart'; import 'package:dds/src/utils/mutex.dart'; -import 'package:dds/vm_service_extensions.dart'; +import 'package:dds_service_extensions/dds_service_extensions.dart'; import 'package:test/test.dart'; import 'package:vm_service/vm_service.dart'; import 'package:vm_service/vm_service_io.dart'; diff --git a/pkg/dds/test/get_stream_history_test.dart b/pkg/dds/test/get_stream_history_test.dart index 101ae0cd2d4..efdaf2eff16 100644 --- a/pkg/dds/test/get_stream_history_test.dart +++ b/pkg/dds/test/get_stream_history_test.dart @@ -5,7 +5,7 @@ import 'dart:io'; import 'package:dds/dds.dart'; -import 'package:dds/vm_service_extensions.dart'; +import 'package:dds_service_extensions/dds_service_extensions.dart'; import 'package:test/test.dart'; import 'package:vm_service/vm_service_io.dart'; import 'common/test_helper.dart'; diff --git a/pkg/dds/test/on_event_with_history_test.dart b/pkg/dds/test/on_event_with_history_test.dart index 01d2fd39f32..5365b03f6b3 100644 --- a/pkg/dds/test/on_event_with_history_test.dart +++ b/pkg/dds/test/on_event_with_history_test.dart @@ -6,7 +6,7 @@ import 'dart:async'; import 'dart:io'; import 'package:dds/dds.dart'; -import 'package:dds/vm_service_extensions.dart'; +import 'package:dds_service_extensions/dds_service_extensions.dart'; import 'package:test/test.dart'; import 'package:vm_service/vm_service_io.dart'; import 'common/test_helper.dart'; diff --git a/pkg/dds/test/regress_devtools_issue_3302_test.dart b/pkg/dds/test/regress_devtools_issue_3302_test.dart index 8c97a127443..4d9c458eece 100644 --- a/pkg/dds/test/regress_devtools_issue_3302_test.dart +++ b/pkg/dds/test/regress_devtools_issue_3302_test.dart @@ -6,7 +6,7 @@ import 'dart:async'; import 'dart:io'; import 'package:dds/dds.dart'; -import 'package:dds/vm_service_extensions.dart'; +import 'package:dds_service_extensions/dds_service_extensions.dart'; import 'package:test/test.dart'; import 'package:vm_service/vm_service_io.dart'; import 'common/test_helper.dart'; diff --git a/pkg/dds_service_extensions/.gitignore b/pkg/dds_service_extensions/.gitignore new file mode 100644 index 00000000000..65c34dc86e3 --- /dev/null +++ b/pkg/dds_service_extensions/.gitignore @@ -0,0 +1,10 @@ +# Files and directories created by pub. +.dart_tool/ +.packages + +# Conventional directory for build outputs. +build/ + +# Omit committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock diff --git a/pkg/dds_service_extensions/CHANGELOG.md b/pkg/dds_service_extensions/CHANGELOG.md new file mode 100644 index 00000000000..0290ebf79e8 --- /dev/null +++ b/pkg/dds_service_extensions/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.3.0 + +- Moved `package:dds/vm_service_extensions.dart` into a standalone package. diff --git a/pkg/dds_service_extensions/README.md b/pkg/dds_service_extensions/README.md new file mode 100644 index 00000000000..9f50e4f288c --- /dev/null +++ b/pkg/dds_service_extensions/README.md @@ -0,0 +1,3 @@ +A package used to expand the `package:vm_service` interface with support for RPCs added in the [Dart Developer Service (DDS) protocol][dds-protocol]. + +[dds-protocol]: https://github.com/dart-lang/sdk/blob/main/pkg/dds/dds_protocol.md diff --git a/pkg/dds_service_extensions/analysis_options.yaml b/pkg/dds_service_extensions/analysis_options.yaml new file mode 100644 index 00000000000..dee8927aafe --- /dev/null +++ b/pkg/dds_service_extensions/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/pkg/dds_service_extensions/lib/dds_service_extensions.dart b/pkg/dds_service_extensions/lib/dds_service_extensions.dart new file mode 100644 index 00000000000..702cf58b791 --- /dev/null +++ b/pkg/dds_service_extensions/lib/dds_service_extensions.dart @@ -0,0 +1,272 @@ +// Copyright (c) 2020, 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:collection'; + +import 'package:async/async.dart'; +// ignore: implementation_imports +import 'package:vm_service/src/vm_service.dart'; + +extension DdsExtension on VmService { + static bool _factoriesRegistered = false; + static Version? _ddsVersion; + + /// The [getDartDevelopmentServiceVersion] RPC is used to determine what version of + /// the Dart Development Service Protocol is served by a DDS instance. + /// + /// The result of this call is cached for subsequent invocations. + Future getDartDevelopmentServiceVersion() async { + _ddsVersion ??= await _callHelper( + 'getDartDevelopmentServiceVersion', + ); + return _ddsVersion!; + } + + /// The [getCachedCpuSamples] RPC is used to retrieve a cache of CPU samples + /// collected under a [UserTag] with name `userTag`. + Future getCachedCpuSamples( + String isolateId, String userTag) async { + if (!(await _versionCheck(1, 3))) { + throw UnimplementedError('getCachedCpuSamples requires DDS version 1.3'); + } + return _callHelper('getCachedCpuSamples', args: { + 'isolateId': isolateId, + 'userTag': userTag, + }); + } + + /// The [getAvailableCachedCpuSamples] RPC is used to determine which caches of CPU samples + /// are available. Caches are associated with individual [UserTag] names and are specified + /// when DDS is started via the `cachedUserTags` parameter. + Future getAvailableCachedCpuSamples() async { + if (!(await _versionCheck(1, 3))) { + throw UnimplementedError( + 'getAvailableCachedCpuSamples requires DDS version 1.3', + ); + } + return _callHelper( + 'getAvailableCachedCpuSamples', + ); + } + + /// Retrieve the event history for `stream`. + /// + /// If `stream` does not have event history collected, a parameter error is + /// returned. + Future getStreamHistory(String stream) async { + if (!(await _versionCheck(1, 2))) { + throw UnimplementedError('getStreamHistory requires DDS version 1.2'); + } + return _callHelper('getStreamHistory', args: { + 'stream': stream, + }); + } + + /// Returns the stream for a given stream id which includes historical + /// events. + /// + /// If `stream` does not have event history collected, a parameter error is + /// sent over the returned [Stream]. + Stream onEventWithHistory(String stream) { + late StreamController controller; + late StreamQueue streamEvents; + + controller = StreamController(onListen: () async { + streamEvents = StreamQueue(onEvent(stream)); + final history = (await getStreamHistory(stream)).history; + Event? firstStreamEvent; + unawaited(streamEvents.peek.then((e) { + firstStreamEvent = e; + })); + for (final event in history) { + if (firstStreamEvent != null && + event.timestamp! > firstStreamEvent!.timestamp!) { + break; + } + controller.sink.add(event); + } + unawaited(controller.sink.addStream(streamEvents.rest)); + }, onCancel: () { + try { + streamEvents.cancel(); + } on StateError { + // Underlying stream may have already been cancelled. + } + }); + + return controller.stream; + } + + /// Returns a new [Stream] of `Logging` events which outputs + /// historical events before streaming real-time events. + /// + /// Note: unlike [onLoggingEvent], the returned stream is a single + /// subscription stream and a new stream is created for each invocation of + /// this getter. + Stream get onLoggingEventWithHistory => onEventWithHistory('Logging'); + + /// Returns a new [Stream] of `Stdout` events which outputs + /// historical events before streaming real-time events. + /// + /// Note: unlike [onStdoutEvent], the returned stream is a single + /// subscription stream and a new stream is created for each invocation of + /// this getter. + Stream get onStdoutEventWithHistory => onEventWithHistory('Stdout'); + + /// Returns a new [Stream] of `Stderr` events which outputs + /// historical events before streaming real-time events. + /// + /// Note: unlike [onStderrEvent], the returned stream is a single + /// subscription stream and a new stream is created for each invocation of + /// this getter. + Stream get onStderrEventWithHistory => onEventWithHistory('Stderr'); + + /// Returns a new [Stream] of `Extension` events which outputs + /// historical events before streaming real-time events. + /// + /// Note: unlike [onExtensionEvent], the returned stream is a single + /// subscription stream and a new stream is created for each invocation of + /// this getter. + Stream get onExtensionEventWithHistory => + onEventWithHistory('Extension'); + + Future _versionCheck(int major, int minor) async { + _ddsVersion ??= await getDartDevelopmentServiceVersion(); + return ((_ddsVersion!.major == major && _ddsVersion!.minor! >= minor) || + (_ddsVersion!.major! > major)); + } + + Future _callHelper(String method, + {String? isolateId, Map args = const {}}) { + if (!_factoriesRegistered) { + _registerFactories(); + } + return callMethod( + method, + args: { + if (isolateId != null) 'isolateId': isolateId, + ...args, + }, + ).then((e) => e as T); + } + + static void _registerFactories() { + addTypeFactory('StreamHistory', StreamHistory.parse); + addTypeFactory( + 'AvailableCachedCpuSamples', + AvailableCachedCpuSamples.parse, + ); + addTypeFactory('CachedCpuSamples', CachedCpuSamples.parse); + _factoriesRegistered = true; + } +} + +/// A collection of historical [Event]s from some stream. +class StreamHistory extends Response { + static StreamHistory? parse(Map? json) => + json == null ? null : StreamHistory._fromJson(json); + + StreamHistory({required List history}) : _history = history; + + StreamHistory._fromJson(Map json) + : _history = json['history'] + .map( + (e) => Event.parse(e), + ) + .toList() + .cast() { + this.json = json; + } + + @override + String get type => 'StreamHistory'; + + /// Historical [Event]s for a stream. + List get history => UnmodifiableListView(_history); + final List _history; +} + +/// An extension of [CpuSamples] which represents a set of cached samples, +/// associated with a particular [UserTag] name. +class CachedCpuSamples extends CpuSamples { + static CachedCpuSamples? parse(Map? json) => + json == null ? null : CachedCpuSamples._fromJson(json); + + CachedCpuSamples({ + required this.userTag, + this.truncated, + required int? samplePeriod, + required int? maxStackDepth, + required int? sampleCount, + required int? timeSpan, + required int? timeOriginMicros, + required int? timeExtentMicros, + required int? pid, + required List? functions, + required List? samples, + }) : super( + samplePeriod: samplePeriod, + maxStackDepth: maxStackDepth, + sampleCount: sampleCount, + timeSpan: timeSpan, + timeOriginMicros: timeOriginMicros, + timeExtentMicros: timeExtentMicros, + pid: pid, + functions: functions, + samples: samples, + ); + + CachedCpuSamples._fromJson(Map json) + : userTag = json['userTag']!, + truncated = json['truncated'], + super( + samplePeriod: json['samplePeriod'] ?? -1, + maxStackDepth: json['maxStackDepth'] ?? -1, + sampleCount: json['sampleCount'] ?? -1, + timeSpan: json['timeSpan'] ?? -1, + timeOriginMicros: json['timeOriginMicros'] ?? -1, + timeExtentMicros: json['timeExtentMicros'] ?? -1, + pid: json['pid'] ?? -1, + functions: List.from( + createServiceObject(json['functions'], const ['ProfileFunction']) + as List? ?? + [], + ), + samples: List.from( + createServiceObject(json['samples'], const ['CpuSample']) + as List? ?? + [], + ), + ); + + @override + String get type => 'CachedCpuSamples'; + + /// The name of the [UserTag] associated with this cache of [CpuSamples]. + final String userTag; + + /// Provided if the CPU sample cache has filled and older samples have been + /// dropped. + final bool? truncated; +} + +/// A collection of [UserTag] names associated with caches of CPU samples. +class AvailableCachedCpuSamples extends Response { + static AvailableCachedCpuSamples? parse(Map? json) => + json == null ? null : AvailableCachedCpuSamples._fromJson(json); + + AvailableCachedCpuSamples({ + required this.cacheNames, + }); + + AvailableCachedCpuSamples._fromJson(Map json) + : cacheNames = List.from(json['cacheNames']); + + @override + String get type => 'AvailableCachedUserTagCpuSamples'; + + /// A [List] of [UserTag] names associated with CPU sample caches. + final List cacheNames; +} diff --git a/pkg/dds_service_extensions/lib/src/dds_service_extensions_base.dart b/pkg/dds_service_extensions/lib/src/dds_service_extensions_base.dart new file mode 100644 index 00000000000..e8a6f159017 --- /dev/null +++ b/pkg/dds_service_extensions/lib/src/dds_service_extensions_base.dart @@ -0,0 +1,6 @@ +// TODO: Put public facing types in this file. + +/// Checks if you are awesome. Spoiler: you are. +class Awesome { + bool get isAwesome => true; +} diff --git a/pkg/dds_service_extensions/pubspec.yaml b/pkg/dds_service_extensions/pubspec.yaml new file mode 100644 index 00000000000..ca19fe29650 --- /dev/null +++ b/pkg/dds_service_extensions/pubspec.yaml @@ -0,0 +1,18 @@ +name: dds_service_extensions +description: >- + Extension methods for `package:vm_service`, used to make requests a + Dart Development Service (DDS) instance. + +version: 1.3.0 + +homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds_service_extensions + +environment: + sdk: '>=2.13.0 <3.0.0' + +dependencies: + async: ^2.4.1 + vm_service: ^8.1.0 + +dev_dependencies: + lints: ^1.0.0 diff --git a/pkg/dds_service_extensions/test/README b/pkg/dds_service_extensions/test/README new file mode 100644 index 00000000000..77e298370f0 --- /dev/null +++ b/pkg/dds_service_extensions/test/README @@ -0,0 +1 @@ +NOTE: Tests for this package can be found in `package:dds`. diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json index ed2057e74e8..1312a2728ad 100644 --- a/tools/bots/test_matrix.json +++ b/tools/bots/test_matrix.json @@ -3442,6 +3442,15 @@ "pkg/dds" ] }, + { + "name": "analyze pkg/dds_service_extensions", + "script": "out/ReleaseX64/dart-sdk/bin/dart", + "arguments": [ + "analyze", + "--fatal-infos", + "pkg/dds_service_extensions" + ] + }, { "name": "analyze runtime/observatory", "script": "out/ReleaseX64/dart-sdk/bin/dart",