react-native-worklets 0.3.0 → 0.4.0-bundle-mode-preview-1
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 +532 -0
- package/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h +88 -0
- package/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp +40 -122
- package/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h +16 -40
- package/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.h +2 -1
- package/Common/cpp/worklets/Resources/ValueUnpacker.cpp +1 -1
- package/Common/cpp/worklets/SharedItems/Shareables.cpp +200 -24
- package/Common/cpp/worklets/SharedItems/Shareables.h +108 -7
- package/Common/cpp/worklets/Tools/JSLogger.cpp +56 -4
- package/Common/cpp/worklets/Tools/JSLogger.h +17 -0
- package/Common/cpp/worklets/Tools/JSScheduler.cpp +12 -0
- package/Common/cpp/worklets/Tools/JSScheduler.h +10 -2
- package/Common/cpp/worklets/Tools/SingleInstanceChecker.h +3 -1
- package/Common/cpp/worklets/Tools/WorkletsJSIUtils.cpp +19 -1
- package/Common/cpp/worklets/Tools/WorkletsJSIUtils.h +12 -3
- package/Common/cpp/worklets/Tools/WorkletsSystraceSection.h +136 -0
- package/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp +4 -4
- package/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h +1 -1
- package/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp +85 -0
- package/Common/cpp/worklets/WorkletRuntime/RuntimeManager.h +55 -0
- package/Common/cpp/worklets/WorkletRuntime/WorkletHermesRuntime.h +8 -4
- package/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp +70 -24
- package/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h +24 -4
- package/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp +53 -1
- package/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h +2 -1
- package/RNWorklets.podspec +9 -4
- package/android/CMakeLists.txt +14 -36
- package/android/build.gradle +16 -33
- package/android/src/experimentalBundling/com/swmansion/worklets/WorkletsModule.java +149 -0
- package/android/src/{main/java → legacyBundling}/com/swmansion/worklets/WorkletsModule.java +17 -2
- package/android/src/main/cpp/worklets/android/WorkletsModule.cpp +49 -8
- package/android/src/main/cpp/worklets/android/WorkletsModule.h +17 -2
- package/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java +1 -1
- package/apple/worklets/apple/WorkletsMessageThread.mm +4 -0
- package/apple/worklets/apple/WorkletsModule.h +16 -1
- package/apple/worklets/apple/WorkletsModule.mm +29 -2
- package/bundleMode/index.d.ts +3 -0
- package/bundleMode/index.js +55 -0
- package/lib/module/PlatformChecker/PlatformChecker.js +8 -0
- package/lib/module/PlatformChecker/PlatformChecker.js.map +1 -0
- package/lib/module/PlatformChecker/index.js +17 -0
- package/lib/module/PlatformChecker/index.js.map +1 -0
- package/lib/module/WorkletsError.js +2 -1
- package/lib/module/WorkletsError.js.map +1 -1
- package/lib/module/WorkletsModule/JSWorklets.js +36 -4
- package/lib/module/WorkletsModule/JSWorklets.js.map +1 -1
- package/lib/module/WorkletsModule/NativeWorklets.js +35 -15
- package/lib/module/WorkletsModule/NativeWorklets.js.map +1 -1
- package/lib/module/WorkletsModule/workletsModuleInstance.js +2 -2
- package/lib/module/WorkletsModule/workletsModuleInstance.js.map +1 -1
- package/lib/module/bundleUnpacker.js +47 -0
- package/lib/module/bundleUnpacker.js.map +1 -0
- package/lib/module/callGuard.js +30 -0
- package/lib/module/callGuard.js.map +1 -0
- package/lib/module/errors.js +30 -11
- package/lib/module/errors.js.map +1 -1
- package/lib/module/index.js +10 -7
- package/lib/module/index.js.map +1 -1
- package/lib/module/initializers.js +123 -103
- package/lib/module/initializers.js.map +1 -1
- package/lib/module/logger.js +15 -0
- package/lib/module/logger.js.map +1 -0
- package/lib/module/privateGlobals.d.js +0 -1
- package/lib/module/privateGlobals.d.js.map +1 -1
- package/lib/module/publicGlobals.js +5 -0
- package/lib/module/publicGlobals.js.map +1 -0
- package/lib/module/runLoop/mockedRequestAnimationFrame.js.map +1 -0
- package/lib/module/runLoop/requestAnimationFrame.js +50 -0
- package/lib/module/runLoop/requestAnimationFrame.js.map +1 -0
- package/lib/module/runLoop/setImmediatePolyfill.js +15 -0
- package/lib/module/runLoop/setImmediatePolyfill.js.map +1 -0
- package/lib/module/runLoop/setIntervalPolyfill.js +26 -0
- package/lib/module/runLoop/setIntervalPolyfill.js.map +1 -0
- package/lib/module/runLoop/setTimeoutPolyfill.js +32 -0
- package/lib/module/runLoop/setTimeoutPolyfill.js.map +1 -0
- package/lib/module/runtimes.js +6 -10
- package/lib/module/runtimes.js.map +1 -1
- package/lib/module/shareableMappingCache.js +1 -3
- package/lib/module/shareableMappingCache.js.map +1 -1
- package/lib/module/shareables.js +116 -34
- package/lib/module/shareables.js.map +1 -1
- package/lib/module/specs/index.js +2 -2
- package/lib/module/specs/index.js.map +1 -1
- package/lib/module/threads.js +49 -54
- package/lib/module/threads.js.map +1 -1
- package/lib/module/valueUnpacker.js +3 -3
- package/lib/module/valueUnpacker.js.map +1 -1
- package/lib/module/workletRuntimeEntry.js +30 -0
- package/lib/module/workletRuntimeEntry.js.map +1 -0
- package/lib/typescript/PlatformChecker/PlatformChecker.d.ts +5 -0
- package/lib/typescript/PlatformChecker/PlatformChecker.d.ts.map +1 -0
- package/lib/typescript/PlatformChecker/index.d.ts +10 -0
- package/lib/typescript/PlatformChecker/index.d.ts.map +1 -0
- package/lib/typescript/WorkletsError.d.ts.map +1 -1
- package/lib/typescript/WorkletsModule/JSWorklets.d.ts.map +1 -1
- package/lib/typescript/WorkletsModule/NativeWorklets.d.ts +1 -3
- package/lib/typescript/WorkletsModule/NativeWorklets.d.ts.map +1 -1
- package/lib/typescript/WorkletsModule/workletsModuleInstance.d.ts +1 -1
- package/lib/typescript/WorkletsModule/workletsModuleInstance.d.ts.map +1 -1
- package/lib/typescript/WorkletsModule/workletsModuleInstance.web.d.ts +1 -1
- package/lib/typescript/WorkletsModule/workletsModuleInstance.web.d.ts.map +1 -1
- package/lib/typescript/WorkletsModule/workletsModuleProxy.d.ts +12 -2
- package/lib/typescript/WorkletsModule/workletsModuleProxy.d.ts.map +1 -1
- package/lib/typescript/bundleUnpacker.d.ts +7 -0
- package/lib/typescript/bundleUnpacker.d.ts.map +1 -0
- package/lib/typescript/callGuard.d.ts +4 -0
- package/lib/typescript/callGuard.d.ts.map +1 -0
- package/lib/typescript/errors.d.ts +13 -5
- package/lib/typescript/errors.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/initializers.d.ts +16 -5
- package/lib/typescript/initializers.d.ts.map +1 -1
- package/lib/typescript/logger.d.ts +5 -0
- package/lib/typescript/logger.d.ts.map +1 -0
- package/lib/typescript/publicGlobals.d.ts +22 -0
- package/lib/typescript/publicGlobals.d.ts.map +1 -0
- package/lib/typescript/runLoop/mockedRequestAnimationFrame.d.ts.map +1 -0
- package/lib/typescript/runLoop/requestAnimationFrame.d.ts.map +1 -0
- package/lib/typescript/runLoop/setImmediatePolyfill.d.ts +2 -0
- package/lib/typescript/runLoop/setImmediatePolyfill.d.ts.map +1 -0
- package/lib/typescript/runLoop/setIntervalPolyfill.d.ts +2 -0
- package/lib/typescript/runLoop/setIntervalPolyfill.d.ts.map +1 -0
- package/lib/typescript/runLoop/setTimeoutPolyfill.d.ts +2 -0
- package/lib/typescript/runLoop/setTimeoutPolyfill.d.ts.map +1 -0
- package/lib/typescript/runtimes.d.ts.map +1 -1
- package/lib/typescript/shareableMappingCache.d.ts.map +1 -1
- package/lib/typescript/shareables.d.ts +3 -2
- package/lib/typescript/shareables.d.ts.map +1 -1
- package/lib/typescript/specs/NativeWorkletsModule.d.ts +1 -1
- package/lib/typescript/specs/NativeWorkletsModule.d.ts.map +1 -1
- package/lib/typescript/specs/index.d.ts +2 -2
- package/lib/typescript/specs/index.d.ts.map +1 -1
- package/lib/typescript/threads.d.ts.map +1 -1
- package/lib/typescript/workletRuntimeEntry.d.ts +14 -0
- package/lib/typescript/workletRuntimeEntry.d.ts.map +1 -0
- package/lib/typescript/workletTypes.d.ts +14 -3
- package/lib/typescript/workletTypes.d.ts.map +1 -1
- package/package.json +17 -8
- package/plugin/index.js +145 -52
- package/scripts/worklets_utils.rb +9 -0
- package/src/PlatformChecker/PlatformChecker.ts +7 -0
- package/src/PlatformChecker/index.ts +29 -0
- package/src/WorkletsError.ts +2 -1
- package/src/WorkletsModule/JSWorklets.ts +71 -4
- package/src/WorkletsModule/NativeWorklets.ts +83 -21
- package/src/WorkletsModule/workletsModuleInstance.ts +2 -2
- package/src/WorkletsModule/workletsModuleProxy.ts +49 -1
- package/src/bundleUnpacker.ts +75 -0
- package/src/callGuard.ts +33 -0
- package/src/errors.ts +35 -18
- package/src/index.ts +12 -12
- package/src/initializers.ts +143 -113
- package/src/logger.ts +16 -0
- package/src/privateGlobals.d.ts +22 -6
- package/src/publicGlobals.ts +26 -0
- package/src/runLoop/requestAnimationFrame.ts +67 -0
- package/src/runLoop/setImmediatePolyfill.ts +20 -0
- package/src/runLoop/setIntervalPolyfill.ts +38 -0
- package/src/runLoop/setTimeoutPolyfill.ts +40 -0
- package/src/runtimes.ts +6 -11
- package/src/shareableMappingCache.ts +1 -3
- package/src/shareables.ts +179 -65
- package/src/specs/NativeWorkletsModule.ts +1 -1
- package/src/specs/index.ts +5 -2
- package/src/threads.ts +75 -65
- package/src/valueUnpacker.ts +3 -3
- package/src/workletRuntimeEntry.ts +30 -0
- package/src/workletTypes.ts +22 -5
- package/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp +0 -139
- package/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h +0 -61
- package/android/src/paper/com/swmansion/worklets/NativeWorkletsModuleSpec.java +0 -26
- package/lib/module/PlatformChecker.js +0 -26
- package/lib/module/PlatformChecker.js.map +0 -1
- package/lib/module/animationFrameQueue/mockedRequestAnimationFrame.js.map +0 -1
- package/lib/module/animationFrameQueue/requestAnimationFrame.js +0 -36
- package/lib/module/animationFrameQueue/requestAnimationFrame.js.map +0 -1
- package/lib/module/logger/LogBox.js +0 -15
- package/lib/module/logger/LogBox.js.map +0 -1
- package/lib/module/logger/index.js +0 -5
- package/lib/module/logger/index.js.map +0 -1
- package/lib/module/logger/logger.js +0 -137
- package/lib/module/logger/logger.js.map +0 -1
- package/lib/typescript/PlatformChecker.d.ts +0 -6
- package/lib/typescript/PlatformChecker.d.ts.map +0 -1
- package/lib/typescript/animationFrameQueue/mockedRequestAnimationFrame.d.ts.map +0 -1
- package/lib/typescript/animationFrameQueue/requestAnimationFrame.d.ts.map +0 -1
- package/lib/typescript/logger/LogBox.d.ts +0 -32
- package/lib/typescript/logger/LogBox.d.ts.map +0 -1
- package/lib/typescript/logger/index.d.ts +0 -3
- package/lib/typescript/logger/index.d.ts.map +0 -1
- package/lib/typescript/logger/logger.d.ts +0 -52
- package/lib/typescript/logger/logger.d.ts.map +0 -1
- package/src/PlatformChecker.ts +0 -30
- package/src/animationFrameQueue/requestAnimationFrame.ts +0 -41
- package/src/logger/LogBox.ts +0 -55
- package/src/logger/index.ts +0 -3
- package/src/logger/logger.ts +0 -155
- /package/lib/module/{animationFrameQueue → runLoop}/mockedRequestAnimationFrame.js +0 -0
- /package/lib/typescript/{animationFrameQueue → runLoop}/mockedRequestAnimationFrame.d.ts +0 -0
- /package/lib/typescript/{animationFrameQueue → runLoop}/requestAnimationFrame.d.ts +0 -0
- /package/src/{animationFrameQueue → runLoop}/mockedRequestAnimationFrame.ts +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
IS_JEST as RN_IS_JEST,
|
|
5
|
+
IS_WEB as RN_IS_WEB,
|
|
6
|
+
IS_WINDOWS as RN_IS_WINDOWS,
|
|
7
|
+
SHOULD_BE_USE_WEB as RN_SHOULD_BE_USE_WEB,
|
|
8
|
+
} from './PlatformChecker';
|
|
9
|
+
|
|
10
|
+
let IS_JEST = false;
|
|
11
|
+
let IS_WEB = false;
|
|
12
|
+
let IS_WINDOWS = false;
|
|
13
|
+
let SHOULD_BE_USE_WEB = false;
|
|
14
|
+
|
|
15
|
+
if (!globalThis._WORKLET) {
|
|
16
|
+
IS_JEST = RN_IS_JEST;
|
|
17
|
+
IS_WEB = RN_IS_WEB;
|
|
18
|
+
IS_WINDOWS = RN_IS_WINDOWS;
|
|
19
|
+
SHOULD_BE_USE_WEB = RN_SHOULD_BE_USE_WEB;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
IS_JEST,
|
|
24
|
+
/** @knipIgnore */
|
|
25
|
+
IS_WEB,
|
|
26
|
+
/** @knipIgnore */
|
|
27
|
+
IS_WINDOWS,
|
|
28
|
+
SHOULD_BE_USE_WEB,
|
|
29
|
+
};
|
package/src/WorkletsError.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
/* eslint-disable reanimated/use-worklets-error */
|
|
2
1
|
'use strict';
|
|
3
2
|
|
|
4
3
|
function WorkletsErrorConstructor(message?: string): WorkletsError {
|
|
5
4
|
'worklet';
|
|
6
5
|
const prefix = '[Worklets]';
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line reanimated/use-worklets-error
|
|
7
8
|
const errorInstance = new Error(message ? `${prefix} ${message}` : prefix);
|
|
8
9
|
errorInstance.name = `WorkletsError`;
|
|
9
10
|
return errorInstance as WorkletsError;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
/* eslint-disable reanimated/use-reanimated-error */
|
|
2
1
|
'use strict';
|
|
3
2
|
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { IS_JEST } from '../PlatformChecker';
|
|
4
|
+
import { mockedRequestAnimationFrame } from '../runLoop/mockedRequestAnimationFrame';
|
|
6
5
|
import { WorkletsError } from '../WorkletsError';
|
|
7
6
|
import type { ShareableRef, WorkletRuntime } from '../workletTypes';
|
|
8
7
|
import type { IWorkletsModule } from './workletsModuleProxy';
|
|
@@ -15,7 +14,7 @@ export function createJSWorkletsModule(): IWorkletsModule {
|
|
|
15
14
|
// requestAnimationFrame is unavailable, so we use our mock.
|
|
16
15
|
// It also has to be mocked for Jest purposes (see `initializeUIRuntime`).
|
|
17
16
|
const requestAnimationFrameImpl =
|
|
18
|
-
|
|
17
|
+
IS_JEST || !globalThis.requestAnimationFrame
|
|
19
18
|
? mockedRequestAnimationFrame
|
|
20
19
|
: globalThis.requestAnimationFrame;
|
|
21
20
|
|
|
@@ -62,6 +61,68 @@ class JSWorklets implements IWorkletsModule {
|
|
|
62
61
|
);
|
|
63
62
|
}
|
|
64
63
|
|
|
64
|
+
makeShareableTurboModuleLike<T extends object>(): ShareableRef<T> {
|
|
65
|
+
throw new WorkletsError(
|
|
66
|
+
'makeShareableTurboModuleLike should never be called in JSWorklets.'
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
makeShareableObject<T extends object>(): ShareableRef<T> {
|
|
71
|
+
throw new WorkletsError(
|
|
72
|
+
'makeShareableObject should never be called in JSWorklets.'
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
makeShareableMap(): never {
|
|
77
|
+
throw new WorkletsError(
|
|
78
|
+
'makeShareableMap should never be called in JSWorklets.'
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
makeShareableSet(): never {
|
|
83
|
+
throw new WorkletsError(
|
|
84
|
+
'makeShareableSet should never be called in JSWorklets.'
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
makeShareableImport(): never {
|
|
89
|
+
throw new WorkletsError(
|
|
90
|
+
'makeShareableImport should never be called in JSWorklets.'
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
makeShareableHostObject<T extends object>(): ShareableRef<T> {
|
|
95
|
+
throw new WorkletsError(
|
|
96
|
+
'makeShareableHostObject should never be called in JSWorklets.'
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
makeShareableArray(): ShareableRef<unknown[]> {
|
|
101
|
+
throw new WorkletsError(
|
|
102
|
+
'makeShareableArray should never be called in JSWorklets.'
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
makeShareableInitializer(): ShareableRef<object> {
|
|
107
|
+
throw new WorkletsError(
|
|
108
|
+
'makeShareableInitializer should never be called in JSWorklets.'
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
makeShareableFunction<TArgs extends unknown[], TReturn>(
|
|
113
|
+
_func: (...args: TArgs) => TReturn
|
|
114
|
+
): ShareableRef<TReturn> {
|
|
115
|
+
throw new WorkletsError(
|
|
116
|
+
'makeShareableRemoteFunction should never be called in JSWorklets.'
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
makeShareableWorklet(): ShareableRef<object> {
|
|
121
|
+
throw new WorkletsError(
|
|
122
|
+
'makeShareableWorklet should never be called in JSWorklets.'
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
65
126
|
scheduleOnUI<TValue>(worklet: ShareableRef<TValue>) {
|
|
66
127
|
// TODO: `requestAnimationFrame` should be used exclusively in Reanimated
|
|
67
128
|
|
|
@@ -90,4 +151,10 @@ class JSWorklets implements IWorkletsModule {
|
|
|
90
151
|
'scheduleOnRuntime is not available in JSWorklets.'
|
|
91
152
|
);
|
|
92
153
|
}
|
|
154
|
+
|
|
155
|
+
reportFatalErrorOnJS(): never {
|
|
156
|
+
throw new WorkletsError(
|
|
157
|
+
'reportFatalErrorOnJS should never be called in JSWorklets.'
|
|
158
|
+
);
|
|
159
|
+
}
|
|
93
160
|
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
2
1
|
'use strict';
|
|
3
2
|
|
|
4
3
|
import { WorkletsTurboModule } from '../specs';
|
|
5
4
|
import { WorkletsError } from '../WorkletsError';
|
|
6
5
|
import type { ShareableRef, WorkletRuntime } from '../workletTypes';
|
|
7
|
-
import type {
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
import type {
|
|
7
|
+
IWorkletsModule,
|
|
8
|
+
WorkletsModuleProxy,
|
|
9
|
+
} from './workletsModuleProxy';
|
|
10
10
|
|
|
11
11
|
export function createNativeWorkletsModule(): IWorkletsModule {
|
|
12
12
|
return new NativeWorklets();
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
class NativeWorklets {
|
|
15
|
+
class NativeWorklets implements IWorkletsModule {
|
|
16
16
|
#workletsModuleProxy: WorkletsModuleProxy;
|
|
17
17
|
#shareableUndefined: ShareableRef<undefined>;
|
|
18
18
|
#shareableNull: ShareableRef<null>;
|
|
@@ -20,7 +20,7 @@ class NativeWorklets {
|
|
|
20
20
|
#shareableFalse: ShareableRef<boolean>;
|
|
21
21
|
|
|
22
22
|
constructor() {
|
|
23
|
-
if (global.__workletsModuleProxy === undefined) {
|
|
23
|
+
if (global.__workletsModuleProxy === undefined && !globalThis._WORKLET) {
|
|
24
24
|
WorkletsTurboModule?.installTurboModule();
|
|
25
25
|
}
|
|
26
26
|
if (global.__workletsModuleProxy === undefined) {
|
|
@@ -29,21 +29,7 @@ class NativeWorklets {
|
|
|
29
29
|
See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooting#native-part-of-reanimated-doesnt-seem-to-be-initialized for more details.`
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
|
-
this.#workletsModuleProxy =
|
|
33
|
-
scheduleOnUI: global.__workletsModuleProxy.scheduleOnUI,
|
|
34
|
-
scheduleOnRuntime: global.__workletsModuleProxy.scheduleOnRuntime,
|
|
35
|
-
executeOnUIRuntimeSync:
|
|
36
|
-
global.__workletsModuleProxy.executeOnUIRuntimeSync,
|
|
37
|
-
createWorkletRuntime: global.__workletsModuleProxy.createWorkletRuntime,
|
|
38
|
-
makeShareableClone: global.__workletsModuleProxy.makeShareableClone,
|
|
39
|
-
makeShareableString: global.__workletsModuleProxy.makeShareableString,
|
|
40
|
-
makeShareableNumber: global.__workletsModuleProxy.makeShareableNumber,
|
|
41
|
-
makeShareableBoolean: global.__workletsModuleProxy.makeShareableBoolean,
|
|
42
|
-
makeShareableBigInt: global.__workletsModuleProxy.makeShareableBigInt,
|
|
43
|
-
makeShareableUndefined:
|
|
44
|
-
global.__workletsModuleProxy.makeShareableUndefined,
|
|
45
|
-
makeShareableNull: global.__workletsModuleProxy.makeShareableNull,
|
|
46
|
-
};
|
|
32
|
+
this.#workletsModuleProxy = global.__workletsModuleProxy;
|
|
47
33
|
this.#shareableNull = this.#workletsModuleProxy.makeShareableNull();
|
|
48
34
|
this.#shareableUndefined =
|
|
49
35
|
this.#workletsModuleProxy.makeShareableUndefined();
|
|
@@ -64,6 +50,10 @@ See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooti
|
|
|
64
50
|
);
|
|
65
51
|
}
|
|
66
52
|
|
|
53
|
+
makeShareableImport<TValue>(from: string, to: string): ShareableRef<TValue> {
|
|
54
|
+
return this.#workletsModuleProxy.makeShareableImport(from, to);
|
|
55
|
+
}
|
|
56
|
+
|
|
67
57
|
makeShareableString(str: string) {
|
|
68
58
|
return this.#workletsModuleProxy.makeShareableString(str);
|
|
69
59
|
}
|
|
@@ -88,6 +78,64 @@ See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooti
|
|
|
88
78
|
return this.#shareableNull;
|
|
89
79
|
}
|
|
90
80
|
|
|
81
|
+
makeShareableTurboModuleLike<TProps extends object, TProto extends object>(
|
|
82
|
+
props: TProps,
|
|
83
|
+
proto: TProto
|
|
84
|
+
): ShareableRef<TProps> {
|
|
85
|
+
return this.#workletsModuleProxy.makeShareableTurboModuleLike(props, proto);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
makeShareableObject<T extends object>(
|
|
89
|
+
obj: T,
|
|
90
|
+
shouldRetainRemote: boolean,
|
|
91
|
+
nativeStateSource?: object
|
|
92
|
+
): ShareableRef<T> {
|
|
93
|
+
return this.#workletsModuleProxy.makeShareableObject(
|
|
94
|
+
obj,
|
|
95
|
+
shouldRetainRemote,
|
|
96
|
+
nativeStateSource
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
makeShareableHostObject<T extends object>(obj: T) {
|
|
101
|
+
return this.#workletsModuleProxy.makeShareableHostObject(obj);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
makeShareableArray(array: unknown[], shouldRetainRemote: boolean) {
|
|
105
|
+
return this.#workletsModuleProxy.makeShareableArray(
|
|
106
|
+
array,
|
|
107
|
+
shouldRetainRemote
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
makeShareableMap<TKey, TValue>(
|
|
112
|
+
keys: TKey[],
|
|
113
|
+
values: TValue[]
|
|
114
|
+
): ShareableRef<Map<TKey, TValue>> {
|
|
115
|
+
return this.#workletsModuleProxy.makeShareableMap(keys, values);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
makeShareableSet<TValues>(values: TValues[]): ShareableRef<Set<TValues>> {
|
|
119
|
+
return this.#workletsModuleProxy.makeShareableSet(values);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
makeShareableInitializer(obj: object) {
|
|
123
|
+
return this.#workletsModuleProxy.makeShareableInitializer(obj);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
makeShareableFunction<TArgs extends unknown[], TReturn>(
|
|
127
|
+
func: (...args: TArgs) => TReturn
|
|
128
|
+
) {
|
|
129
|
+
return this.#workletsModuleProxy.makeShareableFunction(func);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
makeShareableWorklet(worklet: object, shouldPersistRemote: boolean) {
|
|
133
|
+
return this.#workletsModuleProxy.makeShareableWorklet(
|
|
134
|
+
worklet,
|
|
135
|
+
shouldPersistRemote
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
91
139
|
scheduleOnUI<TValue>(shareable: ShareableRef<TValue>) {
|
|
92
140
|
return this.#workletsModuleProxy.scheduleOnUI(shareable);
|
|
93
141
|
}
|
|
@@ -111,4 +159,18 @@ See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooti
|
|
|
111
159
|
shareableWorklet
|
|
112
160
|
);
|
|
113
161
|
}
|
|
162
|
+
|
|
163
|
+
reportFatalErrorOnJS(
|
|
164
|
+
message: string,
|
|
165
|
+
stack: string,
|
|
166
|
+
name: string,
|
|
167
|
+
jsEngine: string
|
|
168
|
+
) {
|
|
169
|
+
return this.#workletsModuleProxy.reportFatalErrorOnJS(
|
|
170
|
+
message,
|
|
171
|
+
stack,
|
|
172
|
+
name,
|
|
173
|
+
jsEngine
|
|
174
|
+
);
|
|
175
|
+
}
|
|
114
176
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { SHOULD_BE_USE_WEB } from '../PlatformChecker';
|
|
4
4
|
import { createJSWorkletsModule } from './JSWorklets';
|
|
5
5
|
import { createNativeWorkletsModule } from './NativeWorklets';
|
|
6
6
|
|
|
7
|
-
export const WorkletsModule =
|
|
7
|
+
export const WorkletsModule = SHOULD_BE_USE_WEB
|
|
8
8
|
? createJSWorkletsModule()
|
|
9
9
|
: createNativeWorkletsModule();
|
|
@@ -10,6 +10,11 @@ export interface WorkletsModuleProxy {
|
|
|
10
10
|
nativeStateSource?: object
|
|
11
11
|
): ShareableRef<TValue>;
|
|
12
12
|
|
|
13
|
+
makeShareableImport<TValue>(
|
|
14
|
+
source: string,
|
|
15
|
+
imported: string
|
|
16
|
+
): ShareableRef<TValue>;
|
|
17
|
+
|
|
13
18
|
makeShareableString(str: string): ShareableRef<string>;
|
|
14
19
|
|
|
15
20
|
makeShareableNumber(num: number): ShareableRef<number>;
|
|
@@ -22,6 +27,42 @@ export interface WorkletsModuleProxy {
|
|
|
22
27
|
|
|
23
28
|
makeShareableNull(): ShareableRef<null>;
|
|
24
29
|
|
|
30
|
+
makeShareableTurboModuleLike<TProps extends object, TProto extends object>(
|
|
31
|
+
props: TProps,
|
|
32
|
+
proto: TProto
|
|
33
|
+
): ShareableRef<TProps>;
|
|
34
|
+
|
|
35
|
+
makeShareableObject<T extends object>(
|
|
36
|
+
obj: T,
|
|
37
|
+
shouldRetainRemote: boolean,
|
|
38
|
+
nativeStateSource?: object
|
|
39
|
+
): ShareableRef<T>;
|
|
40
|
+
|
|
41
|
+
makeShareableHostObject<T extends object>(obj: T): ShareableRef<T>;
|
|
42
|
+
|
|
43
|
+
makeShareableArray(
|
|
44
|
+
array: unknown[],
|
|
45
|
+
shouldRetainRemote: boolean
|
|
46
|
+
): ShareableRef<unknown[]>;
|
|
47
|
+
|
|
48
|
+
makeShareableMap<TKey, TValue>(
|
|
49
|
+
keys: TKey[],
|
|
50
|
+
values: TValue[]
|
|
51
|
+
): ShareableRef<Map<TKey, TValue>>;
|
|
52
|
+
|
|
53
|
+
makeShareableSet<TValues>(values: TValues[]): ShareableRef<Set<TValues>>;
|
|
54
|
+
|
|
55
|
+
makeShareableInitializer(obj: object): ShareableRef<object>;
|
|
56
|
+
|
|
57
|
+
makeShareableFunction<TArgs extends unknown[], TReturn>(
|
|
58
|
+
func: (...args: TArgs) => TReturn
|
|
59
|
+
): ShareableRef<TReturn>;
|
|
60
|
+
|
|
61
|
+
makeShareableWorklet(
|
|
62
|
+
worklet: object,
|
|
63
|
+
shouldPersistRemote: boolean
|
|
64
|
+
): ShareableRef<object>;
|
|
65
|
+
|
|
25
66
|
scheduleOnUI<TValue>(shareable: ShareableRef<TValue>): void;
|
|
26
67
|
|
|
27
68
|
executeOnUIRuntimeSync<TValue, TReturn>(
|
|
@@ -37,6 +78,13 @@ export interface WorkletsModuleProxy {
|
|
|
37
78
|
workletRuntime: WorkletRuntime,
|
|
38
79
|
worklet: ShareableRef<TValue>
|
|
39
80
|
): void;
|
|
81
|
+
|
|
82
|
+
reportFatalErrorOnJS(
|
|
83
|
+
message: string,
|
|
84
|
+
stack: string,
|
|
85
|
+
name: string,
|
|
86
|
+
jsEngine: string
|
|
87
|
+
): void;
|
|
40
88
|
}
|
|
41
89
|
|
|
42
|
-
export
|
|
90
|
+
export type IWorkletsModule = WorkletsModuleProxy;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
import { logger } from './logger';
|
|
3
|
+
import { WorkletsError } from './WorkletsError';
|
|
4
|
+
import type { WorkletFactory, WorkletFunction } from './workletTypes';
|
|
5
|
+
|
|
6
|
+
const handleCache = new WeakMap<WorkletFunction, unknown>();
|
|
7
|
+
|
|
8
|
+
export function bundleValueUnpacker(
|
|
9
|
+
objectToUnpack: ObjectToUnpack,
|
|
10
|
+
category?: string,
|
|
11
|
+
remoteFunctionName?: string
|
|
12
|
+
): unknown {
|
|
13
|
+
const workletHash = objectToUnpack.__workletHash;
|
|
14
|
+
if (workletHash !== undefined) {
|
|
15
|
+
return getWorklet(workletHash, objectToUnpack.__closure);
|
|
16
|
+
} else if (objectToUnpack.__init !== undefined) {
|
|
17
|
+
let value = handleCache.get(objectToUnpack);
|
|
18
|
+
if (value === undefined) {
|
|
19
|
+
value = objectToUnpack.__init();
|
|
20
|
+
handleCache.set(objectToUnpack, value);
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
} else if (category === 'RemoteFunction') {
|
|
24
|
+
const remoteFunctionHolder = () => {
|
|
25
|
+
const label = remoteFunctionName
|
|
26
|
+
? `function \`${remoteFunctionName}\``
|
|
27
|
+
: 'anonymous function';
|
|
28
|
+
throw new WorkletsError(`Tried to synchronously call a non-worklet ${label} on the UI thread.
|
|
29
|
+
See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooting#tried-to-synchronously-call-a-non-worklet-function-on-the-ui-thread for more details.`);
|
|
30
|
+
};
|
|
31
|
+
remoteFunctionHolder.__remoteFunction = objectToUnpack;
|
|
32
|
+
return remoteFunctionHolder;
|
|
33
|
+
} else {
|
|
34
|
+
throw new WorkletsError(
|
|
35
|
+
`Data type in category "${category}" not recognized by value unpacker: "${globalThis._toString(
|
|
36
|
+
objectToUnpack
|
|
37
|
+
)}".`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function getWorklet(
|
|
43
|
+
workletHash: number,
|
|
44
|
+
closureVariables: Record<string, unknown>
|
|
45
|
+
): WorkletFunction | undefined {
|
|
46
|
+
let worklet;
|
|
47
|
+
if (__DEV__) {
|
|
48
|
+
try {
|
|
49
|
+
worklet = getWorkletFromMetroRequire(workletHash, closureVariables);
|
|
50
|
+
} catch (_e) {
|
|
51
|
+
logger.error(
|
|
52
|
+
'Unable to resolve worklet with hash' +
|
|
53
|
+
workletHash +
|
|
54
|
+
'try to reload the app.'
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
worklet = getWorkletFromMetroRequire(workletHash, closureVariables);
|
|
59
|
+
}
|
|
60
|
+
return worklet;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const metroRequire = globalThis.__r;
|
|
64
|
+
|
|
65
|
+
function getWorkletFromMetroRequire(
|
|
66
|
+
workletHash: number,
|
|
67
|
+
closureVariables: Record<string, unknown>
|
|
68
|
+
): WorkletFunction {
|
|
69
|
+
const factory = metroRequire(workletHash).default as WorkletFactory;
|
|
70
|
+
return factory(closureVariables);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface ObjectToUnpack extends WorkletFunction {
|
|
74
|
+
_recur: unknown;
|
|
75
|
+
}
|
package/src/callGuard.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import type { RNError } from './errors';
|
|
4
|
+
|
|
5
|
+
/** Used only with debug builds. */
|
|
6
|
+
export function callGuardDEV<Args extends unknown[], ReturnValue>(
|
|
7
|
+
fn: (...args: Args) => ReturnValue,
|
|
8
|
+
...args: Args
|
|
9
|
+
): ReturnValue | void {
|
|
10
|
+
'worklet';
|
|
11
|
+
try {
|
|
12
|
+
return fn(...args);
|
|
13
|
+
} catch (error) {
|
|
14
|
+
if (globalThis.__workletsModuleProxy) {
|
|
15
|
+
const { message, stack, name, jsEngine } = error as RNError;
|
|
16
|
+
globalThis.__workletsModuleProxy.reportFatalErrorOnJS(
|
|
17
|
+
message,
|
|
18
|
+
stack ?? '',
|
|
19
|
+
name ?? 'WorkletsError',
|
|
20
|
+
jsEngine ?? 'Worklets'
|
|
21
|
+
);
|
|
22
|
+
} else {
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function setupCallGuard() {
|
|
29
|
+
'worklet';
|
|
30
|
+
if (!globalThis.__callGuardDEV) {
|
|
31
|
+
globalThis.__callGuardDEV = callGuardDEV;
|
|
32
|
+
}
|
|
33
|
+
}
|
package/src/errors.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
import { WorkletsError } from './WorkletsError';
|
|
3
4
|
import type { WorkletStackDetails } from './workletTypes';
|
|
4
5
|
|
|
5
6
|
const _workletStackDetails = new Map<number, WorkletStackDetails>();
|
|
@@ -23,7 +24,10 @@ function getBundleOffset(error: Error): [string, number, number] {
|
|
|
23
24
|
return ['unknown', 0, 0];
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
function processStack(stack
|
|
27
|
+
function processStack(stack?: string): string | undefined {
|
|
28
|
+
if (stack === '' || stack === undefined) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
27
31
|
const workletStackEntries = stack.match(/worklet_(\d+):(\d+):(\d+)/g);
|
|
28
32
|
let result = stack;
|
|
29
33
|
workletStackEntries?.forEach((match) => {
|
|
@@ -42,22 +46,35 @@ function processStack(stack: string): string {
|
|
|
42
46
|
return result;
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
export
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
export interface RNError extends Error {
|
|
50
|
+
jsEngine: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Remote error is an error coming from a Worklet Runtime that we bubble up to
|
|
55
|
+
* the RN Runtime.
|
|
56
|
+
*/
|
|
57
|
+
export function reportFatalRemoteError(
|
|
58
|
+
{ message, stack, name, jsEngine }: RNError,
|
|
59
|
+
force: boolean
|
|
60
|
+
): void {
|
|
61
|
+
const error = new WorkletsError() as RNError;
|
|
56
62
|
error.message = message;
|
|
57
|
-
error.stack =
|
|
58
|
-
error.name =
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
error.stack = processStack(stack);
|
|
64
|
+
error.name = name;
|
|
65
|
+
error.jsEngine = jsEngine;
|
|
66
|
+
if (force) {
|
|
67
|
+
throw error;
|
|
68
|
+
} else {
|
|
69
|
+
// @ts-expect-error React Native's `ErrorUtils` are hidden from the global scope.
|
|
70
|
+
globalThis.ErrorUtils.reportFatalError(error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Registers `reportFatalRemoteError` function in global scope to allow to
|
|
76
|
+
* invoke it from C++.
|
|
77
|
+
*/
|
|
78
|
+
export function registerReportFatalRemoteError() {
|
|
79
|
+
globalThis.__reportFatalRemoteError = reportFatalRemoteError;
|
|
63
80
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,19 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import { WorkletsModule } from './WorkletsModule';
|
|
3
|
+
import './publicGlobals';
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
import { init } from './initializers';
|
|
6
|
+
import { bundleModeInit } from './workletRuntimeEntry';
|
|
7
|
+
|
|
8
|
+
init();
|
|
9
9
|
|
|
10
|
-
export type { LoggerConfig } from './logger';
|
|
11
|
-
export {
|
|
12
|
-
logger,
|
|
13
|
-
LogLevel,
|
|
14
|
-
registerLoggerConfig,
|
|
15
|
-
updateLoggerConfig,
|
|
16
|
-
} from './logger';
|
|
17
10
|
export { createWorkletRuntime, runOnRuntime } from './runtimes';
|
|
18
11
|
export { shareableMappingCache } from './shareableMappingCache';
|
|
19
12
|
export {
|
|
@@ -37,3 +30,10 @@ export type {
|
|
|
37
30
|
WorkletRuntime,
|
|
38
31
|
WorkletStackDetails,
|
|
39
32
|
} from './workletTypes';
|
|
33
|
+
|
|
34
|
+
// @ts-expect-error We must trick the bundler to include
|
|
35
|
+
// the `workletRuntimeEntry` file the way it cannot optimize it out.
|
|
36
|
+
if (globalThis._ALWAYS_FALSE) {
|
|
37
|
+
// Bundle mode.
|
|
38
|
+
bundleModeInit();
|
|
39
|
+
}
|