@codexo/exojs 0.8.4 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +26 -5
  3. package/dist/esm/animation/Tween.d.ts +20 -3
  4. package/dist/esm/animation/Tween.js +16 -8
  5. package/dist/esm/animation/Tween.js.map +1 -1
  6. package/dist/esm/animation/TweenManager.d.ts +16 -1
  7. package/dist/esm/animation/TweenManager.js +27 -2
  8. package/dist/esm/animation/TweenManager.js.map +1 -1
  9. package/dist/esm/audio/AudioAnalyser.d.ts +2 -0
  10. package/dist/esm/audio/AudioAnalyser.js +24 -9
  11. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  12. package/dist/esm/audio/AudioBus.d.ts +1 -0
  13. package/dist/esm/audio/AudioBus.js +8 -4
  14. package/dist/esm/audio/AudioBus.js.map +1 -1
  15. package/dist/esm/audio/AudioListener.d.ts +1 -0
  16. package/dist/esm/audio/AudioListener.js +7 -5
  17. package/dist/esm/audio/AudioListener.js.map +1 -1
  18. package/dist/esm/audio/AudioManager.d.ts +8 -2
  19. package/dist/esm/audio/AudioManager.js +14 -1
  20. package/dist/esm/audio/AudioManager.js.map +1 -1
  21. package/dist/esm/audio/BeatDetector.d.ts +2 -0
  22. package/dist/esm/audio/BeatDetector.js +27 -661
  23. package/dist/esm/audio/BeatDetector.js.map +1 -1
  24. package/dist/esm/audio/Music.d.ts +1 -0
  25. package/dist/esm/audio/Music.js +7 -3
  26. package/dist/esm/audio/Music.js.map +1 -1
  27. package/dist/esm/audio/OscillatorSound.d.ts +1 -0
  28. package/dist/esm/audio/OscillatorSound.js +7 -3
  29. package/dist/esm/audio/OscillatorSound.js.map +1 -1
  30. package/dist/esm/audio/Sound.d.ts +1 -0
  31. package/dist/esm/audio/Sound.js +7 -3
  32. package/dist/esm/audio/Sound.js.map +1 -1
  33. package/dist/esm/audio/audio-context.d.ts +2 -2
  34. package/dist/esm/audio/audio-context.js +4 -4
  35. package/dist/esm/audio/audio-context.js.map +1 -1
  36. package/dist/esm/audio/filters/ChorusFilter.d.ts +1 -0
  37. package/dist/esm/audio/filters/ChorusFilter.js +7 -3
  38. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -1
  39. package/dist/esm/audio/filters/CompressorFilter.d.ts +1 -0
  40. package/dist/esm/audio/filters/CompressorFilter.js +7 -3
  41. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -1
  42. package/dist/esm/audio/filters/DelayFilter.d.ts +1 -0
  43. package/dist/esm/audio/filters/DelayFilter.js +7 -3
  44. package/dist/esm/audio/filters/DelayFilter.js.map +1 -1
  45. package/dist/esm/audio/filters/EqualizerFilter.d.ts +1 -0
  46. package/dist/esm/audio/filters/EqualizerFilter.js +7 -3
  47. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -1
  48. package/dist/esm/audio/filters/GranularFilter.js +1 -86
  49. package/dist/esm/audio/filters/GranularFilter.js.map +1 -1
  50. package/dist/esm/audio/filters/HighpassFilter.d.ts +1 -0
  51. package/dist/esm/audio/filters/HighpassFilter.js +7 -3
  52. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -1
  53. package/dist/esm/audio/filters/LowpassFilter.d.ts +1 -0
  54. package/dist/esm/audio/filters/LowpassFilter.js +7 -3
  55. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -1
  56. package/dist/esm/audio/filters/PitchShiftFilter.js +1 -71
  57. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -1
  58. package/dist/esm/audio/filters/ReverbFilter.d.ts +1 -0
  59. package/dist/esm/audio/filters/ReverbFilter.js +7 -3
  60. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -1
  61. package/dist/esm/audio/filters/VocoderFilter.js +1 -89
  62. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -1
  63. package/dist/esm/audio/filters/WorkletFilter.d.ts +2 -0
  64. package/dist/esm/audio/filters/WorkletFilter.js +10 -5
  65. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -1
  66. package/dist/esm/audio/index.d.ts +15 -10
  67. package/dist/esm/audio/worklet/registerWorklet.d.ts +1 -1
  68. package/dist/esm/audio/worklet/registerWorklet.js +2 -2
  69. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -1
  70. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +1 -0
  71. package/dist/esm/audio/worklets/beat-detector.worklet.js +647 -0
  72. package/dist/esm/audio/worklets/beat-detector.worklet.js.map +1 -0
  73. package/dist/esm/audio/worklets/granular.worklet.d.ts +1 -0
  74. package/dist/esm/audio/worklets/granular.worklet.js +89 -0
  75. package/dist/esm/audio/worklets/granular.worklet.js.map +1 -0
  76. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +1 -0
  77. package/dist/esm/audio/worklets/pitch-shift.worklet.js +74 -0
  78. package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +1 -0
  79. package/dist/esm/audio/worklets/vocoder.worklet.d.ts +1 -0
  80. package/dist/esm/audio/worklets/vocoder.worklet.js +92 -0
  81. package/dist/esm/audio/worklets/vocoder.worklet.js.map +1 -0
  82. package/dist/esm/core/Application.d.ts +62 -24
  83. package/dist/esm/core/Application.js +116 -40
  84. package/dist/esm/core/Application.js.map +1 -1
  85. package/dist/esm/core/Color.d.ts +0 -8
  86. package/dist/esm/core/Color.js +0 -24
  87. package/dist/esm/core/Color.js.map +1 -1
  88. package/dist/esm/core/Scene.d.ts +32 -72
  89. package/dist/esm/core/Scene.js +56 -36
  90. package/dist/esm/core/Scene.js.map +1 -1
  91. package/dist/esm/core/SceneManager.d.ts +11 -25
  92. package/dist/esm/core/SceneManager.js +37 -100
  93. package/dist/esm/core/SceneManager.js.map +1 -1
  94. package/dist/esm/core/SceneNode.d.ts +28 -14
  95. package/dist/esm/core/SceneNode.js +66 -33
  96. package/dist/esm/core/SceneNode.js.map +1 -1
  97. package/dist/esm/core/Signal.d.ts +24 -28
  98. package/dist/esm/core/Signal.js +64 -50
  99. package/dist/esm/core/Signal.js.map +1 -1
  100. package/dist/esm/core/Timer.d.ts +1 -0
  101. package/dist/esm/core/Timer.js +3 -0
  102. package/dist/esm/core/Timer.js.map +1 -1
  103. package/dist/esm/debug/BoundingBoxesLayer.js +1 -1
  104. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
  105. package/dist/esm/debug/HitTestLayer.js +1 -1
  106. package/dist/esm/debug/HitTestLayer.js.map +1 -1
  107. package/dist/esm/debug/PerformanceLayer.js +1 -2
  108. package/dist/esm/debug/PerformanceLayer.js.map +1 -1
  109. package/dist/esm/debug/PointerStackLayer.js +1 -2
  110. package/dist/esm/debug/PointerStackLayer.js.map +1 -1
  111. package/dist/esm/debug/RenderPassInspectorLayer.js +1 -2
  112. package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
  113. package/dist/esm/index.js +23 -7
  114. package/dist/esm/index.js.map +1 -1
  115. package/dist/esm/input/InputManager.d.ts +1 -0
  116. package/dist/esm/input/InputManager.js +30 -3
  117. package/dist/esm/input/InputManager.js.map +1 -1
  118. package/dist/esm/input/InteractionManager.d.ts +5 -2
  119. package/dist/esm/input/InteractionManager.js +29 -18
  120. package/dist/esm/input/InteractionManager.js.map +1 -1
  121. package/dist/esm/input/Pointer.js +3 -2
  122. package/dist/esm/input/Pointer.js.map +1 -1
  123. package/dist/esm/input/internal/interactionManagerRegistry.d.ts +9 -0
  124. package/dist/esm/input/internal/interactionManagerRegistry.js +10 -0
  125. package/dist/esm/input/internal/interactionManagerRegistry.js.map +1 -0
  126. package/dist/esm/math/AbstractVector.d.ts +1 -7
  127. package/dist/esm/math/AbstractVector.js +6 -20
  128. package/dist/esm/math/AbstractVector.js.map +1 -1
  129. package/dist/esm/math/Circle.js +0 -2
  130. package/dist/esm/math/Circle.js.map +1 -1
  131. package/dist/esm/math/Collision.d.ts +9 -3
  132. package/dist/esm/math/Ellipse.d.ts +2 -5
  133. package/dist/esm/math/Ellipse.js +10 -7
  134. package/dist/esm/math/Ellipse.js.map +1 -1
  135. package/dist/esm/math/ObservableVector.d.ts +1 -1
  136. package/dist/esm/math/ObservableVector.js +3 -3
  137. package/dist/esm/math/ObservableVector.js.map +1 -1
  138. package/dist/esm/math/Polygon.d.ts +0 -2
  139. package/dist/esm/math/Polygon.js +1 -9
  140. package/dist/esm/math/Polygon.js.map +1 -1
  141. package/dist/esm/math/Rectangle.js +0 -2
  142. package/dist/esm/math/Rectangle.js.map +1 -1
  143. package/dist/esm/math/collision-detection.d.ts +19 -4
  144. package/dist/esm/math/collision-detection.js +61 -4
  145. package/dist/esm/math/collision-detection.js.map +1 -1
  146. package/dist/esm/math/swept-collision.d.ts +16 -12
  147. package/dist/esm/math/swept-collision.js +109 -19
  148. package/dist/esm/math/swept-collision.js.map +1 -1
  149. package/dist/esm/particles/ParticleSystem.js +1 -1
  150. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  151. package/dist/esm/particles/index.d.ts +1 -0
  152. package/dist/esm/rendering/CallbackRenderPass.d.ts +1 -0
  153. package/dist/esm/rendering/CallbackRenderPass.js +1 -0
  154. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  155. package/dist/esm/rendering/Container.d.ts +2 -1
  156. package/dist/esm/rendering/Container.js +17 -16
  157. package/dist/esm/rendering/Container.js.map +1 -1
  158. package/dist/esm/rendering/RenderBackend.d.ts +1 -0
  159. package/dist/esm/rendering/RenderNode.d.ts +1 -3
  160. package/dist/esm/rendering/RenderNode.js +12 -19
  161. package/dist/esm/rendering/RenderNode.js.map +1 -1
  162. package/dist/esm/rendering/RenderPass.d.ts +1 -0
  163. package/dist/esm/rendering/RenderStats.d.ts +9 -0
  164. package/dist/esm/rendering/RenderStats.js +2 -0
  165. package/dist/esm/rendering/RenderStats.js.map +1 -1
  166. package/dist/esm/rendering/RendererRegistry.d.ts +1 -0
  167. package/dist/esm/rendering/RendererRegistry.js +1 -0
  168. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  169. package/dist/esm/rendering/View.d.ts +23 -0
  170. package/dist/esm/rendering/View.js +42 -0
  171. package/dist/esm/rendering/View.js.map +1 -1
  172. package/dist/esm/rendering/index.d.ts +89 -59
  173. package/dist/esm/rendering/mesh/Mesh.js +1 -1
  174. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  175. package/dist/esm/rendering/mesh/MeshShader.d.ts +1 -0
  176. package/dist/esm/rendering/mesh/MeshShader.js +1 -0
  177. package/dist/esm/rendering/mesh/MeshShader.js.map +1 -1
  178. package/dist/esm/rendering/shader/Shader.d.ts +1 -0
  179. package/dist/esm/rendering/shader/Shader.js +1 -0
  180. package/dist/esm/rendering/shader/Shader.js.map +1 -1
  181. package/dist/esm/rendering/shader/ShaderUniform.d.ts +1 -0
  182. package/dist/esm/rendering/shader/ShaderUniform.js +1 -0
  183. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
  184. package/dist/esm/rendering/sprite/Sprite.d.ts +3 -2
  185. package/dist/esm/rendering/sprite/Sprite.js +15 -13
  186. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  187. package/dist/esm/rendering/text/AbstractText.d.ts +36 -0
  188. package/dist/esm/rendering/text/AbstractText.js +49 -0
  189. package/dist/esm/rendering/text/AbstractText.js.map +1 -0
  190. package/dist/esm/rendering/text/BitmapText.d.ts +97 -0
  191. package/dist/esm/rendering/text/BitmapText.js +220 -0
  192. package/dist/esm/rendering/text/BitmapText.js.map +1 -0
  193. package/dist/esm/rendering/text/BmFont.d.ts +50 -0
  194. package/dist/esm/rendering/text/BmFont.js +24 -0
  195. package/dist/esm/rendering/text/BmFont.js.map +1 -0
  196. package/dist/esm/rendering/text/GlyphAtlas.d.ts +104 -0
  197. package/dist/esm/rendering/text/GlyphAtlas.js +347 -0
  198. package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -0
  199. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +40 -0
  200. package/dist/esm/rendering/text/GlyphAtlasPool.js +67 -0
  201. package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -0
  202. package/dist/esm/rendering/text/GlyphSdf.d.ts +92 -0
  203. package/dist/esm/rendering/text/GlyphSdf.js +220 -0
  204. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -0
  205. package/dist/esm/rendering/text/HTMLText.d.ts +107 -0
  206. package/dist/esm/rendering/text/HTMLText.js +284 -0
  207. package/dist/esm/rendering/text/HTMLText.js.map +1 -0
  208. package/dist/esm/rendering/text/LayoutOptions.d.ts +30 -0
  209. package/dist/esm/rendering/text/Text.d.ts +89 -20
  210. package/dist/esm/rendering/text/Text.js +176 -101
  211. package/dist/esm/rendering/text/Text.js.map +1 -1
  212. package/dist/esm/rendering/text/TextLayout.d.ts +20 -8
  213. package/dist/esm/rendering/text/TextLayout.js +234 -25
  214. package/dist/esm/rendering/text/TextLayout.js.map +1 -1
  215. package/dist/esm/rendering/text/TextStyle.d.ts +154 -87
  216. package/dist/esm/rendering/text/TextStyle.js +257 -203
  217. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  218. package/dist/esm/rendering/text/types.d.ts +73 -13
  219. package/dist/esm/rendering/texture/Texture.d.ts +1 -0
  220. package/dist/esm/rendering/texture/Texture.js +1 -0
  221. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  222. package/dist/esm/rendering/types.d.ts +3 -1
  223. package/dist/esm/rendering/types.js +2 -0
  224. package/dist/esm/rendering/types.js.map +1 -1
  225. package/dist/esm/rendering/video/Video.d.ts +2 -1
  226. package/dist/esm/rendering/video/Video.js +9 -5
  227. package/dist/esm/rendering/video/Video.js.map +1 -1
  228. package/dist/esm/rendering/webgl2/WebGl2Backend.js +41 -5
  229. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  230. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +4 -4
  231. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  232. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +56 -0
  233. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +482 -0
  234. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -0
  235. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +4 -0
  236. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js.map +1 -0
  237. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js +4 -0
  238. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js.map +1 -0
  239. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js +4 -0
  240. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js.map +1 -0
  241. package/dist/esm/rendering/webgl2/glsl/text.vert.js +4 -0
  242. package/dist/esm/rendering/webgl2/glsl/text.vert.js.map +1 -0
  243. package/dist/esm/rendering/webgpu/WebGpuBackend.js +16 -8
  244. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  245. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +26 -0
  246. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
  247. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +2 -2
  248. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +23 -15
  249. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  250. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +9 -1
  251. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  252. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +70 -0
  253. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +773 -0
  254. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -0
  255. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +96 -0
  256. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -0
  257. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +68 -0
  258. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -0
  259. package/dist/esm/resources/Asset.d.ts +23 -0
  260. package/dist/esm/resources/Asset.js +23 -0
  261. package/dist/esm/resources/Asset.js.map +1 -0
  262. package/dist/esm/resources/AssetDefinitions.d.ts +137 -0
  263. package/dist/esm/resources/Assets.d.ts +35 -0
  264. package/dist/esm/resources/Assets.js +32 -0
  265. package/dist/esm/resources/Assets.js.map +1 -0
  266. package/dist/esm/resources/IndexedDbDatabase.js +17 -1
  267. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  268. package/dist/esm/resources/IndexedDbStore.js +17 -1
  269. package/dist/esm/resources/IndexedDbStore.js.map +1 -1
  270. package/dist/esm/resources/Loader.d.ts +244 -18
  271. package/dist/esm/resources/Loader.js +456 -50
  272. package/dist/esm/resources/Loader.js.map +1 -1
  273. package/dist/esm/resources/LoadingQueue.d.ts +28 -0
  274. package/dist/esm/resources/LoadingQueue.js +59 -0
  275. package/dist/esm/resources/LoadingQueue.js.map +1 -0
  276. package/dist/esm/resources/factories/BmFontFactory.d.ts +25 -0
  277. package/dist/esm/resources/factories/BmFontFactory.js +96 -0
  278. package/dist/esm/resources/factories/BmFontFactory.js.map +1 -0
  279. package/dist/esm/resources/factories/CsvFactory.d.ts +35 -0
  280. package/dist/esm/resources/factories/CsvFactory.js +87 -0
  281. package/dist/esm/resources/factories/CsvFactory.js.map +1 -0
  282. package/dist/esm/resources/factories/MusicFactory.d.ts +8 -2
  283. package/dist/esm/resources/factories/MusicFactory.js +25 -14
  284. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  285. package/dist/esm/resources/factories/SoundFactory.d.ts +2 -2
  286. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  287. package/dist/esm/resources/factories/SubtitleFactory.d.ts +28 -0
  288. package/dist/esm/resources/factories/SubtitleFactory.js +203 -0
  289. package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -0
  290. package/dist/esm/resources/factories/SvgFactory.d.ts +18 -1
  291. package/dist/esm/resources/factories/SvgFactory.js +21 -2
  292. package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
  293. package/dist/esm/resources/factories/VideoFactory.d.ts +8 -2
  294. package/dist/esm/resources/factories/VideoFactory.js +27 -20
  295. package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
  296. package/dist/esm/resources/factories/XmlFactory.d.ts +24 -0
  297. package/dist/esm/resources/factories/XmlFactory.js +37 -0
  298. package/dist/esm/resources/factories/XmlFactory.js.map +1 -0
  299. package/dist/esm/resources/index.d.ts +8 -1
  300. package/dist/esm/resources/tokens.d.ts +49 -3
  301. package/dist/esm/resources/tokens.js +50 -4
  302. package/dist/esm/resources/tokens.js.map +1 -1
  303. package/dist/exo.esm.js +6635 -2550
  304. package/dist/exo.esm.js.map +1 -1
  305. package/package.json +16 -4
  306. package/dist/esm/input/interaction-hooks.d.ts +0 -34
  307. package/dist/esm/input/interaction-hooks.js +0 -35
  308. package/dist/esm/input/interaction-hooks.js.map +0 -1
  309. package/dist/esm/rendering/text/DynamicGlyphAtlas.d.ts +0 -33
  310. package/dist/esm/rendering/text/DynamicGlyphAtlas.js +0 -134
  311. package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +0 -1
  312. package/dist/esm/rendering/text/atlas-singleton.d.ts +0 -7
  313. package/dist/esm/rendering/text/atlas-singleton.js +0 -17
  314. package/dist/esm/rendering/text/atlas-singleton.js.map +0 -1
  315. package/dist/esm/resources/factories/VttFactory.d.ts +0 -24
  316. package/dist/esm/resources/factories/VttFactory.js +0 -158
  317. package/dist/esm/resources/factories/VttFactory.js.map +0 -1
@@ -0,0 +1,203 @@
1
+ import { AbstractAssetFactory } from '../AbstractAssetFactory.js';
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // VTT helpers
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * Converts a WebVTT timestamp string (`HH:MM:SS.mmm`, `MM:SS.mmm`, or
8
+ * `SS.mmm`) into a floating-point number of seconds.
9
+ *
10
+ * @internal
11
+ */
12
+ const parseVttTimestamp = (value) => {
13
+ const parts = value.split(':');
14
+ let seconds;
15
+ if (parts.length === 3) {
16
+ seconds = Number(parts[0]) * 3600 + Number(parts[1]) * 60 + Number(parts[2]);
17
+ }
18
+ else if (parts.length === 2) {
19
+ seconds = Number(parts[0]) * 60 + Number(parts[1]);
20
+ }
21
+ else {
22
+ seconds = Number(parts[0]);
23
+ }
24
+ return seconds;
25
+ };
26
+ const validAlignValues = new Set(['start', 'center', 'end', 'left', 'right']);
27
+ const validLineAlignValues = new Set(['start', 'center', 'end']);
28
+ const validPositionAlignValues = new Set(['auto', 'line-left', 'center', 'line-right']);
29
+ /**
30
+ * Parses the WebVTT cue-settings tail (`align:center line:80% position:50%`)
31
+ * and applies each recognized setting to the supplied {@link VTTCue}.
32
+ *
33
+ * Unknown keys, malformed values, and unknown enum members are silently
34
+ * skipped so that one bad token does not invalidate an otherwise valid cue.
35
+ * Percent signs on numeric values are tolerated and stripped.
36
+ *
37
+ * @internal
38
+ */
39
+ const applyCueSettings = (cue, settings) => {
40
+ if (!settings) {
41
+ return;
42
+ }
43
+ for (const token of settings.split(/\s+/)) {
44
+ const colonIndex = token.indexOf(':');
45
+ if (colonIndex === -1) {
46
+ continue;
47
+ }
48
+ const name = token.slice(0, colonIndex);
49
+ const value = token.slice(colonIndex + 1);
50
+ switch (name) {
51
+ case 'vertical':
52
+ if (value === 'rl' || value === 'lr' || value === '') {
53
+ cue.vertical = value;
54
+ }
55
+ break;
56
+ case 'line': {
57
+ if (value === 'auto') {
58
+ cue.line = 'auto';
59
+ }
60
+ else {
61
+ const [linePart, alignPart] = value.split(',');
62
+ const num = parseFloat(linePart);
63
+ if (!Number.isNaN(num)) {
64
+ cue.line = num;
65
+ }
66
+ if (alignPart !== undefined && validLineAlignValues.has(alignPart)) {
67
+ cue.lineAlign = alignPart;
68
+ }
69
+ }
70
+ break;
71
+ }
72
+ case 'position': {
73
+ const [posPart, alignPart] = value.split(',');
74
+ const num = parseFloat(posPart);
75
+ if (!Number.isNaN(num)) {
76
+ cue.position = num;
77
+ }
78
+ if (alignPart !== undefined && validPositionAlignValues.has(alignPart)) {
79
+ cue.positionAlign = alignPart;
80
+ }
81
+ break;
82
+ }
83
+ case 'size': {
84
+ const num = parseFloat(value);
85
+ if (!Number.isNaN(num)) {
86
+ cue.size = num;
87
+ }
88
+ break;
89
+ }
90
+ case 'align':
91
+ if (validAlignValues.has(value)) {
92
+ cue.align = value;
93
+ }
94
+ break;
95
+ }
96
+ }
97
+ };
98
+ const parseVtt = (source) => {
99
+ const cues = [];
100
+ const lines = source.replaceAll('\r\n', '\n').replaceAll('\r', '\n').split('\n');
101
+ let i = 0;
102
+ // Skip header and any blank lines/metadata before first cue
103
+ while (i < lines.length && !lines[i].includes('-->')) {
104
+ i++;
105
+ }
106
+ while (i < lines.length) {
107
+ const line = lines[i].trim();
108
+ if (line.includes('-->')) {
109
+ const arrowIndex = line.indexOf('-->');
110
+ const startString = line.slice(0, arrowIndex).trim();
111
+ const rest = line.slice(arrowIndex + 3).trim();
112
+ const restTokens = rest.split(/\s+/);
113
+ const endString = restTokens[0];
114
+ const settingsString = restTokens.slice(1).join(' ');
115
+ const start = parseVttTimestamp(startString);
116
+ const end = parseVttTimestamp(endString);
117
+ i++;
118
+ const textLines = [];
119
+ while (i < lines.length && lines[i].trim() !== '') {
120
+ textLines.push(lines[i]);
121
+ i++;
122
+ }
123
+ const cue = new VTTCue(start, end, textLines.join('\n'));
124
+ applyCueSettings(cue, settingsString);
125
+ cues.push(cue);
126
+ }
127
+ else {
128
+ i++;
129
+ }
130
+ }
131
+ return cues;
132
+ };
133
+ // ---------------------------------------------------------------------------
134
+ // SRT helpers
135
+ // ---------------------------------------------------------------------------
136
+ /**
137
+ * Converts an SRT timestamp string (`HH:MM:SS,mmm`) into a floating-point
138
+ * number of seconds.
139
+ *
140
+ * @internal
141
+ */
142
+ const parseSrtTimestamp = (value) => {
143
+ const normalized = value.trim().replace(',', '.');
144
+ const parts = normalized.split(':');
145
+ return Number(parts[0]) * 3600 + Number(parts[1]) * 60 + Number(parts[2]);
146
+ };
147
+ const parseSrt = (source) => {
148
+ const cues = [];
149
+ const normalized = source.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
150
+ const blocks = normalized.split(/\n[ \t]*\n/);
151
+ for (const block of blocks) {
152
+ const lines = block.trim().split('\n');
153
+ if (lines.length < 2)
154
+ continue;
155
+ let timingIndex = 0;
156
+ if (/^\d+$/.test(lines[0].trim())) {
157
+ timingIndex = 1;
158
+ }
159
+ const timingLine = lines[timingIndex];
160
+ if (!timingLine?.includes('-->'))
161
+ continue;
162
+ const arrowIndex = timingLine.indexOf('-->');
163
+ const start = parseSrtTimestamp(timingLine.slice(0, arrowIndex));
164
+ const end = parseSrtTimestamp(timingLine.slice(arrowIndex + 3));
165
+ const text = lines.slice(timingIndex + 1).join('\n');
166
+ cues.push(new VTTCue(start, end, text));
167
+ }
168
+ return cues;
169
+ };
170
+ // ---------------------------------------------------------------------------
171
+ // Factory
172
+ // ---------------------------------------------------------------------------
173
+ /**
174
+ * {@link AssetFactory} implementation that parses WebVTT (`.vtt`) and SubRip
175
+ * (`.srt`) subtitle files and produces an array of {@link VTTCue} instances.
176
+ *
177
+ * Format is detected from the file extension of the response URL; unknown
178
+ * extensions default to VTT parsing. VTT cue settings (`align`, `line`,
179
+ * `position`, `size`, `vertical`) are applied; SRT cues retain default
180
+ * positional properties.
181
+ */
182
+ class SubtitleFactory extends AbstractAssetFactory {
183
+ storageName = 'subtitle';
184
+ /**
185
+ * Reads the response body as UTF-8 text and records the subtitle format
186
+ * derived from the response URL's file extension.
187
+ */
188
+ async process(response) {
189
+ const text = await response.text();
190
+ const url = response.url.split('?')[0].toLowerCase();
191
+ const fmt = url.endsWith('.srt') ? 'srt' : 'vtt';
192
+ return { fmt, text };
193
+ }
194
+ /**
195
+ * Parses the subtitle text into an ordered array of {@link VTTCue} instances.
196
+ */
197
+ async create(source) {
198
+ return source.fmt === 'srt' ? parseSrt(source.text) : parseVtt(source.text);
199
+ }
200
+ }
201
+
202
+ export { SubtitleFactory };
203
+ //# sourceMappingURL=SubtitleFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubtitleFactory.js","sources":["../../../../../src/resources/factories/SubtitleFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,4 +1,18 @@
1
1
  import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
2
+ /** Construction options for {@link SvgFactory.create}. */
3
+ export interface SvgFactoryOptions {
4
+ /**
5
+ * Target render width in pixels. When provided, the value is injected into
6
+ * the root `<svg>` element's `width` attribute before the browser rasterises
7
+ * the image, overriding any intrinsic width declared in the file.
8
+ *
9
+ * SVGs that carry only a `viewBox` (no `width`/`height` attributes) render
10
+ * as a 0×0 image by default; supplying `width` and `height` here fixes that.
11
+ */
12
+ width?: number;
13
+ /** Target render height in pixels. See {@link width}. */
14
+ height?: number;
15
+ }
2
16
  /**
3
17
  * {@link AssetFactory} implementation that loads SVG markup and produces a
4
18
  * rasterised {@link HTMLImageElement}.
@@ -17,9 +31,12 @@ export declare class SvgFactory extends AbstractAssetFactory<HTMLImageElement> {
17
31
  /**
18
32
  * Renders the SVG markup into a fully loaded {@link HTMLImageElement}.
19
33
  *
34
+ * When `options.width` or `options.height` are provided, the values are
35
+ * injected into the root `<svg>` element before rasterisation so the browser
36
+ * renders at the requested pixel dimensions rather than the intrinsic size.
20
37
  * Creates a temporary `image/svg+xml` object URL, assigns it to an `<img>`
21
38
  * element, and revokes the URL once loading settles. Rejects on load error
22
39
  * or abort.
23
40
  */
24
- create(source: string): Promise<HTMLImageElement>;
41
+ create(source: string, options?: SvgFactoryOptions): Promise<HTMLImageElement>;
25
42
  }
@@ -20,12 +20,31 @@ class SvgFactory extends AbstractAssetFactory {
20
20
  /**
21
21
  * Renders the SVG markup into a fully loaded {@link HTMLImageElement}.
22
22
  *
23
+ * When `options.width` or `options.height` are provided, the values are
24
+ * injected into the root `<svg>` element before rasterisation so the browser
25
+ * renders at the requested pixel dimensions rather than the intrinsic size.
23
26
  * Creates a temporary `image/svg+xml` object URL, assigns it to an `<img>`
24
27
  * element, and revokes the URL once loading settles. Rejects on load error
25
28
  * or abort.
26
29
  */
27
- async create(source) {
28
- const blob = new Blob([source], { type: 'image/svg+xml' });
30
+ async create(source, options = {}) {
31
+ const { width, height } = options;
32
+ let svgSource = source;
33
+ if (width !== undefined || height !== undefined) {
34
+ const svgStart = svgSource.indexOf('<svg');
35
+ const tagClose = svgSource.indexOf('>', svgStart);
36
+ if (svgStart !== -1 && tagClose !== -1) {
37
+ const before = svgSource.slice(0, svgStart);
38
+ const attrs = svgSource.slice(svgStart + 4, tagClose); // after '<svg', before '>'
39
+ const after = svgSource.slice(tagClose + 1);
40
+ const cleaned = String(attrs)
41
+ .replaceAll(/\s+width=(?:"[^"]*"|'[^']*')/g, '')
42
+ .replaceAll(/\s+height=(?:"[^"]*"|'[^']*')/g, '');
43
+ const additions = (width !== undefined ? ` width="${width}"` : '') + (height !== undefined ? ` height="${height}"` : '');
44
+ svgSource = `${before}<svg${cleaned}${additions}>${after}`;
45
+ }
46
+ }
47
+ const blob = new Blob([svgSource], { type: 'image/svg+xml' });
29
48
  const objectUrl = this.createObjectUrl(blob);
30
49
  return new Promise((resolve, reject) => {
31
50
  const image = new Image();
@@ -1 +1 @@
1
- {"version":3,"file":"SvgFactory.js","sources":["../../../../../src/resources/factories/SvgFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;;;;;;AAQG;AACG,MAAO,UAAW,SAAQ,oBAAsC,CAAA;IACpD,WAAW,GAAG,KAAK;AAEnC;;AAEG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;IACxB;AAEA;;;;;;AAMG;IACI,MAAM,MAAM,CAAC,MAAc,EAAA;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,MAAM,EACN,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC;AAChB,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AAED,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
1
+ {"version":3,"file":"SvgFactory.js","sources":["../../../../../src/resources/factories/SvgFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAiBA;;;;;;;;AAQG;AACG,MAAO,UAAW,SAAQ,oBAAsC,CAAA;IACpD,WAAW,GAAG,KAAK;AAEnC;;AAEG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;IACxB;AAEA;;;;;;;;;AASG;AACI,IAAA,MAAM,MAAM,CAAC,MAAc,EAAE,UAA6B,EAAE,EAAA;AACjE,QAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;QACjC,IAAI,SAAS,GAAG,MAAM;QAEtB,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE;YAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;YAEjD,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;AAC3C,gBAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AAE3C,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK;AACzB,qBAAA,UAAU,CAAC,+BAA+B,EAAE,EAAE;AAC9C,qBAAA,UAAU,CAAC,gCAAgC,EAAE,EAAE,CAAC;AACnD,gBAAA,MAAM,SAAS,GAAG,CAAC,KAAK,KAAK,SAAS,GAAG,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAG,GAAG,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,CAAA,SAAA,EAAY,MAAM,GAAG,GAAG,EAAE,CAAC;gBAExH,SAAS,GAAG,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,OAAO,GAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;YAC5D;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,MAAM,EACN,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC;AAChB,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AAED,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
@@ -2,7 +2,8 @@ import type { PlaybackOptions, StreamingLoadEvent } from '@/core/types';
2
2
  import type { SamplerOptions } from '@/rendering/texture/Sampler';
3
3
  import { Video } from '@/rendering/video/Video';
4
4
  import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
5
- interface VideoFactoryOptions {
5
+ /** Construction options for {@link VideoFactory.create}. */
6
+ export interface VideoFactoryOptions {
6
7
  /**
7
8
  * MIME type for the video blob. Inferred from magic bytes when omitted.
8
9
  */
@@ -17,6 +18,12 @@ interface VideoFactoryOptions {
17
18
  playbackOptions?: Partial<PlaybackOptions>;
18
19
  /** Sampler parameters forwarded to the {@link Video} instance's texture. */
19
20
  samplerOptions?: Partial<SamplerOptions>;
21
+ /**
22
+ * Milliseconds to wait after a `stalled` event before rejecting the load
23
+ * promise. When omitted no timeout is applied and a stalled load will wait
24
+ * indefinitely. Each subsequent `stalled` event resets the timer.
25
+ */
26
+ stallTimeout?: number;
20
27
  }
21
28
  /**
22
29
  * {@link AssetFactory} implementation that loads video files (MP4, WebM, OGG,
@@ -52,4 +59,3 @@ export declare class VideoFactory extends AbstractAssetFactory<Video> {
52
59
  */
53
60
  destroy(): void;
54
61
  }
55
- export {};
@@ -32,33 +32,40 @@ class VideoFactory extends AbstractAssetFactory {
32
32
  * load event is received.
33
33
  */
34
34
  async create(source, options = {}) {
35
- const { mimeType, loadEvent, playbackOptions, samplerOptions } = options;
35
+ const { mimeType, loadEvent, playbackOptions, samplerOptions, stallTimeout } = options;
36
36
  const blob = new Blob([source], { type: mimeType ?? determineMimeType(source) });
37
37
  const objectUrl = this.createObjectUrl(blob);
38
38
  return new Promise((resolve, reject) => {
39
39
  const video = document.createElement('video');
40
40
  this._videoElements.push(video);
41
- const finalize = () => {
41
+ let stallTimer;
42
+ let settled = false;
43
+ const settle = (fn) => {
44
+ if (settled)
45
+ return;
46
+ settled = true;
47
+ if (stallTimer !== undefined) {
48
+ clearTimeout(stallTimer);
49
+ stallTimer = undefined;
50
+ }
42
51
  this.revokeObjectUrl(objectUrl);
52
+ fn();
43
53
  };
44
- video.addEventListener('error', () => {
45
- finalize();
46
- reject(new Error('Video loading error.'));
47
- }, onceListenerOption);
48
- video.addEventListener('abort', () => {
49
- finalize();
50
- reject(new Error('Video loading error: cancelled.'));
51
- }, onceListenerOption);
52
- video.addEventListener('emptied', () => {
53
- finalize();
54
- reject(new Error('Video loading error: emptied.'));
55
- }, onceListenerOption);
56
- // 'stalled' is intentionally omitted: it fires transiently during normal buffering
57
- // and would cause spurious rejections for large files on slow connections.
58
- video.addEventListener(loadEvent ?? 'canplaythrough', () => {
59
- finalize();
60
- resolve(new Video(video, playbackOptions, samplerOptions));
61
- }, onceListenerOption);
54
+ video.addEventListener('error', () => settle(() => reject(new Error('Video loading error.'))), onceListenerOption);
55
+ video.addEventListener('abort', () => settle(() => reject(new Error('Video loading error: cancelled.'))), onceListenerOption);
56
+ video.addEventListener('emptied', () => settle(() => reject(new Error('Video loading error: emptied.'))), onceListenerOption);
57
+ video.addEventListener(loadEvent ?? 'canplaythrough', () => settle(() => resolve(new Video(video, playbackOptions, samplerOptions))), onceListenerOption);
58
+ // 'stalled' fires transiently during normal buffering on slow connections and is not
59
+ // treated as an error by default. Supply stallTimeout to reject after a stall persists.
60
+ if (stallTimeout !== undefined) {
61
+ video.addEventListener('stalled', () => {
62
+ if (settled)
63
+ return;
64
+ if (stallTimer !== undefined)
65
+ clearTimeout(stallTimer);
66
+ stallTimer = setTimeout(() => settle(() => reject(new Error('Video loading stalled.'))), stallTimeout);
67
+ });
68
+ }
62
69
  video.preload = 'auto';
63
70
  video.src = objectUrl;
64
71
  });
@@ -1 +1 @@
1
- {"version":3,"file":"VideoFactory.js","sources":["../../../../../src/resources/factories/VideoFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAMA,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;AAmBzC;;;;;;;;;;AAUG;AACG,MAAO,YAAa,SAAQ,oBAA2B,CAAA;IAC3C,WAAW,GAAG,OAAO;IAEpB,cAAc,GAAuB,EAAE;AAExD;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;;;;AAMG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAA+B,EAAE,EAAA;QACxE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,OAAO;QACxE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;YAE/B,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC3C,CAAC,EACD,kBAAkB,CACnB;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACtD,CAAC,EACD,kBAAkB,CACnB;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,SAAS,EACT,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACpD,CAAC,EACD,kBAAkB,CACnB;;;YAGD,KAAK,CAAC,gBAAgB,CACpB,SAAS,IAAI,gBAAgB,EAC7B,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;YAC5D,CAAC,EACD,kBAAkB,CACnB;AAED,YAAA,KAAK,CAAC,OAAO,GAAG,MAAM;AACtB,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;IACa,OAAO,GAAA;AACrB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;YACvC,KAAK,CAAC,KAAK,EAAE;AACb,YAAA,KAAK,CAAC,GAAG,GAAG,EAAE;YACd,KAAK,CAAC,IAAI,EAAE;QACd;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAC9B,KAAK,CAAC,OAAO,EAAE;IACjB;AACD;;;;"}
1
+ {"version":3,"file":"VideoFactory.js","sources":["../../../../../src/resources/factories/VideoFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
2
+ /**
3
+ * {@link AssetFactory} implementation that loads XML files and produces a
4
+ * parsed {@link Document} via the browser's built-in {@link DOMParser}.
5
+ *
6
+ * Throws if the response body is not well-formed XML. Use the returned
7
+ * `Document` directly with standard DOM APIs — `doc.querySelector`,
8
+ * `doc.getElementsByTagName`, etc. — or pass it to a format-specific parser
9
+ * (e.g. for Tiled TMX, BMFont, or TexturePacker XML atlas files).
10
+ */
11
+ export declare class XmlFactory extends AbstractAssetFactory<Document> {
12
+ readonly storageName = "xml";
13
+ /**
14
+ * Reads the response body as a UTF-8 string containing the raw XML markup.
15
+ */
16
+ process(response: Response): Promise<string>;
17
+ /**
18
+ * Parses the XML string into a {@link Document}.
19
+ *
20
+ * Throws if the browser's DOMParser reports a parse error (indicated by a
21
+ * `<parsererror>` element in the returned document).
22
+ */
23
+ create(source: string): Promise<Document>;
24
+ }
@@ -0,0 +1,37 @@
1
+ import { AbstractAssetFactory } from '../AbstractAssetFactory.js';
2
+
3
+ /**
4
+ * {@link AssetFactory} implementation that loads XML files and produces a
5
+ * parsed {@link Document} via the browser's built-in {@link DOMParser}.
6
+ *
7
+ * Throws if the response body is not well-formed XML. Use the returned
8
+ * `Document` directly with standard DOM APIs — `doc.querySelector`,
9
+ * `doc.getElementsByTagName`, etc. — or pass it to a format-specific parser
10
+ * (e.g. for Tiled TMX, BMFont, or TexturePacker XML atlas files).
11
+ */
12
+ class XmlFactory extends AbstractAssetFactory {
13
+ storageName = 'xml';
14
+ /**
15
+ * Reads the response body as a UTF-8 string containing the raw XML markup.
16
+ */
17
+ async process(response) {
18
+ return response.text();
19
+ }
20
+ /**
21
+ * Parses the XML string into a {@link Document}.
22
+ *
23
+ * Throws if the browser's DOMParser reports a parse error (indicated by a
24
+ * `<parsererror>` element in the returned document).
25
+ */
26
+ async create(source) {
27
+ const doc = new DOMParser().parseFromString(source, 'text/xml');
28
+ const parseError = doc.querySelector('parsererror');
29
+ if (parseError) {
30
+ throw new Error(`XML parse error: ${parseError.textContent.trim() || 'unknown error'}`);
31
+ }
32
+ return doc;
33
+ }
34
+ }
35
+
36
+ export { XmlFactory };
37
+ //# sourceMappingURL=XmlFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlFactory.js","sources":["../../../../../src/resources/factories/XmlFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;;;;;;AAQG;AACG,MAAO,UAAW,SAAQ,oBAA8B,CAAA;IAC5C,WAAW,GAAG,KAAK;AAEnC;;AAEG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;IACxB;AAEA;;;;;AAKG;IACI,MAAM,MAAM,CAAC,MAAc,EAAA;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC;QAC/D,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC;QAEnD,IAAI,UAAU,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,iBAAA,EAAoB,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,eAAe,CAAA,CAAE,CAAC;QACzF;AAEA,QAAA,OAAO,GAAG;IACZ;AACD;;;;"}
@@ -1,26 +1,33 @@
1
1
  export * from './AbstractAssetFactory';
2
+ export * from './Asset';
3
+ export * from './AssetDefinitions';
2
4
  export * from './AssetFactory';
3
5
  export * from './AssetManifest';
6
+ export * from './Assets';
4
7
  export * from './CacheFirstStrategy';
5
8
  export * from './CacheStore';
6
9
  export * from './CacheStrategy';
7
10
  export * from './Database';
8
11
  export * from './factories/BinaryFactory';
12
+ export * from './factories/BmFontFactory';
13
+ export * from './factories/CsvFactory';
9
14
  export * from './factories/FontFactory';
10
15
  export * from './factories/ImageFactory';
11
16
  export * from './factories/JsonFactory';
12
17
  export * from './factories/MusicFactory';
13
18
  export * from './factories/SoundFactory';
19
+ export * from './factories/SubtitleFactory';
14
20
  export * from './factories/SvgFactory';
15
21
  export * from './factories/TextFactory';
16
22
  export * from './factories/TextureFactory';
17
23
  export * from './factories/VideoFactory';
18
- export * from './factories/VttFactory';
19
24
  export * from './factories/WasmFactory';
25
+ export * from './factories/XmlFactory';
20
26
  export * from './FactoryRegistry';
21
27
  export * from './IndexedDbDatabase';
22
28
  export * from './IndexedDbStore';
23
29
  export * from './Loader';
30
+ export * from './LoadingQueue';
24
31
  export * from './NetworkOnlyStrategy';
25
32
  export * from './tokens';
26
33
  export * from './utils';
@@ -22,9 +22,55 @@ export declare abstract class TextAsset {
22
22
  export declare abstract class SvgAsset {
23
23
  }
24
24
  /**
25
- * Dispatch token for WebVTT subtitle loading.
25
+ * Dispatch token for subtitle loading (WebVTT and SRT).
26
26
  *
27
- * `loader.load(VttAsset, 'subs.vtt')` returns `Promise<Array<VTTCue>>`.
27
+ * `loader.load(SubtitleAsset, 'subs.vtt')` returns `Promise<VTTCue[]>`.
28
+ * `loader.load(SubtitleAsset, 'subs.srt')` returns `Promise<VTTCue[]>`.
29
+ * Format is detected from the file extension; unknown extensions default to VTT.
28
30
  */
29
- export declare abstract class VttAsset {
31
+ export declare abstract class SubtitleAsset {
32
+ }
33
+ /**
34
+ * Dispatch token for XML document loading.
35
+ *
36
+ * `loader.load(XmlAsset, 'data.xml')` returns `Promise<Document>`.
37
+ * Throws if the file cannot be parsed as well-formed XML.
38
+ */
39
+ export declare abstract class XmlAsset {
40
+ }
41
+ /**
42
+ * Dispatch token for CSV loading.
43
+ *
44
+ * `loader.load(CsvAsset, 'table.csv')` returns `Promise<string[][]>`.
45
+ * Each inner array is one row; values are raw strings (no type coercion).
46
+ */
47
+ export declare abstract class CsvAsset {
48
+ }
49
+ /**
50
+ * Dispatch token for image loading.
51
+ *
52
+ * `loader.load(ImageAsset, 'img.png')` returns `Promise<HTMLImageElement>`.
53
+ */
54
+ export declare abstract class ImageAsset {
55
+ }
56
+ /**
57
+ * Dispatch token for font loading.
58
+ *
59
+ * `loader.load(FontAsset, 'font.woff2', { family: 'MyFont' })` returns `Promise<FontFace>`.
60
+ */
61
+ export declare abstract class FontAsset {
62
+ }
63
+ /**
64
+ * Dispatch token for binary data loading.
65
+ *
66
+ * `loader.load(BinaryAsset, 'data.bin')` returns `Promise<ArrayBuffer>`.
67
+ */
68
+ export declare abstract class BinaryAsset {
69
+ }
70
+ /**
71
+ * Dispatch token for WebAssembly module loading.
72
+ *
73
+ * `loader.load(WasmAsset, 'module.wasm')` returns `Promise<WebAssembly.Module>`.
74
+ */
75
+ export declare abstract class WasmAsset {
30
76
  }
@@ -22,12 +22,58 @@ class TextAsset {
22
22
  class SvgAsset {
23
23
  }
24
24
  /**
25
- * Dispatch token for WebVTT subtitle loading.
25
+ * Dispatch token for subtitle loading (WebVTT and SRT).
26
26
  *
27
- * `loader.load(VttAsset, 'subs.vtt')` returns `Promise<Array<VTTCue>>`.
27
+ * `loader.load(SubtitleAsset, 'subs.vtt')` returns `Promise<VTTCue[]>`.
28
+ * `loader.load(SubtitleAsset, 'subs.srt')` returns `Promise<VTTCue[]>`.
29
+ * Format is detected from the file extension; unknown extensions default to VTT.
28
30
  */
29
- class VttAsset {
31
+ class SubtitleAsset {
32
+ }
33
+ /**
34
+ * Dispatch token for XML document loading.
35
+ *
36
+ * `loader.load(XmlAsset, 'data.xml')` returns `Promise<Document>`.
37
+ * Throws if the file cannot be parsed as well-formed XML.
38
+ */
39
+ class XmlAsset {
40
+ }
41
+ /**
42
+ * Dispatch token for CSV loading.
43
+ *
44
+ * `loader.load(CsvAsset, 'table.csv')` returns `Promise<string[][]>`.
45
+ * Each inner array is one row; values are raw strings (no type coercion).
46
+ */
47
+ class CsvAsset {
48
+ }
49
+ /**
50
+ * Dispatch token for image loading.
51
+ *
52
+ * `loader.load(ImageAsset, 'img.png')` returns `Promise<HTMLImageElement>`.
53
+ */
54
+ class ImageAsset {
55
+ }
56
+ /**
57
+ * Dispatch token for font loading.
58
+ *
59
+ * `loader.load(FontAsset, 'font.woff2', { family: 'MyFont' })` returns `Promise<FontFace>`.
60
+ */
61
+ class FontAsset {
62
+ }
63
+ /**
64
+ * Dispatch token for binary data loading.
65
+ *
66
+ * `loader.load(BinaryAsset, 'data.bin')` returns `Promise<ArrayBuffer>`.
67
+ */
68
+ class BinaryAsset {
69
+ }
70
+ /**
71
+ * Dispatch token for WebAssembly module loading.
72
+ *
73
+ * `loader.load(WasmAsset, 'module.wasm')` returns `Promise<WebAssembly.Module>`.
74
+ */
75
+ class WasmAsset {
30
76
  }
31
77
 
32
- export { Json, SvgAsset, TextAsset, VttAsset };
78
+ export { BinaryAsset, CsvAsset, FontAsset, ImageAsset, Json, SubtitleAsset, SvgAsset, TextAsset, WasmAsset, XmlAsset };
33
79
  //# sourceMappingURL=tokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sources":["../../../../src/resources/tokens.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;AAMG;MACmB,IAAI,CAAA;AAAG;AAE7B;;;;AAIG;MACmB,SAAS,CAAA;AAAG;AAElC;;;;AAIG;MACmB,QAAQ,CAAA;AAAG;AAEjC;;;;AAIG;MACmB,QAAQ,CAAA;AAAG;;;;"}
1
+ {"version":3,"file":"tokens.js","sources":["../../../../src/resources/tokens.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;AAMG;MACmB,IAAI,CAAA;AAAG;AAE7B;;;;AAIG;MACmB,SAAS,CAAA;AAAG;AAElC;;;;AAIG;MACmB,QAAQ,CAAA;AAAG;AAEjC;;;;;;AAMG;MACmB,aAAa,CAAA;AAAG;AAEtC;;;;;AAKG;MACmB,QAAQ,CAAA;AAAG;AAEjC;;;;;AAKG;MACmB,QAAQ,CAAA;AAAG;AAEjC;;;;AAIG;MACmB,UAAU,CAAA;AAAG;AAEnC;;;;AAIG;MACmB,SAAS,CAAA;AAAG;AAElC;;;;AAIG;MACmB,WAAW,CAAA;AAAG;AAEpC;;;;AAIG;MACmB,SAAS,CAAA;AAAG;;;;"}