/*
 *  Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#ifndef RTC_TOOLS_DATA_CHANNEL_BENCHMARK_GRPC_SIGNALING_H_
#define RTC_TOOLS_DATA_CHANNEL_BENCHMARK_GRPC_SIGNALING_H_

#include <functional>
#include <memory>
#include <string>

#include "rtc_tools/data_channel_benchmark/signaling_interface.h"

namespace webrtc {

// This class defines a server enabling clients to perform a PeerConnection
// negotiation directly over gRPC.
// When a client connects, a callback is run to handle the request.
class GrpcSignalingServerInterface {
 public:
  virtual ~GrpcSignalingServerInterface() = default;

  // Start listening for connections.
  virtual void Start() = 0;

  // Wait for the gRPC server to terminate.
  virtual void Wait() = 0;

  // Stop the gRPC server instance.
  virtual void Stop() = 0;

  // The port the server is listening on.
  virtual int SelectedPort() = 0;

  // Create a gRPC server listening on |port| that will run |callback| on each
  // request. If |oneshot| is true, it will terminate after serving one request.
  static std::unique_ptr<GrpcSignalingServerInterface> Create(
      std::function<void(SignalingInterface*)> callback,
      int port,
      bool oneshot);
};

// This class defines a client that can connect to a server and perform a
// PeerConnection negotiation directly over gRPC.
class GrpcSignalingClientInterface {
 public:
  virtual ~GrpcSignalingClientInterface() = default;

  // Connect the client to the gRPC server.
  virtual bool Connect() = 0;
  // Starts the reading thread. Must be connected.
  virtual bool Start() = 0;
  virtual SignalingInterface* signaling_client() = 0;

  // Create a client to connnect to a server at |server_address|.
  static std::unique_ptr<GrpcSignalingClientInterface> Create(
      const std::string& server_address);
};

}  // namespace webrtc
#endif  // RTC_TOOLS_DATA_CHANNEL_BENCHMARK_GRPC_SIGNALING_H_
