1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_DIRECT_SOCKETS_TCP_SOCKET_H_
6 #define THIRD_PARTY_BLINK_RENDERER_MODULES_DIRECT_SOCKETS_TCP_SOCKET_H_
7 
8 #include "base/optional.h"
9 #include "mojo/public/cpp/bindings/pending_receiver.h"
10 #include "mojo/public/cpp/bindings/pending_remote.h"
11 #include "mojo/public/cpp/bindings/receiver.h"
12 #include "mojo/public/cpp/bindings/remote.h"
13 #include "mojo/public/cpp/system/data_pipe.h"
14 #include "services/network/public/mojom/tcp_socket.mojom-blink.h"
15 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
16 #include "third_party/blink/renderer/modules/modules_export.h"
17 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
18 #include "third_party/blink/renderer/platform/heap/heap.h"
19 #include "third_party/blink/renderer/platform/heap/member.h"
20 #include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h"
21 
22 namespace net {
23 class IPEndPoint;
24 }  // namespace net
25 
26 namespace blink {
27 
28 class MODULES_EXPORT TCPSocket final
29     : public ScriptWrappable,
30       public network::mojom::blink::SocketObserver {
31   DEFINE_WRAPPERTYPEINFO();
32 
33  public:
34   explicit TCPSocket(ScriptPromiseResolver&);
35   ~TCPSocket() override;
36 
37   TCPSocket(const TCPSocket&) = delete;
38   TCPSocket& operator=(const TCPSocket&) = delete;
39 
40   // Called by NavigatorSocket when initiating a connection:
41   mojo::PendingReceiver<network::mojom::blink::TCPConnectedSocket>
42   GetTCPSocketReceiver();
43   mojo::PendingRemote<network::mojom::blink::SocketObserver>
44   GetTCPSocketObserver();
45   void Init(int32_t result,
46             const base::Optional<net::IPEndPoint>& local_addr,
47             const base::Optional<net::IPEndPoint>& peer_addr,
48             mojo::ScopedDataPipeConsumerHandle receive_stream,
49             mojo::ScopedDataPipeProducerHandle send_stream);
50 
51   // Web-exposed function
52   ScriptPromise close(ScriptState*, ExceptionState&);
53 
54   // network::mojom::blink::SocketObserver:
55   void OnReadError(int32_t net_error) override;
56   void OnWriteError(int32_t net_error) override;
57 
58   // ScriptWrappable:
59   void Trace(Visitor* visitor) const override;
60 
61  private:
62   void OnSocketObserverConnectionError();
63 
64   Member<ScriptPromiseResolver> resolver_;
65   FrameOrWorkerScheduler::SchedulingAffectingFeatureHandle
66       feature_handle_for_scheduler_;
67 
68   mojo::Remote<network::mojom::blink::TCPConnectedSocket> tcp_socket_;
69   mojo::Receiver<network::mojom::blink::SocketObserver>
70       socket_observer_receiver_{this};
71 };
72 
73 }  // namespace blink
74 
75 #endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_DIRECT_SOCKETS_TCP_SOCKET_H_
76