@videojs/spf 10.0.0-beta.9 → 10.0.0-rc.2

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 (556) hide show
  1. package/README.md +19 -38
  2. package/dist/default/core/actors/create-machine-actor.js +89 -0
  3. package/dist/default/core/actors/create-machine-actor.js.map +1 -0
  4. package/dist/default/core/actors/create-transition-actor.js +44 -0
  5. package/dist/default/core/actors/create-transition-actor.js.map +1 -0
  6. package/dist/default/core/composition/create-composition.js +82 -0
  7. package/dist/default/core/composition/create-composition.js.map +1 -0
  8. package/dist/default/core/composition/share-signals.js +34 -0
  9. package/dist/default/core/composition/share-signals.js.map +1 -0
  10. package/dist/default/core/machine.js +25 -0
  11. package/dist/default/core/machine.js.map +1 -0
  12. package/dist/default/core/reactors/create-machine-reactor.js +84 -0
  13. package/dist/default/core/reactors/create-machine-reactor.js.map +1 -0
  14. package/dist/default/core/signals/effect.js +61 -0
  15. package/dist/default/core/signals/effect.js.map +1 -0
  16. package/dist/default/core/signals/primitives.js +50 -0
  17. package/dist/default/core/signals/primitives.js.map +1 -0
  18. package/dist/default/core/signals/when.js +36 -0
  19. package/dist/default/core/signals/when.js.map +1 -0
  20. package/dist/default/core/tasks/delayed-reschedule.js +27 -0
  21. package/dist/default/core/tasks/delayed-reschedule.js.map +1 -0
  22. package/dist/default/core/tasks/task.js +298 -0
  23. package/dist/default/core/tasks/task.js.map +1 -0
  24. package/dist/default/dom.js +9 -0
  25. package/dist/default/hls-audio.js +3 -0
  26. package/dist/default/hls-background-video.js +3 -0
  27. package/dist/default/hls-video.js +4 -0
  28. package/dist/default/hls.js +10 -0
  29. package/dist/default/index.js +22 -0
  30. package/dist/default/index.js.map +1 -0
  31. package/dist/default/media/abr/quality-selection.js +17 -0
  32. package/dist/default/media/abr/quality-selection.js.map +1 -0
  33. package/dist/default/media/buffer/back-buffer.js +42 -0
  34. package/dist/default/media/buffer/back-buffer.js.map +1 -0
  35. package/dist/default/media/buffer/forward-buffer.js +110 -0
  36. package/dist/default/media/buffer/forward-buffer.js.map +1 -0
  37. package/dist/default/media/dom/capabilities.js +61 -0
  38. package/dist/default/media/dom/capabilities.js.map +1 -0
  39. package/dist/default/media/dom/mse/append-segment.js +58 -0
  40. package/dist/default/media/dom/mse/append-segment.js.map +1 -0
  41. package/dist/default/media/dom/mse/buffer-flusher.js +55 -0
  42. package/dist/default/media/dom/mse/buffer-flusher.js.map +1 -0
  43. package/dist/default/media/dom/mse/duration.js +87 -0
  44. package/dist/default/media/dom/mse/duration.js.map +1 -0
  45. package/dist/default/media/dom/mse/end-of-stream.js +17 -0
  46. package/dist/default/media/dom/mse/end-of-stream.js.map +1 -0
  47. package/dist/default/media/dom/mse/mediasource-setup.js +227 -0
  48. package/dist/default/media/dom/mse/mediasource-setup.js.map +1 -0
  49. package/dist/default/media/dom/screen.js +95 -0
  50. package/dist/default/media/dom/screen.js.map +1 -0
  51. package/dist/default/media/dom/text/resolve-vtt-segment.js +50 -0
  52. package/dist/default/media/dom/text/resolve-vtt-segment.js.map +1 -0
  53. package/dist/default/media/dom/text/text-track-slots.js +61 -0
  54. package/dist/default/media/dom/text/text-track-slots.js.map +1 -0
  55. package/dist/default/media/errors.js +60 -0
  56. package/dist/default/media/errors.js.map +1 -0
  57. package/dist/default/media/hls/parse-attributes.js +131 -0
  58. package/dist/default/media/hls/parse-attributes.js.map +1 -0
  59. package/dist/default/media/hls/parse-media-playlist.js +253 -0
  60. package/dist/default/media/hls/parse-media-playlist.js.map +1 -0
  61. package/dist/default/media/hls/parse-multivariant.js +234 -0
  62. package/dist/default/media/hls/parse-multivariant.js.map +1 -0
  63. package/dist/default/media/hls/reload-policy.js +63 -0
  64. package/dist/default/media/hls/reload-policy.js.map +1 -0
  65. package/dist/default/media/hls/resolve-url.js +9 -0
  66. package/dist/default/media/hls/resolve-url.js.map +1 -0
  67. package/dist/default/media/live-window.js +32 -0
  68. package/dist/default/media/live-window.js.map +1 -0
  69. package/dist/default/media/media-tracks/media-tracks.js +96 -0
  70. package/dist/default/media/media-tracks/media-tracks.js.map +1 -0
  71. package/dist/default/media/mp4/box.js +57 -0
  72. package/dist/default/media/mp4/box.js.map +1 -0
  73. package/dist/default/media/mp4/timestamp-origin.js +95 -0
  74. package/dist/default/media/mp4/timestamp-origin.js.map +1 -0
  75. package/dist/default/media/primitives/resolution.js +26 -0
  76. package/dist/default/media/primitives/resolution.js.map +1 -0
  77. package/dist/default/media/primitives/select-tracks.js +97 -0
  78. package/dist/default/media/primitives/select-tracks.js.map +1 -0
  79. package/dist/default/media/text/parse-vtt-timestamp-map.js +40 -0
  80. package/dist/default/media/text/parse-vtt-timestamp-map.js.map +1 -0
  81. package/dist/default/media/text/resolve-vtt-metadata.js +22 -0
  82. package/dist/default/media/text/resolve-vtt-metadata.js.map +1 -0
  83. package/dist/default/media/types/index.js +42 -0
  84. package/dist/default/media/types/index.js.map +1 -0
  85. package/dist/default/media/utils/cdn.js +50 -0
  86. package/dist/default/media/utils/cdn.js.map +1 -0
  87. package/dist/default/media/utils/preload.js +21 -0
  88. package/dist/default/media/utils/preload.js.map +1 -0
  89. package/dist/default/media/utils/track-selection.js +43 -0
  90. package/dist/default/media/utils/track-selection.js.map +1 -0
  91. package/dist/default/media/utils/tracks.js +146 -0
  92. package/dist/default/media/utils/tracks.js.map +1 -0
  93. package/dist/default/media-tracks.js +2 -0
  94. package/dist/default/network/bandwidth-estimator.js +95 -0
  95. package/dist/default/network/bandwidth-estimator.js.map +1 -0
  96. package/dist/default/network/chunked-stream-iterable.js +47 -0
  97. package/dist/default/network/chunked-stream-iterable.js.map +1 -0
  98. package/dist/default/network/ewma.js +68 -0
  99. package/dist/default/network/ewma.js.map +1 -0
  100. package/dist/default/network/fetch.js +108 -0
  101. package/dist/default/network/fetch.js.map +1 -0
  102. package/dist/default/playback/actors/dom/segment-loader.js +233 -0
  103. package/dist/default/playback/actors/dom/segment-loader.js.map +1 -0
  104. package/dist/default/playback/actors/dom/source-buffer.js +139 -0
  105. package/dist/default/playback/actors/dom/source-buffer.js.map +1 -0
  106. package/dist/default/playback/actors/dom/text-tracks.js +46 -0
  107. package/dist/default/playback/actors/dom/text-tracks.js.map +1 -0
  108. package/dist/default/playback/actors/text-track-segment-loader.js +138 -0
  109. package/dist/default/playback/actors/text-track-segment-loader.js.map +1 -0
  110. package/dist/default/playback/adapters/hls-audio/adapter.js +8 -0
  111. package/dist/default/playback/adapters/hls-audio/adapter.js.map +1 -0
  112. package/dist/default/playback/adapters/hls-audio/mixin.js +178 -0
  113. package/dist/default/playback/adapters/hls-audio/mixin.js.map +1 -0
  114. package/dist/default/playback/adapters/hls-background-video/adapter.js +17 -0
  115. package/dist/default/playback/adapters/hls-background-video/adapter.js.map +1 -0
  116. package/dist/default/playback/adapters/hls-background-video/host.js +56 -0
  117. package/dist/default/playback/adapters/hls-background-video/host.js.map +1 -0
  118. package/dist/default/playback/adapters/hls-background-video/mixin.js +191 -0
  119. package/dist/default/playback/adapters/hls-background-video/mixin.js.map +1 -0
  120. package/dist/default/playback/adapters/hls-video/adapter.js +11 -0
  121. package/dist/default/playback/adapters/hls-video/adapter.js.map +1 -0
  122. package/dist/default/playback/adapters/hls-video/error-surface.js +46 -0
  123. package/dist/default/playback/adapters/hls-video/error-surface.js.map +1 -0
  124. package/dist/default/playback/adapters/hls-video/media-tracks.js +125 -0
  125. package/dist/default/playback/adapters/hls-video/media-tracks.js.map +1 -0
  126. package/dist/default/playback/adapters/hls-video/mixin.js +299 -0
  127. package/dist/default/playback/adapters/hls-video/mixin.js.map +1 -0
  128. package/dist/default/playback/behaviors/calculate-presentation-duration.js +33 -0
  129. package/dist/default/playback/behaviors/calculate-presentation-duration.js.map +1 -0
  130. package/dist/default/playback/behaviors/collect-errors.js +98 -0
  131. package/dist/default/playback/behaviors/collect-errors.js.map +1 -0
  132. package/dist/default/playback/behaviors/derive-cdn-priority.js +61 -0
  133. package/dist/default/playback/behaviors/derive-cdn-priority.js.map +1 -0
  134. package/dist/default/playback/behaviors/dom/airplay.js +188 -0
  135. package/dist/default/playback/behaviors/dom/airplay.js.map +1 -0
  136. package/dist/default/playback/behaviors/dom/apply-start-position.js +81 -0
  137. package/dist/default/playback/behaviors/dom/apply-start-position.js.map +1 -0
  138. package/dist/default/playback/behaviors/dom/end-of-stream.js +97 -0
  139. package/dist/default/playback/behaviors/dom/end-of-stream.js.map +1 -0
  140. package/dist/default/playback/behaviors/dom/load-segments.js +169 -0
  141. package/dist/default/playback/behaviors/dom/load-segments.js.map +1 -0
  142. package/dist/default/playback/behaviors/dom/recover-end-stall.js +72 -0
  143. package/dist/default/playback/behaviors/dom/recover-end-stall.js.map +1 -0
  144. package/dist/default/playback/behaviors/dom/seek-to-live-edge.js +113 -0
  145. package/dist/default/playback/behaviors/dom/seek-to-live-edge.js.map +1 -0
  146. package/dist/default/playback/behaviors/dom/setup-buffer-actors.js +181 -0
  147. package/dist/default/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
  148. package/dist/default/playback/behaviors/dom/setup-mediasource.js +100 -0
  149. package/dist/default/playback/behaviors/dom/setup-mediasource.js.map +1 -0
  150. package/dist/default/playback/behaviors/dom/setup-text-track-actors.js +40 -0
  151. package/dist/default/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
  152. package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js +25 -0
  153. package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -0
  154. package/dist/default/playback/behaviors/dom/sync-text-tracks.js +109 -0
  155. package/dist/default/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
  156. package/dist/default/playback/behaviors/dom/track-current-time.js +50 -0
  157. package/dist/default/playback/behaviors/dom/track-current-time.js.map +1 -0
  158. package/dist/default/playback/behaviors/dom/track-load-triggers.js +86 -0
  159. package/dist/default/playback/behaviors/dom/track-load-triggers.js.map +1 -0
  160. package/dist/default/playback/behaviors/dom/track-playback-rate.js +35 -0
  161. package/dist/default/playback/behaviors/dom/track-playback-rate.js.map +1 -0
  162. package/dist/default/playback/behaviors/dom/track-player-resolution.js +53 -0
  163. package/dist/default/playback/behaviors/dom/track-player-resolution.js.map +1 -0
  164. package/dist/default/playback/behaviors/dom/track-screen-resolution.js +28 -0
  165. package/dist/default/playback/behaviors/dom/track-screen-resolution.js.map +1 -0
  166. package/dist/default/playback/behaviors/dom/update-mediasource-duration.js +98 -0
  167. package/dist/default/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
  168. package/dist/default/playback/behaviors/establish-start-media-time.js +187 -0
  169. package/dist/default/playback/behaviors/establish-start-media-time.js.map +1 -0
  170. package/dist/default/playback/behaviors/resolve-presentation.js +76 -0
  171. package/dist/default/playback/behaviors/resolve-presentation.js.map +1 -0
  172. package/dist/default/playback/behaviors/resolve-track.js +134 -0
  173. package/dist/default/playback/behaviors/resolve-track.js.map +1 -0
  174. package/dist/default/playback/behaviors/select-tracks.js +189 -0
  175. package/dist/default/playback/behaviors/select-tracks.js.map +1 -0
  176. package/dist/default/playback/behaviors/setup-failover-monitor.js +61 -0
  177. package/dist/default/playback/behaviors/setup-failover-monitor.js.map +1 -0
  178. package/dist/default/playback/behaviors/sync-preload.js +59 -0
  179. package/dist/default/playback/behaviors/sync-preload.js.map +1 -0
  180. package/dist/default/playback/behaviors/track-switching.js +407 -0
  181. package/dist/default/playback/behaviors/track-switching.js.map +1 -0
  182. package/dist/default/playback/engines/hls/engine-audio-only.js +94 -0
  183. package/dist/default/playback/engines/hls/engine-audio-only.js.map +1 -0
  184. package/dist/default/playback/engines/hls/engine-background-video.js +87 -0
  185. package/dist/default/playback/engines/hls/engine-background-video.js.map +1 -0
  186. package/dist/default/playback/engines/hls/engine.js +144 -0
  187. package/dist/default/playback/engines/hls/engine.js.map +1 -0
  188. package/dist/default/playback/primitives/error-messages.js +42 -0
  189. package/dist/default/playback/primitives/error-messages.js.map +1 -0
  190. package/dist/default/playback/primitives/failover-fetch.js +37 -0
  191. package/dist/default/playback/primitives/failover-fetch.js.map +1 -0
  192. package/dist/default/playback/primitives/head-peek.js +41 -0
  193. package/dist/default/playback/primitives/head-peek.js.map +1 -0
  194. package/dist/default/playback/primitives/live-window.js +63 -0
  195. package/dist/default/playback/primitives/live-window.js.map +1 -0
  196. package/dist/default/playback/primitives/relocation-pipelines.js +191 -0
  197. package/dist/default/playback/primitives/relocation-pipelines.js.map +1 -0
  198. package/dist/default/playback/primitives/report-track-conditions.js +74 -0
  199. package/dist/default/playback/primitives/report-track-conditions.js.map +1 -0
  200. package/dist/default/playback/primitives/segment-load-pipeline.js +96 -0
  201. package/dist/default/playback/primitives/segment-load-pipeline.js.map +1 -0
  202. package/dist/default/playback/primitives/selection-rules.js +115 -0
  203. package/dist/default/playback/primitives/selection-rules.js.map +1 -0
  204. package/dist/default/playback/primitives/text-segment-load-pipeline.js +36 -0
  205. package/dist/default/playback/primitives/text-segment-load-pipeline.js.map +1 -0
  206. package/dist/default/playback/primitives/track-types.js +53 -0
  207. package/dist/default/playback/primitives/track-types.js.map +1 -0
  208. package/dist/dev/core/actors/actor.d.ts +26 -0
  209. package/dist/dev/core/actors/actor.d.ts.map +1 -0
  210. package/dist/dev/core/actors/create-machine-actor.d.ts +119 -0
  211. package/dist/dev/core/actors/create-machine-actor.d.ts.map +1 -0
  212. package/dist/dev/core/actors/create-machine-actor.js +89 -0
  213. package/dist/dev/core/actors/create-machine-actor.js.map +1 -0
  214. package/dist/dev/core/actors/create-transition-actor.d.ts +37 -0
  215. package/dist/dev/core/actors/create-transition-actor.d.ts.map +1 -0
  216. package/dist/dev/core/actors/create-transition-actor.js +44 -0
  217. package/dist/dev/core/actors/create-transition-actor.js.map +1 -0
  218. package/dist/dev/core/composition/create-composition.d.ts +241 -0
  219. package/dist/dev/core/composition/create-composition.d.ts.map +1 -0
  220. package/dist/dev/core/composition/create-composition.js +82 -0
  221. package/dist/dev/core/composition/create-composition.js.map +1 -0
  222. package/dist/dev/core/composition/share-signals.d.ts +39 -0
  223. package/dist/dev/core/composition/share-signals.d.ts.map +1 -0
  224. package/dist/dev/core/composition/share-signals.js +34 -0
  225. package/dist/dev/core/composition/share-signals.js.map +1 -0
  226. package/dist/dev/core/machine.d.ts +21 -0
  227. package/dist/dev/core/machine.d.ts.map +1 -0
  228. package/dist/dev/core/machine.js +25 -0
  229. package/dist/dev/core/machine.js.map +1 -0
  230. package/dist/dev/core/reactors/create-machine-reactor.d.ts +87 -0
  231. package/dist/dev/core/reactors/create-machine-reactor.d.ts.map +1 -0
  232. package/dist/dev/core/reactors/create-machine-reactor.js +84 -0
  233. package/dist/dev/core/reactors/create-machine-reactor.js.map +1 -0
  234. package/dist/dev/core/signals/effect.d.ts +14 -0
  235. package/dist/dev/core/signals/effect.d.ts.map +1 -0
  236. package/dist/dev/core/signals/effect.js +61 -0
  237. package/dist/dev/core/signals/effect.js.map +1 -0
  238. package/dist/dev/core/signals/primitives.d.ts +44 -0
  239. package/dist/dev/core/signals/primitives.d.ts.map +1 -0
  240. package/dist/dev/core/signals/primitives.js +50 -0
  241. package/dist/dev/core/signals/primitives.js.map +1 -0
  242. package/dist/dev/core/signals/when.js +36 -0
  243. package/dist/dev/core/signals/when.js.map +1 -0
  244. package/dist/dev/core/tasks/delayed-reschedule.js +27 -0
  245. package/dist/dev/core/tasks/delayed-reschedule.js.map +1 -0
  246. package/dist/dev/core/tasks/task.d.ts +144 -0
  247. package/dist/dev/core/tasks/task.d.ts.map +1 -0
  248. package/dist/dev/core/tasks/task.js +298 -0
  249. package/dist/dev/core/tasks/task.js.map +1 -0
  250. package/dist/dev/dom.d.ts +9 -0
  251. package/dist/dev/dom.js +9 -0
  252. package/dist/dev/hls-audio.d.ts +3 -0
  253. package/dist/dev/hls-audio.js +3 -0
  254. package/dist/dev/hls-background-video.d.ts +4 -0
  255. package/dist/dev/hls-background-video.js +3 -0
  256. package/dist/dev/hls-video.d.ts +5 -0
  257. package/dist/dev/hls-video.js +4 -0
  258. package/dist/dev/hls.d.ts +11 -0
  259. package/dist/dev/hls.js +10 -0
  260. package/dist/dev/index.d.ts +23 -0
  261. package/dist/dev/index.d.ts.map +1 -0
  262. package/dist/dev/index.js +22 -0
  263. package/dist/dev/index.js.map +1 -0
  264. package/dist/dev/media/abr/quality-selection.d.ts +19 -0
  265. package/dist/dev/media/abr/quality-selection.d.ts.map +1 -0
  266. package/dist/dev/media/abr/quality-selection.js +17 -0
  267. package/dist/dev/media/abr/quality-selection.js.map +1 -0
  268. package/dist/dev/media/buffer/back-buffer.d.ts +9 -0
  269. package/dist/dev/media/buffer/back-buffer.d.ts.map +1 -0
  270. package/dist/dev/media/buffer/back-buffer.js +42 -0
  271. package/dist/dev/media/buffer/back-buffer.js.map +1 -0
  272. package/dist/dev/media/buffer/forward-buffer.d.ts +9 -0
  273. package/dist/dev/media/buffer/forward-buffer.d.ts.map +1 -0
  274. package/dist/dev/media/buffer/forward-buffer.js +110 -0
  275. package/dist/dev/media/buffer/forward-buffer.js.map +1 -0
  276. package/dist/dev/media/dom/capabilities.js +61 -0
  277. package/dist/dev/media/dom/capabilities.js.map +1 -0
  278. package/dist/dev/media/dom/mse/append-segment.d.ts +16 -0
  279. package/dist/dev/media/dom/mse/append-segment.d.ts.map +1 -0
  280. package/dist/dev/media/dom/mse/append-segment.js +58 -0
  281. package/dist/dev/media/dom/mse/append-segment.js.map +1 -0
  282. package/dist/dev/media/dom/mse/buffer-flusher.d.ts +24 -0
  283. package/dist/dev/media/dom/mse/buffer-flusher.d.ts.map +1 -0
  284. package/dist/dev/media/dom/mse/buffer-flusher.js +55 -0
  285. package/dist/dev/media/dom/mse/buffer-flusher.js.map +1 -0
  286. package/dist/dev/media/dom/mse/duration.js +87 -0
  287. package/dist/dev/media/dom/mse/duration.js.map +1 -0
  288. package/dist/dev/media/dom/mse/end-of-stream.js +17 -0
  289. package/dist/dev/media/dom/mse/end-of-stream.js.map +1 -0
  290. package/dist/dev/media/dom/mse/mediasource-setup.js +227 -0
  291. package/dist/dev/media/dom/mse/mediasource-setup.js.map +1 -0
  292. package/dist/dev/media/dom/screen.d.ts +7 -0
  293. package/dist/dev/media/dom/screen.d.ts.map +1 -0
  294. package/dist/dev/media/dom/screen.js +95 -0
  295. package/dist/dev/media/dom/screen.js.map +1 -0
  296. package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts +6 -0
  297. package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts.map +1 -0
  298. package/dist/dev/media/dom/text/resolve-vtt-segment.js +50 -0
  299. package/dist/dev/media/dom/text/resolve-vtt-segment.js.map +1 -0
  300. package/dist/dev/media/dom/text/text-track-slots.d.ts +24 -0
  301. package/dist/dev/media/dom/text/text-track-slots.d.ts.map +1 -0
  302. package/dist/dev/media/dom/text/text-track-slots.js +61 -0
  303. package/dist/dev/media/dom/text/text-track-slots.js.map +1 -0
  304. package/dist/dev/media/errors.d.ts +68 -0
  305. package/dist/dev/media/errors.d.ts.map +1 -0
  306. package/dist/dev/media/errors.js +60 -0
  307. package/dist/dev/media/errors.js.map +1 -0
  308. package/dist/dev/media/hls/parse-attributes.js +131 -0
  309. package/dist/dev/media/hls/parse-attributes.js.map +1 -0
  310. package/dist/dev/media/hls/parse-media-playlist.js +253 -0
  311. package/dist/dev/media/hls/parse-media-playlist.js.map +1 -0
  312. package/dist/dev/media/hls/parse-multivariant.js +234 -0
  313. package/dist/dev/media/hls/parse-multivariant.js.map +1 -0
  314. package/dist/dev/media/hls/reload-policy.js +63 -0
  315. package/dist/dev/media/hls/reload-policy.js.map +1 -0
  316. package/dist/dev/media/hls/resolve-url.js +9 -0
  317. package/dist/dev/media/hls/resolve-url.js.map +1 -0
  318. package/dist/dev/media/live-window.js +32 -0
  319. package/dist/dev/media/live-window.js.map +1 -0
  320. package/dist/dev/media/media-tracks/media-tracks.d.ts +46 -0
  321. package/dist/dev/media/media-tracks/media-tracks.d.ts.map +1 -0
  322. package/dist/dev/media/media-tracks/media-tracks.js +96 -0
  323. package/dist/dev/media/media-tracks/media-tracks.js.map +1 -0
  324. package/dist/dev/media/mp4/box.js +57 -0
  325. package/dist/dev/media/mp4/box.js.map +1 -0
  326. package/dist/dev/media/mp4/timestamp-origin.js +95 -0
  327. package/dist/dev/media/mp4/timestamp-origin.js.map +1 -0
  328. package/dist/dev/media/primitives/resolution.d.ts +22 -0
  329. package/dist/dev/media/primitives/resolution.d.ts.map +1 -0
  330. package/dist/dev/media/primitives/resolution.js +26 -0
  331. package/dist/dev/media/primitives/resolution.js.map +1 -0
  332. package/dist/dev/media/primitives/select-tracks.js +97 -0
  333. package/dist/dev/media/primitives/select-tracks.js.map +1 -0
  334. package/dist/dev/media/text/parse-vtt-timestamp-map.js +40 -0
  335. package/dist/dev/media/text/parse-vtt-timestamp-map.js.map +1 -0
  336. package/dist/dev/media/text/resolve-vtt-metadata.js +22 -0
  337. package/dist/dev/media/text/resolve-vtt-metadata.js.map +1 -0
  338. package/dist/dev/media/types/index.d.ts +306 -0
  339. package/dist/dev/media/types/index.d.ts.map +1 -0
  340. package/dist/dev/media/types/index.js +42 -0
  341. package/dist/dev/media/types/index.js.map +1 -0
  342. package/dist/dev/media/utils/cdn.d.ts +11 -0
  343. package/dist/dev/media/utils/cdn.d.ts.map +1 -0
  344. package/dist/dev/media/utils/cdn.js +50 -0
  345. package/dist/dev/media/utils/cdn.js.map +1 -0
  346. package/dist/dev/media/utils/preload.js +21 -0
  347. package/dist/dev/media/utils/preload.js.map +1 -0
  348. package/dist/dev/media/utils/track-selection.js +43 -0
  349. package/dist/dev/media/utils/track-selection.js.map +1 -0
  350. package/dist/dev/media/utils/tracks.js +146 -0
  351. package/dist/dev/media/utils/tracks.js.map +1 -0
  352. package/dist/dev/media-tracks.d.ts +3 -0
  353. package/dist/dev/media-tracks.js +2 -0
  354. package/dist/dev/network/bandwidth-estimator.d.ts +48 -0
  355. package/dist/dev/network/bandwidth-estimator.d.ts.map +1 -0
  356. package/dist/dev/network/bandwidth-estimator.js +95 -0
  357. package/dist/dev/network/bandwidth-estimator.js.map +1 -0
  358. package/dist/dev/network/chunked-stream-iterable.js +47 -0
  359. package/dist/dev/network/chunked-stream-iterable.js.map +1 -0
  360. package/dist/dev/network/ewma.js +68 -0
  361. package/dist/dev/network/ewma.js.map +1 -0
  362. package/dist/dev/network/fetch.js +108 -0
  363. package/dist/dev/network/fetch.js.map +1 -0
  364. package/dist/dev/playback/actors/dom/segment-loader.d.ts +44 -0
  365. package/dist/dev/playback/actors/dom/segment-loader.d.ts.map +1 -0
  366. package/dist/dev/playback/actors/dom/segment-loader.js +233 -0
  367. package/dist/dev/playback/actors/dom/segment-loader.js.map +1 -0
  368. package/dist/dev/playback/actors/dom/source-buffer.d.ts +45 -0
  369. package/dist/dev/playback/actors/dom/source-buffer.d.ts.map +1 -0
  370. package/dist/dev/playback/actors/dom/source-buffer.js +139 -0
  371. package/dist/dev/playback/actors/dom/source-buffer.js.map +1 -0
  372. package/dist/dev/playback/actors/dom/text-tracks.d.ts +3 -0
  373. package/dist/dev/playback/actors/dom/text-tracks.js +46 -0
  374. package/dist/dev/playback/actors/dom/text-tracks.js.map +1 -0
  375. package/dist/dev/playback/actors/text-track-segment-loader.d.ts +48 -0
  376. package/dist/dev/playback/actors/text-track-segment-loader.d.ts.map +1 -0
  377. package/dist/dev/playback/actors/text-track-segment-loader.js +138 -0
  378. package/dist/dev/playback/actors/text-track-segment-loader.js.map +1 -0
  379. package/dist/dev/playback/actors/text-tracks.d.ts +30 -0
  380. package/dist/dev/playback/actors/text-tracks.d.ts.map +1 -0
  381. package/dist/dev/playback/adapters/hls-audio/adapter.d.ts +11 -0
  382. package/dist/dev/playback/adapters/hls-audio/adapter.d.ts.map +1 -0
  383. package/dist/dev/playback/adapters/hls-audio/adapter.js +8 -0
  384. package/dist/dev/playback/adapters/hls-audio/adapter.js.map +1 -0
  385. package/dist/dev/playback/adapters/hls-audio/mixin.d.ts +52 -0
  386. package/dist/dev/playback/adapters/hls-audio/mixin.d.ts.map +1 -0
  387. package/dist/dev/playback/adapters/hls-audio/mixin.js +178 -0
  388. package/dist/dev/playback/adapters/hls-audio/mixin.js.map +1 -0
  389. package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts +19 -0
  390. package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts.map +1 -0
  391. package/dist/dev/playback/adapters/hls-background-video/adapter.js +17 -0
  392. package/dist/dev/playback/adapters/hls-background-video/adapter.js.map +1 -0
  393. package/dist/dev/playback/adapters/hls-background-video/host.d.ts +34 -0
  394. package/dist/dev/playback/adapters/hls-background-video/host.d.ts.map +1 -0
  395. package/dist/dev/playback/adapters/hls-background-video/host.js +56 -0
  396. package/dist/dev/playback/adapters/hls-background-video/host.js.map +1 -0
  397. package/dist/dev/playback/adapters/hls-background-video/mixin.d.ts +69 -0
  398. package/dist/dev/playback/adapters/hls-background-video/mixin.d.ts.map +1 -0
  399. package/dist/dev/playback/adapters/hls-background-video/mixin.js +191 -0
  400. package/dist/dev/playback/adapters/hls-background-video/mixin.js.map +1 -0
  401. package/dist/dev/playback/adapters/hls-video/adapter.d.ts +11 -0
  402. package/dist/dev/playback/adapters/hls-video/adapter.d.ts.map +1 -0
  403. package/dist/dev/playback/adapters/hls-video/adapter.js +11 -0
  404. package/dist/dev/playback/adapters/hls-video/adapter.js.map +1 -0
  405. package/dist/dev/playback/adapters/hls-video/error-surface.d.ts +17 -0
  406. package/dist/dev/playback/adapters/hls-video/error-surface.d.ts.map +1 -0
  407. package/dist/dev/playback/adapters/hls-video/error-surface.js +46 -0
  408. package/dist/dev/playback/adapters/hls-video/error-surface.js.map +1 -0
  409. package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts +21 -0
  410. package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts.map +1 -0
  411. package/dist/dev/playback/adapters/hls-video/media-tracks.js +125 -0
  412. package/dist/dev/playback/adapters/hls-video/media-tracks.js.map +1 -0
  413. package/dist/dev/playback/adapters/hls-video/mixin.d.ts +62 -0
  414. package/dist/dev/playback/adapters/hls-video/mixin.d.ts.map +1 -0
  415. package/dist/dev/playback/adapters/hls-video/mixin.js +299 -0
  416. package/dist/dev/playback/adapters/hls-video/mixin.js.map +1 -0
  417. package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts +23 -0
  418. package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts.map +1 -0
  419. package/dist/dev/playback/behaviors/calculate-presentation-duration.js +33 -0
  420. package/dist/dev/playback/behaviors/calculate-presentation-duration.js.map +1 -0
  421. package/dist/dev/playback/behaviors/collect-errors.d.ts +2 -0
  422. package/dist/dev/playback/behaviors/collect-errors.js +98 -0
  423. package/dist/dev/playback/behaviors/collect-errors.js.map +1 -0
  424. package/dist/dev/playback/behaviors/derive-cdn-priority.js +61 -0
  425. package/dist/dev/playback/behaviors/derive-cdn-priority.js.map +1 -0
  426. package/dist/dev/playback/behaviors/dom/airplay.js +188 -0
  427. package/dist/dev/playback/behaviors/dom/airplay.js.map +1 -0
  428. package/dist/dev/playback/behaviors/dom/apply-start-position.js +81 -0
  429. package/dist/dev/playback/behaviors/dom/apply-start-position.js.map +1 -0
  430. package/dist/dev/playback/behaviors/dom/end-of-stream.js +97 -0
  431. package/dist/dev/playback/behaviors/dom/end-of-stream.js.map +1 -0
  432. package/dist/dev/playback/behaviors/dom/load-segments.d.ts +69 -0
  433. package/dist/dev/playback/behaviors/dom/load-segments.d.ts.map +1 -0
  434. package/dist/dev/playback/behaviors/dom/load-segments.js +169 -0
  435. package/dist/dev/playback/behaviors/dom/load-segments.js.map +1 -0
  436. package/dist/dev/playback/behaviors/dom/recover-end-stall.js +72 -0
  437. package/dist/dev/playback/behaviors/dom/recover-end-stall.js.map +1 -0
  438. package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js +113 -0
  439. package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js.map +1 -0
  440. package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js +181 -0
  441. package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
  442. package/dist/dev/playback/behaviors/dom/setup-mediasource.js +100 -0
  443. package/dist/dev/playback/behaviors/dom/setup-mediasource.js.map +1 -0
  444. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts +28 -0
  445. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts.map +1 -0
  446. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js +40 -0
  447. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
  448. package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js +25 -0
  449. package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -0
  450. package/dist/dev/playback/behaviors/dom/sync-text-tracks.js +109 -0
  451. package/dist/dev/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
  452. package/dist/dev/playback/behaviors/dom/track-current-time.d.ts +33 -0
  453. package/dist/dev/playback/behaviors/dom/track-current-time.d.ts.map +1 -0
  454. package/dist/dev/playback/behaviors/dom/track-current-time.js +50 -0
  455. package/dist/dev/playback/behaviors/dom/track-current-time.js.map +1 -0
  456. package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts +41 -0
  457. package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts.map +1 -0
  458. package/dist/dev/playback/behaviors/dom/track-load-triggers.js +86 -0
  459. package/dist/dev/playback/behaviors/dom/track-load-triggers.js.map +1 -0
  460. package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts +33 -0
  461. package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts.map +1 -0
  462. package/dist/dev/playback/behaviors/dom/track-playback-rate.js +35 -0
  463. package/dist/dev/playback/behaviors/dom/track-playback-rate.js.map +1 -0
  464. package/dist/dev/playback/behaviors/dom/track-player-resolution.d.ts +8 -0
  465. package/dist/dev/playback/behaviors/dom/track-player-resolution.d.ts.map +1 -0
  466. package/dist/dev/playback/behaviors/dom/track-player-resolution.js +53 -0
  467. package/dist/dev/playback/behaviors/dom/track-player-resolution.js.map +1 -0
  468. package/dist/dev/playback/behaviors/dom/track-screen-resolution.js +28 -0
  469. package/dist/dev/playback/behaviors/dom/track-screen-resolution.js.map +1 -0
  470. package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js +98 -0
  471. package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
  472. package/dist/dev/playback/behaviors/establish-start-media-time.d.ts +32 -0
  473. package/dist/dev/playback/behaviors/establish-start-media-time.d.ts.map +1 -0
  474. package/dist/dev/playback/behaviors/establish-start-media-time.js +187 -0
  475. package/dist/dev/playback/behaviors/establish-start-media-time.js.map +1 -0
  476. package/dist/dev/playback/behaviors/resolve-presentation.d.ts +8 -0
  477. package/dist/dev/playback/behaviors/resolve-presentation.d.ts.map +1 -0
  478. package/dist/dev/playback/behaviors/resolve-presentation.js +76 -0
  479. package/dist/dev/playback/behaviors/resolve-presentation.js.map +1 -0
  480. package/dist/dev/playback/behaviors/resolve-track.js +134 -0
  481. package/dist/dev/playback/behaviors/resolve-track.js.map +1 -0
  482. package/dist/dev/playback/behaviors/select-tracks.d.ts +61 -0
  483. package/dist/dev/playback/behaviors/select-tracks.d.ts.map +1 -0
  484. package/dist/dev/playback/behaviors/select-tracks.js +189 -0
  485. package/dist/dev/playback/behaviors/select-tracks.js.map +1 -0
  486. package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts +11 -0
  487. package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts.map +1 -0
  488. package/dist/dev/playback/behaviors/setup-failover-monitor.js +61 -0
  489. package/dist/dev/playback/behaviors/setup-failover-monitor.js.map +1 -0
  490. package/dist/dev/playback/behaviors/sync-preload.js +59 -0
  491. package/dist/dev/playback/behaviors/sync-preload.js.map +1 -0
  492. package/dist/dev/playback/behaviors/track-switching.d.ts +110 -0
  493. package/dist/dev/playback/behaviors/track-switching.d.ts.map +1 -0
  494. package/dist/dev/playback/behaviors/track-switching.js +407 -0
  495. package/dist/dev/playback/behaviors/track-switching.js.map +1 -0
  496. package/dist/dev/playback/engines/hls/engine-audio-only.d.ts +160 -0
  497. package/dist/dev/playback/engines/hls/engine-audio-only.d.ts.map +1 -0
  498. package/dist/dev/playback/engines/hls/engine-audio-only.js +94 -0
  499. package/dist/dev/playback/engines/hls/engine-audio-only.js.map +1 -0
  500. package/dist/dev/playback/engines/hls/engine-background-video.d.ts +131 -0
  501. package/dist/dev/playback/engines/hls/engine-background-video.d.ts.map +1 -0
  502. package/dist/dev/playback/engines/hls/engine-background-video.js +87 -0
  503. package/dist/dev/playback/engines/hls/engine-background-video.js.map +1 -0
  504. package/dist/dev/playback/engines/hls/engine.d.ts +289 -0
  505. package/dist/dev/playback/engines/hls/engine.d.ts.map +1 -0
  506. package/dist/dev/playback/engines/hls/engine.js +144 -0
  507. package/dist/dev/playback/engines/hls/engine.js.map +1 -0
  508. package/dist/dev/playback/primitives/derive-start-media-time.d.ts +16 -0
  509. package/dist/dev/playback/primitives/derive-start-media-time.d.ts.map +1 -0
  510. package/dist/dev/playback/primitives/error-messages.js +42 -0
  511. package/dist/dev/playback/primitives/error-messages.js.map +1 -0
  512. package/dist/dev/playback/primitives/failover-fetch.js +37 -0
  513. package/dist/dev/playback/primitives/failover-fetch.js.map +1 -0
  514. package/dist/dev/playback/primitives/head-peek.js +41 -0
  515. package/dist/dev/playback/primitives/head-peek.js.map +1 -0
  516. package/dist/dev/playback/primitives/live-window.js +63 -0
  517. package/dist/dev/playback/primitives/live-window.js.map +1 -0
  518. package/dist/dev/playback/primitives/relocation-pipelines.js +191 -0
  519. package/dist/dev/playback/primitives/relocation-pipelines.js.map +1 -0
  520. package/dist/dev/playback/primitives/report-track-conditions.d.ts +8 -0
  521. package/dist/dev/playback/primitives/report-track-conditions.d.ts.map +1 -0
  522. package/dist/dev/playback/primitives/report-track-conditions.js +74 -0
  523. package/dist/dev/playback/primitives/report-track-conditions.js.map +1 -0
  524. package/dist/dev/playback/primitives/segment-load-pipeline.d.ts +2 -0
  525. package/dist/dev/playback/primitives/segment-load-pipeline.js +96 -0
  526. package/dist/dev/playback/primitives/segment-load-pipeline.js.map +1 -0
  527. package/dist/dev/playback/primitives/selection-rules.d.ts +66 -0
  528. package/dist/dev/playback/primitives/selection-rules.d.ts.map +1 -0
  529. package/dist/dev/playback/primitives/selection-rules.js +115 -0
  530. package/dist/dev/playback/primitives/selection-rules.js.map +1 -0
  531. package/dist/dev/playback/primitives/source-buffer-messages.d.ts +40 -0
  532. package/dist/dev/playback/primitives/source-buffer-messages.d.ts.map +1 -0
  533. package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts +56 -0
  534. package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts.map +1 -0
  535. package/dist/dev/playback/primitives/text-segment-load-pipeline.js +36 -0
  536. package/dist/dev/playback/primitives/text-segment-load-pipeline.js.map +1 -0
  537. package/dist/dev/playback/primitives/text-track-messages.d.ts +14 -0
  538. package/dist/dev/playback/primitives/text-track-messages.d.ts.map +1 -0
  539. package/dist/dev/playback/primitives/track-types.js +53 -0
  540. package/dist/dev/playback/primitives/track-types.js.map +1 -0
  541. package/package.json +60 -41
  542. package/dist/adapter-25AtMN8s.d.ts +0 -719
  543. package/dist/adapter-25AtMN8s.d.ts.map +0 -1
  544. package/dist/adapter-CflgYzjF.js +0 -3556
  545. package/dist/adapter-CflgYzjF.js.map +0 -1
  546. package/dist/dom/index.d.ts +0 -221
  547. package/dist/dom/index.d.ts.map +0 -1
  548. package/dist/dom/index.js +0 -38
  549. package/dist/dom/index.js.map +0 -1
  550. package/dist/dom/playback-engine/index.d.ts +0 -2
  551. package/dist/dom/playback-engine/index.js +0 -4
  552. package/dist/index.d.ts +0 -13
  553. package/dist/index.d.ts.map +0 -1
  554. package/dist/index.js +0 -3
  555. package/dist/src-DRsS_H80.js +0 -14
  556. package/dist/src-DRsS_H80.js.map +0 -1
@@ -0,0 +1,84 @@
1
+ import { untrack } from "../signals/primitives.js";
2
+ import { effect } from "../signals/effect.js";
3
+ import { createMachineCore } from "../machine.js";
4
+ //#region src/core/reactors/create-machine-reactor.ts
5
+ const toArray = (x) => x === void 0 ? [] : Array.isArray(x) ? x : [x];
6
+ /**
7
+ * Creates a reactive Reactor from a declarative definition.
8
+ *
9
+ * A Reactor is driven by subscriptions to external signals rather than imperative messages. Each state holds an array
10
+ * of effect functions — every element becomes one independent `effect()` call gated on that state, with its own
11
+ * dependency tracking and cleanup lifecycle.
12
+ *
13
+ * `'destroying'` and `'destroyed'` are always implicit terminal states. `destroy()` transitions through both in
14
+ * sequence: `'destroying'` first (for potential async teardown in a future extension), then immediately `'destroyed'`
15
+ * for the synchronous base case. Active effect cleanups fire via disposal.
16
+ *
17
+ * @example
18
+ * const reactor = createMachineReactor({
19
+ * initial: 'waiting',
20
+ * monitor: () => (srcSignal.get() ? 'active' : 'waiting'),
21
+ * states: {
22
+ * active: {
23
+ * // entry: runs once on state entry; fn body is automatically untracked.
24
+ * entry: () => listen(el, 'play', handler),
25
+ * // effects: re-runs whenever tracked signals change.
26
+ * effects: () => {
27
+ * currentTimeSignal.get();
28
+ * return cleanup;
29
+ * },
30
+ * },
31
+ * waiting: {},
32
+ * },
33
+ * });
34
+ */
35
+ function createMachineReactor(def) {
36
+ const { snapshotSignal, getState, transition } = createMachineCore({ value: def.initial });
37
+ const effectDisposals = [];
38
+ const wrapResult = (result) => {
39
+ if (!result) return void 0;
40
+ if (typeof result === "function") return result;
41
+ return () => result.abort();
42
+ };
43
+ const untracked = (baseCall) => () => untrack(baseCall);
44
+ const isTerminal = (snapshot) => snapshot.value === "destroying" || snapshot.value === "destroyed";
45
+ const descriptors = [...toArray(def.monitor).map((fn) => ({
46
+ fn: () => {
47
+ const target = fn();
48
+ if (target !== getState()) transition(target);
49
+ },
50
+ shouldSkip: isTerminal
51
+ })), ...Object.entries(def.states).flatMap(([state, stateDef]) => {
52
+ const isNotState = (snapshot) => snapshot.value !== state;
53
+ return [...toArray(stateDef.entry).map((fn) => ({
54
+ fn,
55
+ shouldSkip: isNotState,
56
+ toFnCall: untracked
57
+ })), ...toArray(stateDef.effects).map((fn) => ({
58
+ fn,
59
+ shouldSkip: isNotState
60
+ }))];
61
+ })];
62
+ const toEffect = ({ fn, shouldSkip, toFnCall = (baseCall) => baseCall }) => effect(() => {
63
+ if (shouldSkip(snapshotSignal.get())) return;
64
+ const baseCall = () => fn();
65
+ return wrapResult(toFnCall(baseCall)());
66
+ });
67
+ effectDisposals.push(...descriptors.map(toEffect));
68
+ return {
69
+ get snapshot() {
70
+ return snapshotSignal;
71
+ },
72
+ destroy() {
73
+ const state = getState();
74
+ if (state === "destroying" || state === "destroyed") return;
75
+ transition("destroying");
76
+ transition("destroyed");
77
+ for (const dispose of effectDisposals) dispose();
78
+ }
79
+ };
80
+ }
81
+ //#endregion
82
+ export { createMachineReactor };
83
+
84
+ //# sourceMappingURL=create-machine-reactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-machine-reactor.js","names":[],"sources":["../../../../src/core/reactors/create-machine-reactor.ts"],"sourcesContent":["import type { Machine, MachineSnapshot } from '../machine';\nimport { createMachineCore } from '../machine';\nimport { effect } from '../signals/effect';\nimport { untrack } from '../signals/primitives';\n\n// =============================================================================\n// Definition types\n// =============================================================================\n\n/**\n * A reactive state-deriving function used in the `monitor` field.\n *\n * Returns the target state the reactor should be in. Any signals read inside the fn body create reactive dependencies —\n * the framework re-evaluates it when those signals change and automatically calls `transition()` when the returned\n * state differs from the current one.\n */\nexport type ReactorDeriveFn<State extends string> = () => State;\n\n/**\n * An effect function used in reactor `entry` and `effects` blocks.\n *\n * May return a cleanup function that runs before each re-evaluation and on state exit (including destroy).\n */\nexport type ReactorEffectFn = () => (() => void) | { abort(): void } | void;\n\n/**\n * Per-state effect grouping for a single reactor state.\n *\n * - `entry` effects run once on state entry. The fn body is automatically untracked — no `untrack()` calls are needed\n * inside. Use this for one-time setup: reading current values, attaching event listeners, etc.\n * - `effects` run on state entry and re-run whenever a signal read inside the fn body changes. Use `untrack()` for reads\n * you do not want to track. Use this for work that must stay in sync with reactive state.\n *\n * Both are optional; pass `{}` for states with no effects.\n */\nexport type ReactorStateDefinition = {\n entry?: ReactorEffectFn | ReactorEffectFn[];\n effects?: ReactorEffectFn | ReactorEffectFn[];\n};\n\n/**\n * Full reactor definition passed to `createMachineReactor`.\n *\n * `State` is the set of domain-meaningful states. `'destroying'` and `'destroyed'` are always added by the framework as\n * implicit terminal states — do not include them here.\n */\nexport type ReactorDefinition<State extends string> = {\n /** Initial state. */\n initial: State;\n /**\n * Reactive state derivation. Registered before per-state effects — the ordering guarantee ensures transitions fired\n * here take effect before per-state effects re-evaluate in the same flush.\n */\n monitor?: ReactorDeriveFn<State> | ReactorDeriveFn<State>[];\n /**\n * Per-state effect groupings. Every valid state must be declared — pass `{}` for states with no effects. `entry` and\n * `effects` each become independent `effect()` calls gated on that state, with their own cleanup lifecycles.\n */\n states: Record<State, ReactorStateDefinition>;\n};\n\n// =============================================================================\n// Live reactor interface\n// =============================================================================\n\n/** Live reactor instance returned by `createMachineReactor`. */\nexport type Reactor<State extends string> = Machine<MachineSnapshot<State>>;\n\n// =============================================================================\n// Implementation helpers\n// =============================================================================\n\nconst toArray = <T>(x: T | T[] | undefined): T[] => (x === undefined ? [] : Array.isArray(x) ? x : [x]);\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Creates a reactive Reactor from a declarative definition.\n *\n * A Reactor is driven by subscriptions to external signals rather than imperative messages. Each state holds an array\n * of effect functions — every element becomes one independent `effect()` call gated on that state, with its own\n * dependency tracking and cleanup lifecycle.\n *\n * `'destroying'` and `'destroyed'` are always implicit terminal states. `destroy()` transitions through both in\n * sequence: `'destroying'` first (for potential async teardown in a future extension), then immediately `'destroyed'`\n * for the synchronous base case. Active effect cleanups fire via disposal.\n *\n * @example\n * const reactor = createMachineReactor({\n * initial: 'waiting',\n * monitor: () => (srcSignal.get() ? 'active' : 'waiting'),\n * states: {\n * active: {\n * // entry: runs once on state entry; fn body is automatically untracked.\n * entry: () => listen(el, 'play', handler),\n * // effects: re-runs whenever tracked signals change.\n * effects: () => {\n * currentTimeSignal.get();\n * return cleanup;\n * },\n * },\n * waiting: {},\n * },\n * });\n */\nexport function createMachineReactor<State extends string>(\n def: ReactorDefinition<State>\n): Reactor<State | 'destroying' | 'destroyed'> {\n type FullState = State | 'destroying' | 'destroyed';\n\n const { snapshotSignal, getState, transition } = createMachineCore<FullState, MachineSnapshot<FullState>>({\n value: def.initial as FullState,\n });\n\n const effectDisposals: Array<() => void> = [];\n\n const wrapResult = (result: ReturnType<ReactorEffectFn>) => {\n if (!result) return undefined;\n\n if (typeof result === 'function') return result;\n\n return () => result.abort();\n };\n\n type EffectCall = () => ReturnType<ReactorEffectFn>;\n\n type EffectDescriptor = {\n fn: ReactorEffectFn;\n shouldSkip: (snapshot: { value: FullState }) => boolean;\n toFnCall?: (baseCall: EffectCall) => EffectCall;\n };\n\n const untracked: EffectDescriptor['toFnCall'] = (baseCall) => () => untrack(baseCall);\n\n const isTerminal = (snapshot: { value: FullState }) =>\n snapshot.value === 'destroying' || snapshot.value === 'destroyed';\n\n // `monitor` descriptors are built first — the ordering guarantee ensures\n // transitions they trigger take effect before per-state effects re-evaluate\n // in the same flush. See the comment on effect registration order in the\n // previous implementation for full details.\n const descriptors: EffectDescriptor[] = [\n ...toArray(def.monitor).map((fn) => ({\n fn: () => {\n const target = fn();\n\n if (target !== (getState() as State)) transition(target as FullState);\n },\n shouldSkip: isTerminal,\n })),\n ...(Object.entries(def.states) as Array<[State, ReactorStateDefinition]>).flatMap(([state, stateDef]) => {\n const isNotState = (snapshot: { value: FullState }) => snapshot.value !== state;\n\n return [\n ...toArray(stateDef.entry).map((fn) => ({ fn, shouldSkip: isNotState, toFnCall: untracked })),\n ...toArray(stateDef.effects).map((fn) => ({ fn, shouldSkip: isNotState })),\n ];\n }),\n ];\n\n const toEffect = ({ fn, shouldSkip, toFnCall = (baseCall) => baseCall }: EffectDescriptor) =>\n effect(() => {\n const snapshot = snapshotSignal.get();\n if (shouldSkip(snapshot)) return;\n\n const baseCall = () => fn();\n\n return wrapResult(toFnCall(baseCall)());\n });\n\n effectDisposals.push(...descriptors.map(toEffect));\n\n return {\n get snapshot() {\n return snapshotSignal;\n },\n\n destroy(): void {\n const state = getState();\n if (state === 'destroying' || state === 'destroyed') return;\n\n // Two-step teardown: transition through 'destroying' first to leave room\n // for async teardown in a future extension, then immediately 'destroyed'\n // for the synchronous base case. Active effect cleanups fire via disposal.\n transition('destroying');\n transition('destroyed');\n\n for (const dispose of effectDisposals) dispose();\n },\n };\n}\n"],"mappings":";;;;AAwEA,MAAM,WAAc,MAAiC,MAAM,KAAA,IAAY,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCrG,SAAgB,qBACd,KAC6C;CAG7C,MAAM,EAAE,gBAAgB,UAAU,eAAe,kBAAyD,EACxG,OAAO,IAAI,QACb,CAAC;CAED,MAAM,kBAAqC,CAAC;CAE5C,MAAM,cAAc,WAAwC;EAC1D,IAAI,CAAC,QAAQ,OAAO,KAAA;EAEpB,IAAI,OAAO,WAAW,YAAY,OAAO;EAEzC,aAAa,OAAO,MAAM;CAC5B;CAUA,MAAM,aAA2C,mBAAmB,QAAQ,QAAQ;CAEpF,MAAM,cAAc,aAClB,SAAS,UAAU,gBAAgB,SAAS,UAAU;CAMxD,MAAM,cAAkC,CACtC,GAAG,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,QAAQ;EACnC,UAAU;GACR,MAAM,SAAS,GAAG;GAElB,IAAI,WAAY,SAAS,GAAa,WAAW,MAAmB;EACtE;EACA,YAAY;CACd,EAAE,GACF,GAAI,OAAO,QAAQ,IAAI,MAAM,CAAC,CAA4C,SAAS,CAAC,OAAO,cAAc;EACvG,MAAM,cAAc,aAAmC,SAAS,UAAU;EAE1E,OAAO,CACL,GAAG,QAAQ,SAAS,KAAK,CAAC,CAAC,KAAK,QAAQ;GAAE;GAAI,YAAY;GAAY,UAAU;EAAU,EAAE,GAC5F,GAAG,QAAQ,SAAS,OAAO,CAAC,CAAC,KAAK,QAAQ;GAAE;GAAI,YAAY;EAAW,EAAE,CAC3E;CACF,CAAC,CACH;CAEA,MAAM,YAAY,EAAE,IAAI,YAAY,YAAY,aAAa,eAC3D,aAAa;EAEX,IAAI,WADa,eAAe,IACV,CAAC,GAAG;EAE1B,MAAM,iBAAiB,GAAG;EAE1B,OAAO,WAAW,SAAS,QAAQ,CAAC,CAAC,CAAC;CACxC,CAAC;CAEH,gBAAgB,KAAK,GAAG,YAAY,IAAI,QAAQ,CAAC;CAEjD,OAAO;EACL,IAAI,WAAW;GACb,OAAO;EACT;EAEA,UAAgB;GACd,MAAM,QAAQ,SAAS;GACvB,IAAI,UAAU,gBAAgB,UAAU,aAAa;GAKrD,WAAW,YAAY;GACvB,WAAW,WAAW;GAEtB,KAAK,MAAM,WAAW,iBAAiB,QAAQ;EACjD;CACF;AACF"}
@@ -0,0 +1,14 @@
1
+ //#region src/core/signals/effect.d.ts
2
+ /**
3
+ * Run a side effect whenever its signal dependencies change.
4
+ *
5
+ * Executes immediately (synchronous initial run), then re-runs on the next microtask after any dependency changes. If
6
+ * the callback returns a function, it is called before each re-run and when the effect is stopped — the same cleanup
7
+ * contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.
8
+ *
9
+ * Returns a cleanup function that stops the effect.
10
+ */
11
+ declare function effect(fn: () => (() => void) | void): () => void;
12
+ //#endregion
13
+ export { effect };
14
+ //# sourceMappingURL=effect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.d.ts","names":[],"sources":["../../../../src/core/signals/effect.ts"],"mappings":";;;;;;;;;;iBAsDgB,OAAO"}
@@ -0,0 +1,61 @@
1
+ import { Signal } from "signal-polyfill";
2
+ //#region src/core/signals/effect.ts
3
+ const pending = /* @__PURE__ */ new Set();
4
+ const watcher = new Signal.subtle.Watcher(() => {
5
+ queueMicrotask(runPending);
6
+ });
7
+ function runPending() {
8
+ for (const c of watcher.getPending()) pending.add(c);
9
+ watcher.watch();
10
+ for (const c of pending) {
11
+ pending.delete(c);
12
+ c.get();
13
+ revalidateSources(c);
14
+ }
15
+ }
16
+ /**
17
+ * Recover an effect that wrote a signal one of its own dependencies reads.
18
+ *
19
+ * When an effect body writes a signal that an intermediate computed in its own dependency graph consumes (e.g. a
20
+ * track-selection effect writing the selection slot a candidate-set computed consults), the graph can't tell the
21
+ * effect: the write marks the intermediate dirty, but the effect is the in-flight consumer, so no watcher notification
22
+ * fires — and the effect finishes the run _clean but stale_. Worse, every later external change routed through that
23
+ * intermediate is deduped against its standing dirty flag, so the effect never hears about those either (the
24
+ * lost-wakeup).
25
+ *
26
+ * Pulling each source once after the run closes the hole: a dirtied intermediate recomputes and its dirty flag clears,
27
+ * so the _next_ change through it propagates and wakes the effect normally. The guarantee is liveness, not immediacy —
28
+ * the effect is deliberately not re-run just because it wrote into its own graph (that would double-run every writing
29
+ * effect); it catches up on the next genuine change. Sources that are clean, or whose recomputation is equals-gated to
30
+ * the same value, cost a cached read and notify no one.
31
+ */
32
+ function revalidateSources(c) {
33
+ for (const source of Signal.subtle.introspectSources(c)) source.get();
34
+ }
35
+ /**
36
+ * Run a side effect whenever its signal dependencies change.
37
+ *
38
+ * Executes immediately (synchronous initial run), then re-runs on the next microtask after any dependency changes. If
39
+ * the callback returns a function, it is called before each re-run and when the effect is stopped — the same cleanup
40
+ * contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.
41
+ *
42
+ * Returns a cleanup function that stops the effect.
43
+ */
44
+ function effect(fn) {
45
+ let cleanup;
46
+ const c = new Signal.Computed(() => {
47
+ if (typeof cleanup === "function") cleanup();
48
+ cleanup = fn();
49
+ });
50
+ watcher.watch(c);
51
+ c.get();
52
+ revalidateSources(c);
53
+ return () => {
54
+ watcher.unwatch(c);
55
+ if (typeof cleanup === "function") cleanup();
56
+ };
57
+ }
58
+ //#endregion
59
+ export { effect };
60
+
61
+ //# sourceMappingURL=effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.js","names":[],"sources":["../../../../src/core/signals/effect.ts"],"sourcesContent":["import { Signal } from 'signal-polyfill';\n\n// Computeds waiting to re-run after their dependencies changed.\nconst pending = new Set<Signal.Computed<void>>();\n\nconst watcher = new Signal.subtle.Watcher(() => {\n queueMicrotask(runPending);\n});\n\nfunction runPending() {\n for (const c of watcher.getPending()) {\n pending.add(c as Signal.Computed<void>);\n }\n\n watcher.watch(); // re-arm before running effects, in case they write signals\n\n for (const c of pending) {\n pending.delete(c);\n c.get(); // re-run the effect body\n revalidateSources(c);\n }\n}\n\n/**\n * Recover an effect that wrote a signal one of its own dependencies reads.\n *\n * When an effect body writes a signal that an intermediate computed in its own dependency graph consumes (e.g. a\n * track-selection effect writing the selection slot a candidate-set computed consults), the graph can't tell the\n * effect: the write marks the intermediate dirty, but the effect is the in-flight consumer, so no watcher notification\n * fires — and the effect finishes the run _clean but stale_. Worse, every later external change routed through that\n * intermediate is deduped against its standing dirty flag, so the effect never hears about those either (the\n * lost-wakeup).\n *\n * Pulling each source once after the run closes the hole: a dirtied intermediate recomputes and its dirty flag clears,\n * so the _next_ change through it propagates and wakes the effect normally. The guarantee is liveness, not immediacy —\n * the effect is deliberately not re-run just because it wrote into its own graph (that would double-run every writing\n * effect); it catches up on the next genuine change. Sources that are clean, or whose recomputation is equals-gated to\n * the same value, cost a cached read and notify no one.\n */\nfunction revalidateSources(c: Signal.Computed<void>): void {\n for (const source of Signal.subtle.introspectSources(c)) {\n (source as Signal.State<unknown> | Signal.Computed<unknown>).get();\n }\n}\n\n/**\n * Run a side effect whenever its signal dependencies change.\n *\n * Executes immediately (synchronous initial run), then re-runs on the next microtask after any dependency changes. If\n * the callback returns a function, it is called before each re-run and when the effect is stopped — the same cleanup\n * contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.\n *\n * Returns a cleanup function that stops the effect.\n */\nexport function effect(fn: () => (() => void) | void): () => void {\n let cleanup: (() => void) | void;\n const c = new Signal.Computed(() => {\n if (typeof cleanup === 'function') cleanup();\n\n cleanup = fn();\n });\n\n watcher.watch(c);\n c.get(); // initial run\n revalidateSources(c); // an initial run may self-write too — see the note\n return () => {\n watcher.unwatch(c);\n\n if (typeof cleanup === 'function') cleanup();\n };\n}\n"],"mappings":";;AAGA,MAAM,0BAAU,IAAI,IAA2B;AAE/C,MAAM,UAAU,IAAI,OAAO,OAAO,cAAc;CAC9C,eAAe,UAAU;AAC3B,CAAC;AAED,SAAS,aAAa;CACpB,KAAK,MAAM,KAAK,QAAQ,WAAW,GACjC,QAAQ,IAAI,CAA0B;CAGxC,QAAQ,MAAM;CAEd,KAAK,MAAM,KAAK,SAAS;EACvB,QAAQ,OAAO,CAAC;EAChB,EAAE,IAAI;EACN,kBAAkB,CAAC;CACrB;AACF;;;;;;;;;;;;;;;;;AAkBA,SAAS,kBAAkB,GAAgC;CACzD,KAAK,MAAM,UAAU,OAAO,OAAO,kBAAkB,CAAC,GACpD,OAA6D,IAAI;AAErE;;;;;;;;;;AAWA,SAAgB,OAAO,IAA2C;CAChE,IAAI;CACJ,MAAM,IAAI,IAAI,OAAO,eAAe;EAClC,IAAI,OAAO,YAAY,YAAY,QAAQ;EAE3C,UAAU,GAAG;CACf,CAAC;CAED,QAAQ,MAAM,CAAC;CACf,EAAE,IAAI;CACN,kBAAkB,CAAC;CACnB,aAAa;EACX,QAAQ,QAAQ,CAAC;EAEjB,IAAI,OAAO,YAAY,YAAY,QAAQ;CAC7C;AACF"}
@@ -0,0 +1,44 @@
1
+ import { Signal } from "signal-polyfill";
2
+ //#region src/core/signals/primitives.d.ts
3
+ /** Read a signal value without tracking it as a dependency. */
4
+ declare const untrack: <T>(fn: () => T) => T;
5
+ /** A writable reactive value (read + write). */
6
+ type Signal$1<T> = Signal.State<T>;
7
+ /** A derived reactive value that re-evaluates when its dependencies change (read-only). */
8
+ type Computed<T> = Signal.Computed<T>;
9
+ /** A read-only view of a reactive value. */
10
+ type ReadonlySignal<T> = Omit<Signal.State<T>, 'set'>;
11
+ interface SignalOptions<T> {
12
+ equals?: (t: T, t2: T) => boolean;
13
+ }
14
+ /** Create a writable reactive value. */
15
+ declare function signal<T>(initialValue: T, options?: SignalOptions<T>): Signal$1<T>;
16
+ /** Create a computed reactive value. */
17
+ declare function computed<T>(fn: () => T, options?: SignalOptions<T>): Computed<T>;
18
+ /**
19
+ * Update a writable signal. Two forms:
20
+ *
21
+ * - **Updater function** `(current) => next`. Works for any signal type, including `Signal<T | undefined>` — handle
22
+ * undefined in the updater.
23
+ * - **Partial object** to merge into the current state. Requires `T extends object`.
24
+ *
25
+ * @example
26
+ * update(state, { playbackRate: 2 });
27
+ * update(state, (s) => ({ ...s, count: s.count + 1 }));
28
+ * update(maybeUndefinedSignal, (current) => current ?? defaultValue);
29
+ */
30
+ declare function update<T>(signal: Signal$1<T>, updater: (current: T) => T): void;
31
+ declare function update<T extends object>(signal: Signal$1<T>, updater: Partial<T>): void;
32
+ /**
33
+ * Read every signal in a map and return a plain object snapshot. Each read tracks in the surrounding Computed/Effect —
34
+ * equivalent to calling `.get()` on a single `Signal<S>` over the merged shape.
35
+ *
36
+ * Convenience for behaviors that pass whole state/context snapshots to pure helpers; prefer per-field reads when only a
37
+ * few fields are needed.
38
+ */
39
+ declare function snapshot<M extends Record<string, ReadonlySignal<unknown>>>(map: M): { [K in keyof M]: M[K] extends {
40
+ get(): infer V;
41
+ } ? V : never; };
42
+ //#endregion
43
+ export { Computed, ReadonlySignal, Signal$1 as Signal, SignalOptions, computed, signal, snapshot, untrack, update };
44
+ //# sourceMappingURL=primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.d.ts","names":[],"sources":["../../../../src/core/signals/primitives.ts"],"mappings":";;;cAGa,UAAU,GAAG,UAAU,MAAM;;KAkB9B,SAAO,KAAK,OAAS,MAAM;;KAG3B,SAAS,KAAK,OAAS,SAAS;;KAGhC,eAAe,KAAK,KAAK,OAAS,MAAM;UAEnC,cAAc;EAC7B,UAAU,GAAG,GAAG,IAAI;;;iBAIN,OAAO,GAAG,cAAc,GAAG,UAAU,cAAc,KAAK,SAAO;;iBAK/D,SAAS,GAAG,UAAU,GAAG,UAAU,cAAc,KAAK,SAAS;;;;;;;;;;;;;iBAgB/D,OAAO,GAAG,QAAQ,SAAO,IAAI,UAAU,SAAS,MAAM;iBACtD,OAAO,kBAAkB,QAAQ,SAAO,IAAI,SAAS,QAAQ;;;;;;;;iBAmC7D,SAAS,UAAU,eAAe,0BAChD,KAAK,OACD,WAAW,IAAI,EAAE;EAAa,aAAa;IAAM"}
@@ -0,0 +1,50 @@
1
+ import { Signal } from "signal-polyfill";
2
+ //#region src/core/signals/primitives.ts
3
+ /** Read a signal value without tracking it as a dependency. */
4
+ const untrack = Signal.subtle.untrack;
5
+ /**
6
+ * Read a signal's current value without tracking it as a dependency. Sugar for `untrack(() => signal.get())` to reduce
7
+ * boilerplate at single-read sites. Structurally typed to accept any signal-like (Signal, Computed, ReadonlySignal).
8
+ *
9
+ * Accepts an optional `transform` to project the value in the same call; the default is the identity function so the
10
+ * single-arg form returns `T` unchanged.
11
+ *
12
+ * @example
13
+ * const value = peek(someSignal);
14
+ * const id = peek(presentationSignal, (p) => p?.id);
15
+ */
16
+ function peek(source, transform = (v) => v) {
17
+ return untrack(() => transform(source.get()));
18
+ }
19
+ /** Create a writable reactive value. */
20
+ function signal(initialValue, options) {
21
+ return new Signal.State(initialValue, options);
22
+ }
23
+ /** Create a computed reactive value. */
24
+ function computed(fn, options) {
25
+ return new Signal.Computed(fn, options);
26
+ }
27
+ function update(signal, updater) {
28
+ const current = untrack(() => signal.get());
29
+ if (typeof updater === "function") signal.set(updater(current));
30
+ else signal.set({
31
+ ...current,
32
+ ...updater
33
+ });
34
+ }
35
+ /**
36
+ * Read every signal in a map and return a plain object snapshot. Each read tracks in the surrounding Computed/Effect —
37
+ * equivalent to calling `.get()` on a single `Signal<S>` over the merged shape.
38
+ *
39
+ * Convenience for behaviors that pass whole state/context snapshots to pure helpers; prefer per-field reads when only a
40
+ * few fields are needed.
41
+ */
42
+ function snapshot(map) {
43
+ const out = {};
44
+ for (const key in map) out[key] = map[key].get();
45
+ return out;
46
+ }
47
+ //#endregion
48
+ export { computed, peek, signal, snapshot, untrack, update };
49
+
50
+ //# sourceMappingURL=primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.js","names":["SignalNS"],"sources":["../../../../src/core/signals/primitives.ts"],"sourcesContent":["import { Signal as SignalNS } from 'signal-polyfill';\n\n/** Read a signal value without tracking it as a dependency. */\nexport const untrack: <T>(fn: () => T) => T = SignalNS.subtle.untrack;\n\n/**\n * Read a signal's current value without tracking it as a dependency. Sugar for `untrack(() => signal.get())` to reduce\n * boilerplate at single-read sites. Structurally typed to accept any signal-like (Signal, Computed, ReadonlySignal).\n *\n * Accepts an optional `transform` to project the value in the same call; the default is the identity function so the\n * single-arg form returns `T` unchanged.\n *\n * @example\n * const value = peek(someSignal);\n * const id = peek(presentationSignal, (p) => p?.id);\n */\nexport function peek<T, R = T>(source: { get(): T }, transform: (value: T) => R = (v: T) => v as unknown as R): R {\n return untrack(() => transform(source.get()));\n}\n\n/** A writable reactive value (read + write). */\nexport type Signal<T> = SignalNS.State<T>;\n\n/** A derived reactive value that re-evaluates when its dependencies change (read-only). */\nexport type Computed<T> = SignalNS.Computed<T>;\n\n/** A read-only view of a reactive value. */\nexport type ReadonlySignal<T> = Omit<SignalNS.State<T>, 'set'>;\n\nexport interface SignalOptions<T> {\n equals?: (t: T, t2: T) => boolean;\n}\n\n/** Create a writable reactive value. */\nexport function signal<T>(initialValue: T, options?: SignalOptions<T>): Signal<T> {\n return new SignalNS.State(initialValue, options as SignalNS.Options<T>);\n}\n\n/** Create a computed reactive value. */\nexport function computed<T>(fn: () => T, options?: SignalOptions<T>): Computed<T> {\n return new SignalNS.Computed(fn, options as SignalNS.Options<T>);\n}\n\n/**\n * Update a writable signal. Two forms:\n *\n * - **Updater function** `(current) => next`. Works for any signal type, including `Signal<T | undefined>` — handle\n * undefined in the updater.\n * - **Partial object** to merge into the current state. Requires `T extends object`.\n *\n * @example\n * update(state, { playbackRate: 2 });\n * update(state, (s) => ({ ...s, count: s.count + 1 }));\n * update(maybeUndefinedSignal, (current) => current ?? defaultValue);\n */\nexport function update<T>(signal: Signal<T>, updater: (current: T) => T): void;\nexport function update<T extends object>(signal: Signal<T>, updater: Partial<T>): void;\nexport function update<T>(signal: Signal<T>, updater: ((current: T) => T) | object): void {\n const current = untrack(() => signal.get());\n\n if (typeof updater === 'function') {\n signal.set((updater as (current: T) => T)(current));\n } else {\n // Partial<T> form — `T extends object` enforced by the public overload.\n signal.set({ ...(current as object), ...updater } as T);\n }\n}\n\n/**\n * Equality comparator for objects with an optional `id` field. Designed for use as a `computed` `equals` option when\n * reacting to identity changes (Ham-shaped objects, JSON-API-shaped resources) while filtering internal updates that\n * preserve the id.\n *\n * Handles undefined inputs symmetrically: both undefined → equal; one undefined → different.\n *\n * @example\n * const presentationById = computed(() => state.presentation.get(), {\n * equals: equalsById,\n * });\n */\nexport function equalsById<T extends { id?: string }>(a: T | undefined, b: T | undefined): boolean {\n return a?.id === b?.id;\n}\n\n/**\n * Read every signal in a map and return a plain object snapshot. Each read tracks in the surrounding Computed/Effect —\n * equivalent to calling `.get()` on a single `Signal<S>` over the merged shape.\n *\n * Convenience for behaviors that pass whole state/context snapshots to pure helpers; prefer per-field reads when only a\n * few fields are needed.\n */\nexport function snapshot<M extends Record<string, ReadonlySignal<unknown>>>(\n map: M\n): { [K in keyof M]: M[K] extends { get(): infer V } ? V : never } {\n const out = {} as { [K in keyof M]: M[K] extends { get(): infer V } ? V : never };\n\n for (const key in map) {\n out[key] = map[key]!.get() as never;\n }\n\n return out;\n}\n"],"mappings":";;;AAGA,MAAa,UAAiCA,OAAS,OAAO;;;;;;;;;;;;AAa9D,SAAgB,KAAe,QAAsB,aAA8B,MAAS,GAAsB;CAChH,OAAO,cAAc,UAAU,OAAO,IAAI,CAAC,CAAC;AAC9C;;AAgBA,SAAgB,OAAU,cAAiB,SAAuC;CAChF,OAAO,IAAIA,OAAS,MAAM,cAAc,OAA8B;AACxE;;AAGA,SAAgB,SAAY,IAAa,SAAyC;CAChF,OAAO,IAAIA,OAAS,SAAS,IAAI,OAA8B;AACjE;AAgBA,SAAgB,OAAU,QAAmB,SAA6C;CACxF,MAAM,UAAU,cAAc,OAAO,IAAI,CAAC;CAE1C,IAAI,OAAO,YAAY,YACrB,OAAO,IAAK,QAA8B,OAAO,CAAC;MAGlD,OAAO,IAAI;EAAE,GAAI;EAAoB,GAAG;CAAQ,CAAM;AAE1D;;;;;;;;AAyBA,SAAgB,SACd,KACiE;CACjE,MAAM,MAAM,CAAC;CAEb,KAAK,MAAM,OAAO,KAChB,IAAI,OAAO,IAAI,IAAI,CAAE,IAAI;CAG3B,OAAO;AACT"}
@@ -0,0 +1,36 @@
1
+ import { effect } from "./effect.js";
2
+ //#region src/core/signals/when.ts
3
+ /**
4
+ * Resolve once `condition` returns true. The condition is a tracked read — it re-evaluates whenever a signal it read
5
+ * changes — so this is the promise bridge from signal space into async task bodies (await a state condition mid-task
6
+ * without polling).
7
+ *
8
+ * Settles synchronously when the condition already holds. Rejects with the abort reason when `signal` aborts first (an
9
+ * already-aborted signal rejects without evaluating the condition), so a task awaiting a condition dies with its runner
10
+ * instead of leaking the subscription.
11
+ */
12
+ function when(condition, options = {}) {
13
+ const { signal } = options;
14
+ if (signal?.aborted) return Promise.reject(signal.reason);
15
+ return new Promise((resolve, reject) => {
16
+ let settled = false;
17
+ const settle = (complete) => {
18
+ if (settled) return;
19
+ settled = true;
20
+ complete();
21
+ queueMicrotask(() => {
22
+ signal?.removeEventListener("abort", onAbort);
23
+ stop();
24
+ });
25
+ };
26
+ const onAbort = () => settle(() => reject(signal?.reason));
27
+ signal?.addEventListener("abort", onAbort, { once: true });
28
+ const stop = effect(() => {
29
+ if (!settled && condition()) settle(resolve);
30
+ });
31
+ });
32
+ }
33
+ //#endregion
34
+ export { when };
35
+
36
+ //# sourceMappingURL=when.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when.js","names":[],"sources":["../../../../src/core/signals/when.ts"],"sourcesContent":["import { effect } from './effect';\n\n/**\n * Resolve once `condition` returns true. The condition is a tracked read — it re-evaluates whenever a signal it read\n * changes — so this is the promise bridge from signal space into async task bodies (await a state condition mid-task\n * without polling).\n *\n * Settles synchronously when the condition already holds. Rejects with the abort reason when `signal` aborts first (an\n * already-aborted signal rejects without evaluating the condition), so a task awaiting a condition dies with its runner\n * instead of leaking the subscription.\n */\nexport function when(condition: () => boolean, options: { signal?: AbortSignal } = {}): Promise<void> {\n const { signal } = options;\n if (signal?.aborted) return Promise.reject(signal.reason);\n\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n const settle = (complete: () => void) => {\n if (settled) return;\n\n settled = true;\n complete();\n // Deferred: on the effect's synchronous initial run `stop` isn't\n // assigned yet, and stopping an effect from inside its own body is\n // undefined behavior for the scheduler either way.\n queueMicrotask(() => {\n signal?.removeEventListener('abort', onAbort);\n stop();\n });\n };\n const onAbort = () => settle(() => reject(signal?.reason));\n\n signal?.addEventListener('abort', onAbort, { once: true });\n const stop = effect(() => {\n if (!settled && condition()) settle(resolve);\n });\n });\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,KAAK,WAA0B,UAAoC,CAAC,GAAkB;CACpG,MAAM,EAAE,WAAW;CACnB,IAAI,QAAQ,SAAS,OAAO,QAAQ,OAAO,OAAO,MAAM;CAExD,OAAO,IAAI,SAAe,SAAS,WAAW;EAC5C,IAAI,UAAU;EACd,MAAM,UAAU,aAAyB;GACvC,IAAI,SAAS;GAEb,UAAU;GACV,SAAS;GAIT,qBAAqB;IACnB,QAAQ,oBAAoB,SAAS,OAAO;IAC5C,KAAK;GACP,CAAC;EACH;EACA,MAAM,gBAAgB,aAAa,OAAO,QAAQ,MAAM,CAAC;EAEzD,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EACzD,MAAM,OAAO,aAAa;GACxB,IAAI,CAAC,WAAW,UAAU,GAAG,OAAO,OAAO;EAC7C,CAAC;CACH,CAAC;AACH"}
@@ -0,0 +1,27 @@
1
+ import { sleep } from "@videojs/utils/time";
2
+ //#region src/core/tasks/delayed-reschedule.ts
3
+ /**
4
+ * Build a {@link Reschedule} from a pure cadence function — the common timer-based, _start-anchored_ implementation.
5
+ *
6
+ * Invoked concurrently with the run, it observes the result, then waits `cadence(current, previous)` milliseconds
7
+ * **measured from when it was invoked** (≈ the run's start): it subtracts the run's own elapsed time, so consecutive
8
+ * runs begin one cadence apart regardless of how long each run takes (per RFC 8216 §6.3.4's "measured from the last
9
+ * time the client began loading"). If the run takes longer than the cadence, the next run starts immediately.
10
+ *
11
+ * A `null` cadence stops the recurrence. A rejected run rejects this reschedule, which the `RecurringRunner` propagates
12
+ * as the recurrence's failure — error recovery (e.g. retrying transient fetch failures) belongs below, at the fetch
13
+ * layer, not in the cadence.
14
+ */
15
+ function delayedReschedule(cadence) {
16
+ return async (task) => {
17
+ const startedAt = Date.now();
18
+ const ms = cadence(await task.run(), task.previous);
19
+ if (ms === null) return false;
20
+ await sleep(Math.max(0, ms - (Date.now() - startedAt)), task.signal);
21
+ return true;
22
+ };
23
+ }
24
+ //#endregion
25
+ export { delayedReschedule };
26
+
27
+ //# sourceMappingURL=delayed-reschedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delayed-reschedule.js","names":[],"sources":["../../../../src/core/tasks/delayed-reschedule.ts"],"sourcesContent":["import { sleep } from '@videojs/utils/time';\n\nimport type { Reschedule } from './task';\n\n/**\n * Build a {@link Reschedule} from a pure cadence function — the common timer-based, _start-anchored_ implementation.\n *\n * Invoked concurrently with the run, it observes the result, then waits `cadence(current, previous)` milliseconds\n * **measured from when it was invoked** (≈ the run's start): it subtracts the run's own elapsed time, so consecutive\n * runs begin one cadence apart regardless of how long each run takes (per RFC 8216 §6.3.4's \"measured from the last\n * time the client began loading\"). If the run takes longer than the cadence, the next run starts immediately.\n *\n * A `null` cadence stops the recurrence. A rejected run rejects this reschedule, which the `RecurringRunner` propagates\n * as the recurrence's failure — error recovery (e.g. retrying transient fetch failures) belongs below, at the fetch\n * layer, not in the cadence.\n */\nexport function delayedReschedule<TValue>(\n cadence: (current: TValue, previous: TValue | undefined) => number | null\n): Reschedule<TValue> {\n return async (task) => {\n const startedAt = Date.now();\n const current = await task.run();\n // `task.previous` is the prior successful value (carried by the runner's\n // clone); read-only for the cadence, hence the cast off `DeepReadonly`.\n const ms = cadence(current, task.previous as TValue | undefined);\n if (ms === null) return false;\n\n await sleep(Math.max(0, ms - (Date.now() - startedAt)), task.signal);\n return true;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,SAAgB,kBACd,SACoB;CACpB,OAAO,OAAO,SAAS;EACrB,MAAM,YAAY,KAAK,IAAI;EAI3B,MAAM,KAAK,QAAQ,MAHG,KAAK,IAAI,GAGH,KAAK,QAA8B;EAC/D,IAAI,OAAO,MAAM,OAAO;EAExB,MAAM,MAAM,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,IAAI,UAAU,GAAG,KAAK,MAAM;EACnE,OAAO;CACT;AACF"}
@@ -0,0 +1,144 @@
1
+ //#region src/core/tasks/task.d.ts
2
+ /** Recursively marks all properties as readonly. */
3
+ type DeepReadonly<T> = T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>> : T extends object ? { readonly [K in keyof T]: DeepReadonly<T[K]>; } : T;
4
+ type TaskStatus = 'pending' | 'running' | 'done' | 'error';
5
+ /** Configuration for a Task. */
6
+ interface TaskConfig {
7
+ /**
8
+ * Identifier for this task. - string: used as-is - () => string: called once at construction time - undefined: a
9
+ * unique ID is generated via generateId()
10
+ */
11
+ id?: string | (() => string);
12
+ /**
13
+ * Optional external AbortSignal to compose with the task's internal one. The task's work is aborted when either the
14
+ * internal controller (via abort()) or this external signal fires — whichever comes first.
15
+ */
16
+ signal?: AbortSignal;
17
+ }
18
+ /** Minimal contract for a schedulable unit of async work. */
19
+ interface TaskLike<TValue = void, TError = unknown> {
20
+ readonly id: string;
21
+ readonly status: TaskStatus;
22
+ readonly value: DeepReadonly<TValue> | undefined;
23
+ readonly error: DeepReadonly<TError> | undefined;
24
+ /**
25
+ * The last successful value carried forward from the run this was `clone()`d from — the prior cycle's result for a
26
+ * `RecurringRunner` (undefined for an original, or until the lineage has produced a success).
27
+ */
28
+ readonly previous: DeepReadonly<TValue> | undefined;
29
+ /**
30
+ * The signal this task's work runs under (its own abort composed with any external one). Aborting the task fires it —
31
+ * so a `reschedule` can wait on it to have its delay cancelled when the recurrence is aborted.
32
+ */
33
+ readonly signal: AbortSignal;
34
+ /** Run the work, memoized: repeated calls share one execution + result. */
35
+ run(): Promise<TValue>;
36
+ abort(): void;
37
+ /** A fresh, structurally identical task (same work + id) in a pending state — for re-running. */
38
+ clone(): TaskLike<TValue, TError>;
39
+ }
40
+ /**
41
+ * Generic reusable task that wraps an async run function.
42
+ *
43
+ * Owns its own AbortController so it can always be aborted independently. Optionally composes an external AbortSignal
44
+ * so that a parent's cancellation propagates into the task's work without requiring the caller to track the task
45
+ * separately.
46
+ *
47
+ * `run()` is memoized: the work runs at most once per instance, and every call returns the same promise (so observers
48
+ * can `await run()` to read the result without re-triggering the work). To re-run the _same_ work, take a `clone()` — a
49
+ * fresh instance with its own AbortController and a pending state.
50
+ *
51
+ * Ordering guarantee: `value` is written before `status` transitions to `'done'`; `error` is written before `status`
52
+ * transitions to `'error'`. Any reader observing `status === 'done'` is guaranteed `value` is already present.
53
+ */
54
+ declare class Task<TValue = void, TError = unknown> implements TaskLike<TValue, TError> {
55
+ #private;
56
+ readonly id: string;
57
+ constructor(runFn: (signal: AbortSignal) => Promise<TValue>, config?: TaskConfig);
58
+ get status(): TaskStatus;
59
+ get value(): DeepReadonly<TValue> | undefined;
60
+ get error(): DeepReadonly<TError> | undefined;
61
+ get previous(): DeepReadonly<TValue> | undefined;
62
+ get signal(): AbortSignal;
63
+ run(): Promise<TValue>;
64
+ abort(): void;
65
+ /**
66
+ * A fresh task with the same work, id, and external signal, in a pending state (its own AbortController, no memoized
67
+ * result) — so it can be run again. Used to re-run structurally identical work (e.g. `RecurringRunner` reloads).
68
+ *
69
+ * The clone inherits this run's value as its `previous` (or this run's own `previous` if it never produced one — e.g.
70
+ * it errored), so a recurrence's `previous` always tracks the last _successful_ value across the lineage with no
71
+ * bookkeeping in the runner.
72
+ */
73
+ clone(): Task<TValue, TError>;
74
+ }
75
+ /**
76
+ * Runs tasks concurrently, deduplicated by task id.
77
+ *
78
+ * If a task with a given id is already in flight, subsequent schedule() calls for that id are silently ignored until
79
+ * the first completes. Tasks are stored so abortAll() can cancel any in-flight work (e.g. on engine cleanup).
80
+ */
81
+ declare class ConcurrentRunner {
82
+ #private;
83
+ schedule<TValue = void, TError = unknown>(task: TaskLike<TValue, TError>): Promise<TValue>;
84
+ /**
85
+ * Registers a callback to fire when all currently in-flight tasks settle. If the runner is already idle, the callback
86
+ * is never called. If abortAll() is called before the batch settles, the callback is superseded and silently dropped
87
+ * — no stale callbacks, no generation token required by the caller.
88
+ */
89
+ whenSettled(callback: () => void): void;
90
+ abortAll(): void;
91
+ destroy(): void;
92
+ }
93
+ /**
94
+ * Runs tasks one at a time in submission order.
95
+ *
96
+ * Each schedule() call returns a Promise that resolves or rejects with the task's result when it is eventually
97
+ * executed. Tasks wait in queue until the prior task completes.
98
+ *
99
+ * Serialization is achieved by chaining each task's run() onto the tail of a shared promise chain — no explicit queue
100
+ * or drain loop needed.
101
+ *
102
+ * AbortAll() aborts all pending (not yet started) tasks and the currently in-flight task. Pending tasks still run
103
+ * briefly but receive an aborted signal and are expected to exit early.
104
+ */
105
+ declare class SerialRunner {
106
+ #private;
107
+ schedule<TValue = void, TError = unknown>(task: TaskLike<TValue, TError>): Promise<TValue>;
108
+ /**
109
+ * A promise that resolves when all currently-scheduled tasks have settled. Use the reference as a generation token:
110
+ * capture it after scheduling a batch, then check identity in the resolution callback to detect whether a subsequent
111
+ * abortAll() + new batch has superseded this one.
112
+ */
113
+ get settled(): Promise<void>;
114
+ /**
115
+ * Registers a callback to fire when all currently-pending tasks settle. If the runner is already idle (no pending or
116
+ * running tasks), the callback is never called. If new tasks are scheduled before the current batch settles, the
117
+ * callback is superseded and silently dropped — no stale callbacks, no generation token required by the caller.
118
+ */
119
+ whenSettled(callback: () => void): void;
120
+ /** Aborts and clears queued tasks without touching the in-flight task. */
121
+ abortPending(): void;
122
+ abortAll(): void;
123
+ destroy(): void;
124
+ }
125
+ /**
126
+ * Decides whether — and _when_ — a {@link RecurringRunner} re-runs its task. Invoked **concurrently with the run** (so
127
+ * the inter-run interval can be measured from when the run _started_, not when it finished) with the single
128
+ * {@link TaskLike}, which carries everything a decision needs:
129
+ *
130
+ * - `task.run()` — the in-flight run, observable via this memoized call (does not re-trigger work), e.g. to read its
131
+ * result for a cadence/stop decision.
132
+ * - `task.previous` — the prior successful run's value (`undefined` on the first), for decisions that compare consecutive
133
+ * results.
134
+ * - `task.signal` — aborts the wait (and the recurrence) when the task is.
135
+ *
136
+ * Resolves `true` to re-run (after whatever delay it owns) or `false` to stop. The runner deals only in this awaitable
137
+ * verdict — _how_ the delay is produced (a timer, a frame, an event) and _when_ it's measured from live entirely in the
138
+ * reschedule function, so the runner itself knows nothing about time. See `delayedReschedule` for the common
139
+ * timer-based, start-anchored implementation.
140
+ */
141
+ type Reschedule<TValue> = (task: TaskLike<TValue>) => PromiseLike<boolean>;
142
+ //#endregion
143
+ export { ConcurrentRunner, DeepReadonly, Reschedule, SerialRunner, Task, TaskConfig, TaskLike, TaskStatus };
144
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","names":[],"sources":["../../../../src/core/tasks/task.ts"],"mappings":";;KAQY,aAAa,KAAK,iBAAiB,OAC3C,cAAc,aAAa,MAC3B,+BACc,WAAW,IAAI,aAAa,EAAE,SAC1C;KAMM;;UAGK;;;;;EAKf;;;;;EAMA,SAAS;;;UAIM,SAAS,eAAe;WAC9B;WACA,QAAQ;WACR,OAAO,aAAa;WACpB,OAAO,aAAa;;;;;WAKpB,UAAU,aAAa;;;;;WAKvB,QAAQ;;EAEjB,OAAO,QAAQ;EACf;;EAEA,SAAS,SAAS,QAAQ;;;;;;;;;;;;;;;;cAiBf,KAAK,eAAe,6BAA6B,SAAS,QAAQ;;WACpE;EAYT,YAAY,QAAQ,QAAQ,gBAAgB,QAAQ,SAAS,SAAS;MAWlE,UAAU;MAIV,SAAS,aAAa;MAItB,SAAS,aAAa;MAItB,YAAY,aAAa;MAIzB,UAAU;EAId,OAAO,QAAQ;EAyBf;;;;;;;;;EAYA,SAAS,KAAK,QAAQ;;;;;;;;cAkBX;;EAMX,SAAS,eAAe,kBAAkB,MAAM,SAAS,QAAQ,UAAU,QAAQ;;;;;;EAqCnF,YAAY;EAeZ;EAYA;;;;;;;;;;;;;;cAsBW;;EAMX,SAAS,eAAe,kBAAkB,MAAM,SAAS,QAAQ,UAAU,QAAQ;;;;;;MA+B/E,WAAW;;;;;;EASf,YAAY;;EAgBZ;EAMA;EAKA;;;;;;;;;;;;;;;;;;KA0BU,WAAW,WAAW,MAAM,SAAS,YAAY"}