From 0e943cc262b256b35244645280ef12b0ba08eacd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Fri, 6 Mar 2026 16:12:19 +0100 Subject: [PATCH 1/8] feat(Worklets): always compile bundle mode symbols --- .../NativeModules/JSIWorkletsModuleProxy.cpp | 17 ++---- .../NativeModules/JSIWorkletsModuleProxy.h | 17 +++--- .../NativeModules/WorkletsModuleProxy.cpp | 19 ++---- .../NativeModules/WorkletsModuleProxy.h | 8 +-- .../Common/cpp/worklets/Tools/Defs.h | 12 ---- .../WorkletRuntime/BundleModeConfig.h | 14 +++++ .../worklets/WorkletRuntime/RuntimeBindings.h | 4 +- .../WorkletRuntime/RuntimeManager.cpp | 8 ++- .../WorkletRuntime/WorkletRuntime.cpp | 42 +++++++++---- .../worklets/WorkletRuntime/WorkletRuntime.h | 32 ++++++---- .../WorkletRuntimeDecorator.cpp | 2 - .../WorkletRuntime/WorkletRuntimeDecorator.h | 4 -- .../android/JWorkletRuntimeWrapper.cpp | 4 +- .../worklets/android/JWorkletRuntimeWrapper.h | 4 +- .../cpp/worklets/android/WorkletsModule.cpp | 22 +++---- .../cpp/worklets/android/WorkletsModule.h | 4 +- .../cpp/worklets/android/WorkletsOnLoad.cpp | 4 +- .../swmansion/worklets/WorkletsModule.java | 2 +- .../swmansion/worklets/WorkletsModule.java | 2 +- .../apple/Networking/WorkletsNetworking.h | 7 ++- .../apple/Networking/WorkletsNetworking.mm | 5 +- .../apple/worklets/apple/WorkletsModule.mm | 60 +++++++++++-------- .../WorkletsModule/NativeWorklets.native.ts | 5 +- .../src/specs/NativeWorkletsModule.ts | 2 +- 24 files changed, 163 insertions(+), 137 deletions(-) create mode 100644 packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h diff --git a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp index 6b21a1adf9ce..961aeec97f25 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp @@ -16,6 +16,7 @@ #include #include #include +#include "worklets/WorkletRuntime/BundleModeConfig.h" using namespace facebook; @@ -85,14 +86,13 @@ inline jsi::Value createWorkletRuntime( return jsi::Object::createFromHostObject(originRuntime, workletRuntime); } -#ifdef WORKLETS_BUNDLE_MODE_ENABLED inline jsi::Value propagateModuleUpdate( const std::shared_ptr &runtimeManager, const std::string &code, const std::string &sourceUrl) { const auto runtimes = runtimeManager->getAllRuntimes(); - for (auto runtime : runtimes) { + for (const auto &runtime : runtimes) { runtime->runSync([code, sourceUrl](jsi::Runtime &rt) -> void { const auto buffer = std::make_shared(code); rt.evaluateJavaScript(buffer, sourceUrl); @@ -100,7 +100,6 @@ inline jsi::Value propagateModuleUpdate( } return jsi::Value::undefined(); } -#endif // WORKLETS_BUNDLE_MODE_ENABLED inline jsi::Value reportFatalErrorOnJS( const std::shared_ptr &jsScheduler, @@ -150,19 +149,17 @@ inline void registerCustomSerializable( JSIWorkletsModuleProxy::JSIWorkletsModuleProxy( const bool isDevBundle, - const std::shared_ptr &script, - const std::string &sourceUrl, const std::shared_ptr &jsQueue, const std::shared_ptr &jsScheduler, const std::shared_ptr &uiScheduler, const std::shared_ptr &memoryManager, const std::shared_ptr &runtimeManager, const std::weak_ptr &uiWorkletRuntime, - const std::shared_ptr &runtimeBindings) + const std::shared_ptr &runtimeBindings, + const BundleModeConfig &bundleModeConfig) : jsi::HostObject(), isDevBundle_(isDevBundle), - script_(script), - sourceUrl_(sourceUrl), + bundleModeConfig_(bundleModeConfig), jsQueue_(jsQueue), jsScheduler_(jsScheduler), uiScheduler_(uiScheduler), @@ -215,9 +212,7 @@ std::vector JSIWorkletsModuleProxy::getPropertyNames(jsi::Runti propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "synchronizableLock")); propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "synchronizableUnlock")); -#ifdef WORKLETS_BUNDLE_MODE_ENABLED propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "propagateModuleUpdate")); -#endif // WORKLETS_BUNDLE_MODE_ENABLED propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "getUIRuntimeHolder")); propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "getUISchedulerHolder")); @@ -552,7 +547,6 @@ jsi::Value JSIWorkletsModuleProxy::get(jsi::Runtime &rt, const jsi::PropNameID & }); } -#ifdef WORKLETS_BUNDLE_MODE_ENABLED if (name == "propagateModuleUpdate") { return jsi::Function::createFromHostFunction( rt, @@ -566,7 +560,6 @@ jsi::Value JSIWorkletsModuleProxy::get(jsi::Runtime &rt, const jsi::PropNameID & /* sourceURL */ args[1].asString(rt).utf8(rt)); }); } -#endif // WORKLETS_BUNDLE_MODE_ENABLED if (name == "getStaticFeatureFlag") { return jsi::Function::createFromHostFunction( diff --git a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h index 9bc7892834f9..5eda7f691be0 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h +++ b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -26,15 +27,14 @@ class JSIWorkletsModuleProxy : public jsi::HostObject { public: explicit JSIWorkletsModuleProxy( const bool isDevBundle, - const std::shared_ptr &script, - const std::string &sourceUrl, const std::shared_ptr &jsQueue, const std::shared_ptr &jsScheduler, const std::shared_ptr &uiScheduler, const std::shared_ptr &memoryManager, const std::shared_ptr &runtimeManager, const std::weak_ptr &uiWorkletRuntime, - const std::shared_ptr &runtimeBindings); + const std::shared_ptr &runtimeBindings, + const BundleModeConfig &bundleModeConfig); JSIWorkletsModuleProxy(const JSIWorkletsModuleProxy &other) = default; @@ -56,16 +56,20 @@ class JSIWorkletsModuleProxy : public jsi::HostObject { return uiScheduler_; } + [[nodiscard]] bool isBundleModeEnabled() const { + return bundleModeConfig_.enabled; + } + [[nodiscard]] bool isDevBundle() const { return isDevBundle_; } [[nodiscard]] std::shared_ptr getScript() const { - return script_; + return bundleModeConfig_.bundleScript; } [[nodiscard]] std::string getSourceUrl() const { - return sourceUrl_; + return bundleModeConfig_.bundleURL; } [[nodiscard]] std::shared_ptr getMemoryManager() const { @@ -82,8 +86,7 @@ class JSIWorkletsModuleProxy : public jsi::HostObject { private: const bool isDevBundle_; - const std::shared_ptr script_; - const std::string sourceUrl_; + const BundleModeConfig bundleModeConfig_; const std::shared_ptr jsQueue_; const std::shared_ptr jsScheduler_; const std::shared_ptr uiScheduler_; diff --git a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp index d1094c316e69..d1034c965d41 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp @@ -1,6 +1,5 @@ #include #include - #include #include #include @@ -9,19 +8,14 @@ #include #include -#ifdef __ANDROID__ -#include -#endif // __ANDROID__ - #include -#include #include using namespace facebook; namespace worklets { -auto isDevBundleFromRNRuntime(jsi::Runtime &rnRuntime) -> bool; +bool isDevBundleFromRNRuntime(jsi::Runtime &rnRuntime); WorkletsModuleProxy::WorkletsModuleProxy( jsi::Runtime &rnRuntime, @@ -30,16 +24,14 @@ WorkletsModuleProxy::WorkletsModuleProxy( const std::shared_ptr &uiScheduler, std::function &&isJavaScriptThread, const std::shared_ptr &runtimeBindings, - const std::shared_ptr &script, - const std::string &sourceUrl) + const BundleModeConfig &bundleModeConfig) : isDevBundle_(isDevBundleFromRNRuntime(rnRuntime)), jsQueue_(jsQueue), jsScheduler_(std::make_shared(rnRuntime, jsCallInvoker, std::move(isJavaScriptThread))), uiScheduler_(uiScheduler), jsLogger_(std::make_shared(jsScheduler_)), runtimeBindings_(runtimeBindings), - script_(script), - sourceUrl_(sourceUrl), + bundleModeConfig_(bundleModeConfig), memoryManager_(std::make_shared()), runtimeManager_(std::make_shared()), uiWorkletRuntime_( @@ -61,15 +53,14 @@ std::shared_ptr WorkletsModuleProxy::createJSIWorkletsMo assert(uiWorkletRuntime_ && "UI Worklet Runtime must be initialized before creating JSI proxy."); return std::make_shared( isDevBundle_, - script_, - sourceUrl_, jsQueue_, jsScheduler_, uiScheduler_, memoryManager_, runtimeManager_, uiWorkletRuntime_, - runtimeBindings_); + runtimeBindings_, + bundleModeConfig_); } WorkletsModuleProxy::~WorkletsModuleProxy() { diff --git a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h index caabbc227c1a..fcecc02a6d3a 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h +++ b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h @@ -12,11 +12,11 @@ #include #include #include +#include #include #include #include -#include namespace worklets { @@ -29,8 +29,7 @@ class WorkletsModuleProxy : public std::enable_shared_from_this &uiScheduler, std::function &&isJavaScriptQueue, const std::shared_ptr &runtimeBindings, - const std::shared_ptr &script, - const std::string &sourceUrl); + const BundleModeConfig &bundleModeConfig); ~WorkletsModuleProxy(); @@ -67,8 +66,7 @@ class WorkletsModuleProxy : public std::enable_shared_from_this uiScheduler_; const std::shared_ptr jsLogger_; const std::shared_ptr runtimeBindings_; - const std::shared_ptr script_; - const std::string sourceUrl_; + const BundleModeConfig bundleModeConfig_; const std::shared_ptr memoryManager_; const std::shared_ptr runtimeManager_; std::shared_ptr uiWorkletRuntime_; diff --git a/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h index e958520f008c..fccf8f6f7ac9 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h +++ b/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h @@ -8,15 +8,3 @@ so we have to check if headers are available. #if __APPLE__ && __has_include() #define JS_RUNTIME_HERMES 1 #endif - -#if REACT_NATIVE_MINOR_VERSION >= 84 || defined(WORKLETS_BUNDLE_MODE_ENABLED) -#include -namespace worklets { -using JSBigStringBuffer = facebook::react::JSBigString; -} -#else -#include -namespace worklets { -using JSBigStringBuffer = facebook::react::BigStringBuffer; -} -#endif // REACT_NATIVE_MINOR_VERSION >= 84 || defined(WORKLETS_BUNDLE_MODE_ENABLED) diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h new file mode 100644 index 000000000000..4d3ca4fce317 --- /dev/null +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +namespace worklets { + +struct BundleModeConfig { + bool enabled; + std::string bundleURL; + std::shared_ptr bundleScript; +}; + +} // namespace worklets diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeBindings.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeBindings.h index 30ab3dcd3723..68be04cd0f57 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeBindings.h +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeBindings.h @@ -13,7 +13,7 @@ struct RuntimeBindings { const RequestAnimationFrame requestAnimationFrame; -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED using AbortRequest = std::function; using ClearCookies = std::function; #ifdef ANDROID @@ -35,7 +35,7 @@ struct RuntimeBindings { const AbortRequest abortRequest; const ClearCookies clearCookies; const SendRequest sendRequest; -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED }; } // namespace worklets diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp index b9ba9dc66d4a..338dadedb037 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp @@ -5,6 +5,7 @@ #include #include #include +#include "worklets/WorkletRuntime/WorkletRuntime.h" namespace worklets { @@ -44,7 +45,8 @@ std::shared_ptr RuntimeManager::createWorkletRuntime( const auto runtimeId = getNextRuntimeId(); const auto jsQueue = jsiWorkletsModuleProxy->getJSQueue(); - auto workletRuntime = std::make_shared(runtimeId, jsQueue, name, queue, enableEventLoop); + auto workletRuntime = + std::make_shared(WorkletRuntime(runtimeId, jsQueue, name, queue, enableEventLoop)); workletRuntime->init(std::move(jsiWorkletsModuleProxy)); @@ -60,12 +62,12 @@ std::shared_ptr RuntimeManager::createWorkletRuntime( std::shared_ptr RuntimeManager::createUninitializedUIRuntime( const std::shared_ptr &jsQueue, const std::shared_ptr &uiAsyncQueue) { - const auto uiRuntime = std::make_shared( + const auto uiRuntime = std::make_shared(WorkletRuntime( RuntimeData::uiRuntimeId, jsQueue, RuntimeData::uiRuntimeName, uiAsyncQueue, - /*enableEventLoop*/ false); + /*enableEventLoop*/ false)); registerRuntime(RuntimeData::uiRuntimeId, uiRuntime); diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp index 5f761792de7b..fa85f3f548e6 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp @@ -17,6 +17,8 @@ #include #include #include +#include "worklets/Tools/JSScheduler.h" +#include "worklets/Tools/ScriptBuffer.h" #if JS_RUNTIME_HERMES #include @@ -100,18 +102,36 @@ void WorkletRuntime::init(std::shared_ptr jsiWorkletsMod const auto jsScheduler = jsiWorkletsModuleProxy->getJSScheduler(); const auto isDevBundle = jsiWorkletsModuleProxy->isDevBundle(); const auto memoryManager_ = jsiWorkletsModuleProxy->getMemoryManager(); -#ifdef WORKLETS_BUNDLE_MODE_ENABLED - auto script = jsiWorkletsModuleProxy->getScript(); + const auto script = jsiWorkletsModuleProxy->getScript(); const auto &sourceUrl = jsiWorkletsModuleProxy->getSourceUrl(); - auto runtimeBindings = jsiWorkletsModuleProxy->getRuntimeBindings(); -#endif // WORKLETS_BUNDLE_MODE_ENABLED + const auto runtimeBindings = jsiWorkletsModuleProxy->getRuntimeBindings(); + const auto bundleModeEnabled = jsiWorkletsModuleProxy->isBundleModeEnabled(); auto optimizedJsiWorkletsModuleProxy = jsi_utils::optimizedFromHostObject(rt, std::move(jsiWorkletsModuleProxy)); WorkletRuntimeDecorator::decorate( rt, name_, jsScheduler, isDevBundle, std::move(optimizedJsiWorkletsModuleProxy), eventLoop_); -#ifdef WORKLETS_BUNDLE_MODE_ENABLED + if (bundleModeEnabled) { + bundleModeInit(jsScheduler, script, sourceUrl, runtimeBindings); + } else { + legacyModeInit(); + } + + try { + memoryManager_->loadAllCustomSerializables(shared_from_this()); + } catch (jsi::JSError &e) { + throw std::runtime_error(std::string("[Worklets] Failed to load custom serializables. Reason: ") + e.getMessage()); + } +} + +void WorkletRuntime::bundleModeInit( + const std::shared_ptr &jsScheduler, + const std::shared_ptr &script, + const std::string &sourceUrl, + const std::shared_ptr &runtimeBindings) { + jsi::Runtime &rt = *runtime_; + if (!script) { throw std::runtime_error("[Worklets] Expected to receive the bundle, but got nullptr instead."); } @@ -130,9 +150,11 @@ void WorkletRuntime::init(std::shared_ptr jsiWorkletsMod } WorkletRuntimeDecorator::postEvaluateScript(rt, runtimeBindings); +} + +void WorkletRuntime::legacyModeInit() { + jsi::Runtime &rt = *runtime_; -#else - // Legacy behavior auto valueUnpackerBuffer = std::make_shared(ValueUnpackerCode); rt.evaluateJavaScript(valueUnpackerBuffer, "valueUnpacker"); @@ -141,12 +163,6 @@ void WorkletRuntime::init(std::shared_ptr jsiWorkletsMod auto customSerializableUnpackerBuffer = std::make_shared(CustomSerializableUnpackerCode); rt.evaluateJavaScript(customSerializableUnpackerBuffer, "customSerializableUnpacker"); -#endif // WORKLETS_BUNDLE_MODE_ENABLED - try { - memoryManager_->loadAllCustomSerializables(shared_from_this()); - } catch (jsi::JSError &e) { - throw std::runtime_error(std::string("[Worklets] Failed to load custom serializables. Reason: ") + e.getMessage()); - } } /* #region schedule */ diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h index f02335ffc338..51f0762c3673 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h @@ -4,12 +4,13 @@ #include #include #include - #include #include #include #include #include +#include +#include #include #include @@ -128,15 +129,6 @@ class WorkletRuntime : public jsi::HostObject, public std::enable_shared_from_th return name_; } - explicit WorkletRuntime( - RuntimeData::RuntimeId runtimeId, - const std::shared_ptr &jsQueue, - const std::string &name, - const std::shared_ptr &queue = nullptr, - bool enableEventLoop = true); - - void init(std::shared_ptr jsiWorkletsModuleProxy); - /* #region deprecated */ /** @deprecated Use `runSync` instead. */ @@ -173,12 +165,32 @@ class WorkletRuntime : public jsi::HostObject, public std::enable_shared_from_th #endif // NDEBUG private: + WorkletRuntime( + RuntimeData::RuntimeId runtimeId, + const std::shared_ptr &jsQueue, + const std::string &name, + const std::shared_ptr &queue = nullptr, + bool enableEventLoop = true); + + void init(std::shared_ptr jsiWorkletsModuleProxy); + + void bundleModeInit( + const std::shared_ptr &jsScheduler, + const std::shared_ptr &script, + const std::string &sourceUrl, + const std::shared_ptr &runtimeBindings); + + void legacyModeInit(); + const RuntimeData::RuntimeId runtimeId_; const std::shared_ptr runtimeMutex_; const std::shared_ptr runtime_; const std::string name_; std::shared_ptr queue_; std::shared_ptr eventLoop_; + + friend class WorkletsModuleProxy; + friend class RuntimeManager; }; // This function needs to be non-inline to avoid problems with dynamic_cast on diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp index 025795293d9e..64b64f8fd314 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp @@ -227,7 +227,6 @@ void WorkletRuntimeDecorator::decorate( }); } -#ifdef WORKLETS_BUNDLE_MODE_ENABLED void WorkletRuntimeDecorator::postEvaluateScript( jsi::Runtime &rt, const std::shared_ptr &runtimeBindings) { @@ -307,6 +306,5 @@ void WorkletRuntimeDecorator::installNetworking( Networking.asObject(rt).setProperty(rt, "clearCookies", std::move(jsiClearCookies)); } #endif // WORKLETS_FETCH_PREVIEW_ENABLED -#endif // WORKLETS_BUNDLE_MODE_ENABLED } // namespace worklets diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h index 871c20068847..515fe409f1ee 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h @@ -2,9 +2,7 @@ #include #include -#ifdef WORKLETS_BUNDLE_MODE_ENABLED #include -#endif // WORKLETS_BUNDLE_MODE_ENABLED #include @@ -25,14 +23,12 @@ class WorkletRuntimeDecorator { jsi::Object &&jsiWorkletsModuleProxy, const std::shared_ptr &eventLoop); -#ifdef WORKLETS_BUNDLE_MODE_ENABLED static void postEvaluateScript(jsi::Runtime &rt, const std::shared_ptr &runtimeBindings); private: #ifdef WORKLETS_FETCH_PREVIEW_ENABLED static void installNetworking(jsi::Runtime &rt, const std::shared_ptr &runtimeBindings); #endif // WORKLETS_FETCH_PREVIEW_ENABLED -#endif // WORKLETS_BUNDLE_MODE_ENABLED }; } // namespace worklets diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/android/JWorkletRuntimeWrapper.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/JWorkletRuntimeWrapper.cpp index bd770afdaf44..7d1b5f6f3d80 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/android/JWorkletRuntimeWrapper.cpp +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/android/JWorkletRuntimeWrapper.cpp @@ -1,4 +1,4 @@ -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED #include #include @@ -49,4 +49,4 @@ void JWorkletRuntimeWrapper::registerNatives() { } } // namespace worklets -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/android/JWorkletRuntimeWrapper.h b/packages/react-native-worklets/android/src/main/cpp/worklets/android/JWorkletRuntimeWrapper.h index 1f7ef8e699fd..8c333212f43e 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/android/JWorkletRuntimeWrapper.h +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/android/JWorkletRuntimeWrapper.h @@ -1,6 +1,6 @@ #pragma once -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED #include #include @@ -40,4 +40,4 @@ class JWorkletRuntimeWrapper : public jni::HybridClass { } // namespace worklets -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp index cf6817f22a3a..919e7b5f4ec2 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp @@ -5,8 +5,9 @@ #include #include #include +#include "worklets/WorkletRuntime/BundleModeConfig.h" -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED #include #include #include @@ -15,7 +16,7 @@ #include #include #include -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED #include #include @@ -46,15 +47,18 @@ WorkletsModule::WorkletsModule( getIsOnJSQueueThread(), std::make_shared(RuntimeBindings{ .requestAnimationFrame = getRequestAnimationFrame() -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED , .abortRequest = getAbortRequest(), .clearCookies = getClearCookies(), .sendRequest = getSendRequest() -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED }), - script, - sourceURL)) { + BundleModeConfig{ + .enabled = true, // TODO: temporary + .bundleURL = sourceURL, + .bundleScript = script, + })) { auto jsiWorkletsModuleProxy = workletsModuleProxy_->createJSIWorkletsModuleProxy(); auto optimizedJsiWorkletsModuleProxy = jsi_utils::optimizedFromHostObject( *rnRuntime_, std::static_pointer_cast(std::move(jsiWorkletsModuleProxy))); @@ -78,11 +82,9 @@ jni::local_ref WorkletsModule::initHybrid( std::shared_ptr script = nullptr; std::string sourceURL; -#ifdef WORKLETS_BUNDLE_MODE_ENABLED auto cxxWrapper = jScriptBufferWrapper->cthis(); script = cxxWrapper->getScript(); sourceURL = cxxWrapper->getSourceUrl(); -#endif // WORKLETS_BUNDLE_MODE_ENABLED return makeCxxInstance(jThis, rnRuntime, messageQueueThread, jsCallInvoker, uiScheduler, script, sourceURL); } @@ -95,7 +97,7 @@ RuntimeBindings::RequestAnimationFrame WorkletsModule::getRequestAnimationFrame( }; } -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED RuntimeBindings::AbortRequest WorkletsModule::getAbortRequest() { return [javaPart = javaPart_](jsi::Runtime &rt, double requestId) -> void { static const auto jAbortRequest = javaPart->getClass()->getMethod("abortRequest"); @@ -167,7 +169,7 @@ RuntimeBindings::SendRequest WorkletsModule::getSendRequest() { withCredentials); }; } -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED std::function WorkletsModule::getIsOnJSQueueThread() { return [javaPart = javaPart_]() -> bool { diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h index e8363d093ece..20dfd1657447 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h @@ -55,11 +55,11 @@ class WorkletsModule : public jni::HybridClass { } RuntimeBindings::RequestAnimationFrame getRequestAnimationFrame(); -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED RuntimeBindings::AbortRequest getAbortRequest(); RuntimeBindings::ClearCookies getClearCookies(); RuntimeBindings::SendRequest getSendRequest(); -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED std::function getIsOnJSQueueThread(); diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp index 8afa313b1351..8c9e38a26dea 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp @@ -12,8 +12,8 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { worklets::AndroidUIScheduler::registerNatives(); worklets::AnimationFrameCallback::registerNatives(); worklets::JScriptBufferWrapper::registerNatives(); -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED worklets::JWorkletRuntimeWrapper::registerNatives(); -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED }); } diff --git a/packages/react-native-worklets/android/src/networking/com/swmansion/worklets/WorkletsModule.java b/packages/react-native-worklets/android/src/networking/com/swmansion/worklets/WorkletsModule.java index bb953f63a3c8..849acd226c69 100644 --- a/packages/react-native-worklets/android/src/networking/com/swmansion/worklets/WorkletsModule.java +++ b/packages/react-native-worklets/android/src/networking/com/swmansion/worklets/WorkletsModule.java @@ -67,7 +67,7 @@ public WorkletsModule(ReactApplicationContext reactContext) { @OptIn(markerClass = FrameworkAPI.class) @ReactMethod(isBlockingSynchronousMethod = true) - public boolean installTurboModule() { + public boolean installTurboModule(boolean bundleModeEnabled) { var context = getReactApplicationContext(); context.assertOnJSQueueThread(); diff --git a/packages/react-native-worklets/android/src/no-networking/com/swmansion/worklets/WorkletsModule.java b/packages/react-native-worklets/android/src/no-networking/com/swmansion/worklets/WorkletsModule.java index 3fb0d925d7e9..4700f8325711 100644 --- a/packages/react-native-worklets/android/src/no-networking/com/swmansion/worklets/WorkletsModule.java +++ b/packages/react-native-worklets/android/src/no-networking/com/swmansion/worklets/WorkletsModule.java @@ -62,7 +62,7 @@ public WorkletsModule(ReactApplicationContext reactContext) { @OptIn(markerClass = FrameworkAPI.class) @ReactMethod(isBlockingSynchronousMethod = true) - public boolean installTurboModule() { + public boolean installTurboModule(boolean bundleModeEnabled) { var context = getReactApplicationContext(); context.assertOnJSQueueThread(); diff --git a/packages/react-native-worklets/apple/worklets/apple/Networking/WorkletsNetworking.h b/packages/react-native-worklets/apple/worklets/apple/Networking/WorkletsNetworking.h index 7453a2d95b0d..aec9aed02a29 100644 --- a/packages/react-native-worklets/apple/worklets/apple/Networking/WorkletsNetworking.h +++ b/packages/react-native-worklets/apple/worklets/apple/Networking/WorkletsNetworking.h @@ -1,4 +1,6 @@ -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#pragma once + +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED /* * This file is based on RCTNetworking.h from React Native. */ @@ -19,4 +21,5 @@ using namespace facebook; - (void)jsiClearCookies:(jsi::Runtime &)rt responseSender:(jsi::Function &&)responseSender; @end -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) + +#endif // WORKLETS_FETCH_PREVIEW_ENABLED diff --git a/packages/react-native-worklets/apple/worklets/apple/Networking/WorkletsNetworking.mm b/packages/react-native-worklets/apple/worklets/apple/Networking/WorkletsNetworking.mm index 638d4be33bfe..2ea7a712aa39 100644 --- a/packages/react-native-worklets/apple/worklets/apple/Networking/WorkletsNetworking.mm +++ b/packages/react-native-worklets/apple/worklets/apple/Networking/WorkletsNetworking.mm @@ -1,7 +1,7 @@ -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) /* * This file is based on RCTNetworking.mm from React Native. */ +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED #import @@ -703,4 +703,5 @@ - (void)emitDeviceEvent:(NSString *)eventName argFactory:(id)argFactory rt:(face } @end -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) + +#endif // WORKLETS_FETCH_PREVIEW_ENABLED diff --git a/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm b/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm index 16bb9b2a2ca1..99493500f23d 100644 --- a/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm +++ b/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm @@ -14,12 +14,12 @@ #import #import -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED #import #import #import #import -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED using namespace worklets; @@ -30,9 +30,9 @@ - (void *)runtime; @implementation WorkletsModule { AnimationFrameQueue *animationFrameQueue_; std::shared_ptr workletsModuleProxy_; -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED WorkletsNetworking *workletsNetworking_; -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED #ifndef NDEBUG SingleInstanceChecker singleInstanceChecker_; #endif // NDEBUG @@ -52,13 +52,13 @@ - (void)checkBridgeless @synthesize bundleManager = bundleManager_; @synthesize callInvoker = callInvoker_; -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED @synthesize moduleRegistry = moduleRegistry_; -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED RCT_EXPORT_MODULE(WorkletsModule); -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(installTurboModule) +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(installTurboModule:(BOOL)bundleModeEnabled) { react_native_assert(self.bridge != nullptr); [self checkBridgeless]; @@ -73,24 +73,17 @@ - (void)checkBridgeless std::string sourceURL = ""; std::shared_ptr script = nullptr; -#ifdef WORKLETS_BUNDLE_MODE_ENABLED -#if defined(WORKLETS_FETCH_PREVIEW_ENABLED) + + if(bundleModeEnabled) { + NSURL *url = bundleManager_.bundleURL; + script = [self getBundleScript:url]; + sourceURL = [[url absoluteString] UTF8String]; + } + +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED id networkingModule = [moduleRegistry_ moduleForClass:RCTNetworking.class]; workletsNetworking_ = [[WorkletsNetworking alloc] init:networkingModule]; -#endif // defined(WORKLETS_FETCH_PREVIEW_ENABLED) - NSURL *url = bundleManager_.bundleURL; - NSData *data = [NSData dataWithContentsOfURL:url]; - if (data) { - auto str = std::string(reinterpret_cast([data bytes]), [data length]); - auto bigString = std::make_shared(str); - script = std::make_shared(bigString); - } else { - NSString *errorMsg = [NSString stringWithFormat:@"[Worklets] Failed to load worklets bundle from URL: %@", url]; - NSLog(@"%@", errorMsg); - throw std::runtime_error([errorMsg UTF8String]); - } - sourceURL = [[url absoluteString] UTF8String]; -#endif // WORKLETS_BUNDLE_MODE_ENABLED +#endif // WORKLETS_FETCH_PREVIEW_ENABLED auto jsCallInvoker = callInvoker_.callInvoker; auto uiScheduler = std::make_shared(); @@ -101,7 +94,7 @@ - (void)checkBridgeless auto runtimeBindings = [self getRuntimeBindings]; workletsModuleProxy_ = std::make_shared( - rnRuntime, jsQueue, jsCallInvoker, uiScheduler, std::move(isJavaScriptQueue), runtimeBindings, script, sourceURL); + rnRuntime, jsQueue, jsCallInvoker, uiScheduler, std::move(isJavaScriptQueue), runtimeBindings, BundleModeConfig{.enabled = bundleModeEnabled, .bundleURL = sourceURL, .bundleScript = script}); auto jsiWorkletsModuleProxy = workletsModuleProxy_->createJSIWorkletsModuleProxy(); auto optimizedJsiWorkletsModuleProxy = jsi_utils::optimizedFromHostObject( rnRuntime, std::static_pointer_cast(std::move(jsiWorkletsModuleProxy))); @@ -133,6 +126,21 @@ - (void)invalidate return std::make_shared(params); } +- (std::shared_ptr)getBundleScript:(NSURL *)url +{ + NSData *data = [NSData dataWithContentsOfURL:url]; + + if (!data) [[unlikely]] { + NSString *errorMsg = [NSString stringWithFormat:@"[Worklets] Failed to load worklets bundle from URL: %@", url]; + NSLog(@"%@", errorMsg); + throw std::runtime_error([errorMsg UTF8String]); + } + + auto str = std::string(reinterpret_cast([data bytes]), [data length]); + auto bigString = std::make_shared(str); + return std::make_shared(bigString); +} + - (std::shared_ptr)getRuntimeBindings { return std::make_shared(RuntimeBindings{ @@ -140,7 +148,7 @@ - (void)invalidate animationFrameQueue_](std::function &&callback) -> void { [animationFrameQueue requestAnimationFrame:callback]; } -#if defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#ifdef WORKLETS_FETCH_PREVIEW_ENABLED , .abortRequest = [workletsNetworking = workletsNetworking_](jsi::Runtime &rt, const jsi::Value &requestID) { @@ -158,7 +166,7 @@ - (void)invalidate [workletsNetworking jsiSendRequest:rt jquery:query responseSender:(std::move(responseSender))]; return jsi::Value::undefined(); } -#endif // defined(WORKLETS_BUNDLE_MODE_ENABLED) && defined(WORKLETS_FETCH_PREVIEW_ENABLED) +#endif // WORKLETS_FETCH_PREVIEW_ENABLED }); } diff --git a/packages/react-native-worklets/src/WorkletsModule/NativeWorklets.native.ts b/packages/react-native-worklets/src/WorkletsModule/NativeWorklets.native.ts index 816161814e8b..cd67b57ca58e 100644 --- a/packages/react-native-worklets/src/WorkletsModule/NativeWorklets.native.ts +++ b/packages/react-native-worklets/src/WorkletsModule/NativeWorklets.native.ts @@ -20,13 +20,14 @@ class NativeWorklets implements IWorkletsModule { #serializableFalse: SerializableRef; constructor() { + const bundleModeEnabled = globalThis._WORKLETS_BUNDLE_MODE_ENABLED ?? false; globalThis._WORKLETS_VERSION_JS = jsVersion; if ( global.__workletsModuleProxy === undefined && globalThis.__RUNTIME_KIND === RuntimeKind.ReactNative ) { - WorkletsTurboModule?.installTurboModule(); - if (__DEV__ && globalThis._WORKLETS_BUNDLE_MODE_ENABLED) { + WorkletsTurboModule?.installTurboModule(bundleModeEnabled); + if (__DEV__ && bundleModeEnabled) { console.log( '[Worklets] Bundle mode initialization: Downloaded the bundle for Worklet Runtimes.' ); diff --git a/packages/react-native-worklets/src/specs/NativeWorkletsModule.ts b/packages/react-native-worklets/src/specs/NativeWorkletsModule.ts index 4a5d6ad793b5..05dab92f8929 100644 --- a/packages/react-native-worklets/src/specs/NativeWorkletsModule.ts +++ b/packages/react-native-worklets/src/specs/NativeWorkletsModule.ts @@ -3,7 +3,7 @@ import { type TurboModule, TurboModuleRegistry } from 'react-native'; export interface Spec extends TurboModule { - installTurboModule: () => boolean; + installTurboModule: (bundleModeEnabled: boolean) => boolean; } export default TurboModuleRegistry.get('WorkletsModule'); From 56b07b73b2543055d46fba612c4fc68a13f6866e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Fri, 13 Mar 2026 19:14:58 +0100 Subject: [PATCH 2/8] feat: make all compilation good --- apps/fabric-example/ios/Podfile.lock | 8 +- apps/macos-example/macos/Podfile.lock | 2 +- apps/tvos-example/ios/Podfile.lock | 2 +- .../NativeModules/JSIWorkletsModuleProxy.cpp | 4 +- .../NativeModules/JSIWorkletsModuleProxy.h | 4 +- .../WorkletRuntime/BundleModeConfig.h | 7 +- .../WorkletRuntime/RuntimeManager.cpp | 1 - .../WorkletRuntime/WorkletRuntime.cpp | 2 - .../react-native-worklets/RNWorklets.podspec | 3 +- .../android/CMakeLists.txt | 3 - .../android/build.gradle | 3 - .../cpp/worklets/android/WorkletsModule.cpp | 36 +-- .../cpp/worklets/android/WorkletsModule.h | 7 +- .../swmansion/worklets/WorkletsModule.java | 4 +- .../swmansion/worklets/WorkletsModule.java | 4 +- .../apple/worklets/apple/WorkletsModule.mm | 24 +- .../scripts/worklets_utils.rb | 2 - .../src/featureFlags/staticFlags.json | 1 - .../src/featureFlags/types.ts | 1 - yarn.lock | 237 +++++++++++++++++- 20 files changed, 299 insertions(+), 56 deletions(-) diff --git a/apps/fabric-example/ios/Podfile.lock b/apps/fabric-example/ios/Podfile.lock index 0633af6d8a80..fd0aaaee9934 100644 --- a/apps/fabric-example/ios/Podfile.lock +++ b/apps/fabric-example/ios/Podfile.lock @@ -2456,7 +2456,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FBLazyVector: 4815a9b6c97de1f17c88b3cf7047fc0aa0018fb8 - hermes-engine: 371db9921d7c37c3b2a8d04b8cbe31156f0a277a + hermes-engine: 9f864e304a78a35e15543a8fcd93c2850e11cfe6 MMKVCore: f2dd4c9befea04277a55e84e7812f930537993df NitroMmkv: ca0b67493c62d3f2b29457569ee48d24a1f7afd5 NitroModules: 42fb1740701d25672d7531652987eca15bbb181e @@ -2468,7 +2468,7 @@ SPEC CHECKSUMS: React: ce3b89b04d579b21ba990ff07a1d4cf0a68588dd React-callinvoker: 30be38ed761abcb8ae7edaa39e34cb9aade4b33b React-Core: 59c718ce09b1b83d4f07c0112b9c5f99ea39ee94 - React-Core-prebuilt: a76ea4e98bff53e6d1d86863e110eb50efc86fa8 + React-Core-prebuilt: 8b3b621447332c61506e40260403fc71d783c4e0 React-CoreModules: bcb9314b39eaa9134487be0cb8c8ee4a6d2e5cd9 React-cxxreact: fee24034f430cfbcbedced4157eacd2be7ced010 React-debug: 5138aa953fe4a9db1690681de71577dd3b4f05b1 @@ -2530,7 +2530,7 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: dd8001caba9cb3fbe49a61d234262eaaa3d67aee ReactCodegen: 3e81858c6242de4bbde48ee222523fe45c41a21a ReactCommon: 2f76f91c78f14d4a2c3bc841842a6145d3e99038 - ReactNativeDependencies: 1cc786bff619de11c58e19290cbdf3a38d0cadc7 + ReactNativeDependencies: e8ba825d80e7c478c81d6075a56ff068ca9da99e RNCAsyncStorage: 2ad919e88b8bc2cd80e8697ce66d04d006743283 RNCClipboard: 715fa7c6c8366f17d00f05a439ee7488f390fa5f RNCMaskedView: eb2b2e538afa907f05a5848a1a1ac26092e6fec9 @@ -2538,7 +2538,7 @@ SPEC CHECKSUMS: RNReanimated: c2e7905ab97eb558cfe8e7f49f657559449af983 RNScreens: 6ddda03d6564ca1dbde5754fe8effa9ac2cdb091 RNSVG: f21bef0d41b6495cdd8db5cb010b18bee378152c - RNWorklets: e09e367e33ed0683450d641734215b0c77fd759e + RNWorklets: 27192e240a1512153992300e6c75a4820d481fa4 Yoga: 1bf7ba0aa6156e76d0f34c1de341508d40855f9f PODFILE CHECKSUM: 5a5e231e2fd86b91c7e0a93852f5aa6de886161f diff --git a/apps/macos-example/macos/Podfile.lock b/apps/macos-example/macos/Podfile.lock index 02878bbe6769..81bb645c923f 100644 --- a/apps/macos-example/macos/Podfile.lock +++ b/apps/macos-example/macos/Podfile.lock @@ -2322,7 +2322,7 @@ SPEC CHECKSUMS: RNGestureHandler: 0397fea67f39d5a2d17fcf4a028e206f7ba098ba RNReanimated: cc397a8fd73be06222f48adf8aa2a4a81f594cc4 RNSVG: daa45ddcc2e01ef3eb8d20f59c29beb68cec3933 - RNWorklets: 47753d4cbcd68a34386b5fff68c9eff69a4b9b99 + RNWorklets: e8ded71d1334b4dd663b4f4801e9bd7b77a9999f SocketRocket: 03f7111df1a343b162bf5b06ead333be808e1e0a Yoga: 45ce05cb11db042ba2e5e51a2dfaf0ff63d269f9 diff --git a/apps/tvos-example/ios/Podfile.lock b/apps/tvos-example/ios/Podfile.lock index ce5b0ca49c90..28453a78f929 100644 --- a/apps/tvos-example/ios/Podfile.lock +++ b/apps/tvos-example/ios/Podfile.lock @@ -2732,7 +2732,7 @@ SPEC CHECKSUMS: ReactCodegen: f4d6e6fd5140eade461ffb5579795197956868c8 ReactCommon: c178596d3ef05508bb6c0f88bfbbc281b5c4222b RNReanimated: 98cca9d12c28c89aa7743bbc5b3d3d127a29ab1d - RNWorklets: a0f85f091f2c735dd531fa6abed05558dafacde0 + RNWorklets: bc095945cd78293e07cf2578aa06ac27fdc795c7 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: 0e792f39294e864568930600eeb71135364f777d diff --git a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp index 1b7f3338280c..45ffbf61f8ec 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp @@ -11,13 +11,13 @@ #include #include #include +#include #include #include #include #include #include -#include "worklets/WorkletRuntime/BundleModeConfig.h" using namespace facebook; @@ -213,6 +213,8 @@ std::vector JSIWorkletsModuleProxy::getPropertyNames(jsi::Runti propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "synchronizableLock")); propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "synchronizableUnlock")); + propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "createShareable")); + propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "propagateModuleUpdate")); propertyNames.emplace_back(jsi::PropNameID::forAscii(rt, "getUIRuntimeHolder")); diff --git a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h index 5eda7f691be0..ab14ee691bc1 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h +++ b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h @@ -65,11 +65,11 @@ class JSIWorkletsModuleProxy : public jsi::HostObject { } [[nodiscard]] std::shared_ptr getScript() const { - return bundleModeConfig_.bundleScript; + return bundleModeConfig_.script; } [[nodiscard]] std::string getSourceUrl() const { - return bundleModeConfig_.bundleURL; + return bundleModeConfig_.sourceURL; } [[nodiscard]] std::shared_ptr getMemoryManager() const { diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h index 4d3ca4fce317..7bf7021bb286 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h @@ -3,12 +3,15 @@ #include #include +#include +#include + namespace worklets { struct BundleModeConfig { bool enabled; - std::string bundleURL; - std::shared_ptr bundleScript; + std::shared_ptr script; + std::string sourceURL; }; } // namespace worklets diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp index 338dadedb037..c2c4950168c3 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp @@ -5,7 +5,6 @@ #include #include #include -#include "worklets/WorkletRuntime/WorkletRuntime.h" namespace worklets { diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp index a5bc35e03990..452b87b3e782 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp @@ -17,8 +17,6 @@ #include #include #include -#include "worklets/Tools/JSScheduler.h" -#include "worklets/Tools/ScriptBuffer.h" #if JS_RUNTIME_HERMES #include diff --git a/packages/react-native-worklets/RNWorklets.podspec b/packages/react-native-worklets/RNWorklets.podspec index f4e5e176f303..08806ea3bb58 100644 --- a/packages/react-native-worklets/RNWorklets.podspec +++ b/packages/react-native-worklets/RNWorklets.podspec @@ -13,7 +13,6 @@ ios_min_version = '13.4' feature_flags = $worklets_config[:feature_flags_flag] version_flags = "-DWORKLETS_VERSION=#{package['version']} -DREACT_NATIVE_MINOR_VERSION=#{$worklets_config[:react_native_minor_version]}" worklets_profiling_flag = ENV['IS_WORKLETS_PROFILING'] ? '-DWORKLETS_PROFILING' : '' -bundle_mode_flag = $worklets_config[:bundle_mode_flag] fetch_preview_flag = $worklets_config[:fetch_preview_flag] hermes_v1_flag = ENV['RCT_HERMES_V1_ENABLED'] == '1' ? '-DHERMES_V1_ENABLED' : '' @@ -76,7 +75,7 @@ Pod::Spec.new do |s| "CLANG_CXX_LANGUAGE_STANDARD" => "c++20", "GCC_PREPROCESSOR_DEFINITIONS[config=*Debug*]" => "$(inherited) #{hermes_debug_hidden_flags}", "GCC_PREPROCESSOR_DEFINITIONS[config=*Release*]" => "$(inherited)", - "OTHER_CFLAGS" => "$(inherited) #{feature_flags} #{version_flags} #{worklets_profiling_flag} #{bundle_mode_flag} #{fetch_preview_flag} #{hermes_v1_flag}", + "OTHER_CFLAGS" => "$(inherited) #{feature_flags} #{version_flags} #{worklets_profiling_flag} #{fetch_preview_flag} #{hermes_v1_flag}", } s.xcconfig = { "HEADER_SEARCH_PATHS" => [ diff --git a/packages/react-native-worklets/android/CMakeLists.txt b/packages/react-native-worklets/android/CMakeLists.txt index 40a5fa103cdf..681df14616df 100644 --- a/packages/react-native-worklets/android/CMakeLists.txt +++ b/packages/react-native-worklets/android/CMakeLists.txt @@ -32,9 +32,6 @@ endif() if(${IS_REANIMATED_EXAMPLE_APP}) string(APPEND CMAKE_CXX_FLAGS " -DIS_REANIMATED_EXAMPLE_APP -Wpedantic") endif() -if(${WORKLETS_BUNDLE_MODE_ENABLED}) - string(APPEND CMAKE_CXX_FLAGS " -DWORKLETS_BUNDLE_MODE_ENABLED") -endif() if(${WORKLETS_FETCH_PREVIEW_ENABLED}) string(APPEND CMAKE_CXX_FLAGS " -DWORKLETS_FETCH_PREVIEW_ENABLED") endif() diff --git a/packages/react-native-worklets/android/build.gradle b/packages/react-native-worklets/android/build.gradle index 7c55d7489f99..e189e1ca5840 100644 --- a/packages/react-native-worklets/android/build.gradle +++ b/packages/react-native-worklets/android/build.gradle @@ -122,7 +122,6 @@ def REACT_NATIVE_VERSION = getReactNativeVersion() def WORKLETS_VERSION = getWorkletsVersion() def IS_NEW_ARCHITECTURE_ENABLED = isNewArchitectureEnabled() def IS_REANIMATED_EXAMPLE_APP = safeAppExtGet("isReanimatedExampleApp", false) -def BUNDLE_MODE_ENABLED = isFlagEnabled(featureFlags, "BUNDLE_MODE_ENABLED"); def FETCH_PREVIEW_ENABLED = isFlagEnabled(featureFlags, "FETCH_PREVIEW_ENABLED"); def WORKLETS_FEATURE_FLAGS = getStaticFeatureFlagsString(featureFlags) def HERMES_V1_ENABLED = getHermesV1Enabled() @@ -213,7 +212,6 @@ android { buildConfigField("boolean", "IS_INTERNAL_BUILD", "false") buildConfigField("int", "EXOPACKAGE_FLAGS", "0") buildConfigField("int", "REACT_NATIVE_MINOR_VERSION", REACT_NATIVE_MINOR_VERSION.toString()) - buildConfigField("boolean", "BUNDLE_MODE_ENABLED", BUNDLE_MODE_ENABLED.toString()) externalNativeBuild { cmake { @@ -223,7 +221,6 @@ android { "-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}", "-DJS_RUNTIME=${JS_RUNTIME}", "-DIS_REANIMATED_EXAMPLE_APP=${IS_REANIMATED_EXAMPLE_APP}", - "-DWORKLETS_BUNDLE_MODE_ENABLED=${BUNDLE_MODE_ENABLED}", "-DWORKLETS_FETCH_PREVIEW_ENABLED=${FETCH_PREVIEW_ENABLED}", "-DWORKLETS_PROFILING=${WORKLETS_PROFILING}", "-DWORKLETS_VERSION=${WORKLETS_VERSION}", diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp index 919e7b5f4ec2..8c7f30f6ed45 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp @@ -1,11 +1,11 @@ #include #include #include +#include #include #include #include #include -#include "worklets/WorkletRuntime/BundleModeConfig.h" #ifdef WORKLETS_FETCH_PREVIEW_ENABLED #include @@ -30,13 +30,12 @@ using namespace react; WorkletsModule::WorkletsModule( jni::alias_ref jThis, // NOLINT //(performance-unnecessary-value-param) + const BundleModeConfig &bundleModeConfig, jsi::Runtime *rnRuntime, jni::alias_ref messageQueueThread, // NOLINT //(performance-unnecessary-value-param) const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &uiScheduler, - const std::shared_ptr &script, - const std::string &sourceURL) + const std::shared_ptr &uiScheduler) : javaPart_(jni::make_global(jThis)), rnRuntime_(rnRuntime), workletsModuleProxy_(std::make_shared( @@ -54,11 +53,7 @@ WorkletsModule::WorkletsModule( .sendRequest = getSendRequest() #endif // WORKLETS_FETCH_PREVIEW_ENABLED }), - BundleModeConfig{ - .enabled = true, // TODO: temporary - .bundleURL = sourceURL, - .bundleScript = script, - })) { + bundleModeConfig)) { auto jsiWorkletsModuleProxy = workletsModuleProxy_->createJSIWorkletsModuleProxy(); auto optimizedJsiWorkletsModuleProxy = jsi_utils::optimizedFromHostObject( *rnRuntime_, std::static_pointer_cast(std::move(jsiWorkletsModuleProxy))); @@ -68,6 +63,7 @@ WorkletsModule::WorkletsModule( jni::local_ref WorkletsModule::initHybrid( jni::alias_ref jThis, // NOLINT //(performance-unnecessary-value-param) + jboolean bundleModeEnabled, jlong jsContext, jni::alias_ref messageQueueThread, // NOLINT //(performance-unnecessary-value-param) @@ -82,11 +78,23 @@ jni::local_ref WorkletsModule::initHybrid( std::shared_ptr script = nullptr; std::string sourceURL; - auto cxxWrapper = jScriptBufferWrapper->cthis(); - script = cxxWrapper->getScript(); - sourceURL = cxxWrapper->getSourceUrl(); - - return makeCxxInstance(jThis, rnRuntime, messageQueueThread, jsCallInvoker, uiScheduler, script, sourceURL); + if (bundleModeEnabled) { + auto cxxWrapper = jScriptBufferWrapper->cthis(); + script = cxxWrapper->getScript(); + sourceURL = cxxWrapper->getSourceUrl(); + } + + return makeCxxInstance( + jThis, + BundleModeConfig{ + .enabled = static_cast(bundleModeEnabled), + .script = script, + .sourceURL = sourceURL, + }, + rnRuntime, + messageQueueThread, + jsCallInvoker, + uiScheduler); } RuntimeBindings::RequestAnimationFrame WorkletsModule::getRequestAnimationFrame() { diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h index 20dfd1657447..96f20ec6bbfb 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,7 @@ class WorkletsModule : public jni::HybridClass { static jni::local_ref initHybrid( jni::alias_ref jThis, + jboolean bundleModeEnabled, jlong jsContext, jni::alias_ref messageQueueThread, jni::alias_ref jsCallInvokerHolder, @@ -40,12 +42,11 @@ class WorkletsModule : public jni::HybridClass { private: explicit WorkletsModule( jni::alias_ref jThis, + const BundleModeConfig &bundleModeConfig, jsi::Runtime *rnRuntime, jni::alias_ref messageQueueThread, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &uiScheduler, - const std::shared_ptr &script, - const std::string &sourceURL); + const std::shared_ptr &uiScheduler); void invalidateCpp(); diff --git a/packages/react-native-worklets/android/src/networking/com/swmansion/worklets/WorkletsModule.java b/packages/react-native-worklets/android/src/networking/com/swmansion/worklets/WorkletsModule.java index 849acd226c69..6294cde6e7d8 100644 --- a/packages/react-native-worklets/android/src/networking/com/swmansion/worklets/WorkletsModule.java +++ b/packages/react-native-worklets/android/src/networking/com/swmansion/worklets/WorkletsModule.java @@ -49,6 +49,7 @@ protected HybridData getHybridData() { @OptIn(markerClass = FrameworkAPI.class) private native HybridData initHybrid( + boolean bundleModeEnabled, long jsContext, MessageQueueThread messageQueueThread, CallInvokerHolderImpl jsCallInvokerHolder, @@ -78,12 +79,13 @@ public boolean installTurboModule(boolean bundleModeEnabled) { var sourceURL = context.getSourceURL(); ScriptBufferWrapper scriptBufferWrapper = null; - if (BuildConfig.BUNDLE_MODE_ENABLED) { + if (bundleModeEnabled) { scriptBufferWrapper = new ScriptBufferWrapper(sourceURL, context.getAssets()); } mHybridData = initHybrid( + bundleModeEnabled, jsContext, mMessageQueueThread, jsCallInvokerHolder, diff --git a/packages/react-native-worklets/android/src/no-networking/com/swmansion/worklets/WorkletsModule.java b/packages/react-native-worklets/android/src/no-networking/com/swmansion/worklets/WorkletsModule.java index 4700f8325711..b9a5df4460c6 100644 --- a/packages/react-native-worklets/android/src/no-networking/com/swmansion/worklets/WorkletsModule.java +++ b/packages/react-native-worklets/android/src/no-networking/com/swmansion/worklets/WorkletsModule.java @@ -45,6 +45,7 @@ protected HybridData getHybridData() { @OptIn(markerClass = FrameworkAPI.class) private native HybridData initHybrid( + boolean bundleModeEnabled, long jsContext, MessageQueueThread messageQueueThread, CallInvokerHolderImpl jsCallInvokerHolder, @@ -73,12 +74,13 @@ public boolean installTurboModule(boolean bundleModeEnabled) { var sourceURL = context.getSourceURL(); ScriptBufferWrapper scriptBufferWrapper = null; - if (BuildConfig.BUNDLE_MODE_ENABLED) { + if (bundleModeEnabled) { scriptBufferWrapper = new ScriptBufferWrapper(sourceURL, context.getAssets()); } mHybridData = initHybrid( + bundleModeEnabled, jsContext, mMessageQueueThread, jsCallInvokerHolder, diff --git a/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm b/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm index 99493500f23d..ee044bda7cd2 100644 --- a/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm +++ b/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm @@ -58,7 +58,7 @@ - (void)checkBridgeless RCT_EXPORT_MODULE(WorkletsModule); -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(installTurboModule:(BOOL)bundleModeEnabled) +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(installTurboModule : (BOOL)bundleModeEnabled) { react_native_assert(self.bridge != nullptr); [self checkBridgeless]; @@ -74,9 +74,9 @@ - (void)checkBridgeless std::string sourceURL = ""; std::shared_ptr script = nullptr; - if(bundleModeEnabled) { + if (bundleModeEnabled) { NSURL *url = bundleManager_.bundleURL; - script = [self getBundleScript:url]; + script = [self getScript:url]; sourceURL = [[url absoluteString] UTF8String]; } @@ -94,7 +94,13 @@ - (void)checkBridgeless auto runtimeBindings = [self getRuntimeBindings]; workletsModuleProxy_ = std::make_shared( - rnRuntime, jsQueue, jsCallInvoker, uiScheduler, std::move(isJavaScriptQueue), runtimeBindings, BundleModeConfig{.enabled = bundleModeEnabled, .bundleURL = sourceURL, .bundleScript = script}); + rnRuntime, + jsQueue, + jsCallInvoker, + uiScheduler, + std::move(isJavaScriptQueue), + runtimeBindings, + BundleModeConfig{.enabled = bundleModeEnabled, .script = script, .sourceURL = sourceURL}); auto jsiWorkletsModuleProxy = workletsModuleProxy_->createJSIWorkletsModuleProxy(); auto optimizedJsiWorkletsModuleProxy = jsi_utils::optimizedFromHostObject( rnRuntime, std::static_pointer_cast(std::move(jsiWorkletsModuleProxy))); @@ -126,19 +132,19 @@ - (void)invalidate return std::make_shared(params); } -- (std::shared_ptr)getBundleScript:(NSURL *)url +- (std::shared_ptr)getScript:(NSURL *)url { NSData *data = [NSData dataWithContentsOfURL:url]; if (!data) [[unlikely]] { - NSString *errorMsg = [NSString stringWithFormat:@"[Worklets] Failed to load worklets bundle from URL: %@", url]; + NSString *errorMsg = [NSString stringWithFormat:@"[Worklets] Failed to load worklets bundle from URL: %@", url]; NSLog(@"%@", errorMsg); throw std::runtime_error([errorMsg UTF8String]); } - auto str = std::string(reinterpret_cast([data bytes]), [data length]); - auto bigString = std::make_shared(str); - return std::make_shared(bigString); + auto str = std::string(reinterpret_cast([data bytes]), [data length]); + auto bigString = std::make_shared(str); + return std::make_shared(bigString); } - (std::shared_ptr)getRuntimeBindings diff --git a/packages/react-native-worklets/scripts/worklets_utils.rb b/packages/react-native-worklets/scripts/worklets_utils.rb index 4ccf94fdf8d3..ffc4b4a07218 100644 --- a/packages/react-native-worklets/scripts/worklets_utils.rb +++ b/packages/react-native-worklets/scripts/worklets_utils.rb @@ -8,7 +8,6 @@ def worklets_try_to_parse_react_native_package_json(node_modules_dir) def worklets_find_config() result = { - :bundle_mode_flag => nil, :feature_flags_flag => nil, :fetch_preview_flag => nil, :is_reanimated_example_app => nil, @@ -48,7 +47,6 @@ def worklets_find_config() feature_flags = worklets_get_static_feature_flags() result[:feature_flags_flag] = worklets_get_static_feature_flags_flag(feature_flags) - result[:bundle_mode_flag] = worklets_get_flag_from_feature_flags(feature_flags, 'BUNDLE_MODE_ENABLED') result[:fetch_preview_flag] = worklets_get_flag_from_feature_flags(feature_flags, 'FETCH_PREVIEW_ENABLED') return result diff --git a/packages/react-native-worklets/src/featureFlags/staticFlags.json b/packages/react-native-worklets/src/featureFlags/staticFlags.json index 73b8e600d8c8..18b52f8c5b60 100644 --- a/packages/react-native-worklets/src/featureFlags/staticFlags.json +++ b/packages/react-native-worklets/src/featureFlags/staticFlags.json @@ -1,6 +1,5 @@ { "RUNTIME_TEST_FLAG": false, - "BUNDLE_MODE_ENABLED": false, "FETCH_PREVIEW_ENABLED": false, "IOS_DYNAMIC_FRAMERATE_ENABLED": true } diff --git a/packages/react-native-worklets/src/featureFlags/types.ts b/packages/react-native-worklets/src/featureFlags/types.ts index 545fa6032c76..5d35f5bc2aa8 100644 --- a/packages/react-native-worklets/src/featureFlags/types.ts +++ b/packages/react-native-worklets/src/featureFlags/types.ts @@ -21,7 +21,6 @@ export type DynamicFlagName = keyof Omit< */ export const DefaultStaticFeatureFlags = { RUNTIME_TEST_FLAG: false, - BUNDLE_MODE_ENABLED: false, FETCH_PREVIEW_ENABLED: false, IOS_DYNAMIC_FRAMERATE_ENABLED: true, } as const satisfies typeof StaticFeatureFlagsJSON; diff --git a/yarn.lock b/yarn.lock index adddc1f5be15..df3630235218 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22799,6 +22799,18 @@ __metadata: languageName: node linkType: hard +"metro-babel-transformer@npm:0.83.5": + version: 0.83.5 + resolution: "metro-babel-transformer@npm:0.83.5" + dependencies: + "@babel/core": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + hermes-parser: "npm:0.33.3" + nullthrows: "npm:^1.1.1" + checksum: 10/2a7664a55a5c3f276c884288978bf2fb4d5f5a5137f3769d5fdfd79d6a2f0027475b0d8a19ff1d8b3d39b91f4bb7c54dbd191f7d671d776ccd4a84183f69aee2 + languageName: node + linkType: hard + "metro-babel-transformer@npm:0.84.2": version: 0.84.2 resolution: "metro-babel-transformer@npm:0.84.2" @@ -22847,6 +22859,15 @@ __metadata: languageName: node linkType: hard +"metro-cache-key@npm:0.83.5": + version: 0.83.5 + resolution: "metro-cache-key@npm:0.83.5" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/704d0d8e06e8477d20c700cd5f729356aaa704999d4b80882b85aa21ccf7da13959dcd0760f9a456931466bf77dffe688f2a11f468aae5c074f74667957c6608 + languageName: node + linkType: hard + "metro-cache-key@npm:0.84.2": version: 0.84.2 resolution: "metro-cache-key@npm:0.84.2" @@ -22904,6 +22925,18 @@ __metadata: languageName: node linkType: hard +"metro-cache@npm:0.83.5": + version: 0.83.5 + resolution: "metro-cache@npm:0.83.5" + dependencies: + exponential-backoff: "npm:^3.1.1" + flow-enums-runtime: "npm:^0.0.6" + https-proxy-agent: "npm:^7.0.5" + metro-core: "npm:0.83.5" + checksum: 10/f2b3b9e85e46f262b0adeb36dcbd2e14692199ba834757013bc7fca200f66573ca1d3925090597326764f4efe57da3a1416b8b611cf83b6c965541a3c51af4f2 + languageName: node + linkType: hard + "metro-cache@npm:0.84.2": version: 0.84.2 resolution: "metro-cache@npm:0.84.2" @@ -22980,6 +23013,22 @@ __metadata: languageName: node linkType: hard +"metro-config@npm:0.83.5": + version: 0.83.5 + resolution: "metro-config@npm:0.83.5" + dependencies: + connect: "npm:^3.6.5" + flow-enums-runtime: "npm:^0.0.6" + jest-validate: "npm:^29.7.0" + metro: "npm:0.83.5" + metro-cache: "npm:0.83.5" + metro-core: "npm:0.83.5" + metro-runtime: "npm:0.83.5" + yaml: "npm:^2.6.1" + checksum: 10/d085f7cd50b7c8557bd5b105fb23551ac3915ef162b62443fb9c44d9e25d450e37a729177c1267063167b5445e779c136b9a123c2c968d9ddfe6f979fb3f9ae2 + languageName: node + linkType: hard + "metro-config@npm:0.84.2, metro-config@npm:^0.84.0": version: 0.84.2 resolution: "metro-config@npm:0.84.2" @@ -23040,6 +23089,17 @@ __metadata: languageName: node linkType: hard +"metro-core@npm:0.83.5": + version: 0.83.5 + resolution: "metro-core@npm:0.83.5" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + lodash.throttle: "npm:^4.1.1" + metro-resolver: "npm:0.83.5" + checksum: 10/a65e83fc73f2cc42f9ea72f9d6c976b2272c9c3477f17c6a1288497995a5572d2a89c2ebf29b8ff45195bde29b2ae90fa58b7238dfcfe07928289f58049c2842 + languageName: node + linkType: hard + "metro-core@npm:0.84.2, metro-core@npm:^0.84.0": version: 0.84.2 resolution: "metro-core@npm:0.84.2" @@ -23119,6 +23179,23 @@ __metadata: languageName: node linkType: hard +"metro-file-map@npm:0.83.5": + version: 0.83.5 + resolution: "metro-file-map@npm:0.83.5" + dependencies: + debug: "npm:^4.4.0" + fb-watchman: "npm:^2.0.0" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + nullthrows: "npm:^1.1.1" + walker: "npm:^1.0.7" + checksum: 10/0cce73c75bbf9b248628285554ddd73fce6f4e86ee4776c9f6b65fcf2cfd1f75b15e3f4cf2dc44ad91e5c78fc61a6eb7d3daaee09b61af2b55d82558a2b0423c + languageName: node + linkType: hard + "metro-file-map@npm:0.84.2": version: 0.84.2 resolution: "metro-file-map@npm:0.84.2" @@ -23176,6 +23253,16 @@ __metadata: languageName: node linkType: hard +"metro-minify-terser@npm:0.83.5": + version: 0.83.5 + resolution: "metro-minify-terser@npm:0.83.5" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + terser: "npm:^5.15.0" + checksum: 10/b9e257b5a74343a271e89603479775ed76b9c5e7b28015bafbce2afb4d7507acf36e897fc78c2ee571ad89951ba0ca708188ecb33fff0b947d1cee0ea8fd7837 + languageName: node + linkType: hard + "metro-minify-terser@npm:0.84.2": version: 0.84.2 resolution: "metro-minify-terser@npm:0.84.2" @@ -23271,6 +23358,15 @@ __metadata: languageName: node linkType: hard +"metro-resolver@npm:0.83.5": + version: 0.83.5 + resolution: "metro-resolver@npm:0.83.5" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/0ad900735aa3446d8e5b341ff921b990895bb26517be96530b2a7c21504a617fa079299447b5ea4e3014894c94bcab7da54d37cbdc00bcc0c54f5c645c1d42cd + languageName: node + linkType: hard + "metro-resolver@npm:0.84.2": version: 0.84.2 resolution: "metro-resolver@npm:0.84.2" @@ -23310,7 +23406,7 @@ __metadata: languageName: node linkType: hard -"metro-runtime@npm:0.83.3, metro-runtime@npm:^0.83.1, metro-runtime@npm:^0.83.3": +"metro-runtime@npm:0.83.3": version: 0.83.3 resolution: "metro-runtime@npm:0.83.3" dependencies: @@ -23320,6 +23416,16 @@ __metadata: languageName: node linkType: hard +"metro-runtime@npm:0.83.5, metro-runtime@npm:^0.83.1, metro-runtime@npm:^0.83.3": + version: 0.83.5 + resolution: "metro-runtime@npm:0.83.5" + dependencies: + "@babel/runtime": "npm:^7.25.0" + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/95a5f670fb2b230eea86e29833d0353c0fc845905fdae65c2f8a63c272ea095bf94976db7e28908bc6213ca22dffc21438eb18360321d92d8fb5aeb12a8d7520 + languageName: node + linkType: hard + "metro-runtime@npm:0.84.2, metro-runtime@npm:^0.84.0": version: 0.84.2 resolution: "metro-runtime@npm:0.84.2" @@ -23402,6 +23508,23 @@ __metadata: languageName: node linkType: hard +"metro-source-map@npm:0.83.5": + version: 0.83.5 + resolution: "metro-source-map@npm:0.83.5" + dependencies: + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-symbolicate: "npm:0.83.5" + nullthrows: "npm:^1.1.1" + ob1: "npm:0.83.5" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + checksum: 10/55e9562f95e1056b48bd4b705a8ff01998c0bb9da2166638141ce7404f8800caa5c7ba077ead999809245400e38bbff1e175c2feefd044ac78a69f9a69c73d3d + languageName: node + linkType: hard + "metro-source-map@npm:0.84.2, metro-source-map@npm:^0.84.0": version: 0.84.2 resolution: "metro-source-map@npm:0.84.2" @@ -23483,6 +23606,22 @@ __metadata: languageName: node linkType: hard +"metro-symbolicate@npm:0.83.5": + version: 0.83.5 + resolution: "metro-symbolicate@npm:0.83.5" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-source-map: "npm:0.83.5" + nullthrows: "npm:^1.1.1" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + bin: + metro-symbolicate: src/index.js + checksum: 10/56cab184eff91d13f6122342f6564dd1b9bba97a32017c21ca1b0dade69a9020a53ef6971668a02ac0d4c457a05941162f3e6052a5854d124a30a63ee611d59b + languageName: node + linkType: hard + "metro-symbolicate@npm:0.84.2": version: 0.84.2 resolution: "metro-symbolicate@npm:0.84.2" @@ -23555,6 +23694,20 @@ __metadata: languageName: node linkType: hard +"metro-transform-plugins@npm:0.83.5": + version: 0.83.5 + resolution: "metro-transform-plugins@npm:0.83.5" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + nullthrows: "npm:^1.1.1" + checksum: 10/227da814239803d8c8288a403fe166e4d99b4d070426c57dc4a02e82c117cf9398b40a82b5e1060f1ebdb65a882dab840dbbea7d3f09a97ef3d3e4f6297fc2af + languageName: node + linkType: hard + "metro-transform-plugins@npm:0.84.2": version: 0.84.2 resolution: "metro-transform-plugins@npm:0.84.2" @@ -23653,6 +23806,27 @@ __metadata: languageName: node linkType: hard +"metro-transform-worker@npm:0.83.5": + version: 0.83.5 + resolution: "metro-transform-worker@npm:0.83.5" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + metro: "npm:0.83.5" + metro-babel-transformer: "npm:0.83.5" + metro-cache: "npm:0.83.5" + metro-cache-key: "npm:0.83.5" + metro-minify-terser: "npm:0.83.5" + metro-source-map: "npm:0.83.5" + metro-transform-plugins: "npm:0.83.5" + nullthrows: "npm:^1.1.1" + checksum: 10/6f3201cde7af9cb063ce0dd40b695dbcc658856e8db1d03d3b0c6854dab692477c33885c7891cb2f829ca6c682e7842f9a1801ac4c62db711183d2f7dd33a10d + languageName: node + linkType: hard + "metro-transform-worker@npm:0.84.2": version: 0.84.2 resolution: "metro-transform-worker@npm:0.84.2" @@ -23824,7 +23998,7 @@ __metadata: languageName: node linkType: hard -"metro@npm:0.83.3, metro@npm:^0.83.1, metro@npm:^0.83.3": +"metro@npm:0.83.3": version: 0.83.3 resolution: "metro@npm:0.83.3" dependencies: @@ -23874,6 +24048,56 @@ __metadata: languageName: node linkType: hard +"metro@npm:0.83.5, metro@npm:^0.83.1, metro@npm:^0.83.3": + version: 0.83.5 + resolution: "metro@npm:0.83.5" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + accepts: "npm:^2.0.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^2.0.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + error-stack-parser: "npm:^2.0.6" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + hermes-parser: "npm:0.33.3" + image-size: "npm:^1.0.2" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + jsc-safe-url: "npm:^0.2.2" + lodash.throttle: "npm:^4.1.1" + metro-babel-transformer: "npm:0.83.5" + metro-cache: "npm:0.83.5" + metro-cache-key: "npm:0.83.5" + metro-config: "npm:0.83.5" + metro-core: "npm:0.83.5" + metro-file-map: "npm:0.83.5" + metro-resolver: "npm:0.83.5" + metro-runtime: "npm:0.83.5" + metro-source-map: "npm:0.83.5" + metro-symbolicate: "npm:0.83.5" + metro-transform-plugins: "npm:0.83.5" + metro-transform-worker: "npm:0.83.5" + mime-types: "npm:^3.0.1" + nullthrows: "npm:^1.1.1" + serialize-error: "npm:^2.1.0" + source-map: "npm:^0.5.6" + throat: "npm:^5.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + bin: + metro: src/cli.js + checksum: 10/3c4643121335cf157696531829448b2c86ec653d5a7a11aa9cd005a1b9ad7a3f87f5e6ba8b997fc87e7b9f679a212d74db16739b4526a42425c6fb83e86283dc + languageName: node + linkType: hard + "metro@npm:0.84.2, metro@npm:^0.84.0": version: 0.84.2 resolution: "metro@npm:0.84.2" @@ -25560,6 +25784,15 @@ __metadata: languageName: node linkType: hard +"ob1@npm:0.83.5": + version: 0.83.5 + resolution: "ob1@npm:0.83.5" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/7a3ed43344d3d10c76060218fc35c652d12e20c0e520cf4bdb3c86c2817f0622b78a3d8c81fd52a05c29d7d2113b65514ee721e61adb352dd547d14a74b6015a + languageName: node + linkType: hard + "ob1@npm:0.84.2": version: 0.84.2 resolution: "ob1@npm:0.84.2" From bbda6926b0cca3d21f0e8fadf0e840752380fc09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Fri, 13 Mar 2026 19:26:52 +0100 Subject: [PATCH 3/8] chore: fix bundle mode patch --- scripts/patches/bundle-mode.patch | 11 +- yarn.lock | 240 +----------------------------- 2 files changed, 8 insertions(+), 243 deletions(-) diff --git a/scripts/patches/bundle-mode.patch b/scripts/patches/bundle-mode.patch index bb601cfb3a85..b624fc9c0f40 100644 --- a/scripts/patches/bundle-mode.patch +++ b/scripts/patches/bundle-mode.patch @@ -29,25 +29,24 @@ index afe4c07b49..eece71ae7f 100644 module.exports = wrapWithReanimatedMetroConfig( mergeConfig(defaultConfig, config) diff --git a/apps/fabric-example/package.json b/apps/fabric-example/package.json -index 85d2dbe679..d3a3b79d2a 100644 +index 3413d160ce..83a8c44afc 100644 --- a/apps/fabric-example/package.json +++ b/apps/fabric-example/package.json -@@ -45,8 +45,8 @@ +@@ -45,8 +45,7 @@ "staticFeatureFlags": { "RUNTIME_TEST_FLAG": true, "IOS_DYNAMIC_FRAMERATE_ENABLED": true, - "BUNDLE_MODE_ENABLED": false, - "FETCH_PREVIEW_ENABLED": false -+ "BUNDLE_MODE_ENABLED": true, -+ "FETCH_PREVIEW_ENABLED": true ++ "BUNDLE_MODE_ENABLED": true } } } diff --git a/package.json b/package.json -index 390419dccc..04b68c48d4 100644 +index 3df798d778..95415975b0 100644 --- a/package.json +++ b/package.json -@@ -76,5 +76,9 @@ +@@ -77,5 +77,9 @@ "react-native-builder-bob": "0.40.13", "shelljs": "0.10.0", "typescript": "5.8.3" diff --git a/yarn.lock b/yarn.lock index df3630235218..2920f0182140 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22787,18 +22787,6 @@ __metadata: languageName: node linkType: hard -"metro-babel-transformer@npm:0.83.3": - version: 0.83.3 - resolution: "metro-babel-transformer@npm:0.83.3" - dependencies: - "@babel/core": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - hermes-parser: "npm:0.32.0" - nullthrows: "npm:^1.1.1" - checksum: 10/dd178409d1718dae12dfffb6572ebc5bb78f1e0d7e93dce829c945957f8a686cb1b4c466c69585d7b982b3937fbea28d5c53a80691f2fc66717a0bcc800bc5b8 - languageName: node - linkType: hard - "metro-babel-transformer@npm:0.83.5": version: 0.83.5 resolution: "metro-babel-transformer@npm:0.83.5" @@ -22850,15 +22838,6 @@ __metadata: languageName: node linkType: hard -"metro-cache-key@npm:0.83.3": - version: 0.83.3 - resolution: "metro-cache-key@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/a6f9d2bf8b810f57d330d6f8f1ebf029e1224f426c5895f73d9bc1007482684048bfc7513a855626ee7f3ae72ca46e1b08cf983aefbfa84321bb7c0cef4ba4ae - languageName: node - linkType: hard - "metro-cache-key@npm:0.83.5": version: 0.83.5 resolution: "metro-cache-key@npm:0.83.5" @@ -22913,18 +22892,6 @@ __metadata: languageName: node linkType: hard -"metro-cache@npm:0.83.3": - version: 0.83.3 - resolution: "metro-cache@npm:0.83.3" - dependencies: - exponential-backoff: "npm:^3.1.1" - flow-enums-runtime: "npm:^0.0.6" - https-proxy-agent: "npm:^7.0.5" - metro-core: "npm:0.83.3" - checksum: 10/4bc263ac92f176451710ebd330d156675e40f028be02eb9659a9b024db9897f3ad8510809d699969cb6f06dc0f06d85c38ca7162fb9a70be44510fa03270e089 - languageName: node - linkType: hard - "metro-cache@npm:0.83.5": version: 0.83.5 resolution: "metro-cache@npm:0.83.5" @@ -22997,23 +22964,7 @@ __metadata: languageName: node linkType: hard -"metro-config@npm:0.83.3, metro-config@npm:^0.83.1, metro-config@npm:^0.83.3": - version: 0.83.3 - resolution: "metro-config@npm:0.83.3" - dependencies: - connect: "npm:^3.6.5" - flow-enums-runtime: "npm:^0.0.6" - jest-validate: "npm:^29.7.0" - metro: "npm:0.83.3" - metro-cache: "npm:0.83.3" - metro-core: "npm:0.83.3" - metro-runtime: "npm:0.83.3" - yaml: "npm:^2.6.1" - checksum: 10/e377c375a48afc85a4d742f80a17fc178f9af7f5b007375e65bb49472ad78bc8e1f0ba4399411310ee8b856fb767bd81bd6dae19bec6ef6a44f0ece4d8457b30 - languageName: node - linkType: hard - -"metro-config@npm:0.83.5": +"metro-config@npm:0.83.5, metro-config@npm:^0.83.1, metro-config@npm:^0.83.3": version: 0.83.5 resolution: "metro-config@npm:0.83.5" dependencies: @@ -23078,18 +23029,7 @@ __metadata: languageName: node linkType: hard -"metro-core@npm:0.83.3, metro-core@npm:^0.83.1, metro-core@npm:^0.83.3": - version: 0.83.3 - resolution: "metro-core@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - lodash.throttle: "npm:^4.1.1" - metro-resolver: "npm:0.83.3" - checksum: 10/6ef06214faa1d727396d986f989a8150f699d73c5764c66e06e61b08017e462141a7b4c9ca63f67becee58ea1394b41aabfff441e644fc1e945c715e07c60612 - languageName: node - linkType: hard - -"metro-core@npm:0.83.5": +"metro-core@npm:0.83.5, metro-core@npm:^0.83.1, metro-core@npm:^0.83.3": version: 0.83.5 resolution: "metro-core@npm:0.83.5" dependencies: @@ -23162,23 +23102,6 @@ __metadata: languageName: node linkType: hard -"metro-file-map@npm:0.83.3": - version: 0.83.3 - resolution: "metro-file-map@npm:0.83.3" - dependencies: - debug: "npm:^4.4.0" - fb-watchman: "npm:^2.0.0" - flow-enums-runtime: "npm:^0.0.6" - graceful-fs: "npm:^4.2.4" - invariant: "npm:^2.2.4" - jest-worker: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - nullthrows: "npm:^1.1.1" - walker: "npm:^1.0.7" - checksum: 10/be621b144168b6a35567d4313557596df68ee61c1b9a067fbf8272ec3db7c2d9d76849c9b8d2331716d6839c3f8e243e2b715ca2551d7ffebbd206a34c19591a - languageName: node - linkType: hard - "metro-file-map@npm:0.83.5": version: 0.83.5 resolution: "metro-file-map@npm:0.83.5" @@ -23243,16 +23166,6 @@ __metadata: languageName: node linkType: hard -"metro-minify-terser@npm:0.83.3": - version: 0.83.3 - resolution: "metro-minify-terser@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - terser: "npm:^5.15.0" - checksum: 10/1de88b70b7c903147807baa46497491a87600594fd0868b6538bbb9d7785242cabfbe8bccf36cc2285d0e17be72445b512d00c496952a159572545f3e6bcb199 - languageName: node - linkType: hard - "metro-minify-terser@npm:0.83.5": version: 0.83.5 resolution: "metro-minify-terser@npm:0.83.5" @@ -23349,15 +23262,6 @@ __metadata: languageName: node linkType: hard -"metro-resolver@npm:0.83.3": - version: 0.83.3 - resolution: "metro-resolver@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/a425376447505a088a365fc1fbe2753d452c0353a189f2c74833f2b30d6401de7ed90e36a927d355fa454d6c439a156eb66bcfcedfbbe8a78d313cf49acfbb4c - languageName: node - linkType: hard - "metro-resolver@npm:0.83.5": version: 0.83.5 resolution: "metro-resolver@npm:0.83.5" @@ -23406,16 +23310,6 @@ __metadata: languageName: node linkType: hard -"metro-runtime@npm:0.83.3": - version: 0.83.3 - resolution: "metro-runtime@npm:0.83.3" - dependencies: - "@babel/runtime": "npm:^7.25.0" - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/bf916759a7178e1d12e131c64ac67d6015ba35ead7a178e6efedd23f12ec65de99f450fe7da0ffb6c6edbfeb3cd186d2006b979a1c1c588377ae54f5f5d7921d - languageName: node - linkType: hard - "metro-runtime@npm:0.83.5, metro-runtime@npm:^0.83.1, metro-runtime@npm:^0.83.3": version: 0.83.5 resolution: "metro-runtime@npm:0.83.5" @@ -23490,25 +23384,7 @@ __metadata: languageName: node linkType: hard -"metro-source-map@npm:0.83.3, metro-source-map@npm:^0.83.1, metro-source-map@npm:^0.83.3": - version: 0.83.3 - resolution: "metro-source-map@npm:0.83.3" - dependencies: - "@babel/traverse": "npm:^7.25.3" - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" - "@babel/types": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - invariant: "npm:^2.2.4" - metro-symbolicate: "npm:0.83.3" - nullthrows: "npm:^1.1.1" - ob1: "npm:0.83.3" - source-map: "npm:^0.5.6" - vlq: "npm:^1.0.0" - checksum: 10/1dcfce503628275f97dd85945ca575c71e5654fd8872b7d86449f3352cfc84ea7a59889b2aad012361245b5497e1e097db73390245952dcfb63258ba32fa90bf - languageName: node - linkType: hard - -"metro-source-map@npm:0.83.5": +"metro-source-map@npm:0.83.5, metro-source-map@npm:^0.83.1, metro-source-map@npm:^0.83.3": version: 0.83.5 resolution: "metro-source-map@npm:0.83.5" dependencies: @@ -23590,22 +23466,6 @@ __metadata: languageName: node linkType: hard -"metro-symbolicate@npm:0.83.3": - version: 0.83.3 - resolution: "metro-symbolicate@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - invariant: "npm:^2.2.4" - metro-source-map: "npm:0.83.3" - nullthrows: "npm:^1.1.1" - source-map: "npm:^0.5.6" - vlq: "npm:^1.0.0" - bin: - metro-symbolicate: src/index.js - checksum: 10/f3be0740655732044e92728a3bccd5f4a73ab2f9e4423ca05faee02446e9b2efd9400cc7bcd761fad9bc2a1b92855ce5b03bf13e0421a203fe179be40dcc9381 - languageName: node - linkType: hard - "metro-symbolicate@npm:0.83.5": version: 0.83.5 resolution: "metro-symbolicate@npm:0.83.5" @@ -23680,20 +23540,6 @@ __metadata: languageName: node linkType: hard -"metro-transform-plugins@npm:0.83.3": - version: 0.83.3 - resolution: "metro-transform-plugins@npm:0.83.3" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - flow-enums-runtime: "npm:^0.0.6" - nullthrows: "npm:^1.1.1" - checksum: 10/fa7efe6ab4f2ce5f66e1cb302f71341cf7fd55319cf360a269b187d2f507cecce8db8069f92585cf43517aee63e18cf6e66dd124db95c293902ab27c68ac43b1 - languageName: node - linkType: hard - "metro-transform-plugins@npm:0.83.5": version: 0.83.5 resolution: "metro-transform-plugins@npm:0.83.5" @@ -23785,27 +23631,6 @@ __metadata: languageName: node linkType: hard -"metro-transform-worker@npm:0.83.3": - version: 0.83.3 - resolution: "metro-transform-worker@npm:0.83.3" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - metro: "npm:0.83.3" - metro-babel-transformer: "npm:0.83.3" - metro-cache: "npm:0.83.3" - metro-cache-key: "npm:0.83.3" - metro-minify-terser: "npm:0.83.3" - metro-source-map: "npm:0.83.3" - metro-transform-plugins: "npm:0.83.3" - nullthrows: "npm:^1.1.1" - checksum: 10/e6db9b54a9b21f4b06fc665321a7aebc6206dbac3976bda74bdf4d101dbd50f91b2e49163581ca1c27b684a4eecc2db988f0fc7aaeb200d2d947cb05d3e89f18 - languageName: node - linkType: hard - "metro-transform-worker@npm:0.83.5": version: 0.83.5 resolution: "metro-transform-worker@npm:0.83.5" @@ -23998,56 +23823,6 @@ __metadata: languageName: node linkType: hard -"metro@npm:0.83.3": - version: 0.83.3 - resolution: "metro@npm:0.83.3" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - accepts: "npm:^1.3.7" - chalk: "npm:^4.0.0" - ci-info: "npm:^2.0.0" - connect: "npm:^3.6.5" - debug: "npm:^4.4.0" - error-stack-parser: "npm:^2.0.6" - flow-enums-runtime: "npm:^0.0.6" - graceful-fs: "npm:^4.2.4" - hermes-parser: "npm:0.32.0" - image-size: "npm:^1.0.2" - invariant: "npm:^2.2.4" - jest-worker: "npm:^29.7.0" - jsc-safe-url: "npm:^0.2.2" - lodash.throttle: "npm:^4.1.1" - metro-babel-transformer: "npm:0.83.3" - metro-cache: "npm:0.83.3" - metro-cache-key: "npm:0.83.3" - metro-config: "npm:0.83.3" - metro-core: "npm:0.83.3" - metro-file-map: "npm:0.83.3" - metro-resolver: "npm:0.83.3" - metro-runtime: "npm:0.83.3" - metro-source-map: "npm:0.83.3" - metro-symbolicate: "npm:0.83.3" - metro-transform-plugins: "npm:0.83.3" - metro-transform-worker: "npm:0.83.3" - mime-types: "npm:^2.1.27" - nullthrows: "npm:^1.1.1" - serialize-error: "npm:^2.1.0" - source-map: "npm:^0.5.6" - throat: "npm:^5.0.0" - ws: "npm:^7.5.10" - yargs: "npm:^17.6.2" - bin: - metro: src/cli.js - checksum: 10/c989031710f02e51d3030660f1913870885647c5a216068333f7b4c43363f9ede03a9efb3b068b6750c6decab40f541376c3d81b32389d24932a46e10d19ebe1 - languageName: node - linkType: hard - "metro@npm:0.83.5, metro@npm:^0.83.1, metro@npm:^0.83.3": version: 0.83.5 resolution: "metro@npm:0.83.5" @@ -25775,15 +25550,6 @@ __metadata: languageName: node linkType: hard -"ob1@npm:0.83.3": - version: 0.83.3 - resolution: "ob1@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/20dfe91d48d0cadd97159cfd53f5abdca435b55d58b1f562e0687485e8f44f8a95e8ab3c835badd13d0d8c01e3d7b14d639a316aa4bf82841ac78b49611d4e5c - languageName: node - linkType: hard - "ob1@npm:0.83.5": version: 0.83.5 resolution: "ob1@npm:0.83.5" From 7cbfac52aef4c71c819d05efcf0bf06b2341066f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Fri, 13 Mar 2026 20:21:51 +0100 Subject: [PATCH 4/8] chore: fix macos compilation --- .../Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp | 7 +++---- .../apple/worklets/apple/WorkletsModule.mm | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp index c2c4950168c3..b9ba9dc66d4a 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp @@ -44,8 +44,7 @@ std::shared_ptr RuntimeManager::createWorkletRuntime( const auto runtimeId = getNextRuntimeId(); const auto jsQueue = jsiWorkletsModuleProxy->getJSQueue(); - auto workletRuntime = - std::make_shared(WorkletRuntime(runtimeId, jsQueue, name, queue, enableEventLoop)); + auto workletRuntime = std::make_shared(runtimeId, jsQueue, name, queue, enableEventLoop); workletRuntime->init(std::move(jsiWorkletsModuleProxy)); @@ -61,12 +60,12 @@ std::shared_ptr RuntimeManager::createWorkletRuntime( std::shared_ptr RuntimeManager::createUninitializedUIRuntime( const std::shared_ptr &jsQueue, const std::shared_ptr &uiAsyncQueue) { - const auto uiRuntime = std::make_shared(WorkletRuntime( + const auto uiRuntime = std::make_shared( RuntimeData::uiRuntimeId, jsQueue, RuntimeData::uiRuntimeName, uiAsyncQueue, - /*enableEventLoop*/ false)); + /*enableEventLoop*/ false); registerRuntime(RuntimeData::uiRuntimeId, uiRuntime); diff --git a/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm b/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm index ee044bda7cd2..c6a0788966ea 100644 --- a/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm +++ b/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm @@ -100,7 +100,7 @@ - (void)checkBridgeless uiScheduler, std::move(isJavaScriptQueue), runtimeBindings, - BundleModeConfig{.enabled = bundleModeEnabled, .script = script, .sourceURL = sourceURL}); + BundleModeConfig{.enabled = static_cast(bundleModeEnabled), .script = script, .sourceURL = sourceURL}); auto jsiWorkletsModuleProxy = workletsModuleProxy_->createJSIWorkletsModuleProxy(); auto optimizedJsiWorkletsModuleProxy = jsi_utils::optimizedFromHostObject( rnRuntime, std::static_pointer_cast(std::move(jsiWorkletsModuleProxy))); From 4dc264e5a20822690cb8d0048a72c6f242a6db15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Fri, 13 Mar 2026 22:06:20 +0100 Subject: [PATCH 5/8] fix: encapsulation issues --- .../worklets/WorkletRuntime/WorkletRuntime.h | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h index 51f0762c3673..51fc46a4fb22 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h @@ -129,6 +129,15 @@ class WorkletRuntime : public jsi::HostObject, public std::enable_shared_from_th return name_; } + explicit WorkletRuntime( + RuntimeData::RuntimeId runtimeId, + const std::shared_ptr &jsQueue, + const std::string &name, + const std::shared_ptr &queue = nullptr, + bool enableEventLoop = true); + + void init(std::shared_ptr jsiWorkletsModuleProxy); + /* #region deprecated */ /** @deprecated Use `runSync` instead. */ @@ -165,15 +174,6 @@ class WorkletRuntime : public jsi::HostObject, public std::enable_shared_from_th #endif // NDEBUG private: - WorkletRuntime( - RuntimeData::RuntimeId runtimeId, - const std::shared_ptr &jsQueue, - const std::string &name, - const std::shared_ptr &queue = nullptr, - bool enableEventLoop = true); - - void init(std::shared_ptr jsiWorkletsModuleProxy); - void bundleModeInit( const std::shared_ptr &jsScheduler, const std::shared_ptr &script, @@ -188,9 +188,6 @@ class WorkletRuntime : public jsi::HostObject, public std::enable_shared_from_th const std::string name_; std::shared_ptr queue_; std::shared_ptr eventLoop_; - - friend class WorkletsModuleProxy; - friend class RuntimeManager; }; // This function needs to be non-inline to avoid problems with dynamic_cast on From 19592a507bd7724e81a9b5c1fd28e1cc0e9471af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Mon, 16 Mar 2026 13:23:34 +0100 Subject: [PATCH 6/8] fix: patch typo --- scripts/patches/bundle-mode.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/patches/bundle-mode.patch b/scripts/patches/bundle-mode.patch index b624fc9c0f40..ab4308819974 100644 --- a/scripts/patches/bundle-mode.patch +++ b/scripts/patches/bundle-mode.patch @@ -29,7 +29,7 @@ index afe4c07b49..eece71ae7f 100644 module.exports = wrapWithReanimatedMetroConfig( mergeConfig(defaultConfig, config) diff --git a/apps/fabric-example/package.json b/apps/fabric-example/package.json -index 3413d160ce..83a8c44afc 100644 +index 3413d160ce..e449361b2f 100644 --- a/apps/fabric-example/package.json +++ b/apps/fabric-example/package.json @@ -45,8 +45,7 @@ @@ -38,7 +38,7 @@ index 3413d160ce..83a8c44afc 100644 "IOS_DYNAMIC_FRAMERATE_ENABLED": true, - "BUNDLE_MODE_ENABLED": false, - "FETCH_PREVIEW_ENABLED": false -+ "BUNDLE_MODE_ENABLED": true ++ "FETCH_PREVIEW_ENABLED": true } } } From e34d3b1735a168ce6415cd5e2c14dc2d0b1bd514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Mon, 16 Mar 2026 13:30:49 +0100 Subject: [PATCH 7/8] chore: restore defs --- .../Common/cpp/worklets/Tools/Defs.h | 19 ++++++++++++------- .../Common/cpp/worklets/Tools/ScriptBuffer.h | 2 +- .../worklets/android/JScriptBufferWrapper.cpp | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h index fccf8f6f7ac9..f941e2ec1d81 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h +++ b/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h @@ -1,10 +1,15 @@ -#pragma once - -/* -On Android JS_RUNTIME_HERMES is set in CMakeList.txt, -but on iOS there is no simple way to defect if Hermes exists -so we have to check if headers are available. -*/ #if __APPLE__ && __has_include() #define JS_RUNTIME_HERMES 1 #endif + +#if REACT_NATIVE_MINOR_VERSION >= 84 +#include +namespace worklets { +using JSBigStringBuffer = facebook::react::JSBigString; +} +#else +#include +namespace worklets { +using JSBigStringBuffer = facebook::react::BigStringBuffer; +} +#endif // REACT_NATIVE_MINOR_VERSION >= 84 diff --git a/packages/react-native-worklets/Common/cpp/worklets/Tools/ScriptBuffer.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/ScriptBuffer.h index 443e455208cb..ca86bc5d3095 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/Tools/ScriptBuffer.h +++ b/packages/react-native-worklets/Common/cpp/worklets/Tools/ScriptBuffer.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include #include #include diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/android/JScriptBufferWrapper.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/JScriptBufferWrapper.cpp index c621e85c5591..e8b571ea7b05 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/android/JScriptBufferWrapper.cpp +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/android/JScriptBufferWrapper.cpp @@ -3,8 +3,8 @@ * https://github.com/facebook/react-native/blob/main/packages/react-native/ReactAndroid/src/main/jni/react/jni/JSLoader.cpp */ -#include #include +#include #include #include From fe463d63f32697176a0f118dc5bd64cffb53dff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Mon, 16 Mar 2026 13:53:06 +0100 Subject: [PATCH 8/8] fix: restore pragma --- packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h index f941e2ec1d81..d9a79fe345ea 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h +++ b/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h @@ -1,3 +1,5 @@ +#pragma once + #if __APPLE__ && __has_include() #define JS_RUNTIME_HERMES 1 #endif