| // 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 'package:analyzer/instrumentation/plugin_data.dart'; | 
 | import 'package:analyzer/instrumentation/service.dart'; | 
 |  | 
 | /// An [InstrumentationService] that sends messages to multiple services. | 
 | class MulticastInstrumentationService implements InstrumentationService { | 
 |   final List<InstrumentationService> _services; | 
 |  | 
 |   MulticastInstrumentationService(this._services); | 
 |  | 
 |   @override | 
 |   void logError(String message) { | 
 |     for (var service in _services) { | 
 |       service.logError(message); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logException( | 
 |     Object exception, [ | 
 |     StackTrace? stackTrace, | 
 |     List<InstrumentationServiceAttachment>? attachments, | 
 |   ]) { | 
 |     for (var service in _services) { | 
 |       service.logException(exception, stackTrace, attachments); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logInfo(String message, [dynamic exception]) { | 
 |     for (var service in _services) { | 
 |       service.logInfo(message, exception); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logLogEntry(String level, DateTime time, String message, | 
 |       Object exception, StackTrace stackTrace) { | 
 |     for (var service in _services) { | 
 |       service.logLogEntry(level, time, message, exception, stackTrace); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logNotification(String notification) { | 
 |     for (var service in _services) { | 
 |       service.logNotification(notification); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logPluginError( | 
 |       PluginData plugin, String code, String message, String stackTrace) { | 
 |     for (var service in _services) { | 
 |       service.logPluginError(plugin, code, message, stackTrace); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logPluginException( | 
 |       PluginData plugin, Object exception, StackTrace? stackTrace) { | 
 |     for (var service in _services) { | 
 |       service.logPluginException(plugin, exception, stackTrace); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logPluginNotification(String pluginId, String notification) { | 
 |     for (var service in _services) { | 
 |       service.logPluginNotification(pluginId, notification); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logPluginRequest(String pluginId, String request) { | 
 |     for (var service in _services) { | 
 |       service.logPluginRequest(pluginId, request); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logPluginResponse(String pluginId, String response) { | 
 |     for (var service in _services) { | 
 |       service.logPluginResponse(pluginId, response); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logPluginTimeout(PluginData plugin, String request) { | 
 |     for (var service in _services) { | 
 |       service.logPluginTimeout(plugin, request); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logRequest(String request) { | 
 |     for (var service in _services) { | 
 |       service.logRequest(request); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logResponse(String response) { | 
 |     for (var service in _services) { | 
 |       service.logResponse(response); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logVersion(String uuid, String clientId, String clientVersion, | 
 |       String serverVersion, String sdkVersion) { | 
 |     for (var service in _services) { | 
 |       service.logVersion( | 
 |           uuid, clientId, clientVersion, serverVersion, sdkVersion); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   void logWatchEvent(String folderPath, String filePath, String changeType) { | 
 |     for (var service in _services) { | 
 |       service.logWatchEvent(folderPath, filePath, changeType); | 
 |     } | 
 |   } | 
 |  | 
 |   @override | 
 |   Future<void> shutdown() { | 
 |     return Future.wait(_services.map((s) => s.shutdown())); | 
 |   } | 
 | } |