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 3ff260e6a680..1f152fa19b40 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp @@ -23,6 +23,15 @@ namespace worklets { +WorkletRuntimeHolderNativeState::WorkletRuntimeHolderNativeState( + const std::weak_ptr &workletRuntime) + : weakWorkletRuntime_(workletRuntime) {} + +std::weak_ptr +WorkletRuntimeHolderNativeState::getWorkletRuntime() const { + return weakWorkletRuntime_; +} + class AroundLock { const std::shared_ptr mutex_; @@ -100,6 +109,13 @@ void WorkletRuntime::init( auto optimizedJsiWorkletsModuleProxy = jsi_utils::optimizedFromHostObject(rt, std::move(jsiWorkletsModuleProxy)); + auto workletRuntimeHolder = jsi::Object(rt); + workletRuntimeHolder.setNativeState( + rt, std::make_shared(weak_from_this())); + + rt.global().setProperty( + rt, "_WORKLET_RUNTIME_HOLDER", std::move(workletRuntimeHolder)); + WorkletRuntimeDecorator::decorate( rt, name_, 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 3d3d3724e7e2..cea30d54ce3d 100644 --- a/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h +++ b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h @@ -26,6 +26,18 @@ namespace worklets { * Forward declaration to avoid circular dependencies. */ class JSIWorkletsModuleProxy; +class WorkletRuntime; + +class WorkletRuntimeHolderNativeState : public jsi::NativeState { + public: + explicit WorkletRuntimeHolderNativeState( + const std::weak_ptr &workletRuntime); + + std::weak_ptr getWorkletRuntime() const; + + private: + std::weak_ptr weakWorkletRuntime_; +}; class WorkletRuntime : public jsi::HostObject, public std::enable_shared_from_this { diff --git a/packages/react-native-worklets/src/publicGlobals.ts b/packages/react-native-worklets/src/publicGlobals.ts index 76392271198e..024d0bfe66c4 100644 --- a/packages/react-native-worklets/src/publicGlobals.ts +++ b/packages/react-native-worklets/src/publicGlobals.ts @@ -36,4 +36,10 @@ declare global { * - Value _3_: Worker Worklet Runtime */ var __RUNTIME_KIND: RuntimeKind | 1 | 2 | 3; + + /** + * Holds a reference to the WorkletRuntimeHolderNativeState instance used to + * obtain a weak reference to the WorkletRuntime. + */ + var _WORKLET_RUNTIME_HOLDER: object | undefined; }