blob: e580b541c2aa2f1fbb43b59fb4372c8e2af3ade7 [file] [log] [blame]
// 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);
}