blob: 5b00c80f37fa26b9832a353934b8d26c1ab2db09 [file] [log] [blame] [edit]
//
// Copyright (C) 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
//
#pragma once
#include <string.h>
#include <deque>
#include <functional>
#include <map>
#include <memory>
#include <mutex>
#include <string>
#include <thread>
#include <vector>
#include <json/json.h>
#include <libwebsockets.h>
namespace cuttlefish {
namespace webrtc_streaming {
struct ServerConfig {
enum class Security {
kInsecure,
kAllowSelfSigned,
kStrict,
};
// The ip address or domain name of the operator server.
std::string addr;
int port;
// The path component of the operator server's register url.
std::string path;
// The security level to use when connecting to the operator server.
Security security;
};
class ServerConnectionObserver {
public:
virtual ~ServerConnectionObserver() = default;
// Called when the connection to the server has been established. This is the
// cue to start using Send().
virtual void OnOpen() = 0;
virtual void OnClose() = 0;
// Called when the connection to the server has failed with an unrecoverable
// error.
virtual void OnError(const std::string& error) = 0;
virtual void OnReceive(const uint8_t* msg, size_t length, bool is_binary) = 0;
};
// Represents a connection to the signaling server. When a connection is created
// it connects with the server automatically but sends no info.
// Only Send() can be called from multiple threads simultaneously. Reconnect(),
// Send() and the destructor will run into race conditions if called
// concurrently.
class ServerConnection {
public:
static std::unique_ptr<ServerConnection> Connect(
const ServerConfig& conf,
std::weak_ptr<ServerConnectionObserver> observer);
// Destroying the connection will disconnect from the signaling server and
// release any open fds.
virtual ~ServerConnection() = default;
// Sends data to the server encoded as JSON.
virtual bool Send(const Json::Value&) = 0;
// makes re-connect request
virtual void Reconnect();
private:
virtual void Connect() = 0;
};
} // namespace webrtc_streaming
} // namespace cuttlefish