react-native-worklets 0.8.0-nightly-20251214-10058a8fb → 0.8.0-nightly-20251216-76b4795ca

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp +1 -13
  2. package/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h +5 -4
  3. package/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp +2 -1
  4. package/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h +3 -2
  5. package/Common/cpp/worklets/Tools/ScriptBuffer.h +34 -0
  6. package/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp +2 -3
  7. package/RNWorklets.podspec +10 -8
  8. package/android/build.gradle +0 -11
  9. package/android/src/main/cpp/worklets/android/JScriptBufferWrapper.cpp +67 -0
  10. package/android/src/main/cpp/worklets/android/JScriptBufferWrapper.h +48 -0
  11. package/android/src/main/cpp/worklets/android/WorkletsModule.cpp +17 -16
  12. package/android/src/main/cpp/worklets/android/WorkletsModule.h +6 -13
  13. package/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp +2 -0
  14. package/android/src/main/java/com/swmansion/worklets/ScriptBufferWrapper.java +88 -0
  15. package/android/src/{experimentalBundling → main/java}/com/swmansion/worklets/WorkletsModule.java +10 -15
  16. package/apple/worklets/apple/WorkletsModule.mm +15 -13
  17. package/lib/module/WorkletsModule/NativeWorklets.native.js +3 -0
  18. package/lib/module/WorkletsModule/NativeWorklets.native.js.map +1 -1
  19. package/lib/module/debug/jsVersion.js +1 -1
  20. package/lib/typescript/WorkletsModule/NativeWorklets.native.d.ts.map +1 -1
  21. package/lib/typescript/debug/jsVersion.d.ts +1 -1
  22. package/package.json +1 -1
  23. package/src/WorkletsModule/NativeWorklets.native.ts +5 -0
  24. package/src/debug/jsVersion.ts +1 -1
  25. package/android/src/legacyBundling/com/swmansion/worklets/WorkletsModule.java +0 -122
@@ -152,7 +152,7 @@ inline void registerCustomSerializable(
152
152
 
153
153
  JSIWorkletsModuleProxy::JSIWorkletsModuleProxy(
154
154
  const bool isDevBundle,
155
- const std::shared_ptr<const JSBigStringBuffer> &script,
155
+ const std::shared_ptr<const ScriptBuffer> &script,
156
156
  const std::string &sourceUrl,
157
157
  const std::shared_ptr<MessageQueueThread> &jsQueue,
158
158
  const std::shared_ptr<JSScheduler> &jsScheduler,
@@ -171,18 +171,6 @@ JSIWorkletsModuleProxy::JSIWorkletsModuleProxy(
171
171
  runtimeManager_(runtimeManager),
172
172
  uiWorkletRuntime_(uiWorkletRuntime) {}
173
173
 
174
- JSIWorkletsModuleProxy::JSIWorkletsModuleProxy(const JSIWorkletsModuleProxy &other)
175
- : jsi::HostObject(),
176
- isDevBundle_(other.isDevBundle_),
177
- script_(other.script_),
178
- sourceUrl_(other.sourceUrl_),
179
- jsQueue_(other.jsQueue_),
180
- jsScheduler_(other.jsScheduler_),
181
- uiScheduler_(other.uiScheduler_),
182
- memoryManager_(other.memoryManager_),
183
- runtimeManager_(other.runtimeManager_),
184
- uiWorkletRuntime_(other.uiWorkletRuntime_) {}
185
-
186
174
  JSIWorkletsModuleProxy::~JSIWorkletsModuleProxy() = default;
187
175
 
188
176
  std::vector<jsi::PropNameID> JSIWorkletsModuleProxy::getPropertyNames(jsi::Runtime &rt) {
@@ -8,6 +8,7 @@
8
8
  #include <worklets/SharedItems/MemoryManager.h>
9
9
  #include <worklets/SharedItems/Serializable.h>
10
10
  #include <worklets/Tools/Defs.h>
11
+ #include <worklets/Tools/ScriptBuffer.h>
11
12
  #include <worklets/WorkletRuntime/RuntimeManager.h>
12
13
  #include <worklets/WorkletRuntime/UIRuntimeDecorator.h>
13
14
 
@@ -31,7 +32,7 @@ class JSIWorkletsModuleProxy : public jsi::HostObject {
31
32
  public:
32
33
  explicit JSIWorkletsModuleProxy(
33
34
  const bool isDevBundle,
34
- const std::shared_ptr<const JSBigStringBuffer> &script,
35
+ const std::shared_ptr<const ScriptBuffer> &script,
35
36
  const std::string &sourceUrl,
36
37
  const std::shared_ptr<MessageQueueThread> &jsQueue,
37
38
  const std::shared_ptr<JSScheduler> &jsScheduler,
@@ -40,7 +41,7 @@ class JSIWorkletsModuleProxy : public jsi::HostObject {
40
41
  const std::shared_ptr<RuntimeManager> &runtimeManager,
41
42
  const std::weak_ptr<WorkletRuntime> &uiWorkletRuntime);
42
43
 
43
- JSIWorkletsModuleProxy(const JSIWorkletsModuleProxy &other);
44
+ JSIWorkletsModuleProxy(const JSIWorkletsModuleProxy &other) = default;
44
45
 
45
46
  ~JSIWorkletsModuleProxy() override;
46
47
 
@@ -64,7 +65,7 @@ class JSIWorkletsModuleProxy : public jsi::HostObject {
64
65
  return isDevBundle_;
65
66
  }
66
67
 
67
- [[nodiscard]] std::shared_ptr<const JSBigStringBuffer> getScript() const {
68
+ [[nodiscard]] std::shared_ptr<const ScriptBuffer> getScript() const {
68
69
  return script_;
69
70
  }
70
71
 
@@ -82,7 +83,7 @@ class JSIWorkletsModuleProxy : public jsi::HostObject {
82
83
 
83
84
  private:
84
85
  const bool isDevBundle_;
85
- const std::shared_ptr<const JSBigStringBuffer> script_;
86
+ const std::shared_ptr<const ScriptBuffer> script_;
86
87
  const std::string sourceUrl_;
87
88
  const std::shared_ptr<MessageQueueThread> jsQueue_;
88
89
  const std::shared_ptr<JSScheduler> jsScheduler_;
@@ -5,6 +5,7 @@
5
5
  #include <worklets/RunLoop/AsyncQueueImpl.h>
6
6
  #include <worklets/SharedItems/Serializable.h>
7
7
  #include <worklets/Tools/Defs.h>
8
+ #include <worklets/Tools/ScriptBuffer.h>
8
9
  #include <worklets/WorkletRuntime/RuntimeBindings.h>
9
10
  #include <worklets/WorkletRuntime/UIRuntimeDecorator.h>
10
11
 
@@ -29,7 +30,7 @@ WorkletsModuleProxy::WorkletsModuleProxy(
29
30
  const std::shared_ptr<UIScheduler> &uiScheduler,
30
31
  std::function<bool()> &&isJavaScriptThread,
31
32
  RuntimeBindings runtimeBindings,
32
- const std::shared_ptr<const JSBigStringBuffer> &script,
33
+ const std::shared_ptr<const ScriptBuffer> &script,
33
34
  const std::string &sourceUrl)
34
35
  : isDevBundle_(isDevBundleFromRNRuntime(rnRuntime)),
35
36
  jsQueue_(jsQueue),
@@ -9,6 +9,7 @@
9
9
  #include <worklets/Tools/Defs.h>
10
10
  #include <worklets/Tools/JSLogger.h>
11
11
  #include <worklets/Tools/JSScheduler.h>
12
+ #include <worklets/Tools/ScriptBuffer.h>
12
13
  #include <worklets/Tools/SingleInstanceChecker.h>
13
14
  #include <worklets/Tools/UIScheduler.h>
14
15
  #include <worklets/WorkletRuntime/RuntimeManager.h>
@@ -28,7 +29,7 @@ class WorkletsModuleProxy : public std::enable_shared_from_this<WorkletsModulePr
28
29
  const std::shared_ptr<UIScheduler> &uiScheduler,
29
30
  std::function<bool()> &&isJavaScriptQueue,
30
31
  RuntimeBindings runtimeBindings,
31
- const std::shared_ptr<const JSBigStringBuffer> &script,
32
+ const std::shared_ptr<const ScriptBuffer> &script,
32
33
  const std::string &sourceUrl);
33
34
 
34
35
  ~WorkletsModuleProxy();
@@ -66,7 +67,7 @@ class WorkletsModuleProxy : public std::enable_shared_from_this<WorkletsModulePr
66
67
  const std::shared_ptr<UIScheduler> uiScheduler_;
67
68
  const std::shared_ptr<JSLogger> jsLogger_;
68
69
  const RuntimeBindings runtimeBindings_;
69
- const std::shared_ptr<const JSBigStringBuffer> script_;
70
+ const std::shared_ptr<const ScriptBuffer> script_;
70
71
  const std::string sourceUrl_;
71
72
  const std::shared_ptr<MemoryManager> memoryManager_;
72
73
  const std::shared_ptr<RuntimeManager> runtimeManager_;
@@ -0,0 +1,34 @@
1
+ #pragma once
2
+
3
+ #include <cxxreact/JSBigString.h>
4
+ #include <jsi/jsi.h>
5
+
6
+ #include <memory>
7
+ #include <utility>
8
+
9
+ namespace worklets {
10
+
11
+ using namespace facebook;
12
+ using namespace facebook::react;
13
+
14
+ /**
15
+ * Our custom copyable structure that is accepted by
16
+ * Hermes Runtime for evaluation.
17
+ */
18
+ class ScriptBuffer : public jsi::Buffer {
19
+ public:
20
+ explicit ScriptBuffer(std::shared_ptr<const JSBigString> script) : script_(std::move(script)) {}
21
+
22
+ size_t size() const override {
23
+ return script_->size();
24
+ }
25
+
26
+ const uint8_t *data() const override {
27
+ return reinterpret_cast<const uint8_t *>(script_->c_str());
28
+ }
29
+
30
+ private:
31
+ std::shared_ptr<const JSBigString> script_;
32
+ };
33
+
34
+ } // namespace worklets
@@ -116,9 +116,8 @@ void WorkletRuntime::init(std::shared_ptr<JSIWorkletsModuleProxy> jsiWorkletsMod
116
116
  }
117
117
 
118
118
  try {
119
- auto buffer = std::make_shared<const BigStringBuffer>(script);
120
- rt.evaluateJavaScript(buffer, sourceUrl);
121
- } catch (facebook::jsi::JSError error) {
119
+ rt.evaluateJavaScript(script, sourceUrl);
120
+ } catch (facebook::jsi::JSError &error) {
122
121
  const auto &message = error.getMessage();
123
122
  const auto &stack = error.getStack();
124
123
  if (!message.starts_with("[Worklets] Worklets initialized successfully")) {
@@ -14,13 +14,15 @@ feature_flags = "-DWORKLETS_FEATURE_FLAGS=\"#{worklets_get_static_feature_flags(
14
14
  version_flags = "-DWORKLETS_VERSION=#{package['version']} -DREACT_NATIVE_MINOR_VERSION=#{$worklets_config[:react_native_minor_version]}"
15
15
  worklets_profiling_flag = ENV['IS_WORKLETS_PROFILING'] ? '-DWORKLETS_PROFILING' : ''
16
16
  bundle_mode_flag = $worklets_config[:bundle_mode] ? '-DWORKLETS_BUNDLE_MODE' : ''
17
- # React Native doesn't expose these flags, but not having them
18
- # can lead to runtime errors due to ABI mismatches.
19
- # There's also
20
- # HERMESVM_PROFILER_OPCODE
21
- # HERMESVM_PROFILER_BB
22
- # which shouldn't be defined in standard setups.
23
- hermes_debug_hidden_flags = 'HERMES_ENABLE_DEBUGGER=1'
17
+ hermes_v1_flag = ENV['RCT_HERMES_V1_ENABLED'] == '1' ? '-DHERMES_V1_ENABLED' : ''
18
+
19
+ # React Native doesn't expose these flags, but not having them
20
+ # can lead to runtime errors due to ABI mismatches.
21
+ # There's also
22
+ # HERMESVM_PROFILER_OPCODE
23
+ # HERMESVM_PROFILER_BB
24
+ # which shouldn't be defined in standard setups.
25
+ hermes_debug_hidden_flags = 'HERMES_ENABLE_DEBUGGER=1'
24
26
 
25
27
  Pod::Spec.new do |s|
26
28
  s.name = "RNWorklets"
@@ -74,7 +76,7 @@ Pod::Spec.new do |s|
74
76
  "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
75
77
  "GCC_PREPROCESSOR_DEFINITIONS[config=*Debug*]" => "$(inherited) #{hermes_debug_hidden_flags}",
76
78
  "GCC_PREPROCESSOR_DEFINITIONS[config=*Release*]" => "$(inherited)",
77
- "OTHER_CFLAGS" => "$(inherited) #{feature_flags} #{version_flags} #{worklets_profiling_flag} #{bundle_mode_flag}",
79
+ "OTHER_CFLAGS" => "$(inherited) #{feature_flags} #{version_flags} #{worklets_profiling_flag} #{bundle_mode_flag} #{hermes_v1_flag}",
78
80
  }
79
81
  s.xcconfig = {
80
82
  "HEADER_SEARCH_PATHS" => [
@@ -254,17 +254,6 @@ android {
254
254
  sourceCompatibility JavaVersion.VERSION_17
255
255
  targetCompatibility JavaVersion.VERSION_17
256
256
  }
257
- sourceSets {
258
- main {
259
- java {
260
- if (BUNDLE_MODE) {
261
- srcDirs += "src/experimentalBundling"
262
- } else {
263
- srcDirs += "src/legacyBundling"
264
- }
265
- }
266
- }
267
- }
268
257
  tasks.withType(ExternalNativeBuildJsonTask).tap {
269
258
  configureEach { compileTask ->
270
259
  compileTask.doLast {
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Based on
3
+ * https://github.com/facebook/react-native/blob/main/packages/react-native/ReactAndroid/src/main/jni/react/jni/JSLoader.cpp
4
+ */
5
+
6
+ #include <cxxreact/JSBigString.h>
7
+ #include <cxxreact/RecoverableError.h>
8
+ #include <worklets/Tools/ScriptBuffer.h>
9
+ #include <worklets/android/JScriptBufferWrapper.h>
10
+
11
+ #include <utility>
12
+
13
+ namespace worklets {
14
+
15
+ using namespace facebook::jni;
16
+
17
+ jni::local_ref<JScriptBufferWrapper::jhybriddata> JScriptBufferWrapper::initHybridFromAssets(
18
+ jni::alias_ref<jhybridobject> jThis, // NOLINT //(performance-unnecessary-value-param)
19
+ jni::alias_ref<JAssetManager::javaobject> assetManager, // NOLINT //(performance-unnecessary-value-param)
20
+ const std::string &sourceURL) {
21
+ auto manager = extractAssetManager(assetManager);
22
+ auto bigString = loadScriptFromAssets(manager, sourceURL);
23
+ auto script = std::make_shared<ScriptBuffer>(std::move(bigString));
24
+ return makeCxxInstance(std::move(script), sourceURL);
25
+ }
26
+
27
+ jni::local_ref<JScriptBufferWrapper::jhybriddata> JScriptBufferWrapper::initHybridFromFile(
28
+ jni::alias_ref<jhybridobject> jThis, // NOLINT //(performance-unnecessary-value-param)
29
+ const std::string &fileName) {
30
+ std::shared_ptr<const ScriptBuffer> script;
31
+ RecoverableError::runRethrowingAsRecoverable<std::system_error>([&fileName, &script]() {
32
+ auto bigString = JSBigFileString::fromPath(fileName);
33
+ script = std::make_shared<ScriptBuffer>(std::move(bigString));
34
+ });
35
+ return makeCxxInstance(std::move(script), fileName);
36
+ }
37
+
38
+ jni::local_ref<JScriptBufferWrapper::jhybriddata> JScriptBufferWrapper::initHybridFromString(
39
+ jni::alias_ref<jhybridobject> jThis, // NOLINT //(performance-unnecessary-value-param)
40
+ const std::string &scriptStr,
41
+ const std::string &sourceURL) {
42
+ auto bigString = std::make_shared<JSBigStdString>(scriptStr);
43
+ auto script = std::make_shared<ScriptBuffer>(std::move(bigString));
44
+ return makeCxxInstance(std::move(script), sourceURL);
45
+ }
46
+
47
+ JScriptBufferWrapper::JScriptBufferWrapper(
48
+ const std::shared_ptr<const ScriptBuffer> &script,
49
+ const std::string &sourceUrl)
50
+ : script_(script), sourceUrl_(sourceUrl) {}
51
+
52
+ std::shared_ptr<const ScriptBuffer> JScriptBufferWrapper::getScript() const {
53
+ return script_;
54
+ }
55
+
56
+ std::string JScriptBufferWrapper::getSourceUrl() const {
57
+ return sourceUrl_;
58
+ }
59
+
60
+ void JScriptBufferWrapper::registerNatives() {
61
+ registerHybrid({
62
+ makeNativeMethod("initHybridFromAssets", JScriptBufferWrapper::initHybridFromAssets),
63
+ makeNativeMethod("initHybridFromFile", JScriptBufferWrapper::initHybridFromFile),
64
+ makeNativeMethod("initHybridFromString", JScriptBufferWrapper::initHybridFromString),
65
+ });
66
+ }
67
+ } // namespace worklets
@@ -0,0 +1,48 @@
1
+ #pragma once
2
+
3
+ #include <fbjni/fbjni.h>
4
+ #include <jsireact/JSIExecutor.h>
5
+ #include <react/jni/JSLoader.h>
6
+ #include <worklets/Tools/ScriptBuffer.h>
7
+
8
+ #include <memory>
9
+ #include <string>
10
+
11
+ namespace worklets {
12
+
13
+ using namespace facebook;
14
+ using namespace facebook::react;
15
+
16
+ /**
17
+ * JScriptBufferWrapper is a JNI wrapper class that holds a ScriptBuffer containing
18
+ * JavaScript code and its source URL, to be evaluated on a WorkletRuntime.
19
+ */
20
+ class JScriptBufferWrapper : public jni::HybridClass<JScriptBufferWrapper> {
21
+ public:
22
+ constexpr static const char *const kJavaDescriptor = "Lcom/swmansion/worklets/ScriptBufferWrapper;";
23
+
24
+ static void registerNatives();
25
+
26
+ [[nodiscard]] std::shared_ptr<const ScriptBuffer> getScript() const;
27
+ [[nodiscard]] std::string getSourceUrl() const;
28
+
29
+ private:
30
+ static jni::local_ref<JScriptBufferWrapper::jhybriddata> initHybridFromAssets(
31
+ jni::alias_ref<jhybridobject> jThis,
32
+ jni::alias_ref<JAssetManager::javaobject> assetManager,
33
+ const std::string &assetURL);
34
+ static jni::local_ref<JScriptBufferWrapper::jhybriddata> initHybridFromFile(
35
+ jni::alias_ref<jhybridobject> jThis,
36
+ const std::string &fileName);
37
+ static jni::local_ref<JScriptBufferWrapper::jhybriddata>
38
+ initHybridFromString(jni::alias_ref<jhybridobject> jThis, const std::string &script, const std::string &sourceURL);
39
+
40
+ friend HybridBase;
41
+
42
+ explicit JScriptBufferWrapper(const std::shared_ptr<const ScriptBuffer> &script, const std::string &sourceUrl);
43
+
44
+ const std::shared_ptr<const ScriptBuffer> script_;
45
+ const std::string sourceUrl_;
46
+ };
47
+
48
+ } // namespace worklets
@@ -1,4 +1,5 @@
1
1
  #include <worklets/NativeModules/JSIWorkletsModuleProxy.h>
2
+ #include <worklets/Tools/ScriptBuffer.h>
2
3
  #include <worklets/Tools/WorkletsJSIUtils.h>
3
4
  #include <worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h>
4
5
  #include <worklets/android/AnimationFrameCallback.h>
@@ -14,12 +15,13 @@ using namespace facebook;
14
15
  using namespace react;
15
16
 
16
17
  WorkletsModule::WorkletsModule(
17
- jni::alias_ref<jhybridobject> jThis,
18
+ jni::alias_ref<jhybridobject> jThis, // NOLINT //(performance-unnecessary-value-param)
18
19
  jsi::Runtime *rnRuntime,
19
- jni::alias_ref<JavaMessageQueueThread::javaobject> messageQueueThread,
20
+ jni::alias_ref<JavaMessageQueueThread::javaobject>
21
+ messageQueueThread, // NOLINT //(performance-unnecessary-value-param)
20
22
  const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker,
21
23
  const std::shared_ptr<UIScheduler> &uiScheduler,
22
- const std::shared_ptr<const JSBigStringBuffer> &script,
24
+ const std::shared_ptr<const ScriptBuffer> &script,
23
25
  const std::string &sourceURL)
24
26
  : javaPart_(jni::make_global(jThis)),
25
27
  rnRuntime_(rnRuntime),
@@ -40,26 +42,25 @@ WorkletsModule::WorkletsModule(
40
42
  }
41
43
 
42
44
  jni::local_ref<WorkletsModule::jhybriddata> WorkletsModule::initHybrid(
43
- jni::alias_ref<jhybridobject> jThis,
45
+ jni::alias_ref<jhybridobject> jThis, // NOLINT //(performance-unnecessary-value-param)
44
46
  jlong jsContext,
45
- jni::alias_ref<JavaMessageQueueThread::javaobject> messageQueueThread,
47
+ jni::alias_ref<JavaMessageQueueThread::javaobject>
48
+ messageQueueThread, // NOLINT //(performance-unnecessary-value-param)
46
49
  jni::alias_ref<facebook::react::CallInvokerHolder::javaobject> jsCallInvokerHolder,
47
- jni::alias_ref<worklets::AndroidUIScheduler::javaobject> androidUIScheduler
48
- #ifdef WORKLETS_BUNDLE_MODE
49
- ,
50
- jni::alias_ref<facebook::react::BundleWrapper::javaobject> bundleWrapper,
51
- const std::string &sourceURL
52
- #endif // WORKLETS_BUNDLE_MODE
50
+ jni::alias_ref<worklets::AndroidUIScheduler::javaobject> androidUIScheduler,
51
+ jni::alias_ref<JScriptBufferWrapper::javaobject>
52
+ jScriptBufferWrapper // NOLINT //(performance-unnecessary-value-param)
53
53
  ) {
54
54
  auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
55
- auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext);
55
+ auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext); // NOLINT //(performance-no-int-to-ptr)
56
56
  auto uiScheduler = androidUIScheduler->cthis()->getUIScheduler();
57
57
 
58
- std::shared_ptr<const JSBigStringBuffer> script = nullptr;
58
+ std::shared_ptr<const ScriptBuffer> script = nullptr;
59
+ std::string sourceURL;
59
60
  #ifdef WORKLETS_BUNDLE_MODE
60
- script = bundleWrapper->cthis()->getBundle();
61
- #else
62
- const auto sourceURL = std::string{};
61
+ auto cxxWrapper = jScriptBufferWrapper->cthis();
62
+ script = cxxWrapper->getScript();
63
+ sourceURL = cxxWrapper->getSourceUrl();
63
64
  #endif // WORKLETS_BUNDLE_MODE
64
65
 
65
66
  return makeCxxInstance(jThis, rnRuntime, messageQueueThread, jsCallInvoker, uiScheduler, script, sourceURL);
@@ -4,14 +4,12 @@
4
4
  #include <fbjni/fbjni.h>
5
5
  #include <jsi/jsi.h>
6
6
  #include <react/jni/JMessageQueueThread.h>
7
- #include <worklets/Tools/Defs.h>
8
- #ifdef WORKLETS_BUNDLE_MODE
9
- #include <react/fabric/BundleWrapper.h>
10
- #endif // WORKLETS_BUNDLE_MODE
11
-
12
7
  #include <worklets/NativeModules/WorkletsModuleProxy.h>
8
+ #include <worklets/Tools/Defs.h>
9
+ #include <worklets/Tools/ScriptBuffer.h>
13
10
  #include <worklets/WorkletRuntime/RuntimeBindings.h>
14
11
  #include <worklets/android/AndroidUIScheduler.h>
12
+ #include <worklets/android/JScriptBufferWrapper.h>
15
13
 
16
14
  #include <memory>
17
15
  #include <string>
@@ -30,13 +28,8 @@ class WorkletsModule : public jni::HybridClass<WorkletsModule> {
30
28
  jlong jsContext,
31
29
  jni::alias_ref<JavaMessageQueueThread::javaobject> messageQueueThread,
32
30
  jni::alias_ref<facebook::react::CallInvokerHolder::javaobject> jsCallInvokerHolder,
33
- jni::alias_ref<worklets::AndroidUIScheduler::javaobject> androidUIScheduler
34
- #ifdef WORKLETS_BUNDLE_MODE
35
- ,
36
- jni::alias_ref<facebook::react::BundleWrapper::javaobject> bundleWrapper,
37
- const std::string &sourceURL
38
- #endif // WORKLETS_BUNDLE_MODE
39
- );
31
+ jni::alias_ref<worklets::AndroidUIScheduler::javaobject> androidUIScheduler,
32
+ jni::alias_ref<JScriptBufferWrapper::javaobject> jScriptBufferWrapper);
40
33
 
41
34
  static void registerNatives();
42
35
 
@@ -51,7 +44,7 @@ class WorkletsModule : public jni::HybridClass<WorkletsModule> {
51
44
  jni::alias_ref<JavaMessageQueueThread::javaobject> messageQueueThread,
52
45
  const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker,
53
46
  const std::shared_ptr<UIScheduler> &uiScheduler,
54
- const std::shared_ptr<const JSBigStringBuffer> &bundle,
47
+ const std::shared_ptr<const ScriptBuffer> &script,
55
48
  const std::string &sourceURL);
56
49
 
57
50
  void invalidateCpp();
@@ -2,6 +2,7 @@
2
2
 
3
3
  #include <worklets/android/AndroidUIScheduler.h>
4
4
  #include <worklets/android/AnimationFrameCallback.h>
5
+ #include <worklets/android/JScriptBufferWrapper.h>
5
6
  #include <worklets/android/WorkletsModule.h>
6
7
 
7
8
  JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
@@ -9,5 +10,6 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
9
10
  worklets::WorkletsModule::registerNatives();
10
11
  worklets::AndroidUIScheduler::registerNatives();
11
12
  worklets::AnimationFrameCallback::registerNatives();
13
+ worklets::JScriptBufferWrapper::registerNatives();
12
14
  });
13
15
  }
@@ -0,0 +1,88 @@
1
+ package com.swmansion.worklets;
2
+
3
+ import android.annotation.SuppressLint;
4
+ import android.content.res.AssetManager;
5
+ import android.os.Build;
6
+ import com.facebook.jni.HybridData;
7
+ import com.facebook.proguard.annotations.DoNotStrip;
8
+ import com.facebook.proguard.annotations.DoNotStripAny;
9
+ import java.io.IOException;
10
+ import java.io.InputStream;
11
+ import java.net.HttpURLConnection;
12
+ import java.net.URL;
13
+ import java.nio.charset.StandardCharsets;
14
+
15
+ /** A wrapper around a JavaScript bundle that is backed by a native C++ object. */
16
+ @SuppressWarnings("JavaJniMissingFunction")
17
+ @SuppressLint("MissingNativeLoadLibrary")
18
+ @DoNotStripAny
19
+ public class ScriptBufferWrapper {
20
+ public ScriptBufferWrapper(String uri, AssetManager assetManager) {
21
+ String filePrefix = "file://";
22
+ String assetsPrefix = "assets://";
23
+
24
+ if (uri.startsWith(filePrefix)) {
25
+ String fileName = uri.substring(filePrefix.length());
26
+ mHybridData = initHybridFromFile(fileName);
27
+ } else if (uri.startsWith(assetsPrefix)) {
28
+ String assetURL = uri.substring(assetsPrefix.length());
29
+ mHybridData = initHybridFromAssets(assetManager, assetURL);
30
+ } else {
31
+ String scriptContent;
32
+ try {
33
+ scriptContent = downloadScript(uri);
34
+ } catch (IOException e) {
35
+ throw new RuntimeException(e);
36
+ }
37
+ mHybridData = initHybridFromString(scriptContent, uri);
38
+ }
39
+ }
40
+
41
+ private static String downloadScript(String url) throws IOException {
42
+ var scriptUrl = new URL(url);
43
+ HttpURLConnection connection = (HttpURLConnection) scriptUrl.openConnection();
44
+ try {
45
+ byte[] content;
46
+
47
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
48
+ content = connection.getInputStream().readAllBytes();
49
+ } else {
50
+ content = readBytes(connection.getInputStream());
51
+ }
52
+
53
+ return new String(content, StandardCharsets.UTF_8);
54
+ } finally {
55
+ if (connection != null) {
56
+ connection.disconnect();
57
+ }
58
+ }
59
+ }
60
+
61
+ /** Reads all bytes from an InputStream into a byte array for SDKs below 33. */
62
+ private static byte[] readBytes(InputStream inputStream) throws IOException {
63
+ final int BUFFER_SIZE = 4096;
64
+ try {
65
+ java.io.ByteArrayOutputStream byteBuffer = new java.io.ByteArrayOutputStream();
66
+ byte[] buffer = new byte[BUFFER_SIZE];
67
+ int len;
68
+ while ((len = inputStream.read(buffer)) != -1) {
69
+ byteBuffer.write(buffer, 0, len);
70
+ }
71
+ return byteBuffer.toByteArray();
72
+ } finally {
73
+ if (inputStream != null) {
74
+ inputStream.close();
75
+ }
76
+ }
77
+ }
78
+
79
+ private native HybridData initHybridFromAssets(AssetManager assetManager, String assetURL);
80
+
81
+ private native HybridData initHybridFromFile(String fileName);
82
+
83
+ private native HybridData initHybridFromString(String script, String url);
84
+
85
+ @DoNotStrip
86
+ @SuppressWarnings({"unused", "FieldCanBeLocal"})
87
+ private final HybridData mHybridData;
88
+ }
@@ -8,7 +8,6 @@ import com.facebook.react.bridge.ReactApplicationContext;
8
8
  import com.facebook.react.bridge.ReactMethod;
9
9
  import com.facebook.react.bridge.queue.MessageQueueThread;
10
10
  import com.facebook.react.common.annotations.FrameworkAPI;
11
- import com.facebook.react.fabric.BundleWrapper;
12
11
  import com.facebook.react.module.annotations.ReactModule;
13
12
  import com.facebook.react.turbomodule.core.CallInvokerHolderImpl;
14
13
  import com.facebook.soloader.SoLoader;
@@ -37,8 +36,6 @@ public class WorkletsModule extends NativeWorkletsModuleSpec implements Lifecycl
37
36
  private final AndroidUIScheduler mAndroidUIScheduler;
38
37
  private final AnimationFrameQueue mAnimationFrameQueue;
39
38
  private boolean mSlowAnimationsEnabled;
40
- private BundleWrapper mBundleWrapper = null;
41
- private String mSourceURL = null;
42
39
 
43
40
  /**
44
41
  * Invalidating concurrently could be fatal. It shouldn't happen in a normal flow, but it doesn't
@@ -52,15 +49,12 @@ public class WorkletsModule extends NativeWorkletsModuleSpec implements Lifecycl
52
49
  MessageQueueThread messageQueueThread,
53
50
  CallInvokerHolderImpl jsCallInvokerHolder,
54
51
  AndroidUIScheduler androidUIScheduler,
55
- BundleWrapper bundleWrapper,
56
- String sourceURL);
52
+ ScriptBufferWrapper scriptBufferWrapper);
57
53
 
58
54
  public WorkletsModule(ReactApplicationContext reactContext) {
59
55
  super(reactContext);
60
56
 
61
- if (!BuildConfig.BUNDLE_MODE) {
62
- reactContext.assertOnJSQueueThread();
63
- }
57
+ reactContext.assertOnJSQueueThread();
64
58
 
65
59
  mAndroidUIScheduler = new AndroidUIScheduler(reactContext);
66
60
  mAnimationFrameQueue = new AnimationFrameQueue(reactContext);
@@ -71,15 +65,17 @@ public class WorkletsModule extends NativeWorkletsModuleSpec implements Lifecycl
71
65
  public boolean installTurboModule() {
72
66
  var context = getReactApplicationContext();
73
67
 
74
- if (!BuildConfig.BUNDLE_MODE) {
75
- context.assertOnNativeModulesQueueThread();
76
- }
68
+ context.assertOnJSQueueThread();
77
69
 
78
70
  var jsContext = Objects.requireNonNull(context.getJavaScriptContextHolder()).get();
79
71
  var jsCallInvokerHolder = JSCallInvokerResolver.getJSCallInvokerHolder(context);
80
72
 
81
- mSourceURL = context.getSourceURL();
82
- mBundleWrapper = context.getBundle();
73
+ var sourceURL = context.getSourceURL();
74
+
75
+ ScriptBufferWrapper scriptBufferWrapper = null;
76
+ if (BuildConfig.BUNDLE_MODE) {
77
+ scriptBufferWrapper = new ScriptBufferWrapper(sourceURL, context.getAssets());
78
+ }
83
79
 
84
80
  mHybridData =
85
81
  initHybrid(
@@ -87,8 +83,7 @@ public class WorkletsModule extends NativeWorkletsModuleSpec implements Lifecycl
87
83
  mMessageQueueThread,
88
84
  jsCallInvokerHolder,
89
85
  mAndroidUIScheduler,
90
- mBundleWrapper,
91
- mSourceURL);
86
+ scriptBufferWrapper);
92
87
  return true;
93
88
  }
94
89
 
@@ -1,5 +1,6 @@
1
1
  #import <worklets/NativeModules/JSIWorkletsModuleProxy.h>
2
2
  #import <worklets/Tools/Defs.h>
3
+ #import <worklets/Tools/ScriptBuffer.h>
3
4
  #import <worklets/Tools/SingleInstanceChecker.h>
4
5
  #import <worklets/Tools/WorkletsJSIUtils.h>
5
6
  #import <worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h>
@@ -13,11 +14,6 @@
13
14
  #import <React/RCTBridge+Private.h>
14
15
  #import <React/RCTCallInvoker.h>
15
16
 
16
- #if __has_include(<React/RCTBundleProvider.h>)
17
- // Bundle mode
18
- #import <React/RCTBundleProvider.h>
19
- #endif // __has_include(<React/RCTBundleProvider.h>)
20
-
21
17
  using namespace worklets;
22
18
 
23
19
  @interface RCTBridge (JSIRuntime)
@@ -38,17 +34,13 @@ using namespace worklets;
38
34
  return workletsModuleProxy_;
39
35
  }
40
36
 
41
- #if __has_include(<React/RCTBundleProvider.h>)
42
- // Bundle mode
43
- @synthesize bundleProvider = bundleProvider_;
44
- #endif // __has_include(<React/RCTBundleProvider.h>)
45
-
46
37
  - (void)checkBridgeless
47
38
  {
48
39
  auto isBridgeless = ![self.bridge isKindOfClass:[RCTCxxBridge class]];
49
40
  react_native_assert(isBridgeless && "[Worklets] react-native-worklets only supports bridgeless mode");
50
41
  }
51
42
 
43
+ @synthesize bundleManager = bundleManager_;
52
44
  @synthesize callInvoker = callInvoker_;
53
45
 
54
46
  RCT_EXPORT_MODULE(WorkletsModule);
@@ -67,10 +59,20 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(installTurboModule)
67
59
  std::make_shared<WorkletsMessageThread>([NSRunLoop currentRunLoop], ^(NSError *error) { throw error; });
68
60
 
69
61
  std::string sourceURL = "";
70
- std::shared_ptr<const JSBigStringBuffer> script = nullptr;
62
+ std::shared_ptr<const ScriptBuffer> script = nullptr;
71
63
  #ifdef WORKLETS_BUNDLE_MODE
72
- script = [bundleProvider_ getBundle];
73
- sourceURL = [[bundleProvider_ getSourceURL] UTF8String];
64
+ NSURL *url = bundleManager_.bundleURL;
65
+ NSData *data = [NSData dataWithContentsOfURL:url];
66
+ if (data) {
67
+ auto str = std::string(reinterpret_cast<const char *>([data bytes]), [data length]);
68
+ auto bigString = std::make_shared<const JSBigStdString>(str);
69
+ script = std::make_shared<const ScriptBuffer>(bigString);
70
+ } else {
71
+ NSString *errorMsg = [NSString stringWithFormat:@"[Worklets] Failed to load worklets bundle from URL: %@", url];
72
+ NSLog(@"%@", errorMsg);
73
+ throw std::runtime_error([errorMsg UTF8String]);
74
+ }
75
+ sourceURL = [[url absoluteString] UTF8String];
74
76
  #endif // WORKLETS_BUNDLE_MODE
75
77
 
76
78
  auto jsCallInvoker = callInvoker_.callInvoker;
@@ -15,6 +15,9 @@ class NativeWorklets {
15
15
  globalThis._WORKLETS_VERSION_JS = jsVersion;
16
16
  if (global.__workletsModuleProxy === undefined && globalThis.__RUNTIME_KIND === RuntimeKind.ReactNative) {
17
17
  WorkletsTurboModule?.installTurboModule();
18
+ if (__DEV__ && globalThis._WORKLETS_BUNDLE_MODE) {
19
+ console.log('[Worklets] Bundle mode initialization: Downloaded the bundle for Worklet Runtimes.');
20
+ }
18
21
  }
19
22
  if (global.__workletsModuleProxy === undefined) {
20
23
  throw new WorkletsError(`Native part of Worklets doesn't seem to be initialized.
@@ -1 +1 @@
1
- {"version":3,"names":["checkCppVersion","jsVersion","WorkletsError","RuntimeKind","WorkletsTurboModule","NativeWorklets","workletsModuleProxy","serializableUndefined","serializableNull","serializableTrue","serializableFalse","constructor","globalThis","_WORKLETS_VERSION_JS","global","__workletsModuleProxy","undefined","__RUNTIME_KIND","ReactNative","installTurboModule","__DEV__","createSerializableNull","createSerializableUndefined","createSerializableBoolean","createSerializable","value","shouldPersistRemote","nativeStateSource","createSerializableImport","from","to","createSerializableString","str","createSerializableNumber","num","bool","createSerializableBigInt","bigInt","createSerializableTurboModuleLike","props","proto","createSerializableObject","obj","shouldRetainRemote","createSerializableHostObject","createSerializableArray","array","createSerializableMap","keys","values","createSerializableSet","createSerializableInitializer","createSerializableFunction","func","createSerializableWorklet","worklet","createCustomSerializable","data","typeId","registerCustomSerializable","determine","pack","unpack","scheduleOnUI","serializable","runOnUISync","createWorkletRuntime","name","initializer","useDefaultQueue","customQueue","enableEventLoop","scheduleOnRuntime","workletRuntime","serializableWorklet","runOnRuntimeSync","createSynchronizable","synchronizableGetDirty","synchronizableRef","synchronizableGetBlocking","synchronizableSetBlocking","synchronizableLock","synchronizableUnlock","reportFatalErrorOnJS","message","stack","jsEngine","getStaticFeatureFlag","setDynamicFeatureFlag","WorkletsModule"],"sourceRoot":"../../../src","sources":["WorkletsModule/NativeWorklets.native.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["checkCppVersion","jsVersion","WorkletsError","RuntimeKind","WorkletsTurboModule","NativeWorklets","workletsModuleProxy","serializableUndefined","serializableNull","serializableTrue","serializableFalse","constructor","globalThis","_WORKLETS_VERSION_JS","global","__workletsModuleProxy","undefined","__RUNTIME_KIND","ReactNative","installTurboModule","__DEV__","_WORKLETS_BUNDLE_MODE","console","log","createSerializableNull","createSerializableUndefined","createSerializableBoolean","createSerializable","value","shouldPersistRemote","nativeStateSource","createSerializableImport","from","to","createSerializableString","str","createSerializableNumber","num","bool","createSerializableBigInt","bigInt","createSerializableTurboModuleLike","props","proto","createSerializableObject","obj","shouldRetainRemote","createSerializableHostObject","createSerializableArray","array","createSerializableMap","keys","values","createSerializableSet","createSerializableInitializer","createSerializableFunction","func","createSerializableWorklet","worklet","createCustomSerializable","data","typeId","registerCustomSerializable","determine","pack","unpack","scheduleOnUI","serializable","runOnUISync","createWorkletRuntime","name","initializer","useDefaultQueue","customQueue","enableEventLoop","scheduleOnRuntime","workletRuntime","serializableWorklet","runOnRuntimeSync","createSynchronizable","synchronizableGetDirty","synchronizableRef","synchronizableGetBlocking","synchronizableSetBlocking","synchronizableLock","synchronizableUnlock","reportFatalErrorOnJS","message","stack","jsEngine","getStaticFeatureFlag","setDynamicFeatureFlag","WorkletsModule"],"sourceRoot":"../../../src","sources":["WorkletsModule/NativeWorklets.native.ts"],"mappings":"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","ignoreList":[]}
@@ -5,5 +5,5 @@
5
5
  * version used to build the native part of the library in runtime. Remember to
6
6
  * keep this in sync with the version declared in `package.json`
7
7
  */
8
- export const jsVersion = '0.8.0-nightly-20251214-10058a8fb';
8
+ export const jsVersion = '0.8.0-nightly-20251216-76b4795ca';
9
9
  //# sourceMappingURL=jsVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NativeWorklets.native.d.ts","sourceRoot":"","sources":["../../../src/WorkletsModule/NativeWorklets.native.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AA2Q/B,eAAO,MAAM,cAAc,EAAE,eAAsC,CAAC"}
1
+ {"version":3,"file":"NativeWorklets.native.d.ts","sourceRoot":"","sources":["../../../src/WorkletsModule/NativeWorklets.native.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAgR/B,eAAO,MAAM,cAAc,EAAE,eAAsC,CAAC"}
@@ -3,5 +3,5 @@
3
3
  * version used to build the native part of the library in runtime. Remember to
4
4
  * keep this in sync with the version declared in `package.json`
5
5
  */
6
- export declare const jsVersion = "0.8.0-nightly-20251214-10058a8fb";
6
+ export declare const jsVersion = "0.8.0-nightly-20251216-76b4795ca";
7
7
  //# sourceMappingURL=jsVersion.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-worklets",
3
- "version": "0.8.0-nightly-20251214-10058a8fb",
3
+ "version": "0.8.0-nightly-20251216-76b4795ca",
4
4
  "description": "The React Native multithreading library",
5
5
  "keywords": [
6
6
  "react-native",
@@ -26,6 +26,11 @@ class NativeWorklets implements IWorkletsModule {
26
26
  globalThis.__RUNTIME_KIND === RuntimeKind.ReactNative
27
27
  ) {
28
28
  WorkletsTurboModule?.installTurboModule();
29
+ if (__DEV__ && globalThis._WORKLETS_BUNDLE_MODE) {
30
+ console.log(
31
+ '[Worklets] Bundle mode initialization: Downloaded the bundle for Worklet Runtimes.'
32
+ );
33
+ }
29
34
  }
30
35
  if (global.__workletsModuleProxy === undefined) {
31
36
  throw new WorkletsError(
@@ -5,4 +5,4 @@
5
5
  * version used to build the native part of the library in runtime. Remember to
6
6
  * keep this in sync with the version declared in `package.json`
7
7
  */
8
- export const jsVersion = '0.8.0-nightly-20251214-10058a8fb';
8
+ export const jsVersion = '0.8.0-nightly-20251216-76b4795ca';
@@ -1,122 +0,0 @@
1
- package com.swmansion.worklets;
2
-
3
- import androidx.annotation.OptIn;
4
- import com.facebook.jni.HybridData;
5
- import com.facebook.proguard.annotations.DoNotStrip;
6
- import com.facebook.react.bridge.LifecycleEventListener;
7
- import com.facebook.react.bridge.ReactApplicationContext;
8
- import com.facebook.react.bridge.ReactMethod;
9
- import com.facebook.react.bridge.queue.MessageQueueThread;
10
- import com.facebook.react.common.annotations.FrameworkAPI;
11
- import com.facebook.react.module.annotations.ReactModule;
12
- import com.facebook.react.turbomodule.core.CallInvokerHolderImpl;
13
- import com.facebook.soloader.SoLoader;
14
- import com.swmansion.worklets.runloop.AnimationFrameCallback;
15
- import com.swmansion.worklets.runloop.AnimationFrameQueue;
16
- import java.util.Objects;
17
- import java.util.concurrent.atomic.AtomicBoolean;
18
-
19
- @SuppressWarnings("JavaJniMissingFunction")
20
- @ReactModule(name = WorkletsModule.NAME)
21
- public class WorkletsModule extends NativeWorkletsModuleSpec implements LifecycleEventListener {
22
- static {
23
- SoLoader.loadLibrary("worklets");
24
- }
25
-
26
- @DoNotStrip
27
- @SuppressWarnings("unused")
28
- private HybridData mHybridData;
29
-
30
- @SuppressWarnings("unused")
31
- protected HybridData getHybridData() {
32
- return mHybridData;
33
- }
34
-
35
- private final WorkletsMessageQueueThread mMessageQueueThread = new WorkletsMessageQueueThread();
36
- private final AndroidUIScheduler mAndroidUIScheduler;
37
- private final AnimationFrameQueue mAnimationFrameQueue;
38
- private boolean mSlowAnimationsEnabled;
39
-
40
- /**
41
- * Invalidating concurrently could be fatal. It shouldn't happen in a normal flow, but it doesn't
42
- * cost us much to add synchronization for extra safety.
43
- */
44
- private final AtomicBoolean mInvalidated = new AtomicBoolean(false);
45
-
46
- @OptIn(markerClass = FrameworkAPI.class)
47
- private native HybridData initHybrid(
48
- long jsContext,
49
- MessageQueueThread messageQueueThread,
50
- CallInvokerHolderImpl jsCallInvokerHolder,
51
- AndroidUIScheduler androidUIScheduler);
52
-
53
- public WorkletsModule(ReactApplicationContext reactContext) {
54
- super(reactContext);
55
-
56
- reactContext.assertOnJSQueueThread();
57
-
58
- mAndroidUIScheduler = new AndroidUIScheduler(reactContext);
59
- mAnimationFrameQueue = new AnimationFrameQueue(reactContext);
60
- }
61
-
62
- @OptIn(markerClass = FrameworkAPI.class)
63
- @ReactMethod(isBlockingSynchronousMethod = true)
64
- public boolean installTurboModule() {
65
- var context = getReactApplicationContext();
66
-
67
- context.assertOnJSQueueThread();
68
-
69
- var jsContext = Objects.requireNonNull(context.getJavaScriptContextHolder()).get();
70
- var jsCallInvokerHolder = JSCallInvokerResolver.getJSCallInvokerHolder(context);
71
-
72
- mHybridData =
73
- initHybrid(jsContext, mMessageQueueThread, jsCallInvokerHolder, mAndroidUIScheduler);
74
- return true;
75
- }
76
-
77
- public void requestAnimationFrame(AnimationFrameCallback animationFrameCallback) {
78
- mAnimationFrameQueue.requestAnimationFrame(animationFrameCallback);
79
- }
80
-
81
- /**
82
- * @noinspection unused
83
- */
84
- @DoNotStrip
85
- public boolean isOnJSQueueThread() {
86
- return getReactApplicationContext().isOnJSQueueThread();
87
- }
88
-
89
- public void toggleSlowAnimations() {
90
- final int ANIMATIONS_DRAG_FACTOR = 10;
91
- mSlowAnimationsEnabled = !mSlowAnimationsEnabled;
92
- mAnimationFrameQueue.enableSlowAnimations(mSlowAnimationsEnabled, ANIMATIONS_DRAG_FACTOR);
93
- }
94
-
95
- public void invalidate() {
96
- if (mInvalidated.getAndSet(true)) {
97
- return;
98
- }
99
- if (mHybridData != null && mHybridData.isValid()) {
100
- // We have to destroy extra runtimes when invalidate is called. If we clean
101
- // it up later instead there's a chance the runtime will retain references
102
- // to invalidated memory and will crash on its destruction.
103
- invalidateCpp();
104
- }
105
- mAndroidUIScheduler.deactivate();
106
- }
107
-
108
- private native void invalidateCpp();
109
-
110
- @Override
111
- public void onHostResume() {
112
- mAnimationFrameQueue.resume();
113
- }
114
-
115
- @Override
116
- public void onHostPause() {
117
- mAnimationFrameQueue.pause();
118
- }
119
-
120
- @Override
121
- public void onHostDestroy() {}
122
- }