| 
									
										
										
										
											2021-04-24 01:46:49 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2021, Dex♪ <dexes.ttp@gmail.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <AK/Badge.h>
 | 
					
						
							|  |  |  | #include <AK/ByteBuffer.h>
 | 
					
						
							| 
									
										
										
										
											2023-12-16 17:49:34 +03:30
										 |  |  | #include <AK/ByteString.h>
 | 
					
						
							| 
									
										
										
										
											2021-04-24 01:46:49 +02:00
										 |  |  | #include <AK/Function.h>
 | 
					
						
							|  |  |  | #include <AK/RefCounted.h>
 | 
					
						
							|  |  |  | #include <AK/WeakPtr.h>
 | 
					
						
							|  |  |  | #include <LibCore/Notifier.h>
 | 
					
						
							|  |  |  | #include <LibIPC/Forward.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Protocol { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WebSocketClient; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WebSocket : public RefCounted<WebSocket> { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     struct CertificateAndKey { | 
					
						
							| 
									
										
										
										
											2023-12-16 17:49:34 +03:30
										 |  |  |         ByteString certificate; | 
					
						
							|  |  |  |         ByteString key; | 
					
						
							| 
									
										
										
										
											2021-04-24 01:46:49 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct Message { | 
					
						
							|  |  |  |         ByteBuffer data; | 
					
						
							|  |  |  |         bool is_text { false }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     enum class Error { | 
					
						
							|  |  |  |         CouldNotEstablishConnection, | 
					
						
							|  |  |  |         ConnectionUpgradeFailed, | 
					
						
							|  |  |  |         ServerClosedSocket, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     enum class ReadyState { | 
					
						
							|  |  |  |         Connecting = 0, | 
					
						
							|  |  |  |         Open = 1, | 
					
						
							|  |  |  |         Closing = 2, | 
					
						
							|  |  |  |         Closed = 3, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static NonnullRefPtr<WebSocket> create_from_id(Badge<WebSocketClient>, WebSocketClient& client, i32 connection_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return adopt_ref(*new WebSocket(client, connection_id)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int id() const { return m_connection_id; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ReadyState ready_state(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-16 17:49:34 +03:30
										 |  |  |     ByteString subprotocol_in_use(); | 
					
						
							| 
									
										
										
										
											2022-12-31 10:37:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-24 01:46:49 +02:00
										 |  |  |     void send(ByteBuffer binary_or_text_message, bool is_text); | 
					
						
							|  |  |  |     void send(StringView text_message); | 
					
						
							| 
									
										
										
										
											2023-12-16 17:49:34 +03:30
										 |  |  |     void close(u16 code = 1005, ByteString reason = {}); | 
					
						
							| 
									
										
										
										
											2021-04-24 01:46:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Function<void()> on_open; | 
					
						
							|  |  |  |     Function<void(Message)> on_message; | 
					
						
							|  |  |  |     Function<void(Error)> on_error; | 
					
						
							| 
									
										
										
										
											2023-12-16 17:49:34 +03:30
										 |  |  |     Function<void(u16 code, ByteString reason, bool was_clean)> on_close; | 
					
						
							| 
									
										
										
										
											2021-04-24 01:46:49 +02:00
										 |  |  |     Function<CertificateAndKey()> on_certificate_requested; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void did_open(Badge<WebSocketClient>); | 
					
						
							|  |  |  |     void did_receive(Badge<WebSocketClient>, ByteBuffer, bool); | 
					
						
							|  |  |  |     void did_error(Badge<WebSocketClient>, i32); | 
					
						
							| 
									
										
										
										
											2023-12-16 17:49:34 +03:30
										 |  |  |     void did_close(Badge<WebSocketClient>, u16, ByteString, bool); | 
					
						
							| 
									
										
										
										
											2021-04-24 01:46:49 +02:00
										 |  |  |     void did_request_certificates(Badge<WebSocketClient>); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     explicit WebSocket(WebSocketClient&, i32 connection_id); | 
					
						
							|  |  |  |     WeakPtr<WebSocketClient> m_client; | 
					
						
							|  |  |  |     int m_connection_id { -1 }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |