react-native-skia-webgpu-video 0.0.0-stage → 0.1.0-beta.0

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 (236) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +303 -2
  3. package/android/BUILD_VALIDATION.md +62 -0
  4. package/android/CMakeLists.txt +99 -0
  5. package/android/build-validation.json +262 -0
  6. package/android/build.gradle +185 -0
  7. package/android/cpp/EncoderTargets.cpp +226 -0
  8. package/android/cpp/EncoderTargets.h +70 -0
  9. package/android/cpp/JNIHelpers.cpp +15 -0
  10. package/android/cpp/JNIHelpers.h +20 -0
  11. package/android/cpp/NativeEventDispatcher.cpp +59 -0
  12. package/android/cpp/NativeEventDispatcher.h +31 -0
  13. package/android/cpp/NativeHardwareBuffer.cpp +397 -0
  14. package/android/cpp/NativeHardwareBuffer.h +34 -0
  15. package/android/cpp/NativeRgbaBuffer.cpp +45 -0
  16. package/android/cpp/NativeRgbaBuffer.h +9 -0
  17. package/android/cpp/ReturnedVideoFrames.h +37 -0
  18. package/android/cpp/RgbaFrameLease.h +53 -0
  19. package/android/cpp/VideoCapabilities.cpp +87 -0
  20. package/android/cpp/VideoCapabilities.h +44 -0
  21. package/android/cpp/VideoComposition.cpp +170 -0
  22. package/android/cpp/VideoComposition.h +36 -0
  23. package/android/cpp/VideoCompositionFramesExtractor.cpp +82 -0
  24. package/android/cpp/VideoCompositionFramesExtractor.h +48 -0
  25. package/android/cpp/VideoCompositionFramesExtractorHostObject.cpp +230 -0
  26. package/android/cpp/VideoCompositionFramesExtractorHostObject.h +42 -0
  27. package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.cpp +133 -0
  28. package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.h +46 -0
  29. package/android/cpp/VideoEncoderHostObject.cpp +318 -0
  30. package/android/cpp/VideoEncoderHostObject.h +76 -0
  31. package/android/cpp/VideoFrame.cpp +293 -0
  32. package/android/cpp/VideoFrame.h +27 -0
  33. package/android/cpp/VideoPlayer.cpp +96 -0
  34. package/android/cpp/VideoPlayer.h +52 -0
  35. package/android/cpp/VideoPlayerHostObject.cpp +225 -0
  36. package/android/cpp/VideoPlayerHostObject.h +43 -0
  37. package/android/cpp/cpp-adapter.cpp +316 -0
  38. package/android/gradle.properties +5 -0
  39. package/android/instrumentation-inventory.json +178 -0
  40. package/android/proguard-rules.pro +4 -0
  41. package/android/src/main/AndroidManifest.xml +2 -0
  42. package/android/src/main/java/com/azzapp/rnskv/AudioCompositionExporter.java +537 -0
  43. package/android/src/main/java/com/azzapp/rnskv/AudioCompositionPlayer.java +321 -0
  44. package/android/src/main/java/com/azzapp/rnskv/BufferLifetime.java +55 -0
  45. package/android/src/main/java/com/azzapp/rnskv/DecodeRequests.java +100 -0
  46. package/android/src/main/java/com/azzapp/rnskv/DecoderWindow.java +55 -0
  47. package/android/src/main/java/com/azzapp/rnskv/EGLResourcesHolder.java +132 -0
  48. package/android/src/main/java/com/azzapp/rnskv/EGLUtils.java +225 -0
  49. package/android/src/main/java/com/azzapp/rnskv/FrameSize.java +50 -0
  50. package/android/src/main/java/com/azzapp/rnskv/GLFrameExtractor.java +510 -0
  51. package/android/src/main/java/com/azzapp/rnskv/JNIHelpers.java +12 -0
  52. package/android/src/main/java/com/azzapp/rnskv/NativeEventDispatcher.java +25 -0
  53. package/android/src/main/java/com/azzapp/rnskv/NativeHardwareBuffer.java +62 -0
  54. package/android/src/main/java/com/azzapp/rnskv/NativeRgbaBuffer.java +35 -0
  55. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoModule.java +45 -0
  56. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoPackage.java +43 -0
  57. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoSpec.java +9 -0
  58. package/android/src/main/java/com/azzapp/rnskv/RgbaBufferAllocator.java +83 -0
  59. package/android/src/main/java/com/azzapp/rnskv/RgbaLayout.java +33 -0
  60. package/android/src/main/java/com/azzapp/rnskv/SurfaceOutputPolicy.java +13 -0
  61. package/android/src/main/java/com/azzapp/rnskv/TextureRenderer.java +150 -0
  62. package/android/src/main/java/com/azzapp/rnskv/TimeHelpers.java +11 -0
  63. package/android/src/main/java/com/azzapp/rnskv/VideoCapabilities.java +354 -0
  64. package/android/src/main/java/com/azzapp/rnskv/VideoComposition.java +147 -0
  65. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionDecoder.java +772 -0
  66. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractor.java +354 -0
  67. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractorSync.java +241 -0
  68. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionItemDecoder.java +492 -0
  69. package/android/src/main/java/com/azzapp/rnskv/VideoEncoder.java +639 -0
  70. package/android/src/main/java/com/azzapp/rnskv/VideoFrame.java +74 -0
  71. package/android/src/main/java/com/azzapp/rnskv/VideoPlayer.java +361 -0
  72. package/cpp/RNSVCheckedSizes.h +54 -0
  73. package/cpp/RNSVEventEmitter.cpp +199 -0
  74. package/cpp/RNSVEventEmitter.h +31 -0
  75. package/cpp/RNSVHostObject.cpp +79 -0
  76. package/cpp/RNSVHostObject.h +67 -0
  77. package/cpp/RNSVMemoryBudget.cpp +68 -0
  78. package/cpp/RNSVMemoryBudget.h +100 -0
  79. package/cpp/RNSVRuntimeLifecycleMonitor.cpp +88 -0
  80. package/cpp/RNSVRuntimeLifecycleMonitor.h +33 -0
  81. package/docs/ANDROID_DEVICE_306.md +95 -0
  82. package/docs/ANDROID_EXPORT_CACHE_306.md +48 -0
  83. package/docs/ANDROID_MEMORY_RETENTION_306.md +67 -0
  84. package/docs/BENCHMARKS.md +368 -0
  85. package/docs/IOS_DEVICE_TESTS.md +115 -0
  86. package/docs/IOS_SIMULATOR_TESTS.md +74 -0
  87. package/docs/MIGRATION.md +82 -0
  88. package/docs/NATIVE_MEMORY_INVESTIGATION_306.md +88 -0
  89. package/docs/PERFORMANCE_AB_IPHONE_303.md +196 -0
  90. package/docs/PERFORMANCE_AB_SIMULATOR.md +135 -0
  91. package/docs/PERFORMANCE_AB_SOAK_SIMULATOR.md +84 -0
  92. package/docs/PERFORMANCE_IPHONE_306_OPTIMIZATION.md +76 -0
  93. package/docs/PERFORMANCE_SIMULATOR.md +89 -0
  94. package/docs/PERFORMANCE_SIMULATOR_INITIAL.md +96 -0
  95. package/docs/PERFORMANCE_SOAK_IPHONE_303.md +41 -0
  96. package/docs/UPSTREAM_NOTES.md +188 -0
  97. package/docs/assets/banner.svg +26 -0
  98. package/examples/webgpu-overlay.ts +147 -0
  99. package/ios/AVAssetTrackUtils.h +24 -0
  100. package/ios/AudioCompositionUtils.h +27 -0
  101. package/ios/AudioCompositionUtils.mm +113 -0
  102. package/ios/DecoderWindow.h +52 -0
  103. package/ios/NativeResourceStats.h +32 -0
  104. package/ios/RNSVColorSpace.h +50 -0
  105. package/ios/RNSVJSIUtils.h +46 -0
  106. package/ios/RNSVScopedPixelBuffer.h +17 -0
  107. package/ios/RNSVVideoPlayer.h +46 -0
  108. package/ios/RNSVVideoPlayer.mm +410 -0
  109. package/ios/ReactNativeSkiaVideo.h +8 -0
  110. package/ios/ReactNativeSkiaVideo.mm +310 -0
  111. package/ios/SeekPolicy.h +27 -0
  112. package/ios/VideoComposition.h +148 -0
  113. package/ios/VideoCompositionFramesExtractorHostObject.h +105 -0
  114. package/ios/VideoCompositionFramesExtractorHostObject.mm +686 -0
  115. package/ios/VideoCompositionFramesExtractorSyncHostObject.h +37 -0
  116. package/ios/VideoCompositionFramesExtractorSyncHostObject.mm +168 -0
  117. package/ios/VideoCompositionItemDecoder.h +60 -0
  118. package/ios/VideoCompositionItemDecoder.mm +480 -0
  119. package/ios/VideoEncoderHostObject.h +83 -0
  120. package/ios/VideoEncoderHostObject.mm +706 -0
  121. package/ios/VideoFrame.h +66 -0
  122. package/ios/VideoFrame.mm +108 -0
  123. package/ios/VideoPlayerHostObject.h +52 -0
  124. package/ios/VideoPlayerHostObject.mm +332 -0
  125. package/lib/module/NativeReactNativeSkiaVideo.js +5 -0
  126. package/lib/module/NativeReactNativeSkiaVideo.js.map +1 -0
  127. package/lib/module/RNSkiaVideoModule.js +20 -0
  128. package/lib/module/RNSkiaVideoModule.js.map +1 -0
  129. package/lib/module/canvas.js +18 -0
  130. package/lib/module/canvas.js.map +1 -0
  131. package/lib/module/exportCache.js +22 -0
  132. package/lib/module/exportCache.js.map +1 -0
  133. package/lib/module/exportFrames.js +338 -0
  134. package/lib/module/exportFrames.js.map +1 -0
  135. package/lib/module/exportQueue.js +52 -0
  136. package/lib/module/exportQueue.js.map +1 -0
  137. package/lib/module/exportTarget.js +137 -0
  138. package/lib/module/exportTarget.js.map +1 -0
  139. package/lib/module/exportVideoComposition.js +492 -0
  140. package/lib/module/exportVideoComposition.js.map +1 -0
  141. package/lib/module/frameInterop.js +532 -0
  142. package/lib/module/frameInterop.js.map +1 -0
  143. package/lib/module/gpu.js +222 -0
  144. package/lib/module/gpu.js.map +1 -0
  145. package/lib/module/gpuDevice.js +54 -0
  146. package/lib/module/gpuDevice.js.map +1 -0
  147. package/lib/module/index.js +36 -0
  148. package/lib/module/index.js.map +1 -0
  149. package/lib/module/memory.js +38 -0
  150. package/lib/module/memory.js.map +1 -0
  151. package/lib/module/package.json +1 -0
  152. package/lib/module/previewLifecycle.js +52 -0
  153. package/lib/module/previewLifecycle.js.map +1 -0
  154. package/lib/module/runtimeYield.js +10 -0
  155. package/lib/module/runtimeYield.js.map +1 -0
  156. package/lib/module/types.js +4 -0
  157. package/lib/module/types.js.map +1 -0
  158. package/lib/module/utils/useEventListener.js +18 -0
  159. package/lib/module/utils/useEventListener.js.map +1 -0
  160. package/lib/module/videoCompositionPlayer.js +348 -0
  161. package/lib/module/videoCompositionPlayer.js.map +1 -0
  162. package/lib/module/videoFrameImage.js +185 -0
  163. package/lib/module/videoFrameImage.js.map +1 -0
  164. package/lib/module/videoPlayer.js +172 -0
  165. package/lib/module/videoPlayer.js.map +1 -0
  166. package/lib/module/yuvBlit.js +299 -0
  167. package/lib/module/yuvBlit.js.map +1 -0
  168. package/lib/typescript/package.json +1 -0
  169. package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts +7 -0
  170. package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts.map +1 -0
  171. package/lib/typescript/src/RNSkiaVideoModule.d.ts +4 -0
  172. package/lib/typescript/src/RNSkiaVideoModule.d.ts.map +1 -0
  173. package/lib/typescript/src/canvas.d.ts +4 -0
  174. package/lib/typescript/src/canvas.d.ts.map +1 -0
  175. package/lib/typescript/src/exportCache.d.ts +6 -0
  176. package/lib/typescript/src/exportCache.d.ts.map +1 -0
  177. package/lib/typescript/src/exportFrames.d.ts +57 -0
  178. package/lib/typescript/src/exportFrames.d.ts.map +1 -0
  179. package/lib/typescript/src/exportQueue.d.ts +5 -0
  180. package/lib/typescript/src/exportQueue.d.ts.map +1 -0
  181. package/lib/typescript/src/exportTarget.d.ts +28 -0
  182. package/lib/typescript/src/exportTarget.d.ts.map +1 -0
  183. package/lib/typescript/src/exportVideoComposition.d.ts +68 -0
  184. package/lib/typescript/src/exportVideoComposition.d.ts.map +1 -0
  185. package/lib/typescript/src/frameInterop.d.ts +17 -0
  186. package/lib/typescript/src/frameInterop.d.ts.map +1 -0
  187. package/lib/typescript/src/gpu.d.ts +39 -0
  188. package/lib/typescript/src/gpu.d.ts.map +1 -0
  189. package/lib/typescript/src/gpuDevice.d.ts +11 -0
  190. package/lib/typescript/src/gpuDevice.d.ts.map +1 -0
  191. package/lib/typescript/src/index.d.ts +21 -0
  192. package/lib/typescript/src/index.d.ts.map +1 -0
  193. package/lib/typescript/src/memory.d.ts +25 -0
  194. package/lib/typescript/src/memory.d.ts.map +1 -0
  195. package/lib/typescript/src/previewLifecycle.d.ts +22 -0
  196. package/lib/typescript/src/previewLifecycle.d.ts.map +1 -0
  197. package/lib/typescript/src/runtimeYield.d.ts +4 -0
  198. package/lib/typescript/src/runtimeYield.d.ts.map +1 -0
  199. package/lib/typescript/src/types.d.ts +631 -0
  200. package/lib/typescript/src/types.d.ts.map +1 -0
  201. package/lib/typescript/src/utils/useEventListener.d.ts +5 -0
  202. package/lib/typescript/src/utils/useEventListener.d.ts.map +1 -0
  203. package/lib/typescript/src/videoCompositionPlayer.d.ts +85 -0
  204. package/lib/typescript/src/videoCompositionPlayer.d.ts.map +1 -0
  205. package/lib/typescript/src/videoFrameImage.d.ts +60 -0
  206. package/lib/typescript/src/videoFrameImage.d.ts.map +1 -0
  207. package/lib/typescript/src/videoPlayer.d.ts +99 -0
  208. package/lib/typescript/src/videoPlayer.d.ts.map +1 -0
  209. package/lib/typescript/src/yuvBlit.d.ts +50 -0
  210. package/lib/typescript/src/yuvBlit.d.ts.map +1 -0
  211. package/package.json +154 -4
  212. package/patches/react-native-skia+3.7.0.patch +502 -0
  213. package/react-native-skia-webgpu-video.podspec +35 -0
  214. package/scripts/apply-skia-canvas-patch.mjs +48 -0
  215. package/scripts/skia-canvas-patch.json +291 -0
  216. package/src/NativeReactNativeSkiaVideo.ts +8 -0
  217. package/src/RNSkiaVideoModule.ts +27 -0
  218. package/src/canvas.ts +22 -0
  219. package/src/exportCache.ts +27 -0
  220. package/src/exportFrames.ts +421 -0
  221. package/src/exportQueue.ts +65 -0
  222. package/src/exportTarget.ts +179 -0
  223. package/src/exportVideoComposition.ts +718 -0
  224. package/src/frameInterop.ts +684 -0
  225. package/src/gpu.ts +290 -0
  226. package/src/gpuDevice.ts +80 -0
  227. package/src/index.tsx +45 -0
  228. package/src/memory.ts +48 -0
  229. package/src/previewLifecycle.ts +60 -0
  230. package/src/runtimeYield.ts +6 -0
  231. package/src/types.ts +661 -0
  232. package/src/utils/useEventListener.ts +22 -0
  233. package/src/videoCompositionPlayer.ts +520 -0
  234. package/src/videoFrameImage.ts +205 -0
  235. package/src/videoPlayer.ts +318 -0
  236. package/src/yuvBlit.ts +331 -0
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+
3
+ /// <reference types="@webgpu/types" />
4
+ import { Skia } from "react-native-skia";
5
+ import { GPUTextureUsage } from "react-native-webgpu";
6
+ import { getVideoCanvas } from "./canvas.js";
7
+ import { releaseVideoMemory, reserveVideoMemory } from "./memory.js";
8
+ import { getVideoGpuDevice } from "./gpuDevice.js";
9
+ export { getVideoGpuDevice } from "./gpuDevice.js";
10
+ /** Create once on the consuming runtime, reuse targets across frames, then
11
+ * dispose after removing consumers. Byte accounting is an explicit allocation
12
+ * estimate, not driver RSS: codecs, shaders and driver padding are separate. */
13
+ export const createVideoGpuScope = options => {
14
+ "worklet";
15
+
16
+ const device = getVideoGpuDevice();
17
+ const maxResources = options?.maxResources ?? 32;
18
+ const maxPendingJobs = options?.maxPendingJobs ?? 32;
19
+ if (!Number.isSafeInteger(maxResources) || maxResources <= 0 || maxResources > 256 || !Number.isSafeInteger(maxPendingJobs) || maxPendingJobs <= 0 || maxPendingJobs > 256) {
20
+ throw new Error("Invalid GPU scope bounds");
21
+ }
22
+ const resources = [];
23
+ const pending = new Set();
24
+ // Worklets materializes a separate lexical closure for each nested
25
+ // function. Mutable primitives would be captured as stale copies.
26
+ const state = {
27
+ pendingCount: 0,
28
+ jobGeneration: 0,
29
+ jobFailure: undefined,
30
+ hasJobFailure: false,
31
+ closing: false,
32
+ disposal: null
33
+ };
34
+ const ensureCapacity = () => {
35
+ "worklet";
36
+
37
+ if (state.closing) throw new Error("GPU scope is closing");
38
+ if (resources.length >= maxResources) throw new Error("GPU scope resource limit exceeded");
39
+ };
40
+ const drainGpu = async () => {
41
+ "worklet";
42
+
43
+ // Wait even for rejected ML promises. Those failures do not imply that
44
+ // other concurrent reads have finished.
45
+ for (;;) {
46
+ while (state.pendingCount) await Promise.all([...pending]);
47
+ const generation = state.jobGeneration;
48
+ for (const resource of resources) resource.surface?.flush(true);
49
+ await device.queue.onSubmittedWorkDone();
50
+ // drain() leaves the scope open. A job registered while awaiting the GPU
51
+ // may submit further work after this fence; await that job and a new fence.
52
+ if (!state.pendingCount && state.jobGeneration === generation) return;
53
+ }
54
+ };
55
+ const drain = async () => {
56
+ "worklet";
57
+
58
+ await drainGpu();
59
+ if (state.hasJobFailure) throw state.jobFailure;
60
+ };
61
+ const createTexture = opts => {
62
+ "worklet";
63
+
64
+ ensureCapacity();
65
+ const format = opts.format ?? "rgba8unorm";
66
+ const skia = opts.skia ?? "image";
67
+ const bytesPerPixel = format === "rgba16float" ? 8 : format === "r8unorm" ? 1 : 4;
68
+ const bytes = opts.width * opts.height * bytesPerPixel;
69
+ if (!Number.isSafeInteger(opts.width) || opts.width <= 0 || !Number.isSafeInteger(opts.height) || opts.height <= 0 || !Number.isSafeInteger(bytes) || !["rgba8unorm", "bgra8unorm", "rgba16float", "r8unorm", "depth24plus", "depth32float"].includes(format) || !["image", "surface", "none"].includes(skia) || ["r8unorm", "depth24plus", "depth32float"].includes(format) && skia !== "none") {
70
+ throw new Error("Invalid GPU texture dimensions, format or Skia view");
71
+ }
72
+ const required = skia === "surface" ? GPUTextureUsage.RENDER_ATTACHMENT : skia === "image" ? GPUTextureUsage.TEXTURE_BINDING : 0;
73
+ const usage = (opts.usage ?? GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST) | required;
74
+ const reservation = reserveVideoMemory(bytes, opts.label ?? "video GPU texture");
75
+ const resource = {
76
+ reservation
77
+ };
78
+ try {
79
+ resource.texture = device.createTexture({
80
+ size: {
81
+ width: opts.width,
82
+ height: opts.height
83
+ },
84
+ format,
85
+ usage,
86
+ label: opts.label
87
+ });
88
+ if (skia === "surface") {
89
+ resource.surface = Skia.Surface.MakeFromGPUTexture(resource.texture);
90
+ resource.canvas = getVideoCanvas(resource.surface);
91
+ } else if (skia === "image") {
92
+ resource.image = Skia.Image.MakeImageFromGPUTexture(resource.texture);
93
+ }
94
+ resources.push(resource);
95
+ return {
96
+ texture: resource.texture,
97
+ image: resource.image ?? null,
98
+ surface: resource.surface ?? null,
99
+ canvas: resource.canvas ?? null
100
+ };
101
+ } catch (error) {
102
+ // No texture has been exposed or submitted to any consumer yet.
103
+ try {
104
+ resource.canvas?.dispose();
105
+ resource.canvas = null;
106
+ resource.surface?.dispose();
107
+ resource.surface = null;
108
+ resource.image?.dispose();
109
+ resource.image = null;
110
+ resource.texture?.destroy();
111
+ resource.texture = undefined;
112
+ releaseVideoMemory(reservation);
113
+ } catch {
114
+ // Retain/account partial cleanup failures for the caller's state.disposal.
115
+ resources.push(resource);
116
+ }
117
+ throw error;
118
+ }
119
+ };
120
+ const createBuffer = descriptor => {
121
+ "worklet";
122
+
123
+ ensureCapacity();
124
+ if (!Number.isSafeInteger(descriptor.size) || descriptor.size <= 0) throw new Error("Invalid GPU buffer size");
125
+ const reservation = reserveVideoMemory(descriptor.size, descriptor.label ?? "video GPU buffer");
126
+ try {
127
+ const buffer = device.createBuffer(descriptor);
128
+ resources.push({
129
+ buffer,
130
+ reservation
131
+ });
132
+ return buffer;
133
+ } catch (error) {
134
+ try {
135
+ releaseVideoMemory(reservation);
136
+ } catch {
137
+ // Keep a failed rollback reservation reachable for scope disposal.
138
+ resources.push({
139
+ reservation
140
+ });
141
+ }
142
+ throw error;
143
+ }
144
+ };
145
+ const track = start => {
146
+ "worklet";
147
+
148
+ if (state.closing) throw new Error("GPU scope is closing");
149
+ if (state.pendingCount >= maxPendingJobs) throw new Error("GPU scope pending job limit exceeded");
150
+ state.pendingCount++;
151
+ state.jobGeneration++;
152
+ let job;
153
+ try {
154
+ job = Promise.resolve(start());
155
+ } catch (error) {
156
+ state.pendingCount--;
157
+ throw error;
158
+ }
159
+ let tracked;
160
+ tracked = job.then(() => {
161
+ pending.delete(tracked);
162
+ state.pendingCount--;
163
+ }, error => {
164
+ if (!state.hasJobFailure) {
165
+ state.hasJobFailure = true;
166
+ state.jobFailure = error;
167
+ }
168
+ pending.delete(tracked);
169
+ state.pendingCount--;
170
+ });
171
+ pending.add(tracked);
172
+ return job;
173
+ };
174
+ const dispose = () => {
175
+ "worklet";
176
+
177
+ if (state.disposal) return state.disposal;
178
+ state.closing = true;
179
+ state.disposal = (async () => {
180
+ "worklet";
181
+
182
+ // If this fence fails, preserve all resources rather than destroy any
183
+ // texture whose pending native use can no longer be established.
184
+ await drainGpu();
185
+ let failure;
186
+ let hasFailure = false;
187
+ for (let i = resources.length - 1; i >= 0; i--) {
188
+ const resource = resources[i];
189
+ try {
190
+ resource.image?.dispose();
191
+ resource.image = null;
192
+ resource.canvas?.dispose();
193
+ resource.canvas = null;
194
+ resource.surface?.dispose();
195
+ resource.surface = null;
196
+ resource.texture?.destroy();
197
+ resource.texture = undefined;
198
+ resource.buffer?.destroy();
199
+ resource.buffer = undefined;
200
+ releaseVideoMemory(resource.reservation);
201
+ resources.splice(i, 1);
202
+ } catch (error) {
203
+ if (!hasFailure) {
204
+ hasFailure = true;
205
+ failure = error;
206
+ }
207
+ }
208
+ }
209
+ if (hasFailure) throw failure;
210
+ })();
211
+ return state.disposal;
212
+ };
213
+ return {
214
+ device,
215
+ createTexture,
216
+ createBuffer,
217
+ track,
218
+ drain,
219
+ dispose
220
+ };
221
+ };
222
+ //# sourceMappingURL=gpu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Skia","GPUTextureUsage","getVideoCanvas","releaseVideoMemory","reserveVideoMemory","getVideoGpuDevice","createVideoGpuScope","options","device","maxResources","maxPendingJobs","Number","isSafeInteger","Error","resources","pending","Set","state","pendingCount","jobGeneration","jobFailure","undefined","hasJobFailure","closing","disposal","ensureCapacity","length","drainGpu","Promise","all","generation","resource","surface","flush","queue","onSubmittedWorkDone","drain","createTexture","opts","format","skia","bytesPerPixel","bytes","width","height","includes","required","RENDER_ATTACHMENT","TEXTURE_BINDING","usage","COPY_SRC","COPY_DST","reservation","label","texture","size","Surface","MakeFromGPUTexture","canvas","image","Image","MakeImageFromGPUTexture","push","error","dispose","destroy","createBuffer","descriptor","buffer","track","start","job","resolve","tracked","then","delete","add","failure","hasFailure","i","splice"],"sourceRoot":"../../src","sources":["gpu.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ /// <reference types="@webgpu/types" />
4
+ import { Platform } from "react-native";
5
+ import { Skia } from "react-native-skia";
6
+ import { GPUBufferUsage, GPUShaderStage, GPUTextureUsage, importDevice, installWebGPU } from "react-native-webgpu";
7
+ import RNSkiaVideoModule from "./RNSkiaVideoModule.js";
8
+
9
+ // Evaluate on the RN runtime. NativeObject serializers carry these objects to
10
+ // each consuming worklet; installWebGPU does not install RNWebGPU there.
11
+ // Never destroy the shared Graphite device or call methods across runtimes on
12
+ // a command encoder. Each caller owns its own per-runtime import resources.
13
+ const sharedDevice = importDevice(Skia.getNativeDevice());
14
+ const nativeWebGPU = globalThis.RNWebGPU;
15
+
16
+ // Negotiate before any Android decoder is prepared. The native side starts in
17
+ // CPU mode and probes EGL/AHB setup only when this shared Dawn device can
18
+ // import and end access to AHBs. Missing capability is a clean CPU fallback;
19
+ // budget failures, OOM and unrelated setup errors must remain visible.
20
+ if (Platform.OS === "android" && RNSkiaVideoModule.configureNativeBufferInterop) {
21
+ const features = sharedDevice.features;
22
+ const supported = Boolean(typeof nativeWebGPU?.createVideoFrameFromNativeBuffer === "function" && typeof features?.has === "function" && features.has("shared-texture-memory-ahardware-buffer") && features.has("shared-fence-sync-fd"));
23
+ try {
24
+ RNSkiaVideoModule.configureNativeBufferInterop(supported);
25
+ } catch (error) {
26
+ if (!supported || !(error instanceof Error) || !error.message.includes("Android native buffer interop unavailable:")) throw error;
27
+ RNSkiaVideoModule.configureNativeBufferInterop(false);
28
+ }
29
+ }
30
+ export const getVideoGpuDevice = () => {
31
+ "worklet";
32
+
33
+ installWebGPU();
34
+ return sharedDevice;
35
+ };
36
+ export const createNativeVideoGpuFrame = pointer => {
37
+ "worklet";
38
+
39
+ if (!nativeWebGPU) throw new Error("React Native WebGPU is missing from the native app");
40
+ return nativeWebGPU.createVideoFrameFromNativeBuffer(pointer);
41
+ };
42
+ export const nativeVideoTextureUsage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;
43
+
44
+ // CPU RGBA uploads additionally need COPY_DST. Keep the native-buffer blit's
45
+ // descriptor unchanged: that path renders into its destination attachment.
46
+ export const rgbaVideoTextureUsage = nativeVideoTextureUsage | GPUTextureUsage.COPY_DST;
47
+
48
+ // The flag globals exist only on the RN runtime: worklets capture these.
49
+ export const videoShaderStages = {
50
+ vertex: GPUShaderStage.VERTEX,
51
+ fragment: GPUShaderStage.FRAGMENT
52
+ };
53
+ export const videoUniformBufferUsage = GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST;
54
+ //# sourceMappingURL=gpuDevice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Platform","Skia","GPUBufferUsage","GPUShaderStage","GPUTextureUsage","importDevice","installWebGPU","RNSkiaVideoModule","sharedDevice","getNativeDevice","nativeWebGPU","globalThis","RNWebGPU","OS","configureNativeBufferInterop","features","supported","Boolean","createVideoFrameFromNativeBuffer","has","error","Error","message","includes","getVideoGpuDevice","createNativeVideoGpuFrame","pointer","nativeVideoTextureUsage","RENDER_ATTACHMENT","TEXTURE_BINDING","COPY_SRC","rgbaVideoTextureUsage","COPY_DST","videoShaderStages","vertex","VERTEX","fragment","FRAGMENT","videoUniformBufferUsage","UNIFORM"],"sourceRoot":"../../src","sources":["gpuDevice.ts"],"mappings":";;AAAA;AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,IAAI,QAAQ,mBAAmB;AACxC,SACEC,cAAc,EACdC,cAAc,EACdC,eAAe,EACfC,YAAY,EACZC,aAAa,QACR,qBAAqB;AAE5B,OAAOC,iBAAiB,MAAM,wBAAqB;;AAEnD;AACA;AACA;AACA;AACA,MAAMC,YAAY,GAAGH,YAAY,CAACJ,IAAI,CAACQ,eAAe,CAAC,CAAC,CAAC;AACzD,MAAMC,YAAY,GAAGC,UAAU,CAACC,QAAQ;;AAExC;AACA;AACA;AACA;AACA,IACEZ,QAAQ,CAACa,EAAE,KAAK,SAAS,IACzBN,iBAAiB,CAACO,4BAA4B,EAC9C;EACA,MAAMC,QAAQ,GAAGP,YAAY,CAACO,QAA2C;EACzE,MAAMC,SAAS,GAAGC,OAAO,CACvB,OAAOP,YAAY,EAAEQ,gCAAgC,KAAK,UAAU,IACpE,OAAOH,QAAQ,EAAEI,GAAG,KAAK,UAAU,IACnCJ,QAAQ,CAACI,GAAG,CAAC,wCAAwC,CAAC,IACtDJ,QAAQ,CAACI,GAAG,CAAC,sBAAsB,CACrC,CAAC;EACD,IAAI;IACFZ,iBAAiB,CAACO,4BAA4B,CAACE,SAAS,CAAC;EAC3D,CAAC,CAAC,OAAOI,KAAK,EAAE;IACd,IACE,CAACJ,SAAS,IACV,EAAEI,KAAK,YAAYC,KAAK,CAAC,IACzB,CAACD,KAAK,CAACE,OAAO,CAACC,QAAQ,CAAC,4CAA4C,CAAC,EAErE,MAAMH,KAAK;IACbb,iBAAiB,CAACO,4BAA4B,CAAC,KAAK,CAAC;EACvD;AACF;AAEA,OAAO,MAAMU,iBAAiB,GAAGA,CAAA,KAAiB;EAChD,SAAS;;EACTlB,aAAa,CAAC,CAAC;EACf,OAAOE,YAAY;AACrB,CAAC;AAED,OAAO,MAAMiB,yBAAyB,GACpCC,OAAe,IACM;EACrB,SAAS;;EACT,IAAI,CAAChB,YAAY,EACf,MAAM,IAAIW,KAAK,CAAC,oDAAoD,CAAC;EACvE,OAAOX,YAAY,CAACQ,gCAAgC,CAACQ,OAAO,CAAC;AAC/D,CAAC;AAED,OAAO,MAAMC,uBAAuB,GAClCvB,eAAe,CAACwB,iBAAiB,GACjCxB,eAAe,CAACyB,eAAe,GAC/BzB,eAAe,CAAC0B,QAAQ;;AAE1B;AACA;AACA,OAAO,MAAMC,qBAAqB,GAChCJ,uBAAuB,GAAGvB,eAAe,CAAC4B,QAAQ;;AAEpD;AACA,OAAO,MAAMC,iBAAiB,GAAG;EAC/BC,MAAM,EAAE/B,cAAc,CAACgC,MAAM;EAC7BC,QAAQ,EAAEjC,cAAc,CAACkC;AAC3B,CAAC;AACD,OAAO,MAAMC,uBAAuB,GAClCpC,cAAc,CAACqC,OAAO,GAAGrC,cAAc,CAAC8B,QAAQ","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ import RNSkiaVideoModule from "./RNSkiaVideoModule.js";
4
+ import { Platform } from 'react-native';
5
+ export { RNSkiaVideoModule as __RNSkiaVideoPrivateAPI };
6
+ export * from "./types.js";
7
+ export * from "./videoPlayer.js";
8
+ export * from "./videoCompositionPlayer.js";
9
+ export * from "./exportVideoComposition.js";
10
+ export * from "./videoFrameImage.js";
11
+ export { clearVideoFrameImages, releaseVideoFrameImage } from "./frameInterop.js";
12
+ export { configureVideoMemory, getVideoResourceStats } from "./memory.js";
13
+ export const getValidEncoderConfigurations = (...args) => {
14
+ if (Platform.OS === 'android') {
15
+ return RNSkiaVideoModule.getValidEncoderConfigurations(...args);
16
+ } else {
17
+ throw new Error('getValidEncoderConfigurations is only available on Android');
18
+ }
19
+ };
20
+ export const getDecodingCapabilitiesFor = (...args) => {
21
+ if (Platform.OS === 'android') {
22
+ return RNSkiaVideoModule.getDecodingCapabilitiesFor(...args);
23
+ } else {
24
+ throw new Error('getDecodingCapabilitiesFor is only available on Android');
25
+ }
26
+ };
27
+
28
+ /**
29
+ * Whether the device can encode with the given codec.
30
+ *
31
+ * Unlike the two above this is answered on both platforms. Use it to decide
32
+ * whether to offer a codec at all; exports fall back to H.264 by themselves
33
+ * when the answer is false.
34
+ */
35
+ export const isEncodingSupported = (...args) => RNSkiaVideoModule.isEncodingSupported(...args);
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["RNSkiaVideoModule","Platform","__RNSkiaVideoPrivateAPI","clearVideoFrameImages","releaseVideoFrameImage","configureVideoMemory","getVideoResourceStats","getValidEncoderConfigurations","args","OS","Error","getDecodingCapabilitiesFor","isEncodingSupported"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,iBAAiB,MAAM,wBAAqB;AACnD,SAASC,QAAQ,QAAQ,cAAc;AAEvC,SAASD,iBAAiB,IAAIE,uBAAuB;AAErD,cAAc,YAAS;AACvB,cAAc,kBAAe;AAC7B,cAAc,6BAA0B;AACxC,cAAc,6BAA0B;AACxC,cAAc,sBAAmB;AACjC,SAASC,qBAAqB,EAAEC,sBAAsB,QAAQ,mBAAgB;AAC9E,SAASC,oBAAoB,EAAEC,qBAAqB,QAAQ,aAAU;AAGtE,OAAO,MAAMC,6BAAqF,GAChGA,CAAC,GAAGC,IAAI,KAAK;EACX,IAAIP,QAAQ,CAACQ,EAAE,KAAK,SAAS,EAAE;IAC7B,OAAOT,iBAAiB,CAACO,6BAA6B,CAAC,GAAGC,IAAI,CAAC;EACjE,CAAC,MAAM;IACL,MAAM,IAAIE,KAAK,CACb,4DACF,CAAC;EACH;AACF,CAAC;AAEH,OAAO,MAAMC,0BAA+E,GAC1FA,CAAC,GAAGH,IAAI,KAAK;EACX,IAAIP,QAAQ,CAACQ,EAAE,KAAK,SAAS,EAAE;IAC7B,OAAOT,iBAAiB,CAACW,0BAA0B,CAAC,GAAGH,IAAI,CAAC;EAC9D,CAAC,MAAM;IACL,MAAM,IAAIE,KAAK,CACb,yDACF,CAAC;EACH;AACF,CAAC;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,mBAAiE,GAC5EA,CAAC,GAAGJ,IAAI,KAAKR,iBAAiB,CAACY,mBAAmB,CAAC,GAAGJ,IAAI,CAAC","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ import RNSkiaVideoModule from "./RNSkiaVideoModule.js";
4
+ /** Limits library-owned reservations across preview and export runtimes.
5
+ * Driver/codec caches must additionally be measured on the device. */
6
+ export const configureVideoMemory = ({
7
+ maxBytes
8
+ }) => {
9
+ if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) {
10
+ throw new Error("maxBytes must be a positive safe integer");
11
+ }
12
+ RNSkiaVideoModule.configureMemoryBudget(maxBytes);
13
+ };
14
+ export const getVideoResourceStats = () => ({
15
+ budget: RNSkiaVideoModule.getMemoryBudgetStats?.() ?? null,
16
+ native: RNSkiaVideoModule.getResourceStats?.() ?? null,
17
+ backend: RNSkiaVideoModule.getBackendInfo?.() ?? null
18
+ });
19
+ export const frameByteSize = (width, height) => {
20
+ "worklet";
21
+
22
+ const bytes = width * height * 4;
23
+ if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width <= 0 || height <= 0 || !Number.isSafeInteger(bytes)) {
24
+ throw new Error("Invalid video frame dimensions");
25
+ }
26
+ return bytes;
27
+ };
28
+ export const reserveVideoMemory = (bytes, label) => {
29
+ "worklet";
30
+
31
+ return RNSkiaVideoModule.reserveMemory?.(bytes, label) ?? 0;
32
+ };
33
+ export const releaseVideoMemory = reservation => {
34
+ "worklet";
35
+
36
+ if (reservation) RNSkiaVideoModule.releaseMemory?.(reservation);
37
+ };
38
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["RNSkiaVideoModule","configureVideoMemory","maxBytes","Number","isSafeInteger","Error","configureMemoryBudget","getVideoResourceStats","budget","getMemoryBudgetStats","native","getResourceStats","backend","getBackendInfo","frameByteSize","width","height","bytes","reserveVideoMemory","label","reserveMemory","releaseVideoMemory","reservation","releaseMemory"],"sourceRoot":"../../src","sources":["memory.ts"],"mappings":";;AAAA,OAAOA,iBAAiB,MAAM,wBAAqB;AASnD;AACA;AACA,OAAO,MAAMC,oBAAoB,GAAGA,CAAC;EAAEC;AAA+B,CAAC,KAAK;EAC1E,IAAI,CAACC,MAAM,CAACC,aAAa,CAACF,QAAQ,CAAC,IAAIA,QAAQ,IAAI,CAAC,EAAE;IACpD,MAAM,IAAIG,KAAK,CAAC,0CAA0C,CAAC;EAC7D;EACAL,iBAAiB,CAACM,qBAAqB,CAAEJ,QAAQ,CAAC;AACpD,CAAC;AAED,OAAO,MAAMK,qBAAqB,GAAGA,CAAA,MAAO;EAC1CC,MAAM,EAAER,iBAAiB,CAACS,oBAAoB,GAAG,CAAC,IAAI,IAAI;EAC1DC,MAAM,EAAEV,iBAAiB,CAACW,gBAAgB,GAAG,CAAC,IAAI,IAAI;EACtDC,OAAO,EAAEZ,iBAAiB,CAACa,cAAc,GAAG,CAAC,IAAI;AACnD,CAAC,CAAC;AAEF,OAAO,MAAMC,aAAa,GAAGA,CAACC,KAAa,EAAEC,MAAc,KAAa;EACtE,SAAS;;EACT,MAAMC,KAAK,GAAGF,KAAK,GAAGC,MAAM,GAAG,CAAC;EAChC,IACE,CAACb,MAAM,CAACC,aAAa,CAACW,KAAK,CAAC,IAC5B,CAACZ,MAAM,CAACC,aAAa,CAACY,MAAM,CAAC,IAC7BD,KAAK,IAAI,CAAC,IACVC,MAAM,IAAI,CAAC,IACX,CAACb,MAAM,CAACC,aAAa,CAACa,KAAK,CAAC,EAC5B;IACA,MAAM,IAAIZ,KAAK,CAAC,gCAAgC,CAAC;EACnD;EACA,OAAOY,KAAK;AACd,CAAC;AAED,OAAO,MAAMC,kBAAkB,GAAGA,CAACD,KAAa,EAAEE,KAAa,KAAa;EAC1E,SAAS;;EACT,OAAOnB,iBAAiB,CAACoB,aAAa,GAAGH,KAAK,EAAEE,KAAK,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,OAAO,MAAME,kBAAkB,GAAIC,WAAmB,IAAW;EAC/D,SAAS;;EACT,IAAIA,WAAW,EAAEtB,iBAAiB,CAACuB,aAAa,GAAGD,WAAW,CAAC;AACjE,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ import { releaseVideoFrameImage } from "./frameInterop.js";
4
+ import { releaseVideoMemory } from "./memory.js";
5
+ /** Private UI-runtime quarantine. Detach consumers before calling this helper.
6
+ * A failed drain keeps every potentially referenced resource and its accounting
7
+ * alive until runtime teardown; native codecs can still close independently. */
8
+ export const disposePreviewResources = resources => {
9
+ "worklet";
10
+
11
+ const failure = {
12
+ failed: false,
13
+ error: undefined
14
+ };
15
+ try {
16
+ resources.surface?.flush(true);
17
+ resources.afterDraw?.();
18
+ resources.afterDraw = null;
19
+ while (resources.images?.length) {
20
+ resources.images[0]?.dispose();
21
+ resources.images.shift();
22
+ }
23
+ while (resources.frames?.length) {
24
+ const frame = resources.frames[0];
25
+ releaseVideoFrameImage(frame);
26
+ frame.dispose?.();
27
+ resources.frames.shift();
28
+ }
29
+ resources.canvas?.dispose();
30
+ resources.canvas = null;
31
+ resources.surface?.dispose();
32
+ resources.surface = null;
33
+ releaseVideoMemory(resources.reservation ?? 0);
34
+ resources.reservation = 0;
35
+ } catch (error) {
36
+ failure.failed = true;
37
+ failure.error = error;
38
+ }
39
+ try {
40
+ resources.native?.dispose();
41
+ resources.native = null;
42
+ } catch (error) {
43
+ if (!failure.failed) failure.error = error;
44
+ failure.failed = true;
45
+ }
46
+ if (failure.failed) {
47
+ const runtime = globalThis;
48
+ (runtime.__rnskwgpuPreviewQuarantine ??= []).push(resources);
49
+ }
50
+ return failure;
51
+ };
52
+ //# sourceMappingURL=previewLifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["releaseVideoFrameImage","releaseVideoMemory","disposePreviewResources","resources","failure","failed","error","undefined","surface","flush","afterDraw","images","length","dispose","shift","frames","frame","canvas","reservation","native","runtime","globalThis","__rnskwgpuPreviewQuarantine","push"],"sourceRoot":"../../src","sources":["previewLifecycle.ts"],"mappings":";;AACA,SAASA,sBAAsB,QAAQ,mBAAgB;AACvD,SAASC,kBAAkB,QAAQ,aAAU;AAa7C;AACA;AACA;AACA,OAAO,MAAMC,uBAAuB,GAAIC,SAA2B,IAAK;EACtE,SAAS;;EACT,MAAMC,OAAO,GAAG;IAAEC,MAAM,EAAE,KAAK;IAAEC,KAAK,EAAEC;EAAqB,CAAC;EAC9D,IAAI;IACFJ,SAAS,CAACK,OAAO,EAAEC,KAAK,CAAC,IAAI,CAAC;IAC9BN,SAAS,CAACO,SAAS,GAAG,CAAC;IACvBP,SAAS,CAACO,SAAS,GAAG,IAAI;IAC1B,OAAOP,SAAS,CAACQ,MAAM,EAAEC,MAAM,EAAE;MAC/BT,SAAS,CAACQ,MAAM,CAAC,CAAC,CAAC,EAAEE,OAAO,CAAC,CAAC;MAC9BV,SAAS,CAACQ,MAAM,CAACG,KAAK,CAAC,CAAC;IAC1B;IACA,OAAOX,SAAS,CAACY,MAAM,EAAEH,MAAM,EAAE;MAC/B,MAAMI,KAAK,GAAGb,SAAS,CAACY,MAAM,CAAC,CAAC,CAAE;MAClCf,sBAAsB,CAACgB,KAAK,CAAC;MAC7BA,KAAK,CAACH,OAAO,GAAG,CAAC;MACjBV,SAAS,CAACY,MAAM,CAACD,KAAK,CAAC,CAAC;IAC1B;IACAX,SAAS,CAACc,MAAM,EAAEJ,OAAO,CAAC,CAAC;IAC3BV,SAAS,CAACc,MAAM,GAAG,IAAI;IACvBd,SAAS,CAACK,OAAO,EAAEK,OAAO,CAAC,CAAC;IAC5BV,SAAS,CAACK,OAAO,GAAG,IAAI;IACxBP,kBAAkB,CAACE,SAAS,CAACe,WAAW,IAAI,CAAC,CAAC;IAC9Cf,SAAS,CAACe,WAAW,GAAG,CAAC;EAC3B,CAAC,CAAC,OAAOZ,KAAK,EAAE;IACdF,OAAO,CAACC,MAAM,GAAG,IAAI;IACrBD,OAAO,CAACE,KAAK,GAAGA,KAAK;EACvB;EACA,IAAI;IACFH,SAAS,CAACgB,MAAM,EAAEN,OAAO,CAAC,CAAC;IAC3BV,SAAS,CAACgB,MAAM,GAAG,IAAI;EACzB,CAAC,CAAC,OAAOb,KAAK,EAAE;IACd,IAAI,CAACF,OAAO,CAACC,MAAM,EAAED,OAAO,CAACE,KAAK,GAAGA,KAAK;IAC1CF,OAAO,CAACC,MAAM,GAAG,IAAI;EACvB;EACA,IAAID,OAAO,CAACC,MAAM,EAAE;IAClB,MAAMe,OAAO,GAAGC,UAEf;IACD,CAACD,OAAO,CAACE,2BAA2B,KAAK,EAAE,EAAEC,IAAI,CAACpB,SAAS,CAAC;EAC9D;EACA,OAAOC,OAAO;AAChB,CAAC","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ /** Continues on the calling worklet runtime's own event loop, so promise and
4
+ * native callbacks run between frames without a hop through the RN thread. */
5
+ export const yieldToRuntime = fn => {
6
+ "worklet";
7
+
8
+ setTimeout(fn, 0);
9
+ };
10
+ //# sourceMappingURL=runtimeYield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["yieldToRuntime","fn","setTimeout"],"sourceRoot":"../../src","sources":["runtimeYield.ts"],"mappings":";;AAAA;AACA;AACA,OAAO,MAAMA,cAAc,GAAIC,EAAc,IAAW;EACtD,SAAS;;EACTC,UAAU,CAACD,EAAE,EAAE,CAAC,CAAC;AACnB,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useRef } from 'react';
4
+ const useEventListener = (emitter, eventName, handler, isCurrent) => {
5
+ const latest = useRef(handler);
6
+ latest.current = handler;
7
+ const enabled = Boolean(handler);
8
+ useEffect(() => {
9
+ if (!emitter || !enabled) return;
10
+ const callback = (...args) => {
11
+ if (isCurrent && !isCurrent()) return;
12
+ latest.current?.(...args);
13
+ };
14
+ return emitter.on(eventName, callback);
15
+ }, [emitter, eventName, enabled, isCurrent]);
16
+ };
17
+ export default useEventListener;
18
+ //# sourceMappingURL=useEventListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useRef","useEventListener","emitter","eventName","handler","isCurrent","latest","current","enabled","Boolean","callback","args","on"],"sourceRoot":"../../../src","sources":["utils/useEventListener.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAEzC,MAAMC,gBAAgB,GAAGA,CACvBC,OAAqE,EACrEC,SAAiB,EACjBC,OAAY,EACZC,SAAyB,KACtB;EACH,MAAMC,MAAM,GAAGN,MAAM,CAACI,OAAO,CAAC;EAC9BE,MAAM,CAACC,OAAO,GAAGH,OAAO;EACxB,MAAMI,OAAO,GAAGC,OAAO,CAACL,OAAO,CAAC;EAChCL,SAAS,CAAC,MAAM;IACd,IAAI,CAACG,OAAO,IAAI,CAACM,OAAO,EAAE;IAC1B,MAAME,QAAQ,GAAGA,CAAC,GAAGC,IAAe,KAAK;MACvC,IAAIN,SAAS,IAAI,CAACA,SAAS,CAAC,CAAC,EAAE;MAC/BC,MAAM,CAACC,OAAO,GAAG,GAAGI,IAAI,CAAC;IAC3B,CAAC;IACD,OAAOT,OAAO,CAACU,EAAE,CAACT,SAAS,EAAEO,QAAoB,CAAC;EACpD,CAAC,EAAE,CAACR,OAAO,EAAEC,SAAS,EAAEK,OAAO,EAAEH,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED,eAAeJ,gBAAgB","ignoreList":[]}