| // Copyright (c) 2024, 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:stream_channel/stream_channel.dart'; | |
| import 'package:web_socket_channel/web_socket_channel.dart'; | |
| import '../../test/constants.dart'; | |
| /// Creates a [StreamChannel] for a connection to a WebSocket at [wsUri] that | |
| /// prints all communication if [debugPrintCommunication] is `true`. | |
| Future<StreamChannel<String>> createLoggedWebSocketChannel(Uri wsUri) async { | |
| var rawChannel = WebSocketChannel.connect(wsUri); | |
| await rawChannel.ready; | |
| var rawStringChannel = rawChannel.cast<String>(); | |
| /// A helper to create a function that can be used in stream.map() to log | |
| /// traffic with a prefix. | |
| String Function(String) logTraffic(String prefix) { | |
| return (String data) { | |
| if (debugPrintCommunication) { | |
| print('$prefix $data'.trim()); | |
| } | |
| return data; | |
| }; | |
| } | |
| // Create a channel that logs the data going through it. | |
| var loggedInput = rawStringChannel.stream.map(logTraffic('DTD ==>')); | |
| var loggedOutputController = StreamController<String>(); | |
| unawaited( | |
| loggedOutputController.stream | |
| .map(logTraffic('DTD <==')) | |
| .pipe(rawStringChannel.sink), | |
| ); | |
| return StreamChannel<String>(loggedInput, loggedOutputController.sink); | |
| } |