blob: c990fb30d08332737c96796c9a886d5e56e68d7a [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):
// Remove close codes that are not allowed to be sent by WebSocket
// clients.
// TODO(https://github.com/dart-lang/test/issues/2576): Throw
// `SkipTest` instead of setting `code` to `null`.
code = switch (code) {
null => null,
1000 => code,
< 3000 || > 4999 => null,
_ => code,
};
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);
}