@rafaelaugusto/jolt 0.1.0-rc.11.1 → 0.1.0-rc.12

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 (271) hide show
  1. package/README.md +2 -2
  2. package/dist/audio/index.d.ts +9 -0
  3. package/dist/audio/index.d.ts.map +1 -0
  4. package/dist/audio/index.js +216 -0
  5. package/dist/audio/index.js.map +1 -0
  6. package/dist/core/adapter-inspection.d.ts +82 -0
  7. package/dist/core/adapter-inspection.d.ts.map +1 -0
  8. package/dist/core/adapter-inspection.js +215 -0
  9. package/dist/core/adapter-inspection.js.map +1 -0
  10. package/dist/core/audio.d.ts +39 -0
  11. package/dist/core/audio.d.ts.map +1 -0
  12. package/dist/core/audio.js +229 -0
  13. package/dist/core/audio.js.map +1 -0
  14. package/dist/core/drawing.d.ts +95 -0
  15. package/dist/core/drawing.d.ts.map +1 -0
  16. package/dist/core/drawing.js +180 -0
  17. package/dist/core/drawing.js.map +1 -0
  18. package/dist/core/drop.d.ts +64 -0
  19. package/dist/core/drop.d.ts.map +1 -0
  20. package/dist/core/drop.js +246 -0
  21. package/dist/core/drop.js.map +1 -0
  22. package/dist/core/inspector-spring.d.ts +19 -0
  23. package/dist/core/inspector-spring.d.ts.map +1 -0
  24. package/dist/core/inspector-spring.js +37 -0
  25. package/dist/core/inspector-spring.js.map +1 -0
  26. package/dist/core/interaction-replay.d.ts +39 -0
  27. package/dist/core/interaction-replay.d.ts.map +1 -0
  28. package/dist/core/interaction-replay.js +99 -0
  29. package/dist/core/interaction-replay.js.map +1 -0
  30. package/dist/core/interaction-trace.d.ts +101 -0
  31. package/dist/core/interaction-trace.d.ts.map +1 -0
  32. package/dist/core/interaction-trace.js +263 -0
  33. package/dist/core/interaction-trace.js.map +1 -0
  34. package/dist/core/path-track.d.ts +7 -0
  35. package/dist/core/path-track.d.ts.map +1 -0
  36. package/dist/core/path-track.js +54 -0
  37. package/dist/core/path-track.js.map +1 -0
  38. package/dist/core/pointer.d.ts +32 -0
  39. package/dist/core/pointer.d.ts.map +1 -0
  40. package/dist/core/pointer.js +52 -0
  41. package/dist/core/pointer.js.map +1 -0
  42. package/dist/core/property-limits.d.ts +9 -0
  43. package/dist/core/property-limits.d.ts.map +1 -0
  44. package/dist/core/property-limits.js +15 -0
  45. package/dist/core/property-limits.js.map +1 -0
  46. package/dist/core/render-activity.d.ts +31 -0
  47. package/dist/core/render-activity.d.ts.map +1 -0
  48. package/dist/core/render-activity.js +211 -0
  49. package/dist/core/render-activity.js.map +1 -0
  50. package/dist/core/timeline-cues.d.ts +51 -0
  51. package/dist/core/timeline-cues.d.ts.map +1 -0
  52. package/dist/core/timeline-cues.js +218 -0
  53. package/dist/core/timeline-cues.js.map +1 -0
  54. package/dist/drag.d.ts +2 -0
  55. package/dist/drag.d.ts.map +1 -1
  56. package/dist/drag.js +16 -3
  57. package/dist/drag.js.map +1 -1
  58. package/dist/drop-zones.d.ts +11 -0
  59. package/dist/drop-zones.d.ts.map +1 -0
  60. package/dist/drop-zones.js +152 -0
  61. package/dist/drop-zones.js.map +1 -0
  62. package/dist/index.d.ts +6 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +3 -0
  65. package/dist/index.js.map +1 -1
  66. package/dist/inspector/index.d.ts +4 -0
  67. package/dist/inspector/index.d.ts.map +1 -1
  68. package/dist/inspector/index.js +10 -0
  69. package/dist/inspector/index.js.map +1 -1
  70. package/dist/inspector/tuning.d.ts +1 -18
  71. package/dist/inspector/tuning.d.ts.map +1 -1
  72. package/dist/inspector/tuning.js +1 -36
  73. package/dist/inspector/tuning.js.map +1 -1
  74. package/dist/motion-scope.d.ts +6 -0
  75. package/dist/motion-scope.d.ts.map +1 -1
  76. package/dist/motion-scope.js +8 -0
  77. package/dist/motion-scope.js.map +1 -1
  78. package/dist/native/index.d.ts +2 -0
  79. package/dist/native/index.d.ts.map +1 -1
  80. package/dist/native/index.js +1 -0
  81. package/dist/native/index.js.map +1 -1
  82. package/dist/native-property.d.ts +17 -0
  83. package/dist/native-property.d.ts.map +1 -1
  84. package/dist/native-property.js +298 -44
  85. package/dist/native-property.js.map +1 -1
  86. package/dist/path.d.ts +3 -2
  87. package/dist/path.d.ts.map +1 -1
  88. package/dist/path.js +21 -55
  89. package/dist/path.js.map +1 -1
  90. package/dist/pointer-input.d.ts +9 -0
  91. package/dist/pointer-input.d.ts.map +1 -0
  92. package/dist/pointer-input.js +23 -0
  93. package/dist/pointer-input.js.map +1 -0
  94. package/dist/pointer.d.ts +29 -0
  95. package/dist/pointer.d.ts.map +1 -0
  96. package/dist/pointer.js +169 -0
  97. package/dist/pointer.js.map +1 -0
  98. package/dist/press-input.d.ts +5 -0
  99. package/dist/press-input.d.ts.map +1 -0
  100. package/dist/press-input.js +47 -0
  101. package/dist/press-input.js.map +1 -0
  102. package/dist/press.d.ts.map +1 -1
  103. package/dist/press.js +8 -3
  104. package/dist/press.js.map +1 -1
  105. package/dist/render-activity.d.ts +5 -0
  106. package/dist/render-activity.d.ts.map +1 -0
  107. package/dist/render-activity.js +18 -0
  108. package/dist/render-activity.js.map +1 -0
  109. package/dist/shapes/drawing-native.d.ts +11 -0
  110. package/dist/shapes/drawing-native.d.ts.map +1 -0
  111. package/dist/shapes/drawing-native.js +41 -0
  112. package/dist/shapes/drawing-native.js.map +1 -0
  113. package/dist/shapes/drawing.d.ts +8 -0
  114. package/dist/shapes/drawing.d.ts.map +1 -0
  115. package/dist/shapes/drawing.js +127 -0
  116. package/dist/shapes/drawing.js.map +1 -0
  117. package/dist/shapes/index.d.ts +2 -0
  118. package/dist/shapes/index.d.ts.map +1 -1
  119. package/dist/shapes/index.js +1 -0
  120. package/dist/shapes/index.js.map +1 -1
  121. package/dist/shapes/ios.d.ts.map +1 -1
  122. package/dist/shapes/ios.js +5 -2
  123. package/dist/shapes/ios.js.map +1 -1
  124. package/dist/testing/replay.d.ts +1 -38
  125. package/dist/testing/replay.d.ts.map +1 -1
  126. package/dist/testing/replay.js +1 -98
  127. package/dist/testing/replay.js.map +1 -1
  128. package/dist/testing/trace.d.ts +1 -100
  129. package/dist/testing/trace.d.ts.map +1 -1
  130. package/dist/testing/trace.js +1 -262
  131. package/dist/testing/trace.js.map +1 -1
  132. package/dist/timeline-cues.d.ts +4 -32
  133. package/dist/timeline-cues.d.ts.map +1 -1
  134. package/dist/timeline-cues.js +8 -214
  135. package/dist/timeline-cues.js.map +1 -1
  136. package/dist/web/audio.d.ts +5 -0
  137. package/dist/web/audio.d.ts.map +1 -0
  138. package/dist/web/audio.js +76 -0
  139. package/dist/web/audio.js.map +1 -0
  140. package/dist/web/compose.d.ts.map +1 -1
  141. package/dist/web/compose.js +38 -6
  142. package/dist/web/compose.js.map +1 -1
  143. package/dist/web/diagnostics.d.ts +2 -0
  144. package/dist/web/diagnostics.d.ts.map +1 -1
  145. package/dist/web/diagnostics.js +1 -0
  146. package/dist/web/diagnostics.js.map +1 -1
  147. package/dist/web/drawing.d.ts +5 -0
  148. package/dist/web/drawing.d.ts.map +1 -0
  149. package/dist/web/drawing.js +161 -0
  150. package/dist/web/drawing.js.map +1 -0
  151. package/dist/web/drop-zones.d.ts +9 -0
  152. package/dist/web/drop-zones.d.ts.map +1 -0
  153. package/dist/web/drop-zones.js +127 -0
  154. package/dist/web/drop-zones.js.map +1 -0
  155. package/dist/web/inspector.d.ts +49 -0
  156. package/dist/web/inspector.d.ts.map +1 -0
  157. package/dist/web/inspector.js +133 -0
  158. package/dist/web/inspector.js.map +1 -0
  159. package/dist/web/layout.d.ts +24 -0
  160. package/dist/web/layout.d.ts.map +1 -1
  161. package/dist/web/plan.d.ts +2 -0
  162. package/dist/web/plan.d.ts.map +1 -1
  163. package/dist/web/plan.js +33 -3
  164. package/dist/web/plan.js.map +1 -1
  165. package/dist/web/pointer.d.ts +1 -0
  166. package/dist/web/pointer.d.ts.map +1 -1
  167. package/dist/web/pointer.js +17 -43
  168. package/dist/web/pointer.js.map +1 -1
  169. package/dist/web/properties.d.ts +7 -3
  170. package/dist/web/properties.d.ts.map +1 -1
  171. package/dist/web/properties.js +29 -5
  172. package/dist/web/properties.js.map +1 -1
  173. package/dist/web/property.d.ts +110 -0
  174. package/dist/web/property.d.ts.map +1 -0
  175. package/dist/web/property.js +509 -0
  176. package/dist/web/property.js.map +1 -0
  177. package/dist/web/public.d.ts +16 -0
  178. package/dist/web/public.d.ts.map +1 -1
  179. package/dist/web/public.js +7 -0
  180. package/dist/web/public.js.map +1 -1
  181. package/dist/web/runtime.d.ts +13 -0
  182. package/dist/web/runtime.d.ts.map +1 -1
  183. package/dist/web/runtime.js +136 -7
  184. package/dist/web/runtime.js.map +1 -1
  185. package/dist/web/scene.d.ts.map +1 -1
  186. package/dist/web/scene.js +7 -2
  187. package/dist/web/scene.js.map +1 -1
  188. package/dist/web/scope.d.ts +1 -1
  189. package/dist/web/scope.d.ts.map +1 -1
  190. package/dist/web/scope.js +6 -0
  191. package/dist/web/scope.js.map +1 -1
  192. package/dist/web/scroll.d.ts +1 -1
  193. package/dist/web/scroll.d.ts.map +1 -1
  194. package/dist/web/scroll.js +11 -1
  195. package/dist/web/scroll.js.map +1 -1
  196. package/dist/web/style.d.ts +3 -1
  197. package/dist/web/style.d.ts.map +1 -1
  198. package/dist/web/style.js +38 -2
  199. package/dist/web/style.js.map +1 -1
  200. package/dist/web/testing.d.ts +3 -0
  201. package/dist/web/testing.d.ts.map +1 -0
  202. package/dist/web/testing.js +3 -0
  203. package/dist/web/testing.js.map +1 -0
  204. package/dist/web/types.d.ts +5 -2
  205. package/dist/web/types.d.ts.map +1 -1
  206. package/dist/web/types.js.map +1 -1
  207. package/package.json +27 -3
  208. package/platforms/android/java/org/rafaelaugusto/jolt/BatchDrawing.java +111 -0
  209. package/platforms/android/java/org/rafaelaugusto/jolt/DropGeometry.java +33 -0
  210. package/platforms/android/java/org/rafaelaugusto/jolt/PointerInput.java +116 -0
  211. package/platforms/ios/src/JoltBatchDrawing.h +9 -0
  212. package/platforms/ios/src/JoltBatchDrawing.m +108 -0
  213. package/platforms/ios/src/JoltPointerInput.h +8 -0
  214. package/platforms/ios/src/JoltPointerInput.m +47 -0
  215. package/platforms/ios/src/JoltPressInput.h +8 -0
  216. package/platforms/ios/src/JoltPressInput.m +52 -0
  217. package/platforms/ios/src/module.modulemap +3 -0
  218. package/src/android-plugin.d.ts +32 -0
  219. package/src/audio/index.ts +251 -0
  220. package/src/core/adapter-inspection.ts +312 -0
  221. package/src/core/audio.ts +258 -0
  222. package/src/core/drawing.ts +309 -0
  223. package/src/core/drop.ts +310 -0
  224. package/src/core/inspector-spring.ts +51 -0
  225. package/src/core/interaction-replay.ts +149 -0
  226. package/src/core/interaction-trace.ts +340 -0
  227. package/src/core/path-track.ts +81 -0
  228. package/src/core/pointer.ts +69 -0
  229. package/src/core/property-limits.ts +16 -0
  230. package/src/core/render-activity.ts +252 -0
  231. package/src/core/timeline-cues.ts +256 -0
  232. package/src/drag.ts +24 -2
  233. package/src/drop-zones.ts +176 -0
  234. package/src/index.ts +12 -0
  235. package/src/inspector/index.ts +20 -0
  236. package/src/inspector/tuning.ts +5 -51
  237. package/src/ios-plugin.d.ts +26 -0
  238. package/src/motion-scope.ts +12 -0
  239. package/src/native/index.ts +2 -0
  240. package/src/native-property.ts +367 -53
  241. package/src/path.ts +25 -69
  242. package/src/pointer-input.ts +44 -0
  243. package/src/pointer.ts +199 -0
  244. package/src/press-input.ts +44 -0
  245. package/src/press.ts +13 -3
  246. package/src/render-activity.ts +23 -0
  247. package/src/shapes/drawing-native.ts +45 -0
  248. package/src/shapes/drawing.ts +137 -0
  249. package/src/shapes/index.ts +9 -0
  250. package/src/shapes/ios.ts +10 -2
  251. package/src/testing/replay.ts +1 -149
  252. package/src/testing/trace.ts +1 -340
  253. package/src/timeline-cues.ts +20 -236
  254. package/src/web/audio.ts +80 -0
  255. package/src/web/compose.ts +51 -7
  256. package/src/web/diagnostics.ts +3 -0
  257. package/src/web/drawing.ts +178 -0
  258. package/src/web/drop-zones.ts +144 -0
  259. package/src/web/inspector.ts +163 -0
  260. package/src/web/plan.ts +39 -3
  261. package/src/web/pointer.ts +24 -48
  262. package/src/web/properties.ts +36 -8
  263. package/src/web/property.ts +591 -0
  264. package/src/web/public.ts +57 -0
  265. package/src/web/runtime.ts +177 -18
  266. package/src/web/scene.ts +7 -2
  267. package/src/web/scope.ts +12 -0
  268. package/src/web/scroll.ts +13 -1
  269. package/src/web/style.ts +44 -1
  270. package/src/web/testing.ts +2 -0
  271. package/src/web/types.ts +5 -2
package/README.md CHANGED
@@ -31,7 +31,7 @@ NativeScript's `view.animate()` covers the basics and stops there: one curve for
31
31
 
32
32
  Jolt computes the motion once, in JavaScript, when the animation starts, and hands it to the platform as keyframes: Core Animation on iOS, `ObjectAnimator` on Android. Those default view tracks play without per-frame JavaScript. Real-size layout, opt-in subscribers, gesture input and timeline step activation retain their documented [execution limits](https://jolt.rafaelaugusto.dev/guide/how-it-works). Springs follow real physics, and an animation that interrupts another one starts from where the view is, at the speed it was going.
33
33
 
34
- The [0.1.0-rc.11.1 release candidate](https://github.com/rafaelaugustos/jolt/blob/v0.1.0-rc.11.1/CHANGELOG.md) adds retained native resources and Vue drawing ownership, behavior priorities and interruption, articulated 2D parts, gradient text with moving light, and named timeline effects. [Native composition](https://jolt.rafaelaugusto.dev/guide/native-composition) documents the APIs and platform limits with real recordings. Install `@rafaelaugusto/jolt@0.1.0-rc.11.1` and rebuild native apps; external native properties also need matching `@rafaelaugusto/jolt-native@0.1.0-rc.11.1`. Web APIs remain experimental and [stable-release acceptance](https://jolt.rafaelaugusto.dev/guide/not-there-yet) continues.
34
+ The [0.1.0-rc.12 release candidate](https://github.com/rafaelaugustos/jolt/blob/v0.1.0-rc.12/CHANGELOG.md) adds native/Web pointer presence, property groups, renderer activity, bounded drawing, drop targets, optional audio/cues and inspection, plus Web paths, 3D rotation and shadows. The versioned [portable foundations](https://github.com/rafaelaugustos/jolt/blob/v0.1.0-rc.12/docs/guide/portable-foundations.md) and [interaction/depth guides](https://github.com/rafaelaugustos/jolt/blob/v0.1.0-rc.12/docs/guide/interaction-depth.md) include reviewed recordings and platform limits. Install `@rafaelaugusto/jolt@0.1.0-rc.12` and rebuild native apps; external native properties also need matching `@rafaelaugusto/jolt-native@0.1.0-rc.12`. Web APIs remain experimental; physical-device acceptance and performance investigations remain open.
35
35
 
36
36
  For the browser, import **`@rafaelaugusto/jolt/web`**. It installs without NativeScript, Vue or React; **`@rafaelaugusto/jolt/web/vue`** optionally integrates Vue 3.5 DOM refs and enter/leave. Both entries are experimental and use the same motion compiler as native playback. See [installation](https://jolt.rafaelaugusto.dev/guide/install#experimental-web-candidate), [finite Web playback](https://jolt.rafaelaugusto.dev/guide/web-runtime) and [Vue Web motion](https://jolt.rafaelaugusto.dev/guide/web-vue). Mavis integration and its shared application proof continue separately.
37
37
 
@@ -101,7 +101,7 @@ For the browser, import **`@rafaelaugusto/jolt/web`**. It installs without Nativ
101
101
  npm install @rafaelaugusto/jolt@next
102
102
  ```
103
103
 
104
- The current release candidate is **0.1.0-rc.11.1**, published under the `next` tag. Requires `@nativescript/core` 8.9 or later. It doesn't depend on a framework: it takes a view, or an element that holds one. Rebuild the native app after installing or upgrading Jolt. See [release status and limits](https://jolt.rafaelaugusto.dev/guide/not-there-yet) for the remaining stable-release acceptance work.
104
+ The current release candidate is **0.1.0-rc.12**, published under the `next` tag. Requires `@nativescript/core` 8.9 or later. It doesn't depend on a framework: it takes a view, or an element that holds one. Rebuild the native app after installing or upgrading Jolt. See [release status and limits](https://jolt.rafaelaugusto.dev/guide/not-there-yet) for the remaining stable-release acceptance work.
105
105
 
106
106
  On iOS 15+, Jolt requests up to 120 Hz on ProMotion displays. Set `CADisableMinimumFrameDurationOnPhone` to `true` in the app's `App_Resources/iOS/Info.plist` and rebuild to enable higher rates on iPhone. See the [iOS setup](https://jolt.rafaelaugusto.dev/guide/install#promotion-on-ios); the system still chooses the actual refresh rate.
107
107
 
@@ -0,0 +1,9 @@
1
+ import { type AudioCueOptions } from '../core/audio.js';
2
+ export type { AudioCue, AudioPlayback } from '../core/audio.js';
3
+ export interface NativeAudioCueOptions extends AudioCueOptions {
4
+ /** Ambient respects the silent switch. Application leaves the audio session to its owner. */
5
+ iosSession?: 'ambient' | 'application';
6
+ }
7
+ /** Preload a bundled/local one-shot. Native playback owns the clock; no JS frame polling. */
8
+ export declare function audioCue(file: string, options?: NativeAudioCueOptions): import("./index.js").AudioCue;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC1F,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC/D,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,6FAA6F;IAC7F,UAAU,CAAC,EAAE,SAAS,GAAG,aAAa,CAAA;CACvC;AAoFD,6FAA6F;AAC7F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,iCA+JzE"}
@@ -0,0 +1,216 @@
1
+ import { Application, File, knownFolders, path } from '@nativescript/core';
2
+ import { createAudioCue } from '../core/audio.js';
3
+ let ambientLeases = 0, restoreSession;
4
+ function ambientSession() {
5
+ const session = AVAudioSession.sharedInstance();
6
+ if (!ambientLeases) {
7
+ const category = session.category, mode = session.mode, options = session.categoryOptions;
8
+ if (category !== AVAudioSessionCategoryAmbient &&
9
+ category !== AVAudioSessionCategorySoloAmbient)
10
+ throw new Error('The app owns a non-ambient audio session. Pass iosSession: application and configure its policy explicitly.');
11
+ session.setCategoryError(AVAudioSessionCategoryAmbient);
12
+ const appliedMode = session.mode, appliedOptions = session.categoryOptions;
13
+ restoreSession = () => {
14
+ if (session.category === AVAudioSessionCategoryAmbient &&
15
+ session.mode === appliedMode &&
16
+ session.categoryOptions === appliedOptions)
17
+ session.setCategoryModeOptionsError(category, mode, options);
18
+ };
19
+ }
20
+ ambientLeases++;
21
+ let released = false;
22
+ return () => {
23
+ if (released)
24
+ return;
25
+ released = true;
26
+ if (--ambientLeases === 0) {
27
+ const restore = restoreSession;
28
+ restoreSession = undefined;
29
+ restore?.();
30
+ }
31
+ };
32
+ }
33
+ const audioCallbacks = new WeakMap();
34
+ let AudioDelegateClass;
35
+ function audioDelegate() {
36
+ if (!AudioDelegateClass) {
37
+ const base = NSObject;
38
+ AudioDelegateClass = base.extend({
39
+ audioPlayerDidFinishPlayingSuccessfully(_player, success) {
40
+ const callbacks = audioCallbacks.get(this);
41
+ if (success)
42
+ callbacks?.complete?.();
43
+ else
44
+ callbacks?.fail?.(new Error('Native audio did not finish successfully.'));
45
+ },
46
+ audioPlayerDecodeErrorDidOccurError(_player, error) {
47
+ audioCallbacks.get(this)?.fail?.(error);
48
+ },
49
+ }, { protocols: [AVAudioPlayerDelegate], name: 'JoltAudioCueDelegate' });
50
+ }
51
+ const delegate = AudioDelegateClass.new();
52
+ const callbacks = {};
53
+ audioCallbacks.set(delegate, callbacks);
54
+ return { delegate, callbacks };
55
+ }
56
+ /** Preload a bundled/local one-shot. Native playback owns the clock; no JS frame polling. */
57
+ export function audioCue(file, options = {}) {
58
+ if (typeof file !== 'string' || !file || /^(?:https?|content|data):/i.test(file))
59
+ throw new TypeError('Audio cues require a bundled or absolute local file path.');
60
+ if (options.iosSession !== undefined &&
61
+ !['ambient', 'application'].includes(options.iosSession))
62
+ throw new TypeError('Invalid iOS audio session policy.');
63
+ const resolved = file.startsWith('~/')
64
+ ? path.join(knownFolders.currentApp().path, file.slice(2))
65
+ : file;
66
+ if (!resolved.startsWith('/'))
67
+ throw new TypeError('Audio files use ~/app-relative or absolute paths.');
68
+ let disposePlatform = () => { }, off = () => { };
69
+ let player, androidPlayer;
70
+ let delegate;
71
+ let ended = false, released = false;
72
+ let fail;
73
+ const adapter = {
74
+ load(ready, rejected) {
75
+ fail = rejected;
76
+ if (!File.exists(resolved))
77
+ throw new Error(`Audio file is unavailable: ${file}`);
78
+ if (__IOS__) {
79
+ if (options.iosSession !== 'application')
80
+ disposePlatform = ambientSession();
81
+ player = AVAudioPlayer.alloc().initWithContentsOfURLError(NSURL.fileURLWithPath(resolved));
82
+ if (!player || !player.prepareToPlay())
83
+ throw new Error('Audio preparation failed.');
84
+ delegate = audioDelegate();
85
+ delegate.callbacks.fail = (error) => fail?.(error);
86
+ player.delegate = delegate.delegate;
87
+ ready(player.duration * 1000);
88
+ }
89
+ else {
90
+ androidPlayer = new android.media.MediaPlayer();
91
+ androidPlayer.setAudioAttributes(new android.media.AudioAttributes.Builder()
92
+ .setUsage(android.media.AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
93
+ .setContentType(android.media.AudioAttributes.CONTENT_TYPE_SONIFICATION)
94
+ .build());
95
+ androidPlayer.setOnPreparedListener(new android.media.MediaPlayer.OnPreparedListener({
96
+ onPrepared: (p) => ready(p.getDuration()),
97
+ }));
98
+ androidPlayer.setOnErrorListener(new android.media.MediaPlayer.OnErrorListener({
99
+ onError: (_p, what, extra) => {
100
+ fail?.(new Error(`Android audio error ${what}/${extra}`));
101
+ return true;
102
+ },
103
+ }));
104
+ androidPlayer.setDataSource(resolved);
105
+ androidPlayer.prepareAsync();
106
+ }
107
+ },
108
+ start(complete, rejected) {
109
+ fail = rejected;
110
+ if (__IOS__) {
111
+ if (ended)
112
+ player.currentTime = 0;
113
+ delegate.callbacks.complete = () => {
114
+ ended = true;
115
+ complete();
116
+ };
117
+ ended = false;
118
+ if (!player.play())
119
+ throw new Error('Native audio output could not start.');
120
+ }
121
+ else {
122
+ if (ended)
123
+ androidPlayer.seekTo(0);
124
+ ended = false;
125
+ androidPlayer.setOnCompletionListener(new android.media.MediaPlayer.OnCompletionListener({
126
+ onCompletion: () => {
127
+ ended = true;
128
+ complete();
129
+ },
130
+ }));
131
+ androidPlayer.start();
132
+ }
133
+ },
134
+ pause() {
135
+ if (__IOS__)
136
+ player?.pause();
137
+ else
138
+ androidPlayer?.pause();
139
+ },
140
+ stop() {
141
+ ended = false;
142
+ if (__IOS__) {
143
+ player?.stop();
144
+ if (player)
145
+ player.currentTime = 0;
146
+ if (delegate)
147
+ delegate.callbacks.complete = undefined;
148
+ }
149
+ else if (androidPlayer) {
150
+ androidPlayer.setOnCompletionListener(null);
151
+ if (androidPlayer.isPlaying())
152
+ androidPlayer.pause();
153
+ androidPlayer.seekTo(0);
154
+ }
155
+ },
156
+ volume(value) {
157
+ if (__IOS__) {
158
+ if (player)
159
+ player.volume = value;
160
+ }
161
+ else
162
+ androidPlayer?.setVolume(value, value);
163
+ },
164
+ dispose() {
165
+ if (released)
166
+ return;
167
+ released = true;
168
+ off();
169
+ fail = undefined;
170
+ if (__IOS__) {
171
+ player?.stop();
172
+ if (player)
173
+ player.delegate = null;
174
+ delegate = undefined;
175
+ player = undefined;
176
+ disposePlatform();
177
+ }
178
+ else if (androidPlayer) {
179
+ androidPlayer.setOnPreparedListener(null);
180
+ androidPlayer.setOnCompletionListener(null);
181
+ androidPlayer.setOnErrorListener(null);
182
+ androidPlayer.release();
183
+ androidPlayer = undefined;
184
+ }
185
+ },
186
+ };
187
+ const cue = createAudioCue(adapter, options);
188
+ if (cue.status === 'failed')
189
+ return cue;
190
+ let held = false;
191
+ const suspend = () => {
192
+ if (!cue.suspended) {
193
+ held = true;
194
+ cue.suspend();
195
+ }
196
+ };
197
+ const resume = () => {
198
+ if (held) {
199
+ held = false;
200
+ cue.resume();
201
+ }
202
+ };
203
+ Application.on(Application.suspendEvent, suspend);
204
+ Application.on(Application.resumeEvent, resume);
205
+ const observer = __IOS__
206
+ ? Application.ios.addNotificationObserver(AVAudioSessionInterruptionNotification, () => cue.stop())
207
+ : undefined;
208
+ off = () => {
209
+ Application.off(Application.suspendEvent, suspend);
210
+ Application.off(Application.resumeEvent, resume);
211
+ if (__IOS__ && observer)
212
+ Application.ios.removeNotificationObserver(observer, AVAudioSessionInterruptionNotification);
213
+ };
214
+ return cue;
215
+ }
216
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { RenderActivity } from './render-activity.js';
2
+ export type AdapterEventKind = 'prepare' | 'write' | 'start' | 'replace' | 'bind' | 'pause' | 'play' | 'seek' | 'cancel' | 'complete' | 'dispose';
3
+ export interface AdapterObservation {
4
+ alive: boolean;
5
+ values: readonly number[] | null;
6
+ owner?: object;
7
+ binding: boolean;
8
+ paused?: boolean;
9
+ }
10
+ interface AdapterDefinition {
11
+ name: string;
12
+ units: readonly string[];
13
+ platform: 'ios' | 'android' | 'web';
14
+ target: object;
15
+ read(): AdapterObservation;
16
+ }
17
+ export declare function registerAdapterInspection(property: object, definition: AdapterDefinition): void;
18
+ export declare function adapterEvent(property: object, kind: AdapterEventKind, owner?: object, previous?: object): void;
19
+ /** Disabled path performs one WeakMap lookup and allocates no timing/sample objects. */
20
+ export declare function adapterMeasure(property: object, kind: 'prepare' | 'write'): ((components?: number) => void) | undefined;
21
+ export interface AdapterInspectionEvent {
22
+ sequence: number;
23
+ at: number;
24
+ target: string;
25
+ kind: AdapterEventKind;
26
+ owner?: number;
27
+ previous?: number;
28
+ ownerLabel?: string;
29
+ previousLabel?: string;
30
+ jsMs?: number;
31
+ preparedComponents?: number;
32
+ }
33
+ export interface AdapterInspectionSnapshot {
34
+ version: 1;
35
+ properties: {
36
+ id: string;
37
+ name: string;
38
+ units: string[];
39
+ platform: 'ios' | 'android' | 'web';
40
+ target: number;
41
+ values: number[] | null;
42
+ observation: 'adapter-read' | 'unavailable';
43
+ owner?: number;
44
+ ownerLabel?: string;
45
+ binding: boolean;
46
+ paused?: boolean;
47
+ }[];
48
+ activities: {
49
+ id: string;
50
+ active: boolean;
51
+ suspended: boolean;
52
+ references: number;
53
+ }[];
54
+ events: AdapterInspectionEvent[];
55
+ cost: {
56
+ reads: number;
57
+ readMs: number;
58
+ prepareMs: number;
59
+ updateMs: number;
60
+ writes: number;
61
+ preparedComponents: number;
62
+ droppedEvents: number;
63
+ };
64
+ /** No renderer, native sampling, allocator or GPU measurements are inferred. */
65
+ unavailable: readonly ['gpuTime', 'nativeSamplingTime', 'allocatedBytes'];
66
+ }
67
+ export interface AdapterInspector {
68
+ watch(property: object, id: string): () => void;
69
+ activity(activity: RenderActivity, id: string): () => void;
70
+ label(owner: object, label: string): void;
71
+ read(): AdapterInspectionSnapshot;
72
+ clear(): void;
73
+ dispose(): void;
74
+ }
75
+ /** Explicit, bounded, pull-only registration. Weak references do not keep targets alive. */
76
+ export declare function createAdapterInspector(options: {
77
+ development: true;
78
+ capacity?: number;
79
+ now(): number;
80
+ }): AdapterInspector;
81
+ export {};
82
+ //# sourceMappingURL=adapter-inspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-inspection.d.ts","sourceRoot":"","sources":["../../src/core/adapter-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,215 @@
1
+ const definitions = new WeakMap();
2
+ const hooks = new WeakMap();
3
+ export function registerAdapterInspection(property, definition) {
4
+ definitions.set(property, definition);
5
+ }
6
+ export function adapterEvent(property, kind, owner, previous) {
7
+ const listeners = hooks.get(property);
8
+ if (listeners)
9
+ for (const listener of listeners)
10
+ listener.event(kind, owner, previous);
11
+ if (kind === 'dispose') {
12
+ definitions.delete(property);
13
+ hooks.delete(property);
14
+ }
15
+ }
16
+ /** Disabled path performs one WeakMap lookup and allocates no timing/sample objects. */
17
+ export function adapterMeasure(property, kind) {
18
+ const listeners = hooks.get(property);
19
+ if (!listeners?.size)
20
+ return undefined;
21
+ const starts = [...listeners].map((listener) => [listener, listener.now()]);
22
+ return (components = 0) => {
23
+ for (const [listener, start] of starts)
24
+ listener.event(kind, undefined, undefined, Math.max(0, listener.now() - start), components);
25
+ };
26
+ }
27
+ /** Explicit, bounded, pull-only registration. Weak references do not keep targets alive. */
28
+ export function createAdapterInspector(options) {
29
+ if (options.development !== true)
30
+ throw new TypeError('Adapter inspection requires development: true.');
31
+ const capacity = options.capacity ?? 240;
32
+ if (!Number.isInteger(capacity) || capacity < 8 || capacity > 2000)
33
+ throw new RangeError('Inspector capacity is 8–2000.');
34
+ const properties = new Map();
35
+ const activities = new Map();
36
+ const identities = new WeakMap(), labels = new WeakMap();
37
+ let sequence = 0, next = 0, disposed = false;
38
+ const events = [];
39
+ const cost = {
40
+ reads: 0,
41
+ readMs: 0,
42
+ prepareMs: 0,
43
+ updateMs: 0,
44
+ writes: 0,
45
+ preparedComponents: 0,
46
+ droppedEvents: 0,
47
+ };
48
+ const identity = (value) => {
49
+ let id = identities.get(value);
50
+ if (!id) {
51
+ id = ++next;
52
+ identities.set(value, id);
53
+ }
54
+ return id;
55
+ };
56
+ const validID = (id) => {
57
+ if (disposed)
58
+ throw new Error('Adapter inspector is disposed.');
59
+ if (!/^[A-Za-z][\w.-]{0,63}$/.test(id) || properties.has(id) || activities.has(id))
60
+ throw new TypeError('Use a unique non-personal ASCII inspector ID.');
61
+ if (properties.size + activities.size >= 128)
62
+ throw new RangeError('Inspect at most 128 explicit resources.');
63
+ };
64
+ const remove = (id) => {
65
+ properties.get(id)?.off();
66
+ properties.delete(id);
67
+ };
68
+ return {
69
+ watch(property, id) {
70
+ validID(id);
71
+ const definition = definitions.get(property);
72
+ if (!definition)
73
+ throw new TypeError('This resource does not expose adapter inspection.');
74
+ const ref = new WeakRef(property);
75
+ const listener = {
76
+ now: options.now,
77
+ event(kind, owner, previous, jsMs, components) {
78
+ if (disposed || !properties.has(id))
79
+ return;
80
+ events.push({
81
+ sequence: ++sequence,
82
+ at: options.now(),
83
+ target: id,
84
+ kind,
85
+ ...(owner && { owner: identity(owner), ownerLabel: labels.get(owner) }),
86
+ ...(previous && {
87
+ previous: identity(previous),
88
+ previousLabel: labels.get(previous),
89
+ }),
90
+ ...(jsMs !== undefined && { jsMs }),
91
+ ...(components !== undefined && { preparedComponents: components }),
92
+ });
93
+ if (events.length > capacity) {
94
+ events.shift();
95
+ cost.droppedEvents++;
96
+ }
97
+ if (kind === 'prepare') {
98
+ cost.prepareMs += jsMs ?? 0;
99
+ cost.preparedComponents += components ?? 0;
100
+ }
101
+ if (kind === 'write') {
102
+ cost.updateMs += jsMs ?? 0;
103
+ cost.writes++;
104
+ }
105
+ if (kind === 'dispose')
106
+ remove(id);
107
+ },
108
+ };
109
+ let listeners = hooks.get(property);
110
+ if (!listeners) {
111
+ listeners = new Set();
112
+ hooks.set(property, listeners);
113
+ }
114
+ listeners.add(listener);
115
+ const held = listeners;
116
+ properties.set(id, { ref, off: () => held.delete(listener) });
117
+ return () => remove(id);
118
+ },
119
+ activity(activity, id) {
120
+ validID(id);
121
+ activities.set(id, new WeakRef(activity));
122
+ return () => {
123
+ activities.delete(id);
124
+ };
125
+ },
126
+ label(owner, label) {
127
+ if (typeof label !== 'string' || !label || label.length > 100)
128
+ throw new TypeError('Use a short non-personal inspector label.');
129
+ labels.set(owner, label);
130
+ const id = identities.get(owner);
131
+ if (id)
132
+ for (const event of events) {
133
+ if (event.owner === id)
134
+ event.ownerLabel = label;
135
+ if (event.previous === id)
136
+ event.previousLabel = label;
137
+ }
138
+ },
139
+ read() {
140
+ const start = options.now();
141
+ const result = [];
142
+ for (const [id, entry] of properties) {
143
+ const property = entry.ref.deref(), definition = property && definitions.get(property);
144
+ if (!definition) {
145
+ remove(id);
146
+ continue;
147
+ }
148
+ let observation;
149
+ try {
150
+ observation = definition.read();
151
+ }
152
+ catch {
153
+ remove(id);
154
+ continue;
155
+ }
156
+ if (!observation.alive) {
157
+ remove(id);
158
+ continue;
159
+ }
160
+ result.push({
161
+ id,
162
+ name: definition.name,
163
+ units: [...definition.units],
164
+ platform: definition.platform,
165
+ target: identity(definition.target),
166
+ values: observation.values ? [...observation.values] : null,
167
+ observation: observation.values ? 'adapter-read' : 'unavailable',
168
+ binding: observation.binding,
169
+ paused: observation.paused,
170
+ ...(observation.owner && {
171
+ owner: identity(observation.owner),
172
+ ownerLabel: labels.get(observation.owner),
173
+ }),
174
+ });
175
+ }
176
+ const demand = [];
177
+ for (const [id, ref] of activities) {
178
+ const activity = ref.deref();
179
+ if (!activity || activity.disposed) {
180
+ activities.delete(id);
181
+ continue;
182
+ }
183
+ demand.push({
184
+ id,
185
+ active: activity.active,
186
+ suspended: activity.suspended,
187
+ references: activity.size,
188
+ });
189
+ }
190
+ cost.reads++;
191
+ cost.readMs += Math.max(0, options.now() - start);
192
+ return {
193
+ version: 1,
194
+ properties: result,
195
+ activities: demand,
196
+ events: events.map((e) => ({ ...e })),
197
+ cost: { ...cost },
198
+ unavailable: ['gpuTime', 'nativeSamplingTime', 'allocatedBytes'],
199
+ };
200
+ },
201
+ clear() {
202
+ events.length = 0;
203
+ },
204
+ dispose() {
205
+ if (disposed)
206
+ return;
207
+ disposed = true;
208
+ for (const id of properties.keys())
209
+ remove(id);
210
+ activities.clear();
211
+ events.length = 0;
212
+ },
213
+ };
214
+ }
215
+ //# sourceMappingURL=adapter-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-inspection.js","sourceRoot":"","sources":["../../src/core/adapter-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { Animation } from './playback.js';
2
+ export interface AudioPlayback extends Animation {
3
+ readonly duration: number | undefined;
4
+ readonly paused: boolean;
5
+ pause(): void;
6
+ play(): void;
7
+ dispose(): void;
8
+ }
9
+ export interface AudioCueOptions {
10
+ volume?: number;
11
+ muted?: boolean;
12
+ onError?: (error: unknown) => void;
13
+ }
14
+ export interface AudioCue {
15
+ /** Preparation failures resolve false; they never reject visual timelines. */
16
+ readonly ready: Promise<boolean>;
17
+ readonly status: 'loading' | 'ready' | 'failed' | 'disposed';
18
+ readonly duration: number | undefined;
19
+ readonly suspended: boolean;
20
+ volume: number;
21
+ muted: boolean;
22
+ /** One voice per cue. A new play replaces the preceding voice; play on a handle resumes. */
23
+ play(): AudioPlayback;
24
+ stop(): void;
25
+ suspend(): void;
26
+ resume(): void;
27
+ dispose(): void;
28
+ }
29
+ export interface AudioAdapter {
30
+ load(ready: (duration: number) => void, fail: (error: unknown) => void): void;
31
+ start(complete: () => void, fail: (error: unknown) => void): void | Promise<void>;
32
+ pause(): void;
33
+ stop(): void;
34
+ volume(value: number): void;
35
+ dispose(): void;
36
+ }
37
+ /** Boundary callbacks only: the audio backend owns its playback clock. */
38
+ export declare function createAudioCue(adapter: AudioAdapter, options?: AudioCueOptions): AudioCue;
39
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/core/audio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,OAAO,IAAI,IAAI,CAAA;CAChB;AACD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACnC;AACD,MAAM,WAAW,QAAQ;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAA;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,4FAA4F;IAC5F,IAAI,IAAI,aAAa,CAAA;IACrB,IAAI,IAAI,IAAI,CAAA;IACZ,OAAO,IAAI,IAAI,CAAA;IACf,MAAM,IAAI,IAAI,CAAA;IACd,OAAO,IAAI,IAAI,CAAA;CAChB;AACD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAA;IAC7E,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjF,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,eAAoB,GAC5B,QAAQ,CAuNV"}