// 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);
}
