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.
Files changed (202) hide show
  1. package/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp +532 -0
  2. package/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h +88 -0
  3. package/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp +40 -122
  4. package/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h +16 -40
  5. package/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.h +2 -1
  6. package/Common/cpp/worklets/Resources/ValueUnpacker.cpp +1 -1
  7. package/Common/cpp/worklets/SharedItems/Shareables.cpp +200 -24
  8. package/Common/cpp/worklets/SharedItems/Shareables.h +108 -7
  9. package/Common/cpp/worklets/Tools/JSLogger.cpp +56 -4
  10. package/Common/cpp/worklets/Tools/JSLogger.h +17 -0
  11. package/Common/cpp/worklets/Tools/JSScheduler.cpp +12 -0
  12. package/Common/cpp/worklets/Tools/JSScheduler.h +10 -2
  13. package/Common/cpp/worklets/Tools/SingleInstanceChecker.h +3 -1
  14. package/Common/cpp/worklets/Tools/WorkletsJSIUtils.cpp +19 -1
  15. package/Common/cpp/worklets/Tools/WorkletsJSIUtils.h +12 -3
  16. package/Common/cpp/worklets/Tools/WorkletsSystraceSection.h +136 -0
  17. package/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp +4 -4
  18. package/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h +1 -1
  19. package/Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp +85 -0
  20. package/Common/cpp/worklets/WorkletRuntime/RuntimeManager.h +55 -0
  21. package/Common/cpp/worklets/WorkletRuntime/WorkletHermesRuntime.h +8 -4
  22. package/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp +70 -24
  23. package/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h +24 -4
  24. package/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp +53 -1
  25. package/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h +2 -1
  26. package/RNWorklets.podspec +9 -4
  27. package/android/CMakeLists.txt +14 -36
  28. package/android/build.gradle +16 -33
  29. package/android/src/experimentalBundling/com/swmansion/worklets/WorkletsModule.java +149 -0
  30. package/android/src/{main/java → legacyBundling}/com/swmansion/worklets/WorkletsModule.java +17 -2
  31. package/android/src/main/cpp/worklets/android/WorkletsModule.cpp +49 -8
  32. package/android/src/main/cpp/worklets/android/WorkletsModule.h +17 -2
  33. package/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java +1 -1
  34. package/apple/worklets/apple/WorkletsMessageThread.mm +4 -0
  35. package/apple/worklets/apple/WorkletsModule.h +16 -1
  36. package/apple/worklets/apple/WorkletsModule.mm +29 -2
  37. package/bundleMode/index.d.ts +3 -0
  38. package/bundleMode/index.js +55 -0
  39. package/lib/module/PlatformChecker/PlatformChecker.js +8 -0
  40. package/lib/module/PlatformChecker/PlatformChecker.js.map +1 -0
  41. package/lib/module/PlatformChecker/index.js +17 -0
  42. package/lib/module/PlatformChecker/index.js.map +1 -0
  43. package/lib/module/WorkletsError.js +2 -1
  44. package/lib/module/WorkletsError.js.map +1 -1
  45. package/lib/module/WorkletsModule/JSWorklets.js +36 -4
  46. package/lib/module/WorkletsModule/JSWorklets.js.map +1 -1
  47. package/lib/module/WorkletsModule/NativeWorklets.js +35 -15
  48. package/lib/module/WorkletsModule/NativeWorklets.js.map +1 -1
  49. package/lib/module/WorkletsModule/workletsModuleInstance.js +2 -2
  50. package/lib/module/WorkletsModule/workletsModuleInstance.js.map +1 -1
  51. package/lib/module/bundleUnpacker.js +47 -0
  52. package/lib/module/bundleUnpacker.js.map +1 -0
  53. package/lib/module/callGuard.js +30 -0
  54. package/lib/module/callGuard.js.map +1 -0
  55. package/lib/module/errors.js +30 -11
  56. package/lib/module/errors.js.map +1 -1
  57. package/lib/module/index.js +10 -7
  58. package/lib/module/index.js.map +1 -1
  59. package/lib/module/initializers.js +123 -103
  60. package/lib/module/initializers.js.map +1 -1
  61. package/lib/module/logger.js +15 -0
  62. package/lib/module/logger.js.map +1 -0
  63. package/lib/module/privateGlobals.d.js +0 -1
  64. package/lib/module/privateGlobals.d.js.map +1 -1
  65. package/lib/module/publicGlobals.js +5 -0
  66. package/lib/module/publicGlobals.js.map +1 -0
  67. package/lib/module/runLoop/mockedRequestAnimationFrame.js.map +1 -0
  68. package/lib/module/runLoop/requestAnimationFrame.js +50 -0
  69. package/lib/module/runLoop/requestAnimationFrame.js.map +1 -0
  70. package/lib/module/runLoop/setImmediatePolyfill.js +15 -0
  71. package/lib/module/runLoop/setImmediatePolyfill.js.map +1 -0
  72. package/lib/module/runLoop/setIntervalPolyfill.js +26 -0
  73. package/lib/module/runLoop/setIntervalPolyfill.js.map +1 -0
  74. package/lib/module/runLoop/setTimeoutPolyfill.js +32 -0
  75. package/lib/module/runLoop/setTimeoutPolyfill.js.map +1 -0
  76. package/lib/module/runtimes.js +6 -10
  77. package/lib/module/runtimes.js.map +1 -1
  78. package/lib/module/shareableMappingCache.js +1 -3
  79. package/lib/module/shareableMappingCache.js.map +1 -1
  80. package/lib/module/shareables.js +116 -34
  81. package/lib/module/shareables.js.map +1 -1
  82. package/lib/module/specs/index.js +2 -2
  83. package/lib/module/specs/index.js.map +1 -1
  84. package/lib/module/threads.js +49 -54
  85. package/lib/module/threads.js.map +1 -1
  86. package/lib/module/valueUnpacker.js +3 -3
  87. package/lib/module/valueUnpacker.js.map +1 -1
  88. package/lib/module/workletRuntimeEntry.js +30 -0
  89. package/lib/module/workletRuntimeEntry.js.map +1 -0
  90. package/lib/typescript/PlatformChecker/PlatformChecker.d.ts +5 -0
  91. package/lib/typescript/PlatformChecker/PlatformChecker.d.ts.map +1 -0
  92. package/lib/typescript/PlatformChecker/index.d.ts +10 -0
  93. package/lib/typescript/PlatformChecker/index.d.ts.map +1 -0
  94. package/lib/typescript/WorkletsError.d.ts.map +1 -1
  95. package/lib/typescript/WorkletsModule/JSWorklets.d.ts.map +1 -1
  96. package/lib/typescript/WorkletsModule/NativeWorklets.d.ts +1 -3
  97. package/lib/typescript/WorkletsModule/NativeWorklets.d.ts.map +1 -1
  98. package/lib/typescript/WorkletsModule/workletsModuleInstance.d.ts +1 -1
  99. package/lib/typescript/WorkletsModule/workletsModuleInstance.d.ts.map +1 -1
  100. package/lib/typescript/WorkletsModule/workletsModuleInstance.web.d.ts +1 -1
  101. package/lib/typescript/WorkletsModule/workletsModuleInstance.web.d.ts.map +1 -1
  102. package/lib/typescript/WorkletsModule/workletsModuleProxy.d.ts +12 -2
  103. package/lib/typescript/WorkletsModule/workletsModuleProxy.d.ts.map +1 -1
  104. package/lib/typescript/bundleUnpacker.d.ts +7 -0
  105. package/lib/typescript/bundleUnpacker.d.ts.map +1 -0
  106. package/lib/typescript/callGuard.d.ts +4 -0
  107. package/lib/typescript/callGuard.d.ts.map +1 -0
  108. package/lib/typescript/errors.d.ts +13 -5
  109. package/lib/typescript/errors.d.ts.map +1 -1
  110. package/lib/typescript/index.d.ts +1 -2
  111. package/lib/typescript/index.d.ts.map +1 -1
  112. package/lib/typescript/initializers.d.ts +16 -5
  113. package/lib/typescript/initializers.d.ts.map +1 -1
  114. package/lib/typescript/logger.d.ts +5 -0
  115. package/lib/typescript/logger.d.ts.map +1 -0
  116. package/lib/typescript/publicGlobals.d.ts +22 -0
  117. package/lib/typescript/publicGlobals.d.ts.map +1 -0
  118. package/lib/typescript/runLoop/mockedRequestAnimationFrame.d.ts.map +1 -0
  119. package/lib/typescript/runLoop/requestAnimationFrame.d.ts.map +1 -0
  120. package/lib/typescript/runLoop/setImmediatePolyfill.d.ts +2 -0
  121. package/lib/typescript/runLoop/setImmediatePolyfill.d.ts.map +1 -0
  122. package/lib/typescript/runLoop/setIntervalPolyfill.d.ts +2 -0
  123. package/lib/typescript/runLoop/setIntervalPolyfill.d.ts.map +1 -0
  124. package/lib/typescript/runLoop/setTimeoutPolyfill.d.ts +2 -0
  125. package/lib/typescript/runLoop/setTimeoutPolyfill.d.ts.map +1 -0
  126. package/lib/typescript/runtimes.d.ts.map +1 -1
  127. package/lib/typescript/shareableMappingCache.d.ts.map +1 -1
  128. package/lib/typescript/shareables.d.ts +3 -2
  129. package/lib/typescript/shareables.d.ts.map +1 -1
  130. package/lib/typescript/specs/NativeWorkletsModule.d.ts +1 -1
  131. package/lib/typescript/specs/NativeWorkletsModule.d.ts.map +1 -1
  132. package/lib/typescript/specs/index.d.ts +2 -2
  133. package/lib/typescript/specs/index.d.ts.map +1 -1
  134. package/lib/typescript/threads.d.ts.map +1 -1
  135. package/lib/typescript/workletRuntimeEntry.d.ts +14 -0
  136. package/lib/typescript/workletRuntimeEntry.d.ts.map +1 -0
  137. package/lib/typescript/workletTypes.d.ts +14 -3
  138. package/lib/typescript/workletTypes.d.ts.map +1 -1
  139. package/package.json +17 -8
  140. package/plugin/index.js +145 -52
  141. package/scripts/worklets_utils.rb +9 -0
  142. package/src/PlatformChecker/PlatformChecker.ts +7 -0
  143. package/src/PlatformChecker/index.ts +29 -0
  144. package/src/WorkletsError.ts +2 -1
  145. package/src/WorkletsModule/JSWorklets.ts +71 -4
  146. package/src/WorkletsModule/NativeWorklets.ts +83 -21
  147. package/src/WorkletsModule/workletsModuleInstance.ts +2 -2
  148. package/src/WorkletsModule/workletsModuleProxy.ts +49 -1
  149. package/src/bundleUnpacker.ts +75 -0
  150. package/src/callGuard.ts +33 -0
  151. package/src/errors.ts +35 -18
  152. package/src/index.ts +12 -12
  153. package/src/initializers.ts +143 -113
  154. package/src/logger.ts +16 -0
  155. package/src/privateGlobals.d.ts +22 -6
  156. package/src/publicGlobals.ts +26 -0
  157. package/src/runLoop/requestAnimationFrame.ts +67 -0
  158. package/src/runLoop/setImmediatePolyfill.ts +20 -0
  159. package/src/runLoop/setIntervalPolyfill.ts +38 -0
  160. package/src/runLoop/setTimeoutPolyfill.ts +40 -0
  161. package/src/runtimes.ts +6 -11
  162. package/src/shareableMappingCache.ts +1 -3
  163. package/src/shareables.ts +179 -65
  164. package/src/specs/NativeWorkletsModule.ts +1 -1
  165. package/src/specs/index.ts +5 -2
  166. package/src/threads.ts +75 -65
  167. package/src/valueUnpacker.ts +3 -3
  168. package/src/workletRuntimeEntry.ts +30 -0
  169. package/src/workletTypes.ts +22 -5
  170. package/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp +0 -139
  171. package/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h +0 -61
  172. package/android/src/paper/com/swmansion/worklets/NativeWorkletsModuleSpec.java +0 -26
  173. package/lib/module/PlatformChecker.js +0 -26
  174. package/lib/module/PlatformChecker.js.map +0 -1
  175. package/lib/module/animationFrameQueue/mockedRequestAnimationFrame.js.map +0 -1
  176. package/lib/module/animationFrameQueue/requestAnimationFrame.js +0 -36
  177. package/lib/module/animationFrameQueue/requestAnimationFrame.js.map +0 -1
  178. package/lib/module/logger/LogBox.js +0 -15
  179. package/lib/module/logger/LogBox.js.map +0 -1
  180. package/lib/module/logger/index.js +0 -5
  181. package/lib/module/logger/index.js.map +0 -1
  182. package/lib/module/logger/logger.js +0 -137
  183. package/lib/module/logger/logger.js.map +0 -1
  184. package/lib/typescript/PlatformChecker.d.ts +0 -6
  185. package/lib/typescript/PlatformChecker.d.ts.map +0 -1
  186. package/lib/typescript/animationFrameQueue/mockedRequestAnimationFrame.d.ts.map +0 -1
  187. package/lib/typescript/animationFrameQueue/requestAnimationFrame.d.ts.map +0 -1
  188. package/lib/typescript/logger/LogBox.d.ts +0 -32
  189. package/lib/typescript/logger/LogBox.d.ts.map +0 -1
  190. package/lib/typescript/logger/index.d.ts +0 -3
  191. package/lib/typescript/logger/index.d.ts.map +0 -1
  192. package/lib/typescript/logger/logger.d.ts +0 -52
  193. package/lib/typescript/logger/logger.d.ts.map +0 -1
  194. package/src/PlatformChecker.ts +0 -30
  195. package/src/animationFrameQueue/requestAnimationFrame.ts +0 -41
  196. package/src/logger/LogBox.ts +0 -55
  197. package/src/logger/index.ts +0 -3
  198. package/src/logger/logger.ts +0 -155
  199. /package/lib/module/{animationFrameQueue → runLoop}/mockedRequestAnimationFrame.js +0 -0
  200. /package/lib/typescript/{animationFrameQueue → runLoop}/mockedRequestAnimationFrame.d.ts +0 -0
  201. /package/lib/typescript/{animationFrameQueue → runLoop}/requestAnimationFrame.d.ts +0 -0
  202. /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
+ };
@@ -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 { mockedRequestAnimationFrame } from '../animationFrameQueue/mockedRequestAnimationFrame';
5
- import { isJest } from '../PlatformChecker';
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
- isJest() || !globalThis.requestAnimationFrame
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 { WorkletsModuleProxy } from './workletsModuleProxy';
8
-
9
- export interface IWorkletsModule extends WorkletsModuleProxy {}
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 { shouldBeUseWeb } from '../PlatformChecker';
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 = shouldBeUseWeb()
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 interface IWorkletsModule extends WorkletsModuleProxy {}
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
+ }
@@ -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: string): string {
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 function reportFatalErrorOnJS({
46
- message,
47
- stack,
48
- moduleName,
49
- }: {
50
- message: string;
51
- stack?: string;
52
- moduleName: string;
53
- }) {
54
- // eslint-disable-next-line reanimated/use-worklets-error
55
- const error = new Error();
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 = stack ? processStack(stack) : undefined;
58
- error.name = `${moduleName}Error`;
59
- // @ts-ignore React Native's ErrorUtils implementation extends the Error type with jsEngine field
60
- error.jsEngine = moduleName;
61
- // @ts-ignore the reportFatalError method is an internal method of ErrorUtils not exposed in the type definitions
62
- global.ErrorUtils.reportFatalError(error);
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 { initializeUIRuntime } from './initializers';
4
- import { WorkletsModule } from './WorkletsModule';
3
+ import './publicGlobals';
5
4
 
6
- // TODO: Specify the initialization pipeline since now there's no
7
- // universal source of truth for it.
8
- initializeUIRuntime(WorkletsModule);
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
+ }