2025-02-15 07:35:58 -05:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org>
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <AK/Badge.h>
|
2025-03-11 09:47:41 -04:00
|
|
|
#include <AK/Debug.h>
|
2025-03-11 09:05:01 -04:00
|
|
|
#include <AK/JsonObject.h>
|
2025-02-15 07:35:58 -05:00
|
|
|
#include <AK/Optional.h>
|
|
|
|
|
#include <AK/RefCounted.h>
|
2025-02-17 13:21:07 -05:00
|
|
|
#include <AK/String.h>
|
2025-02-15 07:35:58 -05:00
|
|
|
#include <AK/StringView.h>
|
|
|
|
|
#include <AK/Vector.h>
|
|
|
|
|
#include <AK/WeakPtr.h>
|
|
|
|
|
#include <AK/Weakable.h>
|
|
|
|
|
#include <LibDevTools/Forward.h>
|
|
|
|
|
|
|
|
|
|
namespace DevTools {
|
|
|
|
|
|
|
|
|
|
class Actor
|
|
|
|
|
: public RefCounted<Actor>
|
|
|
|
|
, public Weakable<Actor> {
|
|
|
|
|
public:
|
|
|
|
|
virtual ~Actor();
|
|
|
|
|
|
2025-02-17 13:21:07 -05:00
|
|
|
String const& name() const { return m_name; }
|
2025-02-15 07:35:58 -05:00
|
|
|
virtual void handle_message(StringView type, JsonObject const&) = 0;
|
|
|
|
|
|
|
|
|
|
class [[nodiscard]] BlockToken {
|
|
|
|
|
public:
|
|
|
|
|
BlockToken(Badge<Actor>, Actor&);
|
|
|
|
|
~BlockToken();
|
|
|
|
|
|
|
|
|
|
BlockToken(BlockToken const&) = delete;
|
|
|
|
|
BlockToken& operator=(BlockToken const&) = delete;
|
|
|
|
|
|
|
|
|
|
BlockToken(BlockToken&&);
|
|
|
|
|
BlockToken& operator=(BlockToken&&);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
WeakPtr<Actor> m_actor;
|
|
|
|
|
};
|
|
|
|
|
|
2025-03-11 08:15:23 -04:00
|
|
|
void send_message(JsonObject, Optional<BlockToken> block_token = {});
|
2025-02-15 07:35:58 -05:00
|
|
|
void send_missing_parameter_error(StringView parameter);
|
|
|
|
|
void send_unrecognized_packet_type_error(StringView type);
|
|
|
|
|
void send_unknown_actor_error(StringView actor);
|
|
|
|
|
|
|
|
|
|
protected:
|
2025-02-19 09:28:02 -05:00
|
|
|
explicit Actor(DevToolsServer&, String name);
|
2025-02-15 07:35:58 -05:00
|
|
|
|
|
|
|
|
DevToolsServer& devtools() { return m_devtools; }
|
|
|
|
|
DevToolsServer const& devtools() const { return m_devtools; }
|
|
|
|
|
|
|
|
|
|
BlockToken block_responses();
|
|
|
|
|
|
2025-03-11 09:05:01 -04:00
|
|
|
template<typename ParameterType>
|
|
|
|
|
auto get_required_parameter(JsonObject const& message, StringView parameter)
|
|
|
|
|
{
|
|
|
|
|
auto result = [&]() {
|
|
|
|
|
if constexpr (IsIntegral<ParameterType>)
|
|
|
|
|
return message.get_integer<ParameterType>(parameter);
|
|
|
|
|
else if constexpr (IsSame<ParameterType, bool>)
|
|
|
|
|
return message.get_bool(parameter);
|
|
|
|
|
else if constexpr (IsSame<ParameterType, String>)
|
|
|
|
|
return message.get_string(parameter);
|
|
|
|
|
else if constexpr (IsSame<ParameterType, JsonObject>)
|
|
|
|
|
return message.get_object(parameter);
|
|
|
|
|
else if constexpr (IsSame<ParameterType, JsonArray>)
|
|
|
|
|
return message.get_array(parameter);
|
|
|
|
|
else
|
|
|
|
|
static_assert(DependentFalse<ParameterType>);
|
|
|
|
|
}();
|
|
|
|
|
|
|
|
|
|
if (!result.has_value())
|
|
|
|
|
send_missing_parameter_error(parameter);
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-11 09:47:41 -04:00
|
|
|
template<typename ActorType = Actor, typename Handler>
|
|
|
|
|
auto async_handler(Handler&& handler)
|
|
|
|
|
{
|
|
|
|
|
return [weak_self = make_weak_ptr<ActorType>(), handler = forward<Handler>(handler), block_token = block_responses()](auto result) mutable {
|
|
|
|
|
if (result.is_error()) {
|
|
|
|
|
dbgln_if(DEVTOOLS_DEBUG, "Error performing async action: {}", result.error());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (auto self = weak_self.strong_ref()) {
|
|
|
|
|
JsonObject response;
|
|
|
|
|
handler(*self, result.release_value(), response);
|
|
|
|
|
self->send_message(move(response), move(block_token));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto default_async_handler()
|
|
|
|
|
{
|
|
|
|
|
return async_handler([](auto&, auto, auto) { });
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 07:35:58 -05:00
|
|
|
private:
|
|
|
|
|
DevToolsServer& m_devtools;
|
2025-02-17 13:21:07 -05:00
|
|
|
String m_name;
|
2025-02-15 07:35:58 -05:00
|
|
|
|
2025-03-11 08:15:23 -04:00
|
|
|
Vector<JsonObject> m_blocked_responses;
|
2025-02-15 07:35:58 -05:00
|
|
|
bool m_block_responses { false };
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|