mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
415bb718ff
Summary:
Changelog: [Internal]
I'm refactoring the way the Runtime concept works in the modern CDP backend to bring it in line with the Page/Instance concepts.
Overall, this will let us:
* Integrate with engines that require us to instantiate a shared Target-like object (e.g. Hermes AsyncDebuggingAPI) in addition to an per-session Agent-like object.
* Access JSI in a CDP context (both at target setup/teardown time and during a CDP session) to implement our own engine-agnostic functionality (`console` interception, `Runtime.addBinding`, etc).
* Manage CDP execution contexts natively in RN, and (down the line) enable first-class debugging support for multiple Runtimes in an Instance.
The core diffs in this stack will:
* Introduce a `RuntimeTarget` class similar to `{Page,Instance}Target`. *← This diff*
* Make runtime registration explicit (`InstanceTarget::registerRuntime` similar to `PageTarget::registerInstance`). *← Also in this diff*
* Rename the existing `RuntimeAgent` interface to `RuntimeAgentDelegate`.
* Create a new concrete `RuntimeAgent` class similar to `{Page,Instance}Agent`.
* Provide `RuntimeTarget` and `RuntimeAgent` with primitives for safe JSI access, namely a `RuntimeExecutor` for scheduling work on the JS thread.
* We'll likely develop a similar mechanism for scheduling work on the "main" thread from the JS thread, for when we need to do more than just send a CDP message (which we can already do with the thread-safe `FrontendChannel`) in response to a JS event.
## Architecture diagrams
Before this stack:
https://pxl.cl/4h7m0
After this stack:
https://pxl.cl/4h7m7
Reviewed By: hoxyq
Differential Revision: D53233914
fbshipit-source-id: 166ae3e25059bd9c9c051a0a3312a3ba78a3935a
55 lines
1.4 KiB
C++
55 lines
1.4 KiB
C++
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <ReactCommon/RuntimeExecutor.h>
|
|
#include <cxxreact/MessageQueueThread.h>
|
|
#include <jsi/jsi.h>
|
|
#include <jsinspector-modern/ReactCdp.h>
|
|
|
|
namespace facebook::react {
|
|
|
|
/**
|
|
* An interface that represents an instance of a JS VM
|
|
*/
|
|
class JSRuntime : public jsinspector_modern::RuntimeTargetDelegate {
|
|
public:
|
|
virtual jsi::Runtime& getRuntime() noexcept = 0;
|
|
|
|
virtual ~JSRuntime() = default;
|
|
};
|
|
|
|
/**
|
|
* Interface for a class that creates instances of a JS VM
|
|
*/
|
|
class JSRuntimeFactory {
|
|
public:
|
|
virtual std::unique_ptr<JSRuntime> createJSRuntime(
|
|
std::shared_ptr<MessageQueueThread> msgQueueThread) noexcept = 0;
|
|
|
|
virtual ~JSRuntimeFactory() = default;
|
|
};
|
|
|
|
/**
|
|
* Utility class for creating a JSRuntime from a uniquely owned jsi::Runtime.
|
|
*/
|
|
class JSIRuntimeHolder : public JSRuntime {
|
|
public:
|
|
jsi::Runtime& getRuntime() noexcept override;
|
|
std::unique_ptr<jsinspector_modern::RuntimeAgent> createAgent(
|
|
jsinspector_modern::FrontendChannel frontendChannel,
|
|
jsinspector_modern::SessionState& sessionState) override;
|
|
|
|
explicit JSIRuntimeHolder(std::unique_ptr<jsi::Runtime> runtime);
|
|
|
|
private:
|
|
std::unique_ptr<jsi::Runtime> runtime_;
|
|
};
|
|
|
|
} // namespace facebook::react
|