Initial web proxy commit
Change-Id: I28481433e5609d9c819a1a2bce69fa9d096691a2
diff --git a/aos/network/web_proxy.h b/aos/network/web_proxy.h
new file mode 100644
index 0000000..7c24eae
--- /dev/null
+++ b/aos/network/web_proxy.h
@@ -0,0 +1,105 @@
+#ifndef AOS_NETWORK_WEB_PROXY_H_
+#define AOS_NETWORK_WEB_PROXY_H_
+#include <map>
+#include <set>
+#include "aos/seasocks/seasocks_logger.h"
+#include "flatbuffers/flatbuffers.h"
+#include "seasocks/Server.h"
+#include "seasocks/StringUtil.h"
+#include "seasocks/WebSocket.h"
+
+#include "api/peer_connection_interface.h"
+
+namespace aos {
+namespace web_proxy {
+
+class Connection;
+
+// Basic class that handles receiving new websocket connections. Creates a new
+// Connection to manage the rest of the negotiation and data passing. When the
+// websocket closes, it deletes the Connection.
+class WebsocketHandler : public ::seasocks::WebSocket::Handler {
+ public:
+ WebsocketHandler(::seasocks::Server *server);
+ void onConnect(::seasocks::WebSocket *sock) override;
+ void onData(::seasocks::WebSocket *sock, const uint8_t *data,
+ size_t size) override;
+ void onDisconnect(::seasocks::WebSocket *sock) override;
+
+ private:
+ std::map<::seasocks::WebSocket *, std::unique_ptr<Connection>> connections_;
+ ::seasocks::Server *server_;
+};
+
+// Seasocks requires that sends happen on the correct thread. This class takes a
+// detached buffer to send on a specific websocket connection and sends it when
+// seasocks is ready.
+class UpdateData : public ::seasocks::Server::Runnable {
+ public:
+ UpdateData(::seasocks::WebSocket *websocket,
+ ::flatbuffers::DetachedBuffer &&buffer)
+ : sock_(websocket), buffer_(std::move(buffer)) {}
+ ~UpdateData() override = default;
+ UpdateData(const UpdateData &) = delete;
+ UpdateData &operator=(const UpdateData &) = delete;
+
+ void run() override { sock_->send(buffer_.data(), buffer_.size()); }
+
+ private:
+ ::seasocks::WebSocket *sock_;
+ const ::flatbuffers::DetachedBuffer buffer_;
+};
+
+// Represents a single connection to a browser for the entire lifetime of the
+// connection.
+class Connection : public webrtc::PeerConnectionObserver,
+ public webrtc::CreateSessionDescriptionObserver,
+ public webrtc::DataChannelObserver {
+ public:
+ Connection(::seasocks::WebSocket *sock, ::seasocks::Server *server);
+
+ void HandleWebSocketData(const uint8_t *data, size_t size);
+
+ // PeerConnectionObserver implementation
+ void OnSignalingChange(
+ webrtc::PeerConnectionInterface::SignalingState) override {}
+ void OnAddStream(rtc::scoped_refptr<webrtc::MediaStreamInterface>) override {}
+ void OnRemoveStream(
+ rtc::scoped_refptr<webrtc::MediaStreamInterface>) override {}
+ void OnDataChannel(
+ rtc::scoped_refptr<webrtc::DataChannelInterface> channel) override;
+ void OnRenegotiationNeeded() override {}
+ void OnIceConnectionChange(
+ webrtc::PeerConnectionInterface::IceConnectionState state) override {}
+ void OnIceGatheringChange(
+ webrtc::PeerConnectionInterface::IceGatheringState) override {}
+ void OnIceCandidate(const webrtc::IceCandidateInterface *candidate) override;
+ void OnIceConnectionReceivingChange(bool) override {}
+
+ // CreateSessionDescriptionObserver implementation
+ void OnSuccess(webrtc::SessionDescriptionInterface *desc) override;
+ void OnFailure(webrtc::RTCError error) override {}
+ // CreateSessionDescriptionObserver is a refcounted object
+ void AddRef() const override {}
+ // We handle ownership with a unique_ptr so don't worry about actually
+ // refcounting. We will delete when we are done.
+ rtc::RefCountReleaseStatus Release() const override {
+ return rtc::RefCountReleaseStatus::kOtherRefsRemained;
+ }
+
+ // DataChannelObserver implementation
+ void OnStateChange() override {}
+ void OnMessage(const webrtc::DataBuffer &buffer) override;
+ void OnBufferedAmountChange(uint64_t sent_data_size) override {}
+
+ private:
+ ::seasocks::WebSocket *sock_;
+ ::seasocks::Server *server_;
+ rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
+ rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel_;
+};
+
+} // namespace web_proxy
+} // namespace aos
+
+#endif // AOS_NETWORK_WEB_PROXY_H_