blob: 3cef748cf82366e421962563d549df8bca2cf9cd [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 'package:web_socket/src/fake_web_socket.dart';
import 'package:web_socket/web_socket.dart';
import 'package:web_socket_conformance_tests/web_socket_conformance_tests.dart';
/// Forward data received from [from] to [to].
void proxy(WebSocket from, WebSocket to) {
from.events.listen((event) {
try {
switch (event) {
case TextDataReceived(:final text):
to.sendText(text);
case BinaryDataReceived(:final data):
to.sendBytes(data);
case CloseReceived(:var code, :final reason):
if (code != null && code != 1000 && (code < 3000 || code > 4999)) {
code = null;
}
to.close(code, reason);
}
} on WebSocketConnectionClosed {
// `to` may have been closed locally so ignore failures to forward the
// data.
}
});
}
/// Create a bidirectional proxy relationship between [a] and [b].
///
/// That means that events received by [a] will be forwarded to [b] and
/// vise-versa.
void bidirectionalProxy(WebSocket a, WebSocket b) {
proxy(a, b);
proxy(b, a);
}
void main() {
// In order to use `testAll`, we need to provide a method that will connect
// to a real WebSocket server.
//
// The approach is to connect to the server with a real WebSocket and forward
// the data received by that data to one of the fakes.
//
// Like:
//
// 'hello' sendText('hello') TextDataReceived('hello')
// [Server] -> [realClient] -> [FakeServer] -> [fakeClient]
Future<WebSocket> connect(Uri url, {Iterable<String>? protocols}) async {
final realClient = await WebSocket.connect(url, protocols: protocols);
final (fakeServer, fakeClient) = fakes(protocol: realClient.protocol);
bidirectionalProxy(realClient, fakeServer);
return fakeClient;
}
testAll(connect);
}