blob: 7c24eae31a47a02ab83a4e06384a59c00e08cae5 [file] [log] [blame]
Alex Perryb3b50792020-01-18 16:13:45 -08001#ifndef AOS_NETWORK_WEB_PROXY_H_
2#define AOS_NETWORK_WEB_PROXY_H_
3#include <map>
4#include <set>
5#include "aos/seasocks/seasocks_logger.h"
6#include "flatbuffers/flatbuffers.h"
7#include "seasocks/Server.h"
8#include "seasocks/StringUtil.h"
9#include "seasocks/WebSocket.h"
10
11#include "api/peer_connection_interface.h"
12
13namespace aos {
14namespace web_proxy {
15
16class Connection;
17
18// Basic class that handles receiving new websocket connections. Creates a new
19// Connection to manage the rest of the negotiation and data passing. When the
20// websocket closes, it deletes the Connection.
21class WebsocketHandler : public ::seasocks::WebSocket::Handler {
22 public:
23 WebsocketHandler(::seasocks::Server *server);
24 void onConnect(::seasocks::WebSocket *sock) override;
25 void onData(::seasocks::WebSocket *sock, const uint8_t *data,
26 size_t size) override;
27 void onDisconnect(::seasocks::WebSocket *sock) override;
28
29 private:
30 std::map<::seasocks::WebSocket *, std::unique_ptr<Connection>> connections_;
31 ::seasocks::Server *server_;
32};
33
34// Seasocks requires that sends happen on the correct thread. This class takes a
35// detached buffer to send on a specific websocket connection and sends it when
36// seasocks is ready.
37class UpdateData : public ::seasocks::Server::Runnable {
38 public:
39 UpdateData(::seasocks::WebSocket *websocket,
40 ::flatbuffers::DetachedBuffer &&buffer)
41 : sock_(websocket), buffer_(std::move(buffer)) {}
42 ~UpdateData() override = default;
43 UpdateData(const UpdateData &) = delete;
44 UpdateData &operator=(const UpdateData &) = delete;
45
46 void run() override { sock_->send(buffer_.data(), buffer_.size()); }
47
48 private:
49 ::seasocks::WebSocket *sock_;
50 const ::flatbuffers::DetachedBuffer buffer_;
51};
52
53// Represents a single connection to a browser for the entire lifetime of the
54// connection.
55class Connection : public webrtc::PeerConnectionObserver,
56 public webrtc::CreateSessionDescriptionObserver,
57 public webrtc::DataChannelObserver {
58 public:
59 Connection(::seasocks::WebSocket *sock, ::seasocks::Server *server);
60
61 void HandleWebSocketData(const uint8_t *data, size_t size);
62
63 // PeerConnectionObserver implementation
64 void OnSignalingChange(
65 webrtc::PeerConnectionInterface::SignalingState) override {}
66 void OnAddStream(rtc::scoped_refptr<webrtc::MediaStreamInterface>) override {}
67 void OnRemoveStream(
68 rtc::scoped_refptr<webrtc::MediaStreamInterface>) override {}
69 void OnDataChannel(
70 rtc::scoped_refptr<webrtc::DataChannelInterface> channel) override;
71 void OnRenegotiationNeeded() override {}
72 void OnIceConnectionChange(
73 webrtc::PeerConnectionInterface::IceConnectionState state) override {}
74 void OnIceGatheringChange(
75 webrtc::PeerConnectionInterface::IceGatheringState) override {}
76 void OnIceCandidate(const webrtc::IceCandidateInterface *candidate) override;
77 void OnIceConnectionReceivingChange(bool) override {}
78
79 // CreateSessionDescriptionObserver implementation
80 void OnSuccess(webrtc::SessionDescriptionInterface *desc) override;
81 void OnFailure(webrtc::RTCError error) override {}
82 // CreateSessionDescriptionObserver is a refcounted object
83 void AddRef() const override {}
84 // We handle ownership with a unique_ptr so don't worry about actually
85 // refcounting. We will delete when we are done.
86 rtc::RefCountReleaseStatus Release() const override {
87 return rtc::RefCountReleaseStatus::kOtherRefsRemained;
88 }
89
90 // DataChannelObserver implementation
91 void OnStateChange() override {}
92 void OnMessage(const webrtc::DataBuffer &buffer) override;
93 void OnBufferedAmountChange(uint64_t sent_data_size) override {}
94
95 private:
96 ::seasocks::WebSocket *sock_;
97 ::seasocks::Server *server_;
98 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
99 rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel_;
100};
101
102} // namespace web_proxy
103} // namespace aos
104
105#endif // AOS_NETWORK_WEB_PROXY_H_