mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/42746 Changelog: [Internal] Formally introduces the concept of "session state" to the modern CDP backend, with the simplest possible implementation: * `PageTargetSession` has a mutable `SessionState` member. * All agents receive the same `SessionState&` in their constructor (with `SessionState`'s lifetime being the caller's responsibility). * It's only legal to read/write to `SessionState` on the thread where requests are handled and Agents are created (the "main" thread). * Agents are expected to play nice and not clobber each other's state in `SessionState`; this is *not* protected with visibility or `const`ness, however. * We'll probably want to come up with some API-level mechanism to control this as the complexity of our agents grows. ## Current use case: `<Domain>.enable` The first use case for session state is to let `PageAgent` manage the `Log.enable` and `Runtime.enable` state for the session. This will allow agents created later in the session (or recreated as part of a reload) to emit Log and Runtime notifications without waiting for additional `enable` messages (that the client is not required to send). We'll likely want to generalise this design to arbitrary domains in some way (e.g. add a top-level domain router that agents register with explicitly?) but I went with the simplest implementation for our current needs. NOTE: The CDP spec doesn't state this explicitly, but it's clear from Chrome's behaviour that a `<Domain>.enable` command is intended to be session-scoped and survive reloads. ## Future use case: Instance/Runtime state persistence The `<Domain>.enable` use case could have been solved with passing *immutable* state to Agents (`const SessionState&`). We make the state mutable in anticipation of `HermesRuntimeAgent` needing to store its own state in the session down the line, which we know is going to be needed in order for breakpoints to survive reloads. Agents that never need to mutate state SHOULD only store this as a const reference. Reviewed By: huntie Differential Revision: D53006916 fbshipit-source-id: a0443c507294faa94efdf25b2f1670129774dc78
47 lines
1.2 KiB
C++
47 lines
1.2 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.
|
|
*/
|
|
|
|
#include "JSExecutor.h"
|
|
|
|
#include "RAMBundleRegistry.h"
|
|
|
|
#include <folly/Conv.h>
|
|
|
|
#include <chrono>
|
|
|
|
namespace facebook::react {
|
|
|
|
std::string JSExecutor::getSyntheticBundlePath(
|
|
uint32_t bundleId,
|
|
const std::string& bundlePath) {
|
|
if (bundleId == RAMBundleRegistry::MAIN_BUNDLE_ID) {
|
|
return bundlePath;
|
|
}
|
|
return folly::to<std::string>("seg-", bundleId, ".js");
|
|
}
|
|
|
|
double JSExecutor::performanceNow() {
|
|
auto time = std::chrono::steady_clock::now();
|
|
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(
|
|
time.time_since_epoch())
|
|
.count();
|
|
|
|
constexpr double NANOSECONDS_IN_MILLISECOND = 1000000.0;
|
|
return duration / NANOSECONDS_IN_MILLISECOND;
|
|
}
|
|
|
|
std::unique_ptr<jsinspector_modern::RuntimeAgent>
|
|
JSExecutor::createRuntimeAgent(
|
|
jsinspector_modern::FrontendChannel frontendChannel,
|
|
jsinspector_modern::SessionState& sessionState) {
|
|
(void)frontendChannel;
|
|
(void)sessionState;
|
|
return nullptr;
|
|
}
|
|
|
|
} // namespace facebook::react
|