/* * Copyright (c) 2021-2022, Dex♪ * Copyright (c) 2023, Kenneth Myhra * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #define ENUMERATE_WEBSOCKET_EVENT_HANDLERS(E) \ E(onerror, HTML::EventNames::error) \ E(onclose, HTML::EventNames::close) \ E(onopen, HTML::EventNames::open) \ E(onmessage, HTML::EventNames::message) namespace Web::WebSockets { class WebSocket final : public DOM::EventTarget { WEB_PLATFORM_OBJECT(WebSocket, DOM::EventTarget); GC_DECLARE_ALLOCATOR(WebSocket); public: static WebIDL::ExceptionOr> construct_impl(JS::Realm&, String const& url, Optional>> const& protocols); virtual ~WebSocket() override; String url() const { return m_url.to_string(); } void set_url(URL::URL url) { m_url = move(url); } #undef __ENUMERATE #define __ENUMERATE(attribute_name, event_name) \ void set_##attribute_name(WebIDL::CallbackType*); \ WebIDL::CallbackType* attribute_name(); ENUMERATE_WEBSOCKET_EVENT_HANDLERS(__ENUMERATE) #undef __ENUMERATE Requests::WebSocket::ReadyState ready_state() const; String extensions() const; WebIDL::ExceptionOr protocol() const; String const& binary_type() { return m_binary_type; } void set_binary_type(String const& type) { m_binary_type = type; } WebIDL::ExceptionOr close(Optional code, Optional reason); WebIDL::ExceptionOr send(Variant, GC::Root, String> const& data); private: void on_open(); void on_message(ByteBuffer message, bool is_text); void on_error(); void on_close(u16 code, String reason, bool was_clean); WebSocket(JS::Realm&); virtual void initialize(JS::Realm&) override; ErrorOr establish_web_socket_connection(URL::URL& url_record, Vector& protocols, HTML::EnvironmentSettingsObject& client); URL::URL m_url; String m_binary_type { "blob"_string }; RefPtr m_websocket; }; }