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.
- package/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp +1 -13
- package/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h +5 -4
- package/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp +2 -1
- package/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h +3 -2
- package/Common/cpp/worklets/Tools/ScriptBuffer.h +34 -0
- package/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp +2 -3
- package/RNWorklets.podspec +10 -8
- package/android/build.gradle +0 -11
- package/android/src/main/cpp/worklets/android/JScriptBufferWrapper.cpp +67 -0
- package/android/src/main/cpp/worklets/android/JScriptBufferWrapper.h +48 -0
- package/android/src/main/cpp/worklets/android/WorkletsModule.cpp +17 -16
- package/android/src/main/cpp/worklets/android/WorkletsModule.h +6 -13
- package/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp +2 -0
- package/android/src/main/java/com/swmansion/worklets/ScriptBufferWrapper.java +88 -0
- package/android/src/{experimentalBundling → main/java}/com/swmansion/worklets/WorkletsModule.java +10 -15
- package/apple/worklets/apple/WorkletsModule.mm +15 -13
- package/lib/module/WorkletsModule/NativeWorklets.native.js +3 -0
- package/lib/module/WorkletsModule/NativeWorklets.native.js.map +1 -1
- package/lib/module/debug/jsVersion.js +1 -1
- package/lib/typescript/WorkletsModule/NativeWorklets.native.d.ts.map +1 -1
- package/lib/typescript/debug/jsVersion.d.ts +1 -1
- package/package.json +1 -1
- package/src/WorkletsModule/NativeWorklets.native.ts +5 -0
- package/src/debug/jsVersion.ts +1 -1
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
120
|
-
|
|
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")) {
|
package/RNWorklets.podspec
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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" => [
|
package/android/build.gradle
CHANGED
|
@@ -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>
|
|
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
|
|
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>
|
|
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
|
-
|
|
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
|
|
58
|
+
std::shared_ptr<const ScriptBuffer> script = nullptr;
|
|
59
|
+
std::string sourceURL;
|
|
59
60
|
#ifdef WORKLETS_BUNDLE_MODE
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
|
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
|
+
}
|
package/android/src/{experimentalBundling → main/java}/com/swmansion/worklets/WorkletsModule.java
RENAMED
|
@@ -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
|
-
|
|
56
|
-
String sourceURL);
|
|
52
|
+
ScriptBufferWrapper scriptBufferWrapper);
|
|
57
53
|
|
|
58
54
|
public WorkletsModule(ReactApplicationContext reactContext) {
|
|
59
55
|
super(reactContext);
|
|
60
56
|
|
|
61
|
-
|
|
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
|
-
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
|
62
|
+
std::shared_ptr<const ScriptBuffer> script = nullptr;
|
|
71
63
|
#ifdef WORKLETS_BUNDLE_MODE
|
|
72
|
-
|
|
73
|
-
|
|
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":"AAAA,YAAY;;AAEZ,SAASA,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SAASC,aAAa,QAAQ,wBAAwB;AAEtD,SAASC,WAAW,QAAQ,gBAAgB;AAC5C,SAASC,mBAAmB,QAAQ,UAAU;AAO9C,MAAMC,cAAc,CAA4B;EAC9C,CAACC,mBAAmB;EACpB,CAACC,qBAAqB;EACtB,CAACC,gBAAgB;EACjB,CAACC,gBAAgB;EACjB,CAACC,iBAAiB;EAElBC,WAAWA,CAAA,EAAG;IACZC,UAAU,CAACC,oBAAoB,GAAGZ,SAAS;IAC3C,IACEa,MAAM,CAACC,qBAAqB,KAAKC,SAAS,IAC1CJ,UAAU,CAACK,cAAc,KAAKd,WAAW,CAACe,WAAW,EACrD;MACAd,mBAAmB,EAAEe,kBAAkB,CAAC,CAAC;
|
|
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":"AAAA,YAAY;;AAEZ,SAASA,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SAASC,aAAa,QAAQ,wBAAwB;AAEtD,SAASC,WAAW,QAAQ,gBAAgB;AAC5C,SAASC,mBAAmB,QAAQ,UAAU;AAO9C,MAAMC,cAAc,CAA4B;EAC9C,CAACC,mBAAmB;EACpB,CAACC,qBAAqB;EACtB,CAACC,gBAAgB;EACjB,CAACC,gBAAgB;EACjB,CAACC,iBAAiB;EAElBC,WAAWA,CAAA,EAAG;IACZC,UAAU,CAACC,oBAAoB,GAAGZ,SAAS;IAC3C,IACEa,MAAM,CAACC,qBAAqB,KAAKC,SAAS,IAC1CJ,UAAU,CAACK,cAAc,KAAKd,WAAW,CAACe,WAAW,EACrD;MACAd,mBAAmB,EAAEe,kBAAkB,CAAC,CAAC;MACzC,IAAIC,OAAO,IAAIR,UAAU,CAACS,qBAAqB,EAAE;QAC/CC,OAAO,CAACC,GAAG,CACT,oFACF,CAAC;MACH;IACF;IACA,IAAIT,MAAM,CAACC,qBAAqB,KAAKC,SAAS,EAAE;MAC9C,MAAM,IAAId,aAAa,CACrB;AACR,yJACM,CAAC;IACH;IACA,IAAIkB,OAAO,IAAIR,UAAU,CAACK,cAAc,KAAKd,WAAW,CAACe,WAAW,EAAE;MACpElB,eAAe,CAAC,CAAC;IACnB;IACA,IAAI,CAAC,CAACM,mBAAmB,GAAGQ,MAAM,CAACC,qBAAqB;IACxD,IAAI,CAAC,CAACP,gBAAgB,GAAG,IAAI,CAAC,CAACF,mBAAmB,CAACkB,sBAAsB,CAAC,CAAC;IAC3E,IAAI,CAAC,CAACjB,qBAAqB,GACzB,IAAI,CAAC,CAACD,mBAAmB,CAACmB,2BAA2B,CAAC,CAAC;IACzD,IAAI,CAAC,CAAChB,gBAAgB,GACpB,IAAI,CAAC,CAACH,mBAAmB,CAACoB,yBAAyB,CAAC,IAAI,CAAC;IAC3D,IAAI,CAAC,CAAChB,iBAAiB,GACrB,IAAI,CAAC,CAACJ,mBAAmB,CAACoB,yBAAyB,CAAC,KAAK,CAAC;EAC9D;EAEAC,kBAAkBA,CAChBC,KAAa,EACbC,mBAA4B,EAC5BC,iBAA0B,EAC1B;IACA,OAAO,IAAI,CAAC,CAACxB,mBAAmB,CAACqB,kBAAkB,CACjDC,KAAK,EACLC,mBAAmB,EACnBC,iBACF,CAAC;EACH;EAEAC,wBAAwBA,CACtBC,IAAY,EACZC,EAAU,EACe;IACzB,OAAO,IAAI,CAAC,CAAC3B,mBAAmB,CAACyB,wBAAwB,CAACC,IAAI,EAAEC,EAAE,CAAC;EACrE;EAEAC,wBAAwBA,CAACC,GAAW,EAAE;IACpC,OAAO,IAAI,CAAC,CAAC7B,mBAAmB,CAAC4B,wBAAwB,CAACC,GAAG,CAAC;EAChE;EAEAC,wBAAwBA,CAACC,GAAW,EAAE;IACpC,OAAO,IAAI,CAAC,CAAC/B,mBAAmB,CAAC8B,wBAAwB,CAACC,GAAG,CAAC;EAChE;EAEAX,yBAAyBA,CAACY,IAAa,EAAE;IACvC,OAAOA,IAAI,GAAG,IAAI,CAAC,CAAC7B,gBAAgB,GAAG,IAAI,CAAC,CAACC,iBAAiB;EAChE;EAEA6B,wBAAwBA,CAACC,MAAc,EAAE;IACvC,OAAO,IAAI,CAAC,CAAClC,mBAAmB,CAACiC,wBAAwB,CAACC,MAAM,CAAC;EACnE;EAEAf,2BAA2BA,CAAA,EAAG;IAC5B,OAAO,IAAI,CAAC,CAAClB,qBAAqB;EACpC;EAEAiB,sBAAsBA,CAAA,EAAG;IACvB,OAAO,IAAI,CAAC,CAAChB,gBAAgB;EAC/B;EAEAiC,iCAAiCA,CAG/BC,KAAa,EAAEC,KAAa,EAA2B;IACvD,OAAO,IAAI,CAAC,CAACrC,mBAAmB,CAACmC,iCAAiC,CAChEC,KAAK,EACLC,KACF,CAAC;EACH;EAEAC,wBAAwBA,CACtBC,GAAM,EACNC,kBAA2B,EAC3BhB,iBAA0B,EACN;IACpB,OAAO,IAAI,CAAC,CAACxB,mBAAmB,CAACsC,wBAAwB,CACvDC,GAAG,EACHC,kBAAkB,EAClBhB,iBACF,CAAC;EACH;EAEAiB,4BAA4BA,CAAmBF,GAAM,EAAE;IACrD,OAAO,IAAI,CAAC,CAACvC,mBAAmB,CAACyC,4BAA4B,CAACF,GAAG,CAAC;EACpE;EAEAG,uBAAuBA,CAACC,KAAgB,EAAEH,kBAA2B,EAAE;IACrE,OAAO,IAAI,CAAC,CAACxC,mBAAmB,CAAC0C,uBAAuB,CACtDC,KAAK,EACLH,kBACF,CAAC;EACH;EAEAI,qBAAqBA,CACnBC,IAAY,EACZC,MAAgB,EACoB;IACpC,OAAO,IAAI,CAAC,CAAC9C,mBAAmB,CAAC4C,qBAAqB,CAACC,IAAI,EAAEC,MAAM,CAAC;EACtE;EAEAC,qBAAqBA,CACnBD,MAAiB,EACc;IAC/B,OAAO,IAAI,CAAC,CAAC9C,mBAAmB,CAAC+C,qBAAqB,CAACD,MAAM,CAAC;EAChE;EAEAE,6BAA6BA,CAACT,GAAW,EAAE;IACzC,OAAO,IAAI,CAAC,CAACvC,mBAAmB,CAACgD,6BAA6B,CAACT,GAAG,CAAC;EACrE;EAEAU,0BAA0BA,CACxBC,IAAiC,EACjC;IACA,OAAO,IAAI,CAAC,CAAClD,mBAAmB,CAACiD,0BAA0B,CAACC,IAAI,CAAC;EACnE;EAEAC,yBAAyBA,CAACC,OAAe,EAAE7B,mBAA4B,EAAE;IACvE,OAAO,IAAI,CAAC,CAACvB,mBAAmB,CAACmD,yBAAyB,CACxDC,OAAO,EACP7B,mBACF,CAAC;EACH;EAEA8B,wBAAwBA,CACtBC,IAA8B,EAC9BC,MAAc,EACY;IAC1B,OAAO,IAAI,CAAC,CAACvD,mBAAmB,CAACqD,wBAAwB,CAACC,IAAI,EAAEC,MAAM,CAAC;EACzE;EAEAC,0BAA0BA,CACxBC,SAAkC,EAClCC,IAA6B,EAC7BC,MAA+B,EAC/BJ,MAAc,EACR;IACN,IAAI,CAAC,CAACvD,mBAAmB,CAACwD,0BAA0B,CAClDC,SAAS,EACTC,IAAI,EACJC,MAAM,EACNJ,MACF,CAAC;EACH;EAEAK,YAAYA,CAASC,YAAqC,EAAE;IAC1D,OAAO,IAAI,CAAC,CAAC7D,mBAAmB,CAAC4D,YAAY,CAACC,YAAY,CAAC;EAC7D;EAEAC,WAAWA,CAAkBV,OAAgC,EAAW;IACtE,OAAO,IAAI,CAAC,CAACpD,mBAAmB,CAAC8D,WAAW,CAACV,OAAO,CAAC;EACvD;EAEAW,oBAAoBA,CAClBC,IAAY,EACZC,WAAwC,EACxCC,eAAwB,EACxBC,WAA+B,EAC/BC,eAAwB,EACxB;IACA,OAAO,IAAI,CAAC,CAACpE,mBAAmB,CAAC+D,oBAAoB,CACnDC,IAAI,EACJC,WAAW,EACXC,eAAe,EACfC,WAAW,EACXC,eACF,CAAC;EACH;EAEAC,iBAAiBA,CACfC,cAA8B,EAC9BC,mBAAuC,EACvC;IACA,OAAO,IAAI,CAAC,CAACvE,mBAAmB,CAACqE,iBAAiB,CAChDC,cAAc,EACdC,mBACF,CAAC;EACH;EAEAC,gBAAgBA,CACdF,cAA8B,EAC9BlB,OAAgC,EACvB;IACT,OAAO,IAAI,CAAC,CAACpD,mBAAmB,CAACwE,gBAAgB,CAACF,cAAc,EAAElB,OAAO,CAAC;EAC5E;EAEAqB,oBAAoBA,CAASnD,KAAa,EAA6B;IACrE,OAAO,IAAI,CAAC,CAACtB,mBAAmB,CAACyE,oBAAoB,CAACnD,KAAK,CAAC;EAC9D;EAEAoD,sBAAsBA,CACpBC,iBAA4C,EACpC;IACR,OAAO,IAAI,CAAC,CAAC3E,mBAAmB,CAAC0E,sBAAsB,CAACC,iBAAiB,CAAC;EAC5E;EAEAC,yBAAyBA,CACvBD,iBAA4C,EACpC;IACR,OAAO,IAAI,CAAC,CAAC3E,mBAAmB,CAAC4E,yBAAyB,CACxDD,iBACF,CAAC;EACH;EAEAE,yBAAyBA,CACvBF,iBAA4C,EAC5CrD,KAA8B,EAC9B;IACA,OAAO,IAAI,CAAC,CAACtB,mBAAmB,CAAC6E,yBAAyB,CACxDF,iBAAiB,EACjBrD,KACF,CAAC;EACH;EAEAwD,kBAAkBA,CAChBH,iBAA4C,EACtC;IACN,OAAO,IAAI,CAAC,CAAC3E,mBAAmB,CAAC8E,kBAAkB,CAACH,iBAAiB,CAAC;EACxE;EAEAI,oBAAoBA,CAClBJ,iBAA4C,EACtC;IACN,OAAO,IAAI,CAAC,CAAC3E,mBAAmB,CAAC+E,oBAAoB,CAACJ,iBAAiB,CAAC;EAC1E;EAEAK,oBAAoBA,CAClBC,OAAe,EACfC,KAAa,EACblB,IAAY,EACZmB,QAAgB,EAChB;IACA,OAAO,IAAI,CAAC,CAACnF,mBAAmB,CAACgF,oBAAoB,CACnDC,OAAO,EACPC,KAAK,EACLlB,IAAI,EACJmB,QACF,CAAC;EACH;EAEAC,oBAAoBA,CAACpB,IAAY,EAAW;IAC1C,OAAO,IAAI,CAAC,CAAChE,mBAAmB,CAACoF,oBAAoB,CAACpB,IAAI,CAAC;EAC7D;EAEAqB,qBAAqBA,CAACrB,IAAY,EAAE1C,KAAc,EAAE;IAClD,IAAI,CAAC,CAACtB,mBAAmB,CAACqF,qBAAqB,CAACrB,IAAI,EAAE1C,KAAK,CAAC;EAC9D;AACF;AAEA,OAAO,MAAMgE,cAA+B,GAAG,IAAIvF,cAAc,CAAC,CAAC","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-
|
|
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;
|
|
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-
|
|
6
|
+
export declare const jsVersion = "0.8.0-nightly-20251216-76b4795ca";
|
|
7
7
|
//# sourceMappingURL=jsVersion.d.ts.map
|
package/package.json
CHANGED
|
@@ -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(
|
package/src/debug/jsVersion.ts
CHANGED
|
@@ -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-
|
|
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
|
-
}
|