| Index: runtime/observatory/lib/src/service/object.dart
|
| diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
|
| index 46985a378ba61ac2ce3037cedc2dda4919d19a90..db31bb76cfafbd94dd3eb6087fde609362e2e0a5 100644
|
| --- a/runtime/observatory/lib/src/service/object.dart
|
| +++ b/runtime/observatory/lib/src/service/object.dart
|
| @@ -665,6 +665,8 @@ abstract class VM extends ServiceObjectOwner implements M.VM {
|
| // The list of live isolates, ordered by isolate start time.
|
| final List<Isolate> isolates = <Isolate>[];
|
|
|
| + final List<Service> services = <Service>[];
|
| +
|
| String version = 'unknown';
|
| String hostCPU;
|
| String targetCPU;
|
| @@ -855,6 +857,17 @@ abstract class VM extends ServiceObjectOwner implements M.VM {
|
| }
|
| }
|
|
|
| + void _updateService(ServiceEvent event) {
|
| + switch (event.kind) {
|
| + case ServiceEvent.kServiceRegistered:
|
| + services.add(new Service(event.alias, event.method, event.service));
|
| + break;
|
| + case ServiceEvent.kServiceUnregistered:
|
| + services.removeWhere((s) => s.method == event.method);
|
| + break;
|
| + }
|
| + }
|
| +
|
| Future<Map> _fetchDirect({int count: kDefaultFieldLimit}) async {
|
| if (!loaded) {
|
| // The vm service relies on these events to keep the VM and
|
| @@ -864,6 +877,7 @@ abstract class VM extends ServiceObjectOwner implements M.VM {
|
| await listenEventStream(kIsolateStream, _dispatchEventToIsolate);
|
| await listenEventStream(kDebugStream, _dispatchEventToIsolate);
|
| await listenEventStream(_kGraphStream, _dispatchEventToIsolate);
|
| + await listenEventStream(kServiceStream, _updateService);
|
| } on FakeVMRpcException catch (_) {
|
| // ignore FakeVMRpcExceptions here.
|
| } on NetworkRpcException catch (_) {
|
| @@ -911,6 +925,7 @@ abstract class VM extends ServiceObjectOwner implements M.VM {
|
| static const kStdoutStream = 'Stdout';
|
| static const kStderrStream = 'Stderr';
|
| static const _kGraphStream = '_Graph';
|
| + static const kServiceStream = '_Service';
|
|
|
| /// Returns a single-subscription Stream object for a VM event stream.
|
| Future<Stream> getEventStream(String streamId) async {
|
| @@ -2125,7 +2140,8 @@ class ServiceEvent extends ServiceObject {
|
| static const kConnectionClosed = 'ConnectionClosed';
|
| static const kLogging = '_Logging';
|
| static const kExtension = 'Extension';
|
| - static const kEditor = '_Editor';
|
| + static const kServiceRegistered = 'ServiceRegistered';
|
| + static const kServiceUnregistered = 'ServiceUnregistered';
|
|
|
| ServiceEvent._empty(ServiceObjectOwner owner) : super._empty(owner);
|
|
|
| @@ -2157,6 +2173,9 @@ class ServiceEvent extends ServiceObject {
|
| String spawnError;
|
| String editor;
|
| ServiceObject object;
|
| + String method;
|
| + String service;
|
| + String alias;
|
|
|
| int chunkIndex, chunkCount, nodeCount;
|
|
|
| @@ -2253,6 +2272,15 @@ class ServiceEvent extends ServiceObject {
|
| if (map['object'] != null) {
|
| object = map['object'];
|
| }
|
| + if (map['service'] != null) {
|
| + service = map['service'];
|
| + }
|
| + if (map['method'] != null) {
|
| + method = map['method'];
|
| + }
|
| + if (map['alias'] != null) {
|
| + alias = map['alias'];
|
| + }
|
| }
|
|
|
| String toString() {
|
| @@ -4664,3 +4692,15 @@ void _upgradeList(List list, ServiceObjectOwner owner) {
|
| }
|
| }
|
| }
|
| +
|
| +class Service implements M.Service {
|
| + final String alias;
|
| + final String method;
|
| + final String service;
|
| +
|
| + Service(this.alias, this.method, this.service) {
|
| + assert(this.alias != null);
|
| + assert(this.method != null);
|
| + assert(this.service != null);
|
| + }
|
| +}
|
|
|